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 | 19× 21× 2× 21× 19× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 3× 1× 1× 1× 3× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 2× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 2× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 2× 2× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 2× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 3× 3× 3× 1× 1× 1× 1× 1× 1× 1× 4× 4× 1× 4× 12× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 2× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 2× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 3× 1× 1× 1× 1× 1× 3× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 3× 3× 1× 1× 1× 1× 1× 3× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 3× 3× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 3× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 3× 1× 2× 1× 1× 1× 1× 1× 1× 3× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 2× 2× 1× 2× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 2× 2× 1× 2× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× | 'use strict'; // istanbul ignore next var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; Eif ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { Eif (protoProps) defineProperties(Constructor.prototype, protoProps); Iif (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); // istanbul ignore next var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; Iif (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); Iif (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else Eif ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; // istanbul ignore next function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } // istanbul ignore next function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } // istanbul ignore next function _inherits(subClass, superClass) { Iif (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); Eif (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _chai = require('chai'); var _ = require('../'); var _sinon = require('sinon'); var _sinon2 = _interopRequireDefault(_sinon); describe('shallow', function () { describe('.contains(node)', function () { it('should allow matches on the root node', function () { var a = _react2['default'].createElement('div', { className: 'foo' }); var b = _react2['default'].createElement('div', { className: 'foo' }); var c = _react2['default'].createElement('div', { className: 'bar' }); (0, _chai.expect)((0, _.shallow)(a).contains(b)).to.be['true']; (0, _chai.expect)((0, _.shallow)(a).contains(c)).to.be['false']; }); it('should allow matches on a nested node', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'foo' }) )); var b = _react2['default'].createElement('div', { className: 'foo' }); (0, _chai.expect)(wrapper.contains(b)).to.be['true']; }); it('should match composite components', function () { var Foo = (function (_React$Component) { _inherits(Foo, _React$Component); function Foo() { _classCallCheck(this, Foo); _get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments); } _createClass(Foo, [{ key: 'render', value: function render() { return _react2['default'].createElement('div', null); } }]); return Foo; })(_react2['default'].Component); var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement(Foo, null) )); var b = _react2['default'].createElement(Foo, null); (0, _chai.expect)(wrapper.contains(b)).to.be['true']; }); }); describe('.find(selector)', function () { it('should find an element based on a class name', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('input', { className: 'foo' }) )); (0, _chai.expect)(wrapper.find('.foo').type()).to.equal('input'); }); it('should find an element based on a tag name', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('input', { className: 'foo' }) )); (0, _chai.expect)(wrapper.find('input').props().className).to.equal('foo'); }); it('should find a component based on a constructor', function () { var Foo = (function (_React$Component2) { _inherits(Foo, _React$Component2); function Foo() { _classCallCheck(this, Foo); _get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments); } _createClass(Foo, [{ key: 'render', value: function render() { return _react2['default'].createElement('div', null); } }]); return Foo; })(_react2['default'].Component); var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement(Foo, { className: 'foo' }) )); (0, _chai.expect)(wrapper.find(Foo).type()).to.equal(Foo); }); it('should find multiple elements based on a class name', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('input', { className: 'foo' }), _react2['default'].createElement('button', { className: 'foo' }) )); (0, _chai.expect)(wrapper.find('.foo').length).to.equal(2); }); it('should find multiple elements based on a tag name', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('input', { className: 'foo' }), _react2['default'].createElement('input', null), _react2['default'].createElement('button', null) )); (0, _chai.expect)(wrapper.find('input').length).to.equal(2); (0, _chai.expect)(wrapper.find('button').length).to.equal(1); }); it('should find multiple elements based on a constructor', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('input', { className: 'foo' }), _react2['default'].createElement('input', null), _react2['default'].createElement('button', null) )); (0, _chai.expect)(wrapper.find('input').length).to.equal(2); (0, _chai.expect)(wrapper.find('button').length).to.equal(1); }); it('should throw on a complex selector', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('input', { className: 'foo' }), _react2['default'].createElement('input', null), _react2['default'].createElement('button', null) )); (0, _chai.expect)(function () { return wrapper.find('.foo .foo'); }).to['throw']; }); }); describe('.findWhere(predicate)', function () { it('should return all elements for a truthy test', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('input', { className: 'foo' }), _react2['default'].createElement('input', null) )); (0, _chai.expect)(wrapper.findWhere(function () { return true; }).length).to.equal(3); }); it('should return no elements for a falsy test', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('input', { className: 'foo' }), _react2['default'].createElement('input', null) )); (0, _chai.expect)(wrapper.findWhere(function () { return false; }).length).to.equal(0); }); it('should call the predicate with the wrapped node as the first argument', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'foo bar' }), _react2['default'].createElement('div', { className: 'foo baz' }), _react2['default'].createElement('div', { className: 'foo bux' }) )); var stub = _sinon2['default'].stub(); stub.returns(true); var spy = _sinon2['default'].spy(stub); wrapper.findWhere(spy); (0, _chai.expect)(spy.callCount).to.equal(4); (0, _chai.expect)(spy.args[0][0]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[1][0]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[2][0]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[3][0]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[1][0].hasClass('bar')).to.be['true']; (0, _chai.expect)(spy.args[2][0].hasClass('baz')).to.be['true']; (0, _chai.expect)(spy.args[3][0].hasClass('bux')).to.be['true']; }); }); describe('.setProps(newProps)', function () { it('should set props for a component multiple times', function () { var Foo = (function (_React$Component3) { _inherits(Foo, _React$Component3); function Foo() { _classCallCheck(this, Foo); _get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments); } _createClass(Foo, [{ key: 'render', value: function render() { return _react2['default'].createElement( 'div', { className: this.props.id }, this.props.id ); } }]); return Foo; })(_react2['default'].Component); var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, { id: 'foo' })); (0, _chai.expect)(wrapper.find('.foo').length).to.equal(1); wrapper.setProps({ id: 'bar', foo: 'bla' }); (0, _chai.expect)(wrapper.find('.bar').length).to.equal(1); }); it('should call componentWillReceiveProps for new renders', function () { var spy = _sinon2['default'].spy(); var Foo = (function (_React$Component4) { _inherits(Foo, _React$Component4); function Foo(props) { _classCallCheck(this, Foo); _get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).call(this, props); this.componentWillReceiveProps = spy; } _createClass(Foo, [{ key: 'render', value: function render() { return _react2['default'].createElement( 'div', { className: this.props.id }, this.props.id ); } }]); return Foo; })(_react2['default'].Component); var nextProps = { id: 'bar', foo: 'bla' }; var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, { id: 'foo' })); (0, _chai.expect)(spy.calledOnce).to.be['false']; wrapper.setProps(nextProps); (0, _chai.expect)(spy.calledOnce).to.be['true']; (0, _chai.expect)(spy.calledWith(nextProps)).to.be['true']; }); }); describe('.simulate(eventName, data)', function () { it('should simulate events', function () { var Foo = (function (_React$Component5) { _inherits(Foo, _React$Component5); function Foo(props) { _classCallCheck(this, Foo); _get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).call(this, props); this.state = { count: 0 }; } _createClass(Foo, [{ key: 'render', value: function render() { // istanbul ignore next var _this = this; return _react2['default'].createElement( 'a', { className: 'clicks-' + this.state.count, onClick: function () { return _this.setState({ count: _this.state.count + 1 }); } }, 'foo' ); } }]); return Foo; })(_react2['default'].Component); var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, null)); (0, _chai.expect)(wrapper.find('.clicks-0').length).to.equal(1); wrapper.simulate('click'); (0, _chai.expect)(wrapper.find('.clicks-1').length).to.equal(1); }); it('should pass in event data', function () { var spy = _sinon2['default'].spy(); var Foo = (function (_React$Component6) { _inherits(Foo, _React$Component6); function Foo() { _classCallCheck(this, Foo); _get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments); } _createClass(Foo, [{ key: 'render', value: function render() { return _react2['default'].createElement( 'a', { onClick: spy }, 'foo' ); } }]); return Foo; })(_react2['default'].Component); var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, null)); var a = {}; var b = {}; wrapper.simulate('click', a, b); (0, _chai.expect)(spy.args[0][0]).to.equal(a); (0, _chai.expect)(spy.args[0][1]).to.equal(b); }); }); describe('.setState(newState)', function () { it('should set the state of the root node', function () { var Foo = (function (_React$Component7) { _inherits(Foo, _React$Component7); function Foo(props) { _classCallCheck(this, Foo); _get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).call(this, props); this.state = { id: 'foo' }; } _createClass(Foo, [{ key: 'render', value: function render() { return _react2['default'].createElement('div', { className: this.state.id }); } }]); return Foo; })(_react2['default'].Component); var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, null)); (0, _chai.expect)(wrapper.find('.foo').length).to.equal(1); wrapper.setState({ id: 'bar' }); (0, _chai.expect)(wrapper.find('.bar').length).to.equal(1); }); }); describe('.is(selector)', function () { it('should return true when selector matches current element', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement('div', { className: 'foo bar baz' })); (0, _chai.expect)(wrapper.is('.foo')).to.be['true']; }); it('should allow for compound selectors', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement('div', { className: 'foo bar baz' })); (0, _chai.expect)(wrapper.is('.foo.bar')).to.be['true']; }); it('should return false when selector does not match', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement('div', { className: 'bar baz' })); (0, _chai.expect)(wrapper.is('.foo')).to.be['false']; }); }); describe('.not(selector)', function () { it('filters to things not matching a selector', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'foo bar baz' }), _react2['default'].createElement('div', { className: 'foo' }), _react2['default'].createElement('div', { className: 'bar baz' }), _react2['default'].createElement('div', { className: 'baz' }), _react2['default'].createElement('div', { className: 'foo bar' }) )); (0, _chai.expect)(wrapper.find('.foo').not('.bar').length).to.equal(1); (0, _chai.expect)(wrapper.find('.baz').not('.foo').length).to.equal(2); (0, _chai.expect)(wrapper.find('.foo').not('div').length).to.equal(0); }); }); describe('.filter(selector)', function () { it('should return a new wrapper of just the nodes that matched the selector', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'foo bar baz' }), _react2['default'].createElement('div', { className: 'foo' }), _react2['default'].createElement( 'div', { className: 'bar baz' }, _react2['default'].createElement('div', { className: 'foo bar baz' }), _react2['default'].createElement('div', { className: 'foo' }) ), _react2['default'].createElement('div', { className: 'baz' }), _react2['default'].createElement('div', { className: 'foo bar' }) )); (0, _chai.expect)(wrapper.find('.foo').filter('.bar').length).to.equal(3); (0, _chai.expect)(wrapper.find('.bar').filter('.foo').length).to.equal(3); (0, _chai.expect)(wrapper.find('.bar').filter('.bax').length).to.equal(0); (0, _chai.expect)(wrapper.find('.foo').filter('.baz.bar').length).to.equal(2); }); it('should only look in the current wrappers nodes, not their children', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement( 'div', { className: 'foo' }, _react2['default'].createElement('div', { className: 'bar' }) ), _react2['default'].createElement('div', { className: 'foo bar' }) )); (0, _chai.expect)(wrapper.find('.foo').filter('.bar').length).to.equal(1); }); }); describe('.filterWhere(predicate)', function () { it('should filter only the nodes of the wrapper', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'foo bar' }), _react2['default'].createElement('div', { className: 'foo baz' }), _react2['default'].createElement('div', { className: 'foo bux' }) )); var stub = _sinon2['default'].stub(); stub.onCall(0).returns(false); stub.onCall(1).returns(true); stub.onCall(2).returns(false); var baz = wrapper.find('.foo').filterWhere(stub); (0, _chai.expect)(baz.length).to.equal(1); (0, _chai.expect)(baz.hasClass('baz')).to.be['true']; }); it('should call the predicate with the wrapped node as the first argument', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'foo bar' }), _react2['default'].createElement('div', { className: 'foo baz' }), _react2['default'].createElement('div', { className: 'foo bux' }) )); var stub = _sinon2['default'].stub(); stub.returns(true); var spy = _sinon2['default'].spy(stub); wrapper.find('.foo').filterWhere(spy); (0, _chai.expect)(spy.callCount).to.equal(3); (0, _chai.expect)(spy.args[0][0]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[1][0]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[2][0]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[0][0].hasClass('bar')).to.be['true']; (0, _chai.expect)(spy.args[1][0].hasClass('baz')).to.be['true']; (0, _chai.expect)(spy.args[2][0].hasClass('bux')).to.be['true']; }); }); describe('.text()', function () { var matchesRender = function matchesRender(node) { var actual = (0, _.shallow)(node).text(); var expected = (0, _.render)(node).text(); (0, _chai.expect)(expected).to.equal(actual); }; it('should handle simple text nodes', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, 'some text' )); (0, _chai.expect)(wrapper.text()).to.equal('some text'); }); it('should handle nodes with mapped children', function () { var Foo = (function (_React$Component8) { _inherits(Foo, _React$Component8); function Foo() { _classCallCheck(this, Foo); _get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments); } _createClass(Foo, [{ key: 'render', value: function render() { return _react2['default'].createElement( 'div', null, this.props.items.map(function (x) { return x; }) ); } }]); return Foo; })(_react2['default'].Component); matchesRender(_react2['default'].createElement(Foo, { items: ['abc', 'def', 'hij'] })); matchesRender(_react2['default'].createElement(Foo, { items: [_react2['default'].createElement( 'i', { key: 1 }, 'abc' ), _react2['default'].createElement( 'i', { key: 2 }, 'def' ), _react2['default'].createElement( 'i', { key: 3 }, 'hij' )] })); }); it('should render composite components dumbly', function () { var Foo = (function (_React$Component9) { _inherits(Foo, _React$Component9); function Foo() { _classCallCheck(this, Foo); _get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments); } _createClass(Foo, [{ key: 'render', value: function render() { return _react2['default'].createElement('div', null); } }]); return Foo; })(_react2['default'].Component); var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement(Foo, null), _react2['default'].createElement( 'div', null, 'test' ) )); (0, _chai.expect)(wrapper.text()).to.equal('<Foo />test'); }); it('should handle html entities', function () { matchesRender(_react2['default'].createElement( 'div', null, '>' )); }); }); describe('.props()', function () { it('should return the props object', function () { var fn = function fn() {}; var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', { id: 'fooId', className: 'bax', onClick: fn }, _react2['default'].createElement('div', { className: 'baz' }), _react2['default'].createElement('div', { className: 'foo' }) )); (0, _chai.expect)(wrapper.props().className).to.equal('bax'); (0, _chai.expect)(wrapper.props().onClick).to.equal(fn); (0, _chai.expect)(wrapper.props().id).to.equal('fooId'); }); it('should be allowed to be used on an inner node', function () { var fn = function fn() {}; var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', { className: 'bax' }, _react2['default'].createElement('div', { className: 'baz', onClick: fn }), _react2['default'].createElement('div', { className: 'foo', id: 'fooId' }) )); (0, _chai.expect)(wrapper.find('.baz').props().onClick).to.equal(fn); (0, _chai.expect)(wrapper.find('.foo').props().id).to.equal('fooId'); }); }); describe('.state(name)', function () { it('should return the state object', function () { var Foo = (function (_React$Component10) { _inherits(Foo, _React$Component10); function Foo(props) { _classCallCheck(this, Foo); _get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).call(this, props); this.state = { foo: 'foo' }; } _createClass(Foo, [{ key: 'render', value: function render() { return _react2['default'].createElement('div', null); } }]); return Foo; })(_react2['default'].Component); var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, null)); (0, _chai.expect)(wrapper.state()).to.eql({ foo: 'foo' }); }); it('should return the current state after state transitions', function () { var Foo = (function (_React$Component11) { _inherits(Foo, _React$Component11); function Foo(props) { _classCallCheck(this, Foo); _get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).call(this, props); this.state = { foo: 'foo' }; } _createClass(Foo, [{ key: 'render', value: function render() { return _react2['default'].createElement('div', null); } }]); return Foo; })(_react2['default'].Component); var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, null)); wrapper.setState({ foo: 'bar' }); (0, _chai.expect)(wrapper.state()).to.eql({ foo: 'bar' }); }); it('should allow a state property name be passed in as an argument', function () { var Foo = (function (_React$Component12) { _inherits(Foo, _React$Component12); function Foo(props) { _classCallCheck(this, Foo); _get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).call(this, props); this.state = { foo: 'foo' }; } _createClass(Foo, [{ key: 'render', value: function render() { return _react2['default'].createElement('div', null); } }]); return Foo; })(_react2['default'].Component); var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, null)); (0, _chai.expect)(wrapper.state('foo')).to.equal('foo'); }); }); describe('.children([selector])', function () { it('should return empty wrapper for node with no children', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement('div', null)); (0, _chai.expect)(wrapper.children().length).to.equal(0); }); it('should return the children nodes of the root', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'foo' }), _react2['default'].createElement('div', { className: 'bar' }), _react2['default'].createElement('div', { className: 'baz' }) )); (0, _chai.expect)(wrapper.children().length).to.equal(3); (0, _chai.expect)(wrapper.children().at(0).hasClass('foo')).to.be['true']; (0, _chai.expect)(wrapper.children().at(1).hasClass('bar')).to.be['true']; (0, _chai.expect)(wrapper.children().at(2).hasClass('baz')).to.be['true']; }); it('should not return any of the children of children', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement( 'div', { className: 'foo' }, _react2['default'].createElement('div', { className: 'bar' }) ), _react2['default'].createElement('div', { className: 'baz' }) )); (0, _chai.expect)(wrapper.children().length).to.equal(2); (0, _chai.expect)(wrapper.children().at(0).hasClass('foo')).to.be['true']; (0, _chai.expect)(wrapper.children().at(1).hasClass('baz')).to.be['true']; }); it('should handle mixed children with and without arrays', function () { var Foo = (function (_React$Component13) { _inherits(Foo, _React$Component13); function Foo() { _classCallCheck(this, Foo); _get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments); } _createClass(Foo, [{ key: 'render', value: function render() { return _react2['default'].createElement( 'div', null, _react2['default'].createElement('span', { className: 'foo' }), this.props.items.map(function (x) { return x; }) ); } }]); return Foo; })(_react2['default'].Component); var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, { items: [_react2['default'].createElement( 'i', { key: 1, className: 'bar' }, 'abc' ), _react2['default'].createElement( 'i', { key: 2, className: 'baz' }, 'def' )] })); (0, _chai.expect)(wrapper.children().length).to.equal(3); (0, _chai.expect)(wrapper.children().at(0).hasClass('foo')).to.be['true']; (0, _chai.expect)(wrapper.children().at(1).hasClass('bar')).to.be['true']; (0, _chai.expect)(wrapper.children().at(2).hasClass('baz')).to.be['true']; }); it('should optionally allow a selector to filter by', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'foo' }), _react2['default'].createElement('div', { className: 'bar bip' }), _react2['default'].createElement('div', { className: 'baz bip' }) )); var children = wrapper.children('.bip'); (0, _chai.expect)(children.length).to.equal(2); (0, _chai.expect)(children.at(0).hasClass('bar')).to.be['true']; (0, _chai.expect)(children.at(1).hasClass('baz')).to.be['true']; }); }); describe('.parents([selector])', function () { it('should return an array of current nodes ancestors', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', { className: 'bax' }, _react2['default'].createElement( 'div', { className: 'foo' }, _react2['default'].createElement( 'div', { className: 'bar' }, _react2['default'].createElement('div', { className: 'baz' }) ) ) )); var parents = wrapper.find('.baz').parents(); (0, _chai.expect)(parents.length).to.equal(3); (0, _chai.expect)(parents.at(0).hasClass('bar')).to.be['true']; (0, _chai.expect)(parents.at(1).hasClass('foo')).to.be['true']; (0, _chai.expect)(parents.at(2).hasClass('bax')).to.be['true']; }); it('should work for non-leaf nodes as well', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', { className: 'bax' }, _react2['default'].createElement( 'div', { className: 'foo' }, _react2['default'].createElement( 'div', { className: 'bar' }, _react2['default'].createElement('div', { className: 'baz' }) ) ) )); var parents = wrapper.find('.bar').parents(); (0, _chai.expect)(parents.length).to.equal(2); (0, _chai.expect)(parents.at(0).hasClass('foo')).to.be['true']; (0, _chai.expect)(parents.at(1).hasClass('bax')).to.be['true']; }); it('should optionally allow a selector', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', { className: 'bax foo' }, _react2['default'].createElement( 'div', { className: 'foo' }, _react2['default'].createElement( 'div', { className: 'bar' }, _react2['default'].createElement('div', { className: 'baz' }) ) ) )); var parents = wrapper.find('.baz').parents('.foo'); (0, _chai.expect)(parents.length).to.equal(2); (0, _chai.expect)(parents.at(0).hasClass('foo')).to.be['true']; (0, _chai.expect)(parents.at(1).hasClass('bax')).to.be['true']; }); }); describe('.parent()', function () { it('should return only the immediate parent of the node', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', { className: 'bax' }, _react2['default'].createElement( 'div', { className: 'foo' }, _react2['default'].createElement( 'div', { className: 'bar' }, _react2['default'].createElement('div', { className: 'baz' }) ) ) )); (0, _chai.expect)(wrapper.find('.baz').parent().hasClass('bar')).to.be['true']; }); it('should work for multiple nodes', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement( 'div', { className: 'foo' }, _react2['default'].createElement('div', { className: 'baz' }) ), _react2['default'].createElement( 'div', { className: 'bar' }, _react2['default'].createElement('div', { className: 'baz' }) ), _react2['default'].createElement( 'div', { className: 'bax' }, _react2['default'].createElement('div', { className: 'baz' }) ) )); var parents = wrapper.find('.baz').parent(); (0, _chai.expect)(parents).to.have.length(3); (0, _chai.expect)(parents.at(0).hasClass('foo')).to.be['true']; (0, _chai.expect)(parents.at(1).hasClass('bar')).to.be['true']; (0, _chai.expect)(parents.at(2).hasClass('bax')).to.be['true']; }); }); describe('.closest(selector)', function () { it('should return the closest ancestor for a given selector', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', { className: 'foo' }, _react2['default'].createElement( 'div', { className: 'foo baz' }, _react2['default'].createElement( 'div', { className: 'bax' }, _react2['default'].createElement('div', { className: 'bar' }) ) ) )); var closestFoo = wrapper.find('.bar').closest('.foo'); (0, _chai.expect)(closestFoo.hasClass('baz')).to.be['true']; (0, _chai.expect)(closestFoo.length).to.equal(1); }); it('should only ever return a wrapper of a single node', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', { className: 'bax' }, _react2['default'].createElement( 'div', { className: 'foo' }, _react2['default'].createElement( 'div', { className: 'bar' }, _react2['default'].createElement('div', { className: 'baz' }) ) ) )); (0, _chai.expect)(wrapper.find('.baz').parent().hasClass('bar')).to.be['true']; }); it('should return itself if matching', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', { className: 'bax' }, _react2['default'].createElement( 'div', { className: 'foo' }, _react2['default'].createElement( 'div', { className: 'baz' }, _react2['default'].createElement('div', { className: 'bux baz' }) ) ) )); (0, _chai.expect)(wrapper.find('.bux').closest('.baz').hasClass('bux')).to.be['true']; }); }); describe('.hasClass(className)', function () { it('should return whether or not node has a certain class', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement('div', { className: 'foo bar baz some-long-string FoOo' })); (0, _chai.expect)(wrapper.hasClass('foo')).to.be['true']; (0, _chai.expect)(wrapper.hasClass('bar')).to.be['true']; (0, _chai.expect)(wrapper.hasClass('baz')).to.be['true']; (0, _chai.expect)(wrapper.hasClass('some-long-string')).to.be['true']; (0, _chai.expect)(wrapper.hasClass('FoOo')).to.be['true']; (0, _chai.expect)(wrapper.hasClass('doesnt-exist')).to.be['false']; }); }); describe('.forEach(fn)', function () { it('should call a function for each node in the wrapper', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'foo bax' }), _react2['default'].createElement('div', { className: 'foo bar' }), _react2['default'].createElement('div', { className: 'foo baz' }) )); var spy = _sinon2['default'].spy(); wrapper.find('.foo').forEach(spy); (0, _chai.expect)(spy.callCount).to.equal(3); (0, _chai.expect)(spy.args[0][0]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[0][0].hasClass('bax')).to.be['true']; (0, _chai.expect)(spy.args[1][0]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[1][0].hasClass('bar')).to.be['true']; (0, _chai.expect)(spy.args[2][0]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[2][0].hasClass('baz')).to.be['true']; }); }); describe('.map(fn)', function () { it('should call a function with a wrapper for each node in the wrapper', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'foo bax' }), _react2['default'].createElement('div', { className: 'foo bar' }), _react2['default'].createElement('div', { className: 'foo baz' }) )); var spy = _sinon2['default'].spy(); wrapper.find('.foo').map(spy); (0, _chai.expect)(spy.callCount).to.equal(3); (0, _chai.expect)(spy.args[0][0]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[0][0].hasClass('bax')).to.be['true']; (0, _chai.expect)(spy.args[1][0]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[1][0].hasClass('bar')).to.be['true']; (0, _chai.expect)(spy.args[2][0]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[2][0].hasClass('baz')).to.be['true']; }); it('should return an array with the mapped values', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'foo bax' }), _react2['default'].createElement('div', { className: 'foo bar' }), _react2['default'].createElement('div', { className: 'foo baz' }) )); var result = wrapper.find('.foo').map(function (w) { return w.props().className; }); (0, _chai.expect)(result).to.eql(['foo bax', 'foo bar', 'foo baz']); }); }); describe('.reduce(fn[, initialValue])', function () { it('should call a function with a wrapper for each node in the wrapper', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'foo bax' }), _react2['default'].createElement('div', { className: 'foo bar' }), _react2['default'].createElement('div', { className: 'foo baz' }) )); var spy = _sinon2['default'].spy(function (n) { return n + 1; }); wrapper.find('.foo').reduce(spy, 0); (0, _chai.expect)(spy.callCount).to.equal(3); (0, _chai.expect)(spy.args[0][1]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[0][1].hasClass('bax')).to.be['true']; (0, _chai.expect)(spy.args[1][1]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[1][1].hasClass('bar')).to.be['true']; (0, _chai.expect)(spy.args[2][1]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[2][1].hasClass('baz')).to.be['true']; }); it('should accumulate a value', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { id: 'bax', className: 'foo qoo' }), _react2['default'].createElement('div', { id: 'bar', className: 'foo boo' }), _react2['default'].createElement('div', { id: 'baz', className: 'foo hoo' }) )); var result = wrapper.find('.foo').reduce(function (obj, n) { obj[n.prop('id')] = n.prop('className'); return obj; }, {}); (0, _chai.expect)(result).to.eql({ bax: 'foo qoo', bar: 'foo boo', baz: 'foo hoo' }); }); }); describe('.reduceRight(fn[, initialValue])', function () { it('should call a function with a wrapper for each node in the wrapper in reverse', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'foo bax' }), _react2['default'].createElement('div', { className: 'foo bar' }), _react2['default'].createElement('div', { className: 'foo baz' }) )); var spy = _sinon2['default'].spy(function (n) { return n + 1; }); wrapper.find('.foo').reduceRight(spy, 0); (0, _chai.expect)(spy.callCount).to.equal(3); (0, _chai.expect)(spy.args[0][1]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[0][1].hasClass('baz')).to.be['true']; (0, _chai.expect)(spy.args[1][1]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[1][1].hasClass('bar')).to.be['true']; (0, _chai.expect)(spy.args[2][1]).to.be.instanceOf(_.ShallowWrapper); (0, _chai.expect)(spy.args[2][1].hasClass('bax')).to.be['true']; }); it('should accumulate a value', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { id: 'bax', className: 'foo qoo' }), _react2['default'].createElement('div', { id: 'bar', className: 'foo boo' }), _react2['default'].createElement('div', { id: 'baz', className: 'foo hoo' }) )); var result = wrapper.find('.foo').reduceRight(function (obj, n) { obj[n.prop('id')] = n.prop('className'); return obj; }, {}); (0, _chai.expect)(result).to.eql({ bax: 'foo qoo', bar: 'foo boo', baz: 'foo hoo' }); }); }); describe('.some(selector)', function () { it('should return if a node matches a selector', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'foo qoo' }), _react2['default'].createElement('div', { className: 'foo boo' }), _react2['default'].createElement('div', { className: 'foo hoo' }) )); (0, _chai.expect)(wrapper.find('.foo').some('.qoo')).to.be['true']; (0, _chai.expect)(wrapper.find('.foo').some('.foo')).to.be['true']; (0, _chai.expect)(wrapper.find('.foo').some('.bar')).to.be['false']; }); }); describe('.someWhere(predicate)', function () { it('should return if a node matches a predicate', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'foo qoo' }), _react2['default'].createElement('div', { className: 'foo boo' }), _react2['default'].createElement('div', { className: 'foo hoo' }) )); (0, _chai.expect)(wrapper.find('.foo').someWhere(function (n) { return n.hasClass('qoo'); })).to.be['true']; (0, _chai.expect)(wrapper.find('.foo').someWhere(function (n) { return n.hasClass('foo'); })).to.be['true']; (0, _chai.expect)(wrapper.find('.foo').someWhere(function (n) { return n.hasClass('bar'); })).to.be['false']; }); }); describe('.every(selector)', function () { it('should return if every node matches a selector', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'foo qoo' }), _react2['default'].createElement('div', { className: 'foo boo' }), _react2['default'].createElement('div', { className: 'foo hoo' }) )); (0, _chai.expect)(wrapper.find('.foo').every('.foo')).to.be['true']; (0, _chai.expect)(wrapper.find('.foo').every('.qoo')).to.be['false']; (0, _chai.expect)(wrapper.find('.foo').every('.bar')).to.be['false']; }); }); describe('.everyWhere(predicate)', function () { it('should return if every node matches a predicate', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'foo qoo' }), _react2['default'].createElement('div', { className: 'foo boo' }), _react2['default'].createElement('div', { className: 'foo hoo' }) )); (0, _chai.expect)(wrapper.find('.foo').everyWhere(function (n) { return n.hasClass('foo'); })).to.be['true']; (0, _chai.expect)(wrapper.find('.foo').everyWhere(function (n) { return n.hasClass('qoo'); })).to.be['false']; (0, _chai.expect)(wrapper.find('.foo').everyWhere(function (n) { return n.hasClass('bar'); })).to.be['false']; }); }); describe('.flatMap(fn)', function () { it('should return a wrapper with the mapped and flattened nodes', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement( 'div', { className: 'foo' }, _react2['default'].createElement('div', { className: 'bar' }), _react2['default'].createElement('div', { className: 'bar' }) ), _react2['default'].createElement( 'div', { className: 'foo' }, _react2['default'].createElement('div', { className: 'baz' }), _react2['default'].createElement('div', { className: 'baz' }) ), _react2['default'].createElement( 'div', { className: 'foo' }, _react2['default'].createElement('div', { className: 'bax' }), _react2['default'].createElement('div', { className: 'bax' }) ) )); var nodes = wrapper.find('.foo').flatMap(function (w) { return w.children().nodes; }); (0, _chai.expect)(nodes.length).to.equal(6); (0, _chai.expect)(nodes.at(0).hasClass('bar')).to.be['true']; (0, _chai.expect)(nodes.at(1).hasClass('bar')).to.be['true']; (0, _chai.expect)(nodes.at(2).hasClass('baz')).to.be['true']; (0, _chai.expect)(nodes.at(3).hasClass('baz')).to.be['true']; (0, _chai.expect)(nodes.at(4).hasClass('bax')).to.be['true']; (0, _chai.expect)(nodes.at(5).hasClass('bax')).to.be['true']; }); }); describe('.shallow()', function () { it('should return a shallow rendered instance of the current node', function () { var Bar = (function (_React$Component14) { _inherits(Bar, _React$Component14); function Bar() { _classCallCheck(this, Bar); _get(Object.getPrototypeOf(Bar.prototype), 'constructor', this).apply(this, arguments); } _createClass(Bar, [{ key: 'render', value: function render() { return _react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'in-bar' }) ); } }]); return Bar; })(_react2['default'].Component); var Foo = (function (_React$Component15) { _inherits(Foo, _React$Component15); function Foo() { _classCallCheck(this, Foo); _get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments); } _createClass(Foo, [{ key: 'render', value: function render() { return _react2['default'].createElement( 'div', null, _react2['default'].createElement(Bar, null) ); } }]); return Foo; })(_react2['default'].Component); var wrapper = (0, _.shallow)(_react2['default'].createElement(Foo, null)); (0, _chai.expect)(wrapper.find('.in-bar')).to.have.length(0); (0, _chai.expect)(wrapper.find(Bar)).to.have.length(1); (0, _chai.expect)(wrapper.find(Bar).shallow().find('.in-bar')).to.have.length(1); }); }); describe('.first()', function () { it('should return the first node in the current set', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'bar baz' }), _react2['default'].createElement('div', { className: 'bar' }), _react2['default'].createElement('div', { className: 'bar' }), _react2['default'].createElement('div', { className: 'bar' }) )); (0, _chai.expect)(wrapper.find('.bar').first().hasClass('baz')).to.be['true']; }); }); describe('.last()', function () { it('should return the last node in the current set', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'bar' }), _react2['default'].createElement('div', { className: 'bar' }), _react2['default'].createElement('div', { className: 'bar' }), _react2['default'].createElement('div', { className: 'bar baz' }) )); (0, _chai.expect)(wrapper.find('.bar').last().hasClass('baz')).to.be['true']; }); }); describe('.isEmpty()', function () { it('should return true iff wrapper is empty', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement('div', { className: 'foo' })); (0, _chai.expect)(wrapper.find('.bar').isEmpty()).to.be['true']; (0, _chai.expect)(wrapper.find('.foo').isEmpty()).to.be['false']; }); }); describe('.at(index)', function () { it('gets a wrapper of the node at the specified index', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'bar foo' }), _react2['default'].createElement('div', { className: 'bar bax' }), _react2['default'].createElement('div', { className: 'bar bux' }), _react2['default'].createElement('div', { className: 'bar baz' }) )); (0, _chai.expect)(wrapper.find('.bar').at(0).hasClass('foo')).to.be['true']; (0, _chai.expect)(wrapper.find('.bar').at(1).hasClass('bax')).to.be['true']; (0, _chai.expect)(wrapper.find('.bar').at(2).hasClass('bux')).to.be['true']; (0, _chai.expect)(wrapper.find('.bar').at(3).hasClass('baz')).to.be['true']; }); }); describe('.get(index)', function () { it('gets the node at the specified index', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', null, _react2['default'].createElement('div', { className: 'bar foo' }), _react2['default'].createElement('div', { className: 'bar bax' }), _react2['default'].createElement('div', { className: 'bar bux' }), _react2['default'].createElement('div', { className: 'bar baz' }) )); (0, _chai.expect)(wrapper.find('.bar').get(0)).to.equal(wrapper.find('.foo').node); (0, _chai.expect)(wrapper.find('.bar').get(1)).to.equal(wrapper.find('.bax').node); (0, _chai.expect)(wrapper.find('.bar').get(2)).to.equal(wrapper.find('.bux').node); (0, _chai.expect)(wrapper.find('.bar').get(3)).to.equal(wrapper.find('.baz').node); }); }); describe('.debug()', function () { it('should pass through to the debugNodes function', function () { (0, _chai.expect)((0, _.shallow)(_react2['default'].createElement('div', null)).debug()).to.equal('<div />'); }); }); describe('.html()', function () { it('should return html of straight DOM elements', function () { var wrapper = (0, _.shallow)(_react2['default'].createElement( 'div', { className: 'test' }, _react2['default'].createElement( 'span', null, 'Hello World!' ) )); (0, _chai.expect)(wrapper.html()).to.equal('<div class="test"><span>Hello World!</span></div>'); }); it('should render out nested composite components', function () { var Foo = (function (_React$Component16) { _inherits(Foo, _React$Component16); function Foo() { _classCallCheck(this, Foo); _get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments); } _createClass(Foo, [{ key: 'render', value: function render() { return _react2['default'].createElement('div', { className: 'in-foo' }); } }]); return Foo; })(_react2['default'].Component); var Bar = (function (_React$Component17) { _inherits(Bar, _React$Component17); function Bar() { _classCallCheck(this, Bar); _get(Object.getPrototypeOf(Bar.prototype), 'constructor', this).apply(this, arguments); } _createClass(Bar, [{ key: 'render', value: function render() { return _react2['default'].createElement( 'div', { className: 'in-bar' }, _react2['default'].createElement(Foo, null) ); } }]); return Bar; })(_react2['default'].Component); var wrapper = (0, _.shallow)(_react2['default'].createElement(Bar, null)); (0, _chai.expect)(wrapper.html()).to.equal('<div class="in-bar"><div class="in-foo"></div></div>'); (0, _chai.expect)(wrapper.find(Foo).html()).to.equal('<div class="in-foo"></div>'); }); }); describe('.render()', function () { it('should return a cheerio wrapper around the current node', function () { var Foo = (function (_React$Component18) { _inherits(Foo, _React$Component18); function Foo() { _classCallCheck(this, Foo); _get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments); } _createClass(Foo, [{ key: 'render', value: function render() { return _react2['default'].createElement('div', { className: 'in-foo' }); } }]); return Foo; })(_react2['default'].Component); var Bar = (function (_React$Component19) { _inherits(Bar, _React$Component19); function Bar() { _classCallCheck(this, Bar); _get(Object.getPrototypeOf(Bar.prototype), 'constructor', this).apply(this, arguments); } _createClass(Bar, [{ key: 'render', value: function render() { return _react2['default'].createElement( 'div', { className: 'in-bar' }, _react2['default'].createElement(Foo, null) ); } }]); return Bar; })(_react2['default'].Component); var wrapper = (0, _.shallow)(_react2['default'].createElement(Bar, null)); (0, _chai.expect)(wrapper.render().find('.in-bar')).to.have.length(1); var renderedFoo = wrapper.find(Foo).render(); (0, _chai.expect)(renderedFoo.find('.in-foo')).to.have.length(1); (0, _chai.expect)(renderedFoo.find('.in-bar')).to.have.length(0); }); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9sZWxhbmRfcmljaGFyZHNvbi9jb2RlL3JlYWdlbnQvc3JjL19fdGVzdHNfXy9TaGFsbG93V3JhcHBlci1zcGVjLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7cUJBQWtCLE9BQU87Ozs7b0JBQ0YsTUFBTTs7Z0JBQ21CLEtBQUs7O3FCQUNuQyxPQUFPOzs7O0FBR3pCLFFBQVEsQ0FBQyxTQUFTLEVBQUUsWUFBTTs7QUFFeEIsVUFBUSxDQUFDLGlCQUFpQixFQUFFLFlBQU07O0FBRWhDLE1BQUUsQ0FBQyx1Q0FBdUMsRUFBRSxZQUFNO0FBQ2hELFVBQU0sQ0FBQyxHQUFHLDBDQUFLLFNBQVMsRUFBQyxLQUFLLEdBQUcsQ0FBQztBQUNsQyxVQUFNLENBQUMsR0FBRywwQ0FBSyxTQUFTLEVBQUMsS0FBSyxHQUFHLENBQUM7QUFDbEMsVUFBTSxDQUFDLEdBQUcsMENBQUssU0FBUyxFQUFDLEtBQUssR0FBRyxDQUFDO0FBQ2xDLHdCQUFPLGVBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBSyxDQUFDO0FBQzFDLHdCQUFPLGVBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBTSxDQUFDO0tBQzVDLENBQUMsQ0FBQzs7QUFFSCxNQUFFLENBQUMsdUNBQXVDLEVBQUUsWUFBTTtBQUNoRCxVQUFNLE9BQU8sR0FBRyxlQUNkOzs7UUFDRSwwQ0FBSyxTQUFTLEVBQUMsS0FBSyxHQUFHO09BQ25CLENBQ1AsQ0FBQztBQUNGLFVBQU0sQ0FBQyxHQUFHLDBDQUFLLFNBQVMsRUFBQyxLQUFLLEdBQUcsQ0FBQztBQUNsQyx3QkFBTyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBSyxDQUFDO0tBQ3hDLENBQUMsQ0FBQzs7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MENBQUssU0FBUyxFQUFDLFFBQVEsR0FBRyxDQUFFO1dBQ3JDOzs7ZUFIRyxHQUFHO1NBQVMsbUJBQU0sU0FBUzs7VUFLM0IsR0FBRztrQkFBSCxHQUFHOztpQkFBSCxHQUFHO2dDQUFILEdBQUc7O3FDQUFILEdBQUc7OztxQkFBSCxHQUFHOztpQkFDRCxrQkFBRztBQUNQLG1CQUNFOztnQkFBSyxTQUFTLEVBQUMsUUFBUTtjQUNyQixpQ0FBQyxHQUFHLE9BQUc7YUFDSCxDQUNOO1dBQ0g7OztlQVBHLEdBQUc7U0FBUyxtQkFBTSxTQUFTOztBQVNqQyxVQUFNLE9BQU8sR0FBRyxlQUFRLGlDQUFDLEdBQUcsT0FBRyxDQUFDLENBQUM7QUFDakMsd0JBQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNELFVBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDL0Msd0JBQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RELHdCQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN2RCxDQUFDLENBQUM7R0FFSixDQUFDLENBQUM7Q0FFSixDQUFDLENBQUMiLCJmaWxlIjoiL1VzZXJzL2xlbGFuZF9yaWNoYXJkc29uL2NvZGUvcmVhZ2VudC9zcmMvX190ZXN0c19fL1NoYWxsb3dXcmFwcGVyLXNwZWMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZXhwZWN0IH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQgeyBzaGFsbG93LCByZW5kZXIsIFNoYWxsb3dXcmFwcGVyIH0gZnJvbSAnLi4vJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5cblxuZGVzY3JpYmUoJ3NoYWxsb3cnLCAoKSA9PiB7XG5cbiAgZGVzY3JpYmUoJy5jb250YWlucyhub2RlKScsICgpID0+IHtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgbWF0Y2hlcyBvbiB0aGUgcm9vdCBub2RlJywgKCkgPT4ge1xuICAgICAgY29uc3QgYSA9IDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgLz47XG4gICAgICBjb25zdCBiID0gPGRpdiBjbGFzc05hbWU9XCJmb29cIiAvPjtcbiAgICAgIGNvbnN0IGMgPSA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+O1xuICAgICAgZXhwZWN0KHNoYWxsb3coYSkuY29udGFpbnMoYikpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc2hhbGxvdyhhKS5jb250YWlucyhjKSkudG8uYmUuZmFsc2U7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IG1hdGNoZXMgb24gYSBuZXN0ZWQgbm9kZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgY29uc3QgYiA9IDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgLz47XG4gICAgICBleHBlY3Qod3JhcHBlci5jb250YWlucyhiKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWF0Y2ggY29tcG9zaXRlIGNvbXBvbmVudHMnLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICByZW5kZXIoKSB7IHJldHVybiA8ZGl2IC8+OyB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8Rm9vIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGNvbnN0IGIgPSA8Rm9vIC8+O1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY29udGFpbnMoYikpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5maW5kKHNlbGVjdG9yKScsICgpID0+IHtcblxuICAgIGl0KCdzaG91bGQgZmluZCBhbiBlbGVtZW50IGJhc2VkIG9uIGEgY2xhc3MgbmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxpbnB1dCBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykudHlwZSgpKS50by5lcXVhbCgnaW5wdXQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmluZCBhbiBlbGVtZW50IGJhc2VkIG9uIGEgdGFnIG5hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnaW5wdXQnKS5wcm9wcygpLmNsYXNzTmFtZSkudG8uZXF1YWwoJ2ZvbycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmaW5kIGEgY29tcG9uZW50IGJhc2VkIG9uIGEgY29uc3RydWN0b3InLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICByZW5kZXIoKSB7IHJldHVybiA8ZGl2IC8+OyB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8Rm9vIGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoRm9vKS50eXBlKCkpLnRvLmVxdWFsKEZvbyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZpbmQgbXVsdGlwbGUgZWxlbWVudHMgYmFzZWQgb24gYSBjbGFzcyBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykubGVuZ3RoKS50by5lcXVhbCgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmluZCBtdWx0aXBsZSBlbGVtZW50cyBiYXNlZCBvbiBhIHRhZyBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGlucHV0IC8+XG4gICAgICAgICAgPGJ1dHRvbiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCdpbnB1dCcpLmxlbmd0aCkudG8uZXF1YWwoMik7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCdidXR0b24nKS5sZW5ndGgpLnRvLmVxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmaW5kIG11bHRpcGxlIGVsZW1lbnRzIGJhc2VkIG9uIGEgY29uc3RydWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgICA8aW5wdXQgLz5cbiAgICAgICAgICA8YnV0dG9uIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJ2lucHV0JykubGVuZ3RoKS50by5lcXVhbCgyKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJ2J1dHRvbicpLmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIGEgY29tcGxleCBzZWxlY3RvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxpbnB1dCBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICAgIDxpbnB1dCAvPlxuICAgICAgICAgIDxidXR0b24gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KCgpID0+IHdyYXBwZXIuZmluZCgnLmZvbyAuZm9vJykpLnRvLnRocm93O1xuICAgIH0pO1xuXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuZmluZFdoZXJlKHByZWRpY2F0ZSknLCAoKSA9PiB7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbGwgZWxlbWVudHMgZm9yIGEgdHJ1dGh5IHRlc3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgICA8aW5wdXQgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZFdoZXJlKCgpID0+IHRydWUpLmxlbmd0aCkudG8uZXF1YWwoMyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBubyBlbGVtZW50cyBmb3IgYSBmYWxzeSB0ZXN0JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGlucHV0IC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmRXaGVyZSgoKSA9PiBmYWxzZSkubGVuZ3RoKS50by5lcXVhbCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FsbCB0aGUgcHJlZGljYXRlIHdpdGggdGhlIHdyYXBwZWQgbm9kZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhelwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYnV4XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBjb25zdCBzdHViID0gc2lub24uc3R1YigpO1xuICAgICAgc3R1Yi5yZXR1cm5zKHRydWUpO1xuICAgICAgY29uc3Qgc3B5ID0gc2lub24uc3B5KHN0dWIpO1xuICAgICAgd3JhcHBlci5maW5kV2hlcmUoc3B5KTtcbiAgICAgIGV4cGVjdChzcHkuY2FsbENvdW50KS50by5lcXVhbCg0KTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVswXSkudG8uYmUuaW5zdGFuY2VPZihTaGFsbG93V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0pLnRvLmJlLmluc3RhbmNlT2YoU2hhbGxvd1dyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzBdKS50by5iZS5pbnN0YW5jZU9mKFNoYWxsb3dXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1szXVswXSkudG8uYmUuaW5zdGFuY2VPZihTaGFsbG93V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0uaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzBdLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1szXVswXS5oYXNDbGFzcygnYnV4JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5zZXRQcm9wcyhuZXdQcm9wcyknLCAoKSA9PiB7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBwcm9wcyBmb3IgYSBjb21wb25lbnQgbXVsdGlwbGUgdGltZXMnLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmlkfT5cbiAgICAgICAgICAgICAge3RoaXMucHJvcHMuaWR9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyg8Rm9vIGlkPVwiZm9vXCIgLz4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgICB3cmFwcGVyLnNldFByb3BzKHsgaWQ6ICdiYXInLCBmb286ICdibGEnIH0pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBmb3IgbmV3IHJlbmRlcnMnLCAoKSA9PiB7XG5cbiAgICAgIGNvbnN0IHNweSA9IHNpbm9uLnNweSgpO1xuXG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBzcHk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5wcm9wcy5pZH0+XG4gICAgICAgICAgICAgIHt0aGlzLnByb3BzLmlkfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgbmV4dFByb3BzID0geyBpZDogJ2JhcicsIGZvbzogJ2JsYScgfTtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KDxGb28gaWQ9XCJmb29cIiAvPik7XG4gICAgICBleHBlY3Qoc3B5LmNhbGxlZE9uY2UpLnRvLmJlLmZhbHNlO1xuICAgICAgd3JhcHBlci5zZXRQcm9wcyhuZXh0UHJvcHMpO1xuICAgICAgZXhwZWN0KHNweS5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5jYWxsZWRXaXRoKG5leHRQcm9wcykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5zaW11bGF0ZShldmVudE5hbWUsIGRhdGEpJywgKCkgPT4ge1xuXG4gICAgaXQoJ3Nob3VsZCBzaW11bGF0ZSBldmVudHMnLCAoKSA9PiB7XG5cbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSB7IGNvdW50OiAwIH07XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2BjbGlja3MtJHt0aGlzLnN0YXRlLmNvdW50fWB9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHRoaXMuc2V0U3RhdGUoeyBjb3VudDogdGhpcy5zdGF0ZS5jb3VudCArIDEgfSl9XG4gICAgICAgICAgICA+Zm9vPC9hPlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coPEZvbyAvPik7XG5cbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5jbGlja3MtMCcpLmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgICB3cmFwcGVyLnNpbXVsYXRlKCdjbGljaycpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmNsaWNrcy0xJykubGVuZ3RoKS50by5lcXVhbCgxKTtcblxuICAgIH0pO1xuXG5cbiAgICBpdCgnc2hvdWxkIHBhc3MgaW4gZXZlbnQgZGF0YScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNweSA9IHNpbm9uLnNweSgpO1xuICAgICAgY2xhc3MgRm9vIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8YSBvbkNsaWNrPXtzcHl9PmZvbzwvYT5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KDxGb28gLz4pO1xuICAgICAgY29uc3QgYSA9IHt9O1xuICAgICAgY29uc3QgYiA9IHt9O1xuXG4gICAgICB3cmFwcGVyLnNpbXVsYXRlKCdjbGljaycsIGEsIGIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzBdKS50by5lcXVhbChhKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVsxXSkudG8uZXF1YWwoYik7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5zZXRTdGF0ZShuZXdTdGF0ZSknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgdGhlIHN0YXRlIG9mIHRoZSByb290IG5vZGUnLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgICB0aGlzLnN0YXRlID0geyBpZDogJ2ZvbycgfTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLnN0YXRlLmlkfS8+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coPEZvbyAvPik7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykubGVuZ3RoKS50by5lcXVhbCgxKTtcbiAgICAgIHdyYXBwZXIuc2V0U3RhdGUoeyBpZDogJ2JhcicgfSk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykubGVuZ3RoKS50by5lcXVhbCgxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5pcyhzZWxlY3RvciknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHNlbGVjdG9yIG1hdGNoZXMgY3VycmVudCBlbGVtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyIGJhelwiIC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmlzKCcuZm9vJykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IGZvciBjb21wb3VuZCBzZWxlY3RvcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyg8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXIgYmF6XCIgLz4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuaXMoJy5mb28uYmFyJykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHNlbGVjdG9yIGRvZXMgbm90IG1hdGNoJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF6XCIgLz4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuaXMoJy5mb28nKSkudG8uYmUuZmFsc2U7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcubm90KHNlbGVjdG9yKScsICgpID0+IHtcbiAgICBpdCgnZmlsdGVycyB0byB0aGluZ3Mgbm90IG1hdGNoaW5nIGEgc2VsZWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXIgYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykubm90KCcuYmFyJykubGVuZ3RoKS50by5lcXVhbCgxKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXonKS5ub3QoJy5mb28nKS5sZW5ndGgpLnRvLmVxdWFsKDIpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLm5vdCgnZGl2JykubGVuZ3RoKS50by5lcXVhbCgwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5maWx0ZXIoc2VsZWN0b3IpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgbmV3IHdyYXBwZXIgb2YganVzdCB0aGUgbm9kZXMgdGhhdCBtYXRjaGVkIHRoZSBzZWxlY3RvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhciBiYXpcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhciBiYXpcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhciBiYXpcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXJcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5maWx0ZXIoJy5iYXInKS5sZW5ndGgpLnRvLmVxdWFsKDMpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmZpbHRlcignLmZvbycpLmxlbmd0aCkudG8uZXF1YWwoMyk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykuZmlsdGVyKCcuYmF4JykubGVuZ3RoKS50by5lcXVhbCgwKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5maWx0ZXIoJy5iYXouYmFyJykubGVuZ3RoKS50by5lcXVhbCgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgb25seSBsb29rIGluIHRoZSBjdXJyZW50IHdyYXBwZXJzIG5vZGVzLCBub3QgdGhlaXIgY2hpbGRyZW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhclwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLmZpbHRlcignLmJhcicpLmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuZmlsdGVyV2hlcmUocHJlZGljYXRlKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGZpbHRlciBvbmx5IHRoZSBub2RlcyBvZiB0aGUgd3JhcHBlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBidXhcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN0dWIgPSBzaW5vbi5zdHViKCk7XG4gICAgICBzdHViLm9uQ2FsbCgwKS5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIHN0dWIub25DYWxsKDEpLnJldHVybnModHJ1ZSk7XG4gICAgICBzdHViLm9uQ2FsbCgyKS5yZXR1cm5zKGZhbHNlKTtcblxuICAgICAgY29uc3QgYmF6ID0gd3JhcHBlci5maW5kKCcuZm9vJykuZmlsdGVyV2hlcmUoc3R1Yik7XG4gICAgICBleHBlY3QoYmF6Lmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgICBleHBlY3QoYmF6Lmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FsbCB0aGUgcHJlZGljYXRlIHdpdGggdGhlIHdyYXBwZWQgbm9kZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhelwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYnV4XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBjb25zdCBzdHViID0gc2lub24uc3R1YigpO1xuICAgICAgc3R1Yi5yZXR1cm5zKHRydWUpO1xuICAgICAgY29uc3Qgc3B5ID0gc2lub24uc3B5KHN0dWIpO1xuICAgICAgd3JhcHBlci5maW5kKCcuZm9vJykuZmlsdGVyV2hlcmUoc3B5KTtcbiAgICAgIGV4cGVjdChzcHkuY2FsbENvdW50KS50by5lcXVhbCgzKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVswXSkudG8uYmUuaW5zdGFuY2VPZihTaGFsbG93V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0pLnRvLmJlLmluc3RhbmNlT2YoU2hhbGxvd1dyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzBdKS50by5iZS5pbnN0YW5jZU9mKFNoYWxsb3dXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVswXS5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0uaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzBdLmhhc0NsYXNzKCdidXgnKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy50ZXh0KCknLCAoKSA9PiB7XG5cbiAgICBjb25zdCBtYXRjaGVzUmVuZGVyID0gZnVuY3Rpb24gbWF0Y2hlc1JlbmRlcihub2RlKSB7XG4gICAgICBjb25zdCBhY3R1YWwgPSBzaGFsbG93KG5vZGUpLnRleHQoKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gcmVuZGVyKG5vZGUpLnRleHQoKTtcbiAgICAgIGV4cGVjdChleHBlY3RlZCkudG8uZXF1YWwoYWN0dWFsKTtcbiAgICB9O1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc2ltcGxlIHRleHQgbm9kZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5zb21lIHRleHQ8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci50ZXh0KCkpLnRvLmVxdWFsKCdzb21lIHRleHQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIG5vZGVzIHdpdGggbWFwcGVkIGNoaWxkcmVuJywgKCkgPT4ge1xuICAgICAgY2xhc3MgRm9vIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5pdGVtcy5tYXAoeD0+eCl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtYXRjaGVzUmVuZGVyKDxGb28gaXRlbXM9e1snYWJjJywgJ2RlZicsICdoaWonXX0gLz4pO1xuICAgICAgbWF0Y2hlc1JlbmRlcihcbiAgICAgICAgPEZvbyBpdGVtcz17W1xuICAgICAgICAgIDxpIGtleT17MX0+YWJjPC9pPixcbiAgICAgICAgICA8aSBrZXk9ezJ9PmRlZjwvaT4sXG4gICAgICAgICAgPGkga2V5PXszfT5oaWo8L2k+LFxuICAgICAgICBdfSAvPlxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGNvbXBvc2l0ZSBjb21wb25lbnRzIGR1bWJseScsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIHJlbmRlcigpIHsgcmV0dXJuIDxkaXYvPjsgfVxuICAgICAgfVxuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPEZvbyAvPlxuICAgICAgICAgIDxkaXY+dGVzdDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci50ZXh0KCkpLnRvLmVxdWFsKCc8Rm9vIC8+dGVzdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgaHRtbCBlbnRpdGllcycsICgpID0+IHtcbiAgICAgIG1hdGNoZXNSZW5kZXIoPGRpdj4mZ3Q7PC9kaXY+KTtcbiAgICB9KTtcblxuICB9KTtcblxuICBkZXNjcmliZSgnLnByb3BzKCknLCAoKSA9PiB7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgcHJvcHMgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgZm4gPSAoKT0+e307XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdiBpZD1cImZvb0lkXCIgY2xhc3NOYW1lPVwiYmF4XCIgb25DbGljaz17Zm59ID5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdCh3cmFwcGVyLnByb3BzKCkuY2xhc3NOYW1lKS50by5lcXVhbCgnYmF4Jyk7XG4gICAgICBleHBlY3Qod3JhcHBlci5wcm9wcygpLm9uQ2xpY2spLnRvLmVxdWFsKGZuKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLnByb3BzKCkuaWQpLnRvLmVxdWFsKCdmb29JZCcpO1xuXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJlIGFsbG93ZWQgdG8gYmUgdXNlZCBvbiBhbiBpbm5lciBub2RlJywgKCkgPT4ge1xuICAgICAgY29uc3QgZm4gPSAoKT0+e307XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIG9uQ2xpY2s9e2ZufSAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgaWQ9XCJmb29JZFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJheicpLnByb3BzKCkub25DbGljaykudG8uZXF1YWwoZm4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLnByb3BzKCkuaWQpLnRvLmVxdWFsKCdmb29JZCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnN0YXRlKG5hbWUpJywgKCkgPT4ge1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHN0YXRlIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSB7IGZvbzogJ2ZvbycgfTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7IHJldHVybiA8ZGl2IC8+OyB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyg8Rm9vIC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLnN0YXRlKCkpLnRvLmVxbCh7IGZvbzogJ2ZvbycgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY3VycmVudCBzdGF0ZSBhZnRlciBzdGF0ZSB0cmFuc2l0aW9ucycsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSB7IGZvbzogJ2ZvbycgfTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7IHJldHVybiA8ZGl2IC8+OyB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyg8Rm9vIC8+KTtcbiAgICAgIHdyYXBwZXIuc2V0U3RhdGUoeyBmb286ICdiYXInIH0pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuc3RhdGUoKSkudG8uZXFsKHsgZm9vOiAnYmFyJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgYSBzdGF0ZSBwcm9wZXJ0eSBuYW1lIGJlIHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudCcsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSB7IGZvbzogJ2ZvbycgfTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7IHJldHVybiA8ZGl2IC8+OyB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyg8Rm9vIC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLnN0YXRlKCdmb28nKSkudG8uZXF1YWwoJ2ZvbycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmNoaWxkcmVuKFtzZWxlY3Rvcl0pJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IHdyYXBwZXIgZm9yIG5vZGUgd2l0aCBubyBjaGlsZHJlbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KDxkaXYgLz4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5sZW5ndGgpLnRvLmVxdWFsKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNoaWxkcmVuIG5vZGVzIG9mIHRoZSByb290JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkubGVuZ3RoKS50by5lcXVhbCgzKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkuYXQoMCkuaGFzQ2xhc3MoJ2ZvbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5hdCgxKS5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5jaGlsZHJlbigpLmF0KDIpLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJldHVybiBhbnkgb2YgdGhlIGNoaWxkcmVuIG9mIGNoaWxkcmVuJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkubGVuZ3RoKS50by5lcXVhbCgyKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkuYXQoMCkuaGFzQ2xhc3MoJ2ZvbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5hdCgxKS5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtaXhlZCBjaGlsZHJlbiB3aXRoIGFuZCB3aXRob3V0IGFycmF5cycsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9vXCI+PC9zcGFuPlxuICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5pdGVtcy5tYXAoeD0+eCl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPEZvbyBpdGVtcz17W1xuICAgICAgICAgIDxpIGtleT17MX0gY2xhc3NOYW1lPVwiYmFyXCI+YWJjPC9pPixcbiAgICAgICAgICA8aSBrZXk9ezJ9IGNsYXNzTmFtZT1cImJhelwiPmRlZjwvaT4sXG4gICAgICAgIF19IC8+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5sZW5ndGgpLnRvLmVxdWFsKDMpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5hdCgwKS5oYXNDbGFzcygnZm9vJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5jaGlsZHJlbigpLmF0KDEpLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkuYXQoMikuaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBvcHRpb25hbGx5IGFsbG93IGEgc2VsZWN0b3IgdG8gZmlsdGVyIGJ5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyIGJpcFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXogYmlwXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSB3cmFwcGVyLmNoaWxkcmVuKCcuYmlwJyk7XG4gICAgICBleHBlY3QoY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgyKTtcbiAgICAgIGV4cGVjdChjaGlsZHJlbi5hdCgwKS5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3QoY2hpbGRyZW4uYXQoMSkuaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnBhcmVudHMoW3NlbGVjdG9yXSknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gYXJyYXkgb2YgY3VycmVudCBub2RlcyBhbmNlc3RvcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXpcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgY29uc3QgcGFyZW50cyA9IHdyYXBwZXIuZmluZCgnLmJheicpLnBhcmVudHMoKTtcblxuICAgICAgZXhwZWN0KHBhcmVudHMubGVuZ3RoKS50by5lcXVhbCgzKTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDApLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDEpLmhhc0NsYXNzKCdmb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDIpLmhhc0NsYXNzKCdiYXgnKSkudG8uYmUudHJ1ZTtcblxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB3b3JrIGZvciBub24tbGVhZiBub2RlcyBhcyB3ZWxsJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF4XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHBhcmVudHMgPSB3cmFwcGVyLmZpbmQoJy5iYXInKS5wYXJlbnRzKCk7XG5cbiAgICAgIGV4cGVjdChwYXJlbnRzLmxlbmd0aCkudG8uZXF1YWwoMik7XG4gICAgICBleHBlY3QocGFyZW50cy5hdCgwKS5oYXNDbGFzcygnZm9vJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3QocGFyZW50cy5hdCgxKS5oYXNDbGFzcygnYmF4JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG9wdGlvbmFsbHkgYWxsb3cgYSBzZWxlY3RvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheCBmb29cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXpcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgY29uc3QgcGFyZW50cyA9IHdyYXBwZXIuZmluZCgnLmJheicpLnBhcmVudHMoJy5mb28nKTtcblxuICAgICAgZXhwZWN0KHBhcmVudHMubGVuZ3RoKS50by5lcXVhbCgyKTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDApLmhhc0NsYXNzKCdmb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDEpLmhhc0NsYXNzKCdiYXgnKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5wYXJlbnQoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBvbmx5IHRoZSBpbW1lZGlhdGUgcGFyZW50IG9mIHRoZSBub2RlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF4XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXonKS5wYXJlbnQoKS5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHdvcmsgZm9yIG11bHRpcGxlIG5vZGVzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXpcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF4XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgY29uc3QgcGFyZW50cyA9IHdyYXBwZXIuZmluZCgnLmJheicpLnBhcmVudCgpO1xuICAgICAgZXhwZWN0KHBhcmVudHMpLnRvLmhhdmUubGVuZ3RoKDMpO1xuICAgICAgZXhwZWN0KHBhcmVudHMuYXQoMCkuaGFzQ2xhc3MoJ2ZvbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHBhcmVudHMuYXQoMSkuaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHBhcmVudHMuYXQoMikuaGFzQ2xhc3MoJ2JheCcpKS50by5iZS50cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmNsb3Nlc3Qoc2VsZWN0b3IpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGZvciBhIGdpdmVuIHNlbGVjdG9yJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF6XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBjb25zdCBjbG9zZXN0Rm9vID0gd3JhcHBlci5maW5kKCcuYmFyJykuY2xvc2VzdCgnLmZvbycpO1xuICAgICAgZXhwZWN0KGNsb3Nlc3RGb28uaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KGNsb3Nlc3RGb28ubGVuZ3RoKS50by5lcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgb25seSBldmVyIHJldHVybiBhIHdyYXBwZXIgb2YgYSBzaW5nbGUgbm9kZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmF6JykucGFyZW50KCkuaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gaXRzZWxmIGlmIG1hdGNoaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF4XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYnV4IGJhelwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYnV4JykuY2xvc2VzdCgnLmJheicpLmhhc0NsYXNzKCdidXgnKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5oYXNDbGFzcyhjbGFzc05hbWUpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHdoZXRoZXIgb3Igbm90IG5vZGUgaGFzIGEgY2VydGFpbiBjbGFzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXIgYmF6IHNvbWUtbG9uZy1zdHJpbmcgRm9Pb1wiIC8+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qod3JhcHBlci5oYXNDbGFzcygnZm9vJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5oYXNDbGFzcygnc29tZS1sb25nLXN0cmluZycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuaGFzQ2xhc3MoJ0ZvT28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmhhc0NsYXNzKCdkb2VzbnQtZXhpc3QnKSkudG8uYmUuZmFsc2U7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuZm9yRWFjaChmbiknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIGEgZnVuY3Rpb24gZm9yIGVhY2ggbm9kZSBpbiB0aGUgd3JhcHBlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJheFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXpcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCBzcHkgPSBzaW5vbi5zcHkoKTtcblxuICAgICAgd3JhcHBlci5maW5kKCcuZm9vJykuZm9yRWFjaChzcHkpO1xuXG4gICAgICBleHBlY3Qoc3B5LmNhbGxDb3VudCkudG8uZXF1YWwoMyk7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMF1bMF0pLnRvLmJlLmluc3RhbmNlT2YoU2hhbGxvd1dyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzBdLmhhc0NsYXNzKCdiYXgnKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1sxXVswXSkudG8uYmUuaW5zdGFuY2VPZihTaGFsbG93V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0uaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzBdKS50by5iZS5pbnN0YW5jZU9mKFNoYWxsb3dXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVswXS5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcubWFwKGZuKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgYSBmdW5jdGlvbiB3aXRoIGEgd3JhcHBlciBmb3IgZWFjaCBub2RlIGluIHRoZSB3cmFwcGVyJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF4XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhelwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNweSA9IHNpbm9uLnNweSgpO1xuXG4gICAgICB3cmFwcGVyLmZpbmQoJy5mb28nKS5tYXAoc3B5KTtcblxuICAgICAgZXhwZWN0KHNweS5jYWxsQ291bnQpLnRvLmVxdWFsKDMpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzBdKS50by5iZS5pbnN0YW5jZU9mKFNoYWxsb3dXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVswXS5oYXNDbGFzcygnYmF4JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0pLnRvLmJlLmluc3RhbmNlT2YoU2hhbGxvd1dyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzFdWzBdLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVswXSkudG8uYmUuaW5zdGFuY2VPZihTaGFsbG93V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMl1bMF0uaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUgbWFwcGVkIHZhbHVlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJheFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXpcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCByZXN1bHQgPSB3cmFwcGVyLmZpbmQoJy5mb28nKS5tYXAodyA9PiB3LnByb3BzKCkuY2xhc3NOYW1lKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZXFsKFtcbiAgICAgICAgJ2ZvbyBiYXgnLFxuICAgICAgICAnZm9vIGJhcicsXG4gICAgICAgICdmb28gYmF6JyxcbiAgICAgIF0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnJlZHVjZShmblssIGluaXRpYWxWYWx1ZV0pJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY2FsbCBhIGZ1bmN0aW9uIHdpdGggYSB3cmFwcGVyIGZvciBlYWNoIG5vZGUgaW4gdGhlIHdyYXBwZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXhcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF6XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgY29uc3Qgc3B5ID0gc2lub24uc3B5KG4gPT4gbiArIDEpO1xuXG4gICAgICB3cmFwcGVyLmZpbmQoJy5mb28nKS5yZWR1Y2Uoc3B5LCAwKTtcblxuICAgICAgZXhwZWN0KHNweS5jYWxsQ291bnQpLnRvLmVxdWFsKDMpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzFdKS50by5iZS5pbnN0YW5jZU9mKFNoYWxsb3dXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVsxXS5oYXNDbGFzcygnYmF4JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMV0pLnRvLmJlLmluc3RhbmNlT2YoU2hhbGxvd1dyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzFdWzFdLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVsxXSkudG8uYmUuaW5zdGFuY2VPZihTaGFsbG93V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMl1bMV0uaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2N1bXVsYXRlIGEgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwiYmF4XCIgY2xhc3NOYW1lPVwiZm9vIHFvb1wiIC8+XG4gICAgICAgICAgPGRpdiBpZD1cImJhclwiIGNsYXNzTmFtZT1cImZvbyBib29cIiAvPlxuICAgICAgICAgIDxkaXYgaWQ9XCJiYXpcIiBjbGFzc05hbWU9XCJmb28gaG9vXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgY29uc3QgcmVzdWx0ID0gd3JhcHBlci5maW5kKCcuZm9vJykucmVkdWNlKFxuICAgICAgICAob2JqLCBuKSA9PiB7XG4gICAgICAgICAgb2JqW24ucHJvcCgnaWQnKV0gPSBuLnByb3AoJ2NsYXNzTmFtZScpO1xuICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50by5lcWwoe1xuICAgICAgICBiYXg6ICdmb28gcW9vJyxcbiAgICAgICAgYmFyOiAnZm9vIGJvbycsXG4gICAgICAgIGJhejogJ2ZvbyBob28nLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcucmVkdWNlUmlnaHQoZm5bLCBpbml0aWFsVmFsdWVdKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgYSBmdW5jdGlvbiB3aXRoIGEgd3JhcHBlciBmb3IgZWFjaCBub2RlIGluIHRoZSB3cmFwcGVyIGluIHJldmVyc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXhcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF6XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgY29uc3Qgc3B5ID0gc2lub24uc3B5KG4gPT4gbiArIDEpO1xuXG4gICAgICB3cmFwcGVyLmZpbmQoJy5mb28nKS5yZWR1Y2VSaWdodChzcHksIDApO1xuXG4gICAgICBleHBlY3Qoc3B5LmNhbGxDb3VudCkudG8uZXF1YWwoMyk7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMF1bMV0pLnRvLmJlLmluc3RhbmNlT2YoU2hhbGxvd1dyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzFdLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1sxXVsxXSkudG8uYmUuaW5zdGFuY2VPZihTaGFsbG93V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMV0uaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzFdKS50by5iZS5pbnN0YW5jZU9mKFNoYWxsb3dXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVsxXS5oYXNDbGFzcygnYmF4JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY3VtdWxhdGUgYSB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgaWQ9XCJiYXhcIiBjbGFzc05hbWU9XCJmb28gcW9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGlkPVwiYmFyXCIgY2xhc3NOYW1lPVwiZm9vIGJvb1wiIC8+XG4gICAgICAgICAgPGRpdiBpZD1cImJhelwiIGNsYXNzTmFtZT1cImZvbyBob29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCByZXN1bHQgPSB3cmFwcGVyLmZpbmQoJy5mb28nKS5yZWR1Y2VSaWdodChcbiAgICAgICAgKG9iaiwgbikgPT4ge1xuICAgICAgICAgIG9ialtuLnByb3AoJ2lkJyldID0gbi5wcm9wKCdjbGFzc05hbWUnKTtcbiAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZXFsKHtcbiAgICAgICAgYmF4OiAnZm9vIHFvbycsXG4gICAgICAgIGJhcjogJ2ZvbyBib28nLFxuICAgICAgICBiYXo6ICdmb28gaG9vJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnNvbWUoc2VsZWN0b3IpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGlmIGEgbm9kZSBtYXRjaGVzIGEgc2VsZWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBxb29cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gaG9vXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLnNvbWUoJy5xb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5zb21lKCcuZm9vJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuc29tZSgnLmJhcicpKS50by5iZS5mYWxzZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5zb21lV2hlcmUocHJlZGljYXRlKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBpZiBhIG5vZGUgbWF0Y2hlcyBhIHByZWRpY2F0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIHFvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBob29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuc29tZVdoZXJlKG4gPT4gbi5oYXNDbGFzcygncW9vJykpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLnNvbWVXaGVyZShuID0+IG4uaGFzQ2xhc3MoJ2ZvbycpKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5zb21lV2hlcmUobiA9PiBuLmhhc0NsYXNzKCdiYXInKSkpLnRvLmJlLmZhbHNlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmV2ZXJ5KHNlbGVjdG9yKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBpZiBldmVyeSBub2RlIG1hdGNoZXMgYSBzZWxlY3RvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIHFvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBob29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuZXZlcnkoJy5mb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5ldmVyeSgnLnFvbycpKS50by5iZS5mYWxzZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5ldmVyeSgnLmJhcicpKS50by5iZS5mYWxzZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5ldmVyeVdoZXJlKHByZWRpY2F0ZSknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gaWYgZXZlcnkgbm9kZSBtYXRjaGVzIGEgcHJlZGljYXRlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gcW9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBib29cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGhvb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5ldmVyeVdoZXJlKG4gPT4gbi5oYXNDbGFzcygnZm9vJykpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLmV2ZXJ5V2hlcmUobiA9PiBuLmhhc0NsYXNzKCdxb28nKSkpLnRvLmJlLmZhbHNlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLmV2ZXJ5V2hlcmUobiA9PiBuLmhhc0NsYXNzKCdiYXInKSkpLnRvLmJlLmZhbHNlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmZsYXRNYXAoZm4pJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgd3JhcHBlciB3aXRoIHRoZSBtYXBwZWQgYW5kIGZsYXR0ZW5lZCBub2RlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXhcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXhcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IG5vZGVzID0gd3JhcHBlci5maW5kKCcuZm9vJykuZmxhdE1hcCh3ID0+IHcuY2hpbGRyZW4oKS5ub2Rlcyk7XG5cbiAgICAgIGV4cGVjdChub2Rlcy5sZW5ndGgpLnRvLmVxdWFsKDYpO1xuICAgICAgZXhwZWN0KG5vZGVzLmF0KDApLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChub2Rlcy5hdCgxKS5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qobm9kZXMuYXQoMikuaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KG5vZGVzLmF0KDMpLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChub2Rlcy5hdCg0KS5oYXNDbGFzcygnYmF4JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qobm9kZXMuYXQoNSkuaGFzQ2xhc3MoJ2JheCcpKS50by5iZS50cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnNoYWxsb3coKScsICgpID0+IHtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgc2hhbGxvdyByZW5kZXJlZCBpbnN0YW5jZSBvZiB0aGUgY3VycmVudCBub2RlJywgKCkgPT4ge1xuICAgICAgY2xhc3MgQmFyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImluLWJhclwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxCYXIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KDxGb28gLz4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmluLWJhcicpKS50by5oYXZlLmxlbmd0aCgwKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoQmFyKSkudG8uaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKEJhcikuc2hhbGxvdygpLmZpbmQoJy5pbi1iYXInKSkudG8uaGF2ZS5sZW5ndGgoMSk7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5maXJzdCgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBmaXJzdCBub2RlIGluIHRoZSBjdXJyZW50IHNldCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyIGJhelwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXInKS5maXJzdCgpLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5sYXN0KCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGxhc3Qgbm9kZSBpbiB0aGUgY3VycmVudCBzZXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyhcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhciBiYXpcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykubGFzdCgpLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5pc0VtcHR5KCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBpZmYgd3JhcHBlciBpcyBlbXB0eScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmlzRW1wdHkoKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5pc0VtcHR5KCkpLnRvLmJlLmZhbHNlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmF0KGluZGV4KScsICgpID0+IHtcbiAgICBpdCgnZ2V0cyBhIHdyYXBwZXIgb2YgdGhlIG5vZGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBzaGFsbG93KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyIGZvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF4XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhciBidXhcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyIGJhelwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXInKS5hdCgwKS5oYXNDbGFzcygnZm9vJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykuYXQoMSkuaGFzQ2xhc3MoJ2JheCcpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmF0KDIpLmhhc0NsYXNzKCdidXgnKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXInKS5hdCgzKS5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuZ2V0KGluZGV4KScsICgpID0+IHtcbiAgICBpdCgnZ2V0cyB0aGUgbm9kZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgZm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhciBiYXhcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyIGJ1eFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF6XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmdldCgwKSkudG8uZXF1YWwod3JhcHBlci5maW5kKCcuZm9vJykubm9kZSk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykuZ2V0KDEpKS50by5lcXVhbCh3cmFwcGVyLmZpbmQoJy5iYXgnKS5ub2RlKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXInKS5nZXQoMikpLnRvLmVxdWFsKHdyYXBwZXIuZmluZCgnLmJ1eCcpLm5vZGUpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmdldCgzKSkudG8uZXF1YWwod3JhcHBlci5maW5kKCcuYmF6Jykubm9kZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuZGVidWcoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHBhc3MgdGhyb3VnaCB0byB0aGUgZGVidWdOb2RlcyBmdW5jdGlvbicsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaGFsbG93KDxkaXYgLz4pLmRlYnVnKCkpLnRvLmVxdWFsKCc8ZGl2IC8+Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuaHRtbCgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGh0bWwgb2Ygc3RyYWlnaHQgRE9NIGVsZW1lbnRzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGVzdFwiPlxuICAgICAgICAgIDxzcGFuPkhlbGxvIFdvcmxkITwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuaHRtbCgpKS50by5lcXVhbChcbiAgICAgICAgYDxkaXYgY2xhc3M9XCJ0ZXN0XCI+PHNwYW4+SGVsbG8gV29ybGQhPC9zcGFuPjwvZGl2PmBcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBvdXQgbmVzdGVkIGNvbXBvc2l0ZSBjb21wb25lbnRzJywgKCkgPT4ge1xuICAgICAgY2xhc3MgRm9vIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9XCJpbi1mb29cIiAvPik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIEJhciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbi1iYXJcIj5cbiAgICAgICAgICAgICAgPEZvbyAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qgd3JhcHBlciA9IHNoYWxsb3coPEJhciAvPik7XG4gICAgICBleHBlY3Qod3JhcHBlci5odG1sKCkpLnRvLmVxdWFsKFxuICAgICAgICBgPGRpdiBjbGFzcz1cImluLWJhclwiPjxkaXYgY2xhc3M9XCJpbi1mb29cIj48L2Rpdj48L2Rpdj5gXG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZChGb28pLmh0bWwoKSkudG8uZXF1YWwoXG4gICAgICAgIGA8ZGl2IGNsYXNzPVwiaW4tZm9vXCI+PC9kaXY+YFxuICAgICAgKTtcbiAgICB9KTtcblxuICB9KTtcblxuICBkZXNjcmliZSgnLnJlbmRlcigpJywgKCkgPT4ge1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBjaGVlcmlvIHdyYXBwZXIgYXJvdW5kIHRoZSBjdXJyZW50IG5vZGUnLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT1cImluLWZvb1wiIC8+KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgQmFyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImluLWJhclwiPlxuICAgICAgICAgICAgICA8Rm9vIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gc2hhbGxvdyg8QmFyIC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLnJlbmRlcigpLmZpbmQoJy5pbi1iYXInKSkudG8uaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCByZW5kZXJlZEZvbyA9IHdyYXBwZXIuZmluZChGb28pLnJlbmRlcigpO1xuICAgICAgZXhwZWN0KHJlbmRlcmVkRm9vLmZpbmQoJy5pbi1mb28nKSkudG8uaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBleHBlY3QocmVuZGVyZWRGb28uZmluZCgnLmluLWJhcicpKS50by5oYXZlLmxlbmd0aCgwKTtcbiAgICB9KTtcblxuICB9KTtcblxufSk7XG4iXX0= |