bundle.js 223 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 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
var __extends = (this && this.__extends) || (function () {
    var extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**This class is automatically generated by LayaAirIDE, please do not make any modifications. */
var TestScene_1 = require("./TestScene");
var ScaleButtonScript_1 = require("./uitl/ScaleButtonScript");
var RedDrawal_1 = require("./RedDrawal");
var NativeAd_1 = require("./sdk/NativeAd");
/*
* 游戏初始化配置;
*/
var GameConfig = /** @class */ (function () {
    function GameConfig() {
    }
    GameConfig.init = function () {
        var reg = Laya.ClassUtils.regClass;
        reg("TestScene.ts", TestScene_1.default);
        reg("uitl/ScaleButtonScript.ts", ScaleButtonScript_1.default);
        reg("RedDrawal.ts", RedDrawal_1.default);
        reg("sdk/NativeAd.ts", NativeAd_1.default);
    };
    GameConfig.width = 750;
    GameConfig.height = 1334;
    GameConfig.scaleMode = "fixedwidth";
    GameConfig.screenMode = "none";
    GameConfig.alignV = "top";
    GameConfig.alignH = "left";
    GameConfig.startScene = "TestScene.scene";
    GameConfig.sceneRoot = "";
    GameConfig.debug = false;
    GameConfig.stat = false;
    GameConfig.physicsDebug = false;
    GameConfig.exportSceneToJson = true;
    return GameConfig;
}());
exports.default = GameConfig;
GameConfig.init();

},{"./RedDrawal":3,"./TestScene":4,"./sdk/NativeAd":12,"./uitl/ScaleButtonScript":26}],2:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var GameConfig_1 = require("./GameConfig");
var AdManager_1 = require("./sdk/AdManager");
var AppSdk_1 = require("./sdk/AppSdk");
var RedpacketModel_1 = require("./sdk/model/RedpacketModel");
var ShakeModel_1 = require("./sdk/model/ShakeModel");
var Main = /** @class */ (function () {
    function Main() {
        //根据IDE设置初始化引擎		
        if (window["Laya3D"])
            Laya3D.init(GameConfig_1.default.width, GameConfig_1.default.height);
        else
            Laya.init(GameConfig_1.default.width, GameConfig_1.default.height, Laya["WebGL"]);
        Laya["Physics"] && Laya["Physics"].enable();
        Laya["DebugPanel"] && Laya["DebugPanel"].enable();
        Laya.stage.scaleMode = GameConfig_1.default.scaleMode;
        Laya.stage.screenMode = GameConfig_1.default.screenMode;
        Laya.stage.alignV = GameConfig_1.default.alignV;
        Laya.stage.alignH = GameConfig_1.default.alignH;
        //兼容微信不支持加载scene后缀场景
        Laya.URL.exportSceneToJson = GameConfig_1.default.exportSceneToJson;
        //打开调试面板(通过IDE设置调试模式,或者url地址增加debug=true参数,均可打开调试面板)
        if (GameConfig_1.default.debug || Laya.Utils.getQueryString("debug") == "true")
            Laya.enableDebugPanel();
        if (GameConfig_1.default.physicsDebug && Laya["PhysicsDebugDraw"])
            Laya["PhysicsDebugDraw"].enable();
        if (GameConfig_1.default.stat)
            Laya.Stat.show();
        Laya.alertGlobalError = true;
        //激活资源版本控制,version.json由IDE发布功能自动生成,如果没有也不影响后续流程
        Laya.ResourceVersion.enable("version.json", Laya.Handler.create(this, this.onVersionLoaded), Laya.ResourceVersion.FILENAME_VERSION);
    }
    Main.prototype.onVersionLoaded = function () {
        //激活大小图映射,加载小图的时候,如果发现小图在大图合集里面,则优先加载大图合集,而不是小图
        Laya.AtlasInfoManager.enable("fileconfig.json", Laya.Handler.create(this, this.onConfigLoaded));
    };
    Main.prototype.onConfigLoaded = function () {
        this.initData();
        //加载IDE指定的场景
        GameConfig_1.default.startScene && Laya.Scene.open(GameConfig_1.default.startScene);
    };
    /**初始化SDK */
    Main.prototype.initData = function () {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        /**隐藏启动屏 */
                        AppSdk_1.AppSdk.I.hideSplash();
                        /**初始化adk 获取app配置信息 */
                        AppSdk_1.AppSdk.I.init();
                        /**预加载视频 */
                        AdManager_1.default.I.init();
                        /**获取红包配置  初始化数据 */
                        return [4 /*yield*/, RedpacketModel_1.default.I.init()];
                    case 1:
                        /**获取红包配置  初始化数据 */
                        _a.sent();
                        /**初始化摇一摇的数据 */
                        return [4 /*yield*/, ShakeModel_1.default.I.init()];
                    case 2:
                        /**初始化摇一摇的数据 */
                        _a.sent();
                        return [2 /*return*/];
                }
            });
        });
    };
    return Main;
}());
//激活启动类
new Main();

},{"./GameConfig":1,"./sdk/AdManager":7,"./sdk/AppSdk":9,"./sdk/model/RedpacketModel":16,"./sdk/model/ShakeModel":17}],3:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var RedpacketModel_1 = require("./sdk/model/RedpacketModel");
var EventCenter_1 = require("./event/EventCenter");
var EventEnum_1 = require("./event/EventEnum");
/**
 * 主界面  金币金额
 */
var RedDrawal = /** @class */ (function (_super) {
    __extends(RedDrawal, _super);
    function RedDrawal() {
        var _this = _super.call(this) || this;
        _this.totalCoin = 110;
        return _this;
    }
    RedDrawal.prototype.onStart = function () {
        this.updateStar();
        // this.tiplab.visible = false;
    };
    RedDrawal.prototype.onEnable = function () {
        EventCenter_1.EventCenter.add(EventEnum_1.EventEnum.APP_SHOW, this, this.updateStar);
        EventCenter_1.EventCenter.add(EventEnum_1.EventEnum.UPDATE_COIN, this, this.updateStar);
    };
    RedDrawal.prototype.onDisable = function () {
        EventCenter_1.EventCenter.remove(EventEnum_1.EventEnum.APP_SHOW, this, this.updateStar);
        EventCenter_1.EventCenter.remove(EventEnum_1.EventEnum.UPDATE_COIN, this, this.updateStar);
    };
    RedDrawal.prototype.updateStar = function () {
        return __awaiter(this, void 0, void 0, function () {
            var coin, str, nextDrawal, leftCoin;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, RedpacketModel_1.default.I.getTotalCoin()];
                    case 1:
                        coin = _a.sent();
                        // let coin = 1000
                        this.totalCoin = coin;
                        this.coinlab.text = '' + coin;
                        str = '可提现';
                        return [4 /*yield*/, RedpacketModel_1.default.I.minWithDrawal()];
                    case 2:
                        nextDrawal = _a.sent();
                        if (this.totalCoin > 0) {
                            leftCoin = nextDrawal - this.totalCoin;
                            if (leftCoin > 0)
                                str = "\u8FD8\u5DEE" + (leftCoin / 10000).toFixed(3) + "\u91D1\u989D\u53EF\u63D0\u73B0";
                        }
                        this.tiplab.text = str;
                        this.tiplab.visible = Boolean(nextDrawal);
                        return [2 /*return*/];
                }
            });
        });
    };
    return RedDrawal;
}(Laya.Script));
exports.default = RedDrawal;

},{"./event/EventCenter":5,"./event/EventEnum":6,"./sdk/model/RedpacketModel":16}],4:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var layaMaxUI_1 = require("./ui/layaMaxUI");
var AdManager_1 = require("./sdk/AdManager");
var AppSdk_1 = require("./sdk/AppSdk");
var ShakeModel_1 = require("./sdk/model/ShakeModel");
var RedpacketModel_1 = require("./sdk/model/RedpacketModel");
var TestScene = /** @class */ (function (_super) {
    __extends(TestScene, _super);
    function TestScene() {
        var _this = _super.call(this) || this;
        //关闭多点触控,否则就无敌了
        Laya.MouseManager.multiTouchEnabled = false;
        console.log('---------------TestScene-------');
        _this.NativeAD.visible = false;
        return _this;
    }
    TestScene.prototype.onEnable = function () {
        this.btnServer.on(Laya.Event.CLICK, this, this.openServer);
        this.btnDrawal.on(Laya.Event.CLICK, this, this.openPersonal);
        this.btnInvite.on(Laya.Event.CLICK, this, this.invitation);
        this.btn_shake.on(Laya.Event.CLICK, this, this.touchShake);
        this.btnPreloadAD.on(Laya.Event.CLICK, this, this.preloadAD);
        this.btnShowBanner.on(Laya.Event.CLICK, this, this.showBanner);
        this.btnShowFullAd.on(Laya.Event.CLICK, this, this.showFullAd);
        this.btnShowNativeAd.on(Laya.Event.CLICK, this, this.showNativeAd);
        this.btnShowInterAd.on(Laya.Event.CLICK, this, this.showInterAd);
        this.btnRewardAd.on(Laya.Event.CLICK, this, this.showRewardAd);
        this.btnRedpacket.on(Laya.Event.CLICK, this, this.openRedpacket);
    };
    /**预加载广告 */
    TestScene.prototype.preloadAD = function () {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        console.log('---------------preloadAD-------');
                        return [4 /*yield*/, AdManager_1.default.I.init()];
                    case 1:
                        _a.sent();
                        return [2 /*return*/];
                }
            });
        });
    };
    /**显示全屏广告 */
    TestScene.prototype.showFullAd = function () {
        console.log('---------------showFullAd-------');
        AdManager_1.default.I.showFullAd();
    };
    /**显示banner */
    TestScene.prototype.showBanner = function () {
        console.log('---------------showBanner-------');
        AdManager_1.default.I.showBanner();
    };
    /**信息流广告 */
    TestScene.prototype.showNativeAd = function () {
        console.log('---------------showNativeAd-------');
        this.NativeAD.visible = true;
    };
    /**插屏广告 */
    TestScene.prototype.showInterAd = function () {
        console.log('---------------showInterAd-------');
        AdManager_1.default.I.showInterAd();
    };
    /**激励视频广告 */
    TestScene.prototype.showRewardAd = function () {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        console.log('---------------showRewardAd-------');
                        return [4 /*yield*/, AdManager_1.default.I.showRewardAd()];
                    case 1:
                        _a.sent();
                        return [2 /*return*/];
                }
            });
        });
    };
    /**意见反馈 */
    TestScene.prototype.openServer = function () {
        console.log('---------------openServer-------');
        AppSdk_1.AppSdk.I.feedback();
    };
    TestScene.prototype.openRedpacket = function () {
        RedpacketModel_1.default.I.checkRedpacket();
        console.log('红包获取结果:curRedpacket' + RedpacketModel_1.default.I.curRedpacket);
        // console.log('红包获取结果:' + JSON.stringify(data))
        // ViewManager.I.openPopwin(RedpacketPopwin, 0);
    };
    /**打开个人中心 */
    TestScene.prototype.openPersonal = function () {
        console.log('---------------openServer-------');
        AppSdk_1.AppSdk.I.personal(0);
    };
    /**邀请好友 */
    TestScene.prototype.invitation = function () {
        AppSdk_1.AppSdk.I.invitation();
    };
    /**
     * 1	金币
    2	激励视频后金币
    3	4 5 6 7 游戏中对应的道具
    8	空
     */
    TestScene.prototype.touchShake = function () {
        console.log('---------------touchShake-------');
        // this.skin.btnShakeAni.play(0);
        AppSdk_1.AppSdk.I.vibrate();
        // ViewManager.I.showModal(HintModal, ' 今⽇次数已⽤完,请明⽇再来');
        // this.skin.handAni.stop();
        /**
         * 1.回去星星 道具
         * 2.红包   直接获得⾦币;或者直接弹激励视频后,获得⾦币
         * 3.无道具
         * 直接展⽰插屏
         *  */
        var data = ShakeModel_1.default.I.getShakeType();
        console.log('摇一摇获取结果:' + JSON.stringify(data));
        if (!data)
            return;
        var type = data.type;
        switch (type) {
            case 8:
                /** '谢谢参与,下次好运!'*/ ;
                AdManager_1.default.I.showInterAd();
                break;
            case 1:
                this.getCoin();
                break;
            case 2:
                this.watchADCoin();
                break;
            case 3:
            case 4:
            case 5:
            case 6:
            case 7:
                this.getProps(data);
                break;
        }
    };
    TestScene.prototype.getProps = function (data) {
        var booster;
        var rewardNum = data.num;
        var type = data.type;
        /**
         * 处理游戏中的道具显示
         */
        // switch (type) {
        //     case 4:
        //         booster = BoosterType.Remove;
        //         break;
        //     case 6:
        //         booster = BoosterType.Change;
        //         break;
        //     case 5:
        //         booster = BoosterType.Refresh;
        //         break;
        //     case 7:
        //         booster = BoosterType.RandRemove;
        //         break;
        //     case 3:
        //         booster = BoosterType.Star;
        //         break;
        // }
        // ViewManager.I.openPopwin(ReceivePropsPopwin, booster, rewardNum);
    };
    /**
     * 看广告获得红包
     */
    TestScene.prototype.watchADCoin = function () {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, AdManager_1.default.I.showRewardAd()];
                    case 1:
                        _a.sent();
                        this.getCoin();
                        return [2 /*return*/];
                }
            });
        });
    };
    /**直接获得红包 */
    TestScene.prototype.getCoin = function () {
        //刷新总金币
        // AppManager.I.redpacket.getRepacket()
        // ViewManager.I.openPopwin(RedPacketReward, 2);
    };
    return TestScene;
}(layaMaxUI_1.ui.TestSceneUI));
exports.default = TestScene;

},{"./sdk/AdManager":7,"./sdk/AppSdk":9,"./sdk/model/RedpacketModel":16,"./sdk/model/ShakeModel":17,"./ui/layaMaxUI":21}],5:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/*
* name;
*/
var EventCenter = /** @class */ (function () {
    function EventCenter() {
    }
    Object.defineProperty(EventCenter, "I", {
        get: function () {
            window['ev'] = this._instance;
            return this._instance || (this._instance = new Laya.EventDispatcher);
        },
        enumerable: true,
        configurable: true
    });
    EventCenter.emit = function (event) {
        var args = [];
        for (var _i = 1; _i < arguments.length; _i++) {
            args[_i - 1] = arguments[_i];
        }
        this.I.event(event.toString(), args);
    };
    EventCenter.add = function (type, caller, listener, args) {
        this.I.on(type.toString(), caller, listener, args);
    };
    EventCenter.remove = function (type, caller, listener) {
        this.I.off(type.toString(), caller, listener);
    };
    return EventCenter;
}());
exports.EventCenter = EventCenter;

},{}],6:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var EventEnum;
(function (EventEnum) {
    EventEnum[EventEnum["CHECK_REDPACKET"] = 'check_redpacket'] = "CHECK_REDPACKET";
    EventEnum[EventEnum["APP_SHOW"] = 'app.show'] = "APP_SHOW";
    EventEnum[EventEnum["APP_HIDE"] = 'app.hide'] = "APP_HIDE";
    EventEnum[EventEnum["UPDATE_COIN"] = 'update.coin'] = "UPDATE_COIN";
})(EventEnum = exports.EventEnum || (exports.EventEnum = {}));

},{}],7:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var TTAdSdk_1 = require("./TTAdSdk");
var ObjectInstance_1 = require("../uitl/ObjectInstance");
var AdManager = /** @class */ (function () {
    function AdManager() {
    }
    AdManager.prototype.init = function () {
        this.preloadRewardAd();
    };
    AdManager.prototype.preloadRewardAd = function () {
        TTAdSdk_1.default.I.showRewardVideoAd(1);
    };
    AdManager.prototype.showRewardAd = function () {
        return __awaiter(this, void 0, void 0, function () {
            var ret, e_1;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 2, , 3]);
                        return [4 /*yield*/, TTAdSdk_1.default.I.showRewardVideoAd()];
                    case 1:
                        ret = _a.sent();
                        this.lastVideoTime = Laya.timer.currTimer;
                        this.preloadRewardAd();
                        return [2 /*return*/, Promise.resolve(ret)];
                    case 2:
                        e_1 = _a.sent();
                        this.preloadRewardAd();
                        return [2 /*return*/, Promise.reject(e_1)];
                    case 3: return [2 /*return*/];
                }
            });
        });
    };
    AdManager.prototype.preloadFullAd = function () {
        TTAdSdk_1.default.I.loadFullScreenVideoAd(1);
    };
    AdManager.prototype.preloadInterAd = function () {
        TTAdSdk_1.default.I.loadFullScreenVideoAd(1);
    };
    AdManager.prototype.showFullAd = function () {
        return __awaiter(this, void 0, void 0, function () {
            var ret, e_2;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 2, , 3]);
                        return [4 /*yield*/, TTAdSdk_1.default.I.loadFullScreenVideoAd()];
                    case 1:
                        ret = _a.sent();
                        this.preloadFullAd();
                        return [2 /*return*/, Promise.resolve(ret)];
                    case 2:
                        e_2 = _a.sent();
                        this.preloadFullAd();
                        return [2 /*return*/, Promise.reject(e_2)];
                    case 3: return [2 /*return*/];
                }
            });
        });
    };
    AdManager.prototype.showInterAd = function () {
        return __awaiter(this, void 0, void 0, function () {
            var ret, e_3;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 2, , 3]);
                        return [4 /*yield*/, TTAdSdk_1.default.I.showInteractionExpressAd()];
                    case 1:
                        ret = _a.sent();
                        this.preloadInterAd();
                        return [2 /*return*/, Promise.resolve(ret)];
                    case 2:
                        e_3 = _a.sent();
                        this.preloadInterAd();
                        return [2 /*return*/, Promise.reject(e_3)];
                    case 3: return [2 /*return*/];
                }
            });
        });
    };
    AdManager.prototype.checkVideoInCd = function () {
        return this.lastVideoTime && (Laya.timer.currTimer - this.lastVideoTime <= 30000);
    };
    AdManager.prototype.showBanner = function () {
        TTAdSdk_1.default.I.loadBannerExpressAd();
    };
    AdManager.prototype.hideBanner = function () {
        TTAdSdk_1.default.I.hideAd();
    };
    AdManager.prototype.showNativeAd = function (x, y, w, h) {
        TTAdSdk_1.default.I.loadNativeExpressAd(x, y, w, h);
    };
    AdManager.prototype.hideNativeAd = function () {
        TTAdSdk_1.default.I.hideAd();
    };
    Object.defineProperty(AdManager, "I", {
        get: function () {
            return ObjectInstance_1.default.get(AdManager);
        },
        enumerable: true,
        configurable: true
    });
    return AdManager;
}());
exports.default = AdManager;

},{"../uitl/ObjectInstance":24,"./TTAdSdk":13}],8:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var BaseAppSdk_1 = require("./BaseAppSdk");
var AndroidAppSdk = /** @class */ (function (_super) {
    __extends(AndroidAppSdk, _super);
    function AndroidAppSdk() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    Object.defineProperty(AndroidAppSdk.prototype, "system", {
        get: function () {
            return 1;
        },
        enumerable: true,
        configurable: true
    });
    AndroidAppSdk.prototype.callApp = function (cmd) {
        var params = [];
        for (var _i = 1; _i < arguments.length; _i++) {
            params[_i - 1] = arguments[_i];
        }
        var _a;
        this.bridge && (_a = this.bridge).call.apply(_a, [cmd].concat(params));
        // this.bridge && alert(JSON.stringify(this.bridge));
    };
    AndroidAppSdk.prototype.callAppWithBack = function (callBack, cmd) {
        var params = [];
        for (var _i = 2; _i < arguments.length; _i++) {
            params[_i - 2] = arguments[_i];
        }
        var _a;
        this.bridge && (_a = this.bridge).callWithBack.apply(_a, [callBack, cmd].concat(params));
    };
    Object.defineProperty(AndroidAppSdk.prototype, "bridge", {
        get: function () {
            return this._bridge || (this._bridge = this.createClass('com.puchi.sdkdemo.JSBridge'));
        },
        enumerable: true,
        configurable: true
    });
    return AndroidAppSdk;
}(BaseAppSdk_1.default));
exports.default = AndroidAppSdk;

},{"./BaseAppSdk":10}],9:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var IosAppSdk_1 = require("./IosAppSdk");
var AndroidAppSdk_1 = require("./AndroidAppSdk");
var BaseAppSdk_1 = require("./BaseAppSdk");
var AppSdk = /** @class */ (function () {
    function AppSdk() {
    }
    Object.defineProperty(AppSdk, "I", {
        get: function () {
            if (!this._instance) {
                var conchConfig = window['conchConfig'];
                var os = conchConfig && conchConfig.getOS();
                switch (os) {
                    case "Conch-ios":
                        this._instance = new IosAppSdk_1.default;
                        break;
                    case "Conch-android":
                        this._instance = new AndroidAppSdk_1.default;
                        break;
                    default:
                        this._instance = new BaseAppSdk_1.default;
                        break;
                }
                window['AppSdk'] = this._instance;
            }
            return this._instance;
        },
        enumerable: true,
        configurable: true
    });
    return AppSdk;
}());
exports.AppSdk = AppSdk;

},{"./AndroidAppSdk":8,"./BaseAppSdk":10,"./IosAppSdk":11}],10:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AddGoldData_1 = require("./sdkData/AddGoldData");
var MyCoinData_1 = require("./sdkData/MyCoinData");
var GoldConfigData_1 = require("./sdkData/GoldConfigData");
var BaseAppSdk = /** @class */ (function () {
    function BaseAppSdk() {
        this.netOnArr = [];
        this.netOffArr = [];
    }
    BaseAppSdk.prototype.init = function () {
        var conch = window['conch'];
        if (conch) {
            conch.setNetworkEvtFunction(this.networkEvtFunc.bind(this));
        }
        this.callApp('setAppCallback', 1, 'AppSdk.onShow()');
        this.callApp('setAppCallback', 2, 'AppSdk.onHide()');
        this.getSystemInfo();
    };
    BaseAppSdk.prototype.getSystemInfo = function () {
        var _this = this;
        this.callAppWithBack(function (ret) {
            console.log('---------------getSystemInfo-------' + JSON.stringify(ret));
            var _a = JSON.parse(ret), w = _a.w, h = _a.h, versionName = _a.versionName, channel = _a.channel, pangolin = _a.pangolin, adnet = _a.adnet, level = _a.level;
            _this._width = w;
            _this._height = h;
            _this._version = versionName;
            _this._channel = channel;
            _this.pangolinId = pangolin;
            _this.adnetId = adnet;
            _this._level = level;
        }, 'getSystemInfo', 0);
    };
    BaseAppSdk.prototype.onShow = function () {
        // EventCenter.emit(EventEnum.APP_SHOW);
    };
    BaseAppSdk.prototype.onHide = function () {
        // EventCenter.emit(EventEnum.APP_HIDE);
    };
    BaseAppSdk.prototype.vibrate = function () {
        this.callApp('openSystemFun', 0);
    };
    BaseAppSdk.prototype.hideSplash = function () {
        this.callApp('hideSplash');
    };
    /**弹出提现 */
    BaseAppSdk.prototype.withDrawal = function () {
        this.callApp('withDrawal');
    };
    /**意见反馈 */
    BaseAppSdk.prototype.feedback = function () {
        this.callApp('feedback');
    };
    /**
     * key 默认0 ,签到 1
     */
    BaseAppSdk.prototype.personal = function (key) {
        if (key === void 0) { key = 0; }
        this.callApp('personal', key);
    };
    /**邀请好友*/
    BaseAppSdk.prototype.invitation = function () {
        this.callApp('invitation');
    };
    BaseAppSdk.prototype.currentShut = function (value) {
        this.callApp('currentShut', value);
    };
    /**
     * 获取金币配表
     * @param key 1红包   2 摇一摇红包
     */
    BaseAppSdk.prototype.getGameConfig = function (key) {
        if (key === void 0) { key = 1; }
        return __awaiter(this, void 0, void 0, function () {
            var result;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.onCallBack('getGameConfig', key)];
                    case 1:
                        result = _a.sent();
                        GoldConfigData_1.GoldConfigData.I.initData(result);
                        return [2 /*return*/, result];
                }
            });
        });
    };
    /**
     * 要求发放金币
     * @param key 1红包
     */
    BaseAppSdk.prototype.addGold = function (key) {
        if (key === void 0) { key = 1; }
        return __awaiter(this, void 0, void 0, function () {
            var result;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.onCallBack('addGold', key)];
                    case 1:
                        result = _a.sent();
                        AddGoldData_1.default.initData(result);
                        return [2 /*return*/, result];
                }
            });
        });
    };
    BaseAppSdk.prototype.myCoin = function () {
        return __awaiter(this, void 0, void 0, function () {
            var result;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.onCallBack('myCoin')];
                    case 1:
                        result = _a.sent();
                        MyCoinData_1.default.initData(result);
                        return [2 /*return*/, result];
                }
            });
        });
    };
    /**获取当前提现的档位 */
    BaseAppSdk.prototype.minWithDrawal = function () {
        return __awaiter(this, void 0, void 0, function () {
            var result;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.onCallBack('minWithDrawal')];
                    case 1:
                        result = _a.sent();
                        if (!Boolean(parseInt(result.code + ''))) {
                            return [2 /*return*/, parseInt(result.data['money']) * 100];
                        }
                        return [2 /*return*/, 0];
                }
            });
        });
    };
    BaseAppSdk.prototype.onCallBack = function (cmd) {
        var _this = this;
        var params = [];
        for (var _i = 1; _i < arguments.length; _i++) {
            params[_i - 1] = arguments[_i];
        }
        return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.callAppWithBack.apply(this, [function (res) {
                                res = JSON.parse(res);
                                // res = { code: 1000 }
                                if (!res.code) {
                                    resolve({ code: res.code, data: res.data });
                                }
                                else {
                                    resolve({ code: res.code });
                                }
                            }, cmd].concat(params))];
                    case 1:
                        _a.sent();
                        return [2 /*return*/];
                }
            });
        }); });
    };
    BaseAppSdk.prototype.callApp = function (cmd) {
        var params = [];
        for (var _i = 1; _i < arguments.length; _i++) {
            params[_i - 1] = arguments[_i];
        }
    };
    BaseAppSdk.prototype.callAppWithBack = function (callBack, cmd) {
        var params = [];
        for (var _i = 2; _i < arguments.length; _i++) {
            params[_i - 2] = arguments[_i];
        }
    };
    BaseAppSdk.prototype.networkEvtFunc = function (type) {
        var funcArr;
        if (type == 0) {
            funcArr = this.netOffArr;
        }
        else if (type == 5) {
            funcArr = this.netOnArr;
        }
        if (funcArr) {
            for (var i = 0; i < funcArr.length; i++) {
                funcArr[i]();
            }
        }
    };
    BaseAppSdk.prototype.onNetOn = function (func) {
        this.netOnArr.push(func);
    };
    BaseAppSdk.prototype.onNetOff = function (func) {
        this.netOffArr.push(func);
    };
    Object.defineProperty(BaseAppSdk.prototype, "level", {
        get: function () {
            return this._level;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(BaseAppSdk.prototype, "width", {
        get: function () {
            return this._width;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(BaseAppSdk.prototype, "height", {
        get: function () {
            return this._height;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(BaseAppSdk.prototype, "version", {
        get: function () {
            return this._version;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(BaseAppSdk.prototype, "channel", {
        get: function () {
            return this._channel;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(BaseAppSdk.prototype, "bridge", {
        get: function () {
            return null;
        },
        enumerable: true,
        configurable: true
    });
    BaseAppSdk.prototype.createClass = function (name) {
        return window['PlatformClass'].createClass(name);
    };
    return BaseAppSdk;
}());
exports.default = BaseAppSdk;

},{"./sdkData/AddGoldData":18,"./sdkData/GoldConfigData":19,"./sdkData/MyCoinData":20}],11:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var BaseAppSdk_1 = require("./BaseAppSdk");
var IosAppSdk = /** @class */ (function (_super) {
    __extends(IosAppSdk, _super);
    function IosAppSdk() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    Object.defineProperty(IosAppSdk.prototype, "system", {
        get: function () {
            return 0;
        },
        enumerable: true,
        configurable: true
    });
    IosAppSdk.prototype.callApp = function (cmd) {
        var params = [];
        for (var _i = 1; _i < arguments.length; _i++) {
            params[_i - 1] = arguments[_i];
        }
        var _a;
        if (params.length) {
            cmd += ':';
        }
        this.bridge && (_a = this.bridge).call.apply(_a, [cmd].concat(params));
        // this.bridge && alert(JSON.stringify(this.bridge));
    };
    IosAppSdk.prototype.callAppWithBack = function (callBack, cmd) {
        var params = [];
        for (var _i = 2; _i < arguments.length; _i++) {
            params[_i - 2] = arguments[_i];
        }
        var _a;
        if (params.length) {
            cmd += ':';
        }
        this.bridge && (_a = this.bridge).callWithBack.apply(_a, [callBack, cmd].concat(params));
    };
    Object.defineProperty(IosAppSdk.prototype, "bridge", {
        get: function () {
            return this._bridge || (this._bridge = this.createClass('JSBridge'));
        },
        enumerable: true,
        configurable: true
    });
    return IosAppSdk;
}(BaseAppSdk_1.default));
exports.default = IosAppSdk;

},{"./BaseAppSdk":10}],12:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AdManager_1 = require("./AdManager");
var NativeAd = /** @class */ (function (_super) {
    __extends(NativeAd, _super);
    function NativeAd() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    NativeAd.prototype.onEnable = function () {
        var globalPoint = this.item.localToGlobal(Laya.Point.EMPTY, true);
        AdManager_1.default.I.showNativeAd(globalPoint.x, globalPoint.y, this.item.width, this.item.height);
    };
    NativeAd.prototype.onDisable = function () {
        AdManager_1.default.I.hideNativeAd();
    };
    Object.defineProperty(NativeAd.prototype, "item", {
        get: function () {
            return this.owner;
        },
        enumerable: true,
        configurable: true
    });
    return NativeAd;
}(Laya.Script));
exports.default = NativeAd;

},{"./AdManager":7}],13:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AppSdk_1 = require("./AppSdk");
var ObjectInstance_1 = require("../uitl/ObjectInstance");
var TTAdSdk = /** @class */ (function () {
    function TTAdSdk() {
    }
    TTAdSdk.prototype.showRewardVideoAd = function (preload) {
        if (preload === void 0) { preload = 0; }
        return __awaiter(this, void 0, void 0, function () {
            var data;
            return __generator(this, function (_a) {
                data = {
                    w: AppSdk_1.AppSdk.I.width,
                    h: AppSdk_1.AppSdk.I.height,
                    preloading: preload,
                };
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var isComplete = false;
                        AppSdk_1.AppSdk.I.callAppWithBack(function (ret) {
                            var _a = JSON.parse(ret), code = _a.code, message = _a.message;
                            switch (code) {
                                case -1:
                                    reject('error');
                                    /**'暂无视频广告!每日0点重置'*/ ;
                                    break;
                                case 200:
                                    isComplete = true;
                                    break;
                                case 100:
                                    break;
                                case 0:
                                    if (isComplete) {
                                        resolve();
                                    }
                                    else {
                                        reject('unComplete');
                                    }
                                    break;
                            }
                        }, 'showRewardVideoAd', 1, JSON.stringify(data));
                    })];
            });
        });
    };
    TTAdSdk.prototype.loadFullScreenVideoAd = function (preload) {
        if (preload === void 0) { preload = 0; }
        return __awaiter(this, void 0, void 0, function () {
            var data;
            return __generator(this, function (_a) {
                data = {
                    preloading: preload,
                };
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var isComplete = false;
                        AppSdk_1.AppSdk.I.callAppWithBack(function (ret) {
                        }, 'loadFullScreenVideoAd', 1, JSON.stringify(data));
                    })];
            });
        });
    };
    TTAdSdk.prototype.loadNativeExpressAd = function (x, y, width, height) {
        return __awaiter(this, void 0, void 0, function () {
            var scaleX, scaleY, data;
            return __generator(this, function (_a) {
                scaleX = AppSdk_1.AppSdk.I.width / Laya.stage.width;
                scaleY = AppSdk_1.AppSdk.I.height / Laya.stage.height;
                data = {
                    w: width * scaleX,
                    h: height * scaleY,
                    left: x * scaleX,
                    top: y * scaleY
                };
                AppSdk_1.AppSdk.I.callAppWithBack(function (ret) {
                }, 'loadNativeExpressAd', JSON.stringify(data));
                return [2 /*return*/];
            });
        });
    };
    TTAdSdk.prototype.loadBannerExpressAd = function () {
        return __awaiter(this, void 0, void 0, function () {
            var data;
            return __generator(this, function (_a) {
                data = {
                    w: AppSdk_1.AppSdk.I.width,
                    h: AppSdk_1.AppSdk.I.width * 90 / 600,
                };
                AppSdk_1.AppSdk.I.callAppWithBack(function (ret) {
                }, 'loadBannerExpressAd', 2, JSON.stringify(data));
                return [2 /*return*/];
            });
        });
    };
    TTAdSdk.prototype.hideAd = function () {
        AppSdk_1.AppSdk.I.callApp('close_adver_dialog');
    };
    TTAdSdk.prototype.showInteractionExpressAd = function (preload) {
        if (preload === void 0) { preload = 0; }
        return __awaiter(this, void 0, void 0, function () {
            var data;
            return __generator(this, function (_a) {
                data = {
                    w: AppSdk_1.AppSdk.I.width * 0.8,
                    h: AppSdk_1.AppSdk.I.height,
                    preloading: preload,
                };
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var isComplete = false;
                        AppSdk_1.AppSdk.I.callAppWithBack(function (ret) {
                        }, 'showInteractionExpressAd', JSON.stringify(data));
                    })];
            });
        });
    };
    Object.defineProperty(TTAdSdk, "I", {
        get: function () {
            return ObjectInstance_1.default.get(TTAdSdk);
        },
        enumerable: true,
        configurable: true
    });
    return TTAdSdk;
}());
exports.default = TTAdSdk;

},{"../uitl/ObjectInstance":24,"./AppSdk":9}],14:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AppSdk_1 = require("./AppSdk");
var ObjectInstance_1 = require("../uitl/ObjectInstance");
/**
 * 上报热云埋点⽇志
 * 具体的打点需要跟运营联系
 */
var TrackingSdk = /** @class */ (function () {
    function TrackingSdk() {
    }
    TrackingSdk.prototype.dot = function (key) {
        AppSdk_1.AppSdk.I.callApp('tracking_event', key);
    };
    Object.defineProperty(TrackingSdk, "I", {
        get: function () {
            return ObjectInstance_1.default.get(TrackingSdk);
        },
        enumerable: true,
        configurable: true
    });
    return TrackingSdk;
}());
exports.default = TrackingSdk;
var TrackingKey;
(function (TrackingKey) {
    TrackingKey["RedPack1"] = "event_5";
    TrackingKey["RedPack5"] = "event_6";
})(TrackingKey = exports.TrackingKey || (exports.TrackingKey = {}));

},{"../uitl/ObjectInstance":24,"./AppSdk":9}],15:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ArrayUtils_1 = require("../../uitl/ArrayUtils");
/*
* name;
*/
var BaseModel = /** @class */ (function () {
    function BaseModel() {
        this._data = {};
        this.updateArr = [];
        this.keyUpdateArr = {};
    }
    BaseModel.prototype.update = function (data) {
        return __awaiter(this, void 0, void 0, function () {
            var _loop_1, this_1, key;
            var _this = this;
            return __generator(this, function (_a) {
                this._data = __assign({}, this._data, data);
                this.updateArr.forEach(function (func) {
                    func(_this._data);
                });
                _loop_1 = function (key) {
                    var value = data[key];
                    if (value != null) {
                        var arr = this_1.keyUpdateArr[key];
                        arr && arr.forEach(function (func) {
                            func(value);
                        });
                    }
                };
                this_1 = this;
                for (key in this.keyUpdateArr) {
                    _loop_1(key);
                }
                return [2 /*return*/];
            });
        });
    };
    BaseModel.prototype.waitFor = function (key) {
        var _this = this;
        return new Promise(function (resolve) {
            var value;
            value = _this._data[key];
            if (value) {
                resolve(value);
                return;
            }
            var cb = function (data) {
                if (data) {
                    resolve(data);
                    _this.offUpdate(cb, key);
                }
            };
            _this.onUpdate(cb, key, true);
        });
    };
    BaseModel.prototype.onUpdate = function (func, key, run) {
        if (run === void 0) { run = true; }
        if (key) {
            var value = this._data[key];
            run && value != null && func(value);
            var arr = this.keyUpdateArr[key];
            !arr && (this.keyUpdateArr[key] = arr = []);
            arr.push(func);
        }
        else {
            run && func(this._data);
            this.updateArr.push(func);
        }
    };
    BaseModel.prototype.offUpdate = function (func, key) {
        if (key) {
            ArrayUtils_1.default.removeFromArr(this.keyUpdateArr[key], func);
        }
        else {
            ArrayUtils_1.default.removeFromArr(this.updateArr, func);
        }
    };
    BaseModel.prototype.clearGame = function () {
        this._data = {};
    };
    return BaseModel;
}());
exports.default = BaseModel;

},{"../../uitl/ArrayUtils":22}],16:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var BaseModel_1 = require("./BaseModel");
var AdManager_1 = require("../../sdk/AdManager");
var TrackingSdk_1 = require("../../sdk/TrackingSdk");
var GoldConfigData_1 = require("../../sdk/sdkData/GoldConfigData");
var AddGoldData_1 = require("../../sdk/sdkData/AddGoldData");
var MyCoinData_1 = require("../../sdk/sdkData/MyCoinData");
var AppSdk_1 = require("../../sdk/AppSdk");
var DateUtils_1 = require("../../uitl/DateUtils");
var Util_1 = require("../../uitl/Util");
var ObjectInstance_1 = require("../../uitl/ObjectInstance");
var EventCenter_1 = require("../../event/EventCenter");
var EventEnum_1 = require("../../event/EventEnum");
var RedpacketModel = /** @class */ (function (_super) {
    __extends(RedpacketModel, _super);
    function RedpacketModel() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        _this.MAX = 20;
        /**当天领取红包的最大次数 */
        _this.DAY_MAX_CNT = 50;
        _this.curRedpacket = 0;
        _this.confLen = 0;
        return _this;
    }
    /**初始化红包配置 */
    RedpacketModel.prototype.init = function () {
        return __awaiter(this, void 0, void 0, function () {
            var arr, cash;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, GoldConfigData_1.GoldConfigData.I.getGoldConfig()];
                    case 1:
                        arr = _a.sent();
                        console.log('---------------RedpacketModel-------' + JSON.stringify(arr));
                        cash = 0;
                        this.conf = {};
                        arr.forEach(function (confData) {
                            _this.conf[confData.id] = confData;
                        });
                        this.update(this.initData());
                        this.confLen = this.conf.length;
                        return [2 /*return*/];
                }
            });
        });
    };
    RedpacketModel.prototype.initData = function () {
        var data = new RedpacketData;
        var lastTime = Util_1.default.I.getItem(Util_1.DataKey.lastTime) || '0';
        data.lastTime = parseInt(lastTime);
        var last = DateUtils_1.default.timeDay(data.lastTime);
        var today = DateUtils_1.default.today;
        if (last != today) {
            data.todayCnt = 0;
            lastTime = DateUtils_1.default.nowTime.toString();
            Util_1.default.I.setItem(Util_1.DataKey.lastTime, lastTime);
            Util_1.default.I.setItem(Util_1.DataKey.todayCnt, 0);
        }
        else {
            var todayCnt = Util_1.default.I.getItem(Util_1.DataKey.todayCnt) || '0';
            data.todayCnt = parseInt(todayCnt);
        }
        data.lastTime = parseInt(lastTime);
        var dataCnt = Util_1.default.I.getItem(Util_1.DataKey.dataCNT) || '0';
        data.cnt = parseInt(dataCnt);
        data.list = [];
        return data;
    };
    RedpacketModel.prototype.checkRedpacket = function () {
        return __awaiter(this, void 0, void 0, function () {
            var cnt, data, ran2, cash;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (this.data.todayCnt >= this.DAY_MAX_CNT)
                            return [2 /*return*/, false];
                        if (AdManager_1.default.I.checkVideoInCd())
                            return [2 /*return*/, false];
                        /**红包获取后没有看广告领取,再次获得红包的机会,不会获取红包, 自己也可以处理成 对应的红包提醒或不需要这里的判断 */
                        if (this.curRedpacket) {
                            return [2 /*return*/, false];
                        }
                        if (undefined === this.data.cnt)
                            this.data.cnt = 0;
                        cnt = this.data.cnt;
                        if (cnt >= this.confLen)
                            cnt = this.confLen - 1;
                        data = this.conf[cnt + 1];
                        ran2 = Math.random();
                        if (!(data && ran2 < data.per)) return [3 /*break*/, 2];
                        cash = 0.000001;
                        this.curRedpacket = cash;
                        //**弹出红包的界面,  暂时处理成 直接看广告获取金币 */
                        return [4 /*yield*/, AdManager_1.default.I.showRewardAd()];
                    case 1:
                        //**弹出红包的界面,  暂时处理成 直接看广告获取金币 */
                        _a.sent();
                        this.getRepacket();
                        /**更新基本显示 */
                        EventCenter_1.EventCenter.emit(EventEnum_1.EventEnum.UPDATE_COIN);
                        /*** */
                        return [2 /*return*/, true];
                    case 2: return [2 /*return*/, false];
                }
            });
        });
    };
    RedpacketModel.prototype.getRepacket = function () {
        if (!this.curRedpacket)
            return;
        this.data.cnt += 1;
        this.data.list.push(this.curRedpacket);
        this.data.lastTime = (new Date).getTime();
        this.data.todayCnt += 1;
        if (this.data.cnt == 1)
            TrackingSdk_1.default.I.dot(TrackingSdk_1.TrackingKey.RedPack1);
        if (this.data.cnt == 5)
            TrackingSdk_1.default.I.dot(TrackingSdk_1.TrackingKey.RedPack5);
        this.curRedpacket = 0;
        Util_1.default.I.setItem(Util_1.DataKey.dataCNT, this.data.cnt);
        Util_1.default.I.setItem(Util_1.DataKey.todayCnt, this.data.todayCnt);
        this.update(this.data);
    };
    /** */
    RedpacketModel.prototype.getCurRedpacket = function () {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, this.curRedpacket];
            });
        });
    };
    Object.defineProperty(RedpacketModel.prototype, "data", {
        get: function () {
            return this._data;
        },
        enumerable: true,
        configurable: true
    });
    /**获取总共的金币数 */
    RedpacketModel.prototype.getTotalCoin = function () {
        return __awaiter(this, void 0, void 0, function () {
            var totalCoin;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, MyCoinData_1.default.getCoin()];
                    case 1:
                        totalCoin = _a.sent();
                        return [2 /*return*/, totalCoin];
                }
            });
        });
    };
    /**获取本次奖励的金币数 */
    RedpacketModel.prototype.addCoin = function (key) {
        if (key === void 0) { key = 1; }
        return __awaiter(this, void 0, void 0, function () {
            var coinData;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, AddGoldData_1.default.addCoin(key)];
                    case 1:
                        coinData = _a.sent();
                        return [2 /*return*/, coinData];
                }
            });
        });
    };
    /**获取最低提档 */
    RedpacketModel.prototype.minWithDrawal = function () {
        return __awaiter(this, void 0, void 0, function () {
            var minCoin;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, AppSdk_1.AppSdk.I.minWithDrawal()];
                    case 1:
                        minCoin = _a.sent();
                        return [2 /*return*/, minCoin];
                }
            });
        });
    };
    Object.defineProperty(RedpacketModel, "I", {
        get: function () {
            return ObjectInstance_1.default.get(RedpacketModel);
        },
        enumerable: true,
        configurable: true
    });
    return RedpacketModel;
}(BaseModel_1.default));
exports.default = RedpacketModel;
var RedpacketData = /** @class */ (function () {
    function RedpacketData() {
    }
    return RedpacketData;
}());
var RedpacketConfigData = /** @class */ (function () {
    function RedpacketConfigData() {
    }
    return RedpacketConfigData;
}());

},{"../../event/EventCenter":5,"../../event/EventEnum":6,"../../sdk/AdManager":7,"../../sdk/AppSdk":9,"../../sdk/TrackingSdk":14,"../../sdk/sdkData/AddGoldData":18,"../../sdk/sdkData/GoldConfigData":19,"../../sdk/sdkData/MyCoinData":20,"../../uitl/DateUtils":23,"../../uitl/ObjectInstance":24,"../../uitl/Util":27,"./BaseModel":15}],17:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var BaseModel_1 = require("./BaseModel");
var AppSdk_1 = require("../../sdk/AppSdk");
var DateUtils_1 = require("../../uitl/DateUtils");
var Util_1 = require("../../uitl/Util");
var ObjectInstance_1 = require("../../uitl/ObjectInstance");
/**
 *
 */
var ShakeModel = /** @class */ (function (_super) {
    __extends(ShakeModel, _super);
    function ShakeModel() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        _this.eleProbabilityArr = [];
        _this.totalWeight = 0;
        _this.proArrLen = 0;
        /**红包出现的总次数每日 */
        _this.red_day_limit = 0;
        _this.cur_red_day_limit = 0;
        /**摇一摇出现的总次数 */
        _this.shake_day_limit = 0;
        _this.cur_shake_day_limit = 0;
        return _this;
    }
    /**
     * red_day_limit	红包每日极限产出
    *  shake_day_limit	摇一摇每日极限产出
    * interstitial_cnt 插屏计数(每出现x次通用获得物品界面后,出现插屏)
    * interstitial_delay	插屏出现延时(毫秒)
     */
    /**
     *  // let result = {
        //     data: {
        //         gameConfig: {
        //             "config": {
        //                 "red_day_limit": 10,
        //                 "shake_day_limit": 50,
        //                 "interstitial_cnt": 2,
        //                 "interstitial_delay": 500
        //             },
        //             "shake": [
        //                 {
        //                     "id": 1,
        //                     "type": 1,
        //                     "weight": 1000,
        //                     "num": 0
        //                 },
        //                 {
        //                     "id": 2,
        //                     "type": 2,
        //                     "weight": 400,
        //                     "num": 0
        //                 },
        //                 {
        //                     "id": 3,
        //                     "type": 3,
        //                     "weight": 300,
        //                     "num": 1
        //                 },
        //                 {
        //                     "id": 4,
        //                     "type": 3,
        //                     "weight": 100,
        //                     "num": 2
        //                 },
        //                 {
        //                     "id": 5,
        //                     "type": 4,
        //                     "weight": 300,
        //                     "num": 1
        //                 },
        //                 {
        //                     "id": 6,
        //                     "type": 4,
        //                     "weight": 100,
        //                     "num": 2
        //                 },
        //                 {
        //                     "id": 7,
        //                     "type": 5,
        //                     "weight": 300,
        //                     "num": 1
        //                 },
        //                 {
        //                     "id": 8,
        //                     "type": 5,
        //                     "weight": 100,
        //                     "num": 2
        //                 },
        //                 {
        //                     "id": 9,
        //                     "type": 6,
        //                     "weight": 300,
        //                     "num": 1
        //                 },
        //                 {
        //                     "id": 10,
        //                     "type": 6,
        //                     "weight": 100,
        //                     "num": 2
        //                 },
        //                 {
        //                     "id": 11,
        //                     "type": 7,
        //                     "weight": 300,
        //                     "num": 1
        //                 },
        //                 {
        //                     "id": 12,
        //                     "type": 7,
        //                     "weight": 100,
        //                     "num": 2
        //                 },
        //                 {
        //                     "id": 13,
        //                     "type": 8,
        //                     "weight": 500,
        //                     "num": 0
        //                 }
        //             ],
        //             'coin_config': []
        //         }
        //     }
        // }
     */
    ShakeModel.prototype.init = function () {
        return __awaiter(this, void 0, void 0, function () {
            var result, data, gameData;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, AppSdk_1.AppSdk.I.getGameConfig()];
                    case 1:
                        result = _a.sent();
                        console.log('---------------ShakeModel-------' + JSON.stringify(result.data));
                        data = result.data;
                        if (data['gameConfig']) {
                            gameData = data['gameConfig'];
                            this.update(this.initData(gameData));
                        }
                        return [2 /*return*/];
                }
            });
        });
    };
    ShakeModel.prototype.initData = function (gameData) {
        var data = new ShakeData;
        var lastTime = Util_1.default.I.getItem(Util_1.DataKey.shakeLastTime) || '0';
        var lt = parseInt(lastTime);
        var last = DateUtils_1.default.timeDay(lt);
        var today = DateUtils_1.default.today;
        if (last != today) {
            this.cur_shake_day_limit = 0;
            this.cur_red_day_limit = 0;
            lastTime = DateUtils_1.default.nowTime.toString();
            Util_1.default.I.setItem(Util_1.DataKey.cur_shake_day_limit, 0);
            Util_1.default.I.setItem(Util_1.DataKey.cur_red_day_limit, 0);
            Util_1.default.I.setItem(Util_1.DataKey.shakeLastTime, lastTime);
        }
        else {
            var cur_red_day_limit = Util_1.default.I.getItem(Util_1.DataKey.cur_red_day_limit) || '0';
            this.cur_red_day_limit = parseInt(cur_red_day_limit);
            var cur_shake_day_limit = Util_1.default.I.getItem(Util_1.DataKey.cur_shake_day_limit) || '0';
            this.cur_shake_day_limit = parseInt(cur_shake_day_limit);
        }
        data.config = gameData['config'];
        gameData['shake'].forEach(function (ele) {
            data.shakeWeightList.push(ele);
        });
        this.conf = [];
        this.conf = data.shakeWeightList;
        this.initProbability();
        this.shake_day_limit = data.config.shake_day_limit;
        this.red_day_limit = data.config.red_day_limit;
        return data;
    };
    ShakeModel.prototype.initProbability = function () {
        var _this = this;
        this.totalWeight = 0;
        this.conf.forEach(function (ele, index) {
            _this.totalWeight += ele.weight;
            var itemW = ele.weight;
            if (index > 0)
                itemW += _this.eleProbabilityArr[index - 1];
            _this.eleProbabilityArr = _this.eleProbabilityArr.concat([itemW]);
        });
        this.proArrLen = this.eleProbabilityArr.length;
    };
    ShakeModel.prototype.getShakeType = function () {
        ++this.cur_shake_day_limit;
        Util_1.default.I.setItem(Util_1.DataKey.cur_shake_day_limit, this.cur_shake_day_limit);
        if (this.cur_shake_day_limit > this.shake_day_limit) {
            /**'次数达到上限,请明天再来*/
            /**在此处可以弹框等处理 */
            return false;
        }
        var ran = Math.floor(Math.random() * this.totalWeight);
        for (var index = 0; index < this.proArrLen; index++) {
            var ele = this.eleProbabilityArr[index];
            if (ele >= ran) {
                if (0 === index || 1 === index) {
                    ++this.cur_red_day_limit;
                    Util_1.default.I.setItem(Util_1.DataKey.cur_red_day_limit, this.cur_red_day_limit);
                    if (this.cur_red_day_limit > this.red_day_limit) {
                        return this.conf[this.proArrLen - 1];
                    }
                }
                return this.conf[index];
            }
        }
        return this.conf[this.proArrLen - 1];
    };
    Object.defineProperty(ShakeModel.prototype, "data", {
        get: function () {
            return this._data;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(ShakeModel, "I", {
        get: function () {
            return ObjectInstance_1.default.get(ShakeModel);
        },
        enumerable: true,
        configurable: true
    });
    return ShakeModel;
}(BaseModel_1.default));
exports.default = ShakeModel;
var ShakeData = /** @class */ (function () {
    function ShakeData() {
        this.shakeWeightList = [];
    }
    return ShakeData;
}());

},{"../../sdk/AppSdk":9,"../../uitl/DateUtils":23,"../../uitl/ObjectInstance":24,"../../uitl/Util":27,"./BaseModel":15}],18:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AppSdk_1 = require("../AppSdk");
var AddGoldData = /** @class */ (function () {
    function AddGoldData() {
    }
    AddGoldData.initData = function (data) {
        if (!parseInt(data.code)) {
            AddGoldData.coin = data.data.coin;
            AddGoldData.mycoin = data.data.mycoin;
        }
    };
    AddGoldData.addCoin = function (key) {
        if (key === void 0) { key = 1; }
        return __awaiter(this, void 0, void 0, function () {
            var result;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, AppSdk_1.AppSdk.I.addGold(key)];
                    case 1:
                        result = _a.sent();
                        return [2 /*return*/, [parseInt(this.coin), parseInt(this.mycoin)]];
                }
            });
        });
    };
    AddGoldData.coin = '0';
    AddGoldData.mycoin = '0';
    return AddGoldData;
}());
exports.default = AddGoldData;

},{"../AppSdk":9}],19:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AppSdk_1 = require("../AppSdk");
var Util_1 = require("../../uitl/Util");
var GoldConfigData = /** @class */ (function () {
    function GoldConfigData() {
        this.coin_config = '';
        this.code = -3;
    }
    Object.defineProperty(GoldConfigData, "I", {
        get: function () {
            if (!this.instance)
                this.instance = new GoldConfigData();
            return this.instance;
        },
        enumerable: true,
        configurable: true
    });
    GoldConfigData.prototype.initData = function (data) {
        this.code = data.code;
        if (!data.code) {
            data = data.data;
            for (var key in data) {
                if (data.hasOwnProperty(key)) {
                    var ele = data[key];
                    this[key] = ele;
                }
            }
        }
    };
    GoldConfigData.prototype.getGoldConfig = function () {
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
                        var result, data, gameData, configJson;
                        return __generator(this, function (_a) {
                            switch (_a.label) {
                                case 0: return [4 /*yield*/, AppSdk_1.AppSdk.I.getGameConfig()];
                                case 1:
                                    result = _a.sent();
                                    data = result.data;
                                    if (!data['gameConfig']) return [3 /*break*/, 3];
                                    gameData = data['gameConfig'];
                                    return [4 /*yield*/, this.loadGoldCfg(gameData['coin_config'][0])];
                                case 2:
                                    configJson = _a.sent();
                                    resolve(configJson);
                                    _a.label = 3;
                                case 3: return [2 /*return*/];
                            }
                        });
                    }); })];
            });
        });
    };
    GoldConfigData.prototype.loadGoldCfg = function (res) {
        return __awaiter(this, void 0, void 0, function () {
            var configJson;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, Util_1.default.I.load(res)];
                    case 1:
                        configJson = _a.sent();
                        return [2 /*return*/, configJson];
                }
            });
        });
    };
    GoldConfigData.instance = null;
    return GoldConfigData;
}());
exports.GoldConfigData = GoldConfigData;

},{"../../uitl/Util":27,"../AppSdk":9}],20:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AppSdk_1 = require("../AppSdk");
var MyCoinData = /** @class */ (function () {
    function MyCoinData() {
    }
    MyCoinData.initData = function (data) {
        if (!parseInt(data.code)) {
            this.coin = data.data.coin;
        }
        else {
            this.coin = '0';
        }
    };
    MyCoinData.getCoin = function () {
        return __awaiter(this, void 0, void 0, function () {
            var result;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, AppSdk_1.AppSdk.I.myCoin()];
                    case 1:
                        result = _a.sent();
                        return [2 /*return*/, parseInt(this.coin)];
                }
            });
        });
    };
    MyCoinData.coin = '';
    return MyCoinData;
}());
exports.default = MyCoinData;

},{"../AppSdk":9}],21:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Scene = Laya.Scene;
var REG = Laya.ClassUtils.regClass;
var ui;
(function (ui) {
    var TestSceneUI = /** @class */ (function (_super) {
        __extends(TestSceneUI, _super);
        function TestSceneUI() {
            return _super.call(this) || this;
        }
        TestSceneUI.prototype.createChildren = function () {
            _super.prototype.createChildren.call(this);
            this.loadScene("TestScene");
        };
        return TestSceneUI;
    }(Scene));
    ui.TestSceneUI = TestSceneUI;
    REG("ui.TestSceneUI", TestSceneUI);
})(ui = exports.ui || (exports.ui = {}));

},{}],22:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ArrayUtils = /** @class */ (function () {
    function ArrayUtils() {
    }
    /**
     * 移除元素
     */
    ArrayUtils.removeFromArr = function (arr, obj) {
        var index = arr.indexOf(obj);
        arr.splice(index, 1);
    };
    ArrayUtils.randomFromArr = function (arr) {
        var index = Math.floor(Math.random() * arr.length);
        return arr[index];
    };
    /**
     * 数组随机排序
     */
    ArrayUtils.shuffle = function (arr) {
        return arr.sort(function () {
            return Math.random() - 0.5;
        });
    };
    ArrayUtils.indexOf = function (arr, callback, ctx) {
        for (var i = 0; i < arr.length; i++) {
            if (callback.call(ctx, this[i], i))
                return i;
        }
        return -1;
    };
    ArrayUtils.each = function (arr, callback, context) {
        if (typeof callback !== 'function')
            throw new TypeError();
        for (var i = 0, len = arr.length; i < len; i++) {
            if (callback.call(context, arr[i], i, arr))
                break;
        }
    };
    ArrayUtils.queue = function (arr) {
        return __awaiter(this, void 0, void 0, function () {
            var res, _i, arr_1, promise;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        res = null;
                        _i = 0, arr_1 = arr;
                        _a.label = 1;
                    case 1:
                        if (!(_i < arr_1.length)) return [3 /*break*/, 4];
                        promise = arr_1[_i];
                        return [4 /*yield*/, promise(res)];
                    case 2:
                        res = _a.sent();
                        _a.label = 3;
                    case 3:
                        _i++;
                        return [3 /*break*/, 1];
                    case 4: return [4 /*yield*/, res];
                    case 5: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    ArrayUtils.getRandomArray = function (arr, count) {
        var shuffled = arr.slice(0);
        var len = arr.length;
        var min = len - count, temp, index;
        while (len-- > min) {
            index = Math.floor((len + 1) * Math.random());
            temp = shuffled[index];
            shuffled[index] = shuffled[len];
            shuffled[len] = temp;
        }
        return shuffled.slice(min);
    };
    return ArrayUtils;
}());
exports.default = ArrayUtils;

},{}],23:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**
 * 日期工具类
 */
var DateUtils = /** @class */ (function () {
    function DateUtils() {
    }
    Object.defineProperty(DateUtils, "now", {
        get: function () {
            return Math.floor(this.nowTime / 1000);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DateUtils, "nowTime", {
        get: function () {
            return new Date().getTime();
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DateUtils, "today", {
        get: function () {
            var time = new Date(this.nowTime);
            var year = time.getFullYear();
            var month = time.getMonth() + 1;
            var date = time.getDate();
            return year + "-" + this.add(month) + "-" + this.add(date);
        },
        enumerable: true,
        configurable: true
    });
    DateUtils.timeDay = function (timeNum) {
        var time = new Date(timeNum);
        var year = time.getFullYear();
        var month = time.getMonth() + 1;
        var date = time.getDate();
        return year + "-" + this.add(month) + "-" + this.add(date);
    };
    /**
     * 根据秒数格式化字符串
     * @param second 秒数
     * @param type 1:00:00:00   2:yyyy-mm-dd h:m:s    3:00:00   4:xx天前,xx小时前,xx分钟前
     * @return
     */
    DateUtils.getFormatBySecond = function (second, type) {
        if (type === void 0) { type = 1; }
        var str = "";
        switch (type) {
            case 0:
                str = this.getFormatBySecond0(second);
                break;
            case 1:
                str = this.getFormatBySecond1(second);
                break;
            case 2:
                str = this.getFormatBySecond2(second);
                break;
            case 3:
                str = this.getFormatBySecond3(second);
                break;
            case 4:
                str = this.getFormatBySecond4(second);
                break;
            case 5:
                str = this.getFormatBySecond5(second);
                break;
        }
        return str;
    };
    // 0: 00:00
    DateUtils.getFormatBySecond0 = function (t) {
        if (t === void 0) { t = 0; }
        var minst = Math.floor(t / 60);
        var secondt = Math.floor(t % 60);
        var mins;
        var sens;
        if (minst == 0) {
            mins = "00";
        }
        else if (minst < 10) {
            mins = "0" + minst;
        }
        else {
            mins = "" + minst;
        }
        if (secondt == 0) {
            sens = "00";
        }
        else if (secondt < 10) {
            sens = "0" + secondt;
        }
        else {
            sens = "" + secondt;
        }
        return mins + ":" + sens;
    };
    //1: 00:00:00
    DateUtils.getFormatBySecond1 = function (t) {
        if (t === void 0) { t = 0; }
        var hourst = Math.floor(t / 3600);
        var hours;
        var day = '';
        if (hourst == 0) {
            hours = "00";
        }
        else {
            if (hourst < 10)
                hours = "0" + hourst;
            else {
                var h = hourst % 24;
                if (hourst >= 24) {
                    hours = h < 10 ? "0" + h : '' + h;
                    day = Math.floor(hourst / 24) + 'd ';
                }
                else
                    hours = h < 10 ? "0" + h : '' + h;
            }
        }
        var minst = Math.floor((t - hourst * 3600) / 60);
        var secondt = Math.floor((t - hourst * 3600) % 60);
        var mins;
        var sens;
        if (minst == 0) {
            mins = "00";
        }
        else if (minst < 10) {
            mins = "0" + minst;
        }
        else {
            mins = "" + minst;
        }
        if (secondt == 0) {
            sens = "00";
        }
        else if (secondt < 10) {
            sens = "0" + secondt;
        }
        else {
            sens = "" + secondt;
        }
        return day + hours + ":" + mins + ":" + sens;
    };
    //3: 00:00
    DateUtils.getFormatBySecond3 = function (t) {
        if (t === void 0) { t = 0; }
        var hourst = Math.floor(t / 3600);
        var minst = Math.floor((t - hourst * 3600) / 60);
        var secondt = Math.floor((t - hourst * 3600) % 60);
        var mins;
        var sens;
        if (minst == 0) {
            mins = "00";
        }
        else if (minst < 10) {
            mins = "0" + minst;
        }
        else {
            mins = "" + minst;
        }
        if (secondt == 0) {
            sens = "00";
        }
        else if (secondt < 10) {
            sens = "0" + secondt;
        }
        else {
            sens = "" + secondt;
        }
        return mins + ":" + sens;
    };
    //2:yyyy-mm-dd h:m:s
    DateUtils.getFormatBySecond2 = function (time) {
        var date = new Date(time);
        var year = date.getFullYear();
        var month = date.getMonth() + 1; //返回的月份从0-11;
        var day = date.getDate();
        var hours = date.getHours();
        var minute = date.getMinutes();
        var second = date.getSeconds();
        return year + "-" + month + "-" + day + " " + hours + ":" + minute + ":" + second;
    };
    //4:xx天前,xx小时前,xx分钟前
    DateUtils.getFormatBySecond4 = function (time) {
        var t = Math.floor(time / 3600);
        if (t > 0) {
            if (t > 24) {
                return Math.floor(t / 24) + "天前";
            }
            else {
                return t + "小时前";
            }
        }
        else {
            return Math.floor(time / 60) + "分钟前";
        }
    };
    DateUtils.getFormatBySecond5 = function (time) {
        // 每个时间单位所对应的秒数
        var oneDay = 3600 * 24;
        var oneHourst = 3600;
        var oneMinst = 60;
        var days = Math.floor(time / oneDay);
        var hourst = Math.floor(time % oneDay / oneHourst);
        var minst = Math.floor((time - hourst * oneHourst) / oneMinst); //Math.floor(time % oneDay % oneHourst / oneMinst);
        var secondt = Math.floor((time - hourst * oneHourst) % oneMinst); //time;
        var dayss = "";
        var hourss = "";
        var minss = "";
        var secss = "";
        if (time > 0) {
            //天
            if (days == 0) {
                dayss = "";
                //小时
                if (hourst == 0) {
                    hourss = "";
                    //分
                    if (minst == 0) {
                        minss = "";
                        if (secondt == 0) {
                            secss = "";
                        }
                        else if (secondt < 10) {
                            secss = "0" + secondt + "秒";
                        }
                        else {
                            secss = "" + secondt + "秒";
                        }
                        return secss;
                    }
                    else {
                        minss = "" + minst + "分钟";
                        if (secondt == 0) {
                            secss = "";
                        }
                        else if (secondt < 10) {
                            secss = "0" + secondt + "秒";
                        }
                        else {
                            secss = "" + secondt + "秒";
                        }
                    }
                    return minss + secss;
                }
                else {
                    hourss = hourst + "小时";
                    if (minst == 0) {
                        minss = "";
                        if (secondt == 0) {
                            secss = "";
                        }
                        else if (secondt < 10) {
                            secss = "0" + secondt + "秒";
                        }
                        else {
                            secss = "" + secondt + "秒";
                        }
                        return hourss + secss;
                    }
                    else if (minst < 10) {
                        minss = "0" + minst + "分钟";
                    }
                    else {
                        minss = "" + minst + "分钟";
                    }
                    return hourss + minss;
                }
            }
            else {
                dayss = days + "天";
                if (hourst == 0) {
                    hourss = "";
                }
                else {
                    if (hourst < 10)
                        hourss = "0" + hourst + "小时";
                    else
                        hourss = "" + hourst + "小时";
                    ;
                }
                return dayss + hourss;
            }
        }
        return "";
    };
    DateUtils.add = function (num) {
        return num < 10 ? '0' + num : num;
    };
    return DateUtils;
}());
exports.default = DateUtils;

},{}],24:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectPool_1 = require("./ObjectPool");
/*
* name;
*/
var ObjectInstance = /** @class */ (function () {
    function ObjectInstance() {
    }
    ObjectInstance.get = function (cls) {
        var idx = this.clzs.indexOf(cls);
        return (idx >= 0 && this.objects[idx]) || this.create(cls);
    };
    ObjectInstance.create = function (cls) {
        var obj = ObjectPool_1.default.pop(cls);
        this.objects.push(obj);
        this.clzs.push(cls);
        return obj;
    };
    ObjectInstance.clzs = [];
    ObjectInstance.objects = [];
    return ObjectInstance;
}());
exports.default = ObjectInstance;

},{"./ObjectPool":25}],25:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectPool = /** @class */ (function () {
    function ObjectPool() {
    }
    ObjectPool.pop = function (cls) {
        var idx = this.clsArr.indexOf(cls);
        if (idx < 0) {
            idx = this.clsArr.length;
            this.clsArr.push(cls);
        }
        var key = 'poolKey' + idx;
        var item = Laya.Pool.getItemByClass(key, cls);
        item.poolKey = key;
        return item;
    };
    ObjectPool.push = function (item) {
        Laya.Pool.recover(item.poolKey, item);
    };
    ObjectPool.clsArr = [];
    return ObjectPool;
}());
exports.default = ObjectPool;

},{}],26:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ScaleButtonScript = /** @class */ (function () {
    function ScaleButtonScript() {
        this.delayTime = 0;
        this.minScale = 0;
    }
    Object.defineProperty(ScaleButtonScript.prototype, "owner", {
        /**
         *设置owner函数,可以直接获取到添加附加脚本的组件实例
         **/
        set: function (value) {
            this.monkeyBox = value;
            //自定义的脚本会有时序问题,所以在此添加一个延时
            this.monkeyBox.frameOnce(2, this, this.onLoaded);
        },
        enumerable: true,
        configurable: true
    });
    ScaleButtonScript.prototype.onLoaded = function () {
        /* 设置按钮为单态按钮
         ** 取值:
         ** 1:单态。图片不做切割,按钮的皮肤状态只有一种。
         ** 2:两态。图片将以竖直方向被等比切割为2部分,从上向下,依次为弹起状态皮肤、按下和经过及选中状态皮肤。
         ** 3:三态。图片将以竖直方向被等比切割为2部分,从上向下,依次为弹起状态皮肤、经过状态皮肤、按下和选中状态皮肤
         */
        //添加鼠标按下事件侦听。按时时缩小按钮。
        this.monkeyBox.on(Laya.Event.MOUSE_DOWN, this, this.scaleSmall);
        //添加鼠标抬起事件侦听。抬起时还原按钮。
        this.monkeyBox.on(Laya.Event.MOUSE_UP, this, this.scaleBig);
        //添加鼠标离开事件侦听。离开时还原按钮。
        this.monkeyBox.on(Laya.Event.MOUSE_OUT, this, this.scaleBig);
    };
    ScaleButtonScript.prototype.scaleSmall = function () {
        //缩小至0.8的缓动效果
        Laya.Tween.to(this.monkeyBox, { scaleX: 0.8, scaleY: 0.8 }, 2);
    };
    ScaleButtonScript.prototype.scaleBig = function () {
        //变大还原的缓动效果
        Laya.Tween.to(this.monkeyBox, { scaleX: 1, scaleY: 1 }, 2);
    };
    return ScaleButtonScript;
}());
exports.default = ScaleButtonScript;

},{}],27:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Util = /** @class */ (function () {
    function Util() {
    }
    Util.prototype.load = function (res, onProgress) {
        var _this = this;
        return new Promise(function (suc, fail) {
            Laya.loader.load(res, Laya.Handler.create(_this, suc), onProgress);
        });
    };
    Util.prototype.setItem = function (key, value) {
        Laya.LocalStorage.setItem(key, value.toString());
    };
    Util.prototype.getItem = function (key) {
        return Laya.LocalStorage.getItem(key);
    };
    Object.defineProperty(Util, "I", {
        get: function () {
            return this._instance || (this._instance = new Util);
        },
        enumerable: true,
        configurable: true
    });
    return Util;
}());
exports.default = Util;
var DataKey;
(function (DataKey) {
    DataKey["cur_red_day_limit"] = "cur_red_day_limit";
    DataKey["cur_shake_day_limit"] = "cur_shake_day_limit";
    DataKey["shakeLastTime"] = "shakeLastTime";
    DataKey["dataCNT"] = "dataCNT";
    DataKey["todayCnt"] = "todayCnt";
    DataKey["lastTime"] = "lastTime";
})(DataKey = exports.DataKey || (exports.DataKey = {}));

},{}]},{},[2])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL0FwcGxpY2F0aW9ucy9MYXlhQWlySURFLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvYXBwL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvR2FtZUNvbmZpZy50cyIsInNyYy9NYWluLnRzIiwic3JjL1JlZERyYXdhbC50cyIsInNyYy9UZXN0U2NlbmUudHMiLCJzcmMvZXZlbnQvRXZlbnRDZW50ZXIudHMiLCJzcmMvZXZlbnQvRXZlbnRFbnVtLnRzIiwic3JjL3Nkay9BZE1hbmFnZXIudHMiLCJzcmMvc2RrL0FuZHJvaWRBcHBTZGsudHMiLCJzcmMvc2RrL0FwcFNkay50cyIsInNyYy9zZGsvQmFzZUFwcFNkay50cyIsInNyYy9zZGsvSW9zQXBwU2RrLnRzIiwic3JjL3Nkay9OYXRpdmVBZC50cyIsInNyYy9zZGsvVFRBZFNkay50cyIsInNyYy9zZGsvVHJhY2tpbmdTZGsudHMiLCJzcmMvc2RrL21vZGVsL0Jhc2VNb2RlbC50cyIsInNyYy9zZGsvbW9kZWwvUmVkcGFja2V0TW9kZWwudHMiLCJzcmMvc2RrL21vZGVsL1NoYWtlTW9kZWwudHMiLCJzcmMvc2RrL3Nka0RhdGEvQWRkR29sZERhdGEudHMiLCJzcmMvc2RrL3Nka0RhdGEvR29sZENvbmZpZ0RhdGEudHMiLCJzcmMvc2RrL3Nka0RhdGEvTXlDb2luRGF0YS50cyIsInNyYy91aS9sYXlhTWF4VUkudHMiLCJzcmMvdWl0bC9BcnJheVV0aWxzLnRzIiwic3JjL3VpdGwvRGF0ZVV0aWxzLnRzIiwic3JjL3VpdGwvT2JqZWN0SW5zdGFuY2UudHMiLCJzcmMvdWl0bC9PYmplY3RQb29sLnRzIiwic3JjL3VpdGwvU2NhbGVCdXR0b25TY3JpcHQudHMiLCJzcmMvdWl0bC9VdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1ZB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WSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJ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QUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsc0JBQWtCLFNBQUM7YUFBbkI7WUFDSSxPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7UUFDekQsQ0FBQzs7O09BQUE7SUFDTCxXQUFDO0FBQUQsQ0FqQkEsQUFpQkMsSUFBQTs7QUFFRCxJQUFZLE9BT1g7QUFQRCxXQUFZLE9BQU87SUFDZixrREFBdUMsQ0FBQTtJQUN2QyxzREFBMkMsQ0FBQTtJQUMzQywwQ0FBK0IsQ0FBQTtJQUMvQiw4QkFBbUIsQ0FBQTtJQUNuQixnQ0FBcUIsQ0FBQTtJQUNyQixnQ0FBcUIsQ0FBQTtBQUN6QixDQUFDLEVBUFcsT0FBTyxHQUFQLGVBQU8sS0FBUCxlQUFPLFFBT2xCIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xyXG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG4gICAgfTtcclxufSkoKTtcclxuKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qKlRoaXMgY2xhc3MgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgTGF5YUFpcklERSwgcGxlYXNlIGRvIG5vdCBtYWtlIGFueSBtb2RpZmljYXRpb25zLiAqL1xyXG5pbXBvcnQgVGVzdFNjZW5lIGZyb20gXCIuL1Rlc3RTY2VuZVwiXG5pbXBvcnQgU2NhbGVCdXR0b25TY3JpcHQgZnJvbSBcIi4vdWl0bC9TY2FsZUJ1dHRvblNjcmlwdFwiXG5pbXBvcnQgUmVkRHJhd2FsIGZyb20gXCIuL1JlZERyYXdhbFwiXG5pbXBvcnQgTmF0aXZlQWQgZnJvbSBcIi4vc2RrL05hdGl2ZUFkXCJcclxuLypcclxuKiDmuLjmiI/liJ3lp4vljJbphY3nva47XHJcbiovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVDb25maWd7XHJcbiAgICBzdGF0aWMgd2lkdGg6bnVtYmVyPTc1MDtcclxuICAgIHN0YXRpYyBoZWlnaHQ6bnVtYmVyPTEzMzQ7XHJcbiAgICBzdGF0aWMgc2NhbGVNb2RlOnN0cmluZz1cImZpeGVkd2lkdGhcIjtcclxuICAgIHN0YXRpYyBzY3JlZW5Nb2RlOnN0cmluZz1cIm5vbmVcIjtcclxuICAgIHN0YXRpYyBhbGlnblY6c3RyaW5nPVwidG9wXCI7XHJcbiAgICBzdGF0aWMgYWxpZ25IOnN0cmluZz1cImxlZnRcIjtcclxuICAgIHN0YXRpYyBzdGFydFNjZW5lOmFueT1cIlRlc3RTY2VuZS5zY2VuZVwiO1xyXG4gICAgc3RhdGljIHNjZW5lUm9vdDpzdHJpbmc9XCJcIjtcclxuICAgIHN0YXRpYyBkZWJ1Zzpib29sZWFuPWZhbHNlO1xyXG4gICAgc3RhdGljIHN0YXQ6Ym9vbGVhbj1mYWxzZTtcclxuICAgIHN0YXRpYyBwaHlzaWNzRGVidWc6Ym9vbGVhbj1mYWxzZTtcclxuICAgIHN0YXRpYyBleHBvcnRTY2VuZVRvSnNvbjpib29sZWFuPXRydWU7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe31cclxuICAgIHN0YXRpYyBpbml0KCl7XHJcbiAgICAgICAgdmFyIHJlZzogRnVuY3Rpb24gPSBMYXlhLkNsYXNzVXRpbHMucmVnQ2xhc3M7XHJcbiAgICAgICAgcmVnKFwiVGVzdFNjZW5lLnRzXCIsVGVzdFNjZW5lKTtcbiAgICAgICAgcmVnKFwidWl0bC9TY2FsZUJ1dHRvblNjcmlwdC50c1wiLFNjYWxlQnV0dG9uU2NyaXB0KTtcbiAgICAgICAgcmVnKFwiUmVkRHJhd2FsLnRzXCIsUmVkRHJhd2FsKTtcbiAgICAgICAgcmVnKFwic2RrL05hdGl2ZUFkLnRzXCIsTmF0aXZlQWQpO1xyXG4gICAgfVxyXG59XHJcbkdhbWVDb25maWcuaW5pdCgpOyIsImltcG9ydCBHYW1lQ29uZmlnIGZyb20gXCIuL0dhbWVDb25maWdcIjtcclxuaW1wb3J0IEFkTWFuYWdlciBmcm9tIFwiLi9zZGsvQWRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IEFwcFNkayB9IGZyb20gXCIuL3Nkay9BcHBTZGtcIjtcclxuaW1wb3J0IFJlZHBhY2tldE1vZGVsIGZyb20gXCIuL3Nkay9tb2RlbC9SZWRwYWNrZXRNb2RlbFwiO1xyXG5pbXBvcnQgU2hha2VNb2RlbCBmcm9tIFwiLi9zZGsvbW9kZWwvU2hha2VNb2RlbFwiO1xyXG5jbGFzcyBNYWluIHtcclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHRcdC8v5qC55o2uSURF6K6+572u5Yid5aeL5YyW5byV5pOOXHRcdFxyXG5cdFx0aWYgKHdpbmRvd1tcIkxheWEzRFwiXSkgTGF5YTNELmluaXQoR2FtZUNvbmZpZy53aWR0aCwgR2FtZUNvbmZpZy5oZWlnaHQpO1xyXG5cdFx0ZWxzZSBMYXlhLmluaXQoR2FtZUNvbmZpZy53aWR0aCwgR2FtZUNvbmZpZy5oZWlnaHQsIExheWFbXCJXZWJHTFwiXSk7XHJcblx0XHRMYXlhW1wiUGh5c2ljc1wiXSAmJiBMYXlhW1wiUGh5c2ljc1wiXS5lbmFibGUoKTtcclxuXHRcdExheWFbXCJEZWJ1Z1BhbmVsXCJdICYmIExheWFbXCJEZWJ1Z1BhbmVsXCJdLmVuYWJsZSgpO1xyXG5cdFx0TGF5YS5zdGFnZS5zY2FsZU1vZGUgPSBHYW1lQ29uZmlnLnNjYWxlTW9kZTtcclxuXHRcdExheWEuc3RhZ2Uuc2NyZWVuTW9kZSA9IEdhbWVDb25maWcuc2NyZWVuTW9kZTtcclxuXHRcdExheWEuc3RhZ2UuYWxpZ25WID0gR2FtZUNvbmZpZy5hbGlnblY7XHJcblx0XHRMYXlhLnN0YWdlLmFsaWduSCA9IEdhbWVDb25maWcuYWxpZ25IO1xyXG5cdFx0Ly/lhbzlrrnlvq7kv6HkuI3mlK/mjIHliqDovb1zY2VuZeWQjue8gOWcuuaZr1xyXG5cdFx0TGF5YS5VUkwuZXhwb3J0U2NlbmVUb0pzb24gPSBHYW1lQ29uZmlnLmV4cG9ydFNjZW5lVG9Kc29uO1xyXG5cclxuXHRcdC8v5omT5byA6LCD6K+V6Z2i5p2/77yI6YCa6L+HSURF6K6+572u6LCD6K+V5qih5byP77yM5oiW6ICFdXJs5Zyw5Z2A5aKe5YqgZGVidWc9dHJ1ZeWPguaVsO+8jOWdh+WPr+aJk+W8gOiwg+ivlemdouadv++8iVxyXG5cdFx0aWYgKEdhbWVDb25maWcuZGVidWcgfHwgTGF5YS5VdGlscy5nZXRRdWVyeVN0cmluZyhcImRlYnVnXCIpID09IFwidHJ1ZVwiKSBMYXlhLmVuYWJsZURlYnVnUGFuZWwoKTtcclxuXHRcdGlmIChHYW1lQ29uZmlnLnBoeXNpY3NEZWJ1ZyAmJiBMYXlhW1wiUGh5c2ljc0RlYnVnRHJhd1wiXSkgTGF5YVtcIlBoeXNpY3NEZWJ1Z0RyYXdcIl0uZW5hYmxlKCk7XHJcblx0XHRpZiAoR2FtZUNvbmZpZy5zdGF0KSBMYXlhLlN0YXQuc2hvdygpO1xyXG5cdFx0TGF5YS5hbGVydEdsb2JhbEVycm9yID0gdHJ1ZTtcclxuXHJcblx0XHQvL+a/gOa0u+i1hOa6kOeJiOacrOaOp+WItu+8jHZlcnNpb24uanNvbueUsUlEReWPkeW4g+WKn+iDveiHquWKqOeUn+aIkO+8jOWmguaenOayoeacieS5n+S4jeW9seWTjeWQjue7rea1geeoi1xyXG5cdFx0TGF5YS5SZXNvdXJjZVZlcnNpb24uZW5hYmxlKFwidmVyc2lvbi5qc29uXCIsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vblZlcnNpb25Mb2FkZWQpLCBMYXlhLlJlc291cmNlVmVyc2lvbi5GSUxFTkFNRV9WRVJTSU9OKTtcclxuXHR9XHJcblxyXG5cdG9uVmVyc2lvbkxvYWRlZCgpOiB2b2lkIHtcclxuXHRcdC8v5r+A5rS75aSn5bCP5Zu+5pig5bCE77yM5Yqg6L295bCP5Zu+55qE5pe25YCZ77yM5aaC5p6c5Y+R546w5bCP5Zu+5Zyo5aSn5Zu+5ZCI6ZuG6YeM6Z2i77yM5YiZ5LyY5YWI5Yqg6L295aSn5Zu+5ZCI6ZuG77yM6ICM5LiN5piv5bCP5Zu+XHJcblx0XHRMYXlhLkF0bGFzSW5mb01hbmFnZXIuZW5hYmxlKFwiZmlsZWNvbmZpZy5qc29uXCIsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkNvbmZpZ0xvYWRlZCkpO1xyXG5cdH1cclxuXHJcblx0b25Db25maWdMb2FkZWQoKTogdm9pZCB7XHJcblxyXG5cdFx0dGhpcy5pbml0RGF0YSgpO1xyXG5cdFx0Ly/liqDovb1JREXmjIflrprnmoTlnLrmma9cclxuXHRcdEdhbWVDb25maWcuc3RhcnRTY2VuZSAmJiBMYXlhLlNjZW5lLm9wZW4oR2FtZUNvbmZpZy5zdGFydFNjZW5lKTtcclxuXHR9XHJcblxyXG5cdC8qKuWIneWni+WMllNESyAqL1xyXG5cdGFzeW5jIGluaXREYXRhKCkge1xyXG5cdFx0Lyoq6ZqQ6JeP5ZCv5Yqo5bGPICovXHJcblx0XHRBcHBTZGsuSS5oaWRlU3BsYXNoKClcclxuXHRcdC8qKuWIneWni+WMlmFkayDojrflj5ZhcHDphY3nva7kv6Hmga8gKi9cclxuXHRcdEFwcFNkay5JLmluaXQoKTtcclxuXHRcdC8qKumihOWKoOi9veinhumikSAqL1xyXG5cdFx0QWRNYW5hZ2VyLkkuaW5pdCgpO1xyXG5cdFx0Lyoq6I635Y+W57qi5YyF6YWN572uICDliJ3lp4vljJbmlbDmja4gKi9cclxuXHRcdGF3YWl0IFJlZHBhY2tldE1vZGVsLkkuaW5pdCgpO1xyXG5cdFx0Lyoq5Yid5aeL5YyW5pGH5LiA5pGH55qE5pWw5o2uICovXHJcblx0XHRhd2FpdCBTaGFrZU1vZGVsLkkuaW5pdCgpXHJcblx0fVxyXG59XHJcbi8v5r+A5rS75ZCv5Yqo57G7XHJcbm5ldyBNYWluKCk7XHJcbiIsImltcG9ydCBSZWRwYWNrZXRNb2RlbCBmcm9tIFwiLi9zZGsvbW9kZWwvUmVkcGFja2V0TW9kZWxcIjtcbmltcG9ydCB7IEV2ZW50Q2VudGVyIH0gZnJvbSBcIi4vZXZlbnQvRXZlbnRDZW50ZXJcIjtcbmltcG9ydCB7IEV2ZW50RW51bSB9IGZyb20gXCIuL2V2ZW50L0V2ZW50RW51bVwiO1xuLyoqXG4gKiDkuLvnlYzpnaIgIOmHkeW4gemHkeminVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWREcmF3YWwgZXh0ZW5kcyBMYXlhLlNjcmlwdCB7XG4gICAgLyoqIEBwcm9wIHtuYW1lOmNvaW5sYWIsIHRpcHM6XCLph5HluIFcIiwgdHlwZTpOb2RlfSovXG4gICAgY29pbmxhYjogTGF5YS5MYWJlbDtcbiAgICAvKiogQHByb3Age25hbWU6dGlwbGFiLCB0aXBzOlwi5o+Q56S6XCIsIHR5cGU6Tm9kZX0qL1xuICAgIHRpcGxhYjogTGF5YS5MYWJlbDtcblxuICAgIHByaXZhdGUgdG90YWxDb2luOiBudW1iZXIgPSAxMTA7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxuICAgIG9uU3RhcnQoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU3RhcigpO1xuICAgICAgICAvLyB0aGlzLnRpcGxhYi52aXNpYmxlID0gZmFsc2U7XG4gICAgfVxuICAgIG9uRW5hYmxlKCkge1xuICAgICAgICBFdmVudENlbnRlci5hZGQoRXZlbnRFbnVtLkFQUF9TSE9XLCB0aGlzLCB0aGlzLnVwZGF0ZVN0YXIpO1xuICAgICAgICBFdmVudENlbnRlci5hZGQoRXZlbnRFbnVtLlVQREFURV9DT0lOLCB0aGlzLCB0aGlzLnVwZGF0ZVN0YXIpO1xuICAgIH1cblxuICAgIG9uRGlzYWJsZSgpIHtcbiAgICAgICAgRXZlbnRDZW50ZXIucmVtb3ZlKEV2ZW50RW51bS5BUFBfU0hPVywgdGhpcywgdGhpcy51cGRhdGVTdGFyKTtcbiAgICAgICAgRXZlbnRDZW50ZXIucmVtb3ZlKEV2ZW50RW51bS5VUERBVEVfQ09JTiwgdGhpcywgdGhpcy51cGRhdGVTdGFyKTtcbiAgICB9XG5cbiAgICBhc3luYyB1cGRhdGVTdGFyKCkge1xuICAgICAgICBsZXQgY29pbiA9IGF3YWl0IFJlZHBhY2tldE1vZGVsLkkuZ2V0VG90YWxDb2luKCk7XG4gICAgICAgIC8vIGxldCBjb2luID0gMTAwMFxuICAgICAgICB0aGlzLnRvdGFsQ29pbiA9IGNvaW47XG4gICAgICAgIHRoaXMuY29pbmxhYi50ZXh0ID0gJycgKyBjb2luO1xuICAgICAgICBsZXQgc3RyID0gJ+WPr+aPkOeOsCc7XG4gICAgICAgIC8qKuabtOaWsOS4i+S4i+S4gOasoeaPkOeOsOeahOmineW6piAqL1xuICAgICAgICBsZXQgbmV4dERyYXdhbCA9IGF3YWl0IFJlZHBhY2tldE1vZGVsLkkubWluV2l0aERyYXdhbCgpO1xuICAgICAgICBpZiAodGhpcy50b3RhbENvaW4gPiAwKSB7XG4gICAgICAgICAgICBsZXQgbGVmdENvaW4gPSBuZXh0RHJhd2FsIC0gdGhpcy50b3RhbENvaW47XG4gICAgICAgICAgICBpZiAobGVmdENvaW4gPiAwKVxuICAgICAgICAgICAgICAgIHN0ciA9IGDov5jlt64keyhsZWZ0Q29pbiAvIDEwMDAwKS50b0ZpeGVkKDMpfemHkemineWPr+aPkOeOsGA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aXBsYWIudGV4dCA9IHN0cjtcbiAgICAgICAgdGhpcy50aXBsYWIudmlzaWJsZSA9IEJvb2xlYW4obmV4dERyYXdhbCk7XG4gICAgfVxufSIsImltcG9ydCB7IHVpIH0gZnJvbSBcIi4vdWkvbGF5YU1heFVJXCI7XG5pbXBvcnQgQWRNYW5hZ2VyIGZyb20gXCIuL3Nkay9BZE1hbmFnZXJcIjtcbmltcG9ydCB7IEFwcFNkayB9IGZyb20gXCIuL3Nkay9BcHBTZGtcIjtcbmltcG9ydCBTaGFrZU1vZGVsIGZyb20gXCIuL3Nkay9tb2RlbC9TaGFrZU1vZGVsXCI7XG5pbXBvcnQgUmVkcGFja2V0TW9kZWwgZnJvbSBcIi4vc2RrL21vZGVsL1JlZHBhY2tldE1vZGVsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3RTY2VuZSBleHRlbmRzIHVpLlRlc3RTY2VuZVVJIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLy/lhbPpl63lpJrngrnop6bmjqfvvIzlkKbliJnlsLHml6DmlYzkuoZcbiAgICAgICAgTGF5YS5Nb3VzZU1hbmFnZXIubXVsdGlUb3VjaEVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLVRlc3RTY2VuZS0tLS0tLS0nKVxuICAgICAgICB0aGlzLk5hdGl2ZUFELnZpc2libGUgPSBmYWxzZTtcblxuICAgIH1cblxuICAgIG9uRW5hYmxlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmJ0blNlcnZlci5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLm9wZW5TZXJ2ZXIpO1xuICAgICAgICB0aGlzLmJ0bkRyYXdhbC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLm9wZW5QZXJzb25hbCk7XG4gICAgICAgIHRoaXMuYnRuSW52aXRlLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuaW52aXRhdGlvbik7XG4gICAgICAgIHRoaXMuYnRuX3NoYWtlLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMudG91Y2hTaGFrZSk7XG4gICAgICAgIHRoaXMuYnRuUHJlbG9hZEFELm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMucHJlbG9hZEFEKTtcbiAgICAgICAgdGhpcy5idG5TaG93QmFubmVyLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuc2hvd0Jhbm5lcik7XG4gICAgICAgIHRoaXMuYnRuU2hvd0Z1bGxBZC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnNob3dGdWxsQWQpO1xuICAgICAgICB0aGlzLmJ0blNob3dOYXRpdmVBZC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnNob3dOYXRpdmVBZCk7XG4gICAgICAgIHRoaXMuYnRuU2hvd0ludGVyQWQub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5zaG93SW50ZXJBZCk7XG4gICAgICAgIHRoaXMuYnRuUmV3YXJkQWQub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5zaG93UmV3YXJkQWQpO1xuICAgICAgICB0aGlzLmJ0blJlZHBhY2tldC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLm9wZW5SZWRwYWNrZXQpO1xuXG4gICAgfVxuXG4gICAgLyoq6aKE5Yqg6L295bm/5ZGKICovXG4gICAgYXN5bmMgcHJlbG9hZEFEKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tcHJlbG9hZEFELS0tLS0tLScpXG4gICAgICAgIGF3YWl0IEFkTWFuYWdlci5JLmluaXQoKTtcbiAgICB9XG5cbiAgICAvKirmmL7npLrlhajlsY/lub/lkYogKi9cbiAgICBzaG93RnVsbEFkKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tc2hvd0Z1bGxBZC0tLS0tLS0nKVxuICAgICAgICBBZE1hbmFnZXIuSS5zaG93RnVsbEFkKCk7XG4gICAgfVxuICAgIC8qKuaYvuekumJhbm5lciAqL1xuICAgIHNob3dCYW5uZXIoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1zaG93QmFubmVyLS0tLS0tLScpXG4gICAgICAgIEFkTWFuYWdlci5JLnNob3dCYW5uZXIoKTtcbiAgICB9XG5cbiAgICAvKirkv6Hmga/mtYHlub/lkYogKi9cbiAgICBzaG93TmF0aXZlQWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1zaG93TmF0aXZlQWQtLS0tLS0tJylcbiAgICAgICAgdGhpcy5OYXRpdmVBRC52aXNpYmxlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKirmj5LlsY/lub/lkYogKi9cbiAgICBzaG93SW50ZXJBZCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNob3dJbnRlckFkLS0tLS0tLScpXG4gICAgICAgIFxuICAgICAgICBBZE1hbmFnZXIuSS5zaG93SW50ZXJBZCgpO1xuICAgIH1cbiAgICAvKirmv4DlirHop4bpopHlub/lkYogKi9cbiAgICBhc3luYyBzaG93UmV3YXJkQWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1zaG93UmV3YXJkQWQtLS0tLS0tJylcbiAgICAgICAgXG4gICAgICAgIGF3YWl0IEFkTWFuYWdlci5JLnNob3dSZXdhcmRBZCgpO1xuICAgICAgICAvKirmiJDlip/lkI7miafooYzlr7nlupTnmoTlpZblirEgKi9cbiAgICB9XG4gICAgLyoq5oSP6KeB5Y+N6aaIICovXG4gICAgb3BlblNlcnZlcigpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLW9wZW5TZXJ2ZXItLS0tLS0tJylcbiAgICAgICAgQXBwU2RrLkkuZmVlZGJhY2soKTtcbiAgICB9XG5cblxuICAgIG9wZW5SZWRwYWNrZXQoKSB7XG4gICAgICAgIFJlZHBhY2tldE1vZGVsLkkuY2hlY2tSZWRwYWNrZXQoKTtcbiAgICAgICAgY29uc29sZS5sb2coJ+e6ouWMheiOt+WPlue7k+aenO+8mmN1clJlZHBhY2tldCcgKyBSZWRwYWNrZXRNb2RlbC5JLmN1clJlZHBhY2tldClcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ+e6ouWMheiOt+WPlue7k+aenO+8micgKyBKU09OLnN0cmluZ2lmeShkYXRhKSlcbiAgICAgICAgLy8gVmlld01hbmFnZXIuSS5vcGVuUG9wd2luKFJlZHBhY2tldFBvcHdpbiwgMCk7XG4gICAgfVxuXG4gICAgLyoq5omT5byA5Liq5Lq65Lit5b+DICovXG4gICAgb3BlblBlcnNvbmFsKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tb3BlblNlcnZlci0tLS0tLS0nKVxuICAgICAgICBBcHBTZGsuSS5wZXJzb25hbCgwKTtcbiAgICB9XG4gICAgLyoq6YKA6K+35aW95Y+LICovXG4gICAgaW52aXRhdGlvbigpIHtcbiAgICAgICAgQXBwU2RrLkkuaW52aXRhdGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDFcdOmHkeW4gVxuICAgIDJcdOa/gOWKseinhumikeWQjumHkeW4gVxuICAgIDNcdDQgNSA2IDcg5ri45oiP5Lit5a+55bqU55qE6YGT5YW3XG4gICAgOFx056m6XG4gICAgICovXG4gICAgdG91Y2hTaGFrZSgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXRvdWNoU2hha2UtLS0tLS0tJylcbiAgICAgICAgLy8gdGhpcy5za2luLmJ0blNoYWtlQW5pLnBsYXkoMCk7XG4gICAgICAgIEFwcFNkay5JLnZpYnJhdGUoKTtcbiAgICAgICAgLy8gVmlld01hbmFnZXIuSS5zaG93TW9kYWwoSGludE1vZGFsLCAnIOS7iuK9h+asoeaVsOW3suK9pOWujO+8jOivt+aYjuK9h+WGjeadpScpO1xuICAgICAgICAvLyB0aGlzLnNraW4uaGFuZEFuaS5zdG9wKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAxLuWbnuWOu+aYn+aYnyDpgZPlhbcgXG4gICAgICAgICAqIDIu57qi5YyFICAg55u05o6l6I635b6X4r6m5biB77yb5oiW6ICF55u05o6l5by55r+A5Yqx6KeG6aKR5ZCO77yM6I635b6X4r6m5biBXG4gICAgICAgICAqIDMu5peg6YGT5YW3XG4gICAgICAgICAqIOebtOaOpeWxleK9sOaPkuWxj1xuICAgICAgICAgKiAgKi9cbiAgICAgICAgbGV0IGRhdGEgPSBTaGFrZU1vZGVsLkkuZ2V0U2hha2VUeXBlKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCfmkYfkuIDmkYfojrflj5bnu5PmnpzvvJonICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkpXG4gICAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xuICAgICAgICBsZXQgdHlwZSA9IGRhdGEudHlwZTtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAvKiogJ+iwouiwouWPguS4ju+8jOS4i+asoeWlvei/kO+8gScqLztcbiAgICAgICAgICAgICAgICBBZE1hbmFnZXIuSS5zaG93SW50ZXJBZCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29pbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHRoaXMud2F0Y2hBRENvaW4oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BzKGRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UHJvcHMoZGF0YSkge1xuICAgICAgICBsZXQgYm9vc3RlcjtcbiAgICAgICAgbGV0IHJld2FyZE51bSA9IGRhdGEubnVtO1xuICAgICAgICBsZXQgdHlwZSA9IGRhdGEudHlwZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOWkhOeQhua4uOaIj+S4reeahOmBk+WFt+aYvuekulxuICAgICAgICAgKi9cbiAgICAgICAgLy8gc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIC8vICAgICBjYXNlIDQ6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLlJlbW92ZTtcbiAgICAgICAgLy8gICAgICAgICBicmVhaztcbiAgICAgICAgLy8gICAgIGNhc2UgNjpcbiAgICAgICAgLy8gICAgICAgICBib29zdGVyID0gQm9vc3RlclR5cGUuQ2hhbmdlO1xuICAgICAgICAvLyAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyAgICAgY2FzZSA1OlxuICAgICAgICAvLyAgICAgICAgIGJvb3N0ZXIgPSBCb29zdGVyVHlwZS5SZWZyZXNoO1xuICAgICAgICAvLyAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyAgICAgY2FzZSA3OlxuICAgICAgICAvLyAgICAgICAgIGJvb3N0ZXIgPSBCb29zdGVyVHlwZS5SYW5kUmVtb3ZlO1xuICAgICAgICAvLyAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyAgICAgY2FzZSAzOlxuICAgICAgICAvLyAgICAgICAgIGJvb3N0ZXIgPSBCb29zdGVyVHlwZS5TdGFyO1xuICAgICAgICAvLyAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIFZpZXdNYW5hZ2VyLkkub3BlblBvcHdpbihSZWNlaXZlUHJvcHNQb3B3aW4sIGJvb3N0ZXIsIHJld2FyZE51bSk7XG5cbiAgICB9XG4gICAgLyoqXG4gICAgICog55yL5bm/5ZGK6I635b6X57qi5YyFXG4gICAgICovXG4gICAgYXN5bmMgd2F0Y2hBRENvaW4oKSB7XG4gICAgICAgIGF3YWl0IEFkTWFuYWdlci5JLnNob3dSZXdhcmRBZCgpO1xuICAgICAgICB0aGlzLmdldENvaW4oKTtcbiAgICB9XG4gICAgLyoq55u05o6l6I635b6X57qi5YyFICovXG4gICAgZ2V0Q29pbigpIHtcbiAgICAgICAgLy9cYuWIt+aWsOaAu+mHkeW4gVxuICAgICAgICAvLyBBcHBNYW5hZ2VyLkkucmVkcGFja2V0LmdldFJlcGFja2V0KClcbiAgICAgICAgLy8gVmlld01hbmFnZXIuSS5vcGVuUG9wd2luKFJlZFBhY2tldFJld2FyZCwgMik7XG4gICAgfVxufSIsImltcG9ydCB7IEV2ZW50RW51bSB9IGZyb20gXCIuL0V2ZW50RW51bVwiO1xuXG4vKlxuKiBuYW1lO1xuKi9cbmV4cG9ydCBjbGFzcyBFdmVudENlbnRlciB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBMYXlhLkV2ZW50RGlzcGF0Y2hlcjtcbiAgICBwcml2YXRlIHN0YXRpYyBnZXQgSSgpOiBMYXlhLkV2ZW50RGlzcGF0Y2hlciB7XG4gICAgICAgIHdpbmRvd1snZXYnXSA9IHRoaXMuX2luc3RhbmNlO1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UgfHwgKHRoaXMuX2luc3RhbmNlID0gbmV3IExheWEuRXZlbnREaXNwYXRjaGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGVtaXQoZXZlbnQ6IEV2ZW50RW51bSwgLi4uYXJncykge1xuICAgICAgICB0aGlzLkkuZXZlbnQoZXZlbnQudG9TdHJpbmcoKSwgYXJncyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhZGQodHlwZTogRXZlbnRFbnVtLCBjYWxsZXI6IGFueSwgbGlzdGVuZXI6IEZ1bmN0aW9uLCBhcmdzPzogQXJyYXk8YW55Pikge1xuICAgICAgICB0aGlzLkkub24odHlwZS50b1N0cmluZygpLCBjYWxsZXIsIGxpc3RlbmVyLCBhcmdzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlbW92ZSh0eXBlOiBFdmVudEVudW0sIGNhbGxlcjogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5JLm9mZih0eXBlLnRvU3RyaW5nKCksIGNhbGxlciwgbGlzdGVuZXIpO1xuICAgIH1cbn0iLCJleHBvcnQgZW51bSBFdmVudEVudW0ge1xuXG5cdENIRUNLX1JFRFBBQ0tFVCA9IDxhbnk+J2NoZWNrX3JlZHBhY2tldCcsXG5cdEFQUF9TSE9XID0gPGFueT4nYXBwLnNob3cnLFxuXHRBUFBfSElERSA9IDxhbnk+J2FwcC5oaWRlJyxcblxuXG5cdFVQREFURV9DT0lOID0gPGFueT4ndXBkYXRlLmNvaW4nLFxuXG59IiwiaW1wb3J0IFRUQWRTZGsgZnJvbSBcIi4vVFRBZFNka1wiO1xyXG5pbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFkTWFuYWdlciB7XHJcbiAgICBwcml2YXRlIGxhc3RWaWRlb1RpbWU6IG51bWJlcjtcclxuXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIHRoaXMucHJlbG9hZFJld2FyZEFkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcmVsb2FkUmV3YXJkQWQoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLnNob3dSZXdhcmRWaWRlb0FkKDEpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dSZXdhcmRBZCgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmV0ID0gYXdhaXQgVFRBZFNkay5JLnNob3dSZXdhcmRWaWRlb0FkKCk7XHJcbiAgICAgICAgICAgIHRoaXMubGFzdFZpZGVvVGltZSA9IExheWEudGltZXIuY3VyclRpbWVyO1xyXG4gICAgICAgICAgICB0aGlzLnByZWxvYWRSZXdhcmRBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLnByZWxvYWRSZXdhcmRBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJlbG9hZEZ1bGxBZCgpIHtcclxuICAgICAgICBUVEFkU2RrLkkubG9hZEZ1bGxTY3JlZW5WaWRlb0FkKCAxKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHByZWxvYWRJbnRlckFkKCkge1xyXG4gICAgICAgIFRUQWRTZGsuSS5sb2FkRnVsbFNjcmVlblZpZGVvQWQoMSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd0Z1bGxBZCgpIHtcclxuICAgICAgICAvLyBjb25zb2xlLndhcm4oJ2Z1bGwnKTtcclxuICAgICAgICAvLyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHJldCA9IGF3YWl0IFRUQWRTZGsuSS5sb2FkRnVsbFNjcmVlblZpZGVvQWQoKTtcclxuICAgICAgICAgICAgdGhpcy5wcmVsb2FkRnVsbEFkKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZEZ1bGxBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dJbnRlckFkKCkge1xyXG4gICAgICAgIC8vIGNvbnNvbGUud2FybignZnVsbCcpO1xyXG4gICAgICAgIC8vIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmV0ID0gYXdhaXQgVFRBZFNkay5JLnNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZCgpO1xyXG4gICAgICAgICAgICB0aGlzLnByZWxvYWRJbnRlckFkKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZEludGVyQWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgY2hlY2tWaWRlb0luQ2QoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdFZpZGVvVGltZSAmJiAoTGF5YS50aW1lci5jdXJyVGltZXIgLSB0aGlzLmxhc3RWaWRlb1RpbWUgPD0gMzAwMDApO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dCYW5uZXIoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmxvYWRCYW5uZXJFeHByZXNzQWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlQmFubmVyKCkge1xyXG4gICAgICAgIFRUQWRTZGsuSS5oaWRlQWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93TmF0aXZlQWQoeCwgeSwgdywgaCkge1xyXG4gICAgICAgIFRUQWRTZGsuSS5sb2FkTmF0aXZlRXhwcmVzc0FkKCB4LCB5LCB3LCBoKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlTmF0aXZlQWQoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmhpZGVBZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgIHN0YXRpYyBnZXQgSSgpOiBBZE1hbmFnZXIge1xyXG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoQWRNYW5hZ2VyKTtcclxuICAgIH1cclxufVxyXG5cclxuIiwiaW1wb3J0IEJhc2VBcHBTZGsgZnJvbSBcIi4vQmFzZUFwcFNka1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQW5kcm9pZEFwcFNkayBleHRlbmRzIEJhc2VBcHBTZGsge1xyXG4gICAgZ2V0IHN5c3RlbSgpIHtcclxuICAgICAgICByZXR1cm4gMTtcclxuICAgIH1cclxuXHJcbiAgICBjYWxsQXBwKGNtZDogc3RyaW5nLCAuLi5wYXJhbXMpIHtcclxuICAgICAgICB0aGlzLmJyaWRnZSAmJiB0aGlzLmJyaWRnZS5jYWxsKGNtZCwgLi4ucGFyYW1zKTtcclxuICAgICAgICAvLyB0aGlzLmJyaWRnZSAmJiBhbGVydChKU09OLnN0cmluZ2lmeSh0aGlzLmJyaWRnZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbGxBcHBXaXRoQmFjayhjYWxsQmFjazogRnVuY3Rpb24sIGNtZDogc3RyaW5nLCAuLi5wYXJhbXMpIHtcclxuICAgICAgICB0aGlzLmJyaWRnZSAmJiB0aGlzLmJyaWRnZS5jYWxsV2l0aEJhY2soY2FsbEJhY2ssIGNtZCwgLi4ucGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IGJyaWRnZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYnJpZGdlIHx8ICh0aGlzLl9icmlkZ2UgPSB0aGlzLmNyZWF0ZUNsYXNzKCdjb20ucHVjaGkuc2RrZGVtby5KU0JyaWRnZScpKTtcclxuICAgIH1cclxufSIsImltcG9ydCBJb3NBcHBTZGsgZnJvbSBcIi4vSW9zQXBwU2RrXCI7XG5pbXBvcnQgQW5kcm9pZEFwcFNkayBmcm9tIFwiLi9BbmRyb2lkQXBwU2RrXCI7XG5pbXBvcnQgQmFzZUFwcFNkayBmcm9tIFwiLi9CYXNlQXBwU2RrXCI7XG5cbmV4cG9ydCBjbGFzcyBBcHBTZGsge1xuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogQmFzZUFwcFNkaztcbiAgICBzdGF0aWMgZ2V0IEkoKTogQmFzZUFwcFNkayB7XG4gICAgICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGxldCBjb25jaENvbmZpZyA9IHdpbmRvd1snY29uY2hDb25maWcnXTtcbiAgICAgICAgICAgIGxldCBvcyA9IGNvbmNoQ29uZmlnICYmIGNvbmNoQ29uZmlnLmdldE9TKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKG9zKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkNvbmNoLWlvc1wiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBJb3NBcHBTZGs7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJDb25jaC1hbmRyb2lkXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IEFuZHJvaWRBcHBTZGs7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IEJhc2VBcHBTZGs7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2luZG93WydBcHBTZGsnXSA9IHRoaXMuX2luc3RhbmNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcbiAgICB9XG59IiwiaW1wb3J0IEFkZEdvbGREYXRhIGZyb20gXCIuL3Nka0RhdGEvQWRkR29sZERhdGFcIjtcclxuaW1wb3J0IE15Q29pbkRhdGEgZnJvbSBcIi4vc2RrRGF0YS9NeUNvaW5EYXRhXCI7XHJcbmltcG9ydCB7IEdvbGRDb25maWdEYXRhIH0gZnJvbSBcIi4vc2RrRGF0YS9Hb2xkQ29uZmlnRGF0YVwiO1xyXG5cclxuLyoqIOi/lOWbnuWPguaVsOexu+WeiyAqL1xyXG5pbnRlcmZhY2UgSUFwcFJlc3VsdDxUPiB7XHJcbiAgICAvKiog6ZSZ6K+v56CBICovXHJcbiAgICBjb2RlPzogbnVtYmVyO1xyXG4gICAgLyoqIOi/lOWbnuaVsOaNriAqL1xyXG4gICAgZGF0YT86IFQ7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlQXBwU2RrIHtcclxuICAgIHByb3RlY3RlZCBfYnJpZGdlOiBhbnk7XHJcbiAgICBwcml2YXRlIG5ldE9uQXJyOiBBcnJheTxGdW5jdGlvbj4gPSBbXTtcclxuICAgIHByaXZhdGUgbmV0T2ZmQXJyOiBBcnJheTxGdW5jdGlvbj4gPSBbXTtcclxuICAgIHByaXZhdGUgX3dpZHRoOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9oZWlnaHQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX2NoYW5uZWw6IHN0cmluZztcclxuICAgIHByaXZhdGUgX3ZlcnNpb246IHN0cmluZztcclxuICAgIHByaXZhdGUgX2xldmVsOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIHBhbmdvbGluSWQ6IHN0cmluZztcclxuICAgIHB1YmxpYyBhZG5ldElkOiBzdHJpbmc7XHJcblxyXG4gICAgaW5pdCgpIHtcclxuICAgICAgICBsZXQgY29uY2ggPSB3aW5kb3dbJ2NvbmNoJ107XHJcbiAgICAgICAgaWYgKGNvbmNoKSB7XHJcbiAgICAgICAgICAgIGNvbmNoLnNldE5ldHdvcmtFdnRGdW5jdGlvbih0aGlzLm5ldHdvcmtFdnRGdW5jLmJpbmQodGhpcykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNhbGxBcHAoJ3NldEFwcENhbGxiYWNrJywgMSwgJ0FwcFNkay5vblNob3coKScpO1xyXG4gICAgICAgIHRoaXMuY2FsbEFwcCgnc2V0QXBwQ2FsbGJhY2snLCAyLCAnQXBwU2RrLm9uSGlkZSgpJyk7XHJcbiAgICAgICAgdGhpcy5nZXRTeXN0ZW1JbmZvKCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0U3lzdGVtSW5mbygpIHtcclxuICAgICAgICB0aGlzLmNhbGxBcHBXaXRoQmFjayhyZXQgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tZ2V0U3lzdGVtSW5mby0tLS0tLS0nICsgSlNPTi5zdHJpbmdpZnkocmV0KSlcclxuICAgICAgICAgICAgbGV0IHsgdywgaCwgdmVyc2lvbk5hbWUsIGNoYW5uZWwsIHBhbmdvbGluLCBhZG5ldCwgbGV2ZWwgfSA9IEpTT04ucGFyc2UocmV0KTtcclxuICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB3O1xyXG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSBoO1xyXG4gICAgICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbk5hbWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoYW5uZWwgPSBjaGFubmVsO1xyXG4gICAgICAgICAgICB0aGlzLnBhbmdvbGluSWQgPSBwYW5nb2xpbjtcclxuICAgICAgICAgICAgdGhpcy5hZG5ldElkID0gYWRuZXQ7XHJcbiAgICAgICAgICAgIHRoaXMuX2xldmVsID0gbGV2ZWw7XHJcbiAgICAgICAgfSwgJ2dldFN5c3RlbUluZm8nLCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uU2hvdygpIHtcclxuICAgICAgICAvLyBFdmVudENlbnRlci5lbWl0KEV2ZW50RW51bS5BUFBfU0hPVyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkhpZGUoKSB7XHJcbiAgICAgICAgLy8gRXZlbnRDZW50ZXIuZW1pdChFdmVudEVudW0uQVBQX0hJREUpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICB2aWJyYXRlKCkge1xyXG4gICAgICAgIHRoaXMuY2FsbEFwcCgnb3BlblN5c3RlbUZ1bicsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGVTcGxhc2goKSB7XHJcbiAgICAgICAgdGhpcy5jYWxsQXBwKCdoaWRlU3BsYXNoJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoq5by55Ye65o+Q546wICovXHJcbiAgICB3aXRoRHJhd2FsKCkge1xyXG4gICAgICAgIHRoaXMuY2FsbEFwcCgnd2l0aERyYXdhbCcpO1xyXG4gICAgfVxyXG4gICAgLyoq5oSP6KeB5Y+N6aaIICovXHJcbiAgICBmZWVkYmFjaygpIHtcclxuICAgICAgICB0aGlzLmNhbGxBcHAoJ2ZlZWRiYWNrJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBrZXkg6buY6K6kMCDvvIznrb7liLAgMVxyXG4gICAgICovXHJcbiAgICBwZXJzb25hbChrZXkgPSAwKSB7XHJcbiAgICAgICAgdGhpcy5jYWxsQXBwKCdwZXJzb25hbCcsIGtleSk7XHJcbiAgICB9XHJcbiAgICAvKirpgoDor7flpb3lj4sqL1xyXG4gICAgaW52aXRhdGlvbigpIHtcclxuICAgICAgICB0aGlzLmNhbGxBcHAoJ2ludml0YXRpb24nKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgY3VycmVudFNodXQodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuY2FsbEFwcCgnY3VycmVudFNodXQnLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPlumHkeW4gemFjeihqFxyXG4gICAgICogQHBhcmFtIGtleSAx57qi5YyFICAgMiDmkYfkuIDmkYfnuqLljIVcclxuICAgICAqL1xyXG5cclxuICAgIGFzeW5jICBnZXRHYW1lQ29uZmlnKGtleTogbnVtYmVyID0gMSkge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLm9uQ2FsbEJhY2soJ2dldEdhbWVDb25maWcnLCBrZXkpXHJcbiAgICAgICAgR29sZENvbmZpZ0RhdGEuSS5pbml0RGF0YShyZXN1bHQpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDopoHmsYLlj5HmlL7ph5HluIFcclxuICAgICAqIEBwYXJhbSBrZXkgMee6ouWMhVxyXG4gICAgICovXHJcblxyXG4gICAgYXN5bmMgYWRkR29sZChrZXk6IG51bWJlciA9IDEpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5vbkNhbGxCYWNrKCdhZGRHb2xkJywga2V5KTtcclxuICAgICAgICBBZGRHb2xkRGF0YS5pbml0RGF0YShyZXN1bHQpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyBteUNvaW4oKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMub25DYWxsQmFjaygnbXlDb2luJylcclxuICAgICAgICBNeUNvaW5EYXRhLmluaXREYXRhKHJlc3VsdCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuXHJcbiAgICB9XHJcbiAgICAvKirojrflj5blvZPliY3mj5DnjrDnmoTmoaPkvY0gKi9cclxuICAgIGFzeW5jIG1pbldpdGhEcmF3YWwoKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMub25DYWxsQmFjaygnbWluV2l0aERyYXdhbCcpO1xyXG4gICAgICAgIGlmICghQm9vbGVhbihwYXJzZUludChyZXN1bHQuY29kZSArICcnKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHJlc3VsdC5kYXRhWydtb25leSddKSAqIDEwMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgb25DYWxsQmFjayhjbWQ6IHN0cmluZywgLi4ucGFyYW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPElBcHBSZXN1bHQ8YW55W10+Pihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FsbEFwcFdpdGhCYWNrKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXMgPSBKU09OLnBhcnNlKHJlcylcclxuICAgICAgICAgICAgICAgIC8vIHJlcyA9IHsgY29kZTogMTAwMCB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIXJlcy5jb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7IGNvZGU6IHJlcy5jb2RlLCBkYXRhOiByZXMuZGF0YSB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7IGNvZGU6IHJlcy5jb2RlIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIGNtZCwgLi4ucGFyYW1zKTtcclxuICAgICAgICB9KVxyXG5cclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIGNhbGxBcHAoY21kOiBzdHJpbmcsIC4uLnBhcmFtcykge1xyXG4gICAgfVxyXG5cclxuICAgIGNhbGxBcHBXaXRoQmFjayhjYWxsQmFjazogRnVuY3Rpb24sIGNtZDogc3RyaW5nLCAuLi5wYXJhbXMpIHtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG5ldHdvcmtFdnRGdW5jKHR5cGU6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBmdW5jQXJyO1xyXG4gICAgICAgIGlmICh0eXBlID09IDApIHtcclxuICAgICAgICAgICAgZnVuY0FyciA9IHRoaXMubmV0T2ZmQXJyO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSA1KSB7XHJcbiAgICAgICAgICAgIGZ1bmNBcnIgPSB0aGlzLm5ldE9uQXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZnVuY0Fycikge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZ1bmNBcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGZ1bmNBcnJbaV0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbk5ldE9uKGZ1bmM6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5uZXRPbkFyci5wdXNoKGZ1bmMpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgb25OZXRPZmYoZnVuYzogRnVuY3Rpb24pIHtcclxuICAgICAgICB0aGlzLm5ldE9mZkFyci5wdXNoKGZ1bmMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsZXZlbCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XHJcbiAgICB9XHJcbiAgICBnZXQgd2lkdGgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBoZWlnaHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdmVyc2lvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY2hhbm5lbCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2hhbm5lbDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IGJyaWRnZSgpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlQ2xhc3MobmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvd1snUGxhdGZvcm1DbGFzcyddLmNyZWF0ZUNsYXNzKG5hbWUpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJhc2VBcHBTZGsgZnJvbSBcIi4vQmFzZUFwcFNka1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW9zQXBwU2RrIGV4dGVuZHMgQmFzZUFwcFNkayB7XHJcbiAgICBnZXQgc3lzdGVtKCkge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbGxBcHAoY21kOiBzdHJpbmcsIC4uLnBhcmFtcykge1xyXG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNtZCArPSAnOic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYnJpZGdlICYmIHRoaXMuYnJpZGdlLmNhbGwoY21kLCAuLi5wYXJhbXMpO1xyXG4gICAgICAgIC8vIHRoaXMuYnJpZGdlICYmIGFsZXJ0KEpTT04uc3RyaW5naWZ5KHRoaXMuYnJpZGdlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FsbEFwcFdpdGhCYWNrKGNhbGxCYWNrOiBGdW5jdGlvbiwgY21kOiBzdHJpbmcsIC4uLnBhcmFtcykge1xyXG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNtZCArPSAnOic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYnJpZGdlICYmIHRoaXMuYnJpZGdlLmNhbGxXaXRoQmFjayhjYWxsQmFjaywgY21kLCAuLi5wYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXQgYnJpZGdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9icmlkZ2UgfHwgKHRoaXMuX2JyaWRnZSA9IHRoaXMuY3JlYXRlQ2xhc3MoJ0pTQnJpZGdlJykpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEFkTWFuYWdlciBmcm9tIFwiLi9BZE1hbmFnZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTmF0aXZlQWQgZXh0ZW5kcyBMYXlhLlNjcmlwdCB7XG4gICAgb25FbmFibGUoKTogdm9pZCB7XG4gICAgICAgIGxldCBnbG9iYWxQb2ludCA9IHRoaXMuaXRlbS5sb2NhbFRvR2xvYmFsKExheWEuUG9pbnQuRU1QVFksIHRydWUpO1xuICAgICAgICBBZE1hbmFnZXIuSS5zaG93TmF0aXZlQWQoZ2xvYmFsUG9pbnQueCwgZ2xvYmFsUG9pbnQueSwgdGhpcy5pdGVtLndpZHRoLCB0aGlzLml0ZW0uaGVpZ2h0KTtcbiAgICB9XG5cbiAgICBvbkRpc2FibGUoKTogdm9pZCB7XG4gICAgICAgIEFkTWFuYWdlci5JLmhpZGVOYXRpdmVBZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGl0ZW0oKTogTGF5YS5WaWV3IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3duZXIgYXMgYW55O1xuICAgIH1cbn0iLCJpbXBvcnQgeyBBcHBTZGsgfSBmcm9tIFwiLi9BcHBTZGtcIjtcclxuaW1wb3J0IE9iamVjdEluc3RhbmNlIGZyb20gXCIuLi91aXRsL09iamVjdEluc3RhbmNlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUVEFkU2RrIHtcclxuICAgIGFzeW5jIHNob3dSZXdhcmRWaWRlb0FkKCBwcmVsb2FkOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgIHc6IEFwcFNkay5JLndpZHRoLFxyXG4gICAgICAgICAgICBoOiBBcHBTZGsuSS5oZWlnaHQsXHJcbiAgICAgICAgICAgIHByZWxvYWRpbmc6IHByZWxvYWQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpc0NvbXBsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIEFwcFNkay5JLmNhbGxBcHBXaXRoQmFjayhyZXQgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IHsgY29kZSwgbWVzc2FnZSB9ID0gSlNPTi5wYXJzZShyZXQpO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAtMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdlcnJvcicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgIC8qKifmmoLml6Dop4bpopHlub/lkYrvvIHmr4/ml6Uw54K56YeN572uJyovO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDIwMDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTAwOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbXBsZXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoJ3VuQ29tcGxldGUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgJ3Nob3dSZXdhcmRWaWRlb0FkJywgMSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkRnVsbFNjcmVlblZpZGVvQWQoIHByZWxvYWQ6IG51bWJlciA9IDApIHtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgcHJlbG9hZGluZzogcHJlbG9hZCxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgbGV0IGlzQ29tcGxldGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgQXBwU2RrLkkuY2FsbEFwcFdpdGhCYWNrKHJldCA9PiB7XHJcbiAgICAgICAgICAgIH0sICdsb2FkRnVsbFNjcmVlblZpZGVvQWQnLCAxLCBKU09OLnN0cmluZ2lmeShkYXRhKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWROYXRpdmVFeHByZXNzQWQoIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcclxuICAgICAgICBsZXQgc2NhbGVYID0gQXBwU2RrLkkud2lkdGggLyBMYXlhLnN0YWdlLndpZHRoO1xyXG4gICAgICAgIGxldCBzY2FsZVkgPSBBcHBTZGsuSS5oZWlnaHQgLyBMYXlhLnN0YWdlLmhlaWdodDtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgdzogd2lkdGggKiBzY2FsZVgsXHJcbiAgICAgICAgICAgIGg6IGhlaWdodCAqIHNjYWxlWSxcclxuICAgICAgICAgICAgbGVmdDogeCAqIHNjYWxlWCxcclxuICAgICAgICAgICAgdG9wOiB5ICogc2NhbGVZXHJcbiAgICAgICAgfVxyXG4gICAgICAgIEFwcFNkay5JLmNhbGxBcHBXaXRoQmFjayhyZXQgPT4ge1xyXG4gICAgICAgIH0sICdsb2FkTmF0aXZlRXhwcmVzc0FkJywgSlNPTi5zdHJpbmdpZnkoZGF0YSkpXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEJhbm5lckV4cHJlc3NBZCgpIHtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgdzogQXBwU2RrLkkud2lkdGgsXHJcbiAgICAgICAgICAgIGg6IEFwcFNkay5JLndpZHRoICogOTAgLyA2MDAsICBcclxuICAgICAgICB9XHJcbiAgICAgICAgQXBwU2RrLkkuY2FsbEFwcFdpdGhCYWNrKHJldCA9PiB7XHJcbiAgICAgICAgfSwgJ2xvYWRCYW5uZXJFeHByZXNzQWQnLCAyLCBKU09OLnN0cmluZ2lmeShkYXRhKSlcclxuICAgIH1cclxuXHJcbiAgICBoaWRlQWQoKSB7XHJcbiAgICAgICAgQXBwU2RrLkkuY2FsbEFwcCgnY2xvc2VfYWR2ZXJfZGlhbG9nJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKCBwcmVsb2FkOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgIHc6IEFwcFNkay5JLndpZHRoICogMC44LFxyXG4gICAgICAgICAgICBoOiBBcHBTZGsuSS5oZWlnaHQsXHJcbiAgICAgICAgICAgIHByZWxvYWRpbmc6IHByZWxvYWQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpc0NvbXBsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIEFwcFNkay5JLmNhbGxBcHBXaXRoQmFjayhyZXQgPT4ge1xyXG4gICAgICAgICAgICB9LCAnc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkJywgSlNPTi5zdHJpbmdpZnkoZGF0YSkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcblxyXG4gICAgXHJcblxyXG4gICAgc3RhdGljIGdldCBJKCk6IFRUQWRTZGsge1xyXG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoVFRBZFNkaykgYXMgVFRBZFNkaztcclxuICAgIH1cclxufSIsImltcG9ydCB7IEFwcFNkayB9IGZyb20gXCIuL0FwcFNka1wiO1xyXG5pbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcclxuLyoqXHJcbiAqIOS4iuaKpeeDreS6keWfi+eCueK9h+W/l1xyXG4gKiDlhbfkvZPnmoTmiZPngrnpnIDopoHot5/ov5DokKXogZTns7tcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyYWNraW5nU2RrIHtcclxuICAgIGRvdChrZXk6IHN0cmluZykge1xyXG4gICAgICAgIEFwcFNkay5JLmNhbGxBcHAoJ3RyYWNraW5nX2V2ZW50Jywga2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IEkoKTogVHJhY2tpbmdTZGsge1xyXG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoVHJhY2tpbmdTZGspIGFzIFRyYWNraW5nU2RrO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBUcmFja2luZ0tleSB7XHJcbiAgICBSZWRQYWNrMSA9ICdldmVudF81JyxcclxuICAgIFJlZFBhY2s1ID0gJ2V2ZW50XzYnXHJcbn1cclxuIiwiaW1wb3J0IEFycmF5VXRpbHMgZnJvbSBcIi4uLy4uL3VpdGwvQXJyYXlVdGlsc1wiO1xuXG4vKlxuKiBuYW1lO1xuKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VNb2RlbCB7XG4gICAgcHJvdGVjdGVkIF9kYXRhOiBhbnkgPSB7fTtcbiAgICBwcml2YXRlIHVwZGF0ZUFycjogQXJyYXk8RnVuY3Rpb24+ID0gW107XG4gICAgcHJpdmF0ZSBrZXlVcGRhdGVBcnI6IGFueSA9IHt9O1xuXG4gICAgcHVibGljIGFzeW5jIHVwZGF0ZShkYXRhOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RhdGEsXG4gICAgICAgICAgICAuLi5kYXRhXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVBcnIuZm9yRWFjaChmdW5jID0+IHtcbiAgICAgICAgICAgIGZ1bmModGhpcy5fZGF0YSk7XG4gICAgICAgIH0pXG4gICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLmtleVVwZGF0ZUFycikge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gZGF0YVtrZXldO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgYXJyID0gdGhpcy5rZXlVcGRhdGVBcnJba2V5XTtcbiAgICAgICAgICAgICAgICBhcnIgJiYgYXJyLmZvckVhY2goZnVuYyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZ1bmModmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgd2FpdEZvcihrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX2RhdGFba2V5XTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjYiA9IGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2ZmVXBkYXRlKGNiLCBrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25VcGRhdGUoY2IsIGtleSwgdHJ1ZSk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIG9uVXBkYXRlKGZ1bmM6IEZ1bmN0aW9uLCBrZXk/OiBzdHJpbmcsIHJ1bjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5fZGF0YVtrZXldO1xuICAgICAgICAgICAgcnVuICYmIHZhbHVlICE9IG51bGwgJiYgZnVuYyh2YWx1ZSk7XG4gICAgICAgICAgICBsZXQgYXJyID0gdGhpcy5rZXlVcGRhdGVBcnJba2V5XTtcbiAgICAgICAgICAgICFhcnIgJiYgKHRoaXMua2V5VXBkYXRlQXJyW2tleV0gPSBhcnIgPSBbXSk7XG4gICAgICAgICAgICBhcnIucHVzaChmdW5jKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJ1biAmJiBmdW5jKHRoaXMuX2RhdGEpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBcnIucHVzaChmdW5jKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvZmZVcGRhdGUoZnVuYzogRnVuY3Rpb24sIGtleT86IHN0cmluZykge1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBBcnJheVV0aWxzLnJlbW92ZUZyb21BcnIodGhpcy5rZXlVcGRhdGVBcnJba2V5XSwgZnVuYyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBBcnJheVV0aWxzLnJlbW92ZUZyb21BcnIodGhpcy51cGRhdGVBcnIsIGZ1bmMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyR2FtZSgpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuICAgIH1cbn0iLCJpbXBvcnQgQmFzZU1vZGVsIGZyb20gXCIuL0Jhc2VNb2RlbFwiO1xuaW1wb3J0IEFkTWFuYWdlciBmcm9tIFwiLi4vLi4vc2RrL0FkTWFuYWdlclwiO1xuaW1wb3J0IFRlYVNkaywgeyBEb3RLZXkgfSBmcm9tIFwiLi4vLi4vc2RrL1RlYVNka1wiO1xuaW1wb3J0IFRyYWNraW5nU2RrLCB7IFRyYWNraW5nS2V5IH0gZnJvbSBcIi4uLy4uL3Nkay9UcmFja2luZ1Nka1wiO1xuaW1wb3J0IHsgR29sZENvbmZpZ0RhdGEgfSBmcm9tIFwiLi4vLi4vc2RrL3Nka0RhdGEvR29sZENvbmZpZ0RhdGFcIjtcbmltcG9ydCBBZGRHb2xkRGF0YSBmcm9tIFwiLi4vLi4vc2RrL3Nka0RhdGEvQWRkR29sZERhdGFcIjtcbmltcG9ydCBNeUNvaW5EYXRhIGZyb20gXCIuLi8uLi9zZGsvc2RrRGF0YS9NeUNvaW5EYXRhXCI7XG5pbXBvcnQgeyBBcHBTZGsgfSBmcm9tIFwiLi4vLi4vc2RrL0FwcFNka1wiO1xuaW1wb3J0IERhdGVVdGlscyBmcm9tIFwiLi4vLi4vdWl0bC9EYXRlVXRpbHNcIjtcbmltcG9ydCBVdGlsLCB7IERhdGFLZXkgfSBmcm9tIFwiLi4vLi4vdWl0bC9VdGlsXCI7XG5pbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uLy4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcbmltcG9ydCB7IEV2ZW50Q2VudGVyIH0gZnJvbSBcIi4uLy4uL2V2ZW50L0V2ZW50Q2VudGVyXCI7XG5pbXBvcnQgeyBFdmVudEVudW0gfSBmcm9tIFwiLi4vLi4vZXZlbnQvRXZlbnRFbnVtXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZHBhY2tldE1vZGVsIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgICBwcml2YXRlIE1BWCA9IDIwO1xuICAgIC8qKuW9k+WkqemihuWPlue6ouWMheeahOacgOWkp+asoeaVsCAqL1xuICAgIHByaXZhdGUgREFZX01BWF9DTlQgPSA1MDtcbiAgICBwcml2YXRlIGNvbmY6IGFueTtcbiAgICBwdWJsaWMgY3VyUmVkcGFja2V0OiBudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBjb25mTGVuOiBudW1iZXIgPSAwO1xuXG4gICAgLyoq5Yid5aeL5YyW57qi5YyF6YWN572uICovXG4gICAgYXN5bmMgaW5pdCgpIHtcblxuICAgICAgICBsZXQgYXJyID0gYXdhaXQgR29sZENvbmZpZ0RhdGEuSS5nZXRHb2xkQ29uZmlnKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1SZWRwYWNrZXRNb2RlbC0tLS0tLS0nK0pTT04uc3RyaW5naWZ5KGFycikpXG4gICAgICAgIFxuICAgICAgICBsZXQgY2FzaCA9IDA7XG4gICAgICAgIHRoaXMuY29uZiA9IHt9O1xuICAgICAgICBhcnIuZm9yRWFjaChjb25mRGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbmZbY29uZkRhdGEuaWRdID0gY29uZkRhdGE7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlKHRoaXMuaW5pdERhdGEoKSk7XG4gICAgICAgIHRoaXMuY29uZkxlbiA9IHRoaXMuY29uZi5sZW5ndGg7XG5cbiAgICB9XG5cbiAgICBpbml0RGF0YSgpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgUmVkcGFja2V0RGF0YTtcbiAgICAgICAgbGV0IGxhc3RUaW1lID0gVXRpbC5JLmdldEl0ZW0oRGF0YUtleS5sYXN0VGltZSkgfHwgJzAnO1xuICAgICAgICBkYXRhLmxhc3RUaW1lID0gcGFyc2VJbnQobGFzdFRpbWUpO1xuXG4gICAgICAgIGxldCBsYXN0ID0gRGF0ZVV0aWxzLnRpbWVEYXkoZGF0YS5sYXN0VGltZSk7XG4gICAgICAgIGxldCB0b2RheSA9IERhdGVVdGlscy50b2RheTtcbiAgICAgICAgaWYgKGxhc3QgIT0gdG9kYXkpIHtcbiAgICAgICAgICAgIGRhdGEudG9kYXlDbnQgPSAwO1xuICAgICAgICAgICAgbGFzdFRpbWUgPSBEYXRlVXRpbHMubm93VGltZS50b1N0cmluZygpO1xuICAgICAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS5sYXN0VGltZSwgbGFzdFRpbWUpXG4gICAgICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5LnRvZGF5Q250LCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCB0b2RheUNudCA9IFV0aWwuSS5nZXRJdGVtKERhdGFLZXkudG9kYXlDbnQpIHx8ICcwJztcbiAgICAgICAgICAgIGRhdGEudG9kYXlDbnQgPSBwYXJzZUludCh0b2RheUNudCk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YS5sYXN0VGltZSA9IHBhcnNlSW50KGxhc3RUaW1lKTtcbiAgICAgICAgbGV0IGRhdGFDbnQgPSBVdGlsLkkuZ2V0SXRlbShEYXRhS2V5LmRhdGFDTlQpIHx8ICcwJztcbiAgICAgICAgZGF0YS5jbnQgPSBwYXJzZUludChkYXRhQ250KTtcbiAgICAgICAgZGF0YS5saXN0ID0gW107XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGFzeW5jIGNoZWNrUmVkcGFja2V0KCkge1xuXG4gICAgICAgIGlmICh0aGlzLmRhdGEudG9kYXlDbnQgPj0gdGhpcy5EQVlfTUFYX0NOVCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoQWRNYW5hZ2VyLkkuY2hlY2tWaWRlb0luQ2QoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvKirnuqLljIXojrflj5blkI7msqHmnInnnIvlub/lkYrpooblj5bvvIzlho3mrKHojrflvpfnuqLljIXnmoTmnLrkvJrvvIzkuI3kvJrojrflj5bnuqLljIXvvIwg6Ieq5bex5Lmf5Y+v5Lul5aSE55CG5oiQIOWvueW6lOeahOe6ouWMheaPkOmGkuaIluS4jemcgOimgei/memHjOeahOWIpOaWrSAqL1xuICAgICAgICBpZiAodGhpcy5jdXJSZWRwYWNrZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5kZWZpbmVkID09PSB0aGlzLmRhdGEuY250KSB0aGlzLmRhdGEuY250ID0gMDtcbiAgICAgICAgbGV0IGNudCA9IHRoaXMuZGF0YS5jbnQ7XG4gICAgICAgIGlmIChjbnQgPj0gdGhpcy5jb25mTGVuKSBjbnQgPSB0aGlzLmNvbmZMZW4gLSAxO1xuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuY29uZltjbnQgKyAxXTtcbiAgICAgICAgbGV0IHJhbjIgPSBNYXRoLnJhbmRvbSgpO1xuXG4gICAgICAgIGlmIChkYXRhICYmIHJhbjIgPCBkYXRhLnBlcikge1xuICAgICAgICAgICAgbGV0IGNhc2ggPSAwLjAwMDAwMTtcbiAgICAgICAgICAgIHRoaXMuY3VyUmVkcGFja2V0ID0gY2FzaDtcbiAgICAgICAgICAgIC8vKirlvLnlh7rnuqLljIXnmoTnlYzpnaIsICDmmoLml7blpITnkIbmiJAg55u05o6l55yL5bm/5ZGK6I635Y+W6YeR5biBICovXG4gICAgICAgICAgIGF3YWl0ICBBZE1hbmFnZXIuSS5zaG93UmV3YXJkQWQoKVxuICAgICAgICAgICB0aGlzLmdldFJlcGFja2V0KClcbiAgICAgICAgICAgLyoq5pu05paw5Z+65pys5pi+56S6ICovXG4gICAgICAgICAgIEV2ZW50Q2VudGVyLmVtaXQoRXZlbnRFbnVtLlVQREFURV9DT0lOKTtcblxuICAgICAgICAgICAgLyoqKiAqL1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGdldFJlcGFja2V0KCkge1xuICAgICAgICBpZiAoIXRoaXMuY3VyUmVkcGFja2V0KSByZXR1cm47XG4gICAgICAgIHRoaXMuZGF0YS5jbnQgKz0gMTtcbiAgICAgICAgdGhpcy5kYXRhLmxpc3QucHVzaCh0aGlzLmN1clJlZHBhY2tldCk7XG4gICAgICAgIHRoaXMuZGF0YS5sYXN0VGltZSA9IChuZXcgRGF0ZSkuZ2V0VGltZSgpO1xuICAgICAgICB0aGlzLmRhdGEudG9kYXlDbnQgKz0gMTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5jbnQgPT0gMSlcbiAgICAgICAgICAgIFRyYWNraW5nU2RrLkkuZG90KFRyYWNraW5nS2V5LlJlZFBhY2sxKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5jbnQgPT0gNSlcbiAgICAgICAgICAgIFRyYWNraW5nU2RrLkkuZG90KFRyYWNraW5nS2V5LlJlZFBhY2s1KTtcbiAgICAgICAgdGhpcy5jdXJSZWRwYWNrZXQgPSAwO1xuICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5LmRhdGFDTlQsIHRoaXMuZGF0YS5jbnQpO1xuICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5LnRvZGF5Q250LCB0aGlzLmRhdGEudG9kYXlDbnQpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlKHRoaXMuZGF0YSk7XG4gICAgfVxuXG4gICAgLyoqICovXG4gICAgYXN5bmMgZ2V0Q3VyUmVkcGFja2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJSZWRwYWNrZXQ7XG4gICAgfVxuXG4gICAgZ2V0IGRhdGEoKTogUmVkcGFja2V0RGF0YSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgIH1cbiAgICAvKirojrflj5bmgLvlhbHnmoTph5HluIHmlbAgKi9cbiAgICBhc3luYyBnZXRUb3RhbENvaW4oKSB7XG4gICAgICAgIGxldCB0b3RhbENvaW4gPSBhd2FpdCBNeUNvaW5EYXRhLmdldENvaW4oKTtcbiAgICAgICAgcmV0dXJuIHRvdGFsQ29pbjtcbiAgICB9XG4gICAgLyoq6I635Y+W5pys5qyh5aWW5Yqx55qE6YeR5biB5pWwICovXG4gICAgYXN5bmMgYWRkQ29pbihrZXk6IG51bWJlciA9IDEpIHtcbiAgICAgICAgbGV0IGNvaW5EYXRhID0gYXdhaXQgQWRkR29sZERhdGEuYWRkQ29pbihrZXkpO1xuICAgICAgICByZXR1cm4gY29pbkRhdGE7XG4gICAgfVxuXG4gICAgLyoq6I635Y+W5pyA5L2O5o+Q5qGjICovXG4gICAgYXN5bmMgIG1pbldpdGhEcmF3YWwoKSB7XG4gICAgICAgIGxldCBtaW5Db2luID0gYXdhaXQgQXBwU2RrLkkubWluV2l0aERyYXdhbCgpO1xuICAgICAgICByZXR1cm4gbWluQ29pbjtcbiAgICB9XG4gICAgc3RhdGljIGdldCBJKCk6IFJlZHBhY2tldE1vZGVsIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdEluc3RhbmNlLmdldChSZWRwYWNrZXRNb2RlbCkgYXMgUmVkcGFja2V0TW9kZWw7XG4gICAgfVxufVxuXG5jbGFzcyBSZWRwYWNrZXREYXRhIHtcbiAgICBjbnQ6IG51bWJlcjtcbiAgICBsaXN0OiBBcnJheTxudW1iZXI+O1xuICAgIGxhc3RUaW1lOiBudW1iZXI7XG4gICAgdG9kYXlDbnQ6IG51bWJlcjtcbn1cblxuY2xhc3MgUmVkcGFja2V0Q29uZmlnRGF0YSB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBwZXI6IG51bWJlcjtcbiAgICBjYXNoOiBudW1iZXI7XG59IiwiaW1wb3J0IEJhc2VNb2RlbCBmcm9tIFwiLi9CYXNlTW9kZWxcIjtcbmltcG9ydCB7IEFwcFNkayB9IGZyb20gXCIuLi8uLi9zZGsvQXBwU2RrXCI7XG5pbXBvcnQgRGF0ZVV0aWxzIGZyb20gXCIuLi8uLi91aXRsL0RhdGVVdGlsc1wiO1xuaW1wb3J0IFV0aWwsIHsgRGF0YUtleSB9IGZyb20gXCIuLi8uLi91aXRsL1V0aWxcIjtcbmltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xuXG4vKipcbiAqIFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGFrZU1vZGVsIGV4dGVuZHMgQmFzZU1vZGVsIHtcblxuICAgIHByaXZhdGUgY29uZjogYW55O1xuICAgIHByaXZhdGUgZWxlUHJvYmFiaWxpdHlBcnI6IG51bWJlcltdID0gW107XG4gICAgcHJpdmF0ZSB0b3RhbFdlaWdodDogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIHByb0FyckxlbjogbnVtYmVyID0gMDtcbiAgICAvKirnuqLljIXlh7rnjrDnmoTmgLvmrKHmlbDmr4/ml6UgKi9cbiAgICBwcml2YXRlIHJlZF9kYXlfbGltaXQ6IG51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBjdXJfcmVkX2RheV9saW1pdDogbnVtYmVyID0gMDtcbiAgICAvKirmkYfkuIDmkYflh7rnjrDnmoTmgLvmrKHmlbAgKi9cbiAgICBwcml2YXRlIHNoYWtlX2RheV9saW1pdDogbnVtYmVyID0gMDtcblxuICAgIHByaXZhdGUgY3VyX3NoYWtlX2RheV9saW1pdDogbnVtYmVyID0gMDtcbiAgICAvKipcbiAgICAgKiByZWRfZGF5X2xpbWl0XHTnuqLljIXmr4/ml6XmnoHpmZDkuqflh7pcdFxuICAgICogIHNoYWtlX2RheV9saW1pdFx05pGH5LiA5pGH5q+P5pel5p6B6ZmQ5Lqn5Ye6XHRcbiAgICAqIGludGVyc3RpdGlhbF9jbnQg5o+S5bGP6K6h5pWw77yI5q+P5Ye6546weOasoemAmueUqOiOt+W+l+eJqeWTgeeVjOmdouWQju+8jOWHuueOsOaPkuWxj++8iVx0XG4gICAgKiBpbnRlcnN0aXRpYWxfZGVsYXlcdOaPkuWxj+WHuueOsOW7tuaXtu+8iOavq+enku+8iVx0XG4gICAgICovXG4gICBcbiAgICAvKipcbiAgICAgKiAgLy8gbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgLy8gICAgIGRhdGE6IHtcbiAgICAgICAgLy8gICAgICAgICBnYW1lQ29uZmlnOiB7XG4gICAgICAgIC8vICAgICAgICAgICAgIFwiY29uZmlnXCI6IHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIFwicmVkX2RheV9saW1pdFwiOiAxMCxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIFwic2hha2VfZGF5X2xpbWl0XCI6IDUwLFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgXCJpbnRlcnN0aXRpYWxfY250XCI6IDIsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBcImludGVyc3RpdGlhbF9kZWxheVwiOiA1MDBcbiAgICAgICAgLy8gICAgICAgICAgICAgfSxcbiAgICAgICAgLy8gICAgICAgICAgICAgXCJzaGFrZVwiOiBbXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAxLFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiAxLFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwid2VpZ2h0XCI6IDEwMDAsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJudW1cIjogMFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDIsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IDIsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJ3ZWlnaHRcIjogNDAwLFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwibnVtXCI6IDBcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIH0sXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAzLFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiAzLFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwid2VpZ2h0XCI6IDMwMCxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBcIm51bVwiOiAxXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAge1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogNCxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogMyxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBcIndlaWdodFwiOiAxMDAsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJudW1cIjogMlxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDUsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IDQsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJ3ZWlnaHRcIjogMzAwLFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwibnVtXCI6IDFcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIH0sXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiA2LFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiA0LFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwid2VpZ2h0XCI6IDEwMCxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBcIm51bVwiOiAyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAge1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogNyxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogNSxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBcIndlaWdodFwiOiAzMDAsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJudW1cIjogMVxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDgsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IDUsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJ3ZWlnaHRcIjogMTAwLFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwibnVtXCI6IDJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIH0sXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiA5LFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiA2LFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwid2VpZ2h0XCI6IDMwMCxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBcIm51bVwiOiAxXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAge1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMTAsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IDYsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJ3ZWlnaHRcIjogMTAwLFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwibnVtXCI6IDJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIH0sXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAxMSxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogNyxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBcIndlaWdodFwiOiAzMDAsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJudW1cIjogMVxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDEyLFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiA3LFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwid2VpZ2h0XCI6IDEwMCxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBcIm51bVwiOiAyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAge1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMTMsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IDgsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgXCJ3ZWlnaHRcIjogNTAwLFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFwibnVtXCI6IDBcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICAgICAgXSxcbiAgICAgICAgLy8gICAgICAgICAgICAgJ2NvaW5fY29uZmlnJzogW11cbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICAgKi9cbiAgICBhc3luYyBpbml0KCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgQXBwU2RrLkkuZ2V0R2FtZUNvbmZpZygpO1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tU2hha2VNb2RlbC0tLS0tLS0nK0pTT04uc3RyaW5naWZ5KHJlc3VsdC5kYXRhKSlcbiAgICAgICAgXG4gICAgICAgIGxldCBkYXRhID0gcmVzdWx0LmRhdGE7XG4gICAgICAgIGlmIChkYXRhWydnYW1lQ29uZmlnJ10pIHtcbiAgICAgICAgICAgIGxldCBnYW1lRGF0YSA9IGRhdGFbJ2dhbWVDb25maWcnXTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKHRoaXMuaW5pdERhdGEoZ2FtZURhdGEpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXREYXRhKGdhbWVEYXRhKSB7XG4gICAgICAgIGxldCBkYXRhID0gbmV3IFNoYWtlRGF0YTtcbiAgICAgICAgbGV0IGxhc3RUaW1lID0gVXRpbC5JLmdldEl0ZW0oRGF0YUtleS5zaGFrZUxhc3RUaW1lKSB8fCAnMCc7XG4gICAgICAgIGxldCBsdCA9IHBhcnNlSW50KGxhc3RUaW1lKTtcbiAgICAgICAgbGV0IGxhc3QgPSBEYXRlVXRpbHMudGltZURheShsdCk7XG4gICAgICAgIGxldCB0b2RheSA9IERhdGVVdGlscy50b2RheTtcblxuICAgICAgICBpZiAobGFzdCAhPSB0b2RheSkge1xuICAgICAgICAgICAgdGhpcy5jdXJfc2hha2VfZGF5X2xpbWl0ID0gMDtcbiAgICAgICAgICAgIHRoaXMuY3VyX3JlZF9kYXlfbGltaXQgPSAwO1xuICAgICAgICAgICAgbGFzdFRpbWUgPSBEYXRlVXRpbHMubm93VGltZS50b1N0cmluZygpO1xuICAgICAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS5jdXJfc2hha2VfZGF5X2xpbWl0LCAwKTtcbiAgICAgICAgICAgIFV0aWwuSS5zZXRJdGVtKERhdGFLZXkuY3VyX3JlZF9kYXlfbGltaXQsIDApO1xuICAgICAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS5zaGFrZUxhc3RUaW1lLCBsYXN0VGltZSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjdXJfcmVkX2RheV9saW1pdCA9IFV0aWwuSS5nZXRJdGVtKERhdGFLZXkuY3VyX3JlZF9kYXlfbGltaXQpIHx8ICcwJztcbiAgICAgICAgICAgIHRoaXMuY3VyX3JlZF9kYXlfbGltaXQgPSBwYXJzZUludChjdXJfcmVkX2RheV9saW1pdCk7XG4gICAgICAgICAgICBsZXQgY3VyX3NoYWtlX2RheV9saW1pdCA9IFV0aWwuSS5nZXRJdGVtKERhdGFLZXkuY3VyX3NoYWtlX2RheV9saW1pdCkgfHwgJzAnO1xuICAgICAgICAgICAgdGhpcy5jdXJfc2hha2VfZGF5X2xpbWl0ID0gcGFyc2VJbnQoY3VyX3NoYWtlX2RheV9saW1pdCk7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLmNvbmZpZyA9IGdhbWVEYXRhWydjb25maWcnXTtcbiAgICAgICAgZ2FtZURhdGFbJ3NoYWtlJ10uZm9yRWFjaChlbGUgPT4ge1xuICAgICAgICAgICAgZGF0YS5zaGFrZVdlaWdodExpc3QucHVzaChlbGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25mID0gW107XG4gICAgICAgIHRoaXMuY29uZiA9IGRhdGEuc2hha2VXZWlnaHRMaXN0O1xuICAgICAgICB0aGlzLmluaXRQcm9iYWJpbGl0eSgpO1xuICAgICAgICB0aGlzLnNoYWtlX2RheV9saW1pdCA9IGRhdGEuY29uZmlnLnNoYWtlX2RheV9saW1pdDtcbiAgICAgICAgdGhpcy5yZWRfZGF5X2xpbWl0ID0gZGF0YS5jb25maWcucmVkX2RheV9saW1pdDtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgaW5pdFByb2JhYmlsaXR5KCkge1xuICAgICAgICB0aGlzLnRvdGFsV2VpZ2h0ID0gMDtcbiAgICAgICAgdGhpcy5jb25mLmZvckVhY2goKGVsZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG90YWxXZWlnaHQgKz0gZWxlLndlaWdodDtcbiAgICAgICAgICAgIGxldCBpdGVtVyA9IGVsZS53ZWlnaHQ7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwKVxuICAgICAgICAgICAgICAgIGl0ZW1XICs9IHRoaXMuZWxlUHJvYmFiaWxpdHlBcnJbaW5kZXggLSAxXTtcbiAgICAgICAgICAgIHRoaXMuZWxlUHJvYmFiaWxpdHlBcnIgPSBbLi4udGhpcy5lbGVQcm9iYWJpbGl0eUFyciwgaXRlbVddO1xuICAgICAgICB9KVxuICAgICAgICB0aGlzLnByb0FyckxlbiA9IHRoaXMuZWxlUHJvYmFiaWxpdHlBcnIubGVuZ3RoO1xuXG4gICAgfVxuXG4gICAgZ2V0U2hha2VUeXBlKCkge1xuICAgICAgICArK3RoaXMuY3VyX3NoYWtlX2RheV9saW1pdDtcbiAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS5jdXJfc2hha2VfZGF5X2xpbWl0LCB0aGlzLmN1cl9zaGFrZV9kYXlfbGltaXQpO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cl9zaGFrZV9kYXlfbGltaXQgPiB0aGlzLnNoYWtlX2RheV9saW1pdCkge1xuICAgICAgICAgICAgLyoqJ+asoeaVsOi+vuWIsOS4iumZkO+8jOivt+aYjuWkqeWGjeadpSovXG5cbiAgICAgICAgICAgIC8qKuWcqOatpOWkhOWPr+S7peW8ueahhuetieWkhOeQhiAqL1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCByYW4gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0aGlzLnRvdGFsV2VpZ2h0KTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMucHJvQXJyTGVuOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGUgPSB0aGlzLmVsZVByb2JhYmlsaXR5QXJyW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChlbGUgPj0gcmFuKSB7XG4gICAgICAgICAgICAgICAgaWYgKDAgPT09IGluZGV4IHx8IDEgPT09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICsrdGhpcy5jdXJfcmVkX2RheV9saW1pdDtcbiAgICAgICAgICAgICAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS5jdXJfcmVkX2RheV9saW1pdCwgdGhpcy5jdXJfcmVkX2RheV9saW1pdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cl9yZWRfZGF5X2xpbWl0ID4gdGhpcy5yZWRfZGF5X2xpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25mW3RoaXMucHJvQXJyTGVuIC0gMV07XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25mW2luZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25mW3RoaXMucHJvQXJyTGVuIC0gMV07XG4gICAgfVxuXG4gICAgZ2V0IGRhdGEoKTogU2hha2VEYXRhIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBJKCk6IFNoYWtlTW9kZWwge1xuICAgICAgICByZXR1cm4gT2JqZWN0SW5zdGFuY2UuZ2V0KFNoYWtlTW9kZWwpIGFzIFNoYWtlTW9kZWw7XG4gICAgfVxufVxuXG5cbmNsYXNzIFNoYWtlRGF0YSB7XG4gICAgY29uZmlnOiBTaGFrZUNvbmZpZztcbiAgICBzaGFrZVdlaWdodExpc3Q6IFNoYWtlV2VpZ2h0RGF0YVtdID0gW107XG59XG5pbnRlcmZhY2UgU2hha2VDb25maWcge1xuICAgIHJlZF9kYXlfbGltaXQ6IG51bWJlcixcbiAgICBzaGFrZV9kYXlfbGltaXQ6IG51bWJlcixcbiAgICBpbnRlcnN0aXRpYWxfY250OiBudW1iZXIsXG4gICAgaW50ZXJzdGl0aWFsX2RlbGF5OiBudW1iZXJcbn1cblxuaW50ZXJmYWNlIFNoYWtlV2VpZ2h0RGF0YSB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICB0eXBlOiBudW1iZXI7XG4gICAgd2VpZ2h0OiBudW1iZXI7XG4gICAgbnVtOiBudW1iZXI7XG59XG5cblxuIiwiaW1wb3J0IHsgQXBwU2RrIH0gZnJvbSBcIi4uL0FwcFNka1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBZGRHb2xkRGF0YSB7XG4gICAgc3RhdGljIGNvaW46IHN0cmluZyA9ICcwJztcbiAgICBzdGF0aWMgbXljb2luOiBzdHJpbmcgPSAnMCc7XG4gICAgc3RhdGljIGluaXREYXRhKGRhdGE6IGFueSkge1xuICAgICAgICBpZiAoIXBhcnNlSW50KGRhdGEuY29kZSkpIHtcbiAgICAgICAgICAgIEFkZEdvbGREYXRhLmNvaW4gPSBkYXRhLmRhdGEuY29pbjtcbiAgICAgICAgICAgIEFkZEdvbGREYXRhLm15Y29pbiA9IGRhdGEuZGF0YS5teWNvaW47XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyAgYWRkQ29pbihrZXk6IG51bWJlciA9IDEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IEFwcFNkay5JLmFkZEdvbGQoa2V5KTtcbiAgICAgICAgcmV0dXJuIFtwYXJzZUludCh0aGlzLmNvaW4pLHBhcnNlSW50KHRoaXMubXljb2luKV07XG5cbiAgICB9XG59IiwiaW1wb3J0IHsgQXBwU2RrIH0gZnJvbSBcIi4uL0FwcFNka1wiO1xyXG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vLi4vdWl0bC9VdGlsXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgR29sZENvbmZpZ0RhdGEge1xyXG4gICAgYWQ6IE9iamVjdDtcclxuICAgIGFkbmV0OiBzdHJpbmc7XHJcbiAgICBhcHBfbmFtZTogc3RyaW5nO1xyXG4gICAgY29pbl9jb25maWc6IHN0cmluZyA9ICcnO1xyXG4gICAgZ2FtZVVybDogc3RyaW5nO1xyXG4gICAga3VhaV9hcHBfbmFtZTogc3RyaW5nO1xyXG4gICAgcGFuZ29saW46IHN0cmluZztcclxuICAgIHRUdXJib0FnZW50OiBzdHJpbmc7XHJcbiAgICB0ZWFBZ2VudDogbnVtYmVyO1xyXG4gICAgdHJhY2tpbmc6IHN0cmluZztcclxuICAgIHR0QXBwTG9nOiBzdHJpbmc7XHJcbiAgICB1bWlkOiBzdHJpbmc7XHJcbiAgICBnYW1lQ29uZmlnOiBhbnk7XHJcblxyXG4gICAgY29kZTogbnVtYmVyID0gLTM7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogR29sZENvbmZpZ0RhdGEgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEkoKTogR29sZENvbmZpZ0RhdGEge1xyXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSlcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBHb2xkQ29uZmlnRGF0YSgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xyXG4gICAgfVxyXG4gICAgaW5pdERhdGEoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuY29kZSA9IGRhdGEuY29kZTtcclxuICAgICAgICBpZiAoIWRhdGEuY29kZSkge1xyXG4gICAgICAgICAgICBkYXRhID0gZGF0YS5kYXRhO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlID0gZGF0YVtrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXNba2V5XSA9IGVsZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRHb2xkQ29uZmlnKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IEFwcFNkay5JLmdldEdhbWVDb25maWcoKTtcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSByZXN1bHQuZGF0YTtcclxuICAgICAgICAgICAgaWYgKGRhdGFbJ2dhbWVDb25maWcnXSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGdhbWVEYXRhID0gZGF0YVsnZ2FtZUNvbmZpZyddO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZ0pzb24gPSBhd2FpdCB0aGlzLmxvYWRHb2xkQ2ZnKGdhbWVEYXRhWydjb2luX2NvbmZpZyddWzBdKVxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShjb25maWdKc29uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWRHb2xkQ2ZnKHJlczogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGNvbmZpZ0pzb24gPSBhd2FpdCAgVXRpbC5JLmxvYWQocmVzKTtcclxuICAgICAgICByZXR1cm4gY29uZmlnSnNvbjtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBBcHBTZGsgfSBmcm9tIFwiLi4vQXBwU2RrXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE15Q29pbkRhdGEge1xuICAgIHN0YXRpYyBjb2luOiBzdHJpbmcgPSAnJztcbiAgICBzdGF0aWMgaW5pdERhdGEoZGF0YTogYW55KSB7XG4gICAgICAgIGlmICghcGFyc2VJbnQoZGF0YS5jb2RlKSl7XG4gICAgICAgICAgICB0aGlzLmNvaW4gPSBkYXRhLmRhdGEuY29pbjtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLmNvaW4gPScwJztcbiAgICAgICAgfVxuICAgICAgIFxuICAgIH1cbiAgICAgc3RhdGljIGFzeW5jIGdldENvaW4oKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBBcHBTZGsuSS5teUNvaW4oKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuY29pbilcbiAgICB9XG59IiwiLyoqVGhpcyBjbGFzcyBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBMYXlhQWlySURFLCBwbGVhc2UgZG8gbm90IG1ha2UgYW55IG1vZGlmaWNhdGlvbnMuICovXG5pbXBvcnQgVmlldz1MYXlhLlZpZXc7XHJcbmltcG9ydCBEaWFsb2c9TGF5YS5EaWFsb2c7XHJcbmltcG9ydCBTY2VuZT1MYXlhLlNjZW5lO1xudmFyIFJFRzogRnVuY3Rpb24gPSBMYXlhLkNsYXNzVXRpbHMucmVnQ2xhc3M7XG5leHBvcnQgbW9kdWxlIHVpIHtcclxuICAgIGV4cG9ydCBjbGFzcyBUZXN0U2NlbmVVSSBleHRlbmRzIFNjZW5lIHtcclxuXHRcdHB1YmxpYyBidG5JbnZpdGU6TGF5YS5TcHJpdGU7XG5cdFx0cHVibGljIGJ0blNlcnZlcjpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuVmlicmF0ZTpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuX3NoYWtlOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5EcmF3YWw6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0blByZWxvYWRBRDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuU2hvd0Jhbm5lcjpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuU2hvd0Z1bGxBZDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuU2hvd05hdGl2ZUFkOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5TaG93SW50ZXJBZDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuUmV3YXJkQWQ6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0blJlZHBhY2tldDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgTmF0aXZlQUQ6VmlldztcbiAgICAgICAgY29uc3RydWN0b3IoKXsgc3VwZXIoKX1cclxuICAgICAgICBjcmVhdGVDaGlsZHJlbigpOnZvaWQge1xyXG4gICAgICAgICAgICBzdXBlci5jcmVhdGVDaGlsZHJlbigpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRTY2VuZShcIlRlc3RTY2VuZVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBSRUcoXCJ1aS5UZXN0U2NlbmVVSVwiLFRlc3RTY2VuZVVJKTtcclxufVxyIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXJyYXlVdGlscyB7XG4gICAgLyoqXG4gICAgICog56e76Zmk5YWD57SgXG4gICAgICovXG4gICAgc3RhdGljIHJlbW92ZUZyb21BcnIoYXJyOiBBcnJheTxhbnk+LCBvYmo6IGFueSkge1xuICAgICAgICBsZXQgaW5kZXggPSBhcnIuaW5kZXhPZihvYmopO1xuICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmFuZG9tRnJvbUFycihhcnI6IEFycmF5PGFueT4pIHtcbiAgICAgICAgbGV0IGluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXJyLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiBhcnJbaW5kZXhdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaVsOe7hOmaj+acuuaOkuW6j1xuICAgICAqL1xuICAgIHN0YXRpYyBzaHVmZmxlKGFycjogQXJyYXk8YW55Pikge1xuICAgICAgICByZXR1cm4gYXJyLnNvcnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgLSAwLjU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBpbmRleE9mKGFyciwgY2FsbGJhY2ssIGN0eD8pIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjay5jYWxsKGN0eCwgdGhpc1tpXSwgaSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIHN0YXRpYyBlYWNoKGFyciwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXJyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2suY2FsbChjb250ZXh0LCBhcnJbaV0sIGksIGFycikpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgcXVldWUoYXJyKSB7XG4gICAgICAgIGxldCByZXMgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBwcm9taXNlIG9mIGFycikge1xuICAgICAgICAgICAgcmVzID0gYXdhaXQgcHJvbWlzZShyZXMpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlcztcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0UmFuZG9tQXJyYXkoYXJyLCBjb3VudCkge1xuICAgICAgICBsZXQgc2h1ZmZsZWQgPSBhcnIuc2xpY2UoMCk7XG4gICAgICAgIGxldCBsZW4gPSBhcnIubGVuZ3RoO1xuICAgICAgICBsZXQgbWluID0gbGVuIC0gY291bnQsIHRlbXAsIGluZGV4O1xuICAgICAgICB3aGlsZSAobGVuLS0gPiBtaW4pIHtcbiAgICAgICAgICAgIGluZGV4ID0gTWF0aC5mbG9vcigobGVuICsgMSkgKiBNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgICAgIHRlbXAgPSBzaHVmZmxlZFtpbmRleF07XG4gICAgICAgICAgICBzaHVmZmxlZFtpbmRleF0gPSBzaHVmZmxlZFtsZW5dO1xuICAgICAgICAgICAgc2h1ZmZsZWRbbGVuXSA9IHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNodWZmbGVkLnNsaWNlKG1pbik7XG4gICAgfVxufSIsIi8qKlxuICog5pel5pyf5bel5YW357G7XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhdGVVdGlscyB7XG4gICAgc3RhdGljIGdldCBub3coKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5ub3dUaW1lIC8gMTAwMCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBub3dUaW1lKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IHRvZGF5KCk6IHN0cmluZyB7XG4gICAgICAgIGxldCB0aW1lID0gbmV3IERhdGUodGhpcy5ub3dUaW1lKTtcbiAgICAgICAgbGV0IHllYXIgPSB0aW1lLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGxldCBtb250aCA9IHRpbWUuZ2V0TW9udGgoKSArIDE7XG4gICAgICAgIGxldCBkYXRlID0gdGltZS5nZXREYXRlKCk7XG4gICAgICAgIHJldHVybiBgJHt5ZWFyfS0ke3RoaXMuYWRkKG1vbnRoKX0tJHt0aGlzLmFkZChkYXRlKX1gO1xuICAgIH1cblxuICAgIHN0YXRpYyB0aW1lRGF5KHRpbWVOdW06IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGxldCB0aW1lID0gbmV3IERhdGUodGltZU51bSk7XG4gICAgICAgIGxldCB5ZWFyID0gdGltZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBsZXQgbW9udGggPSB0aW1lLmdldE1vbnRoKCkgKyAxO1xuICAgICAgICBsZXQgZGF0ZSA9IHRpbWUuZ2V0RGF0ZSgpO1xuICAgICAgICByZXR1cm4gYCR7eWVhcn0tJHt0aGlzLmFkZChtb250aCl9LSR7dGhpcy5hZGQoZGF0ZSl9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmoLnmja7np5LmlbDmoLzlvI/ljJblrZfnrKbkuLJcbiAgICAgKiBAcGFyYW0gc2Vjb25kIOenkuaVsFxuICAgICAqIEBwYXJhbSB0eXBlIDE6MDA6MDA6MDAgICAyOnl5eXktbW0tZGQgaDptOnMgICAgMzowMDowMCAgIDQ6eHjlpKnliY3vvIx4eOWwj+aXtuWJje+8jHh45YiG6ZKf5YmNXG4gICAgICogQHJldHVyblxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRGb3JtYXRCeVNlY29uZChzZWNvbmQ6IG51bWJlciwgdHlwZTogbnVtYmVyID0gMSk6IHN0cmluZyB7XG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuZ2V0Rm9ybWF0QnlTZWNvbmQwKHNlY29uZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRGb3JtYXRCeVNlY29uZDEoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLmdldEZvcm1hdEJ5U2Vjb25kMihzZWNvbmQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuZ2V0Rm9ybWF0QnlTZWNvbmQzKHNlY29uZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRGb3JtYXRCeVNlY29uZDQoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLmdldEZvcm1hdEJ5U2Vjb25kNShzZWNvbmQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLy8gMDogMDA6MDBcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRGb3JtYXRCeVNlY29uZDAodDogbnVtYmVyID0gMCk6IHN0cmluZyB7XG4gICAgICAgIHZhciBtaW5zdDogbnVtYmVyID0gTWF0aC5mbG9vcih0IC8gNjApO1xuICAgICAgICB2YXIgc2Vjb25kdDogbnVtYmVyID0gTWF0aC5mbG9vcih0ICUgNjApO1xuICAgICAgICB2YXIgbWluczogc3RyaW5nO1xuICAgICAgICB2YXIgc2Vuczogc3RyaW5nO1xuICAgICAgICBpZiAobWluc3QgPT0gMCkge1xuICAgICAgICAgICAgbWlucyA9IFwiMDBcIjtcbiAgICAgICAgfSBlbHNlIGlmIChtaW5zdCA8IDEwKSB7XG4gICAgICAgICAgICBtaW5zID0gXCIwXCIgKyBtaW5zdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIlwiICsgbWluc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlY29uZHQgPT0gMCkge1xuICAgICAgICAgICAgc2VucyA9IFwiMDBcIjtcbiAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIjBcIiArIHNlY29uZHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZW5zID0gXCJcIiArIHNlY29uZHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbnMgKyBcIjpcIiArIHNlbnM7XG4gICAgfVxuXG4gICAgLy8xOiAwMDowMDowMFxuICAgIHByaXZhdGUgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kMSh0OiBudW1iZXIgPSAwKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGhvdXJzdDogbnVtYmVyID0gTWF0aC5mbG9vcih0IC8gMzYwMCk7XG4gICAgICAgIGxldCBob3Vyczogc3RyaW5nO1xuICAgICAgICBsZXQgZGF5ID0gJyc7XG4gICAgICAgIGlmIChob3Vyc3QgPT0gMCkge1xuICAgICAgICAgICAgaG91cnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaG91cnN0IDwgMTApXG4gICAgICAgICAgICAgICAgaG91cnMgPSBcIjBcIiArIGhvdXJzdDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBoID0gaG91cnN0ICUgMjQ7XG4gICAgICAgICAgICAgICAgaWYgKGhvdXJzdCA+PSAyNCkge1xuICAgICAgICAgICAgICAgICAgICBob3VycyA9IGggPCAxMCA/IFwiMFwiICsgaCA6ICcnICsgaDtcbiAgICAgICAgICAgICAgICAgICAgZGF5ID0gTWF0aC5mbG9vcihob3Vyc3QgLyAyNCkgKyAnZCAnO1xuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICBob3VycyA9IGggPCAxMCA/IFwiMFwiICsgaCA6ICcnICsgaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWluc3Q6IG51bWJlciA9IE1hdGguZmxvb3IoKHQgLSBob3Vyc3QgKiAzNjAwKSAvIDYwKTtcbiAgICAgICAgbGV0IHNlY29uZHQ6IG51bWJlciA9IE1hdGguZmxvb3IoKHQgLSBob3Vyc3QgKiAzNjAwKSAlIDYwKTtcbiAgICAgICAgbGV0IG1pbnM6IHN0cmluZztcbiAgICAgICAgbGV0IHNlbnM6IHN0cmluZztcbiAgICAgICAgaWYgKG1pbnN0ID09IDApIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobWluc3QgPCAxMCkge1xuICAgICAgICAgICAgbWlucyA9IFwiMFwiICsgbWluc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtaW5zID0gXCJcIiArIG1pbnN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWNvbmR0ID09IDApIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kdCA8IDEwKSB7XG4gICAgICAgICAgICBzZW5zID0gXCIwXCIgKyBzZWNvbmR0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VucyA9IFwiXCIgKyBzZWNvbmR0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXkgKyBob3VycyArIFwiOlwiICsgbWlucyArIFwiOlwiICsgc2VucztcbiAgICB9XG5cbiAgICAvLzM6IDAwOjAwXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0QnlTZWNvbmQzKHQ6IG51bWJlciA9IDApOiBzdHJpbmcge1xuICAgICAgICB2YXIgaG91cnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKHQgLyAzNjAwKTtcbiAgICAgICAgdmFyIG1pbnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKCh0IC0gaG91cnN0ICogMzYwMCkgLyA2MCk7XG4gICAgICAgIHZhciBzZWNvbmR0OiBudW1iZXIgPSBNYXRoLmZsb29yKCh0IC0gaG91cnN0ICogMzYwMCkgJSA2MCk7XG4gICAgICAgIHZhciBtaW5zOiBzdHJpbmc7XG4gICAgICAgIHZhciBzZW5zOiBzdHJpbmc7XG4gICAgICAgIGlmIChtaW5zdCA9PSAwKSB7XG4gICAgICAgICAgICBtaW5zID0gXCIwMFwiO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbnN0IDwgMTApIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIjBcIiArIG1pbnN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWlucyA9IFwiXCIgKyBtaW5zdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICBzZW5zID0gXCIwMFwiO1xuICAgICAgICB9IGVsc2UgaWYgKHNlY29uZHQgPCAxMCkge1xuICAgICAgICAgICAgc2VucyA9IFwiMFwiICsgc2Vjb25kdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIlwiICsgc2Vjb25kdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWlucyArIFwiOlwiICsgc2VucztcbiAgICB9XG5cbiAgICAvLzI6eXl5eS1tbS1kZCBoOm06c1xuICAgIHByaXZhdGUgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kMih0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHRpbWUpO1xuICAgICAgICB2YXIgeWVhcjogbnVtYmVyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICB2YXIgbW9udGg6IG51bWJlciA9IGRhdGUuZ2V0TW9udGgoKSArIDE7IFx0Ly/ov5Tlm57nmoTmnIjku73ku44wLTEx77ybXG4gICAgICAgIHZhciBkYXk6IG51bWJlciA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgdmFyIG1pbnV0ZTogbnVtYmVyID0gZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgIHZhciBzZWNvbmQ6IG51bWJlciA9IGRhdGUuZ2V0U2Vjb25kcygpO1xuICAgICAgICByZXR1cm4geWVhciArIFwiLVwiICsgbW9udGggKyBcIi1cIiArIGRheSArIFwiIFwiICsgaG91cnMgKyBcIjpcIiArIG1pbnV0ZSArIFwiOlwiICsgc2Vjb25kO1xuXG4gICAgfVxuXG4gICAgLy80Onh45aSp5YmN77yMeHjlsI/ml7bliY3vvIx4eOWIhumSn+WJjVxuICAgIHByaXZhdGUgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kNCh0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgdCA9IE1hdGguZmxvb3IodGltZSAvIDM2MDApO1xuICAgICAgICBpZiAodCA+IDApIHtcbiAgICAgICAgICAgIGlmICh0ID4gMjQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0IC8gMjQpICsgXCLlpKnliY1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0ICsgXCLlsI/ml7bliY1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRpbWUgLyA2MCkgKyBcIuWIhumSn+WJjVwiO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0QnlTZWNvbmQ1KHRpbWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIC8vIOavj+S4quaXtumXtOWNleS9jeaJgOWvueW6lOeahOenkuaVsFxuICAgICAgICB2YXIgb25lRGF5OiBudW1iZXIgPSAzNjAwICogMjQ7XG4gICAgICAgIHZhciBvbmVIb3Vyc3Q6IG51bWJlciA9IDM2MDA7XG4gICAgICAgIHZhciBvbmVNaW5zdDogbnVtYmVyID0gNjA7XG5cbiAgICAgICAgdmFyIGRheXMgPSBNYXRoLmZsb29yKHRpbWUgLyBvbmVEYXkpO1xuICAgICAgICB2YXIgaG91cnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgJSBvbmVEYXkgLyBvbmVIb3Vyc3QpXG4gICAgICAgIHZhciBtaW5zdDogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAtIGhvdXJzdCAqIG9uZUhvdXJzdCkgLyBvbmVNaW5zdCkgIC8vTWF0aC5mbG9vcih0aW1lICUgb25lRGF5ICUgb25lSG91cnN0IC8gb25lTWluc3QpO1xuICAgICAgICB2YXIgc2Vjb25kdDogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAtIGhvdXJzdCAqIG9uZUhvdXJzdCkgJSBvbmVNaW5zdCkgLy90aW1lO1xuXG4gICAgICAgIHZhciBkYXlzczogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdmFyIGhvdXJzczogc3RyaW5nID0gXCJcIlxuICAgICAgICB2YXIgbWluc3M6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIHZhciBzZWNzczogc3RyaW5nID0gXCJcIlxuICAgICAgICBpZiAodGltZSA+IDApIHtcbiAgICAgICAgICAgIC8v5aSpXG4gICAgICAgICAgICBpZiAoZGF5cyA9PSAwKSB7XG4gICAgICAgICAgICAgICAgZGF5c3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgIC8v5bCP5pe2XG4gICAgICAgICAgICAgICAgaWYgKGhvdXJzdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXJzcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIC8v5YiGXG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW5zdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiMFwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCJcIiArIHNlY29uZHQgKyBcIuenklwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2Vjc3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCIgKyBtaW5zdCArIFwi5YiG6ZKfXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiMFwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCJcIiArIHNlY29uZHQgKyBcIuenklwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWluc3MgKyBzZWNzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXJzcyA9IGhvdXJzdCArIFwi5bCP5pe2XCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW5zdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiMFwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCJcIiArIHNlY29uZHQgKyBcIuenklwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG91cnNzICsgc2Vjc3NcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pbnN0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNzID0gXCIwXCIgKyBtaW5zdCArIFwi5YiG6ZKfXCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCIgKyBtaW5zdCArIFwi5YiG6ZKfXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG91cnNzICsgbWluc3M7XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXlzcyA9IGRheXMgKyBcIuWkqVwiO1xuICAgICAgICAgICAgICAgIGlmIChob3Vyc3QgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBob3Vyc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChob3Vyc3QgPCAxMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJzcyA9IFwiMFwiICsgaG91cnN0ICsgXCLlsI/ml7ZcIjtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgaG91cnNzID0gXCJcIiArIGhvdXJzdCArIFwi5bCP5pe2XCI7XG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRheXNzICsgaG91cnNzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGFkZChudW0pIHtcbiAgICAgICAgcmV0dXJuIG51bSA8IDEwID8gJzAnICsgbnVtIDogbnVtO1xuICAgIH1cblxuXG59XG4iLCJpbXBvcnQgT2JqZWN0UG9vbCBmcm9tIFwiLi9PYmplY3RQb29sXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2JqZWN0SW5zdGFuY2Uge1xuICAgIHByaXZhdGUgc3RhdGljIGNsenMgPSBbXTtcbiAgICBwcml2YXRlIHN0YXRpYyBvYmplY3RzID0gW107XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldChjbHM6IGFueSkge1xuICAgICAgICBsZXQgaWR4ID0gdGhpcy5jbHpzLmluZGV4T2YoY2xzKTtcbiAgICAgICAgcmV0dXJuIChpZHggPj0gMCAmJiB0aGlzLm9iamVjdHNbaWR4XSkgfHwgdGhpcy5jcmVhdGUoY2xzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjcmVhdGUoY2xzOiBhbnkpIHtcbiAgICAgICAgdmFyIG9iaiA9IE9iamVjdFBvb2wucG9wKGNscyk7XG4gICAgICAgIHRoaXMub2JqZWN0cy5wdXNoKG9iaik7XG4gICAgICAgIHRoaXMuY2x6cy5wdXNoKGNscyk7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2JqZWN0UG9vbCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgY2xzQXJyID0gW107XG5cbiAgICBzdGF0aWMgcG9wKGNsczogYW55KSB7XG4gICAgICAgIGxldCBpZHggPSB0aGlzLmNsc0Fyci5pbmRleE9mKGNscyk7XG4gICAgICAgIGlmIChpZHggPCAwKSB7XG4gICAgICAgICAgICBpZHggPSB0aGlzLmNsc0Fyci5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmNsc0Fyci5wdXNoKGNscyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGtleSA9ICdwb29sS2V5JyArIGlkeDtcbiAgICAgICAgbGV0IGl0ZW0gPSBMYXlhLlBvb2wuZ2V0SXRlbUJ5Q2xhc3Moa2V5LCBjbHMpO1xuICAgICAgICBpdGVtLnBvb2xLZXkgPSBrZXk7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cblxuICAgIHN0YXRpYyBwdXNoKGl0ZW0pIHtcbiAgICAgICAgTGF5YS5Qb29sLnJlY292ZXIoaXRlbS5wb29sS2V5LCBpdGVtKTtcbiAgICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgIGNsYXNzIFNjYWxlQnV0dG9uU2NyaXB0IHtcbiBcbiAgICBwdWJsaWMgZGVsYXlUaW1lOiBudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBtaW5TY2FsZTogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIG1vbmtleUJveDogTGF5YS5JbWFnZTtcblxuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICrorr7nva5vd25lcuWHveaVsO+8jOWPr+S7peebtOaOpeiOt+WPluWIsOa3u+WKoOmZhOWKoOiEmuacrOeahOe7hOS7tuWunuS+iyBcbiAgICAgKiovXG4gICAgcHVibGljIHNldCBvd25lcih2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMubW9ua2V5Qm94ID0gdmFsdWU7XG4gICAgICAgIC8v6Ieq5a6a5LmJ55qE6ISa5pys5Lya5pyJ5pe25bqP6Zeu6aKY77yM5omA5Lul5Zyo5q2k5re75Yqg5LiA5Liq5bu25pe2XG4gICAgICAgIHRoaXMubW9ua2V5Qm94LmZyYW1lT25jZSgyLCB0aGlzLCB0aGlzLm9uTG9hZGVkKTtcbiAgICAgICAgXG4gICAgfVxuXG4gICAgb25Mb2FkZWQoKTogdm9pZCB7XG4gICAgICAgLyog6K6+572u5oyJ6ZKu5Li65Y2V5oCB5oyJ6ZKuXG4gICAgICAgICoqIOWPluWAvO+8mlxuICAgICAgICAqKiAx77ya5Y2V5oCB44CC5Zu+54mH5LiN5YGa5YiH5Ymy77yM5oyJ6ZKu55qE55qu6IKk54q25oCB5Y+q5pyJ5LiA56eN44CCXG4gICAgICAgICoqIDLvvJrkuKTmgIHjgILlm77niYflsIbku6Xnq5bnm7TmlrnlkJHooqvnrYnmr5TliIflibLkuLoy6YOo5YiG77yM5LuO5LiK5ZCR5LiL77yM5L6d5qyh5Li65by56LW354q25oCB55qu6IKk44CB5oyJ5LiL5ZKM57uP6L+H5Y+K6YCJ5Lit54q25oCB55qu6IKk44CCXG4gICAgICAgICoqIDPvvJrkuInmgIHjgILlm77niYflsIbku6Xnq5bnm7TmlrnlkJHooqvnrYnmr5TliIflibLkuLoy6YOo5YiG77yM5LuO5LiK5ZCR5LiL77yM5L6d5qyh5Li65by56LW354q25oCB55qu6IKk44CB57uP6L+H54q25oCB55qu6IKk44CB5oyJ5LiL5ZKM6YCJ5Lit54q25oCB55qu6IKkXG4gICAgICAgICovXG4gICAgICAgIC8v5re75Yqg6byg5qCH5oyJ5LiL5LqL5Lu25L6m5ZCs44CC5oyJ5pe25pe257yp5bCP5oyJ6ZKu44CCXG4gICAgICAgIHRoaXMubW9ua2V5Qm94Lm9uKExheWEuRXZlbnQuTU9VU0VfRE9XTiwgdGhpcywgdGhpcy5zY2FsZVNtYWxsKTtcbiAgICAgICAgLy/mt7vliqDpvKDmoIfmiqzotbfkuovku7bkvqblkKzjgILmiqzotbfml7bov5jljp/mjInpkq7jgIJcbiAgICAgICAgdGhpcy5tb25rZXlCb3gub24oTGF5YS5FdmVudC5NT1VTRV9VUCwgdGhpcywgdGhpcy5zY2FsZUJpZyk7XG4gICAgICAgIC8v5re75Yqg6byg5qCH56a75byA5LqL5Lu25L6m5ZCs44CC56a75byA5pe26L+Y5Y6f5oyJ6ZKu44CCXG4gICAgICAgIHRoaXMubW9ua2V5Qm94Lm9uKExheWEuRXZlbnQuTU9VU0VfT1VULCB0aGlzLCB0aGlzLnNjYWxlQmlnKTtcbiAgICB9XG4gICAgXG4gICAgXG4gICAgcHJpdmF0ZSBzY2FsZVNtYWxsKCk6dm9pZHtcbiAgICAgICAgLy/nvKnlsI/oh7MwLjjnmoTnvJPliqjmlYjmnpxcbiAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLm1vbmtleUJveCwge3NjYWxlWDowLjgsIHNjYWxlWTogMC44fSwgMik7XG4gICAgfVxuICAgIHByaXZhdGUgc2NhbGVCaWcoKTp2b2lke1xuICAgICAgICAvL+WPmOWkp+i/mOWOn+eahOe8k+WKqOaViOaenFxuICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMubW9ua2V5Qm94LCB7c2NhbGVYOjEsIHNjYWxlWToxfSwgMik7XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgIGNsYXNzIFV0aWwge1xuICAgIHB1YmxpYyBsb2FkKHJlcywgb25Qcm9ncmVzcz86IExheWEuSGFuZGxlcik6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoc3VjLCBmYWlsKSA9PiB7XG4gICAgICAgICAgICBMYXlhLmxvYWRlci5sb2FkKHJlcywgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCBzdWMpLCBvblByb2dyZXNzKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZS50b1N0cmluZygpKVxuICAgIH1cbiAgICBnZXRJdGVtKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBMYXlhLkxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogVXRpbDtcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJKCk6IFV0aWwge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UgfHwgKHRoaXMuX2luc3RhbmNlID0gbmV3IFV0aWwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGVudW0gRGF0YUtleSB7XG4gICAgY3VyX3JlZF9kYXlfbGltaXQgPSAnY3VyX3JlZF9kYXlfbGltaXQnLFxuICAgIGN1cl9zaGFrZV9kYXlfbGltaXQgPSAnY3VyX3NoYWtlX2RheV9saW1pdCcsXG4gICAgc2hha2VMYXN0VGltZSA9ICdzaGFrZUxhc3RUaW1lJyxcbiAgICBkYXRhQ05UID0gJ2RhdGFDTlQnLFxuICAgIHRvZGF5Q250ID0gJ3RvZGF5Q250JyxcbiAgICBsYXN0VGltZSA9ICdsYXN0VGltZScsXG59Il19