bundle.js 207 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
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":8,"./uitl/ScaleButtonScript":20}],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 ShakeModel_1 = require("./sdk/model/ShakeModel");
var PcSdk_1 = require("./sdk/PcSdk");
var RedpacketModel_1 = require("./sdk/model/RedpacketModel");
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:
                        /**隐藏启动屏 */
                        PcSdk_1.default.I.hideSplash();
                        /**初始化adk 获取app配置信息 */
                        PcSdk_1.default.I.init();
                        /**预加载视频 */
                        AdManager_1.default.I.init();
                        /**获取红包配置 摇一摇 等静态数据 */
                        return [4 /*yield*/, PcSdk_1.default.I.initGameConfig()];
                    case 1:
                        /**获取红包配置 摇一摇 等静态数据 */
                        _a.sent();
                        return [4 /*yield*/, RedpacketModel_1.default.I.init()];
                    case 2:
                        _a.sent();
                        return [4 /*yield*/, ShakeModel_1.default.I.init()];
                    case 3:
                        _a.sent();
                        return [2 /*return*/];
                }
            });
        });
    };
    return Main;
}());
//激活启动类
new Main();

},{"./GameConfig":1,"./sdk/AdManager":7,"./sdk/PcSdk":9,"./sdk/model/RedpacketModel":13,"./sdk/model/ShakeModel":14}],3:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var EventCenter_1 = require("./event/EventCenter");
var EventEnum_1 = require("./event/EventEnum");
var PcSdk_1 = require("./sdk/PcSdk");
/**
 * 主界面  金币金额
 */
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*/, PcSdk_1.default.I.myCoin()];
                    case 1:
                        coin = _a.sent();
                        this.totalCoin = coin;
                        this.coinlab.text = '' + coin;
                        str = '可提现';
                        return [4 /*yield*/, PcSdk_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/PcSdk":9}],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 ShakeModel_1 = require("./sdk/model/ShakeModel");
var RedpacketModel_1 = require("./sdk/model/RedpacketModel");
var PcSdk_1 = require("./sdk/PcSdk");
var NativeAd_1 = require("./sdk/NativeAd");
var TestScene = /** @class */ (function (_super) {
    __extends(TestScene, _super);
    function TestScene() {
        var _this = _super.call(this) || this;
        _this.isLongVibrate = false;
        //关闭多点触控,否则就无敌了
        Laya.MouseManager.multiTouchEnabled = false;
        console.log('---------------TestScene-------');
        return _this;
        // this.NativeAD.visible = false;
    }
    TestScene.prototype.onEnable = function () {
        var _this = this;
        this.btnServer.on(Laya.Event.CLICK, this, this.openServer);
        this.btnVibrate.on(Laya.Event.CLICK, this, function () {
            PcSdk_1.default.I.vibrate(_this.isLongVibrate ? 0 : 1);
            _this.isLongVibrate = !_this.isLongVibrate;
        });
        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);
        this.btnPreVideo.on(Laya.Event.CLICK, this, this.preloadRewardAd);
        this.btnPreFull.on(Laya.Event.CLICK, this, this.preloadFull);
        this.btnPreInsert.on(Laya.Event.CLICK, this, this.preloadInterAd);
        this.btnPreNative.on(Laya.Event.CLICK, this, this.preloadNativeAd);
        this.btnCloseBanner.on(Laya.Event.CLICK, this, this.closeAdBanner);
        this.btnCloseNative.on(Laya.Event.CLICK, this, this.closeAdverDialog);
        this.btnMinWithDrawal.on(Laya.Event.CLICK, this, this.minWithDrawal);
    };
    /**预加载广告 */
    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.preloadBanner()];
                    case 1:
                        _a.sent();
                        return [2 /*return*/];
                }
            });
        });
    };
    TestScene.prototype.preloadRewardAd = function () {
        AdManager_1.default.I.preloadRewardAd();
    };
    TestScene.prototype.preloadFull = function () {
        AdManager_1.default.I.preloadFullAd();
    };
    TestScene.prototype.preloadInterAd = function () {
        AdManager_1.default.I.preloadInterAd();
    };
    TestScene.prototype.preloadNativeAd = function () {
        this.NativeAD.getComponent(NativeAd_1.default).initNativeAd(1);
    };
    TestScene.prototype.closeAdverDialog = function () {
        AdManager_1.default.I.closeAdverDialog();
    };
    TestScene.prototype.closeAdBanner = function () {
        AdManager_1.default.I.closeAdBanner();
    };
    /**显示全屏广告 */
    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 () {
        this.NativeAD.getComponent(NativeAd_1.default).initNativeAd();
    };
    /**插屏广告 */
    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-------');
        PcSdk_1.default.I.feedback();
    };
    TestScene.prototype.openRedpacket = function () {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                RedpacketModel_1.default.I.checkRedpacket();
                return [2 /*return*/];
            });
        });
    };
    TestScene.prototype.minWithDrawal = function () {
        return __awaiter(this, void 0, void 0, function () {
            var money;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, PcSdk_1.default.I.minWithDrawal()];
                    case 1:
                        money = _a.sent();
                        this.minWithDrawalLab.text = '最低提现:' + money;
                        return [2 /*return*/];
                }
            });
        });
    };
    /**打开个人中心 */
    TestScene.prototype.openPersonal = function () {
        console.log('---------------openServer-------');
        PcSdk_1.default.I.personal(0);
    };
    /**邀请好友 */
    TestScene.prototype.invitation = function () {
        PcSdk_1.default.I.invitation();
    };
    /**
     * 1	金币
    2	激励视频后金币
    3	4 5 6 7 游戏中对应的道具
    8	空
     */
    TestScene.prototype.touchShake = function () {
        console.log('---------------touchShake-------');
        PcSdk_1.default.I.vibrate();
        /**
         * 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/NativeAd":8,"./sdk/PcSdk":9,"./sdk/model/RedpacketModel":13,"./sdk/model/ShakeModel":14,"./ui/layaMaxUI":15}],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.preloadBanner = function () {
        TTAdSdk_1.default.I.loadBannerExpressAd(1);
    };
    AdManager.prototype.preloadRewardAd = function () {
        TTAdSdk_1.default.I.showRewardVideoAd(1);
    };
    AdManager.prototype.preloadFullAd = function () {
        TTAdSdk_1.default.I.loadFullScreenVideoAd(1);
    };
    AdManager.prototype.preloadInterAd = function () {
        // TTAdSdk.I.showInteractionExpressAd(1);
    };
    AdManager.prototype.preloadNativeAd = function () {
        TTAdSdk_1.default.I.loadFullScreenVideoAd(1);
    };
    AdManager.prototype.closeAdverDialog = function () {
        TTAdSdk_1.default.I.closeAdverDialog();
    };
    AdManager.prototype.closeAdBanner = function () {
        TTAdSdk_1.default.I.closeAdBanner();
    };
    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.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.showNativeAd = function (x, y, w, h, preload) {
        if (preload === void 0) { preload = 0; }
        TTAdSdk_1.default.I.loadNativeExpressAd(x, y, w, h, preload);
    };
    Object.defineProperty(AdManager, "I", {
        get: function () {
            return ObjectInstance_1.default.get(AdManager);
        },
        enumerable: true,
        configurable: true
    });
    return AdManager;
}());
exports.default = AdManager;

},{"../uitl/ObjectInstance":18,"./TTAdSdk":10}],8:[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.initNativeAd = function (preload) {
        if (preload === void 0) { preload = 0; }
        var globalPoint = this.item.localToGlobal(Laya.Point.EMPTY, true);
        AdManager_1.default.I.showNativeAd(globalPoint.x, globalPoint.y, this.item.width, this.item.height, preload);
    };
    NativeAd.prototype.onEnable = function () {
        this.initNativeAd();
    };
    NativeAd.prototype.onDisable = function () {
        AdManager_1.default.I.closeAdverDialog();
    };
    Object.defineProperty(NativeAd.prototype, "item", {
        get: function () {
            return this.owner;
        },
        enumerable: true,
        configurable: true
    });
    return NativeAd;
}(Laya.Script));
exports.default = NativeAd;

},{"./AdManager":7}],9:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectInstance_1 = require("../uitl/ObjectInstance");
var EventCenter_1 = require("../event/EventCenter");
var EventEnum_1 = require("../event/EventEnum");
var PcSdk = /** @class */ (function () {
    function PcSdk() {
    }
    PcSdk.prototype.init = function () {
        this.getSystemInfo();
    };
    Object.defineProperty(PcSdk.prototype, "myBridge", {
        get: function () {
            if (MyBridge) {
                return MyBridge;
            }
        },
        enumerable: true,
        configurable: true
    });
    /**获取基本版本信息以及手机的配置 */
    PcSdk.prototype.getSystemInfo = function (key) {
        if (key === void 0) { key = 0; }
        var _a;
        var ret = this.myBridge.getSystemInfo(key);
        var _b = JSON.parse(ret), w = _b.w, h = _b.h, versionName = _b.versionName, channel = _b.channel, pangolin = _b.pangolin, adnet = _b.adnet, level = _b.level;
        _a = [w, h, versionName, channel, pangolin, adnet, level], this._width = _a[0], this._height = _a[1], this._version = _a[2], this._channel = _a[3], this.pangolinId = _a[4], this.adnetId = _a[5], this._level = _a[6];
    };
    PcSdk.prototype.initGameConfig = function () {
        this._gameConfig = this.getGameConfig();
    };
    /**
     * 震动
     * @param key 0 短震动 1 长震动
     */
    PcSdk.prototype.vibrate = function (key) {
        if (key === void 0) { key = 0; }
        this.myBridge.openSystemFun(key);
    };
    /**隐藏启动屏 */
    PcSdk.prototype.hideSplash = function () {
        this.myBridge.hideSplash();
    };
    /**弹出提现 */
    PcSdk.prototype.withDrawal = function () {
        this.myBridge.withDrawal();
    };
    /**意见反馈 */
    PcSdk.prototype.feedback = function () {
        this.myBridge.feedback();
    };
    /**
     * key 默认0 ,签到 1
     */
    PcSdk.prototype.personal = function (key) {
        if (key === void 0) { key = 0; }
        this.myBridge.personal(key);
    };
    /**邀请好友*/
    PcSdk.prototype.invitation = function () {
        this.myBridge.invitation();
    };
    /**
     * 获取金币配表
     * @param key 1红包   2 摇一摇红包
     */
    PcSdk.prototype.getGameConfig = function () {
        var result = this.myBridge.getGameConfig();
        // console.log('---------------getGameConfig-------' + JSON.stringify(result))
        return JSON.parse(result);
    };
    /**
     * 要求发放金币
     * @param key 1红包
     */
    PcSdk.prototype.addGold = function (key) {
        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 () {
                        return __generator(this, function (_a) {
                            switch (_a.label) {
                                case 0: return [4 /*yield*/, this.myBridge.addGold(key, function (res) {
                                        res = JSON.parse(res);
                                        var code = res.code, data = res.data, msg = res.msg;
                                        if ('0' === code || !code) {
                                            resolve(data);
                                        }
                                        else {
                                            reject(msg);
                                        }
                                    })];
                                case 1:
                                    _a.sent();
                                    return [2 /*return*/];
                            }
                        });
                    }); })];
            });
        });
    };
    /**获取总金币 */
    PcSdk.prototype.myCoin = 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 () {
                        return __generator(this, function (_a) {
                            switch (_a.label) {
                                case 0: return [4 /*yield*/, this.myBridge.myCoin(function (res) {
                                        res = JSON.parse(res);
                                        var code = res.code, data = res.data, msg = res.msg;
                                        if ('0' === code || !code) {
                                            resolve(data['coin']);
                                        }
                                        else {
                                            reject(msg);
                                        }
                                    })];
                                case 1:
                                    _a.sent();
                                    return [2 /*return*/];
                            }
                        });
                    }); })];
            });
        });
    };
    /**获取当前提现的档位 */
    PcSdk.prototype.minWithDrawal = 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 () {
                        return __generator(this, function (_a) {
                            switch (_a.label) {
                                case 0: return [4 /*yield*/, this.myBridge.minWithDrawal(function (res) {
                                        res = JSON.parse(res);
                                        var code = res.code, data = res.data, msg = res.msg;
                                        if ('0' === code || !code) {
                                            resolve(data['money']);
                                        }
                                        else {
                                            reject(msg);
                                        }
                                    })];
                                case 1:
                                    _a.sent();
                                    return [2 /*return*/];
                            }
                        });
                    }); })];
            });
        });
    };
    /**上报埋点 */
    PcSdk.prototype.appDotLog = function (key, value) {
        this.myBridge.appDotLog(key, value);
    };
    /**热云打点 */
    PcSdk.prototype.appDotTracKing = function (key) {
        this.myBridge.appDotTracKing(key);
    };
    PcSdk.prototype.setCallback = function (funName, pramas) {
        var _this = this;
        console.log('---------------setCallback---- this.myBridge---' + JSON.stringify(this.myBridge));
        return new Promise(function (resolve, reject) {
            _this.myBridge[funName](pramas, function (res) {
                var _a = JSON.parse(res), code = _a.code, data = _a.data;
                if ('0' === code) {
                    resolve(data);
                }
                else {
                    reject(0);
                }
            });
        });
    };
    PcSdk.prototype.closeAdverDialog = function () {
        this.myBridge.closeAdverDialog();
    };
    PcSdk.prototype.closeAdBanner = function () {
        this.myBridge.closeAdBanner();
    };
    /**激励视频 */
    PcSdk.prototype.showRewardVideoAd = function (value, JBCallback) {
        this.myBridge.showRewardVideoAd(value, JBCallback);
    };
    /** 全屏广告*/
    PcSdk.prototype.loadFullScreenVideoAd = function (data, JBCallback) {
        this.myBridge.showRewardVideoAd(data, JBCallback);
    };
    /**信息流广告 */
    PcSdk.prototype.loadNativeExpressAd = function (data, JBCallback) {
        this.myBridge.loadNativeExpressAd(data, JBCallback);
    };
    /**banner */
    PcSdk.prototype.loadBannerExpressAd = function (data, JBCallback) {
        this.myBridge.loadBannerExpressAd(data, JBCallback);
    };
    /**插屏广告 */
    PcSdk.prototype.showInteractionExpressAd = function (data, JBCallback) {
        this.myBridge.showInteractionExpressAd(data, JBCallback);
    };
    Object.defineProperty(PcSdk.prototype, "level", {
        get: function () {
            return this._level;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(PcSdk.prototype, "width", {
        get: function () {
            return this._width;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(PcSdk.prototype, "height", {
        get: function () {
            return this._height;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(PcSdk.prototype, "version", {
        get: function () {
            return this._version;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(PcSdk.prototype, "channel", {
        get: function () {
            return this._channel;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(PcSdk.prototype, "bridge", {
        get: function () {
            return null;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(PcSdk.prototype, "gameConfig", {
        get: function () {
            return this._gameConfig;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(PcSdk, "I", {
        get: function () {
            return ObjectInstance_1.default.get(PcSdk);
        },
        enumerable: true,
        configurable: true
    });
    return PcSdk;
}());
exports.default = PcSdk;
//     //这里是浏览器环境下, 接收web传过来的消息
window.onMyBridgeReady = function () {
    console.log("onMyBridgeReady load finish, cost:" + (new Date().getTime()) + "ms");
    MyBridge.App.onResume = function () {
        var ret = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            ret[_i] = arguments[_i];
        }
        console.log('     laya onResume', ret);
        EventCenter_1.EventCenter.emit(EventEnum_1.EventEnum.APP_SHOW);
    };
    MyBridge.App.onPause = function () {
        var ret = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            ret[_i] = arguments[_i];
        }
        console.log('    laya onPause', ret);
        EventCenter_1.EventCenter.emit(EventEnum_1.EventEnum.APP_HIDE);
    };
};

},{"../event/EventCenter":5,"../event/EventEnum":6,"../uitl/ObjectInstance":18}],10:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectInstance_1 = require("../uitl/ObjectInstance");
var PcSdk_1 = require("./PcSdk");
var TTAdSdk = /** @class */ (function () {
    function TTAdSdk() {
    }
    /**
     *
     * @param preload  0 直接加载;1 预加载
     */
    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 = {
                    type: 1,
                    preloading: preload,
                };
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var isComplete = false;
                        PcSdk_1.default.I.showRewardVideoAd(data, function (ret) {
                            var _a = JSON.parse(ret), code = _a.code, message = _a.message;
                            switch (code) {
                                case -1:
                                    reject('error');
                                    /**'暂无视频广告!每日0点重置'*/ ;
                                    break;
                                case 102:
                                    isComplete = true;
                                    break;
                                case 101:
                                    if (isComplete) {
                                        resolve();
                                    }
                                    else {
                                        reject('unComplete');
                                    }
                                    break;
                            }
                        });
                    })];
            });
        });
    };
    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 = {
                    w: PcSdk_1.default.I.width,
                    h: PcSdk_1.default.I.width * 90 / 600,
                    preloading: preload,
                    type: 1
                };
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        PcSdk_1.default.I.loadFullScreenVideoAd(JSON.stringify(data), function (res) {
                            resolve(res);
                        });
                    })];
            });
        });
    };
    TTAdSdk.prototype.loadNativeExpressAd = function (x, y, width, height, type, preload) {
        if (type === void 0) { type = 1; }
        if (preload === void 0) { preload = 0; }
        return __awaiter(this, void 0, void 0, function () {
            var scaleX, scaleY, data;
            return __generator(this, function (_a) {
                scaleX = PcSdk_1.default.I.width / Laya.stage.width;
                scaleY = PcSdk_1.default.I.height / Laya.stage.height;
                data = {
                    type: type,
                    preloading: preload,
                    w: width * scaleX,
                    h: height * scaleY,
                    left: x * scaleX,
                    top: y * scaleY
                };
                PcSdk_1.default.I.loadNativeExpressAd(JSON.stringify(data), function (res) {
                    return Promise.resolve(res);
                });
                return [2 /*return*/];
            });
        });
    };
    TTAdSdk.prototype.loadBannerExpressAd = 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: PcSdk_1.default.I.width,
                    h: PcSdk_1.default.I.width * 90 / 600,
                    preloading: preload,
                    type: 1
                };
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        PcSdk_1.default.I.loadBannerExpressAd(JSON.stringify(data), function (res) {
                            resolve(res);
                        });
                    })];
            });
        });
    };
    TTAdSdk.prototype.closeAdverDialog = function () {
        PcSdk_1.default.I.closeAdverDialog();
    };
    TTAdSdk.prototype.closeAdBanner = function () {
        PcSdk_1.default.I.closeAdBanner();
    };
    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: PcSdk_1.default.I.width * 0.8,
                    h: PcSdk_1.default.I.height,
                    preloading: preload,
                };
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var isComplete = false;
                        PcSdk_1.default.I.showInteractionExpressAd(JSON.stringify(data), function (res) {
                            resolve(res);
                        });
                    })];
            });
        });
    };
    Object.defineProperty(TTAdSdk, "I", {
        get: function () {
            return ObjectInstance_1.default.get(TTAdSdk);
        },
        enumerable: true,
        configurable: true
    });
    return TTAdSdk;
}());
exports.default = TTAdSdk;

},{"../uitl/ObjectInstance":18,"./PcSdk":9}],11:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectInstance_1 = require("../uitl/ObjectInstance");
var PcSdk_1 = require("./PcSdk");
/**
 * 上报热云埋点⽇志
 * 具体的打点需要跟运营联系
 */
var TrackingSdk = /** @class */ (function () {
    function TrackingSdk() {
    }
    TrackingSdk.prototype.dot = function (key) {
        PcSdk_1.default.I.appDotTracKing(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":18,"./PcSdk":9}],12:[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":16}],13:[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 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 PcSdk_1 = require("../PcSdk");
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*/, this.getRedConfig()];
                    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.getRedConfig = function () {
        return __awaiter(this, void 0, void 0, function () {
            var result, configJson;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        result = PcSdk_1.default.I.gameConfig;
                        console.log('--------------- 获取配置静态表-----' + JSON.stringify(result));
                        if (!result) return [3 /*break*/, 2];
                        return [4 /*yield*/, this.loadGoldCfg(result['coin_config'][0])];
                    case 1:
                        configJson = _a.sent();
                        console.log('-------------- 获取红包静态表-----' + JSON.stringify(result));
                        return [2 /*return*/, configJson];
                    case 2:
                        PcSdk_1.default.I.initGameConfig();
                        _a.label = 3;
                    case 3: return [2 /*return*/];
                }
            });
        });
    };
    RedpacketModel.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*/, this.load(res)];
                    case 1:
                        configJson = _a.sent();
                        return [2 /*return*/, configJson];
                }
            });
        });
    };
    RedpacketModel.prototype.load = function (res, onProgress) {
        var _this = this;
        return new Promise(function (suc, fail) {
            Laya.loader.load(res, Laya.Handler.create(_this, suc), onProgress);
        });
    };
    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();
                        console.log('--------------- 触发了红包-----');
                        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*/, PcSdk_1.default.I.myCoin()];
                    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*/, PcSdk_1.default.I.addGold(key)];
                    case 1:
                        coinData = _a.sent();
                        return [2 /*return*/, coinData['coin']];
                }
            });
        });
    };
    /**获取最低提档 */
    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*/, PcSdk_1.default.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/TrackingSdk":11,"../../uitl/DateUtils":17,"../../uitl/ObjectInstance":18,"../../uitl/Util":21,"../PcSdk":9,"./BaseModel":12}],14:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var BaseModel_1 = require("./BaseModel");
var DateUtils_1 = require("../../uitl/DateUtils");
var Util_1 = require("../../uitl/Util");
var ObjectInstance_1 = require("../../uitl/ObjectInstance");
var PcSdk_1 = require("../PcSdk");
/**
 *
 */
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;
    }
    ShakeModel.prototype.init = function () {
        return __awaiter(this, void 0, void 0, function () {
            var result, gameData;
            return __generator(this, function (_a) {
                result = PcSdk_1.default.I.gameConfig;
                ;
                console.log('---------------ShakeModel-- 获取摇一摇静态表-----' + JSON.stringify(result));
                if (result['config']) {
                    gameData = result['config'];
                    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;
}());

},{"../../uitl/DateUtils":17,"../../uitl/ObjectInstance":18,"../../uitl/Util":21,"../PcSdk":9,"./BaseModel":12}],15:[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 = {}));

},{}],16:[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;

},{}],17:[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;

},{}],18:[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":19}],19:[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;

},{}],20:[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;

},{}],21:[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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL0FwcGxpY2F0aW9ucy9MYXlhQWlySURFLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvYXBwL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvR2FtZUNvbmZpZy50cyIsInNyYy9NYWluLnRzIiwic3JjL1JlZERyYXdhbC50cyIsInNyYy9UZXN0U2NlbmUudHMiLCJzcmMvZXZlbnQvRXZlbnRDZW50ZXIudHMiLCJzcmMvZXZlbnQvRXZlbnRFbnVtLnRzIiwic3JjL3Nkay9BZE1hbmFnZXIudHMiLCJzcmMvc2RrL05hdGl2ZUFkLnRzIiwic3JjL3Nkay9QY1Nkay50cyIsInNyYy9zZGsvVFRBZFNkay50cyIsInNyYy9zZGsvVHJhY2tpbmdTZGsudHMiLCJzcmMvc2RrL21vZGVsL0Jhc2VNb2RlbC50cyIsInNyYy9zZGsvbW9kZWwvUmVkcGFja2V0TW9kZWwudHMiLCJzcmMvc2RrL21vZGVsL1NoYWtlTW9kZWwudHMiLCJzcmMvdWkvbGF5YU1heFVJLnRzIiwic3JjL3VpdGwvQXJyYXlVdGlscy50cyIsInNyYy91aXRsL0RhdGVVdGlscy50cyIsInNyYy91aXRsL09iamVjdEluc3RhbmNlLnRzIiwic3JjL3VpdGwvT2JqZWN0UG9vbC50cyIsInNyYy91aXRsL1NjYWxlQnV0dG9uU2NyaXB0LnRzIiwic3JjL3VpdGwvVXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNWQSxnR0FBZ0c7QUFDaEcseUNBQW1DO0FBQ25DLDhEQUF3RDtBQUN4RCx5Q0FBbUM7QUFDbkMsMkNBQXFDO0FBQ3JDOztFQUVFO0FBQ0Y7SUFhSTtJQUFjLENBQUM7SUFDUixlQUFJLEdBQVg7UUFDSSxJQUFJLEdBQUcsR0FBYSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUM3QyxHQUFHLENBQUMsY0FBYyxFQUFDLG1CQUFTLENBQUMsQ0FBQztRQUM5QixHQUFHLENBQUMsMkJBQTJCLEVBQUMsMkJBQWlCLENBQUMsQ0FBQztRQUNuRCxHQUFHLENBQUMsY0FBYyxFQUFDLG1CQUFTLENBQUMsQ0FBQztRQUM5QixHQUFHLENBQUMsaUJBQWlCLEVBQUMsa0JBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFuQk0sZ0JBQUssR0FBUSxHQUFHLENBQUM7SUFDakIsaUJBQU0sR0FBUSxJQUFJLENBQUM7SUFDbkIsb0JBQVMsR0FBUSxZQUFZLENBQUM7SUFDOUIscUJBQVUsR0FBUSxNQUFNLENBQUM7SUFDekIsaUJBQU0sR0FBUSxLQUFLLENBQUM7SUFDcEIsaUJBQU0sR0FBUSxNQUFNLENBQUM7SUFDckIscUJBQVUsR0FBSyxpQkFBaUIsQ0FBQztJQUNqQyxvQkFBUyxHQUFRLEVBQUUsQ0FBQztJQUNwQixnQkFBSyxHQUFTLEtBQUssQ0FBQztJQUNwQixlQUFJLEdBQVMsS0FBSyxDQUFDO0lBQ25CLHVCQUFZLEdBQVMsS0FBSyxDQUFDO0lBQzNCLDRCQUFpQixHQUFTLElBQUksQ0FBQztJQVMxQyxpQkFBQztDQXJCRCxBQXFCQyxJQUFBO2tCQXJCb0IsVUFBVTtBQXNCL0IsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDOzs7OztBQzlCbEIsMkNBQXNDO0FBQ3RDLDZDQUF3QztBQUN4QyxxREFBZ0Q7QUFDaEQscUNBQWdDO0FBQ2hDLDZEQUF3RDtBQUN4RDtJQUNDO1FBQ0MsZ0JBQWdCO1FBQ2hCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQVUsQ0FBQyxLQUFLLEVBQUUsb0JBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7WUFDbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBVSxDQUFDLEtBQUssRUFBRSxvQkFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsb0JBQVUsQ0FBQyxTQUFTLENBQUM7UUFDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsb0JBQVUsQ0FBQyxVQUFVLENBQUM7UUFDOUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsb0JBQVUsQ0FBQyxNQUFNLENBQUM7UUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsb0JBQVUsQ0FBQyxNQUFNLENBQUM7UUFDdEMsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEdBQUcsb0JBQVUsQ0FBQyxpQkFBaUIsQ0FBQztRQUUxRCxvREFBb0Q7UUFDcEQsSUFBSSxvQkFBVSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNO1lBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDOUYsSUFBSSxvQkFBVSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzRixJQUFJLG9CQUFVLENBQUMsSUFBSTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUU3QixnREFBZ0Q7UUFDaEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3JJLENBQUM7SUFFRCw4QkFBZSxHQUFmO1FBQ0MsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFRCw2QkFBYyxHQUFkO1FBRUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLFlBQVk7UUFDWixvQkFBVSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxZQUFZO0lBQ04sdUJBQVEsR0FBZDs7Ozs7d0JBQ0MsV0FBVzt3QkFDWCxlQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFBO3dCQUNwQixzQkFBc0I7d0JBQ3RCLGVBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ2YsV0FBVzt3QkFDWCxtQkFBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDbkIsc0JBQXNCO3dCQUN0QixxQkFBTSxlQUFLLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxFQUFBOzt3QkFEOUIsc0JBQXNCO3dCQUN0QixTQUE4QixDQUFDO3dCQUcvQixxQkFBTSx3QkFBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBQTs7d0JBQTdCLFNBQTZCLENBQUE7d0JBRXZCLHFCQUFNLG9CQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFBOzt3QkFBekIsU0FBeUIsQ0FBQzs7Ozs7S0FDaEM7SUFDRixXQUFDO0FBQUQsQ0FwREEsQUFvREMsSUFBQTtBQUNELE9BQU87QUFDUCxJQUFJLElBQUksRUFBRSxDQUFDOzs7OztBQzFEWCxtREFBa0Q7QUFDbEQsK0NBQThDO0FBQzlDLHFDQUFnQztBQUNoQzs7R0FFRztBQUNIO0lBQXVDLDZCQUFXO0lBUTlDO1FBQUEsWUFBZ0IsaUJBQU8sU0FBRztRQUZsQixlQUFTLEdBQVcsR0FBRyxDQUFDOztJQUVQLENBQUM7SUFDMUIsMkJBQU8sR0FBUDtRQUNJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQiwrQkFBK0I7SUFDbkMsQ0FBQztJQUNELDRCQUFRLEdBQVI7UUFDSSx5QkFBVyxDQUFDLEdBQUcsQ0FBQyxxQkFBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNELHlCQUFXLENBQUMsR0FBRyxDQUFDLHFCQUFTLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELDZCQUFTLEdBQVQ7UUFDSSx5QkFBVyxDQUFDLE1BQU0sQ0FBQyxxQkFBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlELHlCQUFXLENBQUMsTUFBTSxDQUFDLHFCQUFTLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVLLDhCQUFVLEdBQWhCOzs7Ozs0QkFDZSxxQkFBTSxlQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFBOzt3QkFBN0IsSUFBSSxHQUFHLFNBQXNCO3dCQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzt3QkFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQzt3QkFDMUIsR0FBRyxHQUFHLEtBQUssQ0FBQzt3QkFFQyxxQkFBTyxlQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFBOzt3QkFBM0MsVUFBVSxHQUFHLFNBQThCO3dCQUMvQyxJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFOzRCQUNoQixRQUFRLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7NEJBQzNDLElBQUksUUFBUSxHQUFHLENBQUM7Z0NBQ1osR0FBRyxHQUFHLGlCQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUNBQU8sQ0FBQzt5QkFDdkQ7d0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO3dCQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Ozs7O0tBQzdDO0lBQ0wsZ0JBQUM7QUFBRCxDQXRDQSxBQXNDQyxDQXRDc0MsSUFBSSxDQUFDLE1BQU0sR0FzQ2pEOzs7Ozs7QUM3Q0QsNENBQW9DO0FBQ3BDLDZDQUF3QztBQUN4QyxxREFBZ0Q7QUFDaEQsNkRBQXdEO0FBQ3hELHFDQUFnQztBQUNoQywyQ0FBc0M7QUFHdEM7SUFBdUMsNkJBQWM7SUFFakQ7UUFBQSxZQUNJLGlCQUFPLFNBTVY7UUFSTyxtQkFBYSxHQUFZLEtBQUssQ0FBQztRQUduQyxlQUFlO1FBQ2YsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFBOztRQUM5QyxpQ0FBaUM7SUFFckMsQ0FBQztJQUVELDRCQUFRLEdBQVI7UUFBQSxpQkF5QkM7UUF4QkcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUU7WUFDdkMsZUFBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxLQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsS0FBSSxDQUFDLGFBQWEsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtB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QUFDLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3pELENBQUM7OztPQUFBO0lBQ0wsV0FBQztBQUFELENBakJBLEFBaUJDLElBQUE7O0FBRUQsSUFBWSxPQU9YO0FBUEQsV0FBWSxPQUFPO0lBQ2Ysa0RBQXVDLENBQUE7SUFDdkMsc0RBQTJDLENBQUE7SUFDM0MsMENBQStCLENBQUE7SUFDL0IsOEJBQW1CLENBQUE7SUFDbkIsZ0NBQXFCLENBQUE7SUFDckIsZ0NBQXFCLENBQUE7QUFDekIsQ0FBQyxFQVBXLE9BQU8sR0FBUCxlQUFPLEtBQVAsZUFBTyxRQU9sQiIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcclxuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxuICAgIH07XHJcbn0pKCk7XHJcbihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCIvKipUaGlzIGNsYXNzIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IExheWFBaXJJREUsIHBsZWFzZSBkbyBub3QgbWFrZSBhbnkgbW9kaWZpY2F0aW9ucy4gKi9cclxuaW1wb3J0IFRlc3RTY2VuZSBmcm9tIFwiLi9UZXN0U2NlbmVcIlxuaW1wb3J0IFNjYWxlQnV0dG9uU2NyaXB0IGZyb20gXCIuL3VpdGwvU2NhbGVCdXR0b25TY3JpcHRcIlxuaW1wb3J0IFJlZERyYXdhbCBmcm9tIFwiLi9SZWREcmF3YWxcIlxuaW1wb3J0IE5hdGl2ZUFkIGZyb20gXCIuL3Nkay9OYXRpdmVBZFwiXHJcbi8qXHJcbiog5ri45oiP5Yid5aeL5YyW6YWN572uO1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lQ29uZmlne1xyXG4gICAgc3RhdGljIHdpZHRoOm51bWJlcj03NTA7XHJcbiAgICBzdGF0aWMgaGVpZ2h0Om51bWJlcj0xMzM0O1xyXG4gICAgc3RhdGljIHNjYWxlTW9kZTpzdHJpbmc9XCJmaXhlZHdpZHRoXCI7XHJcbiAgICBzdGF0aWMgc2NyZWVuTW9kZTpzdHJpbmc9XCJub25lXCI7XHJcbiAgICBzdGF0aWMgYWxpZ25WOnN0cmluZz1cInRvcFwiO1xyXG4gICAgc3RhdGljIGFsaWduSDpzdHJpbmc9XCJsZWZ0XCI7XHJcbiAgICBzdGF0aWMgc3RhcnRTY2VuZTphbnk9XCJUZXN0U2NlbmUuc2NlbmVcIjtcclxuICAgIHN0YXRpYyBzY2VuZVJvb3Q6c3RyaW5nPVwiXCI7XHJcbiAgICBzdGF0aWMgZGVidWc6Ym9vbGVhbj1mYWxzZTtcclxuICAgIHN0YXRpYyBzdGF0OmJvb2xlYW49ZmFsc2U7XHJcbiAgICBzdGF0aWMgcGh5c2ljc0RlYnVnOmJvb2xlYW49ZmFsc2U7XHJcbiAgICBzdGF0aWMgZXhwb3J0U2NlbmVUb0pzb246Ym9vbGVhbj10cnVlO1xyXG4gICAgY29uc3RydWN0b3IoKXt9XHJcbiAgICBzdGF0aWMgaW5pdCgpe1xyXG4gICAgICAgIHZhciByZWc6IEZ1bmN0aW9uID0gTGF5YS5DbGFzc1V0aWxzLnJlZ0NsYXNzO1xyXG4gICAgICAgIHJlZyhcIlRlc3RTY2VuZS50c1wiLFRlc3RTY2VuZSk7XG4gICAgICAgIHJlZyhcInVpdGwvU2NhbGVCdXR0b25TY3JpcHQudHNcIixTY2FsZUJ1dHRvblNjcmlwdCk7XG4gICAgICAgIHJlZyhcIlJlZERyYXdhbC50c1wiLFJlZERyYXdhbCk7XG4gICAgICAgIHJlZyhcInNkay9OYXRpdmVBZC50c1wiLE5hdGl2ZUFkKTtcclxuICAgIH1cclxufVxyXG5HYW1lQ29uZmlnLmluaXQoKTsiLCJpbXBvcnQgR2FtZUNvbmZpZyBmcm9tIFwiLi9HYW1lQ29uZmlnXCI7XHJcbmltcG9ydCBBZE1hbmFnZXIgZnJvbSBcIi4vc2RrL0FkTWFuYWdlclwiO1xyXG5pbXBvcnQgU2hha2VNb2RlbCBmcm9tIFwiLi9zZGsvbW9kZWwvU2hha2VNb2RlbFwiO1xyXG5pbXBvcnQgUGNTZGsgZnJvbSBcIi4vc2RrL1BjU2RrXCI7XHJcbmltcG9ydCBSZWRwYWNrZXRNb2RlbCBmcm9tIFwiLi9zZGsvbW9kZWwvUmVkcGFja2V0TW9kZWxcIjtcclxuY2xhc3MgTWFpbiB7XHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblx0XHQvL+agueaNrklEReiuvue9ruWIneWni+WMluW8leaTjlx0XHRcclxuXHRcdGlmICh3aW5kb3dbXCJMYXlhM0RcIl0pIExheWEzRC5pbml0KEdhbWVDb25maWcud2lkdGgsIEdhbWVDb25maWcuaGVpZ2h0KTtcclxuXHRcdGVsc2UgTGF5YS5pbml0KEdhbWVDb25maWcud2lkdGgsIEdhbWVDb25maWcuaGVpZ2h0LCBMYXlhW1wiV2ViR0xcIl0pO1xyXG5cdFx0TGF5YVtcIlBoeXNpY3NcIl0gJiYgTGF5YVtcIlBoeXNpY3NcIl0uZW5hYmxlKCk7XHJcblx0XHRMYXlhW1wiRGVidWdQYW5lbFwiXSAmJiBMYXlhW1wiRGVidWdQYW5lbFwiXS5lbmFibGUoKTtcclxuXHRcdExheWEuc3RhZ2Uuc2NhbGVNb2RlID0gR2FtZUNvbmZpZy5zY2FsZU1vZGU7XHJcblx0XHRMYXlhLnN0YWdlLnNjcmVlbk1vZGUgPSBHYW1lQ29uZmlnLnNjcmVlbk1vZGU7XHJcblx0XHRMYXlhLnN0YWdlLmFsaWduViA9IEdhbWVDb25maWcuYWxpZ25WO1xyXG5cdFx0TGF5YS5zdGFnZS5hbGlnbkggPSBHYW1lQ29uZmlnLmFsaWduSDtcclxuXHRcdC8v5YW85a655b6u5L+h5LiN5pSv5oyB5Yqg6L29c2NlbmXlkI7nvIDlnLrmma9cclxuXHRcdExheWEuVVJMLmV4cG9ydFNjZW5lVG9Kc29uID0gR2FtZUNvbmZpZy5leHBvcnRTY2VuZVRvSnNvbjtcclxuXHJcblx0XHQvL+aJk+W8gOiwg+ivlemdouadv++8iOmAmui/h0lEReiuvue9ruiwg+ivleaooeW8j++8jOaIluiAhXVybOWcsOWdgOWinuWKoGRlYnVnPXRydWXlj4LmlbDvvIzlnYflj6/miZPlvIDosIPor5XpnaLmnb/vvIlcclxuXHRcdGlmIChHYW1lQ29uZmlnLmRlYnVnIHx8IExheWEuVXRpbHMuZ2V0UXVlcnlTdHJpbmcoXCJkZWJ1Z1wiKSA9PSBcInRydWVcIikgTGF5YS5lbmFibGVEZWJ1Z1BhbmVsKCk7XHJcblx0XHRpZiAoR2FtZUNvbmZpZy5waHlzaWNzRGVidWcgJiYgTGF5YVtcIlBoeXNpY3NEZWJ1Z0RyYXdcIl0pIExheWFbXCJQaHlzaWNzRGVidWdEcmF3XCJdLmVuYWJsZSgpO1xyXG5cdFx0aWYgKEdhbWVDb25maWcuc3RhdCkgTGF5YS5TdGF0LnNob3coKTtcclxuXHRcdExheWEuYWxlcnRHbG9iYWxFcnJvciA9IHRydWU7XHJcblxyXG5cdFx0Ly/mv4DmtLvotYTmupDniYjmnKzmjqfliLbvvIx2ZXJzaW9uLmpzb27nlLFJREXlj5HluIPlip/og73oh6rliqjnlJ/miJDvvIzlpoLmnpzmsqHmnInkuZ/kuI3lvbHlk43lkI7nu63mtYHnqItcclxuXHRcdExheWEuUmVzb3VyY2VWZXJzaW9uLmVuYWJsZShcInZlcnNpb24uanNvblwiLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25WZXJzaW9uTG9hZGVkKSwgTGF5YS5SZXNvdXJjZVZlcnNpb24uRklMRU5BTUVfVkVSU0lPTik7XHJcblx0fVxyXG5cclxuXHRvblZlcnNpb25Mb2FkZWQoKTogdm9pZCB7XHJcblx0XHQvL+a/gOa0u+Wkp+Wwj+WbvuaYoOWwhO+8jOWKoOi9veWwj+WbvueahOaXtuWAme+8jOWmguaenOWPkeeOsOWwj+WbvuWcqOWkp+WbvuWQiOmbhumHjOmdou+8jOWImeS8mOWFiOWKoOi9veWkp+WbvuWQiOmbhu+8jOiAjOS4jeaYr+Wwj+WbvlxyXG5cdFx0TGF5YS5BdGxhc0luZm9NYW5hZ2VyLmVuYWJsZShcImZpbGVjb25maWcuanNvblwiLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Db25maWdMb2FkZWQpKTtcclxuXHR9XHJcblxyXG5cdG9uQ29uZmlnTG9hZGVkKCk6IHZvaWQge1xyXG5cclxuXHRcdHRoaXMuaW5pdERhdGEoKTtcclxuXHRcdC8v5Yqg6L29SURF5oyH5a6a55qE5Zy65pmvXHJcblx0XHRHYW1lQ29uZmlnLnN0YXJ0U2NlbmUgJiYgTGF5YS5TY2VuZS5vcGVuKEdhbWVDb25maWcuc3RhcnRTY2VuZSk7XHJcblx0fVxyXG5cclxuXHQvKirliJ3lp4vljJZTREsgKi9cclxuXHRhc3luYyBpbml0RGF0YSgpIHtcclxuXHRcdC8qKumakOiXj+WQr+WKqOWxjyAqL1xyXG5cdFx0UGNTZGsuSS5oaWRlU3BsYXNoKClcclxuXHRcdC8qKuWIneWni+WMlmFkayDojrflj5ZhcHDphY3nva7kv6Hmga8gKi9cclxuXHRcdFBjU2RrLkkuaW5pdCgpO1xyXG5cdFx0Lyoq6aKE5Yqg6L296KeG6aKRICovXHJcblx0XHRBZE1hbmFnZXIuSS5pbml0KCk7XHJcblx0XHQvKirojrflj5bnuqLljIXphY3nva4g5pGH5LiA5pGHIOetiemdmeaAgeaVsOaNriAqL1xyXG5cdFx0YXdhaXQgUGNTZGsuSS5pbml0R2FtZUNvbmZpZygpO1xyXG5cclxuXHJcblx0XHRhd2FpdCBSZWRwYWNrZXRNb2RlbC5JLmluaXQoKVxyXG5cclxuICAgICAgICBhd2FpdCBTaGFrZU1vZGVsLkkuaW5pdCgpO1xyXG5cdH1cclxufVxyXG4vL+a/gOa0u+WQr+WKqOexu1xyXG5uZXcgTWFpbigpO1xyXG4iLCJpbXBvcnQgUmVkcGFja2V0TW9kZWwgZnJvbSBcIi4vc2RrL21vZGVsL1JlZHBhY2tldE1vZGVsXCI7XG5pbXBvcnQgeyBFdmVudENlbnRlciB9IGZyb20gXCIuL2V2ZW50L0V2ZW50Q2VudGVyXCI7XG5pbXBvcnQgeyBFdmVudEVudW0gfSBmcm9tIFwiLi9ldmVudC9FdmVudEVudW1cIjtcbmltcG9ydCBQY1NkayBmcm9tIFwiLi9zZGsvUGNTZGtcIjtcbi8qKlxuICog5Li755WM6Z2iICDph5HluIHph5Hpop1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkRHJhd2FsIGV4dGVuZHMgTGF5YS5TY3JpcHQge1xuICAgIC8qKiBAcHJvcCB7bmFtZTpjb2lubGFiLCB0aXBzOlwi6YeR5biBXCIsIHR5cGU6Tm9kZX0qL1xuICAgIGNvaW5sYWI6IExheWEuTGFiZWw7XG4gICAgLyoqIEBwcm9wIHtuYW1lOnRpcGxhYiwgdGlwczpcIuaPkOekulwiLCB0eXBlOk5vZGV9Ki9cbiAgICB0aXBsYWI6IExheWEuTGFiZWw7XG5cbiAgICBwcml2YXRlIHRvdGFsQ29pbjogbnVtYmVyID0gMTEwO1xuXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cbiAgICBvblN0YXJ0KCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXIoKTtcbiAgICAgICAgLy8gdGhpcy50aXBsYWIudmlzaWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICBvbkVuYWJsZSgpIHtcbiAgICAgICAgRXZlbnRDZW50ZXIuYWRkKEV2ZW50RW51bS5BUFBfU0hPVywgdGhpcywgdGhpcy51cGRhdGVTdGFyKTtcbiAgICAgICAgRXZlbnRDZW50ZXIuYWRkKEV2ZW50RW51bS5VUERBVEVfQ09JTiwgdGhpcywgdGhpcy51cGRhdGVTdGFyKTtcbiAgICB9XG5cbiAgICBvbkRpc2FibGUoKSB7XG4gICAgICAgIEV2ZW50Q2VudGVyLnJlbW92ZShFdmVudEVudW0uQVBQX1NIT1csIHRoaXMsIHRoaXMudXBkYXRlU3Rhcik7XG4gICAgICAgIEV2ZW50Q2VudGVyLnJlbW92ZShFdmVudEVudW0uVVBEQVRFX0NPSU4sIHRoaXMsIHRoaXMudXBkYXRlU3Rhcik7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlU3RhcigpIHtcbiAgICAgICAgbGV0IGNvaW4gPSBhd2FpdCBQY1Nkay5JLm15Q29pbigpO1xuICAgICAgICB0aGlzLnRvdGFsQ29pbiA9IGNvaW47XG4gICAgICAgIHRoaXMuY29pbmxhYi50ZXh0ID0gJycgKyBjb2luO1xuICAgICAgICBsZXQgc3RyID0gJ+WPr+aPkOeOsCc7XG4gICAgICAgIC8qKuabtOaWsOS4i+S4i+S4gOasoeaPkOeOsOeahOmineW6piAqL1xuICAgICAgICBsZXQgbmV4dERyYXdhbCA9IGF3YWl0ICBQY1Nkay5JLm1pbldpdGhEcmF3YWwoKTtcbiAgICAgICAgaWYgKHRoaXMudG90YWxDb2luID4gMCkge1xuICAgICAgICAgICAgbGV0IGxlZnRDb2luID0gbmV4dERyYXdhbCAtIHRoaXMudG90YWxDb2luO1xuICAgICAgICAgICAgaWYgKGxlZnRDb2luID4gMClcbiAgICAgICAgICAgICAgICBzdHIgPSBg6L+Y5beuJHsobGVmdENvaW4gLyAxMDAwMCkudG9GaXhlZCgzKX3ph5Hpop3lj6/mj5DnjrBgO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGlwbGFiLnRleHQgPSBzdHI7XG4gICAgICAgIHRoaXMudGlwbGFiLnZpc2libGUgPSBCb29sZWFuKG5leHREcmF3YWwpO1xuICAgIH1cbn0iLCJpbXBvcnQgeyB1aSB9IGZyb20gXCIuL3VpL2xheWFNYXhVSVwiO1xuaW1wb3J0IEFkTWFuYWdlciBmcm9tIFwiLi9zZGsvQWRNYW5hZ2VyXCI7XG5pbXBvcnQgU2hha2VNb2RlbCBmcm9tIFwiLi9zZGsvbW9kZWwvU2hha2VNb2RlbFwiO1xuaW1wb3J0IFJlZHBhY2tldE1vZGVsIGZyb20gXCIuL3Nkay9tb2RlbC9SZWRwYWNrZXRNb2RlbFwiO1xuaW1wb3J0IFBjU2RrIGZyb20gXCIuL3Nkay9QY1Nka1wiO1xuaW1wb3J0IE5hdGl2ZUFkIGZyb20gXCIuL3Nkay9OYXRpdmVBZFwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4vdWl0bC9VdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3RTY2VuZSBleHRlbmRzIHVpLlRlc3RTY2VuZVVJIHtcbiAgICBwcml2YXRlIGlzTG9uZ1ZpYnJhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLy/lhbPpl63lpJrngrnop6bmjqfvvIzlkKbliJnlsLHml6DmlYzkuoZcbiAgICAgICAgTGF5YS5Nb3VzZU1hbmFnZXIubXVsdGlUb3VjaEVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLVRlc3RTY2VuZS0tLS0tLS0nKVxuICAgICAgICAvLyB0aGlzLk5hdGl2ZUFELnZpc2libGUgPSBmYWxzZTtcblxuICAgIH1cblxuICAgIG9uRW5hYmxlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmJ0blNlcnZlci5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLm9wZW5TZXJ2ZXIpO1xuICAgICAgICB0aGlzLmJ0blZpYnJhdGUub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgKCkgPT4ge1xuICAgICAgICAgICAgUGNTZGsuSS52aWJyYXRlKHRoaXMuaXNMb25nVmlicmF0ZSA/IDAgOiAxKTtcbiAgICAgICAgICAgIHRoaXMuaXNMb25nVmlicmF0ZSA9ICF0aGlzLmlzTG9uZ1ZpYnJhdGU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmJ0bkRyYXdhbC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLm9wZW5QZXJzb25hbCk7XG4gICAgICAgIHRoaXMuYnRuSW52aXRlLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuaW52aXRhdGlvbik7XG4gICAgICAgIHRoaXMuYnRuX3NoYWtlLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMudG91Y2hTaGFrZSk7XG4gICAgICAgIHRoaXMuYnRuUHJlbG9hZEFELm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMucHJlbG9hZEFEKTtcbiAgICAgICAgdGhpcy5idG5TaG93QmFubmVyLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuc2hvd0Jhbm5lcik7XG4gICAgICAgIHRoaXMuYnRuU2hvd0Z1bGxBZC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnNob3dGdWxsQWQpO1xuICAgICAgICB0aGlzLmJ0blNob3dOYXRpdmVBZC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnNob3dOYXRpdmVBZCk7XG4gICAgICAgIHRoaXMuYnRuU2hvd0ludGVyQWQub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5zaG93SW50ZXJBZCk7XG4gICAgICAgIHRoaXMuYnRuUmV3YXJkQWQub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5zaG93UmV3YXJkQWQpO1xuICAgICAgICB0aGlzLmJ0blJlZHBhY2tldC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLm9wZW5SZWRwYWNrZXQpO1xuXG4gICAgICAgIHRoaXMuYnRuUHJlVmlkZW8ub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5wcmVsb2FkUmV3YXJkQWQpO1xuICAgICAgICB0aGlzLmJ0blByZUZ1bGwub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5wcmVsb2FkRnVsbCk7XG4gICAgICAgIHRoaXMuYnRuUHJlSW5zZXJ0Lm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMucHJlbG9hZEludGVyQWQpO1xuICAgICAgICB0aGlzLmJ0blByZU5hdGl2ZS5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnByZWxvYWROYXRpdmVBZCk7XG4gICAgICAgIHRoaXMuYnRuQ2xvc2VCYW5uZXIub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5jbG9zZUFkQmFubmVyKTtcbiAgICAgICAgdGhpcy5idG5DbG9zZU5hdGl2ZS5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLmNsb3NlQWR2ZXJEaWFsb2cpO1xuICAgICAgICB0aGlzLmJ0bk1pbldpdGhEcmF3YWwub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5taW5XaXRoRHJhd2FsKTtcblxuICAgIH1cblxuICAgIC8qKumihOWKoOi9veW5v+WRiiAqL1xuICAgIGFzeW5jIHByZWxvYWRBRCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXByZWxvYWRBRC0tLS0tLS0nKVxuICAgICAgICBhd2FpdCBBZE1hbmFnZXIuSS5wcmVsb2FkQmFubmVyKCk7XG4gICAgfVxuXG4gICAgcHJlbG9hZFJld2FyZEFkKCkge1xuICAgICAgICBBZE1hbmFnZXIuSS5wcmVsb2FkUmV3YXJkQWQoKTtcbiAgICB9XG5cbiAgICBwcmVsb2FkRnVsbCgpIHtcbiAgICAgICAgQWRNYW5hZ2VyLkkucHJlbG9hZEZ1bGxBZCgpO1xuICAgIH1cblxuICAgIHByZWxvYWRJbnRlckFkKCkge1xuICAgICAgICBBZE1hbmFnZXIuSS5wcmVsb2FkSW50ZXJBZCgpO1xuICAgIH1cblxuICAgIHByZWxvYWROYXRpdmVBZCgpIHtcbiAgICAgICAgdGhpcy5OYXRpdmVBRC5nZXRDb21wb25lbnQoTmF0aXZlQWQpLmluaXROYXRpdmVBZCgxKTtcbiAgICB9XG5cbiAgICBjbG9zZUFkdmVyRGlhbG9nKCkge1xuICAgICAgICBBZE1hbmFnZXIuSS5jbG9zZUFkdmVyRGlhbG9nKClcbiAgICB9XG4gICAgY2xvc2VBZEJhbm5lcigpIHtcbiAgICAgICAgQWRNYW5hZ2VyLkkuY2xvc2VBZEJhbm5lcigpXG4gICAgfVxuXG4gICAgLyoq5pi+56S65YWo5bGP5bm/5ZGKICovXG4gICAgc2hvd0Z1bGxBZCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNob3dGdWxsQWQtLS0tLS0tJylcbiAgICAgICAgQWRNYW5hZ2VyLkkuc2hvd0Z1bGxBZCgpO1xuICAgIH1cbiAgICAvKirmmL7npLpiYW5uZXIgKi9cbiAgICBzaG93QmFubmVyKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tc2hvd0Jhbm5lci0tLS0tLS0nKVxuICAgICAgICBBZE1hbmFnZXIuSS5zaG93QmFubmVyKCk7XG4gICAgfVxuXG4gICAgLyoq5L+h5oGv5rWB5bm/5ZGKICovXG4gICAgc2hvd05hdGl2ZUFkKCkge1xuICAgICAgICB0aGlzLk5hdGl2ZUFELmdldENvbXBvbmVudChOYXRpdmVBZCkuaW5pdE5hdGl2ZUFkKCk7XG4gICAgfVxuXG4gICAgLyoq5o+S5bGP5bm/5ZGKICovXG4gICAgc2hvd0ludGVyQWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1zaG93SW50ZXJBZC0tLS0tLS0nKVxuICAgICAgICBBZE1hbmFnZXIuSS5zaG93SW50ZXJBZCgpO1xuICAgIH1cbiAgICAvKirmv4DlirHop4bpopHlub/lkYogKi9cbiAgICBhc3luYyBzaG93UmV3YXJkQWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1zaG93UmV3YXJkQWQtLS0tLS0tJylcbiAgICAgICAgYXdhaXQgQWRNYW5hZ2VyLkkuc2hvd1Jld2FyZEFkKCk7XG4gICAgICAgIC8qKuaIkOWKn+WQjuaJp+ihjOWvueW6lOeahOWlluWKsSAqL1xuICAgIH1cbiAgICAvKirmhI/op4Hlj43ppoggKi9cbiAgICBvcGVuU2VydmVyKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tb3BlblNlcnZlci0tLS0tLS0nKVxuICAgICAgICBQY1Nkay5JLmZlZWRiYWNrKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb3BlblJlZHBhY2tldCgpIHtcbiAgICAgICAgUmVkcGFja2V0TW9kZWwuSS5jaGVja1JlZHBhY2tldCgpXG4gICAgfVxuXG4gICAgYXN5bmMgbWluV2l0aERyYXdhbCgpIHtcbiAgICAgICAgbGV0IG1vbmV5ID0gYXdhaXQgUGNTZGsuSS5taW5XaXRoRHJhd2FsKClcbiAgICAgICAgdGhpcy5taW5XaXRoRHJhd2FsTGFiLnRleHQgPSAn5pyA5L2O5o+Q546wOicgKyBtb25leTtcbiAgICB9XG5cblxuICAgIC8qKuaJk+W8gOS4quS6uuS4reW/gyAqL1xuICAgIG9wZW5QZXJzb25hbCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLW9wZW5TZXJ2ZXItLS0tLS0tJylcbiAgICAgICAgUGNTZGsuSS5wZXJzb25hbCgwKTtcbiAgICB9XG4gICAgLyoq6YKA6K+35aW95Y+LICovXG4gICAgaW52aXRhdGlvbigpIHtcbiAgICAgICAgUGNTZGsuSS5pbnZpdGF0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogMVx06YeR5biBXG4gICAgMlx05r+A5Yqx6KeG6aKR5ZCO6YeR5biBXG4gICAgM1x0NCA1IDYgNyDmuLjmiI/kuK3lr7nlupTnmoTpgZPlhbdcbiAgICA4XHTnqbpcbiAgICAgKi9cbiAgICB0b3VjaFNoYWtlKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tdG91Y2hTaGFrZS0tLS0tLS0nKVxuICAgICAgICBQY1Nkay5JLnZpYnJhdGUoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIDEu5Zue5Y675pif5pifIOmBk+WFtyBcbiAgICAgICAgICogMi7nuqLljIUgICDnm7TmjqXojrflvpfivqbluIHvvJvmiJbogIXnm7TmjqXlvLnmv4DlirHop4bpopHlkI7vvIzojrflvpfivqbluIFcbiAgICAgICAgICogMy7ml6DpgZPlhbdcbiAgICAgICAgICog55u05o6l5bGV4r2w5o+S5bGPXG4gICAgICAgICAqICAqL1xuICAgICAgICBsZXQgZGF0YSA9IFNoYWtlTW9kZWwuSS5nZXRTaGFrZVR5cGUoKTtcbiAgICAgICAgY29uc29sZS5sb2coJ+aRh+S4gOaRh+iOt+WPlue7k+aenO+8micgKyBKU09OLnN0cmluZ2lmeShkYXRhKSlcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG4gICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgIC8qKiAn6LCi6LCi5Y+C5LiO77yM5LiL5qyh5aW96L+Q77yBJyovO1xuICAgICAgICAgICAgICAgIEFkTWFuYWdlci5JLnNob3dJbnRlckFkKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRDb2luKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgdGhpcy53YXRjaEFEQ29pbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcHMoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRQcm9wcyhkYXRhKSB7XG4gICAgICAgIGxldCBib29zdGVyO1xuICAgICAgICBsZXQgcmV3YXJkTnVtID0gZGF0YS5udW07XG4gICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlO1xuICAgICAgICAvKipcbiAgICAgICAgICog5aSE55CG5ri45oiP5Lit55qE6YGT5YW35pi+56S6XG4gICAgICAgICAqL1xuICAgICAgICAvLyBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgLy8gICAgIGNhc2UgNDpcbiAgICAgICAgLy8gICAgICAgICBib29zdGVyID0gQm9vc3RlclR5cGUuUmVtb3ZlO1xuICAgICAgICAvLyAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyAgICAgY2FzZSA2OlxuICAgICAgICAvLyAgICAgICAgIGJvb3N0ZXIgPSBCb29zdGVyVHlwZS5DaGFuZ2U7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIDU6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLlJlZnJlc2g7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIDc6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLlJhbmRSZW1vdmU7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIDM6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLlN0YXI7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gVmlld01hbmFnZXIuSS5vcGVuUG9wd2luKFJlY2VpdmVQcm9wc1BvcHdpbiwgYm9vc3RlciwgcmV3YXJkTnVtKTtcblxuICAgIH1cbiAgICAvKipcbiAgICAgKiDnnIvlub/lkYrojrflvpfnuqLljIVcbiAgICAgKi9cbiAgICBhc3luYyB3YXRjaEFEQ29pbigpIHtcbiAgICAgICAgYXdhaXQgQWRNYW5hZ2VyLkkuc2hvd1Jld2FyZEFkKCk7XG4gICAgICAgIHRoaXMuZ2V0Q29pbigpO1xuICAgIH1cbiAgICAvKirnm7TmjqXojrflvpfnuqLljIUgKi9cbiAgICBnZXRDb2luKCkge1xuICAgICAgICAvL1xi5Yi35paw5oC76YeR5biBXG4gICAgICAgIC8vIEFwcE1hbmFnZXIuSS5yZWRwYWNrZXQuZ2V0UmVwYWNrZXQoKVxuICAgICAgICAvLyBWaWV3TWFuYWdlci5JLm9wZW5Qb3B3aW4oUmVkUGFja2V0UmV3YXJkLCAyKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgRXZlbnRFbnVtIH0gZnJvbSBcIi4vRXZlbnRFbnVtXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGNsYXNzIEV2ZW50Q2VudGVyIHtcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IExheWEuRXZlbnREaXNwYXRjaGVyO1xuICAgIHByaXZhdGUgc3RhdGljIGdldCBJKCk6IExheWEuRXZlbnREaXNwYXRjaGVyIHtcbiAgICAgICAgd2luZG93WydldiddID0gdGhpcy5faW5zdGFuY2U7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZSB8fCAodGhpcy5faW5zdGFuY2UgPSBuZXcgTGF5YS5FdmVudERpc3BhdGNoZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZW1pdChldmVudDogRXZlbnRFbnVtLCAuLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuSS5ldmVudChldmVudC50b1N0cmluZygpLCBhcmdzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFkZCh0eXBlOiBFdmVudEVudW0sIGNhbGxlcjogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24sIGFyZ3M/OiBBcnJheTxhbnk+KSB7XG4gICAgICAgIHRoaXMuSS5vbih0eXBlLnRvU3RyaW5nKCksIGNhbGxlciwgbGlzdGVuZXIsIGFyZ3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlKHR5cGU6IEV2ZW50RW51bSwgY2FsbGVyOiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLkkub2ZmKHR5cGUudG9TdHJpbmcoKSwgY2FsbGVyLCBsaXN0ZW5lcik7XG4gICAgfVxufSIsImV4cG9ydCBlbnVtIEV2ZW50RW51bSB7XG5cblx0Q0hFQ0tfUkVEUEFDS0VUID0gPGFueT4nY2hlY2tfcmVkcGFja2V0Jyxcblx0QVBQX1NIT1cgPSA8YW55PidhcHAuc2hvdycsXG5cdEFQUF9ISURFID0gPGFueT4nYXBwLmhpZGUnLFxuXG5cblx0VVBEQVRFX0NPSU4gPSA8YW55Pid1cGRhdGUuY29pbicsXG5cbn0iLCJpbXBvcnQgVFRBZFNkayBmcm9tIFwiLi9UVEFkU2RrXCI7XHJcbmltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWRNYW5hZ2VyIHtcclxuICAgIHByaXZhdGUgbGFzdFZpZGVvVGltZTogbnVtYmVyO1xyXG5cclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5wcmVsb2FkUmV3YXJkQWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcmVsb2FkQmFubmVyKCkge1xyXG4gICAgICAgIFRUQWRTZGsuSS5sb2FkQmFubmVyRXhwcmVzc0FkKDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByZWxvYWRSZXdhcmRBZCgpIHtcclxuICAgICAgICBUVEFkU2RrLkkuc2hvd1Jld2FyZFZpZGVvQWQoMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJlbG9hZEZ1bGxBZCgpIHtcclxuICAgICAgICBUVEFkU2RrLkkubG9hZEZ1bGxTY3JlZW5WaWRlb0FkKDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByZWxvYWRJbnRlckFkKCkge1xyXG4gICAgICAgIC8vIFRUQWRTZGsuSS5zaG93SW50ZXJhY3Rpb25FeHByZXNzQWQoMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJlbG9hZE5hdGl2ZUFkKCl7XHJcbiAgICAgICAgVFRBZFNkay5JLmxvYWRGdWxsU2NyZWVuVmlkZW9BZCgxKTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZUFkdmVyRGlhbG9nKCkge1xyXG4gICAgICAgIFRUQWRTZGsuSS5jbG9zZUFkdmVyRGlhbG9nKClcclxuICAgIH1cclxuICAgIGNsb3NlQWRCYW5uZXIoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmNsb3NlQWRCYW5uZXIoKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dSZXdhcmRBZCgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmV0ID0gYXdhaXQgVFRBZFNkay5JLnNob3dSZXdhcmRWaWRlb0FkKCk7XHJcbiAgICAgICAgICAgIHRoaXMubGFzdFZpZGVvVGltZSA9IExheWEudGltZXIuY3VyclRpbWVyO1xyXG4gICAgICAgICAgICB0aGlzLnByZWxvYWRSZXdhcmRBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLnByZWxvYWRSZXdhcmRBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhc3luYyBzaG93RnVsbEFkKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCByZXQgPSBhd2FpdCBUVEFkU2RrLkkubG9hZEZ1bGxTY3JlZW5WaWRlb0FkKCk7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZEZ1bGxBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLnByZWxvYWRGdWxsQWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzaG93SW50ZXJBZCgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmV0ID0gYXdhaXQgVFRBZFNkay5JLnNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZCgpO1xyXG4gICAgICAgICAgICB0aGlzLnByZWxvYWRJbnRlckFkKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZEludGVyQWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgY2hlY2tWaWRlb0luQ2QoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdFZpZGVvVGltZSAmJiAoTGF5YS50aW1lci5jdXJyVGltZXIgLSB0aGlzLmxhc3RWaWRlb1RpbWUgPD0gMzAwMDApO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dCYW5uZXIoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmxvYWRCYW5uZXJFeHByZXNzQWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBcclxuICAgIHNob3dOYXRpdmVBZCh4LCB5LCB3LCBoLHByZWxvYWQ9MCkge1xyXG4gICAgICAgIFRUQWRTZGsuSS5sb2FkTmF0aXZlRXhwcmVzc0FkKHgsIHksIHcsIGgscHJlbG9hZCk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBzdGF0aWMgZ2V0IEkoKTogQWRNYW5hZ2VyIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0SW5zdGFuY2UuZ2V0KEFkTWFuYWdlcik7XHJcbiAgICB9XHJcbn1cclxuXHJcbiIsImltcG9ydCBBZE1hbmFnZXIgZnJvbSBcIi4vQWRNYW5hZ2VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5hdGl2ZUFkIGV4dGVuZHMgTGF5YS5TY3JpcHQge1xuXG4gICBwdWJsaWMgaW5pdE5hdGl2ZUFkKHByZWxvYWQ9MCl7XG4gICAgICAgIGxldCBnbG9iYWxQb2ludCA9IHRoaXMuaXRlbS5sb2NhbFRvR2xvYmFsKExheWEuUG9pbnQuRU1QVFksIHRydWUpO1xuICAgICAgICBBZE1hbmFnZXIuSS5zaG93TmF0aXZlQWQoZ2xvYmFsUG9pbnQueCwgZ2xvYmFsUG9pbnQueSwgdGhpcy5pdGVtLndpZHRoLCB0aGlzLml0ZW0uaGVpZ2h0LHByZWxvYWQpO1xuICAgIH1cbiAgICBvbkVuYWJsZSgpOiB2b2lkIHtcbiAgICAgICB0aGlzLmluaXROYXRpdmVBZCgpOyAgIFxuICAgIH1cblxuICAgIG9uRGlzYWJsZSgpOiB2b2lkIHtcbiAgICAgICAgQWRNYW5hZ2VyLkkuY2xvc2VBZHZlckRpYWxvZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGl0ZW0oKTogTGF5YS5WaWV3IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3duZXIgYXMgYW55O1xuICAgIH1cbn0iLCJpbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcbmltcG9ydCB7IEV2ZW50Q2VudGVyIH0gZnJvbSBcIi4uL2V2ZW50L0V2ZW50Q2VudGVyXCI7XG5pbXBvcnQgeyBFdmVudEVudW0gfSBmcm9tIFwiLi4vZXZlbnQvRXZlbnRFbnVtXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBjU2RrIHtcbiAgICBwcml2YXRlIF93aWR0aDogbnVtYmVyO1xuICAgIHByaXZhdGUgX2hlaWdodDogbnVtYmVyO1xuICAgIHByaXZhdGUgX2NoYW5uZWw6IHN0cmluZztcbiAgICBwcml2YXRlIF92ZXJzaW9uOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfbGV2ZWw6IG51bWJlcjtcbiAgICBwcml2YXRlIF9nYW1lQ29uZmlnOiBudW1iZXI7XG5cbiAgICBwdWJsaWMgcGFuZ29saW5JZDogc3RyaW5nO1xuICAgIHB1YmxpYyBhZG5ldElkOiBzdHJpbmc7XG5cbiAgICBpbml0KCkge1xuICAgICAgICB0aGlzLmdldFN5c3RlbUluZm8oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBteUJyaWRnZSgpIHtcbiAgICAgICAgaWYgKE15QnJpZGdlKSB7XG4gICAgICAgICAgICByZXR1cm4gTXlCcmlkZ2U7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG4gICAgLyoq6I635Y+W5Z+65pys54mI5pys5L+h5oGv5Lul5Y+K5omL5py655qE6YWN572uICovXG4gICAgcHJpdmF0ZSBnZXRTeXN0ZW1JbmZvKGtleTogbnVtYmVyID0gMCkge1xuICAgICAgICBsZXQgcmV0ID0gdGhpcy5teUJyaWRnZS5nZXRTeXN0ZW1JbmZvKGtleSk7XG4gICAgICAgIGxldCB7IHcsIGgsIHZlcnNpb25OYW1lLCBjaGFubmVsLCBwYW5nb2xpbiwgYWRuZXQsIGxldmVsIH0gPSBKU09OLnBhcnNlKHJldCk7XG4gICAgICAgIFt0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0LCB0aGlzLl92ZXJzaW9uLFxuICAgICAgICB0aGlzLl9jaGFubmVsLCB0aGlzLnBhbmdvbGluSWQsXG4gICAgICAgIHRoaXMuYWRuZXRJZCwgdGhpcy5fbGV2ZWxdID0gW3csIGgsIHZlcnNpb25OYW1lLCBjaGFubmVsLCBwYW5nb2xpbiwgYWRuZXQsIGxldmVsXTtcbiAgICB9XG5cbiAgICBpbml0R2FtZUNvbmZpZygpIHtcbiAgICAgICAgdGhpcy5fZ2FtZUNvbmZpZyA9IHRoaXMuZ2V0R2FtZUNvbmZpZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmch+WKqFxuICAgICAqIEBwYXJhbSBrZXkgMCDnn63pnIfliqggMSDplb/pnIfliqhcbiAgICAgKi9cbiAgICB2aWJyYXRlKGtleTogbnVtYmVyID0gMCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLm9wZW5TeXN0ZW1GdW4oa2V5KTtcbiAgICB9XG5cbiAgICAvKirpmpDol4/lkK/liqjlsY8gKi9cbiAgICBoaWRlU3BsYXNoKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmhpZGVTcGxhc2goKTtcbiAgICB9XG5cbiAgICAvKirlvLnlh7rmj5DnjrAgKi9cbiAgICB3aXRoRHJhd2FsKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLndpdGhEcmF3YWwoKTtcbiAgICB9XG4gICAgLyoq5oSP6KeB5Y+N6aaIICovXG4gICAgZmVlZGJhY2soKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuZmVlZGJhY2soKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICoga2V5IOm7mOiupDAg77yM562+5YiwIDFcbiAgICAgKi9cbiAgICBwZXJzb25hbChrZXkgPSAwKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UucGVyc29uYWwoa2V5KTtcbiAgICB9XG4gICAgLyoq6YKA6K+35aW95Y+LKi9cbiAgICBpbnZpdGF0aW9uKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmludml0YXRpb24oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog6I635Y+W6YeR5biB6YWN6KGoXG4gICAgICogQHBhcmFtIGtleSAx57qi5YyFICAgMiDmkYfkuIDmkYfnuqLljIVcbiAgICAgKi9cbiAgICBnZXRHYW1lQ29uZmlnKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5teUJyaWRnZS5nZXRHYW1lQ29uZmlnKCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1nZXRHYW1lQ29uZmlnLS0tLS0tLScgKyBKU09OLnN0cmluZ2lmeShyZXN1bHQpKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDopoHmsYLlj5HmlL7ph5HluIFcbiAgICAgKiBAcGFyYW0ga2V5IDHnuqLljIVcbiAgICAgKi9cbiAgICBhc3luYyBhZGRHb2xkKGtleSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55Pihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm15QnJpZGdlLmFkZEdvbGQoa2V5LCByZXMgPT4ge1xuICAgICAgICAgICAgICAgIHJlcyA9IEpTT04ucGFyc2UocmVzKVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgY29kZSwgZGF0YSwgbXNnIH0gPSByZXM7XG4gICAgICAgICAgICAgICAgaWYgKCcwJyA9PT0gY29kZSB8fCAhY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgfVxuICAgIC8qKuiOt+WPluaAu+mHkeW4gSAqL1xuICAgIGFzeW5jIG15Q29pbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5teUJyaWRnZS5teUNvaW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICByZXMgPSBKU09OLnBhcnNlKHJlcylcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNvZGUsIGRhdGEsIG1zZyB9ID0gcmVzO1xuICAgICAgICAgICAgICAgIGlmICgnMCcgPT09IGNvZGUgfHwgIWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhWydjb2luJ10pXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgfVxuXG5cbiAgICAvKirojrflj5blvZPliY3mj5DnjrDnmoTmoaPkvY0gKi9cbiAgICBhc3luYyBtaW5XaXRoRHJhd2FsKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55Pihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm15QnJpZGdlLm1pbldpdGhEcmF3YWwocmVzID0+IHtcbiAgICAgICAgICAgICAgICByZXMgPSBKU09OLnBhcnNlKHJlcylcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNvZGUsIGRhdGEsIG1zZyB9ID0gcmVzO1xuICAgICAgICAgICAgICAgIGlmICgnMCcgPT09IGNvZGUgfHwgIWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhWydtb25leSddKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChtc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKuS4iuaKpeWfi+eCuSAqL1xuICAgIGFwcERvdExvZyhrZXk6IHN0cmluZywgdmFsdWU/KSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuYXBwRG90TG9nKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICAvKirng63kupHmiZPngrkgKi9cbiAgICBhcHBEb3RUcmFjS2luZyhrZXk6IHN0cmluZykge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmFwcERvdFRyYWNLaW5nKGtleSk7XG4gICAgfVxuXG4gICAgc2V0Q2FsbGJhY2soZnVuTmFtZTogc3RyaW5nLCBwcmFtYXM/OiBhbnkpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNldENhbGxiYWNrLS0tLSB0aGlzLm15QnJpZGdlLS0tJyArIEpTT04uc3RyaW5naWZ5KHRoaXMubXlCcmlkZ2UpKVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5teUJyaWRnZVtmdW5OYW1lXShwcmFtYXMsIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHsgY29kZSwgZGF0YSB9ID0gSlNPTi5wYXJzZShyZXMpO1xuICAgICAgICAgICAgICAgIGlmICgnMCcgPT09IGNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBjbG9zZUFkdmVyRGlhbG9nKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmNsb3NlQWR2ZXJEaWFsb2coKTtcbiAgICB9XG4gICAgY2xvc2VBZEJhbm5lcigpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5jbG9zZUFkQmFubmVyKCk7XG4gICAgfVxuICAgIC8qKua/gOWKseinhumikSAqL1xuICAgIHNob3dSZXdhcmRWaWRlb0FkKHZhbHVlOiBJVmlkZW8sIEpCQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uuc2hvd1Jld2FyZFZpZGVvQWQodmFsdWUsIEpCQ2FsbGJhY2spXG4gICAgfVxuICAgIC8qKiDlhajlsY/lub/lkYoqL1xuICAgIGxvYWRGdWxsU2NyZWVuVmlkZW9BZChkYXRhOiBhbnksIEpCQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uuc2hvd1Jld2FyZFZpZGVvQWQoZGF0YSwgSkJDYWxsYmFjaylcbiAgICB9XG4gICAgLyoq5L+h5oGv5rWB5bm/5ZGKICovXG4gICAgbG9hZE5hdGl2ZUV4cHJlc3NBZChkYXRhOiBhbnksIEpCQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UubG9hZE5hdGl2ZUV4cHJlc3NBZChkYXRhLCBKQkNhbGxiYWNrKVxuICAgIH1cbiAgICAvKipiYW5uZXIgKi9cbiAgICBsb2FkQmFubmVyRXhwcmVzc0FkKGRhdGE6IGFueSwgSkJDYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5sb2FkQmFubmVyRXhwcmVzc0FkKGRhdGEsIEpCQ2FsbGJhY2spXG4gICAgfVxuICAgIC8qKuaPkuWxj+W5v+WRiiAqL1xuICAgIHNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZChkYXRhOiBhbnksIEpCQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uuc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKGRhdGEsIEpCQ2FsbGJhY2spXG4gICAgfVxuXG4gICAgZ2V0IGxldmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XG4gICAgfVxuICAgIGdldCB3aWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xuICAgIH1cblxuICAgIGdldCBoZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gICAgfVxuXG4gICAgZ2V0IHZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xuICAgIH1cblxuICAgIGdldCBjaGFubmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hhbm5lbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IGJyaWRnZSgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGdhbWVDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nYW1lQ29uZmlnO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IEkoKTogUGNTZGsge1xuICAgICAgICByZXR1cm4gT2JqZWN0SW5zdGFuY2UuZ2V0KFBjU2RrKTtcbiAgICB9XG59XG4vLyAgICAgLy/ov5nph4zmmK/mtY/op4jlmajnjq/looPkuIvvvIwg5o6l5pS2d2Vi5Lyg6L+H5p2l55qE5raI5oGvXG53aW5kb3cub25NeUJyaWRnZVJlYWR5ID0gKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwib25NeUJyaWRnZVJlYWR5IGxvYWQgZmluaXNoLCBjb3N0OlwiICsgKG5ldyBEYXRlKCkuZ2V0VGltZSgpKSArIFwibXNcIik7XG4gICAgTXlCcmlkZ2UuQXBwLm9uUmVzdW1lID0gKC4uLnJldCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnICAgICBsYXlhIG9uUmVzdW1lJywgcmV0KVxuICAgICAgICBFdmVudENlbnRlci5lbWl0KEV2ZW50RW51bS5BUFBfU0hPVyk7XG4gICAgfVxuICAgIE15QnJpZGdlLkFwcC5vblBhdXNlID0gKC4uLnJldCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnICAgIGxheWEgb25QYXVzZScsIHJldClcbiAgICAgICAgRXZlbnRDZW50ZXIuZW1pdChFdmVudEVudW0uQVBQX0hJREUpO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIElWaWRlbyB7XG4gICAgcHJlbG9hZGluZzogbnVtYmVyLFxuICAgIHR5cGU6IG51bWJlcixcbn0iLCJpbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcclxuaW1wb3J0IFBjU2RrIGZyb20gXCIuL1BjU2RrXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUVEFkU2RrIHtcclxuICAgIC8qKlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gcHJlbG9hZCAgMCDnm7TmjqXliqDovb3vvJsxIOmihOWKoOi9vVxyXG4gICAgICovXHJcbiAgICBhc3luYyBzaG93UmV3YXJkVmlkZW9BZChwcmVsb2FkOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IDEsXHJcbiAgICAgICAgICAgIHByZWxvYWRpbmc6IHByZWxvYWQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpc0NvbXBsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIFBjU2RrLkkuc2hvd1Jld2FyZFZpZGVvQWQoZGF0YSwgcmV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB7IGNvZGUsIG1lc3NhZ2UgfSA9IEpTT04ucGFyc2UocmV0KTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgLTE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgnZXJyb3InKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAvKion5pqC5peg6KeG6aKR5bm/5ZGK77yB5q+P5pelMOeCuemHjee9ricqLztcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGxldGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGxldGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgndW5Db21wbGV0ZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEZ1bGxTY3JlZW5WaWRlb0FkKHByZWxvYWQ6IG51bWJlciA9IDApIHtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgdzogUGNTZGsuSS53aWR0aCxcclxuICAgICAgICAgICAgaDogUGNTZGsuSS53aWR0aCAqIDkwIC8gNjAwLFxyXG4gICAgICAgICAgICBwcmVsb2FkaW5nOiBwcmVsb2FkLFxyXG4gICAgICAgICAgICB0eXBlOiAxXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIFBjU2RrLkkubG9hZEZ1bGxTY3JlZW5WaWRlb0FkKEpTT04uc3RyaW5naWZ5KGRhdGEpLHJlcz0+e1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkTmF0aXZlRXhwcmVzc0FkKHgsIHksIHdpZHRoLCBoZWlnaHQsIHR5cGUgPSAxLCBwcmVsb2FkOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgbGV0IHNjYWxlWCA9IFBjU2RrLkkud2lkdGggLyBMYXlhLnN0YWdlLndpZHRoO1xyXG4gICAgICAgIGxldCBzY2FsZVkgPSBQY1Nkay5JLmhlaWdodCAvIExheWEuc3RhZ2UuaGVpZ2h0O1xyXG4gICAgICAgIGxldCBkYXRhID0ge1xyXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxyXG4gICAgICAgICAgICBwcmVsb2FkaW5nOiBwcmVsb2FkLFxyXG4gICAgICAgICAgICB3OiB3aWR0aCAqIHNjYWxlWCxcclxuICAgICAgICAgICAgaDogaGVpZ2h0ICogc2NhbGVZLFxyXG4gICAgICAgICAgICBsZWZ0OiB4ICogc2NhbGVYLFxyXG4gICAgICAgICAgICB0b3A6IHkgKiBzY2FsZVlcclxuICAgICAgICB9XHJcbiAgICAgICAgUGNTZGsuSS5sb2FkTmF0aXZlRXhwcmVzc0FkKEpTT04uc3RyaW5naWZ5KGRhdGEpLHJlcz0+e1xyXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXMpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkQmFubmVyRXhwcmVzc0FkKHByZWxvYWQ6IG51bWJlciA9IDApIHtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgdzogUGNTZGsuSS53aWR0aCxcclxuICAgICAgICAgICAgaDogUGNTZGsuSS53aWR0aCAqIDkwIC8gNjAwLFxyXG4gICAgICAgICAgICBwcmVsb2FkaW5nOiBwcmVsb2FkLFxyXG4gICAgICAgICAgICB0eXBlOiAxXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIFBjU2RrLkkubG9hZEJhbm5lckV4cHJlc3NBZChKU09OLnN0cmluZ2lmeShkYXRhKSxyZXM9PntcclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2VBZHZlckRpYWxvZygpIHtcclxuICAgICAgICBQY1Nkay5JLmNsb3NlQWR2ZXJEaWFsb2coKTtcclxuICAgIH1cclxuICAgIGNsb3NlQWRCYW5uZXIoKSB7XHJcbiAgICAgICAgUGNTZGsuSS5jbG9zZUFkQmFubmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKHByZWxvYWQ6IG51bWJlciA9IDApIHtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgdzogUGNTZGsuSS53aWR0aCAqIDAuOCxcclxuICAgICAgICAgICAgaDogUGNTZGsuSS5oZWlnaHQsXHJcbiAgICAgICAgICAgIHByZWxvYWRpbmc6IHByZWxvYWQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpc0NvbXBsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIFBjU2RrLkkuc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKEpTT04uc3RyaW5naWZ5KGRhdGEpLHJlcz0+e1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IEkoKTogVFRBZFNkayB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdEluc3RhbmNlLmdldChUVEFkU2RrKSBhcyBUVEFkU2RrO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IE9iamVjdEluc3RhbmNlIGZyb20gXCIuLi91aXRsL09iamVjdEluc3RhbmNlXCI7XHJcbmltcG9ydCBQY1NkayBmcm9tIFwiLi9QY1Nka1wiO1xyXG4vKipcclxuICog5LiK5oql54Ot5LqR5Z+L54K54r2H5b+XXHJcbiAqIOWFt+S9k+eahOaJk+eCuemcgOimgei3n+i/kOiQpeiBlOezu1xyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHJhY2tpbmdTZGsge1xyXG4gICAgZG90KGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgUGNTZGsuSS5hcHBEb3RUcmFjS2luZyhrZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgSSgpOiBUcmFja2luZ1NkayB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdEluc3RhbmNlLmdldChUcmFja2luZ1NkaykgYXMgVHJhY2tpbmdTZGs7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFRyYWNraW5nS2V5IHtcclxuICAgIFJlZFBhY2sxID0gJ2V2ZW50XzUnLFxyXG4gICAgUmVkUGFjazUgPSAnZXZlbnRfNidcclxufVxyXG4iLCJpbXBvcnQgQXJyYXlVdGlscyBmcm9tIFwiLi4vLi4vdWl0bC9BcnJheVV0aWxzXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZU1vZGVsIHtcbiAgICBwcm90ZWN0ZWQgX2RhdGE6IGFueSA9IHt9O1xuICAgIHByaXZhdGUgdXBkYXRlQXJyOiBBcnJheTxGdW5jdGlvbj4gPSBbXTtcbiAgICBwcml2YXRlIGtleVVwZGF0ZUFycjogYW55ID0ge307XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKGRhdGE6IGFueSkge1xuICAgICAgICB0aGlzLl9kYXRhID0ge1xuICAgICAgICAgICAgLi4udGhpcy5fZGF0YSxcbiAgICAgICAgICAgIC4uLmRhdGFcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUFyci5mb3JFYWNoKGZ1bmMgPT4ge1xuICAgICAgICAgICAgZnVuYyh0aGlzLl9kYXRhKTtcbiAgICAgICAgfSlcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMua2V5VXBkYXRlQXJyKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBkYXRhW2tleV07XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBhcnIgPSB0aGlzLmtleVVwZGF0ZUFycltrZXldO1xuICAgICAgICAgICAgICAgIGFyciAmJiBhcnIuZm9yRWFjaChmdW5jID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZnVuYyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3YWl0Rm9yKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5fZGF0YVtrZXldO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNiID0gZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZVcGRhdGUoY2IsIGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vblVwZGF0ZShjYiwga2V5LCB0cnVlKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgb25VcGRhdGUoZnVuYzogRnVuY3Rpb24sIGtleT86IHN0cmluZywgcnVuOiBib29sZWFuID0gdHJ1ZSkge1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLl9kYXRhW2tleV07XG4gICAgICAgICAgICBydW4gJiYgdmFsdWUgIT0gbnVsbCAmJiBmdW5jKHZhbHVlKTtcbiAgICAgICAgICAgIGxldCBhcnIgPSB0aGlzLmtleVVwZGF0ZUFycltrZXldO1xuICAgICAgICAgICAgIWFyciAmJiAodGhpcy5rZXlVcGRhdGVBcnJba2V5XSA9IGFyciA9IFtdKTtcbiAgICAgICAgICAgIGFyci5wdXNoKGZ1bmMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcnVuICYmIGZ1bmModGhpcy5fZGF0YSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFyci5wdXNoKGZ1bmMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9mZlVwZGF0ZShmdW5jOiBGdW5jdGlvbiwga2V5Pzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIEFycmF5VXRpbHMucmVtb3ZlRnJvbUFycih0aGlzLmtleVVwZGF0ZUFycltrZXldLCBmdW5jKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEFycmF5VXRpbHMucmVtb3ZlRnJvbUFycih0aGlzLnVwZGF0ZUFyciwgZnVuYyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJHYW1lKCkge1xuICAgICAgICB0aGlzLl9kYXRhID0ge307XG4gICAgfVxufSIsImltcG9ydCBCYXNlTW9kZWwgZnJvbSBcIi4vQmFzZU1vZGVsXCI7XG5pbXBvcnQgQWRNYW5hZ2VyIGZyb20gXCIuLi8uLi9zZGsvQWRNYW5hZ2VyXCI7XG5pbXBvcnQgVGVhU2RrLCB7IERvdEtleSB9IGZyb20gXCIuLi8uLi9zZGsvVGVhU2RrXCI7XG5pbXBvcnQgVHJhY2tpbmdTZGssIHsgVHJhY2tpbmdLZXkgfSBmcm9tIFwiLi4vLi4vc2RrL1RyYWNraW5nU2RrXCI7XG5pbXBvcnQgRGF0ZVV0aWxzIGZyb20gXCIuLi8uLi91aXRsL0RhdGVVdGlsc1wiO1xuaW1wb3J0IFV0aWwsIHsgRGF0YUtleSB9IGZyb20gXCIuLi8uLi91aXRsL1V0aWxcIjtcbmltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xuaW1wb3J0IHsgRXZlbnRDZW50ZXIgfSBmcm9tIFwiLi4vLi4vZXZlbnQvRXZlbnRDZW50ZXJcIjtcbmltcG9ydCB7IEV2ZW50RW51bSB9IGZyb20gXCIuLi8uLi9ldmVudC9FdmVudEVudW1cIjtcbmltcG9ydCBQY1NkayBmcm9tIFwiLi4vUGNTZGtcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkcGFja2V0TW9kZWwgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAgIHByaXZhdGUgTUFYID0gMjA7XG4gICAgLyoq5b2T5aSp6aKG5Y+W57qi5YyF55qE5pyA5aSn5qyh5pWwICovXG4gICAgcHJpdmF0ZSBEQVlfTUFYX0NOVCA9IDUwO1xuICAgIHByaXZhdGUgY29uZjogYW55O1xuICAgIHB1YmxpYyBjdXJSZWRwYWNrZXQ6IG51bWJlciA9IDA7XG4gICAgcHVibGljIGNvbmZMZW46IG51bWJlciA9IDA7XG5cbiAgICAvKirliJ3lp4vljJbnuqLljIXphY3nva4gKi9cbiAgICBhc3luYyBpbml0KCkge1xuXG4gICAgICAgIGxldCBhcnIgPSBhd2FpdCB0aGlzLmdldFJlZENvbmZpZygpO1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tUmVkcGFja2V0TW9kZWwtLS0tLS0tJyArIEpTT04uc3RyaW5naWZ5KGFycikpXG4gICAgICAgIGxldCBjYXNoID0gMDtcbiAgICAgICAgdGhpcy5jb25mID0ge307XG4gICAgICAgIGFyci5mb3JFYWNoKGNvbmZEYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29uZltjb25mRGF0YS5pZF0gPSBjb25mRGF0YTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGUodGhpcy5pbml0RGF0YSgpKTtcbiAgICAgICAgdGhpcy5jb25mTGVuID0gdGhpcy5jb25mLmxlbmd0aDtcblxuICAgIH1cblxuXG5cbiAgICBpbml0RGF0YSgpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgUmVkcGFja2V0RGF0YTtcbiAgICAgICAgbGV0IGxhc3RUaW1lID0gVXRpbC5JLmdldEl0ZW0oRGF0YUtleS5sYXN0VGltZSkgfHwgJzAnO1xuICAgICAgICBkYXRhLmxhc3RUaW1lID0gcGFyc2VJbnQobGFzdFRpbWUpO1xuXG4gICAgICAgIGxldCBsYXN0ID0gRGF0ZVV0aWxzLnRpbWVEYXkoZGF0YS5sYXN0VGltZSk7XG4gICAgICAgIGxldCB0b2RheSA9IERhdGVVdGlscy50b2RheTtcbiAgICAgICAgaWYgKGxhc3QgIT0gdG9kYXkpIHtcbiAgICAgICAgICAgIGRhdGEudG9kYXlDbnQgPSAwO1xuICAgICAgICAgICAgbGFzdFRpbWUgPSBEYXRlVXRpbHMubm93VGltZS50b1N0cmluZygpO1xuICAgICAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS5sYXN0VGltZSwgbGFzdFRpbWUpXG4gICAgICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5LnRvZGF5Q250LCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCB0b2RheUNudCA9IFV0aWwuSS5nZXRJdGVtKERhdGFLZXkudG9kYXlDbnQpIHx8ICcwJztcbiAgICAgICAgICAgIGRhdGEudG9kYXlDbnQgPSBwYXJzZUludCh0b2RheUNudCk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YS5sYXN0VGltZSA9IHBhcnNlSW50KGxhc3RUaW1lKTtcbiAgICAgICAgbGV0IGRhdGFDbnQgPSBVdGlsLkkuZ2V0SXRlbShEYXRhS2V5LmRhdGFDTlQpIHx8ICcwJztcbiAgICAgICAgZGF0YS5jbnQgPSBwYXJzZUludChkYXRhQ250KTtcbiAgICAgICAgZGF0YS5saXN0ID0gW107XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuXG4gICAgYXN5bmMgZ2V0UmVkQ29uZmlnKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gUGNTZGsuSS5nYW1lQ29uZmlnO1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tIOiOt+WPlumFjee9rumdmeaAgeihqC0tLS0tJyArIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpXG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGxldCBjb25maWdKc29uID0gYXdhaXQgdGhpcy5sb2FkR29sZENmZyhyZXN1bHRbJ2NvaW5fY29uZmlnJ11bMF0pXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0g6I635Y+W57qi5YyF6Z2Z5oCB6KGoLS0tLS0nICsgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSlcbiAgICAgICAgICAgIHJldHVybiBjb25maWdKc29uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgUGNTZGsuSS5pbml0R2FtZUNvbmZpZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGxvYWRHb2xkQ2ZnKHJlczogc3RyaW5nKSB7XG4gICAgICAgIGxldCBjb25maWdKc29uID0gYXdhaXQgdGhpcy5sb2FkKHJlcyk7XG4gICAgICAgIHJldHVybiBjb25maWdKc29uO1xuICAgIH1cblxuICAgIGxvYWQocmVzLCBvblByb2dyZXNzPzogTGF5YS5IYW5kbGVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChzdWMsIGZhaWwpID0+IHtcbiAgICAgICAgICAgIExheWEubG9hZGVyLmxvYWQocmVzLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHN1YyksIG9uUHJvZ3Jlc3MpO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIGFzeW5jIGNoZWNrUmVkcGFja2V0KCkge1xuXG4gICAgICAgIGlmICh0aGlzLmRhdGEudG9kYXlDbnQgPj0gdGhpcy5EQVlfTUFYX0NOVCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoQWRNYW5hZ2VyLkkuY2hlY2tWaWRlb0luQ2QoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvKirnuqLljIXojrflj5blkI7msqHmnInnnIvlub/lkYrpooblj5bvvIzlho3mrKHojrflvpfnuqLljIXnmoTmnLrkvJrvvIzkuI3kvJrojrflj5bnuqLljIXvvIwg6Ieq5bex5Lmf5Y+v5Lul5aSE55CG5oiQIOWvueW6lOeahOe6ouWMheaPkOmGkuaIluS4jemcgOimgei/memHjOeahOWIpOaWrSAqL1xuICAgICAgICBpZiAodGhpcy5jdXJSZWRwYWNrZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5kZWZpbmVkID09PSB0aGlzLmRhdGEuY250KSB0aGlzLmRhdGEuY250ID0gMDtcbiAgICAgICAgbGV0IGNudCA9IHRoaXMuZGF0YS5jbnQ7XG4gICAgICAgIGlmIChjbnQgPj0gdGhpcy5jb25mTGVuKSBjbnQgPSB0aGlzLmNvbmZMZW4gLSAxO1xuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuY29uZltjbnQgKyAxXTtcbiAgICAgICAgbGV0IHJhbjIgPSBNYXRoLnJhbmRvbSgpO1xuXG4gICAgICAgIGlmIChkYXRhICYmIHJhbjIgPCBkYXRhLnBlcikge1xuICAgICAgICAgICAgbGV0IGNhc2ggPSAwLjAwMDAwMTtcbiAgICAgICAgICAgIHRoaXMuY3VyUmVkcGFja2V0ID0gY2FzaDtcbiAgICAgICAgICAgIC8vKirlvLnlh7rnuqLljIXnmoTnlYzpnaIsICDmmoLml7blpITnkIbmiJAg55u05o6l55yL5bm/5ZGK6I635Y+W6YeR5biBICovXG4gICAgICAgICAgICBhd2FpdCBBZE1hbmFnZXIuSS5zaG93UmV3YXJkQWQoKVxuICAgICAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLSDop6blj5HkuobnuqLljIUtLS0tLScpXG4gICAgICAgICAgICB0aGlzLmdldFJlcGFja2V0KClcbiAgICAgICAgICAgIC8qKuabtOaWsOWfuuacrOaYvuekuiAqL1xuICAgICAgICAgICAgRXZlbnRDZW50ZXIuZW1pdChFdmVudEVudW0uVVBEQVRFX0NPSU4pO1xuXG4gICAgICAgICAgICAvKioqICovXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0UmVwYWNrZXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5jdXJSZWRwYWNrZXQpIHJldHVybjtcbiAgICAgICAgdGhpcy5kYXRhLmNudCArPSAxO1xuICAgICAgICB0aGlzLmRhdGEubGlzdC5wdXNoKHRoaXMuY3VyUmVkcGFja2V0KTtcbiAgICAgICAgdGhpcy5kYXRhLmxhc3RUaW1lID0gKG5ldyBEYXRlKS5nZXRUaW1lKCk7XG4gICAgICAgIHRoaXMuZGF0YS50b2RheUNudCArPSAxO1xuICAgICAgICBpZiAodGhpcy5kYXRhLmNudCA9PSAxKVxuICAgICAgICAgICAgVHJhY2tpbmdTZGsuSS5kb3QoVHJhY2tpbmdLZXkuUmVkUGFjazEpO1xuICAgICAgICBpZiAodGhpcy5kYXRhLmNudCA9PSA1KVxuICAgICAgICAgICAgVHJhY2tpbmdTZGsuSS5kb3QoVHJhY2tpbmdLZXkuUmVkUGFjazUpO1xuICAgICAgICB0aGlzLmN1clJlZHBhY2tldCA9IDA7XG4gICAgICAgIFV0aWwuSS5zZXRJdGVtKERhdGFLZXkuZGF0YUNOVCwgdGhpcy5kYXRhLmNudCk7XG4gICAgICAgIFV0aWwuSS5zZXRJdGVtKERhdGFLZXkudG9kYXlDbnQsIHRoaXMuZGF0YS50b2RheUNudCk7XG5cbiAgICAgICAgdGhpcy51cGRhdGUodGhpcy5kYXRhKTtcbiAgICB9XG5cbiAgICAvKiogKi9cbiAgICBhc3luYyBnZXRDdXJSZWRwYWNrZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1clJlZHBhY2tldDtcbiAgICB9XG5cbiAgICBnZXQgZGF0YSgpOiBSZWRwYWNrZXREYXRhIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuICAgIC8qKuiOt+WPluaAu+WFseeahOmHkeW4geaVsCAqL1xuICAgIGFzeW5jIGdldFRvdGFsQ29pbigpIHtcbiAgICAgICAgbGV0IHRvdGFsQ29pbiA9IGF3YWl0IFBjU2RrLkkubXlDb2luKCk7XG4gICAgICAgIHJldHVybiB0b3RhbENvaW47XG4gICAgfVxuICAgIC8qKuiOt+WPluacrOasoeWlluWKseeahOmHkeW4geaVsCAqL1xuICAgIGFzeW5jIGFkZENvaW4oa2V5OiBudW1iZXIgPSAxKSB7XG4gICAgICAgIGxldCBjb2luRGF0YSA9IGF3YWl0IFBjU2RrLkkuYWRkR29sZChrZXkpO1xuICAgICAgICByZXR1cm4gY29pbkRhdGFbJ2NvaW4nXTtcbiAgICB9XG5cbiAgICAvKirojrflj5bmnIDkvY7mj5DmoaMgKi9cbiAgICBhc3luYyAgbWluV2l0aERyYXdhbCgpIHtcbiAgICAgICAgbGV0IG1pbkNvaW4gPSBhd2FpdCBQY1Nkay5JLm1pbldpdGhEcmF3YWwoKTtcbiAgICAgICAgcmV0dXJuIG1pbkNvaW47XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgSSgpOiBSZWRwYWNrZXRNb2RlbCB7XG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoUmVkcGFja2V0TW9kZWwpIGFzIFJlZHBhY2tldE1vZGVsO1xuICAgIH1cbn1cblxuY2xhc3MgUmVkcGFja2V0RGF0YSB7XG4gICAgY250OiBudW1iZXI7XG4gICAgbGlzdDogQXJyYXk8bnVtYmVyPjtcbiAgICBsYXN0VGltZTogbnVtYmVyO1xuICAgIHRvZGF5Q250OiBudW1iZXI7XG59XG5cbmNsYXNzIFJlZHBhY2tldENvbmZpZ0RhdGEge1xuICAgIGlkOiBudW1iZXI7XG4gICAgcGVyOiBudW1iZXI7XG4gICAgY2FzaDogbnVtYmVyO1xufSIsImltcG9ydCBCYXNlTW9kZWwgZnJvbSBcIi4vQmFzZU1vZGVsXCI7XG5pbXBvcnQgRGF0ZVV0aWxzIGZyb20gXCIuLi8uLi91aXRsL0RhdGVVdGlsc1wiO1xuaW1wb3J0IFV0aWwsIHsgRGF0YUtleSB9IGZyb20gXCIuLi8uLi91aXRsL1V0aWxcIjtcbmltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xuaW1wb3J0IFBjU2RrIGZyb20gXCIuLi9QY1Nka1wiO1xuXG4vKipcbiAqIFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGFrZU1vZGVsIGV4dGVuZHMgQmFzZU1vZGVsIHtcblxuICAgIHByaXZhdGUgY29uZjogYW55O1xuICAgIHByaXZhdGUgZWxlUHJvYmFiaWxpdHlBcnI6IG51bWJlcltdID0gW107XG4gICAgcHJpdmF0ZSB0b3RhbFdlaWdodDogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIHByb0FyckxlbjogbnVtYmVyID0gMDtcbiAgICAvKirnuqLljIXlh7rnjrDnmoTmgLvmrKHmlbDmr4/ml6UgKi9cbiAgICBwcml2YXRlIHJlZF9kYXlfbGltaXQ6IG51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBjdXJfcmVkX2RheV9saW1pdDogbnVtYmVyID0gMDtcbiAgICAvKirmkYfkuIDmkYflh7rnjrDnmoTmgLvmrKHmlbAgKi9cbiAgICBwcml2YXRlIHNoYWtlX2RheV9saW1pdDogbnVtYmVyID0gMDtcblxuICAgIHByaXZhdGUgY3VyX3NoYWtlX2RheV9saW1pdDogbnVtYmVyID0gMDtcblxuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBQY1Nkay5JLmdhbWVDb25maWc7O1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tU2hha2VNb2RlbC0tIOiOt+WPluaRh+S4gOaRh+mdmeaAgeihqC0tLS0tJyArIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpXG4gICAgICAgIGlmIChyZXN1bHRbJ2NvbmZpZyddKSB7XG4gICAgICAgICAgICBsZXQgZ2FtZURhdGEgPSByZXN1bHRbJ2NvbmZpZyddO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUodGhpcy5pbml0RGF0YShnYW1lRGF0YSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdERhdGEoZ2FtZURhdGEpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgU2hha2VEYXRhO1xuICAgICAgICBsZXQgbGFzdFRpbWUgPSBVdGlsLkkuZ2V0SXRlbShEYXRhS2V5LnNoYWtlTGFzdFRpbWUpIHx8ICcwJztcbiAgICAgICAgbGV0IGx0ID0gcGFyc2VJbnQobGFzdFRpbWUpO1xuICAgICAgICBsZXQgbGFzdCA9IERhdGVVdGlscy50aW1lRGF5KGx0KTtcbiAgICAgICAgbGV0IHRvZGF5ID0gRGF0ZVV0aWxzLnRvZGF5O1xuXG4gICAgICAgIGlmIChsYXN0ICE9IHRvZGF5KSB7XG4gICAgICAgICAgICB0aGlzLmN1cl9zaGFrZV9kYXlfbGltaXQgPSAwO1xuICAgICAgICAgICAgdGhpcy5jdXJfcmVkX2RheV9saW1pdCA9IDA7XG4gICAgICAgICAgICBsYXN0VGltZSA9IERhdGVVdGlscy5ub3dUaW1lLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5LmN1cl9zaGFrZV9kYXlfbGltaXQsIDApO1xuICAgICAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS5jdXJfcmVkX2RheV9saW1pdCwgMCk7XG4gICAgICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5LnNoYWtlTGFzdFRpbWUsIGxhc3RUaW1lKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGN1cl9yZWRfZGF5X2xpbWl0ID0gVXRpbC5JLmdldEl0ZW0oRGF0YUtleS5jdXJfcmVkX2RheV9saW1pdCkgfHwgJzAnO1xuICAgICAgICAgICAgdGhpcy5jdXJfcmVkX2RheV9saW1pdCA9IHBhcnNlSW50KGN1cl9yZWRfZGF5X2xpbWl0KTtcbiAgICAgICAgICAgIGxldCBjdXJfc2hha2VfZGF5X2xpbWl0ID0gVXRpbC5JLmdldEl0ZW0oRGF0YUtleS5jdXJfc2hha2VfZGF5X2xpbWl0KSB8fCAnMCc7XG4gICAgICAgICAgICB0aGlzLmN1cl9zaGFrZV9kYXlfbGltaXQgPSBwYXJzZUludChjdXJfc2hha2VfZGF5X2xpbWl0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEuY29uZmlnID0gZ2FtZURhdGFbJ2NvbmZpZyddO1xuICAgICAgICBnYW1lRGF0YVsnc2hha2UnXS5mb3JFYWNoKGVsZSA9PiB7XG4gICAgICAgICAgICBkYXRhLnNoYWtlV2VpZ2h0TGlzdC5wdXNoKGVsZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbmYgPSBbXTtcbiAgICAgICAgdGhpcy5jb25mID0gZGF0YS5zaGFrZVdlaWdodExpc3Q7XG4gICAgICAgIHRoaXMuaW5pdFByb2JhYmlsaXR5KCk7XG4gICAgICAgIHRoaXMuc2hha2VfZGF5X2xpbWl0ID0gZGF0YS5jb25maWcuc2hha2VfZGF5X2xpbWl0O1xuICAgICAgICB0aGlzLnJlZF9kYXlfbGltaXQgPSBkYXRhLmNvbmZpZy5yZWRfZGF5X2xpbWl0O1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBpbml0UHJvYmFiaWxpdHkoKSB7XG4gICAgICAgIHRoaXMudG90YWxXZWlnaHQgPSAwO1xuICAgICAgICB0aGlzLmNvbmYuZm9yRWFjaCgoZWxlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50b3RhbFdlaWdodCArPSBlbGUud2VpZ2h0O1xuICAgICAgICAgICAgbGV0IGl0ZW1XID0gZWxlLndlaWdodDtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IDApXG4gICAgICAgICAgICAgICAgaXRlbVcgKz0gdGhpcy5lbGVQcm9iYWJpbGl0eUFycltpbmRleCAtIDFdO1xuICAgICAgICAgICAgdGhpcy5lbGVQcm9iYWJpbGl0eUFyciA9IFsuLi50aGlzLmVsZVByb2JhYmlsaXR5QXJyLCBpdGVtV107XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMucHJvQXJyTGVuID0gdGhpcy5lbGVQcm9iYWJpbGl0eUFyci5sZW5ndGg7XG5cbiAgICB9XG5cbiAgICBnZXRTaGFrZVR5cGUoKSB7XG4gICAgICAgICsrdGhpcy5jdXJfc2hha2VfZGF5X2xpbWl0O1xuICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5LmN1cl9zaGFrZV9kYXlfbGltaXQsIHRoaXMuY3VyX3NoYWtlX2RheV9saW1pdCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VyX3NoYWtlX2RheV9saW1pdCA+IHRoaXMuc2hha2VfZGF5X2xpbWl0KSB7XG4gICAgICAgICAgICAvKion5qyh5pWw6L6+5Yiw5LiK6ZmQ77yM6K+35piO5aSp5YaN5p2lKi9cblxuICAgICAgICAgICAgLyoq5Zyo5q2k5aSE5Y+v5Lul5by55qGG562J5aSE55CGICovXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJhbiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMudG90YWxXZWlnaHQpO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5wcm9BcnJMZW47IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IHRoaXMuZWxlUHJvYmFiaWxpdHlBcnJbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGVsZSA+PSByYW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gaW5kZXggfHwgMSA9PT0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmN1cl9yZWRfZGF5X2xpbWl0O1xuICAgICAgICAgICAgICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5LmN1cl9yZWRfZGF5X2xpbWl0LCB0aGlzLmN1cl9yZWRfZGF5X2xpbWl0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3JlZF9kYXlfbGltaXQgPiB0aGlzLnJlZF9kYXlfbGltaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZbdGhpcy5wcm9BcnJMZW4gLSAxXTtcblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZbaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZbdGhpcy5wcm9BcnJMZW4gLSAxXTtcbiAgICB9XG5cbiAgICBnZXQgZGF0YSgpOiBTaGFrZURhdGEge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IEkoKTogU2hha2VNb2RlbCB7XG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoU2hha2VNb2RlbCkgYXMgU2hha2VNb2RlbDtcbiAgICB9XG59XG5cblxuY2xhc3MgU2hha2VEYXRhIHtcbiAgICBjb25maWc6IFNoYWtlQ29uZmlnO1xuICAgIHNoYWtlV2VpZ2h0TGlzdDogU2hha2VXZWlnaHREYXRhW10gPSBbXTtcbn1cbmludGVyZmFjZSBTaGFrZUNvbmZpZyB7XG4gICAgcmVkX2RheV9saW1pdDogbnVtYmVyLFxuICAgIHNoYWtlX2RheV9saW1pdDogbnVtYmVyLFxuICAgIGludGVyc3RpdGlhbF9jbnQ6IG51bWJlcixcbiAgICBpbnRlcnN0aXRpYWxfZGVsYXk6IG51bWJlclxufVxuXG5pbnRlcmZhY2UgU2hha2VXZWlnaHREYXRhIHtcbiAgICBpZDogbnVtYmVyO1xuICAgIHR5cGU6IG51bWJlcjtcbiAgICB3ZWlnaHQ6IG51bWJlcjtcbiAgICBudW06IG51bWJlcjtcbn1cblxuXG4iLCIvKipUaGlzIGNsYXNzIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IExheWFBaXJJREUsIHBsZWFzZSBkbyBub3QgbWFrZSBhbnkgbW9kaWZpY2F0aW9ucy4gKi9cbmltcG9ydCBWaWV3PUxheWEuVmlldztcclxuaW1wb3J0IERpYWxvZz1MYXlhLkRpYWxvZztcclxuaW1wb3J0IFNjZW5lPUxheWEuU2NlbmU7XG52YXIgUkVHOiBGdW5jdGlvbiA9IExheWEuQ2xhc3NVdGlscy5yZWdDbGFzcztcbmV4cG9ydCBtb2R1bGUgdWkge1xyXG4gICAgZXhwb3J0IGNsYXNzIFRlc3RTY2VuZVVJIGV4dGVuZHMgU2NlbmUge1xyXG5cdFx0cHVibGljIGJ0bkludml0ZTpMYXlhLlNwcml0ZTtcblx0XHRwdWJsaWMgYnRuU2VydmVyOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5WaWJyYXRlOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5fc2hha2U6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0bkRyYXdhbDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuUHJlbG9hZEFEOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5TaG93QmFubmVyOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5TaG93RnVsbEFkOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5TaG93TmF0aXZlQWQ6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0blNob3dJbnRlckFkOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5SZXdhcmRBZDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuUmVkcGFja2V0OkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5QcmVOYXRpdmU6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0blByZUZ1bGw6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0blByZUluc2VydDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuUHJlVmlkZW86TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0bkNsb3NlTmF0aXZlOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5DbG9zZUJhbm5lcjpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuTWluV2l0aERyYXdhbDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgbWluV2l0aERyYXdhbExhYjpMYXlhLkxhYmVsO1xuXHRcdHB1YmxpYyBOYXRpdmVBRDpWaWV3O1xuICAgICAgICBjb25zdHJ1Y3RvcigpeyBzdXBlcigpfVxyXG4gICAgICAgIGNyZWF0ZUNoaWxkcmVuKCk6dm9pZCB7XHJcbiAgICAgICAgICAgIHN1cGVyLmNyZWF0ZUNoaWxkcmVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZFNjZW5lKFwiVGVzdFNjZW5lXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFJFRyhcInVpLlRlc3RTY2VuZVVJXCIsVGVzdFNjZW5lVUkpO1xyXG59XHIiLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBBcnJheVV0aWxzIHtcbiAgICAvKipcbiAgICAgKiDnp7vpmaTlhYPntKBcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVtb3ZlRnJvbUFycihhcnI6IEFycmF5PGFueT4sIG9iajogYW55KSB7XG4gICAgICAgIGxldCBpbmRleCA9IGFyci5pbmRleE9mKG9iaik7XG4gICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIHN0YXRpYyByYW5kb21Gcm9tQXJyKGFycjogQXJyYXk8YW55Pikge1xuICAgICAgICBsZXQgaW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhcnIubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGFycltpbmRleF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5pWw57uE6ZqP5py65o6S5bqPXG4gICAgICovXG4gICAgc3RhdGljIHNodWZmbGUoYXJyOiBBcnJheTxhbnk+KSB7XG4gICAgICAgIHJldHVybiBhcnIuc29ydChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yYW5kb20oKSAtIDAuNTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGluZGV4T2YoYXJyLCBjYWxsYmFjaywgY3R4Pykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmNhbGwoY3R4LCB0aGlzW2ldLCBpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgc3RhdGljIGVhY2goYXJyLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBhcnIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjay5jYWxsKGNvbnRleHQsIGFycltpXSwgaSwgYXJyKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBxdWV1ZShhcnIpIHtcbiAgICAgICAgbGV0IHJlcyA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IHByb21pc2Ugb2YgYXJyKSB7XG4gICAgICAgICAgICByZXMgPSBhd2FpdCBwcm9taXNlKHJlcylcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgcmVzO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRSYW5kb21BcnJheShhcnIsIGNvdW50KSB7XG4gICAgICAgIGxldCBzaHVmZmxlZCA9IGFyci5zbGljZSgwKTtcbiAgICAgICAgbGV0IGxlbiA9IGFyci5sZW5ndGg7XG4gICAgICAgIGxldCBtaW4gPSBsZW4gLSBjb3VudCwgdGVtcCwgaW5kZXg7XG4gICAgICAgIHdoaWxlIChsZW4tLSA+IG1pbikge1xuICAgICAgICAgICAgaW5kZXggPSBNYXRoLmZsb29yKChsZW4gKyAxKSAqIE1hdGgucmFuZG9tKCkpO1xuICAgICAgICAgICAgdGVtcCA9IHNodWZmbGVkW2luZGV4XTtcbiAgICAgICAgICAgIHNodWZmbGVkW2luZGV4XSA9IHNodWZmbGVkW2xlbl07XG4gICAgICAgICAgICBzaHVmZmxlZFtsZW5dID0gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2h1ZmZsZWQuc2xpY2UobWluKTtcbiAgICB9XG59IiwiLyoqXG4gKiDml6XmnJ/lt6XlhbfnsbtcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGF0ZVV0aWxzIHtcbiAgICBzdGF0aWMgZ2V0IG5vdygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLm5vd1RpbWUgLyAxMDAwKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IG5vd1RpbWUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgdG9kYXkoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHRpbWUgPSBuZXcgRGF0ZSh0aGlzLm5vd1RpbWUpO1xuICAgICAgICBsZXQgeWVhciA9IHRpbWUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgbGV0IG1vbnRoID0gdGltZS5nZXRNb250aCgpICsgMTtcbiAgICAgICAgbGV0IGRhdGUgPSB0aW1lLmdldERhdGUoKTtcbiAgICAgICAgcmV0dXJuIGAke3llYXJ9LSR7dGhpcy5hZGQobW9udGgpfS0ke3RoaXMuYWRkKGRhdGUpfWA7XG4gICAgfVxuXG4gICAgc3RhdGljIHRpbWVEYXkodGltZU51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHRpbWUgPSBuZXcgRGF0ZSh0aW1lTnVtKTtcbiAgICAgICAgbGV0IHllYXIgPSB0aW1lLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGxldCBtb250aCA9IHRpbWUuZ2V0TW9udGgoKSArIDE7XG4gICAgICAgIGxldCBkYXRlID0gdGltZS5nZXREYXRlKCk7XG4gICAgICAgIHJldHVybiBgJHt5ZWFyfS0ke3RoaXMuYWRkKG1vbnRoKX0tJHt0aGlzLmFkZChkYXRlKX1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOagueaNruenkuaVsOagvOW8j+WMluWtl+espuS4slxuICAgICAqIEBwYXJhbSBzZWNvbmQg56eS5pWwXG4gICAgICogQHBhcmFtIHR5cGUgMTowMDowMDowMCAgIDI6eXl5eS1tbS1kZCBoOm06cyAgICAzOjAwOjAwICAgNDp4eOWkqeWJje+8jHh45bCP5pe25YmN77yMeHjliIbpkp/liY1cbiAgICAgKiBAcmV0dXJuXG4gICAgICovXG4gICAgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kKHNlY29uZDogbnVtYmVyLCB0eXBlOiBudW1iZXIgPSAxKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRGb3JtYXRCeVNlY29uZDAoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLmdldEZvcm1hdEJ5U2Vjb25kMShzZWNvbmQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuZ2V0Rm9ybWF0QnlTZWNvbmQyKHNlY29uZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRGb3JtYXRCeVNlY29uZDMoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLmdldEZvcm1hdEJ5U2Vjb25kNChzZWNvbmQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuZ2V0Rm9ybWF0QnlTZWNvbmQ1KHNlY29uZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICAvLyAwOiAwMDowMFxuICAgIHByaXZhdGUgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kMCh0OiBudW1iZXIgPSAwKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIG1pbnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKHQgLyA2MCk7XG4gICAgICAgIHZhciBzZWNvbmR0OiBudW1iZXIgPSBNYXRoLmZsb29yKHQgJSA2MCk7XG4gICAgICAgIHZhciBtaW5zOiBzdHJpbmc7XG4gICAgICAgIHZhciBzZW5zOiBzdHJpbmc7XG4gICAgICAgIGlmIChtaW5zdCA9PSAwKSB7XG4gICAgICAgICAgICBtaW5zID0gXCIwMFwiO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbnN0IDwgMTApIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIjBcIiArIG1pbnN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWlucyA9IFwiXCIgKyBtaW5zdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICBzZW5zID0gXCIwMFwiO1xuICAgICAgICB9IGVsc2UgaWYgKHNlY29uZHQgPCAxMCkge1xuICAgICAgICAgICAgc2VucyA9IFwiMFwiICsgc2Vjb25kdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIlwiICsgc2Vjb25kdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWlucyArIFwiOlwiICsgc2VucztcbiAgICB9XG5cbiAgICAvLzE6IDAwOjAwOjAwXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0QnlTZWNvbmQxKHQ6IG51bWJlciA9IDApOiBzdHJpbmcge1xuICAgICAgICBsZXQgaG91cnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKHQgLyAzNjAwKTtcbiAgICAgICAgbGV0IGhvdXJzOiBzdHJpbmc7XG4gICAgICAgIGxldCBkYXkgPSAnJztcbiAgICAgICAgaWYgKGhvdXJzdCA9PSAwKSB7XG4gICAgICAgICAgICBob3VycyA9IFwiMDBcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChob3Vyc3QgPCAxMClcbiAgICAgICAgICAgICAgICBob3VycyA9IFwiMFwiICsgaG91cnN0O1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGggPSBob3Vyc3QgJSAyNDtcbiAgICAgICAgICAgICAgICBpZiAoaG91cnN0ID49IDI0KSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXJzID0gaCA8IDEwID8gXCIwXCIgKyBoIDogJycgKyBoO1xuICAgICAgICAgICAgICAgICAgICBkYXkgPSBNYXRoLmZsb29yKGhvdXJzdCAvIDI0KSArICdkICc7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGhvdXJzID0gaCA8IDEwID8gXCIwXCIgKyBoIDogJycgKyBoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBtaW5zdDogbnVtYmVyID0gTWF0aC5mbG9vcigodCAtIGhvdXJzdCAqIDM2MDApIC8gNjApO1xuICAgICAgICBsZXQgc2Vjb25kdDogbnVtYmVyID0gTWF0aC5mbG9vcigodCAtIGhvdXJzdCAqIDM2MDApICUgNjApO1xuICAgICAgICBsZXQgbWluczogc3RyaW5nO1xuICAgICAgICBsZXQgc2Vuczogc3RyaW5nO1xuICAgICAgICBpZiAobWluc3QgPT0gMCkge1xuICAgICAgICAgICAgbWlucyA9IFwiMDBcIjtcbiAgICAgICAgfSBlbHNlIGlmIChtaW5zdCA8IDEwKSB7XG4gICAgICAgICAgICBtaW5zID0gXCIwXCIgKyBtaW5zdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIlwiICsgbWluc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlY29uZHQgPT0gMCkge1xuICAgICAgICAgICAgc2VucyA9IFwiMDBcIjtcbiAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIjBcIiArIHNlY29uZHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZW5zID0gXCJcIiArIHNlY29uZHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRheSArIGhvdXJzICsgXCI6XCIgKyBtaW5zICsgXCI6XCIgKyBzZW5zO1xuICAgIH1cblxuICAgIC8vMzogMDA6MDBcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRGb3JtYXRCeVNlY29uZDModDogbnVtYmVyID0gMCk6IHN0cmluZyB7XG4gICAgICAgIHZhciBob3Vyc3Q6IG51bWJlciA9IE1hdGguZmxvb3IodCAvIDM2MDApO1xuICAgICAgICB2YXIgbWluc3Q6IG51bWJlciA9IE1hdGguZmxvb3IoKHQgLSBob3Vyc3QgKiAzNjAwKSAvIDYwKTtcbiAgICAgICAgdmFyIHNlY29uZHQ6IG51bWJlciA9IE1hdGguZmxvb3IoKHQgLSBob3Vyc3QgKiAzNjAwKSAlIDYwKTtcbiAgICAgICAgdmFyIG1pbnM6IHN0cmluZztcbiAgICAgICAgdmFyIHNlbnM6IHN0cmluZztcbiAgICAgICAgaWYgKG1pbnN0ID09IDApIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobWluc3QgPCAxMCkge1xuICAgICAgICAgICAgbWlucyA9IFwiMFwiICsgbWluc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtaW5zID0gXCJcIiArIG1pbnN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWNvbmR0ID09IDApIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kdCA8IDEwKSB7XG4gICAgICAgICAgICBzZW5zID0gXCIwXCIgKyBzZWNvbmR0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VucyA9IFwiXCIgKyBzZWNvbmR0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW5zICsgXCI6XCIgKyBzZW5zO1xuICAgIH1cblxuICAgIC8vMjp5eXl5LW1tLWRkIGg6bTpzXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0QnlTZWNvbmQyKHRpbWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHZhciBkYXRlOiBEYXRlID0gbmV3IERhdGUodGltZSk7XG4gICAgICAgIHZhciB5ZWFyOiBudW1iZXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIHZhciBtb250aDogbnVtYmVyID0gZGF0ZS5nZXRNb250aCgpICsgMTsgXHQvL+i/lOWbnueahOaciOS7veS7jjAtMTHvvJtcbiAgICAgICAgdmFyIGRheTogbnVtYmVyID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gZGF0ZS5nZXRIb3VycygpO1xuICAgICAgICB2YXIgbWludXRlOiBudW1iZXIgPSBkYXRlLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgdmFyIHNlY29uZDogbnVtYmVyID0gZGF0ZS5nZXRTZWNvbmRzKCk7XG4gICAgICAgIHJldHVybiB5ZWFyICsgXCItXCIgKyBtb250aCArIFwiLVwiICsgZGF5ICsgXCIgXCIgKyBob3VycyArIFwiOlwiICsgbWludXRlICsgXCI6XCIgKyBzZWNvbmQ7XG5cbiAgICB9XG5cbiAgICAvLzQ6eHjlpKnliY3vvIx4eOWwj+aXtuWJje+8jHh45YiG6ZKf5YmNXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0QnlTZWNvbmQ0KHRpbWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHZhciB0ID0gTWF0aC5mbG9vcih0aW1lIC8gMzYwMCk7XG4gICAgICAgIGlmICh0ID4gMCkge1xuICAgICAgICAgICAgaWYgKHQgPiAyNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKHQgLyAyNCkgKyBcIuWkqeWJjVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQgKyBcIuWwj+aXtuWJjVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGltZSAvIDYwKSArIFwi5YiG6ZKf5YmNXCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRGb3JtYXRCeVNlY29uZDUodGltZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgLy8g5q+P5Liq5pe26Ze05Y2V5L2N5omA5a+55bqU55qE56eS5pWwXG4gICAgICAgIHZhciBvbmVEYXk6IG51bWJlciA9IDM2MDAgKiAyNDtcbiAgICAgICAgdmFyIG9uZUhvdXJzdDogbnVtYmVyID0gMzYwMDtcbiAgICAgICAgdmFyIG9uZU1pbnN0OiBudW1iZXIgPSA2MDtcblxuICAgICAgICB2YXIgZGF5cyA9IE1hdGguZmxvb3IodGltZSAvIG9uZURheSk7XG4gICAgICAgIHZhciBob3Vyc3Q6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAlIG9uZURheSAvIG9uZUhvdXJzdClcbiAgICAgICAgdmFyIG1pbnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lIC0gaG91cnN0ICogb25lSG91cnN0KSAvIG9uZU1pbnN0KSAgLy9NYXRoLmZsb29yKHRpbWUgJSBvbmVEYXkgJSBvbmVIb3Vyc3QgLyBvbmVNaW5zdCk7XG4gICAgICAgIHZhciBzZWNvbmR0OiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lIC0gaG91cnN0ICogb25lSG91cnN0KSAlIG9uZU1pbnN0KSAvL3RpbWU7XG5cbiAgICAgICAgdmFyIGRheXNzOiBzdHJpbmcgPSBcIlwiO1xuICAgICAgICB2YXIgaG91cnNzOiBzdHJpbmcgPSBcIlwiXG4gICAgICAgIHZhciBtaW5zczogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdmFyIHNlY3NzOiBzdHJpbmcgPSBcIlwiXG4gICAgICAgIGlmICh0aW1lID4gMCkge1xuICAgICAgICAgICAgLy/lpKlcbiAgICAgICAgICAgIGlmIChkYXlzID09IDApIHtcbiAgICAgICAgICAgICAgICBkYXlzcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgLy/lsI/ml7ZcbiAgICAgICAgICAgICAgICBpZiAoaG91cnN0ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaG91cnNzID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgLy/liIZcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pbnN0ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNzID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNvbmR0ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZHQgPCAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCIwXCIgKyBzZWNvbmR0ICsgXCLnp5JcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWNzcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNzID0gXCJcIiArIG1pbnN0ICsgXCLliIbpkp9cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNvbmR0ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZHQgPCAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCIwXCIgKyBzZWNvbmR0ICsgXCLnp5JcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtaW5zcyArIHNlY3NzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaG91cnNzID0gaG91cnN0ICsgXCLlsI/ml7ZcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pbnN0ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNzID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNvbmR0ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZHQgPCAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCIwXCIgKyBzZWNvbmR0ICsgXCLnp5JcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBob3Vyc3MgKyBzZWNzc1xuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWluc3QgPCAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluc3MgPSBcIjBcIiArIG1pbnN0ICsgXCLliIbpkp9cIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNzID0gXCJcIiArIG1pbnN0ICsgXCLliIbpkp9cIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBob3Vyc3MgKyBtaW5zcztcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRheXNzID0gZGF5cyArIFwi5aSpXCI7XG4gICAgICAgICAgICAgICAgaWYgKGhvdXJzdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXJzcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhvdXJzdCA8IDEwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaG91cnNzID0gXCIwXCIgKyBob3Vyc3QgKyBcIuWwj+aXtlwiO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBob3Vyc3MgPSBcIlwiICsgaG91cnN0ICsgXCLlsI/ml7ZcIjtcbiAgICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZGF5c3MgKyBob3Vyc3M7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYWRkKG51bSkge1xuICAgICAgICByZXR1cm4gbnVtIDwgMTAgPyAnMCcgKyBudW0gOiBudW07XG4gICAgfVxuXG5cbn1cbiIsImltcG9ydCBPYmplY3RQb29sIGZyb20gXCIuL09iamVjdFBvb2xcIjtcblxuLypcbiogbmFtZTtcbiovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPYmplY3RJbnN0YW5jZSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgY2x6cyA9IFtdO1xuICAgIHByaXZhdGUgc3RhdGljIG9iamVjdHMgPSBbXTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0KGNsczogYW55KSB7XG4gICAgICAgIGxldCBpZHggPSB0aGlzLmNsenMuaW5kZXhPZihjbHMpO1xuICAgICAgICByZXR1cm4gKGlkeCA+PSAwICYmIHRoaXMub2JqZWN0c1tpZHhdKSB8fCB0aGlzLmNyZWF0ZShjbHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZShjbHM6IGFueSkge1xuICAgICAgICB2YXIgb2JqID0gT2JqZWN0UG9vbC5wb3AoY2xzKTtcbiAgICAgICAgdGhpcy5vYmplY3RzLnB1c2gob2JqKTtcbiAgICAgICAgdGhpcy5jbHpzLnB1c2goY2xzKTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBPYmplY3RQb29sIHtcbiAgICBwcml2YXRlIHN0YXRpYyBjbHNBcnIgPSBbXTtcblxuICAgIHN0YXRpYyBwb3AoY2xzOiBhbnkpIHtcbiAgICAgICAgbGV0IGlkeCA9IHRoaXMuY2xzQXJyLmluZGV4T2YoY2xzKTtcbiAgICAgICAgaWYgKGlkeCA8IDApIHtcbiAgICAgICAgICAgIGlkeCA9IHRoaXMuY2xzQXJyLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuY2xzQXJyLnB1c2goY2xzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQga2V5ID0gJ3Bvb2xLZXknICsgaWR4O1xuICAgICAgICBsZXQgaXRlbSA9IExheWEuUG9vbC5nZXRJdGVtQnlDbGFzcyhrZXksIGNscyk7XG4gICAgICAgIGl0ZW0ucG9vbEtleSA9IGtleTtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuXG4gICAgc3RhdGljIHB1c2goaXRlbSkge1xuICAgICAgICBMYXlhLlBvb2wucmVjb3ZlcihpdGVtLnBvb2xLZXksIGl0ZW0pO1xuICAgIH1cbn0iLCJleHBvcnQgZGVmYXVsdCAgY2xhc3MgU2NhbGVCdXR0b25TY3JpcHQge1xuIFxuICAgIHB1YmxpYyBkZWxheVRpbWU6IG51bWJlciA9IDA7XG4gICAgcHVibGljIG1pblNjYWxlOiBudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgbW9ua2V5Qm94OiBMYXlhLkltYWdlO1xuXG4gICAgY29uc3RydWN0b3IoKXtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKuiuvue9rm93bmVy5Ye95pWw77yM5Y+v5Lul55u05o6l6I635Y+W5Yiw5re75Yqg6ZmE5Yqg6ISa5pys55qE57uE5Lu25a6e5L6LIFxuICAgICAqKi9cbiAgICBwdWJsaWMgc2V0IG93bmVyKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5tb25rZXlCb3ggPSB2YWx1ZTtcbiAgICAgICAgLy/oh6rlrprkuYnnmoTohJrmnKzkvJrmnInml7bluo/pl67popjvvIzmiYDku6XlnKjmraTmt7vliqDkuIDkuKrlu7bml7ZcbiAgICAgICAgdGhpcy5tb25rZXlCb3guZnJhbWVPbmNlKDIsIHRoaXMsIHRoaXMub25Mb2FkZWQpO1xuICAgICAgICBcbiAgICB9XG5cbiAgICBvbkxvYWRlZCgpOiB2b2lkIHtcbiAgICAgICAvKiDorr7nva7mjInpkq7kuLrljZXmgIHmjInpkq5cbiAgICAgICAgKiog5Y+W5YC877yaXG4gICAgICAgICoqIDHvvJrljZXmgIHjgILlm77niYfkuI3lgZrliIflibLvvIzmjInpkq7nmoTnmq7ogqTnirbmgIHlj6rmnInkuIDnp43jgIJcbiAgICAgICAgKiogMu+8muS4pOaAgeOAguWbvueJh+WwhuS7peerluebtOaWueWQkeiiq+etieavlOWIh+WJsuS4ujLpg6jliIbvvIzku47kuIrlkJHkuIvvvIzkvp3mrKHkuLrlvLnotbfnirbmgIHnmq7ogqTjgIHmjInkuIvlkoznu4/ov4flj4rpgInkuK3nirbmgIHnmq7ogqTjgIJcbiAgICAgICAgKiogM++8muS4ieaAgeOAguWbvueJh+WwhuS7peerluebtOaWueWQkeiiq+etieavlOWIh+WJsuS4ujLpg6jliIbvvIzku47kuIrlkJHkuIvvvIzkvp3mrKHkuLrlvLnotbfnirbmgIHnmq7ogqTjgIHnu4/ov4fnirbmgIHnmq7ogqTjgIHmjInkuIvlkozpgInkuK3nirbmgIHnmq7ogqRcbiAgICAgICAgKi9cbiAgICAgICAgLy/mt7vliqDpvKDmoIfmjInkuIvkuovku7bkvqblkKzjgILmjInml7bml7bnvKnlsI/mjInpkq7jgIJcbiAgICAgICAgdGhpcy5tb25rZXlCb3gub24oTGF5YS5FdmVudC5NT1VTRV9ET1dOLCB0aGlzLCB0aGlzLnNjYWxlU21hbGwpO1xuICAgICAgICAvL+a3u+WKoOm8oOagh+aKrOi1t+S6i+S7tuS+puWQrOOAguaKrOi1t+aXtui/mOWOn+aMiemSruOAglxuICAgICAgICB0aGlzLm1vbmtleUJveC5vbihMYXlhLkV2ZW50Lk1PVVNFX1VQLCB0aGlzLCB0aGlzLnNjYWxlQmlnKTtcbiAgICAgICAgLy/mt7vliqDpvKDmoIfnprvlvIDkuovku7bkvqblkKzjgILnprvlvIDml7bov5jljp/mjInpkq7jgIJcbiAgICAgICAgdGhpcy5tb25rZXlCb3gub24oTGF5YS5FdmVudC5NT1VTRV9PVVQsIHRoaXMsIHRoaXMuc2NhbGVCaWcpO1xuICAgIH1cbiAgICBcbiAgICBcbiAgICBwcml2YXRlIHNjYWxlU21hbGwoKTp2b2lke1xuICAgICAgICAvL+e8qeWwj+iHszAuOOeahOe8k+WKqOaViOaenFxuICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMubW9ua2V5Qm94LCB7c2NhbGVYOjAuOCwgc2NhbGVZOiAwLjh9LCAyKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzY2FsZUJpZygpOnZvaWR7XG4gICAgICAgIC8v5Y+Y5aSn6L+Y5Y6f55qE57yT5Yqo5pWI5p6cXG4gICAgICAgIExheWEuVHdlZW4udG8odGhpcy5tb25rZXlCb3gsIHtzY2FsZVg6MSwgc2NhbGVZOjF9LCAyKTtcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCAgY2xhc3MgVXRpbCB7XG4gICAgcHVibGljIGxvYWQocmVzLCBvblByb2dyZXNzPzogTGF5YS5IYW5kbGVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChzdWMsIGZhaWwpID0+IHtcbiAgICAgICAgICAgIExheWEubG9hZGVyLmxvYWQocmVzLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHN1YyksIG9uUHJvZ3Jlc3MpO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIHNldEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlLnRvU3RyaW5nKCkpXG4gICAgfVxuICAgIGdldEl0ZW0oa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBVdGlsO1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEkoKTogVXRpbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZSB8fCAodGhpcy5faW5zdGFuY2UgPSBuZXcgVXRpbCk7XG4gICAgfVxufVxuXG5leHBvcnQgZW51bSBEYXRhS2V5IHtcbiAgICBjdXJfcmVkX2RheV9saW1pdCA9ICdjdXJfcmVkX2RheV9saW1pdCcsXG4gICAgY3VyX3NoYWtlX2RheV9saW1pdCA9ICdjdXJfc2hha2VfZGF5X2xpbWl0JyxcbiAgICBzaGFrZUxhc3RUaW1lID0gJ3NoYWtlTGFzdFRpbWUnLFxuICAgIGRhdGFDTlQgPSAnZGF0YUNOVCcsXG4gICAgdG9kYXlDbnQgPSAndG9kYXlDbnQnLFxuICAgIGxhc3RUaW1lID0gJ2xhc3RUaW1lJyxcbn0iXX0=