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 | 15× 17× 2× 17× 14× 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× 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× 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× 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× 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× | '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 _sinon = require('sinon'); var _sinon2 = _interopRequireDefault(_sinon); var _ = require('../'); (0, _.describeWithDOM)('mount', 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, _.mount)(a).contains(b)).to.be['true']; (0, _chai.expect)((0, _.mount)(a).contains(c)).to.be['false']; }); it('should allow matches on a nested node', function () { var wrapper = (0, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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(_.ReactWrapper); (0, _chai.expect)(spy.args[1][0]).to.be.instanceOf(_.ReactWrapper); (0, _chai.expect)(spy.args[2][0]).to.be.instanceOf(_.ReactWrapper); (0, _chai.expect)(spy.args[3][0]).to.be.instanceOf(_.ReactWrapper); (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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_react2['default'].createElement(Foo, null)); wrapper.simulate('click', { someSpecialData: 'foo' }); (0, _chai.expect)(spy.calledOnce).to.be['true']; (0, _chai.expect)(spy.args[0][0].someSpecialData).to.equal('foo'); }); }); 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, _.mount)(_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); }); it('allows setState inside of componentDidMount', function () { // NOTE: this test is a test to ensure that the following issue is // fixed: https://github.com/airbnb/enzyme/issues/27 var MySharona = (function (_React$Component8) { _inherits(MySharona, _React$Component8); function MySharona(props) { _classCallCheck(this, MySharona); _get(Object.getPrototypeOf(MySharona.prototype), 'constructor', this).call(this, props); this.state = { mounted: false }; } _createClass(MySharona, [{ key: 'componentDidMount', value: function componentDidMount() { this.setState({ mounted: true }); } }, { key: 'render', value: function render() { return _react2['default'].createElement( 'div', null, this.state.mounted ? 'a' : 'b' ); } }]); return MySharona; })(_react2['default'].Component); var wrapper = (0, _.mount)(_react2['default'].createElement(MySharona, null)); (0, _chai.expect)(wrapper.find('div').text()).to.equal('a'); }); }); describe('.is(selector)', function () { it('should return true when selector matches current element', function () { var wrapper = (0, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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 wrapper as the first argument', function () { var wrapper = (0, _.mount)(_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(_.ReactWrapper); (0, _chai.expect)(spy.args[1][0]).to.be.instanceOf(_.ReactWrapper); (0, _chai.expect)(spy.args[2][0]).to.be.instanceOf(_.ReactWrapper); (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, _.mount)(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, _.mount)(_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$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, 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 smartly', function () { var Foo = (function (_React$Component10) { _inherits(Foo, _React$Component10); 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, 'foo' ); } }]); return Foo; })(_react2['default'].Component); var wrapper = (0, _.mount)(_react2['default'].createElement( 'div', null, _react2['default'].createElement(Foo, null), _react2['default'].createElement( 'div', null, 'test' ) )); (0, _chai.expect)(wrapper.text()).to.equal('footest'); }); 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, _.mount)(_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, _.mount)(_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$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, _.mount)(_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$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, _.mount)(_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$Component13) { _inherits(Foo, _React$Component13); 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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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$Component14) { _inherits(Foo, _React$Component14); 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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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(_.ReactWrapper); (0, _chai.expect)(spy.args[0][0].hasClass('bax')).to.be['true']; (0, _chai.expect)(spy.args[1][0]).to.be.instanceOf(_.ReactWrapper); (0, _chai.expect)(spy.args[1][0].hasClass('bar')).to.be['true']; (0, _chai.expect)(spy.args[2][0]).to.be.instanceOf(_.ReactWrapper); (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, _.mount)(_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(_.ReactWrapper); (0, _chai.expect)(spy.args[0][0].hasClass('bax')).to.be['true']; (0, _chai.expect)(spy.args[1][0]).to.be.instanceOf(_.ReactWrapper); (0, _chai.expect)(spy.args[1][0].hasClass('bar')).to.be['true']; (0, _chai.expect)(spy.args[2][0]).to.be.instanceOf(_.ReactWrapper); (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, _.mount)(_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, _.mount)(_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(_.ReactWrapper); (0, _chai.expect)(spy.args[0][1].hasClass('bax')).to.be['true']; (0, _chai.expect)(spy.args[1][1]).to.be.instanceOf(_.ReactWrapper); (0, _chai.expect)(spy.args[1][1].hasClass('bar')).to.be['true']; (0, _chai.expect)(spy.args[2][1]).to.be.instanceOf(_.ReactWrapper); (0, _chai.expect)(spy.args[2][1].hasClass('baz')).to.be['true']; }); it('should accumulate a value', function () { var wrapper = (0, _.mount)(_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, _.mount)(_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(_.ReactWrapper); (0, _chai.expect)(spy.args[0][1].hasClass('baz')).to.be['true']; (0, _chai.expect)(spy.args[1][1]).to.be.instanceOf(_.ReactWrapper); (0, _chai.expect)(spy.args[1][1].hasClass('bar')).to.be['true']; (0, _chai.expect)(spy.args[2][1]).to.be.instanceOf(_.ReactWrapper); (0, _chai.expect)(spy.args[2][1].hasClass('bax')).to.be['true']; }); it('should accumulate a value', function () { var wrapper = (0, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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('.first()', function () { it('should return the first node in the current set', function () { var wrapper = (0, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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, _.mount)(_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); }); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9sZWxhbmRfcmljaGFyZHNvbi9jb2RlL3JlYWdlbnQvc3JjL19fdGVzdHNfXy9SZWFjdFdyYXBwZXItc3BlYy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3FCQUFrQixPQUFPOzs7O29CQUNGLE1BQU07O3FCQUNYLE9BQU87Ozs7Z0JBTWxCLEtBQUs7O0FBRVosdUJBQWdCLE9BQU8sRUFBRSxZQUFNOztBQUU3QixVQUFRLENBQUMsaUJBQWlCLEVBQUUsWUFBTTs7QUFFaEMsTUFBRSxDQUFDLHVDQUF1QyxFQUFFLFlBQU07QUFDaEQsVUFBTSxDQUFDLEdBQUcsMENBQUssU0FBUyxFQUFDLEtBQUssR0FBRyxDQUFDO0FBQ2xDLFVBQU0sQ0FBQyxHQUFHLDBDQUFLLFNBQVMsRUFBQyxLQUFLLEdBQUcsQ0FBQztBQUNsQyxVQUFNLENBQUMsR0FBRywwQ0FBSyxTQUFTLEVBQUMsS0FBSyxHQUFHLENBQUM7QUFDbEMsd0JBQU8sYUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFLLENBQUM7QUFDeEMsd0JBQU8sYUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFNLENBQUM7S0FDMUMsQ0FBQyxDQUFDOztBQUVILE1BQUUsQ0FBQyx1Q0FBdUMsRUFBRSxZQUFNO0FBQ2hELFVBQU0sT0FBTyxHQUFHLGFBQ2Q7OztRQUNFLDBDQUFLLFNBQVMsRUFBQyxLQUFLLEdBQUc7T0FDbkIsQ0FDUCxDQUFDO0FBQ0YsVUFBTSxDQUFDLEdBQUcsMENBQUssU0FBUyxFQUFDLEtBQUssR0FBRyxDQUFDO0FBQ2xDLHdCQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFLLENBQUM7S0FDeEMsQ0FBQyxDQUFDOztBQUVILE1B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OztRQUNFOztZQUFLLFNBQVMsRUFBQyxLQUFLO1VBQ2xCLDBDQUFLLFNBQVMsRUFBQyxLQUFLLEdBQUc7VUFDdkIsMENBQUssU0FBUyxFQUFDLEtBQUssR0FBRztTQUNuQjtRQUNOOztZQUFLLFNBQVMsRUFBQyxLQUFLO1VBQ2xCLDBDQUFLLFNBQVMsRUFBQyxLQUFLLEdBQUc7VUFDdkIsMENBQUssU0FBUyxFQUFDLEtBQUssR0FBRztTQUNuQjtRQUNOOztZQUFLLFNBQVMsRUFBQyxLQUFLO1VBQ2xCLDBDQUFLLFNBQVMsRUFBQyxLQUFLLEdBQUc7VUFDdkIsMENBQUssU0FBUyxFQUFDLEtBQUssR0FBRztTQUNuQjtPQUNGLENBQ1AsQ0FBQzs7QUFFRixVQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLENBQUM7ZUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSztPQUFBLENBQUMsQ0FBQzs7QUFFcEUsd0JBQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsd0JBQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFLLENBQUM7QUFDL0Msd0JBQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFLLENBQUM7QUFDL0Msd0JBQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFLLENBQUM7QUFDL0Msd0JBQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFB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R0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hFLHdCQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3pFLENBQUMsQ0FBQztHQUNKLENBQUMsQ0FBQztDQUVKLENBQUMsQ0FBQyIsImZpbGUiOiIvVXNlcnMvbGVsYW5kX3JpY2hhcmRzb24vY29kZS9yZWFnZW50L3NyYy9fX3Rlc3RzX18vUmVhY3RXcmFwcGVyLXNwZWMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZXhwZWN0IH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHtcbiAgbW91bnQsXG4gIHJlbmRlcixcbiAgUmVhY3RXcmFwcGVyLFxuICBkZXNjcmliZVdpdGhET00sXG59IGZyb20gJy4uLyc7XG5cbmRlc2NyaWJlV2l0aERPTSgnbW91bnQnLCAoKSA9PiB7XG5cbiAgZGVzY3JpYmUoJy5jb250YWlucyhub2RlKScsICgpID0+IHtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgbWF0Y2hlcyBvbiB0aGUgcm9vdCBub2RlJywgKCkgPT4ge1xuICAgICAgY29uc3QgYSA9IDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgLz47XG4gICAgICBjb25zdCBiID0gPGRpdiBjbGFzc05hbWU9XCJmb29cIiAvPjtcbiAgICAgIGNvbnN0IGMgPSA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+O1xuICAgICAgZXhwZWN0KG1vdW50KGEpLmNvbnRhaW5zKGIpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KG1vdW50KGEpLmNvbnRhaW5zKGMpKS50by5iZS5mYWxzZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgbWF0Y2hlcyBvbiBhIG5lc3RlZCBub2RlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgY29uc3QgYiA9IDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgLz47XG4gICAgICBleHBlY3Qod3JhcHBlci5jb250YWlucyhiKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWF0Y2ggY29tcG9zaXRlIGNvbXBvbmVudHMnLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICByZW5kZXIoKSB7IHJldHVybiA8ZGl2IC8+OyB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPEZvbyAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCBiID0gPEZvbyAvPjtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNvbnRhaW5zKGIpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuZmluZChzZWxlY3RvciknLCAoKSA9PiB7XG5cbiAgICBpdCgnc2hvdWxkIGZpbmQgYW4gZWxlbWVudCBiYXNlZCBvbiBhIGNsYXNzIG5hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS50eXBlKCkpLnRvLmVxdWFsKCdpbnB1dCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmaW5kIGFuIGVsZW1lbnQgYmFzZWQgb24gYSB0YWcgbmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnaW5wdXQnKS5wcm9wcygpLmNsYXNzTmFtZSkudG8uZXF1YWwoJ2ZvbycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmaW5kIGEgY29tcG9uZW50IGJhc2VkIG9uIGEgY29uc3RydWN0b3InLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICByZW5kZXIoKSB7IHJldHVybiA8ZGl2IC8+OyB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPEZvbyBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKEZvbykudHlwZSgpKS50by5lcXVhbChGb28pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmaW5kIG11bHRpcGxlIGVsZW1lbnRzIGJhc2VkIG9uIGEgY2xhc3MgbmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5sZW5ndGgpLnRvLmVxdWFsKDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmaW5kIG11bHRpcGxlIGVsZW1lbnRzIGJhc2VkIG9uIGEgdGFnIG5hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGlucHV0IC8+XG4gICAgICAgICAgPGJ1dHRvbiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCdpbnB1dCcpLmxlbmd0aCkudG8uZXF1YWwoMik7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCdidXR0b24nKS5sZW5ndGgpLnRvLmVxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmaW5kIG11bHRpcGxlIGVsZW1lbnRzIGJhc2VkIG9uIGEgY29uc3RydWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGlucHV0IC8+XG4gICAgICAgICAgPGJ1dHRvbiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCdpbnB1dCcpLmxlbmd0aCkudG8uZXF1YWwoMik7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCdidXR0b24nKS5sZW5ndGgpLnRvLmVxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBhIGNvbXBsZXggc2VsZWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGlucHV0IC8+XG4gICAgICAgICAgPGJ1dHRvbiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3QoKCkgPT4gd3JhcHBlci5maW5kKCcuZm9vIC5mb28nKSkudG8udGhyb3c7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5maW5kV2hlcmUocHJlZGljYXRlKScsICgpID0+IHtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbCBlbGVtZW50cyBmb3IgYSB0cnV0aHkgdGVzdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgICA8aW5wdXQgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZFdoZXJlKCgpID0+IHRydWUpLmxlbmd0aCkudG8uZXF1YWwoMyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBubyBlbGVtZW50cyBmb3IgYSBmYWxzeSB0ZXN0JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxpbnB1dCBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgICAgIDxpbnB1dCAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kV2hlcmUoKCkgPT4gZmFsc2UpLmxlbmd0aCkudG8uZXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgdGhlIHByZWRpY2F0ZSB3aXRoIHRoZSB3cmFwcGVkIG5vZGUgYXMgdGhlIGZpcnN0IGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBidXhcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN0dWIgPSBzaW5vbi5zdHViKCk7XG4gICAgICBzdHViLnJldHVybnModHJ1ZSk7XG4gICAgICBjb25zdCBzcHkgPSBzaW5vbi5zcHkoc3R1Yik7XG4gICAgICB3cmFwcGVyLmZpbmRXaGVyZShzcHkpO1xuICAgICAgZXhwZWN0KHNweS5jYWxsQ291bnQpLnRvLmVxdWFsKDQpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzBdKS50by5iZS5pbnN0YW5jZU9mKFJlYWN0V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0pLnRvLmJlLmluc3RhbmNlT2YoUmVhY3RXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVswXSkudG8uYmUuaW5zdGFuY2VPZihSZWFjdFdyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzNdWzBdKS50by5iZS5pbnN0YW5jZU9mKFJlYWN0V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0uaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzBdLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1szXVswXS5oYXNDbGFzcygnYnV4JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5zZXRQcm9wcyhuZXdQcm9wcyknLCAoKSA9PiB7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBwcm9wcyBmb3IgYSBjb21wb25lbnQgbXVsdGlwbGUgdGltZXMnLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmlkfT5cbiAgICAgICAgICAgICAge3RoaXMucHJvcHMuaWR9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPEZvbyBpZD1cImZvb1wiIC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5sZW5ndGgpLnRvLmVxdWFsKDEpO1xuICAgICAgd3JhcHBlci5zZXRQcm9wcyh7IGlkOiAnYmFyJywgZm9vOiAnYmxhJ30pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBmb3IgbmV3IHJlbmRlcnMnLCAoKSA9PiB7XG5cbiAgICAgIGNvbnN0IHNweSA9IHNpbm9uLnNweSgpO1xuXG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBzcHk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5wcm9wcy5pZH0+XG4gICAgICAgICAgICAgIHt0aGlzLnByb3BzLmlkfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgbmV4dFByb3BzID0geyBpZDogJ2JhcicsIGZvbzogJ2JsYSd9O1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KDxGb28gaWQ9XCJmb29cIiAvPik7XG4gICAgICBleHBlY3Qoc3B5LmNhbGxlZE9uY2UpLnRvLmJlLmZhbHNlO1xuICAgICAgd3JhcHBlci5zZXRQcm9wcyhuZXh0UHJvcHMpO1xuICAgICAgZXhwZWN0KHNweS5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5jYWxsZWRXaXRoKG5leHRQcm9wcykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5zaW11bGF0ZShldmVudE5hbWUsIGRhdGEpJywgKCkgPT4ge1xuXG4gICAgaXQoJ3Nob3VsZCBzaW11bGF0ZSBldmVudHMnLCAoKSA9PiB7XG5cbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSB7IGNvdW50OiAwIH07XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2BjbGlja3MtJHt0aGlzLnN0YXRlLmNvdW50fWB9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHRoaXMuc2V0U3RhdGUoeyBjb3VudDogdGhpcy5zdGF0ZS5jb3VudCArIDEgfSl9XG4gICAgICAgICAgICAgID5mb288L2E+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPEZvbyAvPik7XG5cbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5jbGlja3MtMCcpLmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgICB3cmFwcGVyLnNpbXVsYXRlKCdjbGljaycpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmNsaWNrcy0xJykubGVuZ3RoKS50by5lcXVhbCgxKTtcblxuICAgIH0pO1xuXG5cbiAgICBpdCgnc2hvdWxkIHBhc3MgaW4gZXZlbnQgZGF0YScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNweSA9IHNpbm9uLnNweSgpO1xuICAgICAgY2xhc3MgRm9vIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8YSBvbkNsaWNrPXtzcHl9PmZvbzwvYT5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudCg8Rm9vIC8+KTtcblxuICAgICAgd3JhcHBlci5zaW11bGF0ZSgnY2xpY2snLCB7IHNvbWVTcGVjaWFsRGF0YTogJ2Zvbyd9KTtcbiAgICAgIGV4cGVjdChzcHkuY2FsbGVkT25jZSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVswXS5zb21lU3BlY2lhbERhdGEpLnRvLmVxdWFsKCdmb28nKTtcbiAgICB9KTtcblxuICB9KTtcblxuICBkZXNjcmliZSgnLnNldFN0YXRlKG5ld1N0YXRlKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHNldCB0aGUgc3RhdGUgb2YgdGhlIHJvb3Qgbm9kZScsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSB7IGlkOiAnZm9vJyB9O1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMuc3RhdGUuaWR9Lz5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPEZvbyAvPik7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykubGVuZ3RoKS50by5lcXVhbCgxKTtcbiAgICAgIHdyYXBwZXIuc2V0U3RhdGUoeyBpZDogJ2JhcicgfSk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykubGVuZ3RoKS50by5lcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbGxvd3Mgc2V0U3RhdGUgaW5zaWRlIG9mIGNvbXBvbmVudERpZE1vdW50JywgKCkgPT4ge1xuICAgICAgLy8gTk9URTogdGhpcyB0ZXN0IGlzIGEgdGVzdCB0byBlbnN1cmUgdGhhdCB0aGUgZm9sbG93aW5nIGlzc3VlIGlzXG4gICAgICAvLyBmaXhlZDogaHR0cHM6Ly9naXRodWIuY29tL2FpcmJuYi9yZWFnZW50L2lzc3Vlcy8yN1xuICAgICAgY2xhc3MgTXlTaGFyb25hIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IHttb3VudGVkOiBmYWxzZX07XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7bW91bnRlZDogdHJ1ZX0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICByZXR1cm4gPGRpdj57dGhpcy5zdGF0ZS5tb3VudGVkID8gJ2EnIDogJ2InfTwvZGl2PjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KDxNeVNoYXJvbmEgLz4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnZGl2JykudGV4dCgpKS50by5lcXVhbCgnYScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmlzKHNlbGVjdG9yKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gc2VsZWN0b3IgbWF0Y2hlcyBjdXJyZW50IGVsZW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyIGJhelwiIC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmlzKCcuZm9vJykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IGZvciBjb21wb3VuZCBzZWxlY3RvcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyIGJhelwiIC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmlzKCcuZm9vLmJhcicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBzZWxlY3RvciBkb2VzIG5vdCBtYXRjaCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudCg8ZGl2IGNsYXNzTmFtZT1cImJhciBiYXpcIiAvPik7XG4gICAgICBleHBlY3Qod3JhcHBlci5pcygnLmZvbycpKS50by5iZS5mYWxzZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5ub3Qoc2VsZWN0b3IpJywgKCkgPT4ge1xuICAgIGl0KCdmaWx0ZXJzIHRvIHRoaW5ncyBub3QgbWF0Y2hpbmcgYSBzZWxlY3RvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXIgYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykubm90KCcuYmFyJykubGVuZ3RoKS50by5lcXVhbCgxKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXonKS5ub3QoJy5mb28nKS5sZW5ndGgpLnRvLmVxdWFsKDIpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLm5vdCgnZGl2JykubGVuZ3RoKS50by5lcXVhbCgwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5maWx0ZXIoc2VsZWN0b3IpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgbmV3IHdyYXBwZXIgb2YganVzdCB0aGUgbm9kZXMgdGhhdCBtYXRjaGVkIHRoZSBzZWxlY3RvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXIgYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF6XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXIgYmF6XCIgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuZmlsdGVyKCcuYmFyJykubGVuZ3RoKS50by5lcXVhbCgzKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXInKS5maWx0ZXIoJy5mb28nKS5sZW5ndGgpLnRvLmVxdWFsKDMpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmZpbHRlcignLmJheCcpLmxlbmd0aCkudG8uZXF1YWwoMCk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuZmlsdGVyKCcuYmF6LmJhcicpLmxlbmd0aCkudG8uZXF1YWwoMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG9ubHkgbG9vayBpbiB0aGUgY3VycmVudCB3cmFwcGVycyBub2Rlcywgbm90IHRoZWlyIGNoaWxkcmVuJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuZmlsdGVyKCcuYmFyJykubGVuZ3RoKS50by5lcXVhbCgxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5maWx0ZXJXaGVyZShwcmVkaWNhdGUpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmlsdGVyIG9ubHkgdGhlIG5vZGVzIG9mIHRoZSB3cmFwcGVyJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBidXhcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN0dWIgPSBzaW5vbi5zdHViKCk7XG4gICAgICBzdHViLm9uQ2FsbCgwKS5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIHN0dWIub25DYWxsKDEpLnJldHVybnModHJ1ZSk7XG4gICAgICBzdHViLm9uQ2FsbCgyKS5yZXR1cm5zKGZhbHNlKTtcblxuICAgICAgY29uc3QgYmF6ID0gd3JhcHBlci5maW5kKCcuZm9vJykuZmlsdGVyV2hlcmUoc3R1Yik7XG4gICAgICBleHBlY3QoYmF6Lmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgICBleHBlY3QoYmF6Lmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FsbCB0aGUgcHJlZGljYXRlIHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIGZpcnN0IGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBidXhcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN0dWIgPSBzaW5vbi5zdHViKCk7XG4gICAgICBzdHViLnJldHVybnModHJ1ZSk7XG4gICAgICBjb25zdCBzcHkgPSBzaW5vbi5zcHkoc3R1Yik7XG4gICAgICB3cmFwcGVyLmZpbmQoJy5mb28nKS5maWx0ZXJXaGVyZShzcHkpO1xuICAgICAgZXhwZWN0KHNweS5jYWxsQ291bnQpLnRvLmVxdWFsKDMpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzBdKS50by5iZS5pbnN0YW5jZU9mKFJlYWN0V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0pLnRvLmJlLmluc3RhbmNlT2YoUmVhY3RXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVswXSkudG8uYmUuaW5zdGFuY2VPZihSZWFjdFdyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzBdLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1sxXVswXS5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMl1bMF0uaGFzQ2xhc3MoJ2J1eCcpKS50by5iZS50cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnRleHQoKScsICgpID0+IHtcblxuICAgIGNvbnN0IG1hdGNoZXNSZW5kZXIgPSBmdW5jdGlvbiBtYXRjaGVzUmVuZGVyKG5vZGUpIHtcbiAgICAgIGNvbnN0IGFjdHVhbCA9IG1vdW50KG5vZGUpLnRleHQoKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gcmVuZGVyKG5vZGUpLnRleHQoKTtcbiAgICAgIGV4cGVjdChleHBlY3RlZCkudG8uZXF1YWwoYWN0dWFsKTtcbiAgICB9O1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc2ltcGxlIHRleHQgbm9kZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+c29tZSB0ZXh0PC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIudGV4dCgpKS50by5lcXVhbCgnc29tZSB0ZXh0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBub2RlcyB3aXRoIG1hcHBlZCBjaGlsZHJlbicsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAge3RoaXMucHJvcHMuaXRlbXMubWFwKHg9PngpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWF0Y2hlc1JlbmRlcig8Rm9vIGl0ZW1zPXtbJ2FiYycsICdkZWYnLCAnaGlqJ119IC8+KTtcbiAgICAgIG1hdGNoZXNSZW5kZXIoXG4gICAgICAgIDxGb28gaXRlbXM9e1tcbiAgICAgICAgICA8aSBrZXk9ezF9PmFiYzwvaT4sXG4gICAgICAgICAgPGkga2V5PXsyfT5kZWY8L2k+LFxuICAgICAgICAgIDxpIGtleT17M30+aGlqPC9pPixcbiAgICAgICAgXX0gLz5cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBjb21wb3NpdGUgY29tcG9uZW50cyBzbWFydGx5JywgKCkgPT4ge1xuICAgICAgY2xhc3MgRm9vIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgcmVuZGVyKCkgeyByZXR1cm4gPGRpdj5mb288L2Rpdj47IH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8Rm9vIC8+XG4gICAgICAgICAgPGRpdj50ZXN0PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLnRleHQoKSkudG8uZXF1YWwoJ2Zvb3Rlc3QnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGh0bWwgZW50aXRpZXMnLCAoKSA9PiB7XG4gICAgICBtYXRjaGVzUmVuZGVyKDxkaXY+Jmd0OzwvZGl2Pik7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5wcm9wcygpJywgKCkgPT4ge1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHByb3BzIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGZuID0gKCk9Pnt9O1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2IGlkPVwiZm9vSWRcIiBjbGFzc05hbWU9XCJiYXhcIiBvbkNsaWNrPXtmbn0gPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHdyYXBwZXIucHJvcHMoKS5jbGFzc05hbWUpLnRvLmVxdWFsKCdiYXgnKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLnByb3BzKCkub25DbGljaykudG8uZXF1YWwoZm4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIucHJvcHMoKS5pZCkudG8uZXF1YWwoJ2Zvb0lkJyk7XG5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYmUgYWxsb3dlZCB0byBiZSB1c2VkIG9uIGFuIGlubmVyIG5vZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmbiA9ICgpPT57fTtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIG9uQ2xpY2s9e2ZufSAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCIgaWQ9XCJmb29JZFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJheicpLnByb3BzKCkub25DbGljaykudG8uZXF1YWwoZm4pO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLnByb3BzKCkuaWQpLnRvLmVxdWFsKCdmb29JZCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnN0YXRlKG5hbWUpJywgKCkgPT4ge1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHN0YXRlIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSB7IGZvbzogJ2ZvbycgfTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7IHJldHVybiA8ZGl2IC8+OyB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPEZvbyAvPik7XG4gICAgICBleHBlY3Qod3JhcHBlci5zdGF0ZSgpKS50by5lcWwoeyBmb286ICdmb28nIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgYWZ0ZXIgc3RhdGUgdHJhbnNpdGlvbnMnLCAoKSA9PiB7XG4gICAgICBjbGFzcyBGb28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgICB0aGlzLnN0YXRlID0geyBmb286ICdmb28nIH07XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkgeyByZXR1cm4gPGRpdiAvPjsgfVxuICAgICAgfVxuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KDxGb28gLz4pO1xuICAgICAgd3JhcHBlci5zZXRTdGF0ZSh7IGZvbzogJ2JhcicgfSk7XG4gICAgICBleHBlY3Qod3JhcHBlci5zdGF0ZSgpKS50by5lcWwoeyBmb286ICdiYXInIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbGxvdyBhIHN0YXRlIHByb3BlcnR5IG5hbWUgYmUgcGFzc2VkIGluIGFzIGFuIGFyZ3VtZW50JywgKCkgPT4ge1xuICAgICAgY2xhc3MgRm9vIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IHsgZm9vOiAnZm9vJyB9O1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHsgcmV0dXJuIDxkaXYgLz47IH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudCg8Rm9vIC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLnN0YXRlKCdmb28nKSkudG8uZXF1YWwoJ2ZvbycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmNoaWxkcmVuKFtzZWxlY3Rvcl0pJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IHdyYXBwZXIgZm9yIG5vZGUgd2l0aCBubyBjaGlsZHJlbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudCg8ZGl2IC8+KTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkubGVuZ3RoKS50by5lcXVhbCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBjaGlsZHJlbiBub2RlcyBvZiB0aGUgcm9vdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5sZW5ndGgpLnRvLmVxdWFsKDMpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5hdCgwKS5oYXNDbGFzcygnZm9vJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5jaGlsZHJlbigpLmF0KDEpLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkuYXQoMikuaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmV0dXJuIGFueSBvZiB0aGUgY2hpbGRyZW4gb2YgY2hpbGRyZW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkubGVuZ3RoKS50by5lcXVhbCgyKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkuYXQoMCkuaGFzQ2xhc3MoJ2ZvbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5hdCgxKS5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtaXhlZCBjaGlsZHJlbiB3aXRoIGFuZCB3aXRob3V0IGFycmF5cycsICgpID0+IHtcbiAgICAgIGNsYXNzIEZvbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9vXCI+PC9zcGFuPlxuICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5pdGVtcy5tYXAoeD0+eCl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxGb28gaXRlbXM9e1tcbiAgICAgICAgICA8aSBrZXk9ezF9IGNsYXNzTmFtZT1cImJhclwiPmFiYzwvaT4sXG4gICAgICAgICAgPGkga2V5PXsyfSBjbGFzc05hbWU9XCJiYXpcIj5kZWY8L2k+LFxuICAgICAgICBdfSAvPlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkubGVuZ3RoKS50by5lcXVhbCgzKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmNoaWxkcmVuKCkuYXQoMCkuaGFzQ2xhc3MoJ2ZvbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY2hpbGRyZW4oKS5hdCgxKS5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5jaGlsZHJlbigpLmF0KDIpLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgb3B0aW9uYWxseSBhbGxvdyBhIHNlbGVjdG9yIHRvIGZpbHRlciBieScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmlwXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheiBiaXBcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHdyYXBwZXIuY2hpbGRyZW4oJy5iaXAnKTtcbiAgICAgIGV4cGVjdChjaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDIpO1xuICAgICAgZXhwZWN0KGNoaWxkcmVuLmF0KDApLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChjaGlsZHJlbi5hdCgxKS5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcucGFyZW50cyhbc2VsZWN0b3JdKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBhcnJheSBvZiBjdXJyZW50IG5vZGVzIGFuY2VzdG9ycycsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXpcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgY29uc3QgcGFyZW50cyA9IHdyYXBwZXIuZmluZCgnLmJheicpLnBhcmVudHMoKTtcblxuICAgICAgZXhwZWN0KHBhcmVudHMubGVuZ3RoKS50by5lcXVhbCgzKTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDApLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDEpLmhhc0NsYXNzKCdmb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDIpLmhhc0NsYXNzKCdiYXgnKSkudG8uYmUudHJ1ZTtcblxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB3b3JrIGZvciBub24tbGVhZiBub2RlcyBhcyB3ZWxsJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBjb25zdCBwYXJlbnRzID0gd3JhcHBlci5maW5kKCcuYmFyJykucGFyZW50cygpO1xuXG4gICAgICBleHBlY3QocGFyZW50cy5sZW5ndGgpLnRvLmVxdWFsKDIpO1xuICAgICAgZXhwZWN0KHBhcmVudHMuYXQoMCkuaGFzQ2xhc3MoJ2ZvbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHBhcmVudHMuYXQoMSkuaGFzQ2xhc3MoJ2JheCcpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBvcHRpb25hbGx5IGFsbG93IGEgc2VsZWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF4IGZvb1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBjb25zdCBwYXJlbnRzID0gd3JhcHBlci5maW5kKCcuYmF6JykucGFyZW50cygnLmZvbycpO1xuXG4gICAgICBleHBlY3QocGFyZW50cy5sZW5ndGgpLnRvLmVxdWFsKDIpO1xuICAgICAgZXhwZWN0KHBhcmVudHMuYXQoMCkuaGFzQ2xhc3MoJ2ZvbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHBhcmVudHMuYXQoMSkuaGFzQ2xhc3MoJ2JheCcpKS50by5iZS50cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnBhcmVudCgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIG9ubHkgdGhlIGltbWVkaWF0ZSBwYXJlbnQgb2YgdGhlIG5vZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF4XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXonKS5wYXJlbnQoKS5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHdvcmsgZm9yIG11bHRpcGxlIG5vZGVzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF6XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXpcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHBhcmVudHMgPSB3cmFwcGVyLmZpbmQoJy5iYXonKS5wYXJlbnQoKTtcbiAgICAgIGV4cGVjdChwYXJlbnRzKS50by5oYXZlLmxlbmd0aCgzKTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDApLmhhc0NsYXNzKCdmb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDEpLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChwYXJlbnRzLmF0KDIpLmhhc0NsYXNzKCdiYXgnKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5jbG9zZXN0KHNlbGVjdG9yKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY2xvc2VzdCBhbmNlc3RvciBmb3IgYSBnaXZlbiBzZWxlY3RvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXpcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmF4XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGNsb3Nlc3RGb28gPSB3cmFwcGVyLmZpbmQoJy5iYXInKS5jbG9zZXN0KCcuZm9vJyk7XG4gICAgICBleHBlY3QoY2xvc2VzdEZvby5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3QoY2xvc2VzdEZvby5sZW5ndGgpLnRvLmVxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBvbmx5IGV2ZXIgcmV0dXJuIGEgd3JhcHBlciBvZiBhIHNpbmdsZSBub2RlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmF6JykucGFyZW50KCkuaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gaXRzZWxmIGlmIG1hdGNoaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhelwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJ1eCBiYXpcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJ1eCcpLmNsb3Nlc3QoJy5iYXonKS5oYXNDbGFzcygnYnV4JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuaGFzQ2xhc3MoY2xhc3NOYW1lKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB3aGV0aGVyIG9yIG5vdCBub2RlIGhhcyBhIGNlcnRhaW4gY2xhc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhciBiYXogc29tZS1sb25nLXN0cmluZyBGb09vXCIgLz5cbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdCh3cmFwcGVyLmhhc0NsYXNzKCdmb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmhhc0NsYXNzKCdzb21lLWxvbmctc3RyaW5nJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5oYXNDbGFzcygnRm9PbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuaGFzQ2xhc3MoJ2RvZXNudC1leGlzdCcpKS50by5iZS5mYWxzZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5mb3JFYWNoKGZuKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgYSBmdW5jdGlvbiBmb3IgZWFjaCBub2RlIGluIHRoZSB3cmFwcGVyJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJheFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXpcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCBzcHkgPSBzaW5vbi5zcHkoKTtcblxuICAgICAgd3JhcHBlci5maW5kKCcuZm9vJykuZm9yRWFjaChzcHkpO1xuXG4gICAgICBleHBlY3Qoc3B5LmNhbGxDb3VudCkudG8uZXF1YWwoMyk7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMF1bMF0pLnRvLmJlLmluc3RhbmNlT2YoUmVhY3RXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVswXS5oYXNDbGFzcygnYmF4JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMF0pLnRvLmJlLmluc3RhbmNlT2YoUmVhY3RXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1sxXVswXS5oYXNDbGFzcygnYmFyJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMl1bMF0pLnRvLmJlLmluc3RhbmNlT2YoUmVhY3RXcmFwcGVyKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVswXS5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcubWFwKGZuKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgYSBmdW5jdGlvbiB3aXRoIGEgd3JhcHBlciBmb3IgZWFjaCBub2RlIGluIHRoZSB3cmFwcGVyJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJheFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXpcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCBzcHkgPSBzaW5vbi5zcHkoKTtcblxuICAgICAgd3JhcHBlci5maW5kKCcuZm9vJykubWFwKHNweSk7XG5cbiAgICAgIGV4cGVjdChzcHkuY2FsbENvdW50KS50by5lcXVhbCgzKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVswXSkudG8uYmUuaW5zdGFuY2VPZihSZWFjdFdyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzBdLmhhc0NsYXNzKCdiYXgnKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1sxXVswXSkudG8uYmUuaW5zdGFuY2VPZihSZWFjdFdyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzFdWzBdLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVswXSkudG8uYmUuaW5zdGFuY2VPZihSZWFjdFdyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzBdLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIG1hcHBlZCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF4XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhelwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHdyYXBwZXIuZmluZCgnLmZvbycpLm1hcCh3ID0+IHcucHJvcHMoKS5jbGFzc05hbWUpO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50by5lcWwoW1xuICAgICAgICAnZm9vIGJheCcsXG4gICAgICAgICdmb28gYmFyJyxcbiAgICAgICAgJ2ZvbyBiYXonLFxuICAgICAgXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcucmVkdWNlKGZuWywgaW5pdGlhbFZhbHVlXSknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIGEgZnVuY3Rpb24gd2l0aCBhIHdyYXBwZXIgZm9yIGVhY2ggbm9kZSBpbiB0aGUgd3JhcHBlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXhcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmF6XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgY29uc3Qgc3B5ID0gc2lub24uc3B5KG4gPT4gbiArIDEpO1xuXG4gICAgICB3cmFwcGVyLmZpbmQoJy5mb28nKS5yZWR1Y2Uoc3B5LCAwKTtcblxuICAgICAgZXhwZWN0KHNweS5jYWxsQ291bnQpLnRvLmVxdWFsKDMpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzFdKS50by5iZS5pbnN0YW5jZU9mKFJlYWN0V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMF1bMV0uaGFzQ2xhc3MoJ2JheCcpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzFdWzFdKS50by5iZS5pbnN0YW5jZU9mKFJlYWN0V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMV1bMV0uaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzFdKS50by5iZS5pbnN0YW5jZU9mKFJlYWN0V3JhcHBlcik7XG4gICAgICBleHBlY3Qoc3B5LmFyZ3NbMl1bMV0uaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2N1bXVsYXRlIGEgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBpZD1cImJheFwiIGNsYXNzTmFtZT1cImZvbyBxb29cIiAvPlxuICAgICAgICAgIDxkaXYgaWQ9XCJiYXJcIiBjbGFzc05hbWU9XCJmb28gYm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGlkPVwiYmF6XCIgY2xhc3NOYW1lPVwiZm9vIGhvb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHdyYXBwZXIuZmluZCgnLmZvbycpLnJlZHVjZShcbiAgICAgICAgKG9iaiwgbikgPT4ge1xuICAgICAgICAgIG9ialtuLnByb3AoJ2lkJyldID0gbi5wcm9wKCdjbGFzc05hbWUnKTtcbiAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZXFsKHtcbiAgICAgICAgYmF4OiAnZm9vIHFvbycsXG4gICAgICAgIGJhcjogJ2ZvbyBib28nLFxuICAgICAgICBiYXo6ICdmb28gaG9vJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnJlZHVjZVJpZ2h0KGZuWywgaW5pdGlhbFZhbHVlXSknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIGEgZnVuY3Rpb24gd2l0aCBhIHdyYXBwZXIgZm9yIGVhY2ggbm9kZSBpbiB0aGUgd3JhcHBlciBpbiByZXZlcnNlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGJheFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBiYXpcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCBzcHkgPSBzaW5vbi5zcHkobiA9PiBuICsgMSk7XG5cbiAgICAgIHdyYXBwZXIuZmluZCgnLmZvbycpLnJlZHVjZVJpZ2h0KHNweSwgMCk7XG5cbiAgICAgIGV4cGVjdChzcHkuY2FsbENvdW50KS50by5lcXVhbCgzKTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1swXVsxXSkudG8uYmUuaW5zdGFuY2VPZihSZWFjdFdyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzBdWzFdLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1sxXVsxXSkudG8uYmUuaW5zdGFuY2VPZihSZWFjdFdyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzFdWzFdLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzcHkuYXJnc1syXVsxXSkudG8uYmUuaW5zdGFuY2VPZihSZWFjdFdyYXBwZXIpO1xuICAgICAgZXhwZWN0KHNweS5hcmdzWzJdWzFdLmhhc0NsYXNzKCdiYXgnKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjdW11bGF0ZSBhIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgaWQ9XCJiYXhcIiBjbGFzc05hbWU9XCJmb28gcW9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGlkPVwiYmFyXCIgY2xhc3NOYW1lPVwiZm9vIGJvb1wiIC8+XG4gICAgICAgICAgPGRpdiBpZD1cImJhelwiIGNsYXNzTmFtZT1cImZvbyBob29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBjb25zdCByZXN1bHQgPSB3cmFwcGVyLmZpbmQoJy5mb28nKS5yZWR1Y2VSaWdodChcbiAgICAgICAgKG9iaiwgbikgPT4ge1xuICAgICAgICAgIG9ialtuLnByb3AoJ2lkJyldID0gbi5wcm9wKCdjbGFzc05hbWUnKTtcbiAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZXFsKHtcbiAgICAgICAgYmF4OiAnZm9vIHFvbycsXG4gICAgICAgIGJhcjogJ2ZvbyBib28nLFxuICAgICAgICBiYXo6ICdmb28gaG9vJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLnNvbWUoc2VsZWN0b3IpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGlmIGEgbm9kZSBtYXRjaGVzIGEgc2VsZWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gcW9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBib29cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGhvb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5zb21lKCcucW9vJykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuc29tZSgnLmZvbycpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLnNvbWUoJy5iYXInKSkudG8uYmUuZmFsc2U7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuc29tZVdoZXJlKHByZWRpY2F0ZSknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gaWYgYSBub2RlIG1hdGNoZXMgYSBwcmVkaWNhdGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gcW9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBib29cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIGhvb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5zb21lV2hlcmUobiA9PiBuLmhhc0NsYXNzKCdxb28nKSkpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuc29tZVdoZXJlKG4gPT4gbi5oYXNDbGFzcygnZm9vJykpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmZvbycpLnNvbWVXaGVyZShuID0+IG4uaGFzQ2xhc3MoJ2JhcicpKSkudG8uYmUuZmFsc2U7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuZXZlcnkoc2VsZWN0b3IpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGlmIGV2ZXJ5IG5vZGUgbWF0Y2hlcyBhIHNlbGVjdG9yJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIHFvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBob29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuZXZlcnkoJy5mb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5ldmVyeSgnLnFvbycpKS50by5iZS5mYWxzZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5ldmVyeSgnLmJhcicpKS50by5iZS5mYWxzZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5ldmVyeVdoZXJlKHByZWRpY2F0ZSknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gaWYgZXZlcnkgbm9kZSBtYXRjaGVzIGEgcHJlZGljYXRlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vIHFvb1wiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb28gYm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbyBob29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuZXZlcnlXaGVyZShuID0+IG4uaGFzQ2xhc3MoJ2ZvbycpKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5ldmVyeVdoZXJlKG4gPT4gbi5oYXNDbGFzcygncW9vJykpKS50by5iZS5mYWxzZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5mb28nKS5ldmVyeVdoZXJlKG4gPT4gbi5oYXNDbGFzcygnYmFyJykpKS50by5iZS5mYWxzZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5mbGF0TWFwKGZuKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIHdyYXBwZXIgd2l0aCB0aGUgbWFwcGVkIGFuZCBmbGF0dGVuZWQgbm9kZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvb1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXpcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXpcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9vXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheFwiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJheFwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcblxuICAgICAgY29uc3Qgbm9kZXMgPSB3cmFwcGVyLmZpbmQoJy5mb28nKS5mbGF0TWFwKHcgPT4gdy5jaGlsZHJlbigpLm5vZGVzKTtcblxuICAgICAgZXhwZWN0KG5vZGVzLmxlbmd0aCkudG8uZXF1YWwoNik7XG4gICAgICBleHBlY3Qobm9kZXMuYXQoMCkuaGFzQ2xhc3MoJ2JhcicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KG5vZGVzLmF0KDEpLmhhc0NsYXNzKCdiYXInKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChub2Rlcy5hdCgyKS5oYXNDbGFzcygnYmF6JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qobm9kZXMuYXQoMykuaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KG5vZGVzLmF0KDQpLmhhc0NsYXNzKCdiYXgnKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChub2Rlcy5hdCg1KS5oYXNDbGFzcygnYmF4JykpLnRvLmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuZmlyc3QoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgY3VycmVudCBzZXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF6XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmZpcnN0KCkuaGFzQ2xhc3MoJ2JheicpKS50by5iZS50cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmxhc3QoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgbGFzdCBub2RlIGluIHRoZSBjdXJyZW50IHNldCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhclwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhciBiYXpcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykubGFzdCgpLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5pc0VtcHR5KCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBpZmYgd3JhcHBlciBpcyBlbXB0eScsICgpID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb29cIiAvPlxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXInKS5pc0VtcHR5KCkpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuZm9vJykuaXNFbXB0eSgpKS50by5iZS5mYWxzZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5hdChpbmRleCknLCAoKSA9PiB7XG4gICAgaXQoJ2dldHMgYSB3cmFwcGVyIG9mIHRoZSBub2RlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgZm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhciBiYXhcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyIGJ1eFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF6XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmF0KDApLmhhc0NsYXNzKCdmb28nKSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXInKS5hdCgxKS5oYXNDbGFzcygnYmF4JykpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykuYXQoMikuaGFzQ2xhc3MoJ2J1eCcpKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmF0KDMpLmhhc0NsYXNzKCdiYXonKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5nZXQoaW5kZXgpJywgKCkgPT4ge1xuICAgIGl0KCdnZXRzIHRoZSBub2RlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgZm9vXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJhciBiYXhcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmFyIGJ1eFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYXIgYmF6XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmdldCgwKSkudG8uZXF1YWwod3JhcHBlci5maW5kKCcuZm9vJykubm9kZSk7XG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKCcuYmFyJykuZ2V0KDEpKS50by5lcXVhbCh3cmFwcGVyLmZpbmQoJy5iYXgnKS5ub2RlKTtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoJy5iYXInKS5nZXQoMikpLnRvLmVxdWFsKHdyYXBwZXIuZmluZCgnLmJ1eCcpLm5vZGUpO1xuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZCgnLmJhcicpLmdldCgzKSkudG8uZXF1YWwod3JhcHBlci5maW5kKCcuYmF6Jykubm9kZSk7XG4gICAgfSk7XG4gIH0pO1xuXG59KTtcbiJdfQ== |