1/******/ (function(modules) { // webpackBootstrap 2/******/ // The module cache 3/******/ var installedModules = {}; 4/******/ 5/******/ // The require function 6/******/ function __webpack_require__(moduleId) { 7/******/ 8/******/ // Check if module is in cache 9/******/ if(installedModules[moduleId]) { 10/******/ return installedModules[moduleId].exports; 11/******/ } 12/******/ // Create a new module (and put it into the cache) 13/******/ var module = installedModules[moduleId] = { 14/******/ i: moduleId, 15/******/ l: false, 16/******/ exports: {} 17/******/ }; 18/******/ 19/******/ // Execute the module function 20/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 21/******/ 22/******/ // Flag the module as loaded 23/******/ module.l = true; 24/******/ 25/******/ // Return the exports of the module 26/******/ return module.exports; 27/******/ } 28/******/ 29/******/ 30/******/ // expose the modules object (__webpack_modules__) 31/******/ __webpack_require__.m = modules; 32/******/ 33/******/ // expose the module cache 34/******/ __webpack_require__.c = installedModules; 35/******/ 36/******/ // define getter function for harmony exports 37/******/ __webpack_require__.d = function(exports, name, getter) { 38/******/ if(!__webpack_require__.o(exports, name)) { 39/******/ Object.defineProperty(exports, name, { 40/******/ configurable: false, 41/******/ enumerable: true, 42/******/ get: getter 43/******/ }); 44/******/ } 45/******/ }; 46/******/ 47/******/ // getDefaultExport function for compatibility with non-harmony modules 48/******/ __webpack_require__.n = function(module) { 49/******/ var getter = module && module.__esModule ? 50/******/ function getDefault() { return module['default']; } : 51/******/ function getModuleExports() { return module; }; 52/******/ __webpack_require__.d(getter, 'a', getter); 53/******/ return getter; 54/******/ }; 55/******/ 56/******/ // Object.prototype.hasOwnProperty.call 57/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 58/******/ 59/******/ // __webpack_public_path__ 60/******/ __webpack_require__.p = "/assets/js"; 61/******/ 62/******/ // Load entry module and return exports 63/******/ return __webpack_require__(__webpack_require__.s = 0); 64/******/ }) 65/************************************************************************/ 66/******/ ([ 67/* 0 */ 68/***/ (function(module, exports, __webpack_require__) { 69 70module.exports = __webpack_require__(1); 71 72 73/***/ }), 74/* 1 */ 75/***/ (function(module, __webpack_exports__, __webpack_require__) { 76 77"use strict"; 78Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); 79/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontend_framework_RwbEventsFormController__ = __webpack_require__(2); 80 81 82(function ($, undefined) { 83 const rwbEventsFormController = new __WEBPACK_IMPORTED_MODULE_0__frontend_framework_RwbEventsFormController__["a" /* default */](); 84 rwbEventsFormController.init(); 85})(window.jQuery); 86 87/***/ }), 88/* 2 */ 89/***/ (function(module, __webpack_exports__, __webpack_require__) { 90 91"use strict"; 92/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__RwbEventsFormView__ = __webpack_require__(3); 93/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js__ = __webpack_require__(6); 94/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js__); 95 96 97/** 98 * Controller takes care to attach and execute any actions triggered on the element and its children 99 */ 100 101class RwbEventsFormController extends __WEBPACK_IMPORTED_MODULE_0__RwbEventsFormView__["a" /* default */] { 102 constructor() { 103 super(); 104 } 105 106 scrollWindow() { 107 if (this.isMobile()) { 108 //seamless.elementScrollBy(window, {left: 0, top: -50}); 109 seamless.windowScrollBy(0, -50); 110 } else { 111 seamless.windowScrollBy(0, -130); //window.scrollBy(0, -130); 112 } 113 } 114 115 scrollWindow2() { 116 if (this.isMobile()) { 117 //seamless.elementScrollBy(window, {left: 0, top: -50}); 118 seamless.windowScrollBy(0, -70); 119 } else { 120 seamless.windowScrollBy(0, -150); //window.scrollBy(0, -130); 121 } 122 } 123 124 fixFullScreen() { 125 // Select the node that will be observed for mutations 126 //const targetNode = document.getElementById('some-id'); 127 if (jQuery('.carousel').length > 0) { 128 const targetNode = document.querySelector('.carousel'); // Options for the observer (which mutations to observe) 129 //const config = { attributes: true, childList: true, subtree: true }; 130 131 const config = { 132 attributes: true, 133 attributeFilter: ['class'] 134 }; // Callback function to execute when mutations are observed 135 136 const callback = function (mutationsList, observer) { 137 // Use traditional 'for loops' for IE 11 138 for (const mutation of mutationsList) { 139 //if (mutation.type === 'attributes') { 140 //console.log('The ' + mutation.attributeName + ' attribute was modified.'); 141 if (mutation.attributeName === 'class' && mutation.target.classList.contains('is-fullscreen')) { 142 jQuery('#header.sticky-header .header-main.sticky').css('z-index', '1'); 143 jQuery('.mapcolumn').css('z-index', '-1'); 144 jQuery('.bprodsearchh').css('z-index', '-1'); 145 } else { 146 jQuery('#header.sticky-header .header-main.sticky').css('z-index', '1001'); 147 jQuery('.bprodsearchh').css('z-index', '4'); 148 jQuery('.mapcolumn').css('z-index', '10000000'); 149 } // } 150 151 } 152 }; // Create an observer instance linked to the callback function 153 154 155 const observer = new MutationObserver(callback); // Start observing the target node for configured mutations 156 157 observer.observe(targetNode, config); 158 } 159 } 160 161 dateRange(startDate, steps = 1) { 162 const dateArray = []; 163 let self = this;
164 let currentDate = new Date(startDate); 165 let maxSteps = 7; 166 167 if (self.isMobile()) { 168 maxSteps = 5; 169 } 170 171 let p = 1; //while (currentDate <= new Date(endDate)) { 172 173 while (true) { 174 dateArray.push(new Date(currentDate)); // Use UTC date to prevent problems with time zones and DST 175 176 currentDate.setUTCDate(currentDate.getUTCDate() + steps); 177 178 if (p >= maxSteps) { 179 break; 180 } 181 182 p++; 183 } 184 185 return dateArray; 186 } 187 188 dateRangePrev(startDate, steps = 1) { 189 const dateArray = []; 190 let self = this; 191 let currentDate = new Date(startDate); 192 let maxSteps = 7; 193 194 if (self.isMobile()) { 195 maxSteps = 5; 196 } 197 198 let p = 1; //while (currentDate <= new Date(endDate)) { 199 200 while (true) { 201 dateArray.push(new Date(currentDate)); // Use UTC date to prevent problems with time zones and DST 202 203 currentDate.setUTCDate(currentDate.getUTCDate() - steps); 204 205 if (p >= maxSteps) { 206 break; 207 } 208 209 p++; 210 } 211 212 return dateArray.reverse(); 213 } 214 215 init() { 216 const self = this; 217 218 if (jQuery('.hotelmapcolumn')) { 219 this.fixFullScreen(); 220 } 221 222 jQuery('.battraction_link').on('click', function () { 223 seamless.elementScrollIntoView(document.querySelector('.bpsmc_wrapper'), { 224 behavior: 'smooth', 225 inline: 'center', 226 block: 'center' 227 }); 228 self.scrollWindow(); 229 }); 230 231 if (this.JBuyTickets().length > 0) { 232 this.hideQtyAddToCart(); 233 this.buyTicketsAction(); 234 } else if (this.JFlatCalendar().length > 0) { 235 if (this.JIsAttraction()) { 236 if (jQuery('.navailable').length > 0) { 237 jQuery('.bpsm_wrapper').closest('.wp-block-qubely-row').remove(); 238 return; 239 } 240 } else { 241 jQuery(window).on('resize scroll', function () { 242 if (jQuery('#tickets_selected').length > 0) { 243 if (self.isInViewport(jQuery('#tickets_selected'))) { 244 // do something 245 jQuery('.bproceed_tickets').hide(); 246 } else { 247 //if (self.isMobile()) { 248 jQuery('.bproceed_tickets').show(); //} 249 } 250 } 251 }); 252 } 253 254 this.JTicketsCart().hide(); 255 this.JPriceMap().hide(); 256 this.JPriceMapSeats().hide(); 257 this.JPriceMapExplanation().hide(); 258 this.JEventsPerDate().hide(); 259 this.JEventSelection().hide(); 260 this.JEventsPerDateBeforeText().hide(); 261 this.JTicketsButtonsCart().hide(); 262 this.JTicketsSelectedCart().hide(); 263 jQuery('body').append(jQuery('<a href="#0" class="bproceed_tickets">Proceed With Tickets<i class="slv slv-arrow-right"></i></a>')); 264 jQuery('.bproceed_tickets').hide(); 265 jQuery('.bproceed_tickets').on('click', function () { 266 jQuery('html,body').animate({ 267 scrollTop: 0 268 }, 'slow'); 269 }); 270 jQuery('.return_to_calendar').on('click', function () { 271 seamless.elementScrollIntoView(document.querySelector('.bpsmc_wrapper'), { 272 behavior: 'smooth', 273 inline: 'center', 274 block: 'center' 275 }); 276 self.scrollWindow(); 277 }); 278 279 if (this.JTheme() === 'light') { 280 this.JBlankSeatsMap().html('<img style="padding:80px;" src="/wp-content/themes/porto/images/no_selection_date_time_light.png"/><h4>Pick a date to see the available tickets</h4>'); 281 } else { 282 this.JBlankSeatsMap().html('<h4>Select a date from the Calendar</h4><img style="padding:80px;" src="/wp-content/themes/porto/images/no_selection_date_time.png"/>'); 283 } 284 285 this.pods = []; 286 this.fromDelete = false; 287 this.initSeatsMap(); 288 } 289 290 this.showPageActions(); 291 this.hotelRoomActions(); 292 293 if (jQuery("#periods").length > 0) { 294 self.fpsearchS = jQuery("#periods").flatpickr({ 295 minDate: "today", 296 disableMobile: true, 297 dateFormat: "D, M d", 298 showMonths: 2 299 }); 300 301 if (self.isMobile()) { 302 self.fpsearchS.set('showMonths', 1); 303 } 304 305 if (self.getParameterByName('searchcalb') !== null) {
306 if (self.JSearchButtonCalendar().length > 0) { 307 let start_date = self.getParameterByName('calstart_date'); //let end_date = self.getParameterByName('calend_date'); 308 309 let scaltype = self.scaltype; 310 let scalcat = self.scalcat; 311 312 if (start_date !== null) { 313 let cDate = new Date(start_date); 314 cDate.setTime(cDate.getTime() + self.getTimezoneInMiliseconds(cDate)); //let cDatee = new Date(end_date); 315 //cDatee.setTime(cDatee.getTime() + self.getTimezoneInMiliseconds(cDatee)); 316 317 self.fpsearchS.setDate(cDate, true); 318 const datesR = self.dateRange(start_date, 1); 319 let today = Date.now(); 320 today = today + new Date().getTimezoneOffset() * 60 * 1000 - today % (3600 * 1000 * 24); 321 322 for (let i = 0; i < datesR.length; i++) { 323 if (self.compare_asc(datesR[i].getTime(), today) < 0) { 324 jQuery('#bcalendar-section').append(jQuery('<div class="cal-card bdisabled" bbdate="' + flatpickr.formatDate(datesR[i], 'Y-m-d') + '"><span class="month">' + flatpickr.formatDate(datesR[i], 'M') + '</span><span class="day">' + flatpickr.formatDate(datesR[i], 'd') + '</span><span class="weekd">' + flatpickr.formatDate(datesR[i], 'D') + '</span></div>')); 325 } else { 326 jQuery('#bcalendar-section').append(jQuery('<div class="cal-card" bbdate="' + flatpickr.formatDate(datesR[i], 'Y-m-d') + '"><span class="month">' + flatpickr.formatDate(datesR[i], 'M') + '</span><span class="day">' + flatpickr.formatDate(datesR[i], 'd') + '</span><span class="weekd">' + flatpickr.formatDate(datesR[i], 'D') + '</span></div>')); 327 } 328 } 329 330 self.cstart_date = start_date; 331 self.cend_date = flatpickr.formatDate(datesR[datesR.length - 1], 'Y-m-d'); 332 jQuery('#cprev_but').on('click', function () { 333 jQuery('#bcalendar-section').html(''); 334 let today = Date.now(); 335 today = today + new Date().getTimezoneOffset() * 60 * 1000 - today % (3600 * 1000 * 24); 336 const datesR1 = self.dateRangePrev(self.cstart_date, 1); 337 self.cstart_date = flatpickr.formatDate(datesR1[0], 'Y-m-d'); 338 self.cend_date = flatpickr.formatDate(datesR1[datesR1.length - 1], 'Y-m-d'); 339 340 for (let i = 0; i < datesR1.length; i++) { 341 if (self.compare_asc(datesR1[i].getTime(), today) < 0) { 342 jQuery('#bcalendar-section').append(jQuery('<div class="cal-card bdisabled" bbdate="' + flatpickr.formatDate(datesR1[i], 'Y-m-d') + '"><span class="month">' + flatpickr.formatDate(datesR1[i], 'M') + '</span><span class="day">' + flatpickr.formatDate(datesR1[i], 'd') + '</span><span class="weekd">' + flatpickr.formatDate(datesR1[i], 'D') + '</span></div>')); 343 } else { 344 jQuery('#bcalendar-section').append(jQuery('<div class="cal-card" bbdate="' + flatpickr.formatDate(datesR1[i], 'Y-m-d') + '"><span class="month">' + flatpickr.formatDate(datesR1[i], 'M') + '</span><span class="day">' + flatpickr.formatDate(datesR1[i], 'd') + '</span><span class="weekd">' + flatpickr.formatDate(datesR1[i], 'D') + '</span></div>')); 345 } 346 } 347 348 jQuery('.cal-card').removeClass('dselected'); 349 jQuery('[bbdate="' + self.dselected + '"]').addClass('dselected'); 350 }); 351 jQuery('#cnext_but').on('click', function () { 352 jQuery('#bcalendar-section').html(''); 353 let today = Date.now(); 354 today = today + new Date().getTimezoneOffset() * 60 * 1000 - today % (3600 * 1000 * 24); 355 const datesR1 = self.dateRange(self.cend_date, 1); 356 self.cstart_date = flatpickr.formatDate(datesR1[0], 'Y-m-d'); 357 self.cend_date = flatpickr.formatDate(datesR1[datesR1.length - 1], 'Y-m-d'); 358 359 for (let i = 0; i < datesR1.length; i++) { 360 if (self.compare_asc(datesR1[i].getTime(), today) < 0) { 361 jQuery('#bcalendar-section').append(jQuery('<div class="cal-card bdisabled" bbdate="' + flatpickr.formatDate(datesR1[i], 'Y-m-d') + '"><span class="month">' + flatpickr.formatDate(datesR1[i], 'M') + '</span><span class="day">' + flatpickr.formatDate(datesR1[i], 'd') + '</span><span class="weekd">' + flatpickr.formatDate(datesR1[i], 'D') + '</span></div>')); 362 } else { 363 jQuery('#bcalendar-section').append(jQuery('<div class="cal-card" bbdate="' + flatpickr.formatDate(datesR1[i], 'Y-m-d') + '"><span class="month">' + flatpickr.formatDate(datesR1[i], 'M') + '</span><span class="day">' + flatpickr.formatDate(datesR1[i], 'd') + '</span><span class="weekd">' + flatpickr.formatDate(datesR1[i], 'D') + '</span></div>')); 364 } 365 } 366 367 jQuery('.cal-card').removeClass('dselected'); 368 jQuery('[bbdate="' + self.dselected + '"]').addClass('dselected'); 369 }); 370 } 371 372 if (start_date !== null) { 373 jQuery('body').on('change', '#scaltype', function () { 374 self.scaltype = jQuery(this).val(); 375 const data = { 376 action: 'cal_selected', 377 start_date: jQuery(this).attr('dddate'), 378 scaltype: self.scaltype, 379 scalcat: self.scalcat, 380 security: jQuery('#rwb_cal_selected_nonce').val() 381 }; 382 jQuery('#bcalendar-section-wrapper').LoadingOverlay("show"); 383 jQuery.ajax({ 384 type: 'POST', 385 dataType: 'json', 386 url: bbLocal.ajax_url, 387 data: data, 388 success: jQuery.proxy(self.calCompleted, self) 389 }); 390 }); 391 jQuery('body').on('change', '#scalcat', function () { 392 self.scalcat = jQuery(this).val(); 393 const data = { 394 action: 'cal_selected', 395 start_date: jQuery(this).attr('dddate'), 396 scaltype: self.scaltype, 397 scalcat: self.scalcat, 398 security: jQuery('#rwb_cal_selected_nonce').val() 399 }; 400 jQuery('#bcalendar-section-wrapper').LoadingOverlay("show"); 401 jQuery.ajax({ 402 type: 'POST', 403 dataType: 'json', 404 url: bbLocal.ajax_url, 405 data: data, 406 success: jQuery.proxy(self.calCompleted, self) 407 }); 408 }); 409 jQuery('body').on('click', '.cal-card', function () { 410 jQuery('#bcalendar-section-wrapper').LoadingOverlay("show"); 411 jQuery('.cal-card').removeClass('dselected'); 412 jQuery(this).addClass('dselected'); 413 self.dselected = jQuery(this).attr('bbdate'); 414 const data = { 415 action: 'cal_selected', 416 start_date: jQuery(this).attr('bbdate'), 417 scaltype: self.scaltype, 418 scalcat: self.scalcat, 419 security: jQuery('#rwb_cal_selected_nonce').val() 420 }; 421 jQuery.ajax({ 422 type: 'POST', 423 dataType: 'json', 424 url: bbLocal.ajax_url, 425 data: data, 426 success: jQuery.proxy(self.calCompleted, self) 427 }); 428 }); 429 430 if (self.dselected == '') { 431 jQuery('[bbdate="' + start_date + '"]').trigger('click'); 432 } 433 434 jQuery('#bcalendar-section-wrapper').css('display', 'grid'); 435 } 436 } 437 } 438
439 if (self.JSearchButtonCalendar().length > 0) { 440 self.JSearchButtonCalendar().on('click', jQuery.proxy(self.searchCalendarButton, self)); 441 } 442 } 443 444 if (jQuery("#period").length > 0) { 445 self.fpsearch = jQuery("#period").flatpickr({ 446 mode: "range", 447 minDate: "today", 448 disableMobile: true, 449 dateFormat: "D, M d", 450 onChange: function (selectedDates, dateStr, instance) { 451 instance.element.value = dateStr.replace('to', '-'); 452 453 if (selectedDates.length === 2) { 454 let diffTime = Math.abs(selectedDates[1] - selectedDates[0]); 455 let diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); 456 let addDays = Math.max(0, 1 - diffDays); 457 458 if (addDays > 0) { 459 selectedDates[1].setDate(selectedDates[1].getDate() + addDays); 460 instance.setDate(selectedDates); 461 setTimeout(() => { 462 instance.jumpToDate(selectedDates[0]); 463 instance.open(); 464 }); 465 } 466 } 467 }, 468 showMonths: 2 469 }); 470 471 if (self.isMobile()) { 472 self.fpsearch.set('showMonths', 1); 473 } 474 475 if (self.getParameterByName('searchhb') !== null) { 476 jQuery('.hotel-card').on('click', function () { 477 window.location.href = jQuery(this).attr('purl'); 478 }); 479 480 if (self.JSearchButton().length > 0) { 481 let start_date = self.getParameterByName('hstart_date'); 482 let end_date = self.getParameterByName('hend_date'); 483 let adults = self.getParameterByName('hadults'); 484 let children = self.getParameterByName('hchildren'); 485 let childrenagesa = self.getParameterByName('hchildrenages'); 486 let rooms = self.getParameterByName('hrooms'); 487 488 if (start_date !== null && end_date !== null) { 489 let cDate = new Date(start_date); 490 cDate.setTime(cDate.getTime() + self.getTimezoneInMiliseconds(cDate)); 491 let cDatee = new Date(end_date); 492 cDatee.setTime(cDatee.getTime() + self.getTimezoneInMiliseconds(cDatee)); 493 self.fpsearch.setDate([cDate, cDatee], true); 494 } 495 496 if (adults !== null) { 497 jQuery('#selectAdults').val(adults).trigger('change'); 498 } 499 500 if (rooms !== null) { 501 jQuery('#selectRooms').val(rooms).trigger('change'); 502 } 503 504 if (children !== null) { 505 jQuery('#selectChildren').val(children).trigger('change'); 506 } 507 508 if (childrenagesa !== null) { 509 let childrenages = childrenagesa.split('-'); 510 511 for (let i = 0; i < childrenages.length; i++) { 512 jQuery('#children-guests-section .guestc:eq(' + i + ')').val(childrenages[i]); 513 } 514 } 515 516 let scroll = self.getParameterByName('scroll'); 517 518 if (scroll == '1') { 519 if (jQuery('.bpcs_wrapper').length > 0) { 520 jQuery('.bpcs_wrapper').closest('.qubely-column-inner').css('padding', '8px'); 521 setTimeout(function () { 522 seamless.elementScrollIntoView(document.querySelector('.bpcs_wrapper'), { 523 behavior: 'smooth', 524 inline: 'top', 525 block: 'top' 526 }); 527 self.scrollWindow2(); 528 }, 600); 529 } 530 } 531 } 532 } 533 534 if (self.JSearchButton().length > 0) { 535 self.JSearchButton().on('click', jQuery.proxy(self.searchHotelsButton, self)); 536 } 537 538 if (self.JPackButton().length > 0) { 539 self.JPackButton().on('click', jQuery.proxy(self.startPackButton, self)); 540 } 541 542 jQuery('.pack_price').each(function () { 543 jQuery(this).html('Please wait as we calculate the value'); 544 let fontsize = jQuery(this).css('font-size'); 545 jQuery(this).css('font-size', '15px'); 546 self.calculatePackPrice(jQuery(this), fontsize); 547 }); 548 } 549 } 550 551 showPageActions() { 552 jQuery('body').on('click', '.bbvid', function () { 553 //jQuery('.bbvid').on('click', function () { 554 jQuery.magnificPopup.open({ 555 items: { 556 src: jQuery('.lightb_video').html(), 557 type: 'inline' 558 }, 559 mainClass: 'blocks-cont-b mfp-fade', 560 //removalDelay: 160, 561 preloader: true, 562 overflowY: 'auto', 563 fixedContentPos: true, 564 callbacks: { 565 open: function () {} 566 } 567 }); 568 }); 569 } 570 571 hotelRoomActions() { 572 jQuery('.roomdetails').appendTo('#content');
573 jQuery('.room-card .image-wrapper, .room-card .hotel-title').on('click', function () { 574 let rid = jQuery(this).attr('rId'); 575 jQuery.magnificPopup.open({ 576 items: { 577 src: jQuery('.roomdetails[rId=' + rid + ']').html(), 578 type: 'inline' 579 }, 580 mainClass: 'blocks-cont-b mfp-fade', 581 //removalDelay: 160, 582 preloader: true, 583 overflowY: 'auto', 584 fixedContentPos: true, 585 callbacks: { 586 open: function () { 587 jQuery('.mfp-content').find('.carouselr').flickity({ 588 // options 589 cellAlign: 'left', 590 contain: true, 591 fullscreen: true, 592 wrapAround: true, 593 groupCells: 1, 594 lazyLoad: 1, 595 hash: true, 596 cellSelector: '.carouselr-cell', 597 //wrapAround: true, 598 freeScroll: true, 599 draggable: true, 600 pageDots: false 601 }); 602 } 603 } 604 }); 605 jQuery('.roomback .backbtn').on('click', function () { 606 jQuery.magnificPopup.close(); 607 }); //jQuery('#content .porto-block:eq(0)').hide(); 608 }); 609 this.JRoomReserveButton().off('click').on('click', jQuery.proxy(this.roomReserveAction, this)); 610 } 611 612 roomReserveAction(event) { 613 let self = this; 614 let rID, pID, rRate, el, isp; 615 616 if (jQuery(event.target).attr('rid')) { 617 el = jQuery(event.target); 618 } else { 619 el = jQuery(event.target).parent(); 620 } 621 622 isp = el.attr('ispack'); 623 624 if (typeof isp === 'undefined' || isp === false) { 625 isp = 0; 626 } 627 628 rID = el.attr('rid'); 629 pID = el.attr('pid'); 630 rRate = el.attr('rrate'); 631 let start_date = self.getParameterByName('hstart_date'); 632 let end_date = self.getParameterByName('hend_date'); 633 let adults = self.getParameterByName('hadults'); 634 let children = self.getParameterByName('hchildren'); 635 let childrenagesa = self.getParameterByName('hchildrenages'); 636 let rooms = self.getParameterByName('hrooms'); 637 const data = { 638 action: 'reserve_room', 639 pid: pID, 640 rid: rID, 641 isp: isp, 642 rrate: rRate, 643 start_date: start_date, 644 end_date: end_date, 645 adults: adults, 646 rooms: rooms, 647 children: children, 648 childrenages: childrenagesa, 649 security: jQuery('#rwb_reserve_room_nonce').val() 650 }; 651 el.LoadingOverlay("show"); 652 jQuery.ajax({ 653 type: 'POST', 654 dataType: 'json', 655 url: bbLocal.ajax_url, 656 data: data, 657 success: jQuery.proxy(self.roomReserveCompleted, self) 658 }); 659 /*else { 660 Swal.fire({ 661 title: 'Error!', 662 text: 'Please select at least one ticket', 663 icon: 'error', 664 confirmButtonText: 'Ok' 665 }); 666 } */ 667 } 668 669 roomReserveCompleted(response) { 670 if (response.success === false) { 671 const self = this; 672 __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({ 673 title: 'Information', 674 text: response.message, 675 icon: 'info', 676 confirmButtonText: 'OK', 677 closeOnConfirm: true 678 }).then(result => { 679 /* Read more about isConfirmed, isDenied below */ 680 if (result.isConfirmed) { 681 self.JRoomReserveButton().LoadingOverlay("hide", true); //self.JBuyButton().hide(); 682 } else if (result.isDenied) {//Swal.fire('Changes are not saved', '', 'info') 683 } 684 }); 685 } else { 686 if (response.isp === 0) { 687 window.location.href = response.url; 688 } else { 689 window.location.href = window.location.href; 690 } 691 } 692 } 693 694 calculatePackPrice(elp, fontsize) { 695 let self = this; 696 let hID, el, pairID; 697 el = elp.parent().find('.startpack-button').first(); 698 hID = el.attr('hid'); 699 pairID = el.attr('pairid'); 700 let start_date = self.getParameterByName('hstart_date'); 701 let end_date = self.getParameterByName('hend_date'); 702 let adults = self.getParameterByName('hadults'); 703 let children = self.getParameterByName('hchildren'); 704 let childrenagesa = self.getParameterByName('hchildrenages'); 705 let rooms = self.getParameterByName('hrooms'); 706 const data = { 707 action: 'price_package', 708 hid: hID, 709 pairid: pairID, 710 start_date: start_date, 711 end_date: end_date, 712 adults: adults, 713 rooms: rooms, 714 children: children, 715 childrenages: childrenagesa, 716 security: jQuery('#rwb_price_package_nonce').val() 717 }; 718 elp.LoadingOverlay("show"); 719 jQuery.ajax({ 720 type: 'POST', 721 dataType: 'json', 722 url: bbLocal.ajax_url, 723 data: data, 724 success: function (response) { 725 elp.LoadingOverlay("hide"); 726 727 if (response.html !== 'Not Available') { 728 elp.css('font-size', fontsize); 729 } else { 730 el.remove(); 731 } 732 733 elp.html(response.html); 734 } 735 }); 736 } 737 738 startPackButton() { 739 let self = this; 740 let hID, el, pairID; 741 el = jQuery(event.target); 742 hID = el.attr('hid'); 743 pairID = el.attr('pairid'); 744 let start_date = self.getParameterByName('hstart_date'); 745 let end_date = self.getParameterByName('hend_date'); 746 let adults = self.getParameterByName('hadults');
747 let children = self.getParameterByName('hchildren'); 748 let childrenagesa = self.getParameterByName('hchildrenages'); 749 let rooms = self.getParameterByName('hrooms'); 750 const data = { 751 action: 'start_package', 752 hid: hID, 753 pairid: pairID, 754 start_date: start_date, 755 end_date: end_date, 756 adults: adults, 757 rooms: rooms, 758 children: children, 759 childrenages: childrenagesa, 760 security: jQuery('#rwb_start_package_nonce').val() 761 }; 762 el.LoadingOverlay("show"); 763 jQuery.ajax({ 764 type: 'POST', 765 dataType: 'json', 766 url: bbLocal.ajax_url, 767 data: data, 768 success: jQuery.proxy(self.startPackageCompleted, self) 769 }); 770 } 771 772 calCompleted(response) { 773 let self = this; 774 jQuery('#bcalendar-section-wrapper').LoadingOverlay("hide"); 775 776 if (response.success === true) { 777 jQuery('#cal-card-result').html(response.html); 778 } 779 } 780 781 startPackageCompleted(response) { 782 jQuery('body').LoadingOverlay("hide"); 783 784 if (response.success === true) { 785 let url = window.location.href; 786 url = url.replace('&ispack=1', ''); 787 window.location.href = url; 788 } 789 } 790 791 searchHotelsButton() { 792 let self = this; 793 794 if (self.fpsearch !== false) { 795 let dates = self.fpsearch.selectedDates; //alert(dates[0] + '-' + dates[1]); 796 797 const start_date = self.fpsearch.formatDate(dates[0], 'Y-m-d'); 798 const end_date = self.fpsearch.formatDate(dates[1], 'Y-m-d'); 799 const adults = jQuery('#selectAdults').val(); 800 const rooms = jQuery('#selectRooms').val(); 801 const children = jQuery('#selectChildren').val(); 802 let childrenages = ''; 803 jQuery('#children-guests-section .guestc').each(function () { 804 childrenages += jQuery(this).val() + '-'; 805 }); 806 childrenages = childrenages.substring(0, childrenages.length - 1); 807 let params = ''; 808 809 if (start_date !== '' && end_date !== '' && adults !== '' && adults !== '0' && rooms !== '' && rooms !== '0') { 810 params = '?searchhb=1&hstart_date=' + start_date + '&hend_date=' + end_date + '&hadults=' + adults + '&hrooms=' + rooms; 811 812 if (children !== '' && children !== '0' && childrenages !== '') { 813 params += '&hchildren=' + children + '&hchildrenages=' + childrenages; 814 } 815 816 if (window.location.href.indexOf('packages') !== -1) { 817 params += '&ispack=1'; 818 } 819 } 820 821 if (params !== '') { 822 params += '&scroll=1'; 823 824 if (jQuery('body').hasClass('single-product')) { 825 let bb = window.location.href; 826 827 if (bb.indexOf('?') > 0) { 828 bb = bb.split("?")[0]; 829 } 830 831 window.location.href = bb + params; 832 } else { 833 window.location.href = window.location.origin + '/hotels/' + params; 834 } 835 } 836 } 837 } 838 839 searchCalendarButton() { 840 let self = this; 841 842 if (self.fpsearchS !== false) { 843 let dates = self.fpsearchS.selectedDates; //alert(dates[0] + '-' + dates[1]); 844 845 const start_date = self.fpsearchS.formatDate(dates[0], 'Y-m-d'); //const end_date = self.fpsearchS.formatDate(dates[1], 'Y-m-d'); 846 847 let params = ''; 848 849 if (start_date !== '') { 850 params += '?searchcalb=1&calstart_date=' + start_date; 851 } 852 853 if (params !== '') { 854 if (window.location.href.indexOf('aaa.spotlight.vegas') === -1) { 855 window.location.href = 'https://spotlight.vegas/shows/calendar/' + params; 856 } else { 857 window.location.href = 'https://aaa.spotlight.vegas/shows-calendar/' + params; 858 } 859 } 860 } 861 } 862 863 getParameterByName(name, url = window.location.href) { 864 name = name.replace(/[\[\]]/g, '\\$&'); 865 var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'), 866 results = regex.exec(url); 867 if (!results) return null; 868 if (!results[2]) return ''; 869 return decodeURIComponent(results[2].replace(/\+/g, ' ')); 870 } 871 872 isPack() { 873 if (jQuery('#pack_discounts').length > 0) { 874 return true; 875 } 876 877 return false; 878 } 879 880 packStartDate() { 881 let start_date = false; 882 883 if (jQuery('#pack_discounts').length > 0) { 884 start_date = new Date(jQuery('#pack_discounts').attr('start_date')); 885 } 886 887 return start_date; 888 } 889 890 packEndDate() { 891 let end_date = false;
892 893 if (jQuery('#pack_discounts').length > 0) { 894 end_date = new Date(jQuery('#pack_discounts').attr('end_date')); 895 } 896 897 return end_date; 898 } 899 900 renderEvents() { 901 let self = this; 902 let pID; 903 904 if (self.JIsAttraction()) { 905 pID = jQuery('#attraction_id').attr('pid'); 906 } else { 907 pID = self.getParameterByName('product_id'); 908 } 909 910 const data = { 911 action: 'seat_selection_map', 912 product_id: pID, 913 security: jQuery('#rwb_seat_selection_map_nonce').val() 914 }; 915 jQuery('body').LoadingOverlay("show"); 916 jQuery.ajax({ 917 type: 'POST', 918 dataType: 'json', 919 url: bbLocal.ajax_url, 920 data: data, 921 success: jQuery.proxy(self.renderEventsCompleted, self) 922 }); 923 } 924 925 renderSeatChart(event_id) { 926 let self = this; 927 this.createDestroySeatChart(); 928 this.JTicketsCart().hide(); 929 const data = { 930 action: 'event_seats', 931 product_id: self.getParameterByName('product_id'), 932 event_id: event_id, 933 security: jQuery('#rwb_event_seats_nonce').val() 934 }; 935 jQuery('body').LoadingOverlay("show"); 936 jQuery.ajax({ 937 type: 'POST', 938 dataType: 'json', 939 url: bbLocal.ajax_url, 940 data: data, 941 success: jQuery.proxy(self.renderSeatChartCompleted, self) 942 }); 943 } 944 945 clearCart() { 946 this.pods = []; 947 let selectedLabel = jQuery(this).attr('label'); //it will clear the whole cart because the seats are auto added 948 949 let sellab = []; 950 951 for (const k in this.selectedLabels) { 952 sellab.push(this.selectedLabels[k]['label']); 953 } 954 955 if (typeof this.seatChart.deselectObjects !== 'undefined') { 956 this.seatChart.deselectObjects(sellab); 957 } 958 } 959 960 selectBasedOnDropDown(selectedSeats) { 961 //update tickets_cart with buttons and all 962 let c; 963 let p; 964 let labels = []; 965 let self = this; 966 let totalPrice = 0; 967 let hasType = false;
968 let typesSeat = []; 969 let selectSeatsLabelOnly = []; 970 let existingSeats = []; 971 let totalTickets = 0; 972 973 for (c = 0; c < selectedSeats.length; c++) { 974 let label = {}; 975 label.label = selectedSeats[c].label; 976 label.qty = 1; 977 978 if (typeof existingSeats[selectedSeats[c].uuid] !== 'undefined') { 979 continue; 980 } 981 982 if (typeof selectedSeats[c].numSelected !== 'undefined') { 983 label.qty = selectedSeats[c].numSelected; 984 label.labelorig = label.label; 985 label.label += '(' + selectedSeats[c].numSelected + ')'; 986 987 if (typeof existingSeats[selectedSeats[c].uuid] === 'undefined') { 988 existingSeats[selectedSeats[c].uuid] = 1; 989 } 990 } 991 992 totalTickets += label.qty; 993 selectSeatsLabelOnly.push(label.label); 994 995 if (typeof selectedSeats[c].pricing !== "undefined" && typeof selectedSeats[c].pricing.ticketTypes !== "undefined") { 996 for (p = 0; p < selectedSeats[c].pricing.ticketTypes.length; p++) { 997 if (selectedSeats[c].pricing.ticketTypes[p]['ticketType'] === selectedSeats[c].selectedTicketType) { 998 label.price = label.qty * selectedSeats[c].pricing.ticketTypes[p]['price']; 999 label.type = selectedSeats[c].pricing.ticketTypes[p]['ticketType']; 1000 label.typen = label.type; 1001 1002 if (self.inArray(typesSeat, label.type) !== false) { 1003 hasType = true; 1004 } 1005 1006 typesSeat.push(label.type); 1007 totalPrice += label.qty * parseFloat(label.price); 1008 } 1009 } 1010 } else { 1011 label.typen = self.ticketTypeAll; 1012 label.price = label.qty * selectedSeats[c].pricing['price']; 1013 totalPrice += parseFloat(label.price); 1014 } 1015 1016 labels.push(label); 1017 } 1018 1019 self.selectedLabels = labels; 1020 let numberOfSelectedSeats = self.selectedLabels.length; 1021 let ScrollFromBottom = jQuery(document).height() - jQuery(window).scrollTop(); 1022 let tableHeight = jQuery('#tickets_selected').height(); 1023 self.JTicketsSelectedCart().html(''); 1024 self.JTicketsButtonsCart().html(''); 1025 1026 if (numberOfSelectedSeats === 0) { 1027 self.JTicketsSelectedCart().html(''); 1028 self.JTicketsButtonsCart().hide(); 1029 self.createPricingMap(); 1030 jQuery('.bproceed_tickets').hide(); 1031 } else { 1032 self.JTicketsSelectedCart().show(); 1033 self.JTicketsButtonsCart().show(); 1034 let headers = []; 1035 headers.push({ 1036 'label': '' 1037 }); 1038 headers.push({ 1039 'label': 'Section' 1040 }); 1041 headers.push({ 1042 'label': 'Row' 1043 }); 1044 headers.push({ 1045 'label': 'Seat' 1046 }); 1047 1048 if (hasType) { 1049 headers.push({ 1050 'label': 'Type' 1051 }); 1052 } 1053 1054 headers.push({ 1055 'label': 'Price' 1056 }); 1057 let rows = []; 1058 1059 for (const k in self.selectedLabels) { 1060 let row = []; 1061 const curLabel = self.selectedLabels[k]; 1062 let label = curLabel['label'].split('-');
1063 row['columns'] = []; 1064 row['columns'].push('<i style="cursor:pointer" class="far fa-trash-alt deleteTicket" label="' + curLabel['label'] + '"></i>'); 1065 row['columns'].push(label[0]); 1066 1067 if (typeof label[1] !== 'undefined') { 1068 row['columns'].push(label[1]); 1069 } else { 1070 row['columns'].push(''); 1071 } 1072 1073 if (typeof label[2] !== 'undefined') { 1074 row['columns'].push(label[2]); 1075 } else { 1076 row['columns'].push(''); 1077 } 1078 1079 if (hasType) { 1080 row['columns'].push(curLabel['type']); 1081 } 1082 1083 if (!self.isPack()) { 1084 row['columns'].push('$' + parseFloat(curLabel['price']).toFixed(2)); 1085 } else { 1086 let pp = parseFloat(curLabel['price']).toFixed(2) - self.initPackPrice; 1087 1088 if (pp == 0) { 1089 row['columns'].push('INCLUDED'); 1090 } else { 1091 row['columns'].push('+$' + pp.toFixed(2)); 1092 } 1093 } 1094 1095 rows.push(row); 1096 } 1097 1098 let footers = []; 1099 footers.push({ 1100 'label': totalTickets + ' Tickets', 1101 'colspan': 3 1102 }); 1103 1104 if (!self.isPack()) { 1105 if (hasType) { 1106 footers.push({ 1107 'label': 'Subtotal: $' + parseFloat(totalPrice).toFixed(2), 1108 'colspan': 3 1109 }); 1110 } else { 1111 footers.push({ 1112 'label': 'Subtotal: $' + parseFloat(totalPrice).toFixed(2), 1113 'colspan': 2 1114 }); 1115 } 1116 } else { 1117 let pp = parseFloat(totalPrice).toFixed(2) - self.initPackPrice; 1118 1119 if (pp == 0) { 1120 if (hasType) { 1121 footers.push({ 1122 'label': 'Subtotal: INCLUDED', 1123 'colspan': 3 1124 }); 1125 } else { 1126 footers.push({ 1127 'label': 'Subtotal: INCLUDED', 1128 'colspan': 2 1129 }); 1130 } 1131 } else { 1132 if (hasType) { 1133 footers.push({ 1134 'label': 'Subtotal: +$' + pp.toFixed(2), 1135 'colspan': 3 1136 }); 1137 } else { 1138 footers.push({ 1139 'label': 'Subtotal: +$' + pp.toFixed(2), 1140 'colspan': 2 1141 }); 1142 } 1143 } 1144 } 1145 1146 self.JTicketsSelectedCart().append(self.createHtmlTable('tickets_selected', headers, rows, footers)); 1147 self.JTicketsSelectedTable().find('.deleteTicket').on('click', function () { 1148 //self.clearCart(); 1149 self.fromDelete = self.selectedLabels.length; 1150 let label = jQuery(this).attr('label'); 1151 1152 for (const k1 in self.selectedLabels) { 1153 const curLabel = self.selectedLabels[k1]; 1154 1155 if (curLabel['label'] === label && typeof curLabel['labelorig'] !== 'undefined') { 1156 label = curLabel['labelorig']; 1157 break; 1158 } 1159 } 1160 1161 if (!self.JFreeSeating()) { 1162 let pods = []; 1163 1164 for (const kp in self.pods) { 1165 for (const kpp in self.pods[kp]) { 1166 if (self.pods[kp][kpp] === label) { 1167 pods = self.pods[kp]; 1168 break; 1169 } 1170 } 1171 } 1172 1173 if (typeof self.seatChart.deselectObjects !== 'undefined') { 1174 self.seatChart.deselectObjects(pods); 1175 } else { 1176 for (let io1 = 1; io1 < pods.length; io1++) { 1177 self.updateObjQuantity(pods[io1], 0); 1178 } 1179 } 1180 } else { 1181 if (typeof self.seatChart.deselectObjects !== 'undefined') { 1182 self.seatChart.deselectObjects([label]); 1183 } else { 1184 self.updateObjQuantity(label, 0); 1185 } 1186 } 1187 1188 if (typeof self.seatChart.listSelectedObjects !== 'undefined') { 1189 self.seatChart.listSelectedObjects(function (selectedObjects) { 1190 //check the selected seats and if the number is smaller select based on rank, and nearest 1191 self.selectBasedOnDropDown(selectedObjects); 1192 }); 1193 } else { 1194 self.selectBasedOnDropDown(self.myselectedObjects); 1195 } 1196 }); 1197 /*if (self.JIsAttraction() || self.JZoneImage().length > 0) { 1198 if (!self.isMobile()) { 1199 self.JTicketsButtonsCart().append(jQuery('<div class="best_price_guaranteed"> <span class="slv slv-check-circle"></span><span class="bb_link_product_text">Best price guaranteed</span> </div>')); 1200 } else { 1201 self.JTicketsButtonsCart().parent().append(jQuery('<div class="best_price_guaranteed"> <span class="slv slv-check-circle"></span><span class="bb_link_product_text">Best price guaranteed</span> </div>')); 1202 } 1203 }*/ 1204 1205 self.JTicketsButtonsCart().append(jQuery('<a href="#0" class="saddcart">
1205Add To Cart</a>')).append(jQuery('<a href="#0" class="sbuynow">Buy Now</a>')); //.append(jQuery('<a href="#0" class="button btn sadd_to_cart_btn">Add To Cart</a>')) 1206 //jQuery('html,body').animate({scrollTop: 0}, 'slow'); 1207 1208 if (self.JIsAttraction() || self.JZoneImage().length > 0) { 1209 this.JBuyButton().off('click').on('click', jQuery.proxy(this.buyNowActionA, this)); 1210 this.JAddToCartButton().off('click').on('click', jQuery.proxy(this.addToCartActionA, this)); 1211 } else { 1212 this.JBuyButton().off('click').on('click', jQuery.proxy(this.buyNowAction, this)); 1213 this.JAddToCartButton().off('click').on('click', jQuery.proxy(this.addToCartAction, this)); 1214 } 1215 1216 if (jQuery('#tickets_selected').length > 0) { 1217 if (self.isInViewport(jQuery('#tickets_selected'))) { 1218 // do something 1219 jQuery('.bproceed_tickets').hide(); 1220 } else { 1221 jQuery('.bproceed_tickets').show(); 1222 } 1223 } 1224 1225 if (self.isMobile()) { 1226 jQuery(window).scrollTop(jQuery(document).height() - ScrollFromBottom - 20); 1227 } 1228 1229 if (!self.JFreeSeating()) { 1230 if (self.selectedNumberOfTickets - numberOfSelectedSeats % self.selectedNumberOfTickets !== self.selectedNumberOfTickets) { 1231 let difference = self.selectedNumberOfTickets - numberOfSelectedSeats % self.selectedNumberOfTickets; 1232 let lastLabel = self.selectedLabels[self.selectedLabels.length - 1]; 1233 let mypod = []; 1234 mypod.push(lastLabel['label']); 1235 let start = 0; 1236 let seatsByPosition = []; 1237 let lastSeatSelected = self.eventSeats[lastLabel['label']]; 1238 let findPos = false; 1239 let autoSelectedSeats = []; 1240 1241 for (const k in self.eventSeats) { 1242 if (k === lastLabel['label']) { 1243 findPos = start; 1244 } 1245 1246 seatsByPosition.push(self.eventSeats[k]); 1247 start++; 1248 } 1249 1250 let p = 1; 1251 const spatialSeat = parseInt(lastSeatSelected['spatialSeatId']); 1252 1253 while (p < self.selectedNumberOfTickets) { 1254 if (typeof seatsByPosition[findPos - p] !== 'undefined' && seatsByPosition[findPos - p]['spatialRow'] === lastSeatSelected['spatialRow']) { 1255 const selSeat = parseInt(seatsByPosition[findPos - p]['spatialSeatId']); 1256 1257 if (selSeat + p === spatialSeat) { 1258 let iexist = false; 1259 1260 for (const kp in self.selectedLabels) { 1261 if (self.selectedLabels[kp]['label'] === seatsByPosition[findPos - p]['key']) { 1262 iexist = true; 1263 break; 1264 } 1265 } 1266 1267 if (iexist === false) { 1268 mypod.push(seatsByPosition[findPos - p]['key']); 1269 autoSelectedSeats.push(seatsByPosition[findPos - p]['key']); 1270 difference--; 1271 } 1272 } 1273 } 1274 1275 if (difference === 0) { 1276 break; 1277 } 1278 1279 if (typeof seatsByPosition[findPos + p] !== 'undefined' && seatsByPosition[findPos + p]['spatialRow'] === lastSeatSelected['spatialRow']) { 1280 const selSeat = parseInt(seatsByPosition[findPos + p]['spatialSeatId']); 1281 1282 if (Math.abs(selSeat - p) === spatialSeat) { 1283 let iexist = false; 1284 1285 for (const kp in self.selectedLabels) { 1286 if (self.selectedLabels[kp]['label'] === seatsByPosition[findPos + p]['key']) { 1287 iexist = true; 1288 break; 1289 } 1290 } 1291 1292 if (iexist === false) { 1293 mypod.push(seatsByPosition[findPos + p]['key']); 1294 autoSelectedSeats.push(seatsByPosition[findPos + p]['key']); 1295 difference--; 1296 } 1297 } 1298 } 1299 1300 if (difference === 0) { 1301 break; 1302 } 1303 1304 p++; 1305 } 1306 1307 if (difference === 0 && autoSelectedSeats.length > 0) { 1308 self.pods.push(mypod); 1309 self.seatChart.selectObjects(autoSelectedSeats); 1310 } 1311 1312 if (difference > 0) { 1313 __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({ 1314 title: 'Error!', 1315 text: 'Cannot select the rest of the tickets because there are no seats available on the same row', 1316 icon: 'error', 1317 confirmButtonText: 'Ok' 1318 }); 1319 self.seatChart.deselectObjects([selectSeatsLabelOnly[selectSeatsLabelOnly.length - 1]]); 1320 self.seatChart.listSelectedObjects(function (selectedObjects) { 1321 //check the selected seats and if the number is smaller select based on rank, and nearest 1322 self.selectBasedOnDropDown(selectedObjects); 1323 }); 1324 } 1325 } 1326 } 1327 } 1328 } 1329 1330 addToCartAction() { 1331 let self = this; 1332 let labels = Object.assign({}, self.selectedLabels); 1333 let usedBlocksToSend = {}; 1334 1335 for (const i in self.usedBlocks) { 1336 usedBlocksToSend[i] = {}; 1337 usedBlocksToSend[i]['promo'] = {}; 1338 usedBlocksToSend[i]['promo']['promotionCode'] = self.usedBlocks[i]['promo']['promotionCode']; 1339 } 1340 1341 const data = { 1342 action: 'hold_seats', 1343 productid: self.getParameterByName('product_id'), 1344 seatlabels: labels, 1345 pods: self.pods, 1346 eventkey: self.selectedEventId, 1347 eventData: self.selectedEventData, 1348 usedBlocks: usedBlocksToSend, 1349 qty: labels.length, 1350 isp: self.isPack(), 1351 is_add_to_cart: true, 1352 security: jQuery('#rwb_hold_seats_nonce').val() 1353 }; 1354 self.JAddToCartButton().LoadingOverlay("show"); 1355 jQuery.ajax({ 1356 type: 'POST', 1357 dataType: 'json', 1358 url: bbLocal.ajax_url, 1359 data: data, 1360 success: jQuery.proxy(self.addToCartCompleted, self) 1361 }); 1362 } 1363 1364 onBtnClicked(btnId) { 1365 __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.close(); 1366 1367 if (btnId != "cancel") { 1368 __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire("you choosed: " + btnId); 1369 } 1370 } 1371 1372 createButton(text, cb) { 1373 return jQuery('<button class="btn btn-info">
1373' + text + '</button>').on('click', cb); 1374 } 1375 1376 addToCartCompleted(response) { 1377 const self = this; 1378 1379 if (response.success === false) { 1380 if (typeof this.seatChart.rerender !== 'undefined') { 1381 this.seatChart.rerender(); 1382 } //this.seatChart = false; 1383 //this.selectedObjectChart = null; 1384 //this.selectedEvent = null; 1385 1386 1387 __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({ 1388 title: 'Information', 1389 text: response.message, 1390 icon: 'info', 1391 confirmButtonText: 'OK', 1392 closeOnConfirm: true, 1393 allowOutsideClick: false, 1394 allowEscapeKey: false 1395 }).then(result => { 1396 /* Read more about isConfirmed, isDenied below */ 1397 if (result.isConfirmed) { 1398 self.JAddToCartButton().LoadingOverlay("hide", true); //window.location.href = window.location.href; 1399 //self.JBuyButton().LoadingOverlay("hide", true); 1400 1401 self.clearCart(); 1402 self.selectBasedOnDropDown([]); //self.JAddToCartButton().hide(); 1403 //refresh map 1404 1405 if (response.reload) { 1406 if (self.JIsAttraction() || self.JZoneImage().length > 0) {} else { 1407 self.renderSeatChart(self.selectedEventId); 1408 } 1409 } 1410 } else if (result.isDenied) {//Swal.fire('Changes are not saved', '', 'info') 1411 } 1412 }); 1413 } else { 1414 window.location.href = response.url; 1415 /* 1416 self.clearCart(); 1417 jQuery('.around_icons_shopping').removeClass('been_refreshed'); 1418 Swal.fire({ 1419 title: 'Information', 1420 text: 'Your tickets have been added to the cart. If you want to buy more tickets please select them from the seating chart and add them to the cart. If you have finished Go To Checkout.', 1421 icon: 'info', 1422 confirmButtonText: 'Continue', 1423 showConfirmButton: true, 1424 showDenyButton: true, 1425 denyButtonText: `Go To Checkout`, 1426 closeOnConfirm: true 1427 }).then((result) => { 1428 if (result.isConfirmed) { 1429 //self.JAddToCartButton().LoadingOverlay("hide", true); 1430 //window.location.href = window.location.href; 1431 //self.JAddToCartButton().hide(); 1432 } else if (result.isDenied) { 1433 window.location.href = response.checkout_url; 1434 //Swal.fire('Changes are not saved', '', 'info') 1435 } 1436 }); 1437 */ 1438 } 1439 } 1440 1441 buyNowActionA() { 1442 let self = this; 1443 let pID; 1444 1445 if (self.JIsAttraction()) { 1446 pID = jQuery('#attraction_id').attr('pid'); 1447 } else { 1448 pID = self.getParameterByName('product_id'); 1449 } 1450 1451 let ticketData = []; 1452 let stop = false; 1453 jQuery('.attraction_mint_maxt').each(function () { 1454 let attr = {}; 1455 1456 if (parseInt(jQuery(this).val()) > 0) { 1457 attr.qty = jQuery(this).val(); 1458 attr.promo_code = jQuery(this).attr('i'); 1459 attr.priceLevelId = jQuery(this).attr('j'); 1460 1461 if (jQuery(this).parent().parent().parent().parent().find('.attraction_pickuploc').length > 0) { 1462 attr.pickuploc = jQuery(this).parent().parent().parent().parent().find('.attraction_pickuploc').last().val(); 1463 } 1464 1465 if (jQuery(this).parent().hasClass('hasnw')) { 1466 let bbfname = []; 1467 jQuery(this).parent().parent().parent().parent().find('.nwdata .bbfname').each(function () { 1468 if (jQuery(this).val() !== '') { 1469 bbfname.push(jQuery(this).val()); 1470 } else { 1471 stop = true; 1472 } 1473 }); 1474 attr.bbfname = bbfname; 1475 let bblname = []; 1476 jQuery(this).parent().parent().parent().parent().find('.nwdata .bblname').each(function () { 1477 if (jQuery(this).val() !== '') { 1478 bblname.push(jQuery(this).val()); 1479 } else { 1480 stop = true; 1481 } 1482 }); 1483 attr.bblname = bblname; 1484 let bbweight = []; 1485 jQuery(this).parent().parent().parent().parent().find('.nwdata .bbweight').each(function () { 1486 if (jQuery(this).val() !== '') { 1487 bbweight.push(jQuery(this).val()); 1488 } else { 1489 stop = true; 1490 } 1491 }); 1492 attr.bbweight = bbweight; 1493 } 1494 1495 ticketData.push(attr); 1496 } 1497 }); 1498 1499 if (stop) { 1500 __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({ 1501 title: 'Hold Up!', 1502 text: 'Please provide all information', 1503 icon: 'error', 1504 confirmButtonText: 'Ok' 1505 }); 1506 return false;
1507 } 1508 1509 if (ticketData.length > 0) { 1510 let usedBlocksToSend = {}; 1511 1512 for (const i in self.usedBlocks) { 1513 usedBlocksToSend[i] = {}; 1514 usedBlocksToSend[i]['promo'] = {}; 1515 usedBlocksToSend[i]['promo']['promotionCode'] = self.usedBlocks[i]['promo']['promotionCode']; 1516 } 1517 1518 const data = { 1519 action: 'hold_attraction', 1520 productid: pID, 1521 eventkey: self.selectedEventId, 1522 eventData: self.selectedEventData, 1523 usedBlocks: usedBlocksToSend, 1524 isp: self.isPack(), 1525 //qty: self.selectedNumberOfTickets, 1526 ticket_data: ticketData, 1527 security: jQuery('#rwb_hold_attraction_nonce').val() 1528 }; 1529 self.JBuyButton().LoadingOverlay("show"); 1530 jQuery.ajax({ 1531 type: 'POST', 1532 dataType: 'json', 1533 url: bbLocal.ajax_url, 1534 data: data, 1535 success: jQuery.proxy(self.buyNowCompletedA, self) 1536 }); 1537 } else { 1538 __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({ 1539 title: 'Hold Up!', 1540 text: 'Please provide all information', 1541 icon: 'error', 1542 confirmButtonText: 'Ok' 1543 }); 1544 } 1545 } 1546 1547 buyNowCompletedA(response) { 1548 if (response.success === false) { 1549 this.selectedEvent = null; 1550 const self = this; 1551 __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({ 1552 title: 'Information', 1553 text: response.message, 1554 icon: 'info', 1555 confirmButtonText: 'OK', 1556 closeOnConfirm: true 1557 }).then(result => { 1558 /* Read more about isConfirmed, isDenied below */ 1559 if (result.isConfirmed) { 1560 self.JBuyButton().LoadingOverlay("hide", true); //self.JBuyButton().hide(); 1561 } else if (result.isDenied) {//Swal.fire('Changes are not saved', '', 'info') 1562 } 1563 }); 1564 } else { 1565 window.location.href = response.url; 1566 } 1567 } 1568 1569 addToCartActionA() { 1570 let self = this; 1571 let pID; 1572 1573 if (self.JIsAttraction()) { 1574 pID = jQuery('#attraction_id').attr('pid'); 1575 } else { 1576 pID = self.getParameterByName('product_id'); 1577 } 1578 1579 let ticketData = []; 1580 let stop = false; 1581 jQuery('.attraction_mint_maxt').each(function () { 1582 let attr = {}; 1583 1584 if (parseInt(jQuery(this).val()) > 0) { 1585 attr.qty = jQuery(this).val(); 1586 attr.promo_code = jQuery(this).attr('i'); 1587 attr.priceLevelId = jQuery(this).attr('j'); 1588 1589 if (jQuery(this).parent().hasClass('hasnw')) { 1590 attr.pickuploc = jQuery(this).parent().parent().parent().parent().find('.attraction_pickuploc').val(); 1591 let bbfname = []; 1592 jQuery(this).parent().parent().parent().parent().find('.nwdata .bbfname').each(function () { 1593 if (jQuery(this).val() !== '') { 1594 bbfname.push(jQuery(this).val()); 1595 } else { 1596 stop = true; 1597 } 1598 }); 1599 attr.bbfname = bbfname; 1600 let bblname = []; 1601 jQuery(this).parent().parent().parent().parent().find('.nwdata .bblname').each(function () { 1602 if (jQuery(this).val() !== '') { 1603 bblname.push(jQuery(this).val()); 1604 } else { 1605 stop = true; 1606 } 1607 }); 1608 attr.bblname = bblname; 1609 let bbweight = []; 1610 jQuery(this).parent().parent().parent().parent().find('.nwdata .bbweight').each(function () { 1611 if (jQuery(this).val() !== '') { 1612 bbweight.push(jQuery(this).val()); 1613 } else { 1614 stop = true; 1615 } 1616 }); 1617 attr.bbweight = bbweight; 1618 } 1619 1620 ticketData.push(attr); 1621 } 1622 }); 1623 1624 if (stop) { 1625 __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({ 1626 title: 'Hold Up!', 1627 text: 'Please provide all information', 1628 icon: 'error', 1629 confirmButtonText: 'Ok' 1630 }); 1631 return false; 1632 } 1633 1634 if (ticketData.length > 0) { 1635 let usedBlocksToSend = {}; 1636 1637 for (const i in self.usedBlocks) { 1638 usedBlocksToSend[i] = {}; 1639 usedBlocksToSend[i]['promo'] = {}; 1640 usedBlocksToSend[i]['promo']['promotionCode'] = self.usedBlocks[i]['promo']['promotionCode']; 1641 } 1642 1643 const data = { 1644 action: 'hold_attraction', 1645 productid: pID, 1646 eventkey: self.selectedEventId, 1647 eventData: self.selectedEventData, 1648 usedBlocks: usedBlocksToSend, 1649 //qty: self.selectedNumberOfTickets, 1650 ticket_data: ticketData, 1651 isp: self.isPack(), 1652 is_add_to_cart: true, 1653 security: jQuery('#rwb_hold_attraction_nonce').val() 1654 }; 1655 self.JAddToCartButton().LoadingOverlay("show"); 1656 jQuery.ajax({ 1657 type: 'POST', 1658 dataType: 'json', 1659 url: bbLocal.ajax_url, 1660 data: data, 1661 success: jQuery.proxy(self.addToCartCompletedA, self) 1662 }); 1663 } else { 1664 __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({ 1665 title: 'Error!', 1666 text: 'Please Select at least one ticket', 1667 icon: 'error', 1668 confirmButtonText: 'OK' 1669 }); 1670 } 1671 } 1672 1673 addToCartCompletedA(response) { 1674 if (response.success === false) { 1675 this.selectedEvent = null; 1676 const self = this; 1677 __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({ 1678 title: 'Information', 1679 text: response.message, 1680 icon: 'info', 1681 confirmButtonText: 'OK', 1682 closeOnConfirm: true 1683 }).then(result => { 1684 /* Read more about isConfirmed, isDenied below */ 1685 if (result.isConfirmed) { 1686 self.JAddToCartButton().LoadingOverlay("hide", true); //self.JAddToCartButton().hide(); 1687 } else if (result.isDenied) {//Swal.fire('Changes are not saved', '', 'info') 1688 } 1689 }); 1690 } else { 1691 window.location.href = response.url; 1692 } 1693 } 1694 1695 buyNowAction() { 1696 let self = this; 1697 let labels = Object.assign({}, self.selectedLabels); 1698 let usedBlocksToSend = {}; 1699 1700 for (const i in self.usedBlocks) { 1701 usedBlocksToSend[i] = {}; 1702 usedBlocksToSend[i]['promo'] = {}; 1703 usedBlocksToSend[i]['promo']['promotionCode'] = self.usedBlocks[i]['promo']['promotionCode']; 1704 } 1705 1706 const data = { 1707 action: 'hold_seats', 1708 productid: self.getParameterByName('product_id'), 1709 seatlabels: labels, 1710 eventkey: self.selectedEventId, 1711 eventData: self.selectedEventData, 1712 usedBlocks: usedBlocksToSend, 1713 qty: labels.length, 1714 isp: self.isPack(), 1715 security: jQuery('#rwb_hold_seats_nonce').val() 1716 }; 1717 self.JBuyButton().LoadingOverlay("show"); 1718 jQuery.ajax({ 1719 type: 'POST', 1720 dataType: 'json', 1721 url: bbLocal.ajax_url, 1722 data: data, 1723 success: jQuery.proxy(self.buyNowCompleted, self) 1724 }); 1725 } 1726 1727 buyNowCompleted(response) { 1728 if (response.success === false) { 1729 if (typeof this.seatChart.rerender !== 'undefined') { 1730 this.seatChart.rerender(); 1731 } //this.seatChart = false;
1732 //this.selectedObjectChart = null; 1733 //this.selectedEvent = null; 1734 //this.clearCart(); 1735 1736 1737 const self = this; 1738 __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({ 1739 title: 'Information', 1740 text: response.message, 1741 icon: 'info', 1742 confirmButtonText: 'OK', 1743 closeOnConfirm: true, 1744 allowOutsideClick: false, 1745 allowEscapeKey: false 1746 }).then(result => { 1747 /* Read more about isConfirmed, isDenied below */ 1748 if (result.isConfirmed) { 1749 self.JBuyButton().LoadingOverlay("hide", true); 1750 self.clearCart(); 1751 self.selectBasedOnDropDown([]); //self.JBuyButton().hide(); 1752 //refresh map 1753 1754 if (response.reload) { 1755 if (self.JIsAttraction() || self.JZoneImage().length > 0) {} else { 1756 self.renderSeatChart(self.selectedEventId); 1757 } 1758 } 1759 } else if (result.isDenied) {//Swal.fire('Changes are not saved', '', 'info') 1760 } 1761 }); 1762 } else { 1763 window.location.href = response.url; 1764 } 1765 } 1766 1767 comparePriceBlocks(a1, b1) { 1768 const a = a1[1]; 1769 const b = b1[1]; 1770 1771 if (a['fullRetailPrice'] < b['fullRetailPrice']) { 1772 return 1; 1773 } 1774 1775 if (a['fullRetailPrice'] > b['fullRetailPrice']) { 1776 return -1; 1777 } 1778 1779 return 0; 1780 } 1781 1782 comparePriceBlocksPack(a1, b1) { 1783 const a = a1[1]; 1784 const b = b1[1]; 1785 1786 if (a['fullRetailPrice'] > b['fullRetailPrice']) { 1787 return 1; 1788 } 1789 1790 if (a['fullRetailPrice'] < b['fullRetailPrice']) { 1791 return -1; 1792 } 1793 1794 return 0; 1795 } 1796 1797 objectToArray(obj) { 1798 let _arr = []; 1799 1800 for (let key in obj) { 1801 _arr.push([key, obj[key]]); 1802 } 1803 1804 return _arr; 1805 } 1806 1807 getPriceBlocksAndUsedBlocksAttraction() { 1808 let priceBlocks = []; 1809 let self = this; 1810 let usedBlocks = {}; 1811 1812 for (const key in self.eventPromotions) { 1813 for (const keyP in self.eventPromotions[key]['priceBlocks']) { 1814 for (const tmpkey in self.eventPromotions) { 1815 if (self.selectedPromoCode !== false) { 1816 if (self.eventPromotions[tmpkey]['promotionCode'] !== self.selectedPromoCode['promotionCode']) { 1817 continue; 1818 } 1819 } 1820 1821 let mykeyP = false; 1822 1823 for (const tmpkeyP in self.eventPromotions[tmpkey]['priceBlocks']) { 1824 if (self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] === self.eventPromotions[tmpkey]['priceBlocks'][tmpkeyP]['priceLevelId']) { 1825 mykeyP = tmpkeyP; 1826 break; 1827 } 1828 } 1829 1830 if (mykeyP !== false) { 1831 if (!self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_excluded']) { 1832 if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) < parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) { 1833 if (typeof self.eventPromotions[key]['priceBlocks'][keyP].bigPrice === 'undefined') { 1834 self.eventPromotions[key]['priceBlocks'][keyP].bigPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice']; 1835 } else { 1836 if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP].bigPrice) < parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) { 1837 self.eventPromotions[key]['priceBlocks'][keyP].bigPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice']; 1838 } 1839 } 1840 } 1841 } 1842 1843 if (self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop']) { 1844 if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) > parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) { 1845 if (typeof self.eventPromotions[key]['priceBlocks'][keyP].smallPrice === 'undefined') { 1846 self.eventPromotions[key]['priceBlocks'][keyP].smallPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice']; 1847 self.eventPromotions[key]['priceBlocks'][keyP].mustlogin = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop']; 1848 } else { 1849 if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP].smallPrice) > parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) { 1850 self.eventPromotions[key]['priceBlocks'][keyP].smallPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice']; 1851 self.eventPromotions[key]['priceBlocks'][keyP].mustlogin = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop']; 1852 } 1853 } 1854 } 1855 } 1856 } 1857 } 1858 1859 if (!self.eventPromotions[key]['priceBlocks'][keyP]['is_excluded']) { 1860 if (typeof usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']] === "undefined") { 1861 priceBlocks.push(self.eventPromotions[key]['priceBlocks'][keyP]); 1862 usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] + ''] = { 1863 'promo': [self.eventPromotions[key]], 1864 'position': priceBlocks.length - 1 1865 }; 1866 } else { 1867 //let promo = usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']].promo; 1868 //let position = usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']].position; 1869 //if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) < parseFloat(priceBlocks[position]['fullRetailPrice'])) { 1870 //priceBlocks[position] = self.eventPromotions[key]['priceBlocks'][keyP]; 1871 priceBlocks.push(self.eventPromotions[key]['priceBlocks'][keyP]); 1872 usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] + ''].promo.push(self.eventPromotions[key]); //} 1873 } 1874 } 1875 } 1876 } 1877 1878 return { 1879 'priceBlock': priceBlocks, 1880 'useBlock': usedBlocks 1881 }; 1882 } 1883 1884 getPriceBlocksAndUsedBlocksZones() { 1885 let priceBlocks = []; 1886 let self = this; 1887 let usedBlocks = {}; 1888 1889 for (const key in self.eventPromotions) { 1890 if (self.selectedPromoCode !== false) { 1891 if (self.eventPromotions[key]['promotionCode'] !== self.selectedPromoCode['promotionCode']) { 1892 continue; 1893 } 1894 } 1895 1896 for (const keyP in self.eventPromotions[key]['priceBlocks']) { 1897 for (const tmpkey in self.eventPromotions) { 1898 /*if (self.selectedPromoCode !== false) { 1899 if (self.eventPromotions[tmpkey]['promotionCode'] !== self.selectedPromoCode) { 1900 continue; 1901 } 1902 }*/ 1903 let mykeyP = false;
1904 1905 for (const tmpkeyP in self.eventPromotions[tmpkey]['priceBlocks']) { 1906 if (self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] === self.eventPromotions[tmpkey]['priceBlocks'][tmpkeyP]['priceLevelId']) { 1907 mykeyP = tmpkeyP; 1908 break; 1909 } 1910 } 1911 1912 if (mykeyP !== false) { 1913 if (!self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_excluded']) { 1914 if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) < parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) { 1915 if (typeof self.eventPromotions[key]['priceBlocks'][keyP].bigPrice === 'undefined') { 1916 self.eventPromotions[key]['priceBlocks'][keyP].bigPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice']; 1917 } else { 1918 if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP].bigPrice) < parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) { 1919 self.eventPromotions[key]['priceBlocks'][keyP].bigPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice']; 1920 } 1921 } 1922 } 1923 } 1924 1925 if (self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop']) { 1926 if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) > parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) { 1927 if (typeof self.eventPromotions[key]['priceBlocks'][keyP].smallPrice === 'undefined') { 1928 self.eventPromotions[key]['priceBlocks'][keyP].smallPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice']; 1929 self.eventPromotions[key]['priceBlocks'][keyP].mustlogin = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop']; 1930 } else { 1931 if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP].smallPrice) > parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) { 1932 self.eventPromotions[key]['priceBlocks'][keyP].smallPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice']; 1933 self.eventPromotions[key]['priceBlocks'][keyP].mustlogin = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop']; 1934 } 1935 } 1936 } 1937 } 1938 } 1939 } 1940 1941 if (!self.eventPromotions[key]['priceBlocks'][keyP]['is_excluded']) { 1942 if (typeof usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']] === "undefined") { 1943 priceBlocks.push(self.eventPromotions[key]['priceBlocks'][keyP]); 1944 usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] + ''] = { 1945 'promo': self.eventPromotions[key], 1946 'position': priceBlocks.length - 1 1947 }; 1948 } else { 1949 let promo = usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']].promo; 1950 let position = usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']].position; 1951 1952 if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) < parseFloat(priceBlocks[position]['fullRetailPrice'])) { 1953 priceBlocks[position] = self.eventPromotions[key]['priceBlocks'][keyP]; 1954 usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] + ''].promo = self.eventPromotions[key]; 1955 } 1956 } 1957 } 1958 } 1959 } 1960 1961 return { 1962 'priceBlock': priceBlocks, 1963 'useBlock': usedBlocks 1964 }; 1965 } 1966 1967 getPriceBlocksAndUsedBlocks() { 1968 let priceBlocks = []; 1969 let self = this; 1970 let usedBlocks = {}; 1971 1972 for (const key in self.eventPromotions) { 1973 if (self.selectedPromoCode !== false) { 1974 if (self.eventPromotions[key]['promotionCode'] !== self.selectedPromoCode['promotionCode']) { 1975 continue; 1976 } 1977 } 1978 1979 for (const keyP in self.eventPromotions[key]['priceBlocks']) { 1980 for (const tmpkey in self.eventPromotions) { 1981 if (self.selectedPromoCode !== false) { 1982 if (self.eventPromotions[tmpkey]['promotionCode'] !== self.selectedPromoCode['promotionCode']) { 1983 continue; 1984 } 1985 } 1986 1987 let mykeyP = false;
1988 1989 for (const tmpkeyP in self.eventPromotions[tmpkey]['priceBlocks']) { 1990 if (self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] === self.eventPromotions[tmpkey]['priceBlocks'][tmpkeyP]['priceLevelId']) { 1991 mykeyP = tmpkeyP; 1992 break; 1993 } 1994 } 1995 1996 if (mykeyP !== false) { 1997 if (!self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_excluded']) { 1998 if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) < parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) { 1999 if (typeof self.eventPromotions[key]['priceBlocks'][keyP].bigPrice === 'undefined') { 2000 self.eventPromotions[key]['priceBlocks'][keyP].bigPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice']; 2001 } else { 2002 if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP].bigPrice) < parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) { 2003 self.eventPromotions[key]['priceBlocks'][keyP].bigPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice']; 2004 } 2005 } 2006 } 2007 } 2008 2009 if (self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop']) { 2010 if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) > parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) { 2011 if (typeof self.eventPromotions[key]['priceBlocks'][keyP].smallPrice === 'undefined') { 2012 self.eventPromotions[key]['priceBlocks'][keyP].smallPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice']; 2013 self.eventPromotions[key]['priceBlocks'][keyP].mustlogin = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop']; 2014 } else { 2015 if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP].smallPrice) > parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) { 2016 self.eventPromotions[key]['priceBlocks'][keyP].smallPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice']; 2017 self.eventPromotions[key]['priceBlocks'][keyP].mustlogin = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop']; 2018 } 2019 } 2020 } 2021 } 2022 } 2023 } 2024 2025 if (!self.eventPromotions[key]['priceBlocks'][keyP]['is_excluded']) { 2026 if (typeof usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']] === "undefined") { 2027 priceBlocks.push(self.eventPromotions[key]['priceBlocks'][keyP]); 2028 usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] + ''] = { 2029 'promo': self.eventPromotions[key], 2030 'position': priceBlocks.length - 1 2031 }; 2032 } else { 2033 let promo = usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']].promo; 2034 let position = usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']].position; 2035 2036 if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) < parseFloat(priceBlocks[position]['fullRetailPrice'])) { 2037 priceBlocks[position] = self.eventPromotions[key]['priceBlocks'][keyP]; 2038 usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] + ''].promo = self.eventPromotions[key]; 2039 } 2040 } 2041 } 2042 } 2043 } 2044 2045 return { 2046 'priceBlock': priceBlocks, 2047 'useBlock': usedBlocks 2048 }; 2049 } 2050 2051 getPriceLevelIds() { 2052 let priceLevelIds = []; 2053 let self = this; 2054 2055 for (const key in self.eventPromotions) { 2056 for (const keyP in self.eventPromotions[key]['priceLevelIds']) { 2057 priceLevelIds.push(self.eventPromotions[key]['priceLevelIds'][keyP]); 2058 } 2059 } 2060 2061 return priceLevelIds; 2062 } 2063 2064 getTagIds() { 2065 let tagIds = []; 2066 let self = this; 2067 2068 for (const key in self.eventPromotions) { 2069 for (const keyP in self.eventPromotions[key]['tagIds']) { 2070 tagIds.push(self.eventPromotions[key]['tagIds'][keyP]); 2071 } 2072 } 2073 2074 return tagIds; 2075 } 2076 2077 getSubholdIds() { 2078 let subholdsIds = []; 2079 let self = this; 2080 2081 for (const key in self.eventPromotions) { 2082 //for (const keyP in self.eventPromotions[key]['priceBlocks']) { 2083 subholdsIds.push(self.eventPromotions[key]['holdSubclassId']); //} 2084 } 2085 2086 return subholdsIds; 2087 } 2088 2089 createPricingMap() { 2090 let self = this; 2091 let priceBlocks; 2092 let priceBlocksAndUsedBlocks = self.getPriceBlocksAndUsedBlocks(); 2093 priceBlocks = priceBlocksAndUsedBlocks.priceBlock; 2094 self.JPriceMap().html(''); 2095 self.JPriceMap().show(); 2096 self.JPriceMapExplanation().show(); 2097 self.JPriceBestSeats().remove(); 2098 self.selectedFilteredCategories = []; 2099 let priceArr = []; 2100 let priceBlockArr = self.objectToArray(priceBlocks); 2101 priceBlockArr.sort(self.comparePriceBlocks); 2102 let po = 0; 2103 jQuery('#price_login_signup').hide(); 2104 2105 for (let i1 = priceBlockArr.length - 1; i1 >= 0; i1--) {
2106 const key = priceBlockArr[i1][0]; //const value = priceBlockArr[i1][1]; 2107 2108 if (self.usedPriceLevelIds !== false && self.inArray(self.usedPriceLevelIds, priceBlocks[key]['priceLevelId'])) { 2109 let bigpricecut = ''; 2110 2111 if (typeof priceBlocks[key].bigPrice !== 'undefined' && priceBlocks[key]['fullRetailPrice'] !== priceBlocks[key].bigPrice) { 2112 bigpricecut = '<span class="bigpricecut">' + parseFloat(priceBlocks[key].bigPrice).toFixed(2) + '</span>'; 2113 } 2114 2115 if (priceBlocks[key].mustlogin && typeof priceBlocks[key].smallPrice !== 'undefined' && priceBlocks[key]['fullRetailPrice'] !== priceBlocks[key].smallPrice) { 2116 jQuery('#price_login_signup').show(); 2117 } 2118 2119 let priceDiv = '<div class="price_block" price_level_id="' + priceBlocks[key]['priceLevelId'] + '"><i class="slv slv-radio-unchecked" style="color:' + self.codeArray()[po] + '"></i><span class="price_block_pricing">$' + parseFloat(priceBlocks[key]['fullRetailPrice']).toFixed(2) + bigpricecut + '</span></div>'; 2120 2121 if (self.isPack()) { 2122 if (po === 0) { 2123 priceDiv = '<div class="price_block" price_level_id="' + priceBlocks[key]['priceLevelId'] + '"><i class="slv slv-radio-unchecked" style="color:' + self.codeArray()[po] + '"></i><span class="price_block_pricing">INCLUDED</span></div>'; 2124 self.initPackPrice = parseFloat(priceBlocks[key]['fullRetailPrice']).toFixed(2); 2125 } else { 2126 priceDiv = '<div class="price_block" price_level_id="' + priceBlocks[key]['priceLevelId'] + '"><i class="slv slv-radio-unchecked" style="color:' + self.codeArray()[po] + '"></i><span class="price_block_pricing">+$' + (parseFloat(priceBlocks[key]['fullRetailPrice']).toFixed(2) - self.initPackPrice).toFixed(2) + '</span></div>'; 2127 } 2128 } //priceArr can be sorted 2129 2130 2131 priceArr.push(priceDiv); 2132 po++; 2133 } 2134 } 2135 /*for (let k1 = priceArr.length - 1; k1 >= 0; k1--) { 2136 self.JPriceMap().append(jQuery(priceArr[k1])); 2137 }*/ 2138 2139 2140 for (let k1 = 0; k1 < priceArr.length; k1++) { 2141 self.JPriceMap().append(jQuery(priceArr[k1])); 2142 } 2143 2144 let optionsbest = ''; 2145 let step = 1; 2146 2147 if (!this.JFreeSeating()) { 2148 step = parseInt(this.JTicketsChooser().val()); 2149 } 2150 2151 if (step === 0) { 2152 step = 1; 2153 } 2154 2155 for (let oo = 0; oo <= 30; oo += step) { 2156 optionsbest += '<option value="' + oo.toString() + '">' + oo.toString() + '</option>'; 2157 } 2158 2159 let dropdownBestSeats = 'Select # of Seats:<select class="ticket_number_best">' + optionsbest + '</select>'; //self.JPriceMapSeats().append(jQuery('<div class="price_best_seats" style="display:none"><div class="best_seats_button">FIND BEST SEATS</div><div class="best_seats_text">This option will find the the best seats for your selected category. You can also manually select seats by clicking on them.' + dropdownBestSeats + '</div></div>')); 2160 2161 jQuery('.price_block').off('click').on('click', function () { 2162 const levelId = jQuery(this).attr('price_level_id'); 2163 const indexOfItem = self.selectedFilteredCategories.indexOf(levelId); 2164 2165 if (indexOfItem === -1) { 2166 self.selectedFilteredCategories.push(levelId); 2167 jQuery(this).addClass('price_block_selected'); 2168 } else { 2169 self.selectedFilteredCategories.splice(indexOfItem, 1); 2170 jQuery(this).removeClass('price_block_selected'); 2171 } 2172 2173 if (self.selectedFilteredCategories.length === 1) { 2174 jQuery('.price_best_seats').show(); 2175 } else { 2176 jQuery('.price_best_seats').hide(); 2177 } 2178 2179 if (typeof self.seatChart.changeConfig !== 'undefined') { 2180 self.seatChart.changeConfig({ 2181 filteredCategories: self.selectedFilteredCategories 2182 }); 2183 } else { 2184 self.seatChart.toggleCategoriesHighlightRender(self.selectedFilteredCategories); 2185 } 2186 }); 2187 jQuery('.best_seats_button:not(.bbrun)').off('click').on('click', function () { 2188 self.seatChart.selectBestAvailable({ 2189 'number': parseInt(jQuery('.ticket_number_best').val()), 2190 'category': self.selectedFilteredCategories[0] 2191 }); 2192 jQuery('.best_seats_button').addClass('bbrun'); 2193 self.JPriceMapSeats().find('.best_seats_text').html('<i class="slv slv-check-circle" style="color:#BC5AFF"></i> You\'ve got the best seats'); 2194 }); 2195 } 2196 2197 renderSeatChartCompleted(response) { 2198 jQuery('body').LoadingOverlay("hide"); 2199 2200 if (response.success === true) { 2201 let self = this; 2202 this.eventSeats = response.event_seats; 2203 this.eventPromotions = response.event_promotions; 2204 this.eventSections = response.event_sections; 2205 this.seatAlertsAndTooltipsPerLabel = response.seat_alerts; 2206
2207 if (!self.JFreeSeating()) { 2208 self.createDropDownSelect(response.dropdown_select, response.workspacekey, response.event); 2209 } else { 2210 self.selectedNumberOfTickets = 0; 2211 self.selectedPromoCode = false; 2212 self.renderSeatMap(response.workspacekey, response.event); 2213 self.createPricingMap(); 2214 } 2215 } else { 2216 __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({ 2217 title: 'Error!', 2218 text: 'There was an error rendering the seats chart. The page will now refresh', 2219 icon: 'error', 2220 confirmButtonText: 'OK', 2221 closeOnConfirm: true 2222 }).then(result => { 2223 /* Read more about isConfirmed, isDenied below */ 2224 if (result.isConfirmed) { 2225 window.location.href = window.location.href; 2226 } else if (result.isDenied) {//Swal.fire('Changes are not saved', '', 'info') 2227 } 2228 }); 2229 } 2230 } 2231 2232 createCalendar() { 2233 this.calendar = this.JFlatCalendar().flatpickr({ 2234 mode: 'single', 2235 disableMobile: true, 2236 inline: true, 2237 //locale: bbLocal.current_language, 2238 //dateFormat: this.getDateFormat(), 2239 altInput: false, 2240 clickOpens: false, 2241 allowInput: false, 2242 //static: true, 2243 onChange: jQuery.proxy(this.dateChanged, this), 2244 onMonthChange: jQuery.proxy(this.monthChanged, this), 2245 onDayCreate: jQuery.proxy(this.dayCreate, this) 2246 }); 2247 2248 if (this.JTheme() === 'light') { 2249 this.JBlankSeatsMap().html('<img src="/wp-content/themes/porto/images/no_selection_date_time_light.png"/><h4>Pick a date to see the available tickets</h4>'); 2250 } else { 2251 this.JBlankSeatsMap().html('<h4>Select a date from the Calendar</h4><img style="padding:80px;" src="/wp-content/themes/porto/images/no_selection_date_time.png"/>'); 2252 } //jQuery('<span>,</span>').insertAfter(jQuery('.flatpickr-monthDropdown-months')); 2253 2254 2255 jQuery('.flatpickr-monthDropdown-months').prop('disabled', 'disabled'); 2256 jQuery('.flatpickr-current-month input').prop('disabled', 'disabled'); 2257 2258 if (this.JGoToMonth() !== false) { 2259 this.calendar.jumpToDate(this.getEndOfMonths(this.JGoToMonth()['year'], this.JGoToMonth()['month'] - 1)); 2260 } else { 2261 if (this.firstDateWithEvent !== false) { 2262 this.calendar.jumpToDate(this.getEndOfMonth(this.firstDateWithEvent)); 2263 } 2264 } 2265 } 2266 2267 monthChanged(selectedDates, dateStr, instance) { 2268 //console.log(instance.currentMonth); 2269 let self = this; 2270 let curMonth = parseInt(instance.currentMonth) + 1; 2271 let curYear = parseInt(instance.currentYear); 2272 2273 if (self.JDualDates()) { 2274 let dyear = parseInt(self.JDualDates().attr('dyear')); 2275 let dmonth = parseInt(self.JDualDates().attr('dmonth')); 2276 let dtype = self.JDualDates().attr('dtype'); 2277 let durl = self.JDualDates().attr('durl'); 2278 2279 if (dtype === 'a') { 2280 if (dmonth <= curMonth && curYear === dyear || curYear > dyear) { 2281 window.location.href = durl + '&dmonth=' + curMonth + '&dyear=' + curYear; 2282 } 2283 } else if (dtype === 'b') { 2284 if (dmonth > curMonth && curYear === dyear || curYear < dyear) { 2285 window.location.href = durl + '&dmonth=' + curMonth + '&dyear=' + curYear; 2286 } 2287 } 2288 } 2289 } 2290 2291 getLastDay(y, m) { 2292 return 30 + (m <= 7 ? m % 2 ? 1 : 0 : !(m % 2) ? 1 : 0) - (m == 2) - (m == 2 && y % 4 != 0 || !(y % 100 == 0 && y % 400 == 0)); 2293 } 2294 2295 getLastTrueDay(y, m) { 2296 return new Date(y, m + 1, 0).getDate(); 2297 } 2298 2299 getEndOfMonth(date) { 2300 let nextMonth = new Date(date.getFullYear(), date.getMonth(), this.getLastTrueDay(date.getFullYear(), date.getMonth())); 2301 return nextMonth; 2302 } 2303 2304 getEndOfMonths(dateYear, dateMonth) { 2305 let nextMonth = new Date(dateYear, dateMonth, this.getLastDay(dateYear, dateMonth)); 2306 return nextMonth; 2307 } 2308 2309 dayCreate(dObj, dStr, fp, dayElem) { 2310 if (jQuery(dayElem).hasClass('prevMonthDay') || jQuery(dayElem).hasClass('nextMonthDay')) { 2311 jQuery(dayElem).addClass('disabled').css('visibility', 'hidden'); 2312 } 2313 2314 let self = this; 2315 let found = false; 2316 let today = new Date(); //if (!self.JIsAttraction()) { 2317 2318 today = new Date(today.getFullYear(), today.getMonth(), today.getDate()); //} 2319 2320 if (self.compare_asc(dayElem.dateObj, today.getTime()) >= 0) { 2321 for (const key in self.eventList) { 2322 let cDate = self.createDateAsUTC(dayElem.dateObj); 2323 cDate.setTime(cDate.getTime() + self.getTimezoneInMiliseconds(cDate)); 2324 2325 if (key === flatpickr.formatDate(cDate, 'Y-m-d')) { 2326 found = true; 2327 break; 2328 } 2329 } 2330 } 2331 2332 let start_date = self.packStartDate(); 2333 let end_date = self.packEndDate(); 2334 2335 if (start_date !== false && end_date !== false) { 2336 if (self.compare_asc(dayElem.dateObj, start_date.getTime() + self.getTimezoneInMiliseconds(start_date)) < 0) { 2337 jQuery(dayElem).addClass('flatpickr-disabled'); 2338 } 2339 2340 if (self.compare_asc(dayElem.dateObj, end_date.getTime() + self.getTimezoneInMiliseconds(end_date)) > 0) { 2341 jQuery(dayElem).addClass('flatpickr-disabled'); 2342 } 2343 } 2344 2345 if (found) { 2346 dayElem.innerHTML += "<span class='bbevent'></span>"; 2347 } else { 2348 jQuery(dayElem).addClass('flatpickr-disabled'); 2349 } 2350 } 2351 2352 createDropDownAttraction(mint, maxt, reqev, i, j) { 2353 let dropd = '<select i="' + i + '" j="' + j + '" name="attraction_select_' + i + '_' + j + '" class="attraction_mint_maxt">'; 2354 let step = 1; //this needs to be a setting but because only brad garreth has zones and is from 2 +2 then we leave like this 2355 2356 dropd += '<option value="' + 0 + '">' + 0 + '</option>'; 2357 2358 for (let p = mint + 1; p < maxt; p = p + step) { 2359 dropd += '<option value="' + p + '">' + p + '</option>'; 2360 } 2361 2362 dropd += '</select>'; 2363 return dropd; 2364 } 2365 2366 renderTicketSelector(event_id) { 2367 let self = this;
2368 let pID; 2369 2370 if (self.JIsAttraction()) { 2371 pID = jQuery('#attraction_id').attr('pid'); 2372 } else { 2373 pID = self.getParameterByName('product_id'); 2374 } 2375 2376 const data = { 2377 action: 'event_seats', 2378 product_id: pID, 2379 event_id: event_id, 2380 security: jQuery('#rwb_event_seats_nonce').val() 2381 }; 2382 jQuery('body').LoadingOverlay("show"); 2383 jQuery.ajax({ 2384 type: 'POST', 2385 dataType: 'json', 2386 url: bbLocal.ajax_url, 2387 data: data, 2388 success: jQuery.proxy(self.renderTicketSelectorCompleted, self) 2389 }); 2390 } 2391 2392 renderTicketSelectorCompleted(response) { 2393 jQuery('body').LoadingOverlay("hide"); 2394 2395 if (response.success === true) { 2396 this.eventPromotions = response.event_promotions; 2397 this.eventSections = response.event_sections; 2398 this.renderTicketSelectorAction(); 2399 } else { 2400 __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({ 2401 title: 'Error!', 2402 text: 'There was an error rendering the seats chart. The page will now refresh', 2403 icon: 'error', 2404 confirmButtonText: 'OK', 2405 closeOnConfirm: true 2406 }).then(result => { 2407 /* Read more about isConfirmed, isDenied below */ 2408 if (result.isConfirmed) { 2409 window.location.href = window.location.href; 2410 } else if (result.isDenied) {//Swal.fire('Changes are not saved', '', 'info') 2411 } 2412 }); 2413 } 2414 } 2415 2416 sortUsingNestedText(parent, childSelector, keySelector) { 2417 var items = parent.children(childSelector).sort(function (a, b) { 2418 var vA = parseFloat(jQuery(keySelector, a).text().substring(1)); 2419 var vB = parseFloat(jQuery(keySelector, b).text().substring(1)); 2420 return vA > vB ? -1 : vA < vB ? 1 : 0; 2421 }); 2422 parent.append(items); 2423 } 2424 2425 renderTicketSelectorAction() { 2426 let self = this; 2427 this.JBlankSeatsMap().hide(); 2428 this.JPriceMapSeats().show(); 2429 this.JPriceMapSeats().html(''); 2430 2431 if (this.JZoneImage().length > 0) { 2432 let zimage = this.JZoneImage().clone(); 2433 zimage.removeClass('is_first'); 2434 zimage.show(); 2435 this.JPriceMapSeats().append(zimage); 2436 } 2437 2438 let selectedPriceLevelIds = self.getPriceLevelIds(); 2439 let priceBlocksAll; 2440 2441 if (this.JZoneImage().length > 0) { 2442 priceBlocksAll = self.getPriceBlocksAndUsedBlocksZones(); 2443 } else { 2444 priceBlocksAll = self.getPriceBlocksAndUsedBlocksAttraction(); 2445 } 2446 2447 let priceBlocksArr = priceBlocksAll['priceBlock']; 2448 let priceBlocks = self.objectToArray(priceBlocksArr); 2449 priceBlocks.sort(self.comparePriceBlocks); 2450 let usedBlocks = priceBlocksAll['useBlock']; 2451 let nBlocks = []; 2452 2453 for (const keySeats in self.eventSections) { 2454 if (selectedPriceLevelIds !== false) { 2455 let isCat = false; 2456 2457 for (const i in selectedPriceLevelIds) { 2458 if (self.eventSections[keySeats]['priceLevelID'] === selectedPriceLevelIds[i]) { 2459 isCat = true; 2460 break; 2461 } 2462 } 2463 2464 if (isCat) { 2465 let maxt = parseInt(self.eventSections[keySeats]['availableQuantity']) + 1; 2466 let mint = 0; 2467 2468 if (typeof self.eventSections[keySeats]['minTickets'] !== 'undefined') { 2469 mint = parseInt(self.eventSections[keySeats]['minTickets']) - 1; 2470 } 2471 2472 if (typeof self.eventSections[keySeats]['maxTickets'] !== 'undefined') { 2473 if (parseInt(self.eventSections[keySeats]['maxTickets']) + 1 < maxt) { 2474 maxt = parseInt(self.eventSections[keySeats]['maxTickets']) + 1; 2475 } 2476 } 2477 2478 if (maxt > 0) { 2479 let priceLeveId = self.eventSections[keySeats]['priceLevelID']; 2480 2481 if (this.JZoneImage().length === 0) { 2482 if (self.inArray(nBlocks, priceLeveId)) { 2483 continue; 2484 } 2485 2486 nBlocks.push(priceLeveId); 2487 } 2488 2489 for (const j in priceBlocks) { 2490 const key = priceBlocks[j][0]; 2491 2492 if (priceBlocksArr[key]['priceLevelId'] === priceLeveId) { 2493 if (!Array.isArray(usedBlocks[priceLeveId]['promo'])) { 2494 let p = JSON.parse(JSON.stringify(usedBlocks[priceLeveId]['promo'])); 2495 usedBlocks[priceLeveId]['promo'][key] = p; 2496 } 2497 2498 for (const p1 in usedBlocks[priceLeveId]['promo']) { 2499 if (p1 === key || this.JZoneImage().length > 0 || this.JIsRedeam()) { 2500 let title = priceBlocksArr[key]['attraction_title_price']; 2501 let desc = priceBlocksArr[key]['attraction_desc_price']; 2502 let hasNameWeight = priceBlocksArr[key]['attraction_has_nw']; 2503 let pickupLocations = priceBlocksArr[key]['attraction_pickup_loc']; 2504 let pickupLocationsNonApi = priceBlocksArr[key]['attraction_pickupl']; 2505 let iPrice = '$' + parseFloat(priceBlocksArr[key]['fullRetailPrice']).toFixed(2); 2506 let reqev = priceBlocksArr[key]['require_even_number']; 2507 let promoCode = usedBlocks[priceLeveId]['promo'][p1]['promotionCode']; 2508 let dropdown = self.createDropDownAttraction(mint, maxt, reqev, promoCode, priceLeveId); 2509 let bigpricecut = ''; 2510 2511 if (promoCode.indexOf('ADULT') === -1 && promoCode.indexOf('CHILD') === -1) { 2512 if (typeof usedBlocks[priceLeveId]['promo'][p1]['priceBlocks'][priceLeveId].bigPrice !== 'undefined' && usedBlocks[priceLeveId]['promo'][p1]['priceBlocks'][priceLeveId]['fullRetailPrice'] !== usedBlocks[priceLeveId]['promo'][p1]['priceBlocks'][priceLeveId].bigPrice) { 2513 bigpricecut = '<span class="bigpricecut">' + parseFloat(usedBlocks[priceLeveId]['promo'][p1]['priceBlocks'][priceLeveId].bigPrice).toFixed(2) + '</span>'; 2514 } 2515 } 2516 2517 if (usedBlocks[priceLeveId]['promo'][p1]['priceBlocks'][priceLeveId].mustlogin && typeof usedBlocks[priceLeveId]['promo'][p1]['priceBlocks'][priceLeveId].smallPrice !== 'undefined' && usedBlocks[priceLeveId]['promo'][p1]['priceBlocks'][priceLeveId]['fullRetailPrice'] !== usedBlocks[priceLeveId]['promo'][p1]['priceBlocks'][priceLeveId].smallPrice) { 2518 jQuery('#price_login_signup').show(); 2519 } 2520 2521 let hasnw = ''; 2522 2523 if (hasNameWeight) { 2524 hasnw = ' hasnw'; 2525 } 2526 2527 let haspp = ''; 2528 let withDescDiv = '<div class="attraction_box wdesc"><div class="attraction_box_title_price"><div class="attraction_box_title">' + title + '</div><div class="attraction_box_price">' + iPrice + bigpricecut + '</div></div><div class="attraction_box_desc_dropdown"><div class="attraction_box_desc">' + desc + '</div><div class="attraction_box_dropdown' + hasnw + '">' + dropdown + '</div></div></div>'; 2529 let withoutDescDiv = '<div class="attraction_box"><div class="attraction_box_title_price"><div class="attraction_box_title">' + title + '</div></div><div class="attraction_box_price_dropdown"><div class="attraction_box_price">' + iPrice + bigpricecut + '</div><div class="attraction_box_dropdown' + hasnw + '">' + dropdown + '</div></div></div>'; 2530 2531 if (desc !== '') { 2532 this.JPriceMapSeats().append(jQuery(withDescDiv)); 2533 } else { 2534 this.JPriceMapSeats().append(jQuery(withoutDescDiv)); 2535 } 2536 2537 if (pickupLocations && pickupLocations.length > 1) { 2538 let pickuploc = '<div class="pikkloc">Select pickup location: <select name="pickuploc" class="attraction_pickuploc">'; //pickuploc += '<option value="' + 0 + '">' + 0 + '</option>'; 2539 2540 for (const i in pickupLocations) { 2541 pickuploc += '<option value="' + pickupLocations[i]['hotelLocationId'] + '">' + pickupLocations[i]['locationName'] + '</option>'; 2542 } 2543 2544 pickuploc += '</select></div>'; 2545 this.JPriceMapSeats().append(pickuploc); 2546 jQuery('.pikkloc').hide(); 2547 } 2548 2549 if (pickupLocationsNonApi && pickupLocationsNonApi.length > 1) { 2550 let pickuploc = '<div class="pikkloc">Select pickup location: <select name="pickuploc" class="attraction_pickuploc">'; //pickuploc += '<option value="' + 0 + '">' + 0 + '</option>'; 2551 2552 for (const i in pickupLocationsNonApi) { 2553 pickuploc += '<option value="' + i + '">' + pickupLocationsNonApi[i] + '</option>'; 2554 } 2555 2556 pickuploc += '</select></div>'; 2557 this.JPriceMapSeats().append(pickuploc); 2558 jQuery('.pikkloc').hide(); 2559 } 2560 2561 break; 2562 } 2563 } 2564 } 2565 } 2566 } //seat_labels_categories[self.eventSections[keySeats]['key']] = "" + self.eventSections[keySeats]['priceLevelID'];//self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName']; 2567 //object_categories[self.eventSections[keySeats]['key']] = self.eventSections[keySeats]['availableQuantity']; 2568 //self.usedPriceLevelIds.push(self.eventSections[keySeats]['priceLevelID']); 2569 2570 } 2571 } 2572 } 2573 2574 self.sortUsingNestedText(jQuery('#price_map_seats'), '.attraction_box', '.attraction_box_price'); 2575 self.JTicketsButtonsCart().html(''); 2576 self.JTicketsButtonsCart().parent().find('.best_price_guaranteed').remove(); 2577 2578 if (self.JIsAttraction() || self.JZoneImage().length > 0) { 2579 if (!self.isMobile()) { 2580 self.JTicketsButtonsCart().append(jQuery('<div class="best_price_guaranteed"> <span class="slv slv-check-circle"></span><span class="bb_link_product_text">Best price guaranteed</span> </div>')); 2581 } else { 2582 self.JTicketsButtonsCart().parent().append(jQuery('<div class="best_price_guaranteed"> <span class="slv slv-check-circle"></span><span class="bb_link_product_text">Best price guaranteed</span> </div>')); 2583 } 2584 } 2585 2586 self.JTicketsButtonsCart().append(jQuery('<a href="#0" class="saddcart">
2586Add To Cart</a>')).append(jQuery('<a href="#0" class="sbuynow">Buy Now</a>')); //.append(jQuery('<a href="#0" class="button btn sadd_to_cart_btn">Add To Cart</a>')) 2587 2588 this.JBuyButton().off('click').on('click', jQuery.proxy(this.buyNowActionA, this)); 2589 this.JAddToCartButton().off('click').on('click', jQuery.proxy(this.addToCartActionA, this)); 2590 jQuery('.attraction_box_dropdown select').off('change').on('change', function () { 2591 let hasBig = false; 2592 let sVal = 0; 2593 jQuery('.attraction_box_dropdown select').each(function () { 2594 if (parseInt(jQuery(this).val()) > 0) { 2595 hasBig = true; 2596 sVal = parseInt(jQuery(this).val()); 2597 } 2598 }); 2599 jQuery('.nwdata').remove(); 2600 2601 if (hasBig) { 2602 if (jQuery(this).parent().hasClass('hasnw')) { 2603 self.JPriceMapSeats().append(jQuery('<div class="nwdata"></div>')); 2604 2605 if (jQuery('.pikkloc').length > 0) { 2606 jQuery('.pikkloc').show(); 2607 jQuery('.pikkloc').appendTo(self.JPriceMapSeats().find('.nwdata')); 2608 } 2609 2610 for (let i1 = 0; i1 < sVal; i1++) { 2611 self.JPriceMapSeats().find('.nwdata').append(jQuery('<div class="bdwlh">Guest ' + (i1 + 1) + ' Details</div>')); 2612 self.JPriceMapSeats().find('.nwdata').append(jQuery('<div class="bdwl bdwl' + i1 + '"></div>')); 2613 let vv = ".nwdata .bdwl" + i1; 2614 self.JPriceMapSeats().find(vv).append(jQuery('<div class="bwdli"> <label class="nwcbb">First Name:</label> <input name="fname[]" class="nwcbb bbfname" type="text"></div>')); 2615 self.JPriceMapSeats().find(vv).append(jQuery('<div class="bwdli"> <label class="nwcbb">Last Name:</label> <input name="lname[]" class="nwcbb bblname" type="text"></div>')); 2616 self.JPriceMapSeats().find(vv).append(jQuery('<div class="bwdli"> <label class="nwcbb">Weight:</label> <input name="weight[]" class="nwcbb bbweight" type="number"> <span class="bbwlb">LB</span></div>')); 2617 } 2618 } else { 2619 if (jQuery('.pikkloc').length > 0 && !self.JPriceMapSeats().data('pikkloc')) { 2620 jQuery('.pikkloc').first().show(); 2621 jQuery('.pikkloc').first().appendTo(self.JPriceMapSeats()); 2622 self.JPriceMapSeats().data('pikkloc', 1); 2623 } 2624 } 2625 2626 jQuery('.tickets_cart').insertAfter(self.JPriceMapSeats()); 2627 self.JTicketsCart().show(); 2628 self.JTicketsButtonsCart().show(); 2629 2630 if (!self.JTicketsButtonsCart().hasClass('tb_attraction')) { 2631 self.JTicketsButtonsCart().addClass('tb_attraction'); 2632 } 2633 2634 jQuery('.rwb_is_attraction').animate({ 2635 scrollTop: 0 2636 }, 'slow'); 2637 } else { 2638 self.JTicketsCart().hide(); 2639 self.JTicketsButtonsCart().hide(); 2640 } 2641 }); 2642 } 2643 2644 dateChanged(selectedDates, dateStr, instance) { 2645 let self = this; 2646 let eventTimes = this.eventList[dateStr]['event_times']; 2647 let eventIds = this.eventList[dateStr]['id']; 2648 /*if (this.JEventsPerDate().flickity().length) { 2649 this.JEventsPerDate().flickity('destroy'); 2650 }*/ 2651 2652 self.createDestroySeatChart(); 2653 this.JTicketsCart().hide(); 2654 this.JEventsPerDate().html(''); 2655 this.JEventsPerDateBeforeText().find('.number_of_tickets_text').html(''); 2656 this.JEventsPerDate().show(); 2657 this.JEventSelection().show(); 2658 this.JEventsPerDateBeforeText().show(); 2659 2660 if (eventTimes.length > 0) { 2661 this.JEventsPerDateBeforeText().prepend('<div class="number_of_tickets_text">Select Time:</div>'); 2662 } 2663 2664 let p = 0; 2665 const c = 1; 2666 2667 for (const i in eventTimes) { 2668 this.JEventsPerDate().append(this.JTimeElem(eventIds[i], eventTimes[i], dateStr, i)); //this.JEventsPerDate().append(this.JTimeElem(eventIds[i], eventTimes[i], dateStr, i)); 2669 2670 p += c; //this.JEventsPerDate().append(this.JTimeElem(eventIds[i], eventTimes[i], dateStr, i)); 2671 } 2672 2673 if (self.JIsAttraction() && p > 1) { 2674 /*this.JEventsPerDate().flickity({ 2675 // options 2676 cellAlign: 'left', 2677 contain: true, 2678 groupCells: 1, 2679 cellSelector: '.time_elem', 2680 //wrapAround: true, 2681 freeScroll: true, 2682 draggable: true, 2683 pageDots: false 2684 });*/ 2685 } 2686 2687 seamless.elementScrollIntoView(document.querySelector('.event_selection_ticket'), { 2688 behavior: 'smooth', 2689 inline: 'center', 2690 block: 'center' 2691 }); 2692 self.scrollWindow(); 2693 jQuery('.time_elem').on('click', function () { 2694 self.selectedEventId = jQuery(this).attr('event_id'); 2695 self.selectedeventPromotionsIds = self.eventList[jQuery(this).attr('event_date')]['event_promotions'][parseInt(j
2695Query(this).attr('ev_pos'))]; 2696 let eviHour; 2697 eviHour = jQuery(this).attr('event_hour'); 2698 2699 if (jQuery('.time_elem').length === 1 && self.JIsAttraction()) { 2700 eviHour = 'none'; 2701 } 2702 2703 self.selectedEventData = { 2704 'event_date': jQuery(this).attr('event_date'), 2705 'event_location': jQuery('.show_location').html(), 2706 'event_time': eviHour 2707 }; 2708 jQuery('.time_elem').removeClass('time_elem_active'); 2709 jQuery(this).addClass('time_elem_active'); 2710 2711 if (jQuery('.time_elem').length === 1) { 2712 seamless.elementScrollIntoView(document.querySelector('.event_selection_ticket'), { 2713 behavior: 'smooth', 2714 inline: 'center', 2715 block: 'center' 2716 }); 2717 } else { 2718 seamless.elementScrollIntoView(document.querySelector('.bpsm_wrapper'), { 2719 behavior: 'smooth', 2720 inline: 'center', 2721 block: 'center' 2722 }); 2723 } 2724 2725 self.scrollWindow(); 2726 2727 if (self.JIsAttraction() || self.JZoneImage().length > 0) { 2728 self.renderTicketSelector(self.selectedEventId); 2729 } else { 2730 self.renderSeatChart(self.selectedEventId); 2731 } 2732 }); 2733 let def_ev = self.getParameterByName('def_ev') || self.getParameterByName('event_id'); 2734 2735 if (def_ev !== null && def_ev !== '') { 2736 jQuery('.time_elem[event_id="' + def_ev + '"]').trigger('click'); 2737 } else { 2738 if ((self.JIsAttraction() || self.JZoneImage().length > 0) && p === 1) { 2739 jQuery('.time_elem').trigger('click'); 2740 jQuery('.event_selection_ticket:not(.riszone)').hide(); 2741 } 2742 2743 if (!self.JIsAttraction() && p === 1) { 2744 jQuery('.time_elem').trigger('click'); 2745 } 2746 } 2747 } 2748 2749 updatePageDesign(data) { 2750 //jQuery('.show_image_tickets').html(data.seat_image); 2751 //jQuery('.show_description_tickets').html(data.seat_text); 2752 //jQuery('.flat_calendar').html('<input type="text" name="flat_calendar" id="flat_calendar" style="display:none">'); 2753 //jQuery('.show_btn_tickets').html('<a href="' + data.event_url + '" class="button btn">' + data.event_url_text + '</a>'); 2754 this.firstDateWithEvent = false; 2755 let self = this; 2756 let today = Date.now(); 2757 today = today + new Date().getTimezoneOffset() * 60 * 1000 - today % (3600 * 1000 * 24); 2758 let minTime = 10000000000000000000000000000; //today.setTime(today.getTime() + today.getTimezoneInMiliseconds(today)); 2759 2760 for (const key in this.eventList) { 2761 let start_date = self.packStartDate(); 2762 let end_date = self.packEndDate(); 2763 let cDate = self.createDateAsUTC(new Date(key.replace(/-/g, "/") + " 00:00:00")); 2764 cDate.setTime(cDate.getTime() + self.getTimezoneInMiliseconds(cDate)); 2765 2766 if (self.compare_asc(cDate.getTime(), today) >= 0 && minTime > cDate.getTime()) { 2767 if (start_date !== false && end_date !== false) { 2768 if (self.compare_asc(cDate.getTime(), start_date.getTime() + self.getTimezoneInMiliseconds(start_date)) >= 0 && self.compare_asc(cDate.getTime(), end_date.getTime() + self.getTimezoneInMiliseconds(end_date)) <= 0) { 2769 minTime = cDate.getTime(); 2770 self.firstDateWithEvent = cDate; //break; 2771 } 2772 } else { 2773 minTime = cDate.getTime(); 2774 self.firstDateWithEvent = cDate; //break; 2775 } 2776 } 2777 } 2778 2779 this.createCalendar(); 2780 2781 if (self.isPack()) { 2782 jQuery('.bpackseats').show(); 2783 } 2784 2785 let def_date = self.getParameterByName('def_date') || self.getParameterByName('start_date'); 2786 2787 if (def_date !== null && def_date !== '') { 2788 this.calendar.setDate(def_date, true); 2789 } 2790 } 2791 2792 renderEventsCompleted(response) { 2793 if (response.success === true) { 2794 jQuery('body').LoadingOverlay("hide"); 2795 this.eventList = response.events; 2796 this.updatePageDesign(response); 2797 } else { 2798 __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({ 2799 title: 'Error!', 2800 text: 'There was an error rendering the events. The page will now refresh', 2801 icon: 'error', 2802 confirmButtonText: 'OK', 2803 closeOnConfirm: true 2804 }).then(result => { 2805 /* Read more about isConfirmed, isDenied below */ 2806 if (result.isConfirmed) { 2807 window.location.href = window.location.href; 2808 } else if (result.isDenied) {//Swal.fire('Changes are not saved', '', 'info') 2809 } 2810 }); 2811 } 2812 } 2813 2814 initSeatsMap() { 2815 this.renderEvents(); 2816 } 2817 2818 buyTicketsAction() { 2819 this.JBuyTickets().attr('href', jQuery('#url_seats').attr('url')); 2820 } 2821 2822 hideQtyAddToCart() { 2823 this.JForm().find('.single_add_to_cart_button ').hide(); 2824 this.JForm().find('.single_add_to_cart_button ').prev().hide(); 2825 } 2826 /*[ 2827 { 2828 'category': 'red', 'ticketTypes': [ 2829 { 2830 'ticketType': 'adult', 2831 'price': 30, 2832 'label': 'For adults', 2833 'description': 'Includes hot meal and a drink' 2834 }, 2835 { 2836 'ticketType': 'child', 2837 'price': 20, 2838 'label': 'For children', 2839 'description': 'Includes burger and fries' 2840 } 2841 ] 2842 } 2843 ] 2844 [ 2845 {key: 'red', color: 'red', label: 'Category 1', accessible: true}, 2846 {key: 'blue', color: 'blue', label: 'Category 2'} 2847 ] 2848 ['red'] 2849 */ 2850 2851 /* 2852 { 2853 '101-A-1': 'red', 2854 '101-A-2': 'red', 2855 } 2856 */ 2857 2858 2859 opacityToHex(hexCode) {//return hexCode + '4D'; 2860 } 2861 2862 codeArray() { 2863 return [ 2864 2865 '#6495ED', '#DE3163', '#FFBF00', '#680093', '#9FE2BF', '#FF7F50', '#CCCCFF', '#ffb6c1', 2866 '#fa8072', '#800080', '#20b2aa', '#088da5', '#e68abc', '#bf4974', '#f821f6', '#e2de82', 2867 2868 '#e6194b', '#3cb44b', '#ffe119', '#4363d8', '#f58231', '#911eb4', '#46f0f0', '#f032e6', 2869 '#bcf60c', '#fabebe', '#008080', '#e6beff', '#9a6324', '#fffac8', '#800000', '#aaffc3', 2870 '#808000', '#ffd8b1', '#000075', '#808080', '#000000', '#1abc9c', '#2ecc71', '#3498db', 2871 '#9b59b6', '#34495e', '#16a085', '#27ae60', '#2980b9', '#8e44ad', '#2c3e50', '#f1c40f', 2872 '#e67e22', '#e74c3c', '#ecf0f1', '#95a5a6', '#f39c12', '#d35400', '#c0392b', '#bdc3c7', 2873 '#7f8c8d', '#ff9ff3', '#feca57', '#ff6b6b', '#48dbfb', '#1dd1a1', '#5f27cd', '#54a0ff', 2874 '#00d2d3', '#01a3a4', '#00b894', '#00cec9', '#0984e3', '#6c5ce7', '#fdcb6e', '#e17055', 2875 '#d63031', '#e84393', '#2d3436', '#74b9ff', '#a29bfe', '#81ecec', '#55efc4', '#ffeaa7', 2876 '#fab1a0', '#ff7675', '#fd79a8', '#636e72', '#833471', '#ff3838', '#ffb8b8', '#ff9f1a', 2877 '#fffa65', '#32ff7e', '#7efff5', '#18dcff', '#7d5fff', '#7158e2', '#3ae374', '#f7f1e3', 2878 '#c4e538', '#12cbc4', '#5758bb', '#1289a7', '#b53471', '#833471', '#009432', '#006266', 2879 '#1e3799', '#6a89cc', '#4a69bd', '#82ccdd', '#60a3bc', '#78e08f', '#38ada9', '#079992' 2880 ]; 2881 } 2882 2883 getPricingCategoriesAndCategoriesLabelsAndUnavailableCategoriesAndSeatLabelsCategoriesAzure() {
2884 let categories = []; 2885 let self = this; 2886 self.usedPriceLevelIds = []; 2887 categories['unavailable_categories'] = []; //categories['available_categories'] = []; 2888 2889 categories['categories_labels'] = []; 2890 categories['seat_labels_categories'] = []; 2891 categories['pricing_categories'] = []; 2892 let selectedPriceLevelIds = false; 2893 let selectedHoldSubclassId = false; 2894 let selectedTagsId = false; 2895 2896 if (self.selectedPromoCode !== false) { 2897 const type = self.selectedPromoCode['limitType']; 2898 2899 if (type === 'PriceLevel') { 2900 selectedPriceLevelIds = self.selectedPromoCode['priceLevelIds']; 2901 } 2902 2903 if (type === 'Hold') { 2904 selectedHoldSubclassId = self.selectedPromoCode['holdSubclassId']; 2905 } 2906 2907 if (type === 'Tag') { 2908 selectedTagsId = self.selectedPromoCode['tagIds']; 2909 } 2910 } else { 2911 selectedPriceLevelIds = self.getPriceLevelIds(); 2912 selectedHoldSubclassId = self.getSubholdIds(); 2913 selectedTagsId = self.getTagIds(); 2914 } 2915 2916 let categories_pricing = []; 2917 let categories_labels = []; 2918 self.ticketTypeAll = false; 2919 let ticketTypes = []; 2920 let selectedPromoCodeElementAndUsedBlocks = self.getPriceBlocksAndUsedBlocks(); 2921 let selectedPromoCodeElement = selectedPromoCodeElementAndUsedBlocks.priceBlock; 2922 self.usedBlocks = selectedPromoCodeElementAndUsedBlocks.useBlock; 2923 let po = 0; 2924 let priceBlockArr = self.objectToArray(selectedPromoCodeElement); //if (!self.isPack()) { 2925 2926 priceBlockArr.sort(self.comparePriceBlocksPack); //} else { 2927 //priceBlockArr.sort(self.comparePriceBlocks); 2928 //} 2929 2930 let seat_labels_categories = []; 2931 let object_categories = []; 2932 2933 for (const keySeats in self.eventSeats) { 2934 if (selectedPriceLevelIds !== false) { 2935 let isCat = false; 2936 2937 for (const i in selectedPriceLevelIds) { 2938 if (self.eventSeats[keySeats]['priceLevelId'] === selectedPriceLevelIds[i]) { 2939 isCat = true; 2940 break; 2941 } 2942 } 2943 2944 if (isCat) { 2945 //seat_labels_categories[keySeats] = "" + self.eventSeats[keySeats]['priceLevelId'];//self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName']; 2946 seat_labels_categories.push({ 2947 id: keySeats, 2948 categoryId: "" + self.eventSeats[keySeats]['priceLevelId'], 2949 label: keySeats, 2950 statusId: 'active', 2951 disability: false, 2952 alert: '', 2953 ga: { 2954 max: 0, 2955 current: 0 2956 } 2957 }); 2958 self.usedPriceLevelIds.push(self.eventSeats[keySeats]['priceLevelId']); 2959 } else {} 2960 } 2961 2962 if (selectedTagsId !== false) { 2963 let isCat = false; 2964 2965 for (const i in selectedTagsId) { 2966 if (self.eventSeats[keySeats]['tagId'] === selectedTagsId[i]) { 2967 isCat = true; 2968 break; 2969 } 2970 } 2971 2972 if (isCat) { 2973 //seat_labels_categories[keySeats] = "" + self.eventSeats[keySeats]['priceLevelId'];//self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName']; 2974 seat_labels_categories.push({ 2975 id: keySeats, 2976 categoryId: "" + self.eventSeats[keySeats]['priceLevelId'], 2977 label: keySeats, 2978 statusId: 'active', 2979 disability: false, 2980 alert: '', 2981 ga: { 2982 max: 0, 2983 current: 0 2984 } 2985 }); 2986 self.usedPriceLevelIds.push(self.eventSeats[keySeats]['priceLevelId']); 2987 } else {} 2988 } 2989 2990 if (selectedHoldSubclassId !== false) { 2991 let isCat = false; 2992 2993 if (self.eventSeats[keySeats]['holdSubclassId'] === selectedHoldSubclassId) { 2994 isCat = true; 2995 } 2996 2997 if (isCat) { 2998 //seat_labels_categories[keySeats] = "" + self.eventSeats[keySeats]['priceLevelId'];//self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName']; 2999 seat_labels_categories.push({ 3000 id: keySeats, 3001 categoryId: "" + self.eventSeats[keySeats]['priceLevelId'],
3002 label: keySeats, 3003 statusId: 'active', 3004 disability: false, 3005 alert: '', 3006 ga: { 3007 max: 0, 3008 current: 0 3009 } 3010 }); 3011 self.usedPriceLevelIds.push(self.eventSeats[keySeats]['priceLevelId']); 3012 } else {} 3013 } 3014 } //gaSections 3015 3016 3017 for (const keySeats in self.eventSections) { 3018 if (selectedPriceLevelIds !== false) { 3019 let isCat = false; 3020 3021 for (const i in selectedPriceLevelIds) { 3022 if (self.eventSections[keySeats]['priceLevelID'] === selectedPriceLevelIds[i]) { 3023 isCat = true; 3024 break; 3025 } 3026 } 3027 3028 if (isCat) { 3029 //seat_labels_categories[self.eventSections[keySeats]['key']] = "" + self.eventSections[keySeats]['priceLevelID'];//self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName']; 3030 seat_labels_categories.push({ 3031 id: self.eventSections[keySeats]['key'], 3032 categoryId: "" + self.eventSections[keySeats]['priceLevelID'], 3033 label: self.eventSections[keySeats]['key'], 3034 statusId: 'active', 3035 disability: false, 3036 alert: '', 3037 ga: { 3038 max: self.eventSections[keySeats]['availableQuantity'], 3039 current: 0 3040 } 3041 }); 3042 object_categories[self.eventSections[keySeats]['key']] = self.eventSections[keySeats]['availableQuantity']; 3043 self.usedPriceLevelIds.push(self.eventSections[keySeats]['priceLevelID']); 3044 } else {} 3045 } 3046 3047 if (selectedTagsId !== false) { 3048 let isCat = false; 3049 3050 for (const i in selectedTagsId) { 3051 if (self.eventSections[keySeats]['tagId'] === selectedTagsId[i]) { 3052 isCat = true; 3053 break; 3054 } 3055 } 3056 3057 if (isCat) { 3058 //seat_labels_categories[self.eventSections[keySeats]['key']] = "" + self.eventSections[keySeats]['priceLevelID'];//self.selectedPromoCode['priceBlocks'][self.eventSections[keySeats]['priceLevelId']]['priceLevelName']; 3059 seat_labels_categories.push({ 3060 id: self.eventSections[keySeats]['key'], 3061 categoryId: "" + self.eventSections[keySeats]['priceLevelID'], 3062 label: self.eventSections[keySeats]['key'], 3063 statusId: 'active', 3064 disability: false, 3065 alert: '', 3066 ga: { 3067 max: self.eventSections[keySeats]['availableQuantity'], 3068 current: 0 3069 } 3070 }); 3071 object_categories[self.eventSections[keySeats]['key']] = self.eventSections[keySeats]['availableQuantity']; 3072 self.usedPriceLevelIds.push(self.eventSections[keySeats]['priceLevelID']); 3073 } else {} 3074 } 3075 3076 if (selectedHoldSubclassId !== false) { 3077 let isCat = false; 3078 3079 if (self.eventSections[keySeats]['holdSubclassId'] === selectedHoldSubclassId) { 3080 isCat = true; 3081 } 3082 3083 if (isCat) { 3084 //seat_labels_categories[self.eventSections[keySeats]['key']] = "" + self.eventSections[keySeats]['priceLevelID'];//self.selectedPromoCode['priceBlocks'][self.eventSections[keySeats]['priceLevelId']]['priceLevelName']; 3085 seat_labels_categories.push({ 3086 id: self.eventSections[keySeats]['key'], 3087 categoryId: "" + self.eventSections[keySeats]['priceLevelID'], 3088 label: self.eventSections[keySeats]['key'], 3089 statusId: 'active', 3090 disability: false, 3091 alert: '', 3092 ga: { 3093 max: self.eventSections[keySeats]['availableQuantity'], 3094 current: 0 3095 } 3096 }); 3097 object_categories[self.eventSections[keySeats]['key']] = self.eventSections[keySeats]['availableQuantity']; 3098 self.usedPriceLevelIds.push(self.eventSections[keySeats]['priceLevelID']); 3099 } else {} 3100 } 3101 } 3102 3103 for (let i1 = 0; i1 < priceBlockArr.length; i1++) { 3104 const keyPrice = priceBlockArr[i1][0]; //const value = priceBlockArr[i1][1]; 3105 3106 if (self.usedPriceLevelIds !== false && self.inArray(self.usedPriceLevelIds, selectedPromoCodeElement[keyPrice]['priceLevelId'])) { 3107 let ticketType = []; 3108 3109 if (typeof ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']] !== 'undefined') { 3110 ticketType = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']]; 3111 } 3112 3113 let ticketTypeSingular = {}; 3114 ticketTypeSingular['ticketType'] = selectedPromoCodeElement[keyPrice]['priceTypeName']; 3115 ticketTypeSingular['label'] = selectedPromoCodeElement[keyPrice]['priceTypeName']; 3116 ticketTypeSingular['price'] = selectedPromoCodeElement[keyPrice]['fullRetailPrice']; 3117 ticketType.push(ticketTypeSingular); 3118 ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']] = ticketType; 3119 } 3120 } 3121 3122 for (let i1 = 0; i1 < priceBlockArr.length; i1++) {
3123 const keyPrice = priceBlockArr[i1][0]; //const value = priceBlockArr[i1][1]; 3124 3125 if (self.usedPriceLevelIds !== false && self.inArray(self.usedPriceLevelIds, selectedPromoCodeElement[keyPrice]['priceLevelId'])) { 3126 let category_pricing = {}; 3127 3128 if (typeof ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']] !== 'undefined' && ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']].length > 1) { 3129 category_pricing['categoryId'] = "" + selectedPromoCodeElement[keyPrice]['priceLevelId']; 3130 category_pricing['ticketTypes'] = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']]; 3131 } else if (typeof ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']] !== 'undefined' && ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']].length === 1) { 3132 //let ticketTypeSingular = {}; 3133 self.ticketTypeAll = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']][0]['ticketType']; 3134 category_pricing['name'] = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']][0]['label']; 3135 category_pricing['price'] = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']][0]['price']; 3136 category_pricing['categoryId'] = "" + selectedPromoCodeElement[keyPrice]['priceLevelId']; //category_pricing['category'] = ticketTypeSingular; 3137 } 3138 3139 categories_pricing.push(category_pricing); 3140 let category_label = {}; 3141 category_label['categoryId'] = "" + selectedPromoCodeElement[keyPrice]['priceLevelId']; //create a new cat based on adaTypes 3142 3143 category_label['color'] = "" + self.codeArray()[po]; 3144 category_label['name'] = "" + selectedPromoCodeElement[keyPrice]['priceLevelName']; 3145 category_label['status'] = 'active'; 3146 categories_labels.push(category_label); //categories['available_categories'].push(category_label['key']); 3147 3148 let category_label_not = {}; 3149 category_label_not['key'] = "not_available" + selectedPromoCodeElement[keyPrice]['priceLevelId']; //create a new cat based on adaTypes 3150 3151 category_label_not['color'] = "" + self.convertHex(self.codeArray()[po], 32); 3152 category_label_not['label'] = "Not Available"; 3153 categories['unavailable_categories'].push(category_label_not['key']); //categories_labels.push(category_label_not); 3154 3155 po++; 3156 } 3157 } 3158 3159 categories['seat_labels_categories'] = seat_labels_categories; 3160 self.eventSectionsCapacity = object_categories; 3161 categories['object_categories'] = object_categories; 3162 categories['pricing_categories'] = categories_pricing; 3163 categories['categories_labels'] = categories_labels; 3164 return categories; 3165 } 3166 3167 getPricingCategoriesAndCategoriesLabelsAndUnavailableCategoriesAndSeatLabelsCategories() {
3168 let categories = []; 3169 let self = this; 3170 self.usedPriceLevelIds = []; 3171 categories['unavailable_categories'] = []; //categories['available_categories'] = []; 3172 3173 categories['categories_labels'] = []; 3174 categories['seat_labels_categories'] = {}; 3175 categories['pricing_categories'] = []; 3176 let selectedPriceLevelIds = false; 3177 let selectedHoldSubclassId = false; 3178 let selectedTagsId = false; 3179 3180 if (self.selectedPromoCode !== false) { 3181 const type = self.selectedPromoCode['limitType']; 3182 3183 if (type === 'PriceLevel') { 3184 selectedPriceLevelIds = self.selectedPromoCode['priceLevelIds']; 3185 } 3186 3187 if (type === 'Hold') { 3188 selectedHoldSubclassId = self.selectedPromoCode['holdSubclassId']; 3189 } 3190 3191 if (type === 'Tag') { 3192 selectedTagsId = self.selectedPromoCode['tagIds']; 3193 } 3194 } else { 3195 selectedPriceLevelIds = self.getPriceLevelIds(); 3196 selectedHoldSubclassId = self.getSubholdIds(); 3197 selectedTagsId = self.getTagIds(); 3198 } 3199 3200 let categories_pricing = []; 3201 let categories_labels = []; 3202 self.ticketTypeAll = false; 3203 let ticketTypes = []; 3204 let selectedPromoCodeElementAndUsedBlocks = self.getPriceBlocksAndUsedBlocks(); 3205 let selectedPromoCodeElement = selectedPromoCodeElementAndUsedBlocks.priceBlock; 3206 self.usedBlocks = selectedPromoCodeElementAndUsedBlocks.useBlock; 3207 let po = 0; 3208 let priceBlockArr = self.objectToArray(selectedPromoCodeElement); //if (!self.isPack()) { 3209 3210 priceBlockArr.sort(self.comparePriceBlocksPack); //} else { 3211 //priceBlockArr.sort(self.comparePriceBlocks); 3212 //} 3213 3214 let seat_labels_categories = {}; 3215 let object_categories = []; 3216 3217 for (const keySeats in self.eventSeats) { 3218 if (selectedPriceLevelIds !== false) { 3219 let isCat = false; 3220 3221 for (const i in selectedPriceLevelIds) { 3222 if (self.eventSeats[keySeats]['priceLevelId'] === selectedPriceLevelIds[i]) { 3223 isCat = true; 3224 break; 3225 } 3226 } 3227 3228 if (isCat) { 3229 seat_labels_categories[keySeats] = "" + self.eventSeats[keySeats]['priceLevelId']; //self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName']; 3230 3231 self.usedPriceLevelIds.push(self.eventSeats[keySeats]['priceLevelId']); 3232 } else {//seat_labels_categories[keySeats] = 'not_available' + self.eventSeats[keySeats]['priceLevelId']; 3233 } 3234 } 3235 3236 if (selectedTagsId !== false) { 3237 let isCat = false; 3238 3239 for (const i in selectedTagsId) { 3240 if (self.eventSeats[keySeats]['tagId'] === selectedTagsId[i]) { 3241 isCat = true; 3242 break; 3243 } 3244 } 3245 3246 if (isCat) { 3247 seat_labels_categories[keySeats] = "" + self.eventSeats[keySeats]['priceLevelId']; //self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName']; 3248 3249 self.usedPriceLevelIds.push(self.eventSeats[keySeats]['priceLevelId']); 3250 } else {//seat_labels_categories[keySeats] = "not_available" + self.eventSeats[keySeats]['priceLevelId']; 3251 } 3252 } 3253 3254 if (selectedHoldSubclassId !== false) { 3255 let isCat = false; 3256 3257 if (self.eventSeats[keySeats]['holdSubclassId'] === selectedHoldSubclassId) { 3258 isCat = true; 3259 } 3260 3261 if (isCat) { 3262 seat_labels_categories[keySeats] = "" + self.eventSeats[keySeats]['priceLevelId']; //self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName']; 3263 3264 self.usedPriceLevelIds.push(self.eventSeats[keySeats]['priceLevelId']); 3265 } else {//seat_labels_categories[keySeats] = "not_available" + self.eventSeats[keySeats]['priceLevelId']; 3266 } 3267 } 3268 } //gaSections 3269 3270 3271 for (const keySeats in self.eventSections) { 3272 if (selectedPriceLevelIds !== false) { 3273 let isCat = false; 3274 3275 for (const i in selectedPriceLevelIds) { 3276 if (self.eventSections[keySeats]['priceLevelID'] === selectedPriceLevelIds[i]) { 3277 isCat = true; 3278 break; 3279 } 3280 } 3281 3282 if (isCat) { 3283 seat_labels_categories[self.eventSections[keySeats]['key']] = "" + self.eventSections[keySeats]['priceLevelID']; //self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName']; 3284 3285 object_categories[self.eventSections[keySeats]['key']] = self.eventSections[keySeats]['availableQuantity']; 3286 self.usedPriceLevelIds.push(self.eventSections[keySeats]['priceLevelID']); 3287 } else {//seat_labels_categories[keySeats] = 'not_available' + self.eventSections[keySeats]['priceLevelId']; 3288 } 3289 } 3290 3291 if (selectedTagsId !== false) { 3292 let isCat = false;
3293 3294 for (const i in selectedTagsId) { 3295 if (self.eventSections[keySeats]['tagId'] === selectedTagsId[i]) { 3296 isCat = true; 3297 break; 3298 } 3299 } 3300 3301 if (isCat) { 3302 seat_labels_categories[self.eventSections[keySeats]['key']] = "" + self.eventSections[keySeats]['priceLevelID']; //self.selectedPromoCode['priceBlocks'][self.eventSections[keySeats]['priceLevelId']]['priceLevelName']; 3303 3304 object_categories[self.eventSections[keySeats]['key']] = self.eventSections[keySeats]['availableQuantity']; 3305 self.usedPriceLevelIds.push(self.eventSections[keySeats]['priceLevelID']); 3306 } else {//seat_labels_categories[keySeats] = "not_available" + self.eventSections[keySeats]['priceLevelId']; 3307 } 3308 } 3309 3310 if (selectedHoldSubclassId !== false) { 3311 let isCat = false; 3312 3313 if (self.eventSections[keySeats]['holdSubclassId'] === selectedHoldSubclassId) { 3314 isCat = true; 3315 } 3316 3317 if (isCat) { 3318 seat_labels_categories[self.eventSections[keySeats]['key']] = "" + self.eventSections[keySeats]['priceLevelID']; //self.selectedPromoCode['priceBlocks'][self.eventSections[keySeats]['priceLevelId']]['priceLevelName']; 3319 3320 object_categories[self.eventSections[keySeats]['key']] = self.eventSections[keySeats]['availableQuantity']; 3321 self.usedPriceLevelIds.push(self.eventSections[keySeats]['priceLevelID']); 3322 } else {//seat_labels_categories[keySeats] = "not_available" + self.eventSections[keySeats]['priceLevelId']; 3323 } 3324 } 3325 } 3326 3327 for (let i1 = 0; i1 < priceBlockArr.length; i1++) { 3328 const keyPrice = priceBlockArr[i1][0]; //const value = priceBlockArr[i1][1]; 3329 3330 if (self.usedPriceLevelIds !== false && self.inArray(self.usedPriceLevelIds, selectedPromoCodeElement[keyPrice]['priceLevelId'])) { 3331 let ticketType = []; 3332 3333 if (typeof ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']] !== 'undefined') { 3334 ticketType = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']]; 3335 } 3336 3337 let ticketTypeSingular = {}; 3338 ticketTypeSingular['ticketType'] = selectedPromoCodeElement[keyPrice]['priceTypeName']; 3339 ticketTypeSingular['label'] = selectedPromoCodeElement[keyPrice]['priceTypeName']; 3340 ticketTypeSingular['price'] = selectedPromoCodeElement[keyPrice]['fullRetailPrice']; 3341 ticketType.push(ticketTypeSingular); 3342 ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']] = ticketType; 3343 } 3344 } 3345 3346 for (let i1 = 0; i1 < priceBlockArr.length; i1++) { 3347 const keyPrice = priceBlockArr[i1][0]; //const value = priceBlockArr[i1][1]; 3348 3349 if (self.usedPriceLevelIds !== false && self.inArray(self.usedPriceLevelIds, selectedPromoCodeElement[keyPrice]['priceLevelId'])) { 3350 let category_pricing = {}; 3351 3352 if (typeof ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']] !== 'undefined' && ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']].length > 1) { 3353 category_pricing['category'] = selectedPromoCodeElement[keyPrice]['priceLevelId']; 3354 category_pricing['ticketTypes'] = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']]; 3355 } else if (typeof ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']] !== 'undefined' && ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']].length === 1) { 3356 //let ticketTypeSingular = {}; 3357 self.ticketTypeAll = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']][0]['ticketType']; 3358 category_pricing['label'] = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']][0]['label']; 3359 category_pricing['price'] = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']][0]['price']; 3360 category_pricing['category'] = selectedPromoCodeElement[keyPrice]['priceLevelId']; //category_pricing['category'] = ticketTypeSingular; 3361 } 3362 3363 categories_pricing.push(category_pricing); 3364 let category_label = {}; 3365 category_label['key'] = "" + selectedPromoCodeElement[keyPrice]['priceLevelId']; //create a new cat based on adaTypes 3366 3367 category_label['color'] = "" + self.codeArray()[po]; 3368 category_label['label'] = "" + selectedPromoCodeElement[keyPrice]['priceLevelName']; 3369 categories_labels.push(category_label); //categories['available_categories'].push(category_label['key']); 3370 3371 let category_label_not = {}; 3372 category_label_not['key'] = "not_available" + selectedPromoCodeElement[keyPrice]['priceLevelId']; //create a new cat based on adaTypes 3373 3374 category_label_not['color'] = "" + self.convertHex(self.codeArray()[po], 32); 3375 category_label_not['label'] = "Not Available"; 3376 categories['unavailable_categories'].push(category_label_not['key']); 3377 categories_labels.push(category_label_not); 3378 po++; 3379 } 3380 } 3381 3382 categories['seat_labels_categories'] = seat_labels_categories; 3383 self.eventSectionsCapacity = object_categories; 3384 categories['object_categories'] = Object.assign({}, object_categories); 3385 categories['pricing_categories'] = categories_pricing; 3386 categories['categories_labels'] = categories_labels; 3387 return categories; 3388 } 3389 3390 createDestroySeatChart() { 3391 if (this.seatChart !== false) { 3392 this.clearCart(); 3393 3394 if (typeof this.seatChart.destroy !== 'undefined') { 3395 this.seatChart.destroy(); 3396 } else { 3397 jQuery('#seats_map').html(''); 3398 } 3399 3400 this.JBuyButton().LoadingOverlay('hide'); 3401 this.selectedObjectChart = null; 3402 this.selectedEvent = null; 3403 } 3404 3405 this.seatChart = false;
3406 this.JPriceMap().hide(); 3407 this.JPriceMapSeats().hide(); 3408 this.JPriceMapExplanation().hide(); 3409 this.JBlankSeatsMap().show(); 3410 3411 if (this.JTheme() === 'light') { 3412 this.JBlankSeatsMap().html('<img style="padding:80px;" src="/wp-content/themes/porto/images/no_selection_date_time_light.png"/><h4>Select a time</h4>'); 3413 } else { 3414 this.JBlankSeatsMap().html('<h4>Select a time</h4><img style="padding:80px;" src="/wp-content/themes/porto/images/no_selection_date_time.png"/>'); 3415 } 3416 3417 this.JTicketsSelectedCart().html(''); 3418 this.JTicketsButtonsCart().hide(); 3419 jQuery('.bproceed_tickets').hide(); 3420 } 3421 3422 convertHex(hexCode, opacity) { 3423 var hex = hexCode.replace('#', ''); 3424 3425 if (hex.length === 3) { 3426 hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; 3427 } 3428 3429 var r = parseInt(hex.substring(0, 2), 16), 3430 g = parseInt(hex.substring(2, 4), 16), 3431 b = parseInt(hex.substring(4, 6), 16); 3432 return 'rgba(' + r + ',' + g + ',' + b + ',' + opacity / 100 + ')'; 3433 } 3434 /** 3435 * Create a ASCII table based on a bi-dimensional array of strings 3436 * @param {Array} m bi-dimensional array of strings 3437 * @param {Object} [options] Options object 3438 * @param {Object} [options.row] Row options 3439 * @param {String} [options.row.paddingLeft="|"] String added before the first column 3440 * @param {String} [options.row.paddingRight="|"] String added after the last column 3441 * @param {String} [options.row.colSeparator="|"] String added between columns 3442 * @param {String} [options.row.lineBreak="\n"] String used to break rows 3443 * @param {Object} [options.cell] Cell options 3444 * @param {String} [options.cell.paddingLeft=" "] String added before the cell content 3445 * @param {String} [options.cell.paddingRight=" "] String added after the cell content 3446 * @param {Number} [options.cell.defaultAlignDir="1"] Define the default alignment when not specified (-1=left, 0=center, 1=right) 3447 * @param {Object} [options.hr] Horizontal Line options 3448 * @param {String} [options.hr.str="—"] String that will be repeated to make the Horizontal Line 3449 * @param {String} [options.hr.colSeparator="|"] String added between columns 3450 * @return {string} The final ASCII table 3451 * @author Victor N. wwww.victorborges.com 3452 * @date 2016-12-28 3453 */ 3454 3455 3456 matrixToAsciiTable(m, options) { 3457 options = defaults({ 3458 row: { 3459 paddingLeft: " ", 3460 //before first column 3461 paddingRight: " ", 3462 //after last column 3463 colSeparator: " ", 3464 //between each column 3465 lineBreak: "[br/]" 3466 }, 3467 cell: { 3468 paddingLeft: " ", 3469 paddingRight: " ", 3470 defaultAlignDir: 0 //left=-1 center=0 right=1 3471 3472 }, 3473 hr: { 3474 str: " ", 3475 colSeparator: " " 3476 } 3477 }, options); 3478 3479 function defaults(defaultObj, options) { 3480 let isObj = function (x) { 3481 return x !== null && typeof x === "object"; 3482 }; 3483 3484 if (isObj(options)) for (let prop in defaultObj) { 3485 if (Object.prototype.hasOwnProperty.call(defaultObj, prop) && Object.prototype.hasOwnProperty.call(options, prop)) { 3486 if (isObj(defaultObj[prop])) defaults(defaultObj[prop], options[prop]);else defaultObj[prop] = options[prop]; 3487 } 3488 } 3489 return defaultObj; 3490 } 3491 3492 function repeatStr(width, str) { 3493 str = str || " "; 3494 let result = width > 0 ? Array(Math.ceil(width / str.length) + 1).join(str) : ""; 3495 return result.length > width ? result.substr(0, width) : result; 3496 } 3497 3498 function alignText(txt, width) { 3499 function pad(txt, width, dir) { 3500 let p = width - txt.length; 3501 let pL = dir > 0 ? p : p / 2 << 0; 3502 let pR = dir < 0 ? p : pL + (p - pL * 2); 3503 return p > 0 ? (dir >= 0 ? Array(pL + 1).join(" ") : '') + txt + (dir <= 0 ? Array(pR + 1).join(" ") : '') : txt; 3504 } 3505 3506 txt = "" + txt; //toString 3507 3508 switch (txt.charAt(0)) { 3509 case '<': 3510 return pad(txt.substr(1), width, -1); 3511 //align left 3512 3513 case '^': 3514 return pad(txt.substr(1), width, 0); 3515 //align center 3516 3517 case '>': 3518 return pad(txt.substr(1), width, 1); 3519 //align right 3520 3521 default: 3522 return pad(txt, width, options.cell.defaultAlignDir); 3523 } 3524 } 3525 3526 function calcColumnsWidth(matrix) { 3527 //calculate columns width 3528 let colsWidth = []; 3529 3530 rows: for (let r = 0, rLen = matrix.length; r < rLen; r++) { 3531 if (!matrix[r]) continue; //separator 3532 3533 cols: for (let c = 0, cLen = matrix[r].length; c < cLen;
3533 c++) { 3534 if (!colsWidth[c]) colsWidth[c] = 0; 3535 colsWidth[c] = Math.max(colsWidth[c], ("" + matrix[r][c]).length); 3536 } 3537 } 3538 3539 return colsWidth; 3540 } 3541 3542 let paddingLength = options.cell.paddingLeft.length + options.cell.paddingRight.length; 3543 let hrSeparator = repeatStr(options.row.colSeparator.length, options.hr.colSeparator || options.hr.str); 3544 let colsWidth = calcColumnsWidth(m); //create table 3545 3546 let table = []; 3547 3548 for (let r = 0, rLen = m.length; r < rLen; r++) { 3549 let cols = []; 3550 3551 if (m[r]) { 3552 //create columns 3553 for (let c = 0; c < colsWidth.length; c++) { 3554 cols.push(options.cell.paddingLeft + alignText(m[r][c], colsWidth[c]) + options.cell.paddingRight); 3555 } 3556 3557 table.push([options.row.paddingLeft, cols.join(options.row.colSeparator), options.row.paddingRight].join('')); 3558 } else { 3559 //create horizontal line 3560 for (let c = 0; c < colsWidth.length; c++) { 3561 cols.push(repeatStr(colsWidth[c] + paddingLength, options.hr.str)); 3562 } 3563 3564 table.push([options.row.paddingLeft, cols.join(hrSeparator), options.row.paddingRight].join('')); 3565 } 3566 } 3567 3568 return table.join(options.row.lineBreak); 3569 } 3570 3571 alignText(txt, width) { 3572 function pad(txt, width, dir) { 3573 let p = width - txt.length; 3574 let pL = dir > 0 ? p : p / 2 << 0; 3575 let pR = dir < 0 ? p : pL + (p - pL * 2); 3576 return p > 0 ? (dir >= 0 ? Array(pL + 1).join(" ") : '') + txt + (dir <= 0 ? Array(pR + 1).join(" ") : '') : txt; 3577 } 3578 3579 txt = "" + txt; //toString 3580 3581 switch (txt.charAt(0)) { 3582 case '<': 3583 return pad(txt.substr(1), width, -1); 3584 //align left 3585 3586 case '^': 3587 return pad(txt.substr(1), width, 0); 3588 //align center 3589 3590 case '>': 3591 return pad(txt.substr(1), width, 1); 3592 //align right 3593 3594 default: 3595 return pad(txt, width, 0); 3596 } 3597 } 3598 3599 renderSeatMap(workspacekey, event) { 3600 let self = this; 3601 let useAzure = false; 3602 let eventArr; 3603 let chartkey = ''; 3604 let eventid = ''; 3605 3606 if (workspacekey.indexOf('azure;') !== -1) { 3607 useAzure = true; 3608 workspacekey = workspacekey.replace('azure;', ''); 3609 eventArr = event.split(';'); 3610 chartkey = eventArr[0]; 3611 eventid = eventArr[1]; 3612 } 3613 3614 let pricingAll; 3615 this.createDestroySeatChart(); 3616 this.JPriceMap().show(); 3617 this.JPriceMapSeats().show(); 3618 this.JPriceMapExplanation().show(); 3619 this.JBlankSeatsMap().hide(); 3620 let orphanSeat = true; 3621 3622 if (self.JFreeSeating()) { 3623 orphanSeat = true; 3624 } 3625 3626 let colorScheme = 'dark'; 3627 let bgcolor; 3628 let stcolor; 3629 let ntcolor; 3630 self.color1 = '#252525'; 3631 self.color2 = '#333333'; 3632 bgcolor = '#1E1E1E'; 3633 stcolor = '#000000'; 3634 ntcolor = '#444444'; 3635 3636 if (self.JTheme() === 'light') { 3637 colorScheme = 'light'; 3638 self.color1 = '#EEF0F2'; 3639 self.color2 = '#ffffff'; 3640 bgcolor = '#ffffff'; 3641 stcolor = '#EEF0F2'; 3642 ntcolor = '#E8E8E8'; 3643 } 3644 3645 if (!useAzure) { 3646 pricingAll = self.getPricingCategoriesAndCategoriesLabelsAndUnavailableCategoriesAndSeatLabelsCategories(); 3647 this.seatChart = new seatsio.SeatingChart({ 3648 divId: 'seats_map', 3649 workspaceKey: workspacekey, 3650 colorScheme: colorScheme, 3651 showFullScreenButton: false, 3652 allowOrphanSeats: orphanSeat, 3653 extraConfig: { 3654 //pricingAllCategoryLabels: pricingAll['category_labels'], 3655 //pricingAllCategoryPricing: pricingAll['category_pricing'], 3656 eventSectionsCapacity: pricingAll['object_categories'], 3657 pricingAllSeatLabels: pricingAll['seat_labels_categories'], 3658 unavailableCategoriesSeatLabels: pricingAll['unavailable_categories'] 3659 }, 3660 pricing: pricingAll['pricing_categories'], 3661 categories: pricingAll['categories_labels'], 3662 objectCategories: pricingAll['seat_labels_categories'], 3663 unavailableCategories: pricingAll['unavailable_categories'], 3664 objectColor: function (object, defaultColor, extraConfig) { 3665 //because we don't have a full seatmap by category, there is no way to know which one from the seats are assigned to which categories. 3666 //we get from api only available seats 3667 //console.log(object); 3668 if (typeof object.category !== 'undefined') { 3669 if (object.category.label === 'Not Available') { 3670 return object.category.color; 3671 } 3672 } 3673 3674 if (extraConfig.pricingAllSeatLabels[object.label]) { 3675 return defaultColor; 3676 } 3677 3678 return self.color1; 3679 }, 3680 canGASelectionBeIncreased: function (gaArea, defaultValue, extraConfig) { 3681 if (typeof extraConfig.eventSectionsCapacity[gaArea.label] !== 'undefined') { 3682 return gaArea.numBooked + gaArea.numSelected < extraConfig.eventSectionsCapacity[gaArea.label]; 3683 } 3684 3685 return defaultValue; 3686 }, 3687 objectIcon: function (object, defaultIcon, extraConfig) { 3688 if (defaultIcon === 'check') { 3689 return 'user'; 3690 } 3691 3692 return defaultIcon; 3693 }, 3694 objectWithoutCategorySelectable: false, 3695 objectTooltip: { 3696 showActionHint: false, 3697 showAvailability: false, 3698 showCategory: false, 3699 showLabel: false, 3700 showPricing: false, 3701 showUnavailableNotice: true, 3702 stylizedLabel: true, 3703 confirmSelectionOnMobile: false 3704 }, 3705 colors: {
3706 cursorTooltipBackgroundColor: self.color2 3707 }, 3708 tooltipInfo: function (object) { 3709 if (typeof self.eventSeats[object.label] !== "undefined" && typeof object.pricing !== "undefined" && typeof object.pricing.formattedPrice !== "undefined") { 3710 // if (object.objectType === 'Seat') { 3711 const seatSection = object.labels.section; 3712 const seatRow = object.labels.parent; 3713 const seatLabel = object.labels.own; //const seatPrice = parseFloat(object.pricing.formattedPrice).toFixed(2); 3714 3715 let seatPrice = object.pricing.formattedPrice; 3716 let seatPriceF = object.pricing.price.toFixed(2); 3717 3718 if (self.isPack()) { 3719 if (seatPriceF - self.initPackPrice == 0) { 3720 seatPrice = 'INCLUDED'; 3721 } else { 3722 seatPrice = '+$' + (seatPriceF - self.initPackPrice).toFixed(2); 3723 } 3724 } 3725 3726 const seatNotice = 'Ticket prices excludes all fees'; 3727 let seatAlert = ''; 3728 3729 if (typeof self.eventSeats[object.label]["seatAlertId"] !== "undefined" && typeof self.seatAlertsAndTooltipsPerLabel[self.eventSeats[object.label]["seatAlertId"]] !== 'undefined') { 3730 seatAlert = '[br/]' + self.seatAlertsAndTooltipsPerLabel[self.eventSeats[object.label]["seatAlertId"]]['display_name'] + '[br/]'; 3731 } 3732 3733 let m = [['^Section', '^Row', '^Seat'], ['^' + seatSection, '^' + seatRow, '^' + seatLabel]]; //return '[pre]' + self.matrixToAsciiTable(m) + '[/pre]' + '[pre]' + self.matrixToAsciiTable(m1) + '[/pre]' + '[br/]' + '[br/]' + seatNotice + '[br/]' + '[br/]' + seatAlert; 3734 3735 return '[pre]' + self.matrixToAsciiTable(m) + '[/pre]' + '[br/]' + '[pre]' + "——————————————————————————" + '[/pre]' + '[br/]' + '[br/]' + '[pre]' + self.alignText('' + seatPrice, 25) + '[/pre]' + '[br/]' + '[br/]' + self.alignText(seatNotice, 25) + '[br/]' + '[br/]' + self.alignText(seatAlert, 25); 3736 } else if (typeof self.eventSectionsCapacity[object.label] !== "undefined" && typeof object.pricing !== "undefined" && typeof object.pricing.formattedPrice !== "undefined") { 3737 // if (object.objectType === 'Seat') { 3738 const seatSection = object.label; 3739 const seatNotice = 'Ticket prices excludes all fees'; //const seatPrice = parseFloat(object.pricing.formattedPrice).toFixed(2); 3740 3741 let seatPrice = object.pricing.formattedPrice; 3742 let seatPriceF = object.pricing.price.toFixed(2); 3743 3744 if (seatPriceF - self.initPackPrice == 0) { 3745 seatPrice = 'INCLUDED'; 3746 } else { 3747 seatPrice = '+$' + (seatPriceF - self.initPackPrice).toFixed(2); 3748 } 3749 3750 let m = [['^Section'], ['^' + seatSection]]; //return '[pre]' + self.matrixToAsciiTable(m) + '[/pre]' + '[pre]' + self.matrixToAsciiTable(m1) + '[/pre]' + '[br/]' + '[br/]' + seatNotice + '[br/]' + '[br/]' + seatAlert; 3751 3752 return '[pre]' + self.matrixToAsciiTable(m) + '[/pre]' + '[br/]' + '[pre]' + "——————————————————————————" + '[/pre]' + '[br/]' + '[br/]' + '[pre]' + self.alignText('' + seatPrice, 25) + '[/pre]' + '[br/]' + '[br/]' + self.alignText(seatNotice, 25) + '[br/]' + '[br/]'; 3753 } else { 3754 return 'Not Available'; 3755 } //} 3756 //check if object label has seat alert 3757 3758 }, 3759 event: event, 3760 onChartRendered: function (chart) {}, 3761 onObjectDeselected: function (object, deselectedTicketType) { 3762 if (!self.JFreeSeating()) { 3763 let pods = []; 3764 3765 for (const kp in self.pods) { 3766 for (const kpp in self.pods[kp]) { 3767 if (self.pods[kp][kpp] === object.label) { 3768 pods = self.pods[kp]; 3769 break; 3770 } 3771 } 3772 } 3773 3774 self.seatChart.deselectObjects(pods); 3775 } 3776 3777 self.seatChart.listSelectedObjects(function (selectedObjects) { 3778 for (let c = 0; c < selectedObjects.length; c++) { 3779 if (selectedObjects[c].label === object.label && typeof selectedObjects[c].numSelected === 'undefined') { 3780 selectedObjects.splice(c, 1); 3781 break; 3782 } 3783 } 3784
3785 if (!self.JFreeSeating()) { 3786 if (self.fromDelete !== false && selectedObjects.length < self.fromDelete - 2 && self.fromDelete > 1 || self.fromDelete === false && selectedObjects.length < self.selectedLabels.length - 1) { 3787 __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({ 3788 title: 'Information', 3789 text: 'You selected seats have been removed because you cannot have orphan seats', 3790 icon: 'warning', 3791 confirmButtonText: 'Ok' 3792 }); 3793 } 3794 3795 self.fromDelete = false; 3796 } 3797 3798 self.selectBasedOnDropDown(selectedObjects); 3799 }); 3800 }, 3801 onObjectSelected: function (object, selectedTicketType) { 3802 let deselected = false; 3803 3804 if (typeof self.eventSeats[object.label] !== 'undefined' && typeof self.eventSeats[object.label]["seatAlertId"] !== "undefined") { 3805 if (typeof self.seatAlertsAndTooltipsPerLabel[self.eventSeats[object.label]["seatAlertId"]] !== 'undefined') { 3806 if (self.seatAlertsAndTooltipsPerLabel[self.eventSeats[object.label]["seatAlertId"]]['require_acknowledgement']) { 3807 if (!confirm(self.seatAlertsAndTooltipsPerLabel[self.eventSeats[object.label]["seatAlertId"]]['display_name'])) { 3808 object.deselect(); 3809 deselected = true; 3810 } 3811 } 3812 } 3813 } 3814 3815 if (!deselected) { 3816 self.seatChart.listSelectedObjects(function (selectedObjects) { 3817 self.selectBasedOnDropDown(selectedObjects); 3818 }); 3819 } 3820 }, 3821 priceFormatter: function (price) { 3822 return '$' + parseFloat(price).toFixed(2); 3823 } 3824 }).render(); 3825 } else { 3826 pricingAll = self.getPricingCategoriesAndCategoriesLabelsAndUnavailableCategoriesAndSeatLabelsCategoriesAzure(); 3827 let style = { 3828 bgColor: bgcolor, 3829 strokeColor: stcolor, 3830 notAvailableColor: ntcolor, 3831 bgColorSelected: '#000000', 3832 font: { 3833 color: '#000000', 3834 fontFamily: 'Arial', 3835 fontWeight: 'normal' //normal, bold, italic 3836 3837 } 3838 }; 3839 let notAvailablePopoverHtml = `<div style=' 3840 width: 250px; 3841 background-color: #3e3e3e; 3842 border-radius: 4px; 3843 padding: 5px 10px 5px 10px; 3844 color: #fff; 3845 font-size: 12px; 3846 box-shadow: 1px 0px 25px -3px #3e3e3e; 3847 '> 3848 3849 <p style='color: rgba(255, 255, 255, 0.80); font-size: 14px; font-style: normal; font-weight: 500; line-height: 22px;text-align: center; margin-top: 10px;'>Not availabe </p> 3850 3851 <div style='color: rgba(255, 255, 255, 0.80); text-align: center; font-size: 12px; font-style: normal; font-weight: 500; line-height: 20px; background-color:#000; width:100%; padding:0 5px;'> 3852 Not available 3853 3854 </div> 3855 </div>`; 3856 let attributes = { 3857 showZoomOutButton: true, 3858 allowOrphanSeats: true, 3859 pods: false, 3860 notAvailablePopoverHtml: notAvailablePopoverHtml 3861 }; // this.toggleCategories = []; 3862 //token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiU2VhdGluZyIsIm5hbWUiOiIzIiwiZW1haWwiOiJzZWF0aW5nQHJvd2ViLnJvIiwiRnVsbE5hbWUiOiJTZWF0aW5nIEFwcCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL3N5c3RlbSI6IjEyMzIzMjMyIiwiRmlyc3ROYW1lIjoiU2VhdGluZyIsIkxhc3ROYW1lIjoiQXBwIiwibmJmIjoxNjc2MjgxMTMxLCJleHAiOjE2NzY1NDAzMzEsImlhdCI6MTY3NjI4MTEzMX0.BpHssIAknLqEiMIwTgj8oy4x9EmOK-jhtPhkpOJB4SY", 3863 //chartId: "e7e29205-41b0-47e2-a836-6537d37c6a7e", 3864 //eventId: "e7e29205-41b0-47e2-a836-6537d37c6a7e", 3865
3866 this.seatChart = new _as.chartLayout({ 3867 token: workspacekey + "", 3868 chartId: chartkey + "", 3869 containerId: "seats_map", 3870 eventId: eventid + "", 3871 prices: pricingAll['pricing_categories'], 3872 categories: pricingAll['categories_labels'], 3873 objects: pricingAll['seat_labels_categories'], 3874 //prices: prices, 3875 //categories: categories, 3876 //objects: objects, 3877 style: style, 3878 theme: self.JTheme(), 3879 attributes: attributes 3880 }); 3881 this.seatChart.render(this.onObjectClick, this.onObjectHover, self, pricingAll); 3882 } 3883 } 3884 3885 onObjectHover(obj, main, self) { 3886 let seat = obj.object; 3887 const split = seat.label.split('-'); 3888 let footer = ``; 3889 let seatAlert = ''; 3890 3891 if (typeof self.eventSeats !== 'undefined' && typeof self.eventSeats[seat.label] !== 'undefined' && typeof self.seatAlertsAndTooltipsPerLabel !== 'undefined' && typeof self.eventSeats[seat.label]["seatAlertId"] !== "undefined" && typeof self.seatAlertsAndTooltipsPerLabel[self.eventSeats[seat.label]["seatAlertId"]] !== 'undefined') { 3892 seatAlert = '<p style="margin-top: 10px; color: rgba(255, 255, 255, 0.80); text-align:center;font-size: 12px; font-style: normal; font-weight: 500; line-height: 20px; ">' + self.seatAlertsAndTooltipsPerLabel[self.eventSeats[seat.label]["seatAlertId"]]['display_name'] + '</p>'; 3893 } 3894 3895 if (seat.statusId === 'selected') { 3896 footer = ` 3897 <div style='background-color:#0ca3d6; width:100%; padding:0 5px;'> 3898 Selected 3899 </div> 3900 `; 3901 } 3902 3903 let priceBlocksAndUsedBlocks = self.getPriceBlocksAndUsedBlocks(); 3904 let priceBlocks = priceBlocksAndUsedBlocks.priceBlock; 3905 let bigpricecut = ''; 3906 3907 for (let i1 = priceBlocks.length - 1; i1 >= 0; i1--) { 3908 if (priceBlocks[i1].priceLevelId == seat.categoryId) { 3909 let fullRetailPrice = priceBlocks[i1].fullRetailPrice; 3910 if (priceBlocks[i1].bigPrice && seat.prices[0].price == fullRetailPrice) bigpricecut = '<span style="position:relative; color: rgba(255, 255, 255, 0.8);font-weight: 400;">' + priceBlocks[i1].bigPrice.toFixed(2) + '<div style=" border-bottom: 0.075em solid rgba(255, 255, 255, 0.8); margin-top: 2px;left: 0;position: absolute;right: 0;top: 50%;"></div></span>'; 3911 } 3912 } 3913 3914 let html = `<div style=' 3915 width: 250px; 3916 background-color: #3e3e3e; 3917 border-radius: 4px; 3918 padding: 5px 10px 5px 10px; 3919 color: #fff; 3920 font-size: 12px; 3921 text-align:center; 3922 box-shadow: 1px 0px 25px -3px #3e3e3e; 3923 '> 3924 <table style='width: 100%;table-layout: fixed'> 3925 <tr style='color: rgba(255, 255, 255, 0.80); font-size: 14px; font-style: normal; font-weight: 500; line-height: 22px;'>`; 3926 3927 if (split[0]) { 3928 html += `<td style='text-align:center; padding:2px;'>Section</td>`; 3929 } 3930 3931 if (split[1]) { 3932 html += `<td style='text-align:center;padding:2px;'>Row</td>`; 3933 } 3934 3935 if (split[2]) { 3936 html += `<td style='text-align:center; padding:2px;'>Seat</td>`; 3937 } 3938 3939 if (seat.ga && seat.ga.max > 0 && typeof seat.ga.current !== 'undefined') { 3940 html += `<td style="text-align:center; background-color: #242121; padding:2px;">Selected Tickets</td>`; 3941 } 3942 3943 html += `</tr> 3944 <tr style='font-size: 18px; font-style: normal; font-weight: 600; line-height: 26px; '>`; 3945 3946 if (split[0]) { 3947 html += `<td style='text-align:center; padding:2px;'>` + split[0] + `</td>`; 3948 } 3949 3950 if (split[1]) { 3951 html += `<td style='text-align:center; padding:2px;'>` + split[1] + `</td>`; 3952 } 3953 3954 if (split[2]) { 3955 html += `<td style='text-align:center; padding:2px;'>` + split[2] + `</td>`; 3956 } 3957 3958 if (seat.ga && seat.ga.max > 0 && typeof seat.ga.current !== 'undefined') { 3959 html += `<td style="text-align:center; background-color: #242121; padding:2px;">` + seat.ga.current + `</td>`; 3960 } 3961 3962 let pricet = seat.prices[0].price; 3963 3964 if (seat.ga && seat.ga.max > 0 && typeof seat.ga.current !== 'undefined') { 3965 if (seat.ga.current === 0) { 3966 pricet = seat.prices[0].price; 3967 } else { 3968 pricet = seat.prices[0].price * seat.ga.current; 3969 } 3970 } 3971 3972 html += `</tr> 3973 3974 </table> 3975 3976 <table style='width: 100%;'> 3977 <tr> 3978 <td colspan='3' style='text-align:center; color: #BC5AFF; font-weight: 600;font-size: 24px; font-style: normal; line-height: 32px; padding:2px;'> 3979 ` + bigpricecut + ` $` + pricet.toFixed(2) + ` 3980 </td>`; 3981 html += `</tr> 3982 </table>`; // if (window.location.href.indexOf('aaa.spotlight.vegas') === -1) { 3983 // html += seatAlert + ` 3984 // <p style='margin-top: 10px; color: rgba(255, 255, 255, 0.80); text-align:center;font-size: 12px; font-style: normal; font-weight: 500; line-height: 20px; '>Price excludes all fees</p> 3985 // 3986 // ` + footer + ` 3987 // </div>`; 3988 // } else { 3989 3990 html += seatAlert + footer + ` 3991 </div>`; //} 3992 3993 main.showPopover(html); 3994 } 3995 3996 onObjectClick(obj, main, self, pricingAll) { 3997 let mySelectdObject = []; 3998 3999 for (let i1 = 0; i1 < obj.selectedObjects.length; i1++) { 4000 let price = 0; 4001 4002 for (let i = 0; i < pricingAll['seat_labels_categories'].length; i++) { 4003 let label = pricingAll['seat_labels_categories'][i]['label']; 4004 let catId = pricingAll['seat_labels_categories'][i]['categoryId']; 4005 4006 if (obj.selectedObjects[i1].id === label) { 4007 for (let i2 = 0; i2 < pricingAll['pricing_categories'].length; i2++) { 4008 if (catId === pricingAll['pricing_categories'][i2]['categoryId']) { 4009 price = pricingAll['pricing_categories'][i2]['price']; 4010 let ooobj = { 4011 label: obj.selectedObjects[i1].id, 4012 uuid: obj.selectedObjects[i1].id, 4013 pricing: { 4014 price: price 4015 } 4016 }; 4017 4018 if (obj.selectedObjects[i1].id.indexOf('-') === -1) { 4019 ooobj.numSelected = obj.selectedObjects[i1].qty; 4020 } 4021 4022 mySelectdObject.push(ooobj); 4023 } 4024 } 4025 } 4026 } 4027 } 4028 4029 self.selectBasedOnDropDown(mySelectdObject); 4030 self.myselectedObjects = mySelectdObject; 4031 } 4032 4033 updateObjQuantity(objId, qty) { 4034 let newMyselectedObject = []; 4035 4036 if (qty === 0) { 4037 for (let i3 = 0; i3 < this.myselectedObjects.length; i3++) { 4038 if (this.myselectedObjects[i3]['label'] === objId) { 4039 continue; 4040 } 4041 4042 newMyselectedObject.push(this.myselectedObjects[i3]); 4043 } 4044 4045 this.myselectedObjects = newMyselectedObject; 4046 } 4047 4048 this.seatChart.updateObjQuantity(objId, qty); 4049 } 4050 4051 toggleCategory(category) { 4052 let temp = []; 4053 let newCategory = true; 4054 4055 for (let i = 0; i < toggleCategories.length; i++) { 4056 let element = toggleCategories[i]; 4057 4058 if (category === element) { 4059 newCategory = false;
4060 } else { 4061 temp.push(element); 4062 } 4063 } 4064 4065 if (newCategory) { 4066 temp.push(category); 4067 } 4068 4069 this.toggleCategories = temp; 4070 this.seatChart.toggleCategoriesHighlightRender(temp); 4071 } 4072 4073 createDropDownSelect(dropdown, workspacekey, event) { 4074 let self = this; 4075 this.JTicketsCart().html(''); 4076 this.JTicketsCart().show(); 4077 this.JTicketsCart().append('<div class="number_of_tickets_text">Number of tickets: </div>' + dropdown); 4078 this.JTicketsChooser().off('change').on('change', function () { 4079 const selectedVal = parseInt(jQuery(this).val()); // if (selectedVal === 0) return false; 4080 4081 self.selectedNumberOfTickets = selectedVal; 4082 self.selectedPromoCode = false; 4083 4084 for (const key in self.eventPromotions) { 4085 let priceB = self.eventPromotions[key]['priceBlocks']; 4086 4087 for (const keyp in self.eventPromotions[key]['priceBlocks']) { 4088 let minTick, maxTick; 4089 4090 if (typeof self.eventPromotions[key]['priceBlocks'][keyp]['min_tickets'] === 'undefined') { 4091 minTick = 0; 4092 } else { 4093 minTick = self.eventPromotions[key]['priceBlocks'][keyp]['min_tickets']; 4094 } 4095 4096 if (typeof self.eventPromotions[key]['priceBlocks'][keyp]['max_tickets'] === 'undefined') { 4097 maxTick = 30; 4098 } else { 4099 maxTick = self.eventPromotions[key]['priceBlocks'][keyp]['max_tickets']; 4100 } 4101 4102 if (minTick <= selectedVal && maxTick >= selectedVal && self.eventPromotions[key]['ispods']) { 4103 self.selectedPromoCode = self.eventPromotions[key]; 4104 break; 4105 } 4106 } 4107 4108 if (self.selectedPromoCode !== false) { 4109 break; 4110 } 4111 } 4112 4113 if (self.selectedPromoCode !== false) { 4114 self.renderSeatMap(workspacekey, event); 4115 self.createPricingMap(); 4116 } 4117 }); 4118 this.JTicketsChooser().trigger('change'); 4119 } 4120 4121} 4122 4123/* harmony default export */ __webpack_exports__["a"] = (RwbEventsFormController); 4124/*gActions() { 4125 this.JBuyButton().hide(); 4126 this.JBuyButton().off('click').on('click', jQuery.proxy(this.buyNowAction, this)); 4127 this.JQty().on('change', jQuery.proxy(this.changeQtyAction, this)); 4128 } 4129 4130 cartActions() { 4131 this.JBtn().on('click', jQuery.proxy(this.buyTicketBtn, this)); 4132 } 4133 changeQtyAction() { 4134 const qty = this.JQty().val(); 4135 this.seatChart.changeConfig({ 4136 numberOfPlacesToSelect: qty, 4137 maxSelectedObjects: qty 4138 }); 4139 } 4140 4141 buyNowAction() { 4142 let labels = []; 4143 let self = this; 4144 this.seatChart.listSelectedObjects( 4145 function (selectedObjects) { 4146 self.selectedObjectChart = selectedObjects; 4147 let c; 4148 let p; 4149 for (c = 0; c < self.selectedObjectChart.length; c++) { 4150 let label = {}; 4151 label.label = self.selectedObjectChart[c].label; 4152 for (p = 0; p < self.selectedObjectChart[c].pricing.ticketTypes.length; p++) { 4153 if (self.selectedObjectChart[c].pricing.ticketTypes[p]['ticketType'] === self.selectedObjectChart[c].selectedTicketType) { 4154 label.price = self.selectedObjectChart[c].pricing.ticketTypes[p]['price']; 4155 label.type = self.selectedObjectChart[c].pricing.ticketTypes[p]['ticketType']; 4156 } 4157 } 4158 labels.push(label); 4159 } 4160 labels = Object.assign({}, labels); 4161 let maxQty = self.JQty().val(); 4162 const data = { 4163 action: 'hold_seats', 4164 productid: self.JProductId(), 4165 seatlabels: labels, 4166 eventkey: self.selectedEvent, 4167 qty: maxQty, 4168 security: jQuery('#rwb_hold_seats_nonce').val() 4169 }; 4170 4171 4172 //if (JSON.stringify(self.oldDataSent) === JSON.stringify(data)) { 4173 //return false; 4174 //} 4175 4176 //self.oldDataSent = data; 4177 4178 self.JBuyButton().LoadingOverlay("show"); 4179 jQuery.ajax({ 4180 type: 'POST', 4181 dataType: 'json', 4182 url: bbLocal.ajax_url, 4183 data: data, 4184 success: jQuery.proxy(self.buyNowCompleted, self) 4185 }); 4186 } 4187 ); 4188 } 4189 4190 buyNowCompleted(response) { 4191 4192 if (response.success === false) { 4193 this.seatChart.rerender(); 4194 this.seatChart = false;
4195 this.selectedObjectChart = null; 4196 this.selectedEvent = null; 4197 alert(response.message); 4198 this.JBuyButton().LoadingOverlay("hide", true); 4199 this.JBuyButton().hide(); 4200 } else { 4201 window.location.href = response.url; 4202 } 4203 } 4204 4205 buyTicketBtn(event) { 4206 //this is needed because event.target does not have the element can be a span inside the button 4207 let btn = jQuery(event.target); 4208 let obj = btn.data(); 4209 if (Object.keys(obj).length === 0 && obj.constructor === Object) { 4210 btn = btn.parent(); 4211 } 4212 this.createDestroySeatChart(); 4213 4214 this.gActions(); 4215 let self = this; 4216 4217 this.seatChart = new seatsio.SeatingChart({ 4218 divId: 'divSeatsio', 4219 workspaceKey: this.getWorkspace(btn), 4220 event: this.getEventKey(btn), 4221 pricing: pricingJson, 4222 onChartRendered: function (chart) { 4223 }, 4224 onObjectDeselected: function (object, deselectedTicketType) { 4225 self.seatChart.listSelectedObjects( 4226 function (selectedObjects) { 4227 if (selectedObjects.length > 0) { 4228 self.JBuyButton().show(); 4229 } else { 4230 self.JBuyButton().hide(); 4231 } 4232 } 4233 ); 4234 4235 }, 4236 onObjectSelected: function (object, selectedTicketType) { 4237 self.seatChart.listSelectedObjects( 4238 function (selectedObjects) { 4239 if (selectedObjects.length > 0) { 4240 self.JBuyButton().show(); 4241 } else { 4242 self.JBuyButton().hide(); 4243 } 4244 } 4245 ); 4246 }, 4247 //numberOfPlacesToSelect: 1, 4248 priceFormatter: function (price) { 4249 return '$' + price; 4250 } 4251 }).render(); 4252 4253 const maxS = this.getMaxSelectedSeats(btn); 4254 if (maxS.length > 0) { 4255 let maxSeats = Function('"use strict";return (' + '[' + maxS + ']' + ')')(); 4256 this.seatChart.changeConfig({ 4257 maxSelectedObjects: maxSeats 4258 }); 4259 } else { 4260 this.seatChart.changeConfig({ 4261 numberOfPlacesToSelect: 1, 4262 maxSelectedObjects: 1 4263 }); 4264 } 4265 } 4266 4267 createDestroySeatChart() { 4268 if (this.seatChart !== false) { 4269 this.seatChart.destroy(); 4270 this.JBuyButton().LoadingOverlay('hide'); 4271 this.seatChart = false; 4272 this.selectedObjectChart = null; 4273 this.selectedEvent = null; 4274 } 4275 } 4276 */ 4277 4278/***/ }), 4279/* 3 */ 4280/***/ (function(module, __webpack_exports__, __webpack_require__) { 4281 4282"use strict"; 4283/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__RwbEventsFormModel__ = __webpack_require__(4); 4284 4285/** 4286 * View takes care to any html rendering and anything related to showing on the element and its children 4287 */ 4288 4289class RwbEventsFormView extends __WEBPACK_IMPORTED_MODULE_0__RwbEventsFormModel__["a" /* default */] { 4290 constructor() { 4291 super(); 4292 } 4293 4294 getWarningDiv(msg) { 4295 return '<div class="bb-warning">' + msg + '</div>'; 4296 } 4297 4298 showLoading() { 4299 swal(bbLocal.loading_text); 4300 swal.showLoading(); 4301 } 4302 4303 showSuccess(html) { 4304 swal('Good job!', html, 'success'); 4305 } 4306 4307 showError(html) { 4308 swal('Oops!', html, 'error'); 4309 } 4310 4311 closeModal() { 4312 swal.closeModal(); //swal.close(); 4313 } 4314 4315} 4316 4317/* harmony default export */ __webpack_exports__["a"] = (RwbEventsFormView); 4318 4319/***/ }), 4320/* 4 */ 4321/***/ (function(module, __webpack_exports__, __webpack_require__) { 4322 4323"use strict"; 4324/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__RwbEventsFormSpine__ = __webpack_require__(5); 4325 4326/** 4327 * Model takes care to the data-attributes attached to the element/read-write and trigger events on change of it. 4328 */ 4329 4330class RwbEventsFormModel extends __WEBPACK_IMPORTED_MODULE_0__RwbEventsFormSpine__["a" /* default */] { 4331 constructor() { 4332 super(); 4333 } 4334 4335 createDateAsUTC(date) { 4336 return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds())); 4337 } 4338 4339 getTimezoneInMiliseconds(datei) { 4340 let dateInput; 4341 4342 if (!datei) { 4343 dateInput = new Date(); 4344 } else { 4345 dateInput = new Date(datei); 4346 } 4347 4348 let fullYear = dateInput.getFullYear() | 0; // "Leap Years are any year that can be exactly divided by 4 (2012, 2016, etc) 4349 // except if it can be exactly divided by 100, then it isn't (2100,2200,etc) 4350 // except if it can be exactly divided by 400, then it is (2000, 2400)" 4351 // (https://www.mathsisfun.com/leap-years.html). 4352 4353 let isLeapYear = (fullYear & 3 | fullYear / 100 & 3) === 0 ? 1 : 0; // (fullYear & 3) = (fullYear % 4), but faster 4354 //Alternative:var isLeapYear=(new Date(currentYear,1,29,12)).getDate()===29?1:0 4355 4356 let fullMonth = dateInput.getMonth() | 0; 4357 let offsetDst = 0; 4358 /* offsetDst = ( 4359 // 1. We know what the time since the Epoch really is 4360 (+dateInput) // same as the dateInput.getTime() method 4361 // 2. We know what the time since the Epoch at the start of the year is 4362 - (+new Date(fullYear, 0, 0)) // day defaults to 1 if not explicitly zeroed 4363 // 3. Now, subtract what we would expect the time to be if daylight savings
4364 // did not exist. This yields the time-offset due to daylight savings. 4365 - (( 4366 (( 4367 // Calculate the day of the year in the Gregorian calendar 4368 // The code below works based upon the facts of signed right shifts 4369 // • (x) >> n: shifts n and fills in the n highest bits with 0s 4370 // • (-x) >> n: shifts n and fills in the n highest bits with 1s 4371 // (This assumes that x is a positive integer) 4372 (31 & ((-fullMonth) >> 4)) + // January // (-11)>>4 = -1 4373 ((28 + isLeapYear) & ((1 - fullMonth) >> 4)) + // February 4374 (31 & ((2 - fullMonth) >> 4)) + // March 4375 (30 & ((3 - fullMonth) >> 4)) + // April 4376 (31 & ((4 - fullMonth) >> 4)) + // May 4377 (30 & ((5 - fullMonth) >> 4)) + // June 4378 (31 & ((6 - fullMonth) >> 4)) + // July 4379 (31 & ((7 - fullMonth) >> 4)) + // August 4380 (30 & ((8 - fullMonth) >> 4)) + // September 4381 (31 & ((9 - fullMonth) >> 4)) + // October 4382 (30 & ((10 - fullMonth) >> 4)) + // November 4383 // There are no months past December: the year rolls into the next. 4384 // Thus, fullMonth is 0-based, so it will never be 12 in Javascript 4385 (dateInput.getDate() | 0) // get day of the month 4386 ) & 0xffff) * 24 * 60 // 24 hours in a day, 60 minutes in an hour 4387 + (dateInput.getHours() & 0xff) * 60 // 60 minutes in an hour 4388 + (dateInput.getMinutes() & 0xff)
4389 ) | 0) * 60 * 1000 // 60 seconds in a minute * 1000 milliseconds in a second 4390 - (dateInput.getSeconds() & 0xff) * 1000 // 1000 milliseconds in a second 4391 - dateInput.getMilliseconds() 4392 ); 4393 */ 4394 4395 if (dateInput.isDST()) { 4396 offsetDst = 60 * 60 * 1000; 4397 } 4398 4399 let tzOffset = dateInput.getTimezoneOffset() * 60 * 1000; 4400 /*if (tzOffset < 0) { 4401 tzOffset = tzOffset + offsetDst; 4402 } else { 4403 tzOffset = tzOffset - offsetDst; 4404 }*/ 4405 4406 return tzOffset; 4407 } 4408 4409 isMobile() { 4410 let check = false; 4411 4412 (function (a) { 4413 if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true; 4414 })(navigator.userAgent || navigator.vendor || window.opera); 4415 4416 return check; 4417 } 4418 4419 inArray(arr, elem) { 4420 for (const key in arr) { 4421 if (arr[key] + "" === "" + elem) { 4422 return key; 4423 } 4424 } 4425 4426 return false; 4427 } 4428 4429 createHtmlTable(id, head, rows, footer) { 4430 let table = jQuery('<table id="' + id + '"></table>'); 4431 let headTable = jQuery('<thead></thead>'); 4432 let bodyTable = jQuery('<tbody></tbody>'); 4433 let footerTable = jQuery('<tfoot></tfoot>'); 4434 let rowHtml = jQuery('<tr></tr>'); 4435 4436 for (const key in head) { 4437 let colspan = 1; 4438 4439 if (typeof head[key]['colspan'] !== 'undefined') { 4440 colspan = head[key]['colspan']; 4441 } 4442 4443 rowHtml.append(jQuery('<th colspan="' + colspan + '">' + head[key]['label'] + '</th>')); 4444 } 4445 4446 headTable.append(rowHtml); 4447 4448 for (const key in rows) { 4449 let rowHtml = jQuery('<tr></tr>'); 4450 4451 for (const col in rows[key]['columns']) { 4452 rowHtml.append(jQuery('<td>' + rows[key]['columns'][col] + '</td>')); 4453 } 4454 4455 bodyTable.append(rowHtml); 4456 } 4457 4458 let rowHtml1 = jQuery('<tr></tr>'); 4459 4460 for (const key in footer) { 4461 let colspan = 1; 4462 4463 if (typeof footer[key]['colspan'] !== 'undefined') { 4464 colspan = footer[key]['colspan']; 4465 } 4466 4467 rowHtml1.append(jQuery('<td colspan="' + colspan + '">' + footer[key]['label'] + '</td>')); 4468 } 4469 4470 footerTable.append(rowHtml1); 4471 table.append(headTable).append(bodyTable).append(footerTable); 4472 return table; 4473 } 4474 4475 getTime(sDate, withTime = true) { 4476 //const d = getNormalDate(sDate); 4477 if (typeof sDate === 'object') { 4478 //sDate = this.createDateAsUTC(sDate).getTime(); 4479 sDate = sDate.getTime(); 4480 } 4481 4482 if (!withTime) { 4483 return sDate - sDate % 86400000; 4484 } 4485 4486 return sDate; 4487 } 4488 4489 isInViewport(elem) { 4490 let elementTop = elem.offset().top; 4491 let elementBottom = elementTop + elem.outerHeight(); 4492 let viewportTop = jQuery(window).scrollTop(); 4493 let viewportBottom = viewportTop + jQuery(window).height(); 4494 return elementBottom > viewportTop && elementTop < viewportBottom; 4495 } 4496 4497 compare_asc(d1, d2) { 4498 if (typeof d1 === 'object') { 4499 d1 = this.getTime(d1); 4500 } 4501 4502 if (typeof d2 === 'object') { 4503 d2 = this.getTime(d2); 4504 } 4505 4506 if (d1 > d2) { 4507 return 1; 4508 } 4509 4510 if (d1 === d2) { 4511 return 0; 4512 } 4513 4514 if (d1 < d2) { 4515 return -1; 4516 } 4517 } 4518 4519 getPricing(el) { 4520 let pricing = el.data('pricing'); 4521 4522 if (!pricing) { 4523 pricing = []; 4524 } 4525 4526 return pricing.slice(1, -1); 4527 } 4528 4529 getMaxSelectedSeats(el) { 4530 let maxSelected = el.data('maxselectedobjects'); 4531 4532 if (!maxSelected) { 4533 maxSelected = []; 4534 } 4535 4536 return maxSelected.slice(1, -1); 4537 } 4538 4539 getNumberOfPlacesToSelect(el) {
4540 const qty = parseInt(el.data('numberofplacestoselect').slice(1, -1)); 4541 4542 if (isNaN(qty)) { 4543 return 1; 4544 } 4545 4546 return qty; 4547 } 4548 4549 getWorkspace(el) { 4550 return el.data('workspacekey').slice(1, -1); 4551 } 4552 4553 getEventKey(el) { 4554 return el.data('eventkey').slice(1, -1); 4555 } 4556 4557} 4558 4559/* harmony default export */ __webpack_exports__["a"] = (RwbEventsFormModel); 4560 4561/***/ }), 4562/* 5 */ 4563/***/ (function(module, __webpack_exports__, __webpack_require__) { 4564 4565"use strict"; 4566class RwbEventsFormSpine { 4567 constructor() { 4568 this.btn = '.rwb-tickets-btn'; 4569 this.seatChart = false; 4570 this.currentForm = null; 4571 this.selectedObjectChart = null; 4572 this.selectedEvent = null; 4573 this.eventList = null; 4574 this.calendar = null; 4575 this.selectedEventId = false; 4576 this.selectedeventPromotionsIds = false; 4577 this.selectedEventData = false; 4578 this.firstDateWithEvent = false; 4579 this.initPackPrice = false; 4580 this.ownPricingData = null; 4581 this.eventSeats = null; 4582 this.eventPromotions = null; 4583 this.seatAlertsAndTooltipsPerLabel = null; 4584 this.selectedPromoCode = false; 4585 this.selectedNumberOfTickets = 0; 4586 this.selectedLabels = false; 4587 this.fpsearch = false; 4588 this.myselectedObjects = []; 4589 this.scaltype = 'scalpop'; 4590 this.scalcat = '0'; 4591 this.cstart_date = ''; 4592 this.cend_date = ''; 4593 this.dselected = ''; 4594 } 4595 4596 JDocument() { 4597 return $(document); 4598 } 4599 4600 JBtn() { 4601 return this.JForm().find(this.btn); 4602 } 4603 4604 JSeatQty() { 4605 return '<div id="divSeatsio"></div><div id="qtyTickets"></div><div id="cartButton"><a href="#" class="button btn buynow">Buy Now</a></div>'; 4606 } 4607 4608 JSeatDiv() { 4609 return jQuery('#divSeatsio'); 4610 } 4611 4612 JProductId() { 4613 return jQuery('button.single_add_to_cart_button').val(); 4614 } 4615 4616 JBuyButton() { 4617 return jQuery('.tickets_cart .sbuynow'); 4618 } 4619 4620 JRoomReserveButton() { 4621 return jQuery('.reserve-button'); 4622 } 4623 4624 JIsAttraction() { 4625 if (jQuery('#has_attraction').length > 0) { 4626 return true; 4627 } 4628 4629 return false; 4630 } 4631 4632 JFreeSeating() { 4633 if (jQuery('#ris_free_seating').length > 0) { 4634 return true; 4635 } 4636 4637 return false; 4638 } 4639 4640 JAddToCartButton() { 4641 return jQuery('.tickets_cart .saddcart'); 4642 } 4643 4644 JPriceBestSeats() { 4645 return jQuery('.price_best_seats'); 4646 } 4647 4648 JZoneImage() { 4649 return jQuery('.attraction_zone_image.is_first'); 4650 } 4651 4652 JIsRedeam() { 4653 return jQuery('.rwb_redeam').length > 0; 4654 } 4655 4656 JQtyTickets() { 4657 return jQuery('#qtyTickets'); 4658 } 4659 4660 JQty() { 4661 return jQuery('#qtyTickets .qty_select'); 4662 } 4663 4664 JBuyTickets() { 4665 return jQuery('.buy_tickets_seats').find('a'); 4666 } 4667 4668 JFlatCalendar() { 4669 return jQuery('.flat_calendar'); 4670 } 4671 4672 JFlatCalendarInput() { 4673 return jQuery('.flat_calendar').find('input'); 4674 } 4675 4676 JEventsPerDate() { 4677 return jQuery('.events_per_date'); 4678 } 4679 4680 JEventsPerDateBeforeText() { 4681 return jQuery('.event_selection_ticket_text'); 4682 } 4683 4684 JEventSelection() { 4685 return jQuery('.event_selection_ticket'); 4686 } 4687 4688 JPriceMapExplanation() { 4689 return jQuery('#price_map_explanation'); 4690 } 4691 4692 JTicketsCart() { 4693 return jQuery('.event_selection_ticket .ticket_before_table_selected'); 4694 } 4695 4696 JTicketsSelectedCart() { 4697 return jQuery('.tickets_cart .ticket_selected_cart'); 4698 } 4699 4700 JTicketsButtonsCart() { 4701 return jQuery('.tickets_cart .ticket_buttons_cart'); 4702 } 4703 4704 JTicketsChooser() { 4705 return jQuery('#ticket_chooser'); 4706 } 4707 4708 JTicketsSelectedTable() { 4709 return jQuery('#tickets_selected'); 4710 } 4711 4712 JTimeElem(event_id, time_val, dateStr, i) { 4713 return jQuery('<div class="time_elem" ev_pos="' + i + '" event_date="' + dateStr + '" event_hour="' + time_val + '" event_id="' + event_id + '">' + '<i class="slv slv-radio-unchecked"></i>' + time_val + '</div>'); 4714 } 4715 4716 JSeatsMap() { 4717 return jQuery('#seats_map'); 4718 } 4719 4720 JSearchButton() { 4721 return jQuery('.search-controls .search-button').first(); 4722 } 4723 4724 JSearchButtonCalendar() { 4725 return jQuery('.search-controls .search-button-calendar').first(); 4726 } 4727 4728 JPackButton() { 4729 return jQuery('.startpack-button'); 4730 } 4731 4732 JDualDates() { 4733 if (jQuery('#ddualdates').length > 0) { 4734 return jQuery('#ddualdates'); 4735 } 4736 4737 return false;
4738 } 4739 4740 JTheme() { 4741 if (jQuery('#spottheme').length > 0) { 4742 return jQuery('#spottheme').attr('theme'); 4743 } 4744 4745 return 'dark'; 4746 } 4747 4748 JGoToMonth() { 4749 if (jQuery('#gtmonth').length > 0) { 4750 return { 4751 'year': parseInt(jQuery('#gtmonth').attr('dyear')), 4752 'month': parseInt(jQuery('#gtmonth').attr('dmonth')) 4753 }; 4754 } 4755 4756 return false; 4757 } 4758 4759 JBlankSeatsMap() { 4760 return jQuery('#blank_seats_map'); 4761 } 4762 4763 JPriceMap() { 4764 return jQuery('#price_map'); 4765 } 4766 4767 JPriceMapSeats() { 4768 return jQuery('#price_map_seats'); 4769 } 4770 4771 JForm() { 4772 if (this.currentForm === null) { 4773 if (jQuery(this.form).parent().is('form')) { 4774 this.currentForm = jQuery(this.form).parent(); 4775 return jQuery(this.form).parent(); 4776 } 4777 4778 let mainForm = jQuery(this.form).nextAll('form').first(); 4779 4780 if (mainForm.length > 0) { 4781 jQuery(this.form).prependTo(mainForm); 4782 } else { 4783 mainForm = jQuery('form.cart').first(); 4784 } 4785 4786 this.currentForm = mainForm; 4787 return mainForm; 4788 } else { 4789 return this.currentForm; 4790 } 4791 } 4792 4793} 4794 4795/* harmony default export */ __webpack_exports__["a"] = (RwbEventsFormSpine); 4796 4797/***/ }), 4798/* 6 */ 4799/***/ (function(module, exports, __webpack_require__) { 4800 4801/*! 4802* sweetalert2 v10.14.0 4803* Released under the MIT License. 4804*/ 4805(function (global, factory) { 4806 true ? module.exports = factory() : 4807 typeof define === 'function' && define.amd ? define(factory) : 4808 (global = global || self, global.Sweetalert2 = factory()); 4809}(this, function () { 'use strict'; 4810 4811 function _typeof(obj) { 4812 "@babel/helpers - typeof"; 4813 4814 if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { 4815 _typeof = function (obj) { 4816 return typeof obj; 4817 }; 4818 } else { 4819 _typeof = function (obj) { 4820 return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; 4821 }; 4822 } 4823 4824 return _typeof(obj); 4825 } 4826 4827 function _classCallCheck(instance, Constructor) { 4828 if (!(instance instanceof Constructor)) { 4829 throw new TypeError("Cannot call a class as a function"); 4830 } 4831 } 4832 4833 function _defineProperties(target, props) { 4834 for (var i = 0; i < props.length; i++) { 4835 var descriptor = props[i]; 4836 descriptor.enumerable = descriptor.enumerable || false; 4837 descriptor.configurable = true; 4838 if ("value" in descriptor) descriptor.writable = true; 4839 Object.defineProperty(target, descriptor.key, descriptor); 4840 } 4841 } 4842 4843 function _createClass(Constructor, protoProps, staticProps) { 4844 if (protoProps) _defineProperties(Constructor.prototype, protoProps); 4845 if (staticProps) _defineProperties(Constructor, staticProps); 4846 return Constructor; 4847 } 4848 4849 function _extends() { 4850 _extends = Object.assign || function (target) { 4851 for (var i = 1; i < arguments.length; i++) { 4852 var source = arguments[i]; 4853 4854 for (var key in source) { 4855 if (Object.prototype.hasOwnProperty.call(source, key)) { 4856 target[key] = source[key]; 4857 } 4858 } 4859 } 4860 4861 return target; 4862 }; 4863 4864 return _extends.apply(this, arguments); 4865 } 4866 4867 function _inherits(subClass, superClass) { 4868 if (typeof superClass !== "function" && superClass !== null) { 4869 throw new TypeError("Super expression must either be null or a function"); 4870 } 4871 4872 subClass.prototype = Object.create(superClass && superClass.prototype, { 4873 constructor: { 4874 value: subClass, 4875 writable: true, 4876 configurable: true 4877 } 4878 }); 4879 if (superClass) _setPrototypeOf(subClass, superClass); 4880 } 4881 4882 function _getPrototypeOf(o) { 4883 _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { 4884 return o.__proto__ || Object.getPrototypeOf(o); 4885 }; 4886 return _getPrototypeOf(o); 4887 } 4888 4889 function _setPrototypeOf(o, p) { 4890 _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { 4891 o.__proto__ = p; 4892 return o; 4893 }; 4894 4895 return _setPrototypeOf(o, p); 4896 } 4897 4898 function _isNativeReflectConstruct() { 4899 if (typeof Reflect === "undefined" || !Reflect.construct) return false;
4900 if (Reflect.construct.sham) return false; 4901 if (typeof Proxy === "function") return true; 4902 4903 try { 4904 Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); 4905 return true; 4906 } catch (e) { 4907 return false; 4908 } 4909 } 4910 4911 function _construct(Parent, args, Class) { 4912 if (_isNativeReflectConstruct()) { 4913 _construct = Reflect.construct; 4914 } else { 4915 _construct = function _construct(Parent, args, Class) { 4916 var a = [null]; 4917 a.push.apply(a, args); 4918 var Constructor = Function.bind.apply(Parent, a); 4919 var instance = new Constructor(); 4920 if (Class) _setPrototypeOf(instance, Class.prototype); 4921 return instance; 4922 }; 4923 } 4924 4925 return _construct.apply(null, arguments); 4926 } 4927 4928 function _assertThisInitialized(self) { 4929 if (self === void 0) { 4930 throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); 4931 } 4932 4933 return self; 4934 } 4935 4936 function _possibleConstructorReturn(self, call) { 4937 if (call && (typeof call === "object" || typeof call === "function")) { 4938 return call; 4939 } 4940 4941 return _assertThisInitialized(self); 4942 } 4943 4944 function _createSuper(Derived) { 4945 var hasNativeReflectConstruct = _isNativeReflectConstruct(); 4946 4947 return function _createSuperInternal() { 4948 var Super = _getPrototypeOf(Derived), 4949 result; 4950 4951 if (hasNativeReflectConstruct) { 4952 var NewTarget = _getPrototypeOf(this).constructor; 4953 4954 result = Reflect.construct(Super, arguments, NewTarget); 4955 } else { 4956 result = Super.apply(this, arguments); 4957 } 4958 4959 return _possibleConstructorReturn(this, result); 4960 }; 4961 } 4962 4963 function _superPropBase(object, property) { 4964 while (!Object.prototype.hasOwnProperty.call(object, property)) { 4965 object = _getPrototypeOf(object); 4966 if (object === null) break; 4967 } 4968 4969 return object; 4970 } 4971 4972 function _get(target, property, receiver) { 4973 if (typeof Reflect !== "undefined" && Reflect.get) { 4974 _get = Reflect.get; 4975 } else { 4976 _get = function _get(target, property, receiver) { 4977 var base = _superPropBase(target, property); 4978 4979 if (!base) return; 4980 var desc = Object.getOwnPropertyDescriptor(base, property); 4981 4982 if (desc.get) { 4983 return desc.get.call(receiver); 4984 } 4985 4986 return desc.value; 4987 }; 4988 } 4989 4990 return _get(target, property, receiver || target); 4991 } 4992 4993 var consolePrefix = 'SweetAlert2:'; 4994 /** 4995 * Filter the unique values into a new array 4996 * @param arr 4997 */ 4998 4999 var uniqueArray = function uniqueArray(arr) { 5000 var result = []; 5001 5002 for (var i = 0; i < arr.length; i++) { 5003 if (result.indexOf(arr[i]) === -1) { 5004 result.push(arr[i]); 5005 } 5006 } 5007 5008 return result; 5009 }; 5010 /** 5011 * Capitalize the first letter of a string 5012 * @param str 5013 */ 5014 5015 var capitalizeFirstLetter = function capitalizeFirstLetter(str) { 5016 return str.charAt(0).toUpperCase() + str.slice(1); 5017 }; 5018 /** 5019 * Returns the array of object values (Object.values isn't supported in IE11) 5020 * @param obj 5021 */ 5022 5023 var objectValues = function objectValues(obj) { 5024 return Object.keys(obj).map(function (key) { 5025 return obj[key]; 5026 }); 5027 }; 5028 /** 5029 * Convert NodeList to Array 5030 * @param nodeList 5031 */ 5032 5033 var toArray = function toArray(nodeList) { 5034 return Array.prototype.slice.call(nodeList); 5035 }; 5036 /** 5037 * Standardise console warnings 5038 * @param message 5039 */ 5040 5041 var warn = function warn(message) { 5042 console.warn("".concat(consolePrefix, " ").concat(_typeof(message) === 'object' ? message.join(' ') : message)); 5043 }; 5044 /** 5045 * Standardise console errors 5046 * @param message 5047 */ 5048 5049 var error = function error(message) { 5050 console.error("".concat(consolePrefix, " ").concat(message)); 5051 }; 5052 /** 5053 * Private global state for `warnOnce` 5054 * @type {Array} 5055 * @private 5056 */ 5057 5058 var previousWarnOnceMessages = []; 5059 /** 5060 * Show a console warning, but only if it hasn't already been shown 5061 * @param message 5062 */ 5063 5064 var warnOnce = function warnOnce(message) { 5065 if (!(previousWarnOnceMessages.indexOf(message) !== -1)) { 5066 previousWarnOnceMessages.push(message); 5067 warn(message); 5068 } 5069 }; 5070 /** 5071 * Show a one-time console warning about deprecated params/methods 5072 */ 5073 5074 var warnAboutDeprecation = function warnAboutDeprecation(deprecatedParam, useInstead) { 5075 warnOnce("\"".concat(deprecatedParam, "\" is deprecated and will be removed in the next major release. Please use \"").concat(useInstead, "\" instead.")); 5076 }; 5077 /** 5078 * If `arg` is a function, call it (with no arguments or context) and return the result. 5079 * Otherwise, just pass the value through 5080 * @param arg 5081 */ 5082 5083 var callIfFunction = function callIfFunction(arg) { 5084 return typeof arg === 'function' ? arg() : arg;
5085 }; 5086 var hasToPromiseFn = function hasToPromiseFn(arg) { 5087 return arg && typeof arg.toPromise === 'function'; 5088 }; 5089 var asPromise = function asPromise(arg) { 5090 return hasToPromiseFn(arg) ? arg.toPromise() : Promise.resolve(arg); 5091 }; 5092 var isPromise = function isPromise(arg) { 5093 return arg && Promise.resolve(arg) === arg; 5094 }; 5095 5096 var DismissReason = Object.freeze({ 5097 cancel: 'cancel', 5098 backdrop: 'backdrop', 5099 close: 'close', 5100 esc: 'esc', 5101 timer: 'timer' 5102 }); 5103 5104 var isJqueryElement = function isJqueryElement(elem) { 5105 return _typeof(elem) === 'object' && elem.jquery; 5106 }; 5107 5108 var isElement = function isElement(elem) { 5109 return elem instanceof Element || isJqueryElement(elem); 5110 }; 5111 5112 var argsToParams = function argsToParams(args) { 5113 var params = {}; 5114 5115 if (_typeof(args[0]) === 'object' && !isElement(args[0])) { 5116 _extends(params, args[0]); 5117 } else { 5118 ['title', 'html', 'icon'].forEach(function (name, index) { 5119 var arg = args[index]; 5120 5121 if (typeof arg === 'string' || isElement(arg)) { 5122 params[name] = arg; 5123 } else if (arg !== undefined) { 5124 error("Unexpected type of ".concat(name, "! Expected \"string\" or \"Element\", got ").concat(_typeof(arg))); 5125 } 5126 }); 5127 } 5128 5129 return params; 5130 }; 5131 5132 var swalPrefix = 'swal2-'; 5133 var prefix = function prefix(items) { 5134 var result = {}; 5135 5136 for (var i in items) { 5137 result[items[i]] = swalPrefix + items[i]; 5138 } 5139 5140 return result; 5141 }; 5142 var swalClasses = prefix(['container', 'shown', 'height-auto', 'iosfix', 'popup', 'modal', 'no-backdrop', 'no-transition', 'toast', 'toast-shown', 'toast-column', 'show', 'hide', 'close', 'title', 'header', 'content', 'html-container', 'actions', 'confirm', 'deny', 'cancel', 'footer', 'icon', 'icon-content', 'image', 'input', 'file', 'range', 'select', 'radio', 'checkbox', 'label', 'textarea', 'inputerror', 'input-label', 'validation-message', 'progress-steps', 'active-progress-step', 'progress-step', 'progress-step-line', 'loader', 'loading', 'styled', 'top', 'top-start', 'top-end', 'top-left', 'top-right', 'center', 'center-start', 'center-end', 'center-left', 'center-right', 'bottom', 'bottom-start', 'bottom-end', 'bottom-left', 'bottom-right', 'grow-row', 'grow-column', 'grow-fullscreen', 'rtl', 'timer-progress-bar', 'timer-progress-bar-container', 'scrollbar-measure', 'icon-success', 'icon-warning', 'icon-info', 'icon-question', 'icon-error']); 5143 var iconTypes = prefix(['success', 'warning', 'info', 'question', 'error']); 5144 5145 var getContainer = function getContainer() { 5146 return document.body.querySelector(".".concat(swalClasses.container)); 5147 }; 5148 var elementBySelector = function elementBySelector(selectorString) { 5149 var container = getContainer(); 5150 return container ? container.querySelector(selectorString) : null; 5151 }; 5152 5153 var elementByClass = function elementByClass(className) { 5154 return elementBySelector(".".concat(className)); 5155 }; 5156 5157 var getPopup = function getPopup() { 5158 return elementByClass(swalClasses.popup); 5159 }; 5160 var getIcons = function getIcons() { 5161 var popup = getPopup(); 5162 return toArray(popup.querySelectorAll(".".concat(swalClasses.icon))); 5163 }; 5164 var getIcon = function getIcon() { 5165 var visibleIcon = getIcons().filter(function (icon) { 5166 return isVisible(icon); 5167 }); 5168 return visibleIcon.length ? visibleIcon[0] : null; 5169 }; 5170 var getTitle = function getTitle() { 5171 return elementByClass(swalClasses.title); 5172 }; 5173 var getContent = function getContent() { 5174 return elementByClass(swalClasses.content); 5175 }; 5176 var getHtmlContainer = function getHtmlContainer() { 5177 return elementByClass(swalClasses['html-container']); 5178 }; 5179 var getImage = function getImage() { 5180 return elementByClass(swalClasses.image); 5181 }; 5182 var getProgressSteps = function getProgressSteps() { 5183 return elementByClass(swalClasses['progress-steps']); 5184 }; 5185 var getValidationMessage = function getValidationMessage() { 5186 return elementByClass(swalClasses['validation-message']); 5187 }; 5188 var getConfirmButton = function getConfirmButton() { 5189 return elementBySelector(".".concat(swalClasses.actions, " .").concat(swalClasses.confirm)); 5190 }; 5191 var getDenyButton = function getDenyButton() { 5192 return elementBySelector(".".concat(swalClasses.actions, " .").concat(swalClasses.deny)); 5193 }; 5194 var getInputLabel = function getInputLabel() { 5195 return elementByClass(swalClasses['input-label']); 5196 }; 5197 var getLoader = function getLoader() { 5198 return elementBySelector(".".concat(swalClasses.loader)); 5199 }; 5200 var getCancelButton = function getCancelButton() { 5201 return elementBySelector(".".concat(swalClasses.actions, " .").concat(swalClasses.cancel)); 5202 }; 5203 var getActions = function getActions() { 5204 return elementByClass(swalClasses.actions); 5205 }; 5206 var getHeader = function getHeader() { 5207 return elementByClass(swalClasses.header); 5208 }; 5209 var getFooter = function getFooter() { 5210 return elementByClass(swalClasses.footer); 5211 }; 5212 var getTimerProgressBar = function getTimerProgressBar() { 5213 return elementByClass(swalClasses['timer-progress-bar']); 5214 }; 5215 var getCloseButton = function getCloseButton() { 5216 return elementByClass(swalClasses.close); 5217 }; // https://github.com/jkup/focusable/blob/master/index.js 5218 5219 var focusable = "\n a[href],\n area[href],\n input:not([disabled]),\n select:not([disabled]),\n textarea:not([disabled]),\n button:not([disabled]),\n iframe,\n object,\n embed,\n [tabindex=\"0\"],\n [contenteditable],\n audio[controls],\n video[controls],\n summary\n"; 5220 var getFocusableElements = function getFocusableElements() { 5221 var focusableElementsWithTabindex = toArray(getPopup().querySelectorAll('[tabindex]:not
5221([tabindex="-1"]):not([tabindex="0"])')) // sort according to tabindex 5222 .sort(function (a, b) { 5223 a = parseInt(a.getAttribute('tabindex')); 5224 b = parseInt(b.getAttribute('tabindex')); 5225 5226 if (a > b) { 5227 return 1; 5228 } else if (a < b) { 5229 return -1; 5230 } 5231 5232 return 0; 5233 }); 5234 var otherFocusableElements = toArray(getPopup().querySelectorAll(focusable)).filter(function (el) { 5235 return el.getAttribute('tabindex') !== '-1'; 5236 }); 5237 return uniqueArray(focusableElementsWithTabindex.concat(otherFocusableElements)).filter(function (el) { 5238 return isVisible(el); 5239 }); 5240 }; 5241 var isModal = function isModal() { 5242 return !isToast() && !document.body.classList.contains(swalClasses['no-backdrop']); 5243 }; 5244 var isToast = function isToast() { 5245 return document.body.classList.contains(swalClasses['toast-shown']); 5246 }; 5247 var isLoading = function isLoading() { 5248 return getPopup().hasAttribute('data-loading'); 5249 }; 5250 5251 var states = { 5252 previousBodyPadding: null 5253 }; 5254 var setInnerHtml = function setInnerHtml(elem, html) { 5255 // #1926 5256 elem.textContent = ''; 5257 5258 if (html) { 5259 var parser = new DOMParser(); 5260 var parsed = parser.parseFromString(html, "text/html"); 5261 toArray(parsed.querySelector('head').childNodes).forEach(function (child) { 5262 elem.appendChild(child); 5263 }); 5264 toArray(parsed.querySelector('body').childNodes).forEach(function (child) { 5265 elem.appendChild(child); 5266 }); 5267 } 5268 }; 5269 var hasClass = function hasClass(elem, className) { 5270 if (!className) { 5271 return false; 5272 } 5273 5274 var classList = className.split(/\s+/); 5275 5276 for (var i = 0; i < classList.length; i++) { 5277 if (!elem.classList.contains(classList[i])) { 5278 return false; 5279 } 5280 } 5281 5282 return true; 5283 }; 5284 5285 var removeCustomClasses = function removeCustomClasses(elem, params) { 5286 toArray(elem.classList).forEach(function (className) { 5287 if (!(objectValues(swalClasses).indexOf(className) !== -1) && !(objectValues(iconTypes).indexOf(className) !== -1) && !(objectValues(params.showClass).indexOf(className) !== -1)) { 5288 elem.classList.remove(className); 5289 } 5290 }); 5291 }; 5292 5293 var applyCustomClass = function applyCustomClass(elem, params, className) { 5294 removeCustomClasses(elem, params); 5295 5296 if (params.customClass && params.customClass[className]) { 5297 if (typeof params.customClass[className] !== 'string' && !params.customClass[className].forEach) { 5298 return warn("Invalid type of customClass.".concat(className, "! Expected string or iterable object, got \"").concat(_typeof(params.customClass[className]), "\"")); 5299 } 5300 5301 addClass(elem, params.customClass[className]); 5302 } 5303 }; 5304 function getInput(content, inputType) { 5305 if (!inputType) { 5306 return null; 5307 } 5308 5309 switch (inputType) { 5310 case 'select': 5311 case 'textarea': 5312 case 'file': 5313 return getChildByClass(content, swalClasses[inputType]); 5314 5315 case 'checkbox': 5316 return content.querySelector(".".concat(swalClasses.checkbox, " input")); 5317 5318 case 'radio': 5319 return content.querySelector(".".concat(swalClasses.radio, " input:checked")) || content.querySelector(".".concat(swalClasses.radio, " input:first-child")); 5320 5321 case 'range': 5322 return content.querySelector(".".concat(swalClasses.range, " input")); 5323 5324 default: 5325 return getChildByClass(content, swalClasses.input); 5326 } 5327 } 5328 var focusInput = function focusInput(input) { 5329 input.focus(); // place cursor at end of text in text input 5330 5331 if (input.type !== 'file') { 5332 // http://stackoverflow.com/a/2345915 5333 var val = input.value; 5334 input.value = ''; 5335 input.value = val; 5336 } 5337 }; 5338 var toggleClass = function toggleClass(target, classList, condition) { 5339 if (!target || !classList) { 5340 return; 5341 } 5342 5343 if (typeof classList === 'string') { 5344 classList = classList.split(/\s+/).filter(Boolean); 5345 } 5346 5347 classList.forEach(function (className) { 5348 if (target.forEach) { 5349 target.forEach(function (elem) { 5350 condition ? elem.classList.add(className) : elem.classList.remove(className); 5351 }); 5352 } else { 5353 condition ? target.classList.add(className) : target.classList.remove(className); 5354 } 5355 }); 5356 }; 5357 var addClass = function addClass(target, classList) { 5358 toggleClass(target, classList, true); 5359 }; 5360 var removeClass = function removeClass(target, classList) { 5361 toggleClass(target, classList, false); 5362 }; 5363 var getChildByClass = function getChildByClass(elem, className) { 5364 for (var i = 0; i < elem.childNodes.length; i++) { 5365 if (hasClass(elem.childNodes[i], className)) { 5366 return elem.childNodes[i]; 5367 } 5368 } 5369 }; 5370 var applyNumericalStyle = function applyNumericalStyle(elem, property, value) { 5371 if (value === "".concat(parseInt(value))) { 5372 value = parseInt(value); 5373 } 5374 5375 if (value || parseInt(value) === 0) { 5376 elem.style[property] = typeof value === 'number' ? "".concat(value, "px") : value; 5377 } else { 5378 elem.style.removeProperty(property); 5379 } 5380 }; 5381 var show = function show(elem) { 5382 var display = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'flex'; 5383 elem.style.display = display; 5384 }; 5385 var hide = function hide(elem) { 5386 elem.style.display = 'none'; 5387 }; 5388 var setStyle = function setStyle(parent, selector, property, value) { 5389 var el = parent.querySelector(selector); 5390 5391 if (el) { 5392 el.style[property] = value; 5393 } 5394 }; 5395 var toggle = function toggle(elem, condition, display) { 5396 condition ? show(elem, display) : hide(elem); 5397 }; // borrowed from jquery $(elem).is(':visible') implementation 5398 5399 var isVisible = function isVisible(elem) { 5400 return !!(elem && (elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length)); 5401 }; 5402 var allButtonsAreHidden = function allButtonsAreHidden() { 5403 return !isVisible(getConfirmButton()) && !isVisible(getDenyButton()) && !isVisible(getCancelButton()); 5404 }; 5405 var isScrollable = function isScrollable(elem) { 5406 return !!(elem.scrollHeight > elem.clientHeight); 5407 }; // borrowed from https://stackoverflow.com/a/46352119 5408 5409 var hasCssAnimation = function hasCssAnimation(elem) { 5410 var style = window.getComputedStyle(elem); 5411 var animDuration = parseFloat(style.getPropertyValue('animation-duration') || '0'); 5412 var transDuration = parseFloat(style.getPropertyValue('transition-duration') || '0'); 5413 return animDuration > 0 || transDuration > 0; 5414 }; 5415 var contains = function contains(haystack, needle) { 5416 if (typeof haystack.contains === 'function') { 5417 return haystack.contains(needle); 5418 } 5419 }; 5420 var animateTimerProgressBar = function animateTimerProgressBar(timer) { 5421 var reset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
5422 var timerProgressBar = getTimerProgressBar(); 5423 5424 if (isVisible(timerProgressBar)) { 5425 if (reset) { 5426 timerProgressBar.style.transition = 'none'; 5427 timerProgressBar.style.width = '100%'; 5428 } 5429 5430 setTimeout(function () { 5431 timerProgressBar.style.transition = "width ".concat(timer / 1000, "s linear"); 5432 timerProgressBar.style.width = '0%'; 5433 }, 10); 5434 } 5435 }; 5436 var stopTimerProgressBar = function stopTimerProgressBar() { 5437 var timerProgressBar = getTimerProgressBar(); 5438 var timerProgressBarWidth = parseInt(window.getComputedStyle(timerProgressBar).width); 5439 timerProgressBar.style.removeProperty('transition'); 5440 timerProgressBar.style.width = '100%'; 5441 var timerProgressBarFullWidth = parseInt(window.getComputedStyle(timerProgressBar).width); 5442 var timerProgressBarPercent = parseInt(timerProgressBarWidth / timerProgressBarFullWidth * 100); 5443 timerProgressBar.style.removeProperty('transition'); 5444 timerProgressBar.style.width = "".concat(timerProgressBarPercent, "%"); 5445 }; 5446 5447 // Detect Node env 5448 var isNodeEnv = function isNodeEnv() { 5449 return typeof window === 'undefined' || typeof document === 'undefined'; 5450 }; 5451 5452 var sweetHTML = "\n <div aria-labelledby=\"".concat(swalClasses.title, "\" aria-describedby=\"").concat(swalClasses.content, "\" class=\"").concat(swalClasses.popup, "\" tabindex=\"-1\">\n <div class=\"").concat(swalClasses.header, "\">\n <ul class=\"").concat(swalClasses['progress-steps'], "\"></ul>\n <div class=\"").concat(swalClasses.icon, " ").concat(iconTypes.error, "\"></div>\n <div class=\"").concat(swalClasses.icon, " ").concat(iconTypes.question, "\"></div>\n <div class=\"").concat(swalClasses.icon, " ").concat(iconTypes.warning, "\"></div>\n <div class=\"").concat(swalClasses.icon, " ").concat(iconTypes.info, "\"></div>\n <div class=\"").concat(swalClasses.icon, " ").concat(iconTypes.success, "\"></div>\n <img class=\"").concat(swalClasses.image, "\" />\n <h2 class=\"").concat(swalClasses.title, "\" id=\"").concat(swalClasses.title, "\"></h2>\n <button type=\"button\" class=\"").concat(swalClasses.close, "\"></button>\n </div>\n <div class=\"").concat(swalClasses.content, "\">\n <div id=\"").concat(swalClasses.content, "\" class=\"").concat(swalClasses['html-container'], "\"></div>\n <input class=\"").concat(swalClasses.input, "\" />\n <input type=\"file\" class=\"").concat(swalClasses.file, "\" />\n <div class=\"").concat(swalClasses.range, "\">\n <input type=\"range\" />\n <output></output>\n </div>\n <select class=\"").concat(swalClasses.select, "\"></select>\n <div class=\"").concat(swalClasses.radio, "\"></div>\n <label for=\"").concat(swalClasses.checkbox, "\" class=\"").concat(swalClasses.checkbox, "\">\n <input type=\"checkbox\" />\n <span class=\"").concat(swalClasses.label, "\"></span>\n </label>\n <textarea class=\"").concat(swalClasses.textarea, "\"></textarea>\n <div class=\"").concat(swalClasses['validation-message'], "\" id=\"").concat(swalClasses['validation-message'], "\"></div>\n </div>\n <div class=\"").concat(swalClasses.actions, "\">\n <div class=\"").concat(swalClasses.loader, "\"></div>\n <button type=\"button\" class=\"").concat(swalClasses.confirm, "\"></button>\n <button type=\"button\" class=\"").concat(swalClasses.deny, "\"></button>\n <button type=\"button\" class=\"").concat(swalClasses.cancel, "\"></button>\n </div>\n <div class=\"").concat(swalClasses.footer, "\"></div>\n <div class=\"").concat(swalClasses['timer-progress-bar-container'], "\">\n <div class=\"").concat(swalClasses['timer-progress-bar'], "\"></div>\n </div>\n </div>\n").replace(/(^|\n)\s*/g, ''); 5453 5454 var resetOldContainer = function resetOldContainer() { 5455 var oldContainer = getContainer(); 5456 5457 if (!oldContainer) { 5458 return false; 5459 } 5460 5461 oldContainer.parentNode.removeChild(oldContainer); 5462 removeClass([document.documentElement, document.body], [swalClasses['no-backdrop'], swalClasses['toast-shown'], swalClasses['has-column']]); 5463 return true; 5464 }; 5465 5466 var oldInputVal; // IE11 workaround, see #1109 for details 5467 5468 var resetValidationMessage = function resetValidationMessage(e) { 5469 if (Swal.isVisible() && oldInputVal !== e.target.value) { 5470 Swal.resetValidationMessage(); 5471 } 5472 5473 oldInputVal = e.target.value; 5474 }; 5475 5476 var addInputChangeListeners = function addInputChangeListeners() { 5477 var content = getContent(); 5478 var input = getChildByClass(content, swalClasses.input); 5479 var file = getChildByClass(content, swalClasses.file); 5480 var range = content.querySelector(".".concat(swalClasses.range, " input")); 5481 var rangeOutput = content.querySelector(".".concat(swalClasses.range, " output")); 5482 var select = getChildByClass(content, swalClasses.select); 5483 var checkbox = content.querySelector(".".concat(swalClasses.checkbox, " input")); 5484 var textarea = getChildByClass(content, swalClasses.textarea); 5485 input.oninput = resetValidationMessage; 5486 file.onchange = resetValidationMessage; 5487 select.onchange = resetValidationMessage; 5488 checkbox.onchange = resetValidationMessage; 5489 textarea.oninput = resetValidationMessage; 5490 5491 range.oninput = function (e) { 5492 resetValidationMessage(e); 5493 rangeOutput.value = range.value; 5494 }; 5495 5496 range.onchange = function (e) { 5497 resetValidationMessage(e); 5498 range.nextSibling.value = range.value; 5499 }; 5500 }; 5501 5502 var getTarget = function getTarget(target) { 5503 return typeof target === 'string' ? document.querySelector(target) : target; 5504 }; 5505 5506 var setupAccessibility = function setupAccessibility(params) { 5507 var popup = getPopup(); 5508 popup.setAttribute('role', params.toast ? 'alert' : 'dialog'); 5509 popup.setAttribute('aria-live', params.toast ? 'polite' : 'assertive'); 5510 5511 if (!params.toast) { 5512 popup.setAttribute('aria-modal', 'true'); 5513 } 5514 }; 5515 5516 var setupRTL = function setupRTL(targetElement) { 5517 if (window.getComputedStyle(targetElement).direction === 'rtl') { 5518 addClass(getContainer(), swalClasses.rtl); 5519 } 5520 }; 5521 /* 5522 * Add modal + backdrop to DOM 5523 */ 5524 5525 5526 var init = function init(params) { 5527 // Clean up the old popup container if it exists 5528 var oldContainerExisted = resetOldContainer(); 5529 /* istanbul ignore if */ 5530 5531 if (isNodeEnv()) { 5532 error('SweetAlert2 requires document to initialize'); 5533 return; 5534 } 5535 5536 var container = document.createElement('div'); 5537 container.className = swalClasses.container; 5538 5539 if (oldContainerExisted) { 5540 addClass(container, swalClasses['no-transition']); 5541 } 5542 5543 setInnerHtml(container, sweetHTML); 5544 var targetElement = getTarget(params.target); 5545 targetElement.appendChild(container); 5546 setupAccessibility(params); 5547 setupRTL(targetElement); 5548 addInputChangeListeners(); 5549 }; 5550 5551 var parseHtmlToContainer = function parseHtmlToContainer(param, target) { 5552 // DOM element 5553 if (param instanceof HTMLElement) { 5554 target.appendChild(param); // Object 5555 } else if (_typeof(param) === 'object') { 5556 handleObject(param, target); // Plain string 5557 } else if (param) { 5558 setInnerHtml(target, param); 5559 } 5560 }; 5561 5562 var handleObject = function handleObject(param, target) { 5563 // JQuery element(s) 5564 if (param.jquery) { 5565 handleJqueryElem(target, param); // For other objects use their string representation 5566 } else { 5567 setInnerHtml(target, param.toString()); 5568 } 5569 }; 5570 5571 var handleJqueryElem = function handleJqueryElem(target, elem) { 5572 target.textContent = ''; 5573 5574 if (0 in elem) { 5575 for (var i = 0; (i in elem); i++) { 5576 target.appendChild(elem[i].cloneNode(true)); 5577 } 5578 } else { 5579 target.appendChild(elem.cloneNode(true)); 5580 } 5581 }; 5582 5583 var animationEndEvent = function () { 5584 // Prevent run in Node env 5585 5586 /* istanbul ignore if */ 5587 if (isNodeEnv()) { 5588 return false;
5589 } 5590 5591 var testEl = document.createElement('div'); 5592 var transEndEventNames = { 5593 WebkitAnimation: 'webkitAnimationEnd', 5594 OAnimation: 'oAnimationEnd oanimationend', 5595 animation: 'animationend' 5596 }; 5597 5598 for (var i in transEndEventNames) { 5599 if (Object.prototype.hasOwnProperty.call(transEndEventNames, i) && typeof testEl.style[i] !== 'undefined') { 5600 return transEndEventNames[i]; 5601 } 5602 } 5603 5604 return false; 5605 }(); 5606 5607 // https://github.com/twbs/bootstrap/blob/master/js/src/modal.js 5608 5609 var measureScrollbar = function measureScrollbar() { 5610 var scrollDiv = document.createElement('div'); 5611 scrollDiv.className = swalClasses['scrollbar-measure']; 5612 document.body.appendChild(scrollDiv); 5613 var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth; 5614 document.body.removeChild(scrollDiv); 5615 return scrollbarWidth; 5616 }; 5617 5618 var renderActions = function renderActions(instance, params) { 5619 var actions = getActions(); 5620 var loader = getLoader(); 5621 var confirmButton = getConfirmButton(); 5622 var denyButton = getDenyButton(); 5623 var cancelButton = getCancelButton(); // Actions (buttons) wrapper 5624 5625 if (!params.showConfirmButton && !params.showDenyButton && !params.showCancelButton) { 5626 hide(actions); 5627 } // Custom class 5628 5629 5630 applyCustomClass(actions, params, 'actions'); // Render buttons 5631 5632 renderButton(confirmButton, 'confirm', params); 5633 renderButton(denyButton, 'deny', params); 5634 renderButton(cancelButton, 'cancel', params); 5635 handleButtonsStyling(confirmButton, denyButton, cancelButton, params); 5636 5637 if (params.reverseButtons) { 5638 actions.insertBefore(cancelButton, loader); 5639 actions.insertBefore(denyButton, loader); 5640 actions.insertBefore(confirmButton, loader); 5641 } // Loader 5642 5643 5644 setInnerHtml(loader, params.loaderHtml); 5645 applyCustomClass(loader, params, 'loader'); 5646 }; 5647 5648 function handleButtonsStyling(confirmButton, denyButton, cancelButton, params) { 5649 if (!params.buttonsStyling) { 5650 return removeClass([confirmButton, denyButton, cancelButton], swalClasses.styled); 5651 } 5652 5653 addClass([confirmButton, denyButton, cancelButton], swalClasses.styled); // Buttons background colors 5654 5655 if (params.confirmButtonColor) { 5656 confirmButton.style.backgroundColor = params.confirmButtonColor; 5657 } 5658 5659 if (params.denyButtonColor) { 5660 denyButton.style.backgroundColor = params.denyButtonColor; 5661 } 5662 5663 if (params.cancelButtonColor) { 5664 cancelButton.style.backgroundColor = params.cancelButtonColor; 5665 } 5666 } 5667 5668 function renderButton(button, buttonType, params) { 5669 toggle(button, params["show".concat(capitalizeFirstLetter(buttonType), "Button")], 'inline-block'); 5670 setInnerHtml(button, params["".concat(buttonType, "ButtonText")]); // Set caption text 5671 5672 button.setAttribute('aria-label', params["".concat(buttonType, "ButtonAriaLabel")]); // ARIA label 5673 // Add buttons custom classes 5674 5675 button.className = swalClasses[buttonType]; 5676 applyCustomClass(button, params, "".concat(buttonType, "Button")); 5677 addClass(button, params["".concat(buttonType, "ButtonClass")]); 5678 } 5679 5680 function handleBackdropParam(container, backdrop) { 5681 if (typeof backdrop === 'string') { 5682 container.style.background = backdrop; 5683 } else if (!backdrop) { 5684 addClass([document.documentElement, document.body], swalClasses['no-backdrop']); 5685 } 5686 } 5687 5688 function handlePositionParam(container, position) { 5689 if (position in swalClasses) { 5690 addClass(container, swalClasses[position]); 5691 } else { 5692 warn('The "position" parameter is not valid, defaulting to "center"'); 5693 addClass(container, swalClasses.center); 5694 } 5695 } 5696 5697 function handleGrowParam(container, grow) { 5698 if (grow && typeof grow === 'string') { 5699 var growClass = "grow-".concat(grow); 5700 5701 if (growClass in swalClasses) { 5702 addClass(container, swalClasses[growClass]); 5703 } 5704 } 5705 } 5706 5707 var renderContainer = function renderContainer(instance, params) { 5708 var container = getContainer(); 5709 5710 if (!container) { 5711 return; 5712 } 5713 5714 handleBackdropParam(container, params.backdrop); 5715 5716 if (!params.backdrop && params.allowOutsideClick) { 5717 warn('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'); 5718 } 5719 5720 handlePositionParam(container, params.position); 5721 handleGrowParam(container, params.grow); // Custom class 5722 5723 applyCustomClass(container, params, 'container'); // Set queue step attribute for getQueueStep() method 5724 5725 var queueStep = document.body.getAttribute('data-swal2-queue-step'); 5726 5727 if (queueStep) { 5728 container.setAttribute('data-queue-step', queueStep); 5729 document.body.removeAttribute('data-swal2-queue-step'); 5730 } 5731 }; 5732 5733 /** 5734 * This module containts `WeakMap`s for each effectively-"private property" that a `Swal` has. 5735 * For example, to set the private property "foo" of `this` to "bar", you can `privateProps.foo.set(this, 'bar')` 5736 * This is the approach that Babel will probably take to implement private methods/fields 5737 * https://github.com/tc39/proposal-private-methods 5738 * https://github.com/babel/babel/pull/7555 5739 * Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module* 5740 * then we can use that language feature. 5741 */ 5742 var privateProps = { 5743 promise: new WeakMap(), 5744 innerParams: new WeakMap(), 5745 domCache: new WeakMap() 5746 }; 5747 5748 var inputTypes = ['input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea']; 5749 var renderInput = function renderInput(instance, params) { 5750 var content = getContent(); 5751 var innerParams = privateProps.innerParams.get(instance); 5752 var rerender = !innerParams || params.input !== innerParams.input;
5753 inputTypes.forEach(function (inputType) { 5754 var inputClass = swalClasses[inputType]; 5755 var inputContainer = getChildByClass(content, inputClass); // set attributes 5756 5757 setAttributes(inputType, params.inputAttributes); // set class 5758 5759 inputContainer.className = inputClass; 5760 5761 if (rerender) { 5762 hide(inputContainer); 5763 } 5764 }); 5765 5766 if (params.input) { 5767 if (rerender) { 5768 showInput(params); 5769 } // set custom class 5770 5771 5772 setCustomClass(params); 5773 } 5774 }; 5775 5776 var showInput = function showInput(params) { 5777 if (!renderInputType[params.input]) { 5778 return error("Unexpected type of input! Expected \"text\", \"email\", \"password\", \"number\", \"tel\", \"select\", \"radio\", \"checkbox\", \"textarea\", \"file\" or \"url\", got \"".concat(params.input, "\"")); 5779 } 5780 5781 var inputContainer = getInputContainer(params.input); 5782 var input = renderInputType[params.input](inputContainer, params); 5783 show(input); // input autofocus 5784 5785 setTimeout(function () { 5786 focusInput(input); 5787 }); 5788 }; 5789 5790 var removeAttributes = function removeAttributes(input) { 5791 for (var i = 0; i < input.attributes.length; i++) { 5792 var attrName = input.attributes[i].name; 5793 5794 if (!(['type', 'value', 'style'].indexOf(attrName) !== -1)) { 5795 input.removeAttribute(attrName); 5796 } 5797 } 5798 }; 5799 5800 var setAttributes = function setAttributes(inputType, inputAttributes) { 5801 var input = getInput(getContent(), inputType); 5802 5803 if (!input) { 5804 return; 5805 } 5806 5807 removeAttributes(input); 5808 5809 for (var attr in inputAttributes) { 5810 // Do not set a placeholder for <input type="range"> 5811 // it'll crash Edge, #1298 5812 if (inputType === 'range' && attr === 'placeholder') { 5813 continue; 5814 } 5815 5816 input.setAttribute(attr, inputAttributes[attr]); 5817 } 5818 }; 5819 5820 var setCustomClass = function setCustomClass(params) { 5821 var inputContainer = getInputContainer(params.input); 5822 5823 if (params.customClass) { 5824 addClass(inputContainer, params.customClass.input); 5825 } 5826 }; 5827 5828 var setInputPlaceholder = function setInputPlaceholder(input, params) { 5829 if (!input.placeholder || params.inputPlaceholder) { 5830 input.placeholder = params.inputPlaceholder; 5831 } 5832 }; 5833 5834 var setInputLabel = function setInputLabel(input, prependTo, params) { 5835 if (params.inputLabel) { 5836 input.id = swalClasses.input; 5837 var label = document.createElement('label'); 5838 var labelClass = swalClasses['input-label']; 5839 label.setAttribute('for', input.id); 5840 label.className = labelClass; 5841 addClass(label, params.customClass.inputLabel); 5842 label.innerText = params.inputLabel; 5843 prependTo.insertAdjacentElement('beforebegin', label); 5844 } 5845 }; 5846 5847 var getInputContainer = function getInputContainer(inputType) { 5848 var inputClass = swalClasses[inputType] ? swalClasses[inputType] : swalClasses.input; 5849 return getChildByClass(getContent(), inputClass); 5850 }; 5851 5852 var renderInputType = {}; 5853 5854 renderInputType.text = renderInputType.email = renderInputType.password = renderInputType.number = renderInputType.tel = renderInputType.url = function (input, params) { 5855 if (typeof params.inputValue === 'string' || typeof params.inputValue === 'number') { 5856 input.value = params.inputValue; 5857 } else if (!isPromise(params.inputValue)) { 5858 warn("Unexpected type of inputValue! Expected \"string\", \"number\" or \"Promise\", got \"".concat(_typeof(params.inputValue), "\"")); 5859 } 5860 5861 setInputLabel(input, input, params); 5862 setInputPlaceholder(input, params); 5863 input.type = params.input; 5864 return input; 5865 }; 5866 5867 renderInputType.file = function (input, params) { 5868 setInputLabel(input, input, params); 5869 setInputPlaceholder(input, params); 5870 return input; 5871 }; 5872 5873 renderInputType.range = function (range, params) { 5874 var rangeInput = range.querySelector('input'); 5875 var rangeOutput = range.querySelector('output'); 5876 rangeInput.value = params.inputValue; 5877 rangeInput.type = params.input; 5878 rangeOutput.value = params.inputValue; 5879 setInputLabel(rangeInput, range, params); 5880 return range; 5881 }; 5882 5883 renderInputType.select = function (select, params) { 5884 select.textContent = ''; 5885 5886 if (params.inputPlaceholder) { 5887 var placeholder = document.createElement('option'); 5888 setInnerHtml(placeholder, params.inputPlaceholder); 5889 placeholder.value = ''; 5890 placeholder.disabled = true; 5891 placeholder.selected = true; 5892 select.appendChild(placeholder); 5893 } 5894 5895 setInputLabel(select, select, params); 5896 return select; 5897 }; 5898 5899 renderInputType.radio = function (radio) { 5900 radio.textContent = ''; 5901 return radio; 5902 }; 5903 5904 renderInputType.checkbox = function (checkboxContainer, params) { 5905 var checkbox = getInput(getContent(), 'checkbox'); 5906 checkbox.value = 1; 5907 checkbox.id = swalClasses.checkbox; 5908 checkbox.checked = Boolean(params.inputValue); 5909 var label = checkboxContainer.querySelector('span'); 5910 setInnerHtml(label, params.inputPlaceholder); 5911 return checkboxContainer; 5912 }; 5913 5914 renderInputType.textarea = function (textarea, params) { 5915 textarea.value = params.inputValue; 5916 setInputPlaceholder(textarea, params); 5917 setInputLabel(textarea, textarea, params); 5918 5919 var getPadding = function getPadding(el) { 5920 return parseInt(window.getComputedStyle(el).paddingLeft) + parseInt(window.getComputedStyle(el).paddingRight); 5921 }; 5922 5923 if ('MutationObserver' in window) { 5924 // #1699 5925 var initialPopupWidth = parseInt(window.getComputedStyle(getPopup()).width); 5926 5927 var outputsize = function outputsize() { 5928 var contentWidth = textarea.offsetWidth + getPadding(getPopup()) + getPadding(getContent()); 5929 5930 if (contentWidth > initialPopupWidth) { 5931 getPopup().style.width = "".concat(contentWidth, "px"); 5932 } else { 5933 getPopup().style.width = null; 5934 } 5935 }; 5936 5937 new MutationObserver(outputsize).observe(textarea, { 5938 attributes: true, 5939 attributeFilter: ['style'] 5940 }); 5941 } 5942 5943 return textarea; 5944 }; 5945 5946 var renderContent = function renderContent(instance, params) { 5947 var content = getContent().querySelector("#".concat(swalClasses.content)); // Content as HTML 5948 5949 if (params.html) { 5950 parseHtmlToContainer(params.html, content); 5951 show(content, 'block'); // Content as plain text 5952 } else if (params.text) { 5953 content.textContent = params.text; 5954 show(content, 'block'); // No content 5955 } else { 5956 hide(content); 5957 } 5958 5959 renderInput(instance, params); // Custom class 5960 5961 applyCustomClass(getContent(), params, 'content'); 5962 }; 5963 5964 var renderFooter = function renderFooter(instance, params) { 5965 var footer = getFooter(); 5966 toggle(footer, params.footer); 5967 5968 if (params.footer) { 5969 parseHtmlToContainer(params.footer, footer); 5970 } // Custom class 5971 5972 5973 applyCustomClass(footer, params, 'footer'); 5974 }; 5975 5976 var renderCloseButton = function renderCloseButton(instance, params) { 5977 var closeButton = getCloseButton(); 5978 setInnerHtml(closeButton, params.closeButtonHtml); // Custom class 5979 5980 applyCustomClass(closeButton, params, 'closeButton'); 5981 toggle(closeButton, params.showCloseButton); 5982 closeButton.setAttribute('aria-label', params.closeButtonAriaLabel); 5983 }; 5984 5985 var renderIcon = function renderIcon(instance, params) { 5986 var innerParams = privateProps.innerParams.get(instance); // if the given icon already rendered, apply the styling without re-rendering the icon 5987 5988 if (innerParams && params.icon === innerParams.icon && getIcon()) { 5989 applyStyles(getIcon(), params); 5990 return; 5991 } 5992 5993 hideAllIcons(); 5994 5995 if (!params.icon) { 5996 return; 5997 } 5998 5999 if (Object.keys(iconTypes).indexOf(params.icon) !== -1) { 6000 var icon = elementBySelector(".".concat(swalClasses.icon, ".").concat(iconTypes[params.icon])); 6001 show(icon); // Custom or default content 6002 6003 setContent(icon, params); 6004 applyStyles(icon, params); // Animate icon 6005 6006 addClass(icon, params.showClass.icon); 6007 } else { 6008 error("Unknown icon! Expected \"success\", \"error\", \"warning\", \"info\" or \"question\", got \"".concat(params.icon, "\"")); 6009 } 6010 }; 6011 6012 var hideAllIcons = function hideAllIcons() { 6013 var icons = getIcons(); 6014 6015 for (var i = 0; i < icons.length; i++) { 6016 hide(icons[i]); 6017 } 6018 }; 6019 6020 var applyStyles = function applyStyles(icon, params) { 6021 // Icon color 6022 setColor(icon, params); // Success icon background color 6023 6024 adjustSuccessIconBackgoundColor(); // Custom class 6025 6026 applyCustomClass(icon, params, 'icon'); 6027 }; // Adjust success icon background color to match the popup background color 6028 6029 6030 var adjustSuccessIconBackgoundColor = function adjustSuccessIconBackgoundColor() { 6031 var popup = getPopup();
6032 var popupBackgroundColor = window.getComputedStyle(popup).getPropertyValue('background-color'); 6033 var successIconParts = popup.querySelectorAll('[class^=swal2-success-circular-line], .swal2-success-fix'); 6034 6035 for (var i = 0; i < successIconParts.length; i++) { 6036 successIconParts[i].style.backgroundColor = popupBackgroundColor; 6037 } 6038 }; 6039 6040 var setContent = function setContent(icon, params) { 6041 icon.textContent = ''; 6042 6043 if (params.iconHtml) { 6044 setInnerHtml(icon, iconContent(params.iconHtml)); 6045 } else if (params.icon === 'success') { 6046 setInnerHtml(icon, "\n <div class=\"swal2-success-circular-line-left\"></div>\n <span class=\"swal2-success-line-tip\"></span> <span class=\"swal2-success-line-long\"></span>\n <div class=\"swal2-success-ring\"></div> <div class=\"swal2-success-fix\"></div>\n <div class=\"swal2-success-circular-line-right\"></div>\n "); 6047 } else if (params.icon === 'error') { 6048 setInnerHtml(icon, "\n <span class=\"swal2-x-mark\">\n <span class=\"swal2-x-mark-line-left\"></span>\n <span class=\"swal2-x-mark-line-right\"></span>\n </span>\n "); 6049 } else { 6050 var defaultIconHtml = { 6051 question: '?', 6052 warning: '!', 6053 info: 'i' 6054 }; 6055 setInnerHtml(icon, iconContent(defaultIconHtml[params.icon])); 6056 } 6057 }; 6058 6059 var setColor = function setColor(icon, params) { 6060 if (!params.iconColor) { 6061 return; 6062 } 6063 6064 icon.style.color = params.iconColor; 6065 icon.style.borderColor = params.iconColor; 6066 6067 for (var _i = 0, _arr = ['.swal2-success-line-tip', '.swal2-success-line-long', '.swal2-x-mark-line-left', '.swal2-x-mark-line-right']; _i < _arr.length; _i++) { 6068 var sel = _arr[_i]; 6069 setStyle(icon, sel, 'backgroundColor', params.iconColor); 6070 } 6071 6072 setStyle(icon, '.swal2-success-ring', 'borderColor', params.iconColor); 6073 }; 6074 6075 var iconContent = function iconContent(content) { 6076 return "<div class=\"".concat(swalClasses['icon-content'], "\">").concat(content, "</div>"); 6077 }; 6078 6079 var renderImage = function renderImage(instance, params) { 6080 var image = getImage(); 6081 6082 if (!params.imageUrl) { 6083 return hide(image); 6084 } 6085 6086 show(image, ''); // Src, alt 6087 6088 image.setAttribute('src', params.imageUrl); 6089 image.setAttribute('alt', params.imageAlt); // Width, height 6090 6091 applyNumericalStyle(image, 'width', params.imageWidth); 6092 applyNumericalStyle(image, 'height', params.imageHeight); // Class 6093 6094 image.className = swalClasses.image; 6095 applyCustomClass(image, params, 'image'); 6096 }; 6097 6098 var currentSteps = []; 6099 /* 6100 * Global function for chaining sweetAlert popups 6101 */ 6102 6103 var queue = function queue(steps) { 6104 var Swal = this; 6105 currentSteps = steps; 6106 6107 var resetAndResolve = function resetAndResolve(resolve, value) { 6108 currentSteps = []; 6109 resolve(value); 6110 }; 6111 6112 var queueResult = []; 6113 return new Promise(function (resolve) { 6114 (function step(i, callback) { 6115 if (i < currentSteps.length) { 6116 document.body.setAttribute('data-swal2-queue-step', i); 6117 Swal.fire(currentSteps[i]).then(function (result) { 6118 if (typeof result.value !== 'undefined') { 6119 queueResult.push(result.value); 6120 step(i + 1, callback); 6121 } else { 6122 resetAndResolve(resolve, { 6123 dismiss: result.dismiss 6124 }); 6125 } 6126 }); 6127 } else { 6128 resetAndResolve(resolve, { 6129 value: queueResult 6130 }); 6131 } 6132 })(0); 6133 }); 6134 }; 6135 /* 6136 * Global function for getting the index of current popup in queue 6137 */ 6138 6139 var getQueueStep = function getQueueStep() { 6140 return getContainer() && getContainer().getAttribute('data-queue-step'); 6141 }; 6142 /* 6143 * Global function for inserting a popup to the queue 6144 */ 6145 6146 var insertQueueStep = function insertQueueStep(step, index) { 6147 if (index && index < currentSteps.length) { 6148 return currentSteps.splice(index, 0, step); 6149 } 6150 6151 return currentSteps.push(step); 6152 }; 6153 /* 6154 * Global function for deleting a popup from the queue 6155 */ 6156 6157 var deleteQueueStep = function deleteQueueStep(index) { 6158 if (typeof currentSteps[index] !== 'undefined') { 6159 currentSteps.splice(index, 1); 6160 } 6161 }; 6162 6163 var createStepElement = function createStepElement(step) { 6164 var stepEl = document.createElement('li'); 6165 addClass(stepEl, swalClasses['progress-step']); 6166 setInnerHtml(stepEl, step); 6167 return stepEl; 6168 }; 6169 6170 var createLineElement = function createLineElement(params) { 6171 var lineEl = document.createElement('li'); 6172 addClass(lineEl, swalClasses['progress-step-line']); 6173 6174 if (params.progressStepsDistance) { 6175 lineEl.style.width = params.progressStepsDistance; 6176 } 6177 6178 return lineEl; 6179 }; 6180 6181 var renderProgressSteps = function renderProgressSteps(instance, params) { 6182 var progressStepsContainer = getProgressSteps(); 6183 6184 if (!params.progressSteps || params.progressSteps.length === 0) { 6185 return hide(progressStepsContainer); 6186 } 6187 6188 show(progressStepsContainer); 6189 progressStepsContainer.textContent = ''; 6190 var currentProgressStep = parseInt(params.currentProgressStep === undefined ? getQueueStep() : params.currentProgressStep); 6191 6192 if (currentProgressStep >= params.progressSteps.length) { 6193 warn('Invalid currentProgressStep parameter, it should be less than progressSteps.length ' + '(currentProgressStep like JS arrays starts from 0)'); 6194 } 6195 6196 params.progressSteps.forEach(function (step, index) { 6197 var stepEl = createStepElement(step); 6198 progressStepsContainer.appendChild(stepEl); 6199 6200 if (index === currentProgressStep) { 6201 addClass(stepEl, swalClasses['active-progress-step']); 6202 } 6203 6204 if (index !== params.progressSteps.length - 1) { 6205 var lineEl = createLineElement(params); 6206 progressStepsContainer.appendChild(lineEl); 6207 } 6208 }); 6209 }; 6210 6211 var renderTitle = function renderTitle(instance, params) { 6212 var title = getTitle(); 6213 toggle(title, params.title || params.titleText); 6214 6215 if (params.title) { 6216 parseHtmlToContainer(params.title, title); 6217 } 6218 6219 if (params.titleText) { 6220 title.innerText = params.titleText; 6221 } // Custom class 6222 6223 6224 applyCustomClass(title, params, 'title'); 6225 }; 6226 6227 var renderHeader = function renderHeader(instance, params) { 6228 var header = getHeader(); // Custom class 6229 6230 applyCustomClass(header, params, 'header'); // Progress steps 6231 6232 renderProgressSteps(instance, params); // Icon 6233 6234 renderIcon(instance, params); // Image 6235 6236 renderImage(instance, params); // Title 6237 6238 renderTitle(instance, params); // Close button 6239 6240 renderCloseButton(instance, params); 6241 }; 6242 6243 var renderPopup = function renderPopup(instance, params) { 6244 var popup = getPopup(); // Width 6245 6246 applyNumericalStyle(popup, 'width', params.width); // Padding 6247 6248 applyNumericalStyle(popup, 'padding', params.padding);
6248 // Background 6249 6250 if (params.background) { 6251 popup.style.background = params.background; 6252 } // Classes 6253 6254 6255 addClasses(popup, params); 6256 }; 6257 6258 var addClasses = function addClasses(popup, params) { 6259 // Default Class + showClass when updating Swal.update({}) 6260 popup.className = "".concat(swalClasses.popup, " ").concat(isVisible(popup) ? params.showClass.popup : ''); 6261 6262 if (params.toast) { 6263 addClass([document.documentElement, document.body], swalClasses['toast-shown']); 6264 addClass(popup, swalClasses.toast); 6265 } else { 6266 addClass(popup, swalClasses.modal); 6267 } // Custom class 6268 6269 6270 applyCustomClass(popup, params, 'popup'); 6271 6272 if (typeof params.customClass === 'string') { 6273 addClass(popup, params.customClass); 6274 } // Icon class (#1842) 6275 6276 6277 if (params.icon) { 6278 addClass(popup, swalClasses["icon-".concat(params.icon)]); 6279 } 6280 }; 6281 6282 var render = function render(instance, params) { 6283 renderPopup(instance, params); 6284 renderContainer(instance, params); 6285 renderHeader(instance, params); 6286 renderContent(instance, params); 6287 renderActions(instance, params); 6288 renderFooter(instance, params); 6289 6290 if (typeof params.didRender === 'function') { 6291 params.didRender(getPopup()); 6292 } else if (typeof params.onRender === 'function') { 6293 params.onRender(getPopup()); // @deprecated 6294 } 6295 }; 6296 6297 /* 6298 * Global function to determine if SweetAlert2 popup is shown 6299 */ 6300 6301 var isVisible$1 = function isVisible$$1() { 6302 return isVisible(getPopup()); 6303 }; 6304 /* 6305 * Global function to click 'Confirm' button 6306 */ 6307 6308 var clickConfirm = function clickConfirm() { 6309 return getConfirmButton() && getConfirmButton().click(); 6310 }; 6311 /* 6312 * Global function to click 'Deny' button 6313 */ 6314 6315 var clickDeny = function clickDeny() { 6316 return getDenyButton() && getDenyButton().click(); 6317 }; 6318 /* 6319 * Global function to click 'Cancel' button 6320 */ 6321 6322 var clickCancel = function clickCancel() { 6323 return getCancelButton() && getCancelButton().click(); 6324 }; 6325 6326 function fire() { 6327 var Swal = this; 6328 6329 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 6330 args[_key] = arguments[_key]; 6331 } 6332 6333 return _construct(Swal, args); 6334 } 6335 6336 /** 6337 * Returns an extended version of `Swal` containing `params` as defaults. 6338 * Useful for reusing Swal configuration. 6339 * 6340 * For example: 6341 * 6342 * Before: 6343 * const textPromptOptions = { input: 'text', showCancelButton: true } 6344 * const {value: firstName} = await Swal.fire({ ...textPromptOptions, title: 'What is your first name?' }) 6345 * const {value: lastName} = await Swal.fire({ ...textPromptOptions, title: 'What is your last name?' }) 6346 * 6347 * After: 6348 * const TextPrompt = Swal.mixin({ input: 'text', showCancelButton: true }) 6349 * const {value: firstName} = await TextPrompt('What is your first name?') 6350 * const {value: lastName} = await TextPrompt('What is your last name?') 6351 * 6352 * @param mixinParams 6353 */ 6354 function mixin(mixinParams) { 6355 var MixinSwal = /*#__PURE__*/function (_this) { 6356 _inherits(MixinSwal, _this); 6357 6358 var _super = _createSuper(MixinSwal); 6359 6360 function MixinSwal() { 6361 _classCallCheck(this, MixinSwal); 6362 6363 return _super.apply(this, arguments); 6364 } 6365 6366 _createClass(MixinSwal, [{ 6367 key: "_main", 6368 value: function _main(params, prevMixinParams) { 6369 return _get(_getPrototypeOf(MixinSwal.prototype), "_main", this).call(this, params, _extends({}, prevMixinParams, mixinParams)); 6370 } 6371 }]); 6372 6373 return MixinSwal; 6374 }(this); 6375 6376 return MixinSwal; 6377 } 6378 6379 /** 6380 * Shows loader (spinner), this is useful with AJAX requests. 6381 * By default the loader be shown instead of the "Confirm" button. 6382 */ 6383 6384 var showLoading = function showLoading(buttonToReplace) { 6385 var popup = getPopup(); 6386 6387 if (!popup) { 6388 Swal.fire(); 6389 } 6390 6391 popup = getPopup(); 6392 var actions = getActions(); 6393 var loader = getLoader(); 6394 6395 if (!buttonToReplace && isVisible(getConfirmButton())) { 6396 buttonToReplace = getConfirmButton(); 6397 } 6398 6399 show(actions); 6400 6401 if (buttonToReplace) { 6402 hide(buttonToReplace); 6403 loader.setAttribute('data-button-to-replace', buttonToReplace.className); 6404 } 6405 6406 loader.parentNode.insertBefore(loader, buttonToReplace); 6407 addClass([popup, actions], swalClasses.loading); 6408 show(loader); 6409 popup.setAttribute('data-loading', true); 6410 popup.setAttribute('aria-busy', true); 6411 popup.focus(); 6412 }; 6413 6414 var RESTORE_FOCUS_TIMEOUT = 100; 6415 6416 var globalState = {}; 6417 6418 var focusPreviousActiveElement = function focusPreviousActiveElement() { 6419 if (globalState.previousActiveElement && globalState.previousActiveElement.focus) { 6420 globalState.previousActiveElement.focus(); 6421 globalState.previousActiveElement = null; 6422 } else if (document.body) { 6423 document.body.focus(); 6424 } 6425 }; // Restore previous active (focused) element 6426 6427 6428 var restoreActiveElement = function restoreActiveElement() { 6429 return new Promise(function (resolve) { 6430 var x = window.scrollX; 6431 var y = window.scrollY; 6432 globalState.restoreFocusTimeout = setTimeout(function () { 6433 focusPreviousActiveElement(); 6434 resolve(); 6435 }, RESTORE_FOCUS_TIMEOUT); // issues/900 6436 6437 /* istanbul ignore if */ 6438 6439 if (typeof x !== 'undefined' && typeof y !== 'undefined') { 6440 // IE doesn't have scrollX/scrollY support 6441 window.scrollTo(x, y); 6442 } 6443 }); 6444 }; 6445 6446 /** 6447 * If `timer` parameter is set, returns number of milliseconds of timer remained. 6448 * Otherwise, returns undefined. 6449 */ 6450 6451 var getTimerLeft = function getTimerLeft() {
6452 return globalState.timeout && globalState.timeout.getTimerLeft(); 6453 }; 6454 /** 6455 * Stop timer. Returns number of milliseconds of timer remained. 6456 * If `timer` parameter isn't set, returns undefined. 6457 */ 6458 6459 var stopTimer = function stopTimer() { 6460 if (globalState.timeout) { 6461 stopTimerProgressBar(); 6462 return globalState.timeout.stop(); 6463 } 6464 }; 6465 /** 6466 * Resume timer. Returns number of milliseconds of timer remained. 6467 * If `timer` parameter isn't set, returns undefined. 6468 */ 6469 6470 var resumeTimer = function resumeTimer() { 6471 if (globalState.timeout) { 6472 var remaining = globalState.timeout.start(); 6473 animateTimerProgressBar(remaining); 6474 return remaining; 6475 } 6476 }; 6477 /** 6478 * Resume timer. Returns number of milliseconds of timer remained. 6479 * If `timer` parameter isn't set, returns undefined. 6480 */ 6481 6482 var toggleTimer = function toggleTimer() { 6483 var timer = globalState.timeout; 6484 return timer && (timer.running ? stopTimer() : resumeTimer()); 6485 }; 6486 /** 6487 * Increase timer. Returns number of milliseconds of an updated timer. 6488 * If `timer` parameter isn't set, returns undefined. 6489 */ 6490 6491 var increaseTimer = function increaseTimer(n) { 6492 if (globalState.timeout) { 6493 var remaining = globalState.timeout.increase(n); 6494 animateTimerProgressBar(remaining, true); 6495 return remaining; 6496 } 6497 }; 6498 /** 6499 * Check if timer is running. Returns true if timer is running 6500 * or false if timer is paused or stopped. 6501 * If `timer` parameter isn't set, returns undefined 6502 */ 6503 6504 var isTimerRunning = function isTimerRunning() { 6505 return globalState.timeout && globalState.timeout.isRunning(); 6506 }; 6507 6508 var bodyClickListenerAdded = false; 6509 var clickHandlers = {}; 6510 function bindClickHandler() { 6511 var attr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'data-swal-template'; 6512 clickHandlers[attr] = this; 6513 6514 if (!bodyClickListenerAdded) { 6515 document.body.addEventListener('click', bodyClickListener); 6516 bodyClickListenerAdded = true; 6517 } 6518 } 6519 6520 var bodyClickListener = function bodyClickListener(event) { 6521 // 1. using .parentNode instead of event.path because of better support by old browsers https://stackoverflow.com/a/39245638 6522 // 2. using .parentNode instead of .parentElement because of IE11 + SVG https://stackoverflow.com/a/36270354 6523 for (var el = event.target; el && el !== document; el = el.parentNode) { 6524 for (var attr in clickHandlers) { 6525 var template = el.getAttribute(attr); 6526 6527 if (template) { 6528 clickHandlers[attr].fire({ 6529 template: template 6530 }); 6531 return; 6532 } 6533 } 6534 } 6535 }; 6536 6537 var defaultParams = { 6538 title: '', 6539 titleText: '', 6540 text: '', 6541 html: '', 6542 footer: '', 6543 icon: undefined, 6544 iconColor: undefined, 6545 iconHtml: undefined, 6546 template: undefined, 6547 toast: false, 6548 animation: true, 6549 showClass: { 6550 popup: 'swal2-show', 6551 backdrop: 'swal2-backdrop-show', 6552 icon: 'swal2-icon-show' 6553 }, 6554 hideClass: { 6555 popup: 'swal2-hide', 6556 backdrop: 'swal2-backdrop-hide', 6557 icon: 'swal2-icon-hide' 6558 }, 6559 customClass: {}, 6560 target: 'body', 6561 backdrop: true, 6562 heightAuto: true, 6563 allowOutsideClick: true, 6564 allowEscapeKey: true, 6565 allowEnterKey: true, 6566 stopKeydownPropagation: true, 6567 keydownListenerCapture: false, 6568 showConfirmButton: true, 6569 showDenyButton: false,
6570 showCancelButton: false, 6571 preConfirm: undefined, 6572 preDeny: undefined, 6573 confirmButtonText: 'OK', 6574 confirmButtonAriaLabel: '', 6575 confirmButtonColor: undefined, 6576 denyButtonText: 'No', 6577 denyButtonAriaLabel: '', 6578 denyButtonColor: undefined, 6579 cancelButtonText: 'Cancel', 6580 cancelButtonAriaLabel: '', 6581 cancelButtonColor: undefined, 6582 buttonsStyling: true, 6583 reverseButtons: false, 6584 focusConfirm: true, 6585 focusDeny: false, 6586 focusCancel: false, 6587 showCloseButton: false, 6588 closeButtonHtml: '×', 6589 closeButtonAriaLabel: 'Close this dialog', 6590 loaderHtml: '', 6591 showLoaderOnConfirm: false, 6592 showLoaderOnDeny: false, 6593 imageUrl: undefined, 6594 imageWidth: undefined, 6595 imageHeight: undefined, 6596 imageAlt: '', 6597 timer: undefined, 6598 timerProgressBar: false, 6599 width: undefined, 6600 padding: undefined, 6601 background: undefined, 6602 input: undefined, 6603 inputPlaceholder: '', 6604 inputLabel: '', 6605 inputValue: '', 6606 inputOptions: {}, 6607 inputAutoTrim: true, 6608 inputAttributes: {}, 6609 inputValidator: undefined, 6610 returnInputValueOnDeny: false, 6611 validationMessage: undefined, 6612 grow: false, 6613 position: 'center', 6614 progressSteps: [], 6615 currentProgressStep: undefined, 6616 progressStepsDistance: undefined, 6617 onBeforeOpen: undefined, 6618 onOpen: undefined, 6619 willOpen: undefined, 6620 didOpen: undefined, 6621 onRender: undefined, 6622 didRender: undefined, 6623 onClose: undefined, 6624 onAfterClose: undefined, 6625 willClose: undefined, 6626 didClose: undefined, 6627 onDestroy: undefined, 6628 didDestroy: undefined, 6629 scrollbarPadding: true 6630 }; 6631 var updatableParams = ['allowEscapeKey', 'allowOutsideClick', 'background', 'buttonsStyling', 'cancelButtonAriaLabel', 'cancelButtonColor', 'cancelButtonText', 'closeButtonAriaLabel', 'closeButtonHtml', 'confirmButtonAriaLabel', 'confirmButtonColor', 'confirmButtonText', 'currentProgressStep', 'customClass', 'denyButtonAriaLabel', 'denyButtonColor', 'denyButtonText', 'didClose', 'didDestroy', 'footer', 'hideClass', 'html', 'icon', 'iconColor', 'imageAlt', 'imageHeight', 'imageUrl', 'imageWidth', 'onAfterClose', 'onClose', 'onDestroy', 'progressSteps', 'reverseButtons', 'showCancelButton', 'showCloseButton', 'showConfirmButton', 'showDenyButton', 'text', 'title', 'titleText', 'willClose']; 6632 var deprecatedParams = { 6633 animation: 'showClass" and "hideClass', 6634 onBeforeOpen: 'willOpen', 6635 onOpen: 'didOpen', 6636 onRender: 'didRender', 6637 onClose: 'willClose', 6638 onAfterClose: 'didClose', 6639 onDestroy: 'didDestroy' 6640 }; 6641 var toastIncompatibleParams = ['allowOutsideClick', 'allowEnterKey', 'backdrop', 'focusConfirm', 'focusDeny', 'focusCancel', 'he
6641ightAuto', 'keydownListenerCapture']; 6642 /** 6643 * Is valid parameter 6644 * @param {String} paramName 6645 */ 6646 6647 var isValidParameter = function isValidParameter(paramName) { 6648 return Object.prototype.hasOwnProperty.call(defaultParams, paramName); 6649 }; 6650 /** 6651 * Is valid parameter for Swal.update() method 6652 * @param {String} paramName 6653 */ 6654 6655 var isUpdatableParameter = function isUpdatableParameter(paramName) { 6656 return updatableParams.indexOf(paramName) !== -1; 6657 }; 6658 /** 6659 * Is deprecated parameter 6660 * @param {String} paramName 6661 */ 6662 6663 var isDeprecatedParameter = function isDeprecatedParameter(paramName) { 6664 return deprecatedParams[paramName]; 6665 }; 6666 6667 var checkIfParamIsValid = function checkIfParamIsValid(param) { 6668 if (!isValidParameter(param)) { 6669 warn("Unknown parameter \"".concat(param, "\"")); 6670 } 6671 }; 6672 6673 var checkIfToastParamIsValid = function checkIfToastParamIsValid(param) { 6674 if (toastIncompatibleParams.indexOf(param) !== -1) { 6675 warn("The parameter \"".concat(param, "\" is incompatible with toasts")); 6676 } 6677 }; 6678 6679 var checkIfParamIsDeprecated = function checkIfParamIsDeprecated(param) { 6680 if (isDeprecatedParameter(param)) { 6681 warnAboutDeprecation(param, isDeprecatedParameter(param)); 6682 } 6683 }; 6684 /** 6685 * Show relevant warnings for given params 6686 * 6687 * @param params 6688 */ 6689 6690 6691 var showWarningsForParams = function showWarningsForParams(params) { 6692 for (var param in params) { 6693 checkIfParamIsValid(param); 6694 6695 if (params.toast) { 6696 checkIfToastParamIsValid(param); 6697 } 6698 6699 checkIfParamIsDeprecated(param); 6700 } 6701 }; 6702 6703 6704 6705 var staticMethods = /*#__PURE__*/Object.freeze({ 6706 isValidParameter: isValidParameter, 6707 isUpdatableParameter: isUpdatableParameter, 6708 isDeprecatedParameter: isDeprecatedParameter, 6709 argsToParams: argsToParams, 6710 isVisible: isVisible$1, 6711 clickConfirm: clickConfirm, 6712 clickDeny: clickDeny, 6713 clickCancel: clickCancel, 6714 getContainer: getContainer, 6715 getPopup: getPopup, 6716 getTitle: getTitle, 6717 getContent: getContent, 6718 getHtmlContainer: getHtmlContainer, 6719 getImage: getImage, 6720 getIcon: getIcon, 6721 getIcons: getIcons, 6722 getInputLabel: getInputLabel, 6723 getCloseButton: getCloseButton, 6724 getActions: getActions, 6725 getConfirmButton: getConfirmButton,
6726 getDenyButton: getDenyButton, 6727 getCancelButton: getCancelButton, 6728 getLoader: getLoader, 6729 getHeader: getHeader, 6730 getFooter: getFooter, 6731 getTimerProgressBar: getTimerProgressBar, 6732 getFocusableElements: getFocusableElements, 6733 getValidationMessage: getValidationMessage, 6734 isLoading: isLoading, 6735 fire: fire, 6736 mixin: mixin, 6737 queue: queue, 6738 getQueueStep: getQueueStep, 6739 insertQueueStep: insertQueueStep, 6740 deleteQueueStep: deleteQueueStep, 6741 showLoading: showLoading, 6742 enableLoading: showLoading, 6743 getTimerLeft: getTimerLeft, 6744 stopTimer: stopTimer, 6745 resumeTimer: resumeTimer, 6746 toggleTimer: toggleTimer, 6747 increaseTimer: increaseTimer, 6748 isTimerRunning: isTimerRunning, 6749 bindClickHandler: bindClickHandler 6750 }); 6751 6752 /** 6753 * Hides loader and shows back the button which was hidden by .showLoading() 6754 */ 6755 6756 function hideLoading() { 6757 // do nothing if popup is closed 6758 var innerParams = privateProps.innerParams.get(this); 6759 6760 if (!innerParams) { 6761 return; 6762 } 6763 6764 var domCache = privateProps.domCache.get(this); 6765 hide(domCache.loader); 6766 var buttonToReplace = domCache.popup.getElementsByClassName(domCache.loader.getAttribute('data-button-to-replace')); 6767 6768 if (buttonToReplace.length) { 6769 show(buttonToReplace[0], 'inline-block'); 6770 } else if (allButtonsAreHidden()) { 6771 hide(domCache.actions); 6772 } 6773 6774 removeClass([domCache.popup, domCache.actions], swalClasses.loading); 6775 domCache.popup.removeAttribute('aria-busy'); 6776 domCache.popup.removeAttribute('data-loading'); 6777 domCache.confirmButton.disabled = false; 6778 domCache.denyButton.disabled = false; 6779 domCache.cancelButton.disabled = false; 6780 } 6781 6782 function getInput$1(instance) { 6783 var innerParams = privateProps.innerParams.get(instance || this); 6784 var domCache = privateProps.domCache.get(instance || this); 6785 6786 if (!domCache) { 6787 return null; 6788 } 6789 6790 return getInput(domCache.content, innerParams.input); 6791 } 6792 6793 var fixScrollbar = function fixScrollbar() { 6794 // for queues, do not do this more than once 6795 if (states.previousBodyPadding !== null) { 6796 return; 6797 } // if the body has overflow 6798 6799 6800 if (document.body.scrollHeight > window.innerHeight) { 6801 // add padding so the content doesn't shift after removal of scrollbar 6802 states.previousBodyPadding = parseInt(window.getComputedStyle(document.body).getPropertyValue('padding-right')); 6803 document.body.style.paddingRight = "".concat(states.previousBodyPadding + measureScrollbar(), "px"); 6804 } 6805 }; 6806 var undoScrollbar = function undoScrollbar() { 6807 if (states.previousBodyPadding !== null) { 6808 document.body.style.paddingRight = "".concat(states.previousBodyPadding, "px"); 6809 states.previousBodyPadding = null; 6810 } 6811 }; 6812 6813 /* istanbul ignore file */ 6814 6815 var iOSfix = function iOSfix() { 6816 var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream || navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1; 6817 6818 if (iOS && !hasClass(document.body, swalClasses.iosfix)) { 6819 var offset = document.body.scrollTop; 6820 document.body.style.top = "".concat(offset * -1, "px"); 6821 addClass(document.body, swalClasses.iosfix); 6822 lockBodyScroll(); 6823 addBottomPaddingForTallPopups(); // #1948 6824 } 6825 }; 6826 6827 var addBottomPaddingForTallPopups = function addBottomPaddingForTallPopups() { 6828 var safari = !navigator.userAgent.match(/(CriOS|FxiOS|EdgiOS|YaBrowser|UCBrowser)/i); 6829 6830 if (safari) { 6831 var bottomPanelHeight = 44; 6832 6833 if (getPopup().scrollHeight > window.innerHeight - bottomPanelHeight) { 6834 getContainer().style.paddingBottom = "".concat(bottomPanelHeight, "px"); 6835 } 6836 } 6837 }; 6838 6839 var lockBodyScroll = function lockBodyScroll() { 6840 // #1246 6841 var container = getContainer(); 6842 var preventTouchMove; 6843 6844 container.ontouchstart = function (e) { 6845 preventTouchMove = shouldPreventTouchMove(e); 6846 }; 6847 6848 container.ontouchmove = function (e) { 6849 if (preventTouchMove) { 6850 e.preventDefault(); 6851 e.stopPropagation(); 6852 } 6853 }; 6854 }; 6855 6856 var shouldPreventTouchMove = function shouldPreventTouchMove(event) { 6857 var target = event.target; 6858 var container = getContainer(); 6859 6860 if (isStylys(event) || isZoom(event)) { 6861 return false;
6862 } 6863 6864 if (target === container) { 6865 return true; 6866 } 6867 6868 if (!isScrollable(container) && target.tagName !== 'INPUT' && // #1603 6869 !(isScrollable(getContent()) && // #1944 6870 getContent().contains(target))) { 6871 return true; 6872 } 6873 6874 return false; 6875 }; 6876 6877 var isStylys = function isStylys(event) { 6878 // #1786 6879 return event.touches && event.touches.length && event.touches[0].touchType === 'stylus'; 6880 }; 6881 6882 var isZoom = function isZoom(event) { 6883 // #1891 6884 return event.touches && event.touches.length > 1; 6885 }; 6886 6887 var undoIOSfix = function undoIOSfix() { 6888 if (hasClass(document.body, swalClasses.iosfix)) { 6889 var offset = parseInt(document.body.style.top, 10); 6890 removeClass(document.body, swalClasses.iosfix); 6891 document.body.style.top = ''; 6892 document.body.scrollTop = offset * -1; 6893 } 6894 }; 6895 6896 /* istanbul ignore file */ 6897 6898 var isIE11 = function isIE11() { 6899 return !!window.MSInputMethodContext && !!document.documentMode; 6900 }; // Fix IE11 centering sweetalert2/issues/933 6901 6902 6903 var fixVerticalPositionIE = function fixVerticalPositionIE() { 6904 var container = getContainer(); 6905 var popup = getPopup(); 6906 container.style.removeProperty('align-items'); 6907 6908 if (popup.offsetTop < 0) { 6909 container.style.alignItems = 'flex-start'; 6910 } 6911 }; 6912 6913 var IEfix = function IEfix() { 6914 if (typeof window !== 'undefined' && isIE11()) { 6915 fixVerticalPositionIE(); 6916 window.addEventListener('resize', fixVerticalPositionIE); 6917 } 6918 }; 6919 var undoIEfix = function undoIEfix() { 6920 if (typeof window !== 'undefined' && isIE11()) { 6921 window.removeEventListener('resize', fixVerticalPositionIE); 6922 } 6923 }; 6924 6925 // Adding aria-hidden="true" to elements outside of the active modal dialog ensures that 6926 // elements not within the active modal dialog will not be surfaced if a user opens a screen 6927 // reader’s list of elements (headings, form controls, landmarks, etc.) in the document. 6928 6929 var setAriaHidden = function setAriaHidden() { 6930 var bodyChildren = toArray(document.body.children); 6931 bodyChildren.forEach(function (el) { 6932 if (el === getContainer() || contains(el, getContainer())) { 6933 return; 6934 } 6935 6936 if (el.hasAttribute('aria-hidden')) { 6937 el.setAttribute('data-previous-aria-hidden', el.getAttribute('aria-hidden')); 6938 } 6939 6940 el.setAttribute('aria-hidden', 'true'); 6941 }); 6942 }; 6943 var unsetAriaHidden = function unsetAriaHidden() { 6944 var bodyChildren = toArray(document.body.children); 6945 bodyChildren.forEach(function (el) { 6946 if (el.hasAttribute('data-previous-aria-hidden')) { 6947 el.setAttribute('aria-hidden', el.getAttribute('data-previous-aria-hidden')); 6948 el.removeAttribute('data-previous-aria-hidden'); 6949 } else { 6950 el.removeAttribute('aria-hidden'); 6951 } 6952 }); 6953 }; 6954 6955 /** 6956 * This module containts `WeakMap`s for each effectively-"private property" that a `Swal` has. 6957 * For example, to set the private property "foo" of `this` to "bar", you can `privateProps.foo.set(this, 'bar')` 6958 * This is the approach that Babel will probably take to implement private methods/fields 6959 * https://github.com/tc39/proposal-private-methods 6960 * https://github.com/babel/babel/pull/7555 6961 * Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module* 6962 * then we can use that language feature. 6963 */ 6964 var privateMethods = { 6965 swalPromiseResolve: new WeakMap() 6966 }; 6967 6968 /* 6969 * Instance method to close sweetAlert 6970 */ 6971 6972 function removePopupAndResetState(instance, container, isToast$$1, didClose) { 6973 if (isToast$$1) { 6974 triggerDidCloseAndDispose(instance, didClose); 6975 } else { 6976 restoreActiveElement().then(function () { 6977 return triggerDidCloseAndDispose(instance, didClose); 6978 }); 6979 globalState.keydownTarget.removeEventListener('keydown', globalState.keydownHandler, { 6980 capture: globalState.keydownListenerCapture 6981 }); 6982 globalState.keydownHandlerAdded = false; 6983 } 6984 6985 if (container.parentNode && !document.body.getAttribute('data-swal2-queue-step')) { 6986 container.parentNode.removeChild(container); 6987 } 6988 6989 if (isModal()) { 6990 undoScrollbar(); 6991 undoIOSfix(); 6992 undoIEfix(); 6993 unsetAriaHidden(); 6994 } 6995 6996 removeBodyClasses(); 6997 } 6998 6999 function removeBodyClasses() { 7000 removeClass([document.documentElement, document.body], [swalClasses.shown, swalClasses['he
7000ight-auto'], swalClasses['no-backdrop'], swalClasses['toast-shown'], swalClasses['toast-column']]); 7001 } 7002 7003 function close(resolveValue) { 7004 var popup = getPopup(); 7005 7006 if (!popup) { 7007 return; 7008 } 7009 7010 resolveValue = prepareResolveValue(resolveValue); 7011 var innerParams = privateProps.innerParams.get(this); 7012 7013 if (!innerParams || hasClass(popup, innerParams.hideClass.popup)) { 7014 return; 7015 } 7016 7017 var swalPromiseResolve = privateMethods.swalPromiseResolve.get(this); 7018 removeClass(popup, innerParams.showClass.popup); 7019 addClass(popup, innerParams.hideClass.popup); 7020 var backdrop = getContainer(); 7021 removeClass(backdrop, innerParams.showClass.backdrop); 7022 addClass(backdrop, innerParams.hideClass.backdrop); 7023 handlePopupAnimation(this, popup, innerParams); // Resolve Swal promise 7024 7025 swalPromiseResolve(resolveValue); 7026 } 7027 7028 var prepareResolveValue = function prepareResolveValue(resolveValue) { 7029 // When user calls Swal.close() 7030 if (typeof resolveValue === 'undefined') { 7031 return { 7032 isConfirmed: false, 7033 isDenied: false, 7034 isDismissed: true 7035 }; 7036 } 7037 7038 return _extends({ 7039 isConfirmed: false, 7040 isDenied: false, 7041 isDismissed: false 7042 }, resolveValue); 7043 }; 7044 7045 var handlePopupAnimation = function handlePopupAnimation(instance, popup, innerParams) { 7046 var container = getContainer(); // If animation is supported, animate 7047 7048 var animationIsSupported = animationEndEvent && hasCssAnimation(popup); 7049 var onClose = innerParams.onClose, 7050 onAfterClose = innerParams.onAfterClose, 7051 willClose = innerParams.willClose, 7052 didClose = innerParams.didClose; 7053 runDidClose(popup, willClose, onClose); 7054 7055 if (animationIsSupported) { 7056 animatePopup(instance, popup, container, didClose || onAfterClose); 7057 } else { 7058 // Otherwise, remove immediately 7059 removePopupAndResetState(instance, container, isToast(), didClose || onAfterClose); 7060 } 7061 }; 7062 7063 var runDidClose = function runDidClose(popup, willClose, onClose) { 7064 if (willClose !== null && typeof willClose === 'function') { 7065 willClose(popup); 7066 } else if (onClose !== null && typeof onClose === 'function') { 7067 onClose(popup); // @deprecated 7068 } 7069 }; 7070 7071 var animatePopup = function animatePopup(instance, popup, container, didClose) { 7072 globalState.swalCloseEventFinishedCallback = removePopupAndResetState.bind(null, instance, container, isToast(), didClose); 7073 popup.addEventListener(animationEndEvent, function (e) { 7074 if (e.target === popup) { 7075 globalState.swalCloseEventFinishedCallback(); 7076 delete globalState.swalCloseEventFinishedCallback; 7077 } 7078 }); 7079 }; 7080 7081 var triggerDidCloseAndDispose = function triggerDidCloseAndDispose(instance, didClose) { 7082 setTimeout(function () { 7083 if (typeof didClose === 'function') { 7084 didClose(); 7085 } 7086 7087 instance._destroy(); 7088 }); 7089 }; 7090 7091 function setButtonsDisabled(instance, buttons, disabled) { 7092 var domCache = privateProps.domCache.get(instance); 7093 buttons.forEach(function (button) { 7094 domCache[button].disabled = disabled; 7095 }); 7096 } 7097 7098 function setInputDisabled(input, disabled) { 7099 if (!input) { 7100 return false; 7101 } 7102 7103 if (input.type === 'radio') { 7104 var radiosContainer = input.parentNode.parentNode; 7105 var radios = radiosContainer.querySelectorAll('input'); 7106 7107 for (var i = 0; i < radios.length; i++) { 7108 radios[i].disabled = disabled; 7109 } 7110 } else { 7111 input.disabled = disabled; 7112 } 7113 } 7114 7115 function enableButtons() { 7116 setButtonsDisabled(this, ['confirmButton', 'denyButton', 'cancelButton'], false); 7117 } 7118 function disableButtons() { 7119 setButtonsDisabled(this, ['confirmButton', 'denyButton', 'cancelButton'], true); 7120 } 7121 function enableInput() { 7122 return setInputDisabled(this.getInput(), false); 7123 } 7124 function disableInput() { 7125 return setInputDisabled(this.getInput(), true); 7126 } 7127 7128 function showValidationMessage(error) { 7129 var domCache = privateProps.domCache.get(this); 7130 var params = privateProps.innerParams.get(this); 7131 setInnerHtml(domCache.validationMessage, error); 7132 domCache.validationMessage.className = swalClasses['validation-message']; 7133 7134 if (params.customClass && params.customClass.validationMessage) { 7135 addClass(domCache.validationMessage, params.customClass.validationMessage); 7136 } 7137 7138 show(domCache.validationMessage); 7139 var input = this.getInput(); 7140 7141 if (input) { 7142 input.setAttribute('aria-invalid', true); 7143 input.setAttribute('aria-describedBy', swalClasses['validation-message']); 7144 focusInput(input); 7145 addClass(input, swalClasses.inputerror); 7146 } 7147 } // Hide block with validation message 7148 7149 function resetValidationMessage$1() { 7150 var domCache = privateProps.domCache.get(this); 7151 7152 if (domCache.validationMessage) { 7153 hide(domCache.validationMessage); 7154 } 7155 7156 var input = this.getInput(); 7157 7158 if (input) { 7159 input.removeAttribute('aria-invalid'); 7160 input.removeAttribute('aria-describedBy'); 7161 removeClass(input, swalClasses.inputerror); 7162 } 7163 } 7164 7165 function getProgressSteps$1() { 7166 var domCache = privateProps.domCache.get(this); 7167 return domCache.progressSteps; 7168 } 7169 7170 var Timer = /*#__PURE__*/function () { 7171 function Timer(callback, delay) { 7172 _classCallCheck(this, Timer); 7173 7174 this.callback = callback; 7175 this.remaining = delay; 7176 this.running = false;
7177 this.start(); 7178 } 7179 7180 _createClass(Timer, [{ 7181 key: "start", 7182 value: function start() { 7183 if (!this.running) { 7184 this.running = true; 7185 this.started = new Date(); 7186 this.id = setTimeout(this.callback, this.remaining); 7187 } 7188 7189 return this.remaining; 7190 } 7191 }, { 7192 key: "stop", 7193 value: function stop() { 7194 if (this.running) { 7195 this.running = false; 7196 clearTimeout(this.id); 7197 this.remaining -= new Date() - this.started; 7198 } 7199 7200 return this.remaining; 7201 } 7202 }, { 7203 key: "increase", 7204 value: function increase(n) { 7205 var running = this.running; 7206 7207 if (running) { 7208 this.stop(); 7209 } 7210 7211 this.remaining += n; 7212 7213 if (running) { 7214 this.start(); 7215 } 7216 7217 return this.remaining; 7218 } 7219 }, { 7220 key: "getTimerLeft", 7221 value: function getTimerLeft() { 7222 if (this.running) { 7223 this.stop(); 7224 this.start(); 7225 } 7226 7227 return this.remaining; 7228 } 7229 }, { 7230 key: "isRunning", 7231 value: function isRunning() { 7232 return this.running; 7233 } 7234 }]); 7235 7236 return Timer; 7237 }(); 7238 7239 var defaultInputValidators = { 7240 email: function email(string, validationMessage) { 7241 return /^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]{2,24}$/.test(string) ? Promise.resolve() : Promise.resolve(validationMessage || 'Invalid email address'); 7242 }, 7243 url: function url(string, validationMessage) { 7244 // taken from https://stackoverflow.com/a/3809435 with a small change from #1306 and #2013 7245 return /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(string) ? Promise.resolve() : Promise.resolve(validationMessage || 'Invalid URL'); 7246 } 7247 }; 7248 7249 function setDefaultInputValidators(params) { 7250 // Use default `inputValidator` for supported input types if not provided 7251 if (!params.inputValidator) { 7252 Object.keys(defaultInputValidators).forEach(function (key) { 7253 if (params.input === key) { 7254 params.inputValidator = defaultInputValidators[key]; 7255 } 7256 }); 7257 } 7258 } 7259 7260 function validateCustomTargetElement(params) { 7261 // Determine if the custom target element is valid 7262 if (!params.target || typeof params.target === 'string' && !document.querySelector(params.target) || typeof params.target !== 'string' && !params.target.appendChild) { 7263 warn('Target parameter is not valid, defaulting to "body"'); 7264 params.target = 'body'; 7265 } 7266 } 7267 /** 7268 * Set type, text and actions on popup 7269 * 7270 * @param params 7271 * @returns {boolean} 7272 */ 7273 7274 7275 function setParameters(params) { 7276 setDefaultInputValidators(params); // showLoaderOnConfirm && preConfirm 7277 7278 if (params.showLoaderOnConfirm && !params.preConfirm) { 7279 warn('showLoaderOnConfirm is set to true, but preConfirm is not defined.\n' + 'showLoaderOnConfirm should be used together with preConfirm, see usage example:\n' + 'https://sweetalert2.github.io/#ajax-request'); 7280 } // params.animation will be actually used in renderPopup.js 7281 // but in case when params.animation is a function, we need to call that function 7282 // before popup (re)initialization, so it'll be possible to check Swal.isVisible() 7283 // inside the params.animation function 7284 7285 7286 params.animation = callIfFunction(params.animation); 7287 validateCustomTargetElement(params); // Replace newlines with <br> in title 7288 7289 if (typeof params.title === 'string') { 7290 params.title = params.title.split('\n').join('<br />'); 7291 } 7292 7293 init(params); 7294 } 7295 7296 var swalStringParams = ['swal-title', 'swal-html', 'swal-footer']; 7297 var getTemplateParams = function getTemplateParams(params) { 7298 var template = typeof params.template === 'string' ? document.querySelector(params.template) : params.template; 7299 7300 if (!template) { 7301 return {}; 7302 } 7303 7304 var templateContent = template.content || template; // IE11 7305 7306 showWarningsForElements(templateContent); 7307 7308 var result = _extends(getSwalParams(templateContent), getSwalButtons(templateContent), getSwalImage(templateContent), getSwalIcon(templateContent), getSwalInput(templateContent), getSwalStringParams(templateContent, swalStringParams)); 7309 7310 return result; 7311 }; 7312 7313 var getSwalParams = function getSwalParams(templateContent) { 7314 var result = {}; 7315 toArray(templateContent.querySelectorAll('swal-param')).forEac
7315h(function (param) { 7316 showWarningsForAttributes(param, ['name', 'value']); 7317 var paramName = param.getAttribute('name'); 7318 var value = param.getAttribute('value'); 7319 7320 if (typeof defaultParams[paramName] === 'boolean' && value === 'false') { 7321 value = false; 7322 } 7323 7324 if (_typeof(defaultParams[paramName]) === 'object') { 7325 value = JSON.parse(value); 7326 } 7327 7328 result[paramName] = value; 7329 }); 7330 return result; 7331 }; 7332 7333 var getSwalButtons = function getSwalButtons(templateContent) { 7334 var result = {}; 7335 toArray(templateContent.querySelectorAll('swal-button')).forEach(function (button) { 7336 showWarningsForAttributes(button, ['type', 'color', 'aria-label']); 7337 var type = button.getAttribute('type'); 7338 result["".concat(type, "ButtonText")] = button.innerHTML; 7339 result["show".concat(capitalizeFirstLetter(type), "Button")] = true; 7340 7341 if (button.hasAttribute('color')) { 7342 result["".concat(type, "ButtonColor")] = button.getAttribute('color'); 7343 } 7344 7345 if (button.hasAttribute('aria-label')) { 7346 result["".concat(type, "ButtonAriaLabel")] = button.getAttribute('aria-label'); 7347 } 7348 }); 7349 return result; 7350 }; 7351 7352 var getSwalImage = function getSwalImage(templateContent) { 7353 var result = {}; 7354 var image = templateContent.querySelector('swal-image'); 7355 7356 if (image) { 7357 showWarningsForAttributes(image, ['src', 'width', 'height', 'alt']); 7358 7359 if (image.hasAttribute('src')) { 7360 result.imageUrl = image.getAttribute('src'); 7361 } 7362 7363 if (image.hasAttribute('width')) { 7364 result.imageWidth = image.getAttribute('width'); 7365 } 7366 7367 if (image.hasAttribute('height')) { 7368 result.imageHeight = image.getAttribute('height'); 7369 } 7370 7371 if (image.hasAttribute('alt')) { 7372 result.imageAlt = image.getAttribute('alt'); 7373 } 7374 } 7375 7376 return result; 7377 }; 7378 7379 var getSwalIcon = function getSwalIcon(templateContent) { 7380 var result = {}; 7381 var icon = templateContent.querySelector('swal-icon'); 7382 7383 if (icon) { 7384 showWarningsForAttributes(icon, ['type', 'color']); 7385 7386 if (icon.hasAttribute('type')) { 7387 result.icon = icon.getAttribute('type'); 7388 } 7389 7390 if (icon.hasAttribute('color')) { 7391 result.iconColor = icon.getAttribute('color'); 7392 } 7393 7394 result.iconHtml = icon.innerHTML; 7395 } 7396 7397 return result; 7398 }; 7399 7400 var getSwalInput = function getSwalInput(templateContent) { 7401 var result = {}; 7402 var input = templateContent.querySelector('swal-input'); 7403 7404 if (input) { 7405 showWarningsForAttributes(input, ['type', 'label', 'placeholder', 'value']); 7406 result.input = input.getAttribute('type') || 'text'; 7407 7408 if (input.hasAttribute('label')) { 7409 result.inputLabel = input.getAttribute('label'); 7410 } 7411 7412 if (input.hasAttribute('placeholder')) { 7413 result.inputPlaceholder = input.getAttribute('placeholder'); 7414 } 7415 7416 if (input.hasAttribute('value')) { 7417 result.inputValue = input.getAttribute('value'); 7418 } 7419 } 7420 7421 var inputOptions = templateContent.querySelectorAll('swal-input-option'); 7422 7423 if (inputOptions.length) { 7424 result.inputOptions = {}; 7425 toArray(inputOptions).forEach(function (option) { 7426 showWarningsForAttributes(option, ['value']); 7427 var optionValue = option.getAttribute('value'); 7428 var optionName = option.innerHTML; 7429 result.inputOptions[optionValue] = optionName; 7430 }); 7431 } 7432 7433 return result; 7434 }; 7435 7436 var getSwalStringParams = function getSwalStringParams(templateContent, paramNames) { 7437 var result = {}; 7438 7439 for (var i in paramNames) { 7440 var paramName = paramNames[i]; 7441 var tag = templateContent.querySelector(paramName); 7442 7443 if (tag) { 7444 showWarningsForAttributes(tag, []); 7445 result[paramName.replace(/^swal-/, '')] = tag.innerHTML; 7446 } 7447 } 7448 7449 return result; 7450 }; 7451 7452 var showWarningsForElements = function showWarningsForElements(template) { 7453 var allowedElements = swalStringParams.concat(['swal-param', 'swal-button', 'swal-image', 'swal-icon', 'swal-input', 'swal-input-option']);
7454 toArray(template.querySelectorAll('*')).forEach(function (el) { 7455 if (el.parentNode !== template) { 7456 // can't use template.children because of IE11 7457 return; 7458 } 7459 7460 var tagName = el.tagName.toLowerCase(); 7461 7462 if (allowedElements.indexOf(tagName) === -1) { 7463 warn("Unrecognized element <".concat(tagName, ">")); 7464 } 7465 }); 7466 }; 7467 7468 var showWarningsForAttributes = function showWarningsForAttributes(el, allowedAttributes) { 7469 toArray(el.attributes).forEach(function (attribute) { 7470 if (allowedAttributes.indexOf(attribute.name) === -1) { 7471 warn(["Unrecognized attribute \"".concat(attribute.name, "\" on <").concat(el.tagName.toLowerCase(), ">."), "".concat(allowedAttributes.length ? "Allowed attributes are: ".concat(allowedAttributes.join(', ')) : 'To set the value, use HTML within the element.')]); 7472 } 7473 }); 7474 }; 7475 7476 var SHOW_CLASS_TIMEOUT = 10; 7477 /** 7478 * Open popup, add necessary classes and styles, fix scrollbar 7479 * 7480 * @param params 7481 */ 7482 7483 var openPopup = function openPopup(params) { 7484 var container = getContainer(); 7485 var popup = getPopup(); 7486 7487 if (typeof params.willOpen === 'function') { 7488 params.willOpen(popup); 7489 } else if (typeof params.onBeforeOpen === 'function') { 7490 params.onBeforeOpen(popup); // @deprecated 7491 } 7492 7493 var bodyStyles = window.getComputedStyle(document.body); 7494 var initialBodyOverflow = bodyStyles.overflowY; 7495 addClasses$1(container, popup, params); // scrolling is 'hidden' until animation is done, after that 'auto' 7496 7497 setTimeout(function () { 7498 setScrollingVisibility(container, popup); 7499 }, SHOW_CLASS_TIMEOUT); 7500 7501 if (isModal()) { 7502 fixScrollContainer(container, params.scrollbarPadding, initialBodyOverflow); 7503 setAriaHidden(); 7504 } 7505 7506 if (!isToast() && !globalState.previousActiveElement) { 7507 globalState.previousActiveElement = document.activeElement; 7508 } 7509 7510 runDidOpen(popup, params); 7511 removeClass(container, swalClasses['no-transition']); 7512 }; 7513 7514 var runDidOpen = function runDidOpen(popup, params) { 7515 if (typeof params.didOpen === 'function') { 7516 setTimeout(function () { 7517 return params.didOpen(popup); 7518 }); 7519 } else if (typeof params.onOpen === 'function') { 7520 setTimeout(function () { 7521 return params.onOpen(popup); 7522 }); // @deprecated 7523 } 7524 }; 7525 7526 var swalOpenAnimationFinished = function swalOpenAnimationFinished(event) { 7527 var popup = getPopup(); 7528 7529 if (event.target !== popup) { 7530 return; 7531 } 7532 7533 var container = getContainer(); 7534 popup.removeEventListener(animationEndEvent, swalOpenAnimationFinished); 7535 container.style.overflowY = 'auto'; 7536 }; 7537 7538 var setScrollingVisibility = function setScrollingVisibility(container, popup) { 7539 if (animationEndEvent && hasCssAnimation(popup)) { 7540 container.style.overflowY = 'hidden'; 7541 popup.addEventListener(animationEndEvent, swalOpenAnimationFinished); 7542 } else { 7543 container.style.overflowY = 'auto'; 7544 } 7545 }; 7546 7547 var fixScrollContainer = function fixScrollContainer(container, scrollbarPadding, initialBodyOverflow) { 7548 iOSfix(); 7549 IEfix(); 7550 7551 if (scrollbarPadding && initialBodyOverflow !== 'hidden') { 7552 fixScrollbar(); 7553 } // sweetalert2/issues/1247 7554 7555 7556 setTimeout(function () { 7557 container.scrollTop = 0; 7558 }); 7559 }; 7560 7561 var addClasses$1 = function addClasses(container, popup, params) { 7562 addClass(container, params.showClass.backdrop); // the workaround with setting/unsetting opacity is needed for #2019 and 2059 7563 7564 popup.style.setProperty('opacity', '0', 'important'); 7565 show(popup); 7566 setTimeout(function () { 7567 // Animate popup right after showing it 7568 addClass(popup, params.showClass.popup); // and remove the opacity workaround 7569 7570 popup.style.removeProperty('opacity'); 7571 }, SHOW_CLASS_TIMEOUT); // 10ms in order to fix #2062 7572 7573 addClass([document.documentElement, document.body], swalClasses.shown); 7574 7575 if (params.heightAuto && params.backdrop && !params.toast) { 7576 addClass([document.documentElement, document.body], swalClasses['height-auto']); 7577 } 7578 }; 7579 7580 var handleInputOptionsAndValue = function handleInputOptionsAndValue(instance, params) { 7581 if (params.input === 'select' || params.input === 'radio') { 7582 handleInputOptions(instance, params); 7583 } else if (['text', 'email', 'number', 'tel', 'textarea'].indexOf(params.input) !== -1 && (hasToPromiseFn(params.inputValue) || isPromise(params.inputValue))) { 7584 handleInputValue(instance, params); 7585 } 7586 }; 7587 var getInputValue = function getInputValue(instance, innerParams) { 7588 var input = instance.getInput(); 7589 7590 if (!input) { 7591 return null; 7592 } 7593 7594 switch (innerParams.input) { 7595 case 'checkbox': 7596 return getCheckboxValue(input); 7597 7598 case 'radio': 7599 return getRadioValue(input); 7600 7601 case 'file': 7602 return getFileValue(input); 7603 7604 default: 7605 return innerParams.inputAutoTrim ? input.value.trim() : input.value; 7606 } 7607 }; 7608 7609 var getCheckboxValue = function getCheckboxValue(input) { 7610 return input.checked ? 1 : 0; 7611 }; 7612 7613 var getRadioValue = function getRadioValue(input) { 7614 return input.checked ? input.value : null; 7615 }; 7616 7617 var getFileValue = function getFileValue(input) { 7618 return input.files.length ? input.getAttribute('multiple') !== null ? input.files : input.files[0] : null; 7619 }; 7620 7621 var handleInputOptions = function handleInputOptions(instance, params) { 7622 var content = getContent(); 7623 7624 var processInputOptions = function processInputOptions(inputOptions) { 7625 return populateInputOptions[params.input](content, formatInputOptions(inputOptions), params); 7626 }; 7627 7628 if (hasToPromiseFn(params.inputOptions) || isPromise(params.inputOptions)) { 7629 showLoading(); 7630 asPromise(params.inputOptions).then(function (inputOptions) { 7631 instance.hideLoading(); 7632 processInputOptions(inputOptions); 7633 }); 7634 } else if (_typeof(params.inputOptions) === 'object') { 7635 processInputOptions(params.inputOptions); 7636 } else { 7637 error("Unexpected type of inputOptions! Expected object, Map or Promise, got ".concat(_typeof(params.inputOptions))); 7638 } 7639 }; 7640 7641 var handleInputValue = function handleInputValue(instance, params) { 7642 var input = instance.getInput(); 7643 hide(input); 7644 asPromise(params.inputValue).then(function (inputValue) { 7645 input.value = params.input === 'number' ? parseFloat(inputValue) || 0 : "".concat(inputValue); 7646 show(input); 7647 input.focus(); 7648 instance.hideLoading(); 7649 })["catch"](function (err) { 7650 error("Error in inputValue promise: ".concat(err)); 7651 input.value = ''; 7652 show(input); 7653 input.focus(); 7654 instance.hideLoading(); 7655 }); 7656 }; 7657 7658 var populateInputOptions = { 7659 select: function select(content, inputOptions, params) { 7660 var select = getChildByClass(content, swalClasses.select); 7661 7662 var renderOption = function renderOption(parent, optionLabel, optionValue) { 7663 var option = document.createElement('option'); 7664 option.value = optionValue; 7665 setInnerHtml(option, optionLabel); 7666 option.selected = isSelected(optionValue, params.inputValue); 7667 parent.appendChild(option); 7668 }; 7669 7670 inputOptions.forEach(function (inputOption) { 7671 var optionValue = inputOption[0]; 7672 var optionLabel = inputOption[1]; // <optgroup> spec: 7673 // https://www.w3.org/TR/html401/interact/forms.html#h-17.6 7674 // "...all OPTGROUP elements must be specified directly within a SELECT element (i.e., groups may not be nested)..." 7675 // check whether this is a <optgroup> 7676 7677 if (Array.isArray(optionLabel)) { 7678 // if it is an array, then it is an <optgroup> 7679 var optgroup = document.createElement('optgroup'); 7680 optgroup.label = optionValue; 7681 optgroup.disabled = false; // not configurable for now 7682 7683 select.appendChild(optgroup); 7684 optionLabel.forEach(function (o) { 7685 return renderOption(optgroup, o[1], o[0]); 7686 }); 7687 } else { 7688 // case of <option> 7689 renderOption(select, optionLabel, optionValue); 7690 } 7691 }); 7692 select.focus(); 7693 }, 7694 radio: function radio(content, inputOptions, params) { 7695 var radio = getChildByClass(content, swalClasses.radio); 7696 inputOptions.forEach(function (inputOption) { 7697 var radioValue = inputOption[0]; 7698 var radioLabel = inputOption[1]; 7699 var radioInput = document.createElement('input'); 7700 var radioLabelElement = document.createElement('label'); 7701 radioInput.type = 'radio'; 7702 radioInput.name = swalClasses.radio; 7703 radioInput.value = radioValue; 7704 7705 if (isSelected(radioValue, params.inputValue)) { 7706 radioInput.checked = true; 7707 } 7708 7709 var label = document.createElement('span'); 7710 setInnerHtml(label, radioLabel); 7711 label.className = swalClasses.label; 7712 radioLabelElement.appendChild(radioInput); 7713 radioLabelElement.appendChild(label); 7714 radio.appendChild(radioLabelElement); 7715 }); 7716 var radios = radio.querySelectorAll('input'); 7717 7718 if (radios.length) { 7719 radios[0].focus(); 7720 } 7721 } 7722 }; 7723 /** 7724 * Converts `inputOptions` into an array of `[value, label]`s 7725 * @param inputOptions 7726 */ 7727 7728 var formatInputOptions = function formatInputOptions(inputOptions) { 7729 var result = []; 7730 7731 if (typeof Map !== 'undefined' && inputOptions instanceof Map) { 7732 inputOptions.forEach(function (value, key) { 7733 var valueFormatted = value; 7734 7735 if (_typeof(valueFormatted) === 'object') { 7736 // case of <optgroup> 7737 valueFormatted = formatInputOptions(valueFormatted); 7738 } 7739 7740 result.push([key, valueFormatted]); 7741 }); 7742 } else {
7743 Object.keys(inputOptions).forEach(function (key) { 7744 var valueFormatted = inputOptions[key]; 7745 7746 if (_typeof(valueFormatted) === 'object') { 7747 // case of <optgroup> 7748 valueFormatted = formatInputOptions(valueFormatted); 7749 } 7750 7751 result.push([key, valueFormatted]); 7752 }); 7753 } 7754 7755 return result; 7756 }; 7757 7758 var isSelected = function isSelected(optionValue, inputValue) { 7759 return inputValue && inputValue.toString() === optionValue.toString(); 7760 }; 7761 7762 var handleConfirmButtonClick = function handleConfirmButtonClick(instance, innerParams) { 7763 instance.disableButtons(); 7764 7765 if (innerParams.input) { 7766 handleConfirmOrDenyWithInput(instance, innerParams, 'confirm'); 7767 } else { 7768 confirm(instance, innerParams, true); 7769 } 7770 }; 7771 var handleDenyButtonClick = function handleDenyButtonClick(instance, innerParams) { 7772 instance.disableButtons(); 7773 7774 if (innerParams.returnInputValueOnDeny) { 7775 handleConfirmOrDenyWithInput(instance, innerParams, 'deny'); 7776 } else { 7777 deny(instance, innerParams, false); 7778 } 7779 }; 7780 var handleCancelButtonClick = function handleCancelButtonClick(instance, dismissWith) { 7781 instance.disableButtons(); 7782 dismissWith(DismissReason.cancel); 7783 }; 7784 7785 var handleConfirmOrDenyWithInput = function handleConfirmOrDenyWithInput(instance, innerParams, type 7786 /* type is either 'confirm' or 'deny' */ 7787 ) { 7788 var inputValue = getInputValue(instance, innerParams); 7789 7790 if (innerParams.inputValidator) { 7791 handleInputValidator(instance, innerParams, inputValue); 7792 } else if (!instance.getInput().checkValidity()) { 7793 instance.enableButtons(); 7794 instance.showValidationMessage(innerParams.validationMessage); 7795 } else if (type === 'deny') { 7796 deny(instance, innerParams, inputValue); 7797 } else { 7798 confirm(instance, innerParams, inputValue); 7799 } 7800 }; 7801 7802 var handleInputValidator = function handleInputValidator(instance, innerParams, inputValue) { 7803 instance.disableInput(); 7804 var validationPromise = Promise.resolve().then(function () { 7805 return asPromise(innerParams.inputValidator(inputValue, innerParams.validationMessage)); 7806 }); 7807 validationPromise.then(function (validationMessage) { 7808 instance.enableButtons(); 7809 instance.enableInput(); 7810 7811 if (validationMessage) { 7812 instance.showValidationMessage(validationMessage); 7813 } else { 7814 confirm(instance, innerParams, inputValue); 7815 } 7816 }); 7817 }; 7818 7819 var deny = function deny(instance, innerParams, value) { 7820 if (innerParams.showLoaderOnDeny) { 7821 showLoading(getDenyButton()); 7822 } 7823 7824 if (innerParams.preDeny) { 7825 var preDenyPromise = Promise.resolve().then(function () { 7826 return asPromise(innerParams.preDeny(value, innerParams.validationMessage)); 7827 }); 7828 preDenyPromise.then(function (preDenyValue) { 7829 if (preDenyValue === false) { 7830 instance.hideLoading(); 7831 } else { 7832 instance.closePopup({ 7833 isDenied: true, 7834 value: typeof preDenyValue === 'undefined' ? value : preDenyValue 7835 }); 7836 } 7837 }); 7838 } else { 7839 instance.closePopup({ 7840 isDenied: true, 7841 value: value 7842 }); 7843 } 7844 }; 7845 7846 var succeedWith = function succeedWith(instance, value) { 7847 instance.closePopup({ 7848 isConfirmed: true, 7849 value: value 7850 }); 7851 }; 7852 7853 var confirm = function confirm(instance, innerParams, value) { 7854 if (innerParams.showLoaderOnConfirm) { 7855 showLoading(); // TODO: make showLoading an *instance* method 7856 } 7857 7858 if (innerParams.preConfirm) { 7859 instance.resetValidationMessage(); 7860 var preConfirmPromise = Promise.resolve().then(function () { 7861 return asPromise(innerParams.preConfirm(value, innerParams.validationMessage)); 7862 }); 7863 preConfirmPromise.then(function (preConfirmValue) { 7864 if (isVisible(getValidationMessage()) || preConfirmValue === false) { 7865 instance.hideLoading(); 7866 } else { 7867 succeedWith(instance, typeof preConfirmValue === 'undefined' ? value : preConfirmValue); 7868 } 7869 }); 7870 } else { 7871 succeedWith(instance, value); 7872 } 7873 }; 7874 7875 var addKeydownHandler = function addKeydownHandler(instance, globalState, innerParams, dismissWith) { 7876 if (globalState.keydownTarget && globalState.keydownHandlerAdded) { 7877 globalState.keydownTarget.removeEventListener('keydown', globalState.keydownHandler, { 7878 capture: globalState.keydownListenerCapture 7879 }); 7880 globalState.keydownHandlerAdded = false;
7881 } 7882 7883 if (!innerParams.toast) { 7884 globalState.keydownHandler = function (e) { 7885 return keydownHandler(instance, e, dismissWith); 7886 }; 7887 7888 globalState.keydownTarget = innerParams.keydownListenerCapture ? window : getPopup(); 7889 globalState.keydownListenerCapture = innerParams.keydownListenerCapture; 7890 globalState.keydownTarget.addEventListener('keydown', globalState.keydownHandler, { 7891 capture: globalState.keydownListenerCapture 7892 }); 7893 globalState.keydownHandlerAdded = true; 7894 } 7895 }; // Focus handling 7896 7897 var setFocus = function setFocus(innerParams, index, increment) { 7898 var focusableElements = getFocusableElements(); // search for visible elements and select the next possible match 7899 7900 if (focusableElements.length) { 7901 index = index + increment; // rollover to first item 7902 7903 if (index === focusableElements.length) { 7904 index = 0; // go to last item 7905 } else if (index === -1) { 7906 index = focusableElements.length - 1; 7907 } 7908 7909 return focusableElements[index].focus(); 7910 } // no visible focusable elements, focus the popup 7911 7912 7913 getPopup().focus(); 7914 }; 7915 var arrowKeysNextButton = ['ArrowRight', 'ArrowDown', 'Right', 'Down' // IE11 7916 ]; 7917 var arrowKeysPreviousButton = ['ArrowLeft', 'ArrowUp', 'Left', 'Up' // IE11 7918 ]; 7919 var escKeys = ['Escape', 'Esc' // IE11 7920 ]; 7921 7922 var keydownHandler = function keydownHandler(instance, e, dismissWith) { 7923 var innerParams = privateProps.innerParams.get(instance); 7924 7925 if (innerParams.stopKeydownPropagation) { 7926 e.stopPropagation(); 7927 } // ENTER 7928 7929 7930 if (e.key === 'Enter') { 7931 handleEnter(instance, e, innerParams); // TAB 7932 } else if (e.key === 'Tab') { 7933 handleTab(e, innerParams); // ARROWS - switch focus between buttons 7934 } else if ([].concat(arrowKeysNextButton, arrowKeysPreviousButton).indexOf(e.key) !== -1) { 7935 handleArrows(e.key); // ESC 7936 } else if (escKeys.indexOf(e.key) !== -1) { 7937 handleEsc(e, innerParams, dismissWith); 7938 } 7939 }; 7940 7941 var handleEnter = function handleEnter(instance, e, innerParams) { 7942 // #720 #721 7943 if (e.isComposing) { 7944 return; 7945 } 7946 7947 if (e.target && instance.getInput() && e.target.outerHTML === instance.getInput().outerHTML) { 7948 if (['textarea', 'file'].indexOf(innerParams.input) !== -1) { 7949 return; // do not submit 7950 } 7951 7952 clickConfirm(); 7953 e.preventDefault(); 7954 } 7955 }; 7956 7957 var handleTab = function handleTab(e, innerParams) { 7958 var targetElement = e.target; 7959 var focusableElements = getFocusableElements(); 7960 var btnIndex = -1; 7961 7962 for (var i = 0; i < focusableElements.length; i++) { 7963 if (targetElement === focusableElements[i]) { 7964 btnIndex = i; 7965 break; 7966 } 7967 } 7968 7969 if (!e.shiftKey) { 7970 // Cycle to the next button 7971 setFocus(innerParams, btnIndex, 1); 7972 } else { 7973 // Cycle to the prev button 7974 setFocus(innerParams, btnIndex, -1); 7975 } 7976 7977 e.stopPropagation(); 7978 e.preventDefault(); 7979 }; 7980 7981 var handleArrows = function handleArrows(key) { 7982 var confirmButton = getConfirmButton(); 7983 var denyButton = getDenyButton(); 7984 var cancelButton = getCancelButton(); 7985 7986 if (!([confirmButton, denyButton, cancelButton].indexOf(document.activeElement) !== -1)) { 7987 return; 7988 } 7989 7990 var sibling = arrowKeysNextButton.indexOf(key) !== -1 ? 'nextElementSibling' : 'previousElementSibling'; 7991 var buttonToFocus = document.activeElement[sibling]; 7992 7993 if (buttonToFocus) { 7994 buttonToFocus.focus(); 7995 } 7996 }; 7997 7998 var handleEsc = function handleEsc(e, innerParams, dismissWith) { 7999 if (callIfFunction(innerParams.allowEscapeKey)) { 8000 e.preventDefault();
8001 dismissWith(DismissReason.esc); 8002 } 8003 }; 8004 8005 var handlePopupClick = function handlePopupClick(instance, domCache, dismissWith) { 8006 var innerParams = privateProps.innerParams.get(instance); 8007 8008 if (innerParams.toast) { 8009 handleToastClick(instance, domCache, dismissWith); 8010 } else { 8011 // Ignore click events that had mousedown on the popup but mouseup on the container 8012 // This can happen when the user drags a slider 8013 handleModalMousedown(domCache); // Ignore click events that had mousedown on the container but mouseup on the popup 8014 8015 handleContainerMousedown(domCache); 8016 handleModalClick(instance, domCache, dismissWith); 8017 } 8018 }; 8019 8020 var handleToastClick = function handleToastClick(instance, domCache, dismissWith) { 8021 // Closing toast by internal click 8022 domCache.popup.onclick = function () { 8023 var innerParams = privateProps.innerParams.get(instance); 8024 8025 if (innerParams.showConfirmButton || innerParams.showDenyButton || innerParams.showCancelButton || innerParams.showCloseButton || innerParams.timer || innerParams.input) { 8026 return; 8027 } 8028 8029 dismissWith(DismissReason.close); 8030 }; 8031 }; 8032 8033 var ignoreOutsideClick = false; 8034 8035 var handleModalMousedown = function handleModalMousedown(domCache) { 8036 domCache.popup.onmousedown = function () { 8037 domCache.container.onmouseup = function (e) { 8038 domCache.container.onmouseup = undefined; // We only check if the mouseup target is the container because usually it doesn't 8039 // have any other direct children aside of the popup 8040 8041 if (e.target === domCache.container) { 8042 ignoreOutsideClick = true; 8043 } 8044 }; 8045 }; 8046 }; 8047 8048 var handleContainerMousedown = function handleContainerMousedown(domCache) { 8049 domCache.container.onmousedown = function () { 8050 domCache.popup.onmouseup = function (e) { 8051 domCache.popup.onmouseup = undefined; // We also need to check if the mouseup target is a child of the popup 8052 8053 if (e.target === domCache.popup || domCache.popup.contains(e.target)) { 8054 ignoreOutsideClick = true; 8055 } 8056 }; 8057 }; 8058 }; 8059 8060 var handleModalClick = function handleModalClick(instance, domCache, dismissWith) { 8061 domCache.container.onclick = function (e) { 8062 var innerParams = privateProps.innerParams.get(instance); 8063 8064 if (ignoreOutsideClick) { 8065 ignoreOutsideClick = false; 8066 return; 8067 } 8068 8069 if (e.target === domCache.container && callIfFunction(innerParams.allowOutsideClick)) { 8070 dismissWith(DismissReason.backdrop); 8071 } 8072 }; 8073 }; 8074 8075 function _main(userParams) { 8076 var mixinParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 8077 showWarningsForParams(_extends({}, mixinParams, userParams)); 8078 8079 if (globalState.currentInstance) { 8080 globalState.currentInstance._destroy(); 8081 } 8082 8083 globalState.currentInstance = this; 8084 var innerParams = prepareParams(userParams, mixinParams); 8085 setParameters(innerParams); 8086 Object.freeze(innerParams); // clear the previous timer 8087 8088 if (globalState.timeout) { 8089 globalState.timeout.stop(); 8090 delete globalState.timeout; 8091 } // clear the restore focus timeout 8092 8093 8094 clearTimeout(globalState.restoreFocusTimeout); 8095 var domCache = populateDomCache(this); 8096 render(this, innerParams); 8097 privateProps.innerParams.set(this, innerParams); 8098 return swalPromise(this, domCache, innerParams); 8099 } 8100 8101 var prepareParams = function prepareParams(userParams, mixinParams) { 8102 var templateParams = getTemplateParams(userParams); 8103 8104 var showClass = _extends({}, defaultParams.showClass, mixinParams.showClass, templateParams.showClass, userParams.showClass); 8105 8106 var hideClass = _extends({}, defaultParams.hideClass, mixinParams.hideClass, templateParams.hideClass, userParams.hideClass); 8107 8108 var params = _extends({}, defaultParams, mixinParams, templateParams, userParams); // precedence is described in #2131 8109 8110 8111 params.showClass = showClass; 8112 params.hideClass = hideClass; // @deprecated 8113 8114 if (userParams.animation === false) { 8115 params.showClass = { 8116 popup: 'swal2-noanimation', 8117 backdrop: 'swal2-noanimation' 8118 }; 8119 params.hideClass = {}; 8120 } 8121 8122 return params; 8123 }; 8124 8125 var swalPromise = function swalPromise(instance, domCache, innerParams) { 8126 return new Promise(function (resolve) { 8127 // functions to handle all closings/dismissals 8128 var dismissWith = function dismissWith(dismiss) { 8129 instance.closePopup({ 8130 isDismissed: true,
8131 dismiss: dismiss 8132 }); 8133 }; 8134 8135 privateMethods.swalPromiseResolve.set(instance, resolve); 8136 8137 domCache.confirmButton.onclick = function () { 8138 return handleConfirmButtonClick(instance, innerParams); 8139 }; 8140 8141 domCache.denyButton.onclick = function () { 8142 return handleDenyButtonClick(instance, innerParams); 8143 }; 8144 8145 domCache.cancelButton.onclick = function () { 8146 return handleCancelButtonClick(instance, dismissWith); 8147 }; 8148 8149 domCache.closeButton.onclick = function () { 8150 return dismissWith(DismissReason.close); 8151 }; 8152 8153 handlePopupClick(instance, domCache, dismissWith); 8154 addKeydownHandler(instance, globalState, innerParams, dismissWith); 8155 8156 if (innerParams.toast && (innerParams.input || innerParams.footer || innerParams.showCloseButton)) { 8157 addClass(document.body, swalClasses['toast-column']); 8158 } else { 8159 removeClass(document.body, swalClasses['toast-column']); 8160 } 8161 8162 handleInputOptionsAndValue(instance, innerParams); 8163 openPopup(innerParams); 8164 setupTimer(globalState, innerParams, dismissWith); 8165 initFocus(domCache, innerParams); // Scroll container to top on open (#1247, #1946) 8166 8167 setTimeout(function () { 8168 domCache.container.scrollTop = 0; 8169 }); 8170 }); 8171 }; 8172 8173 var populateDomCache = function populateDomCache(instance) { 8174 var domCache = { 8175 popup: getPopup(), 8176 container: getContainer(), 8177 content: getContent(), 8178 actions: getActions(), 8179 confirmButton: getConfirmButton(),
8180 denyButton: getDenyButton(), 8181 cancelButton: getCancelButton(), 8182 loader: getLoader(), 8183 closeButton: getCloseButton(), 8184 validationMessage: getValidationMessage(), 8185 progressSteps: getProgressSteps() 8186 }; 8187 privateProps.domCache.set(instance, domCache); 8188 return domCache; 8189 }; 8190 8191 var setupTimer = function setupTimer(globalState$$1, innerParams, dismissWith) { 8192 var timerProgressBar = getTimerProgressBar(); 8193 hide(timerProgressBar); 8194 8195 if (innerParams.timer) { 8196 globalState$$1.timeout = new Timer(function () { 8197 dismissWith('timer'); 8198 delete globalState$$1.timeout; 8199 }, innerParams.timer); 8200 8201 if (innerParams.timerProgressBar) { 8202 show(timerProgressBar); 8203 setTimeout(function () { 8204 if (globalState$$1.timeout && globalState$$1.timeout.running) { 8205 // timer can be already stopped or unset at this point 8206 animateTimerProgressBar(innerParams.timer); 8207 } 8208 }); 8209 } 8210 } 8211 }; 8212 8213 var initFocus = function initFocus(domCache, innerParams) { 8214 if (innerParams.toast) { 8215 return; 8216 } 8217 8218 if (!callIfFunction(innerParams.allowEnterKey)) { 8219 return blurActiveElement(); 8220 } 8221 8222 if (!focusButton(domCache, innerParams)) { 8223 setFocus(innerParams, -1, 1); 8224 } 8225 }; 8226 8227 var focusButton = function focusButton(domCache, innerParams) { 8228 if (innerParams.focusDeny && isVisible(domCache.denyButton)) { 8229 domCache.denyButton.focus(); 8230 return true; 8231 } 8232 8233 if (innerParams.focusCancel && isVisible(domCache.cancelButton)) { 8234 domCache.cancelButton.focus(); 8235 return true; 8236 } 8237 8238 if (innerParams.focusConfirm && isVisible(domCache.confirmButton)) { 8239 domCache.confirmButton.focus(); 8240 return true; 8241 } 8242 8243 return false; 8244 }; 8245 8246 var blurActiveElement = function blurActiveElement() { 8247 if (document.activeElement && typeof document.activeElement.blur === 'function') { 8248 document.activeElement.blur(); 8249 } 8250 }; 8251 8252 /** 8253 * Updates popup parameters. 8254 */ 8255 8256 function update(params) { 8257 var popup = getPopup(); 8258 var innerParams = privateProps.innerParams.get(this); 8259 8260 if (!popup || hasClass(popup, innerParams.hideClass.popup)) { 8261 return warn("You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup."); 8262 } 8263 8264 var validUpdatableParams = {}; // assign valid params from `params` to `defaults` 8265 8266 Object.keys(params).forEach(function (param) { 8267 if (Swal.isUpdatableParameter(param)) { 8268 validUpdatableParams[param] = params[param]; 8269 } else { 8270 warn("Invalid parameter to update: \"".concat(param, "\". Updatable params are listed here: https://github.com/sweetalert2/sweetalert2/blob/master/src/utils/params.js\n\nIf you think this parameter should be updatable, request it here: https://github.com/sweetalert2/sweetalert2/issues/new?template=02_feature_request.md")); 8271 } 8272 }); 8273 8274 var updatedParams = _extends({}, innerParams, validUpdatableParams); 8275 8276 render(this, updatedParams); 8277 privateProps.innerParams.set(this, updatedParams); 8278 Object.defineProperties(this, { 8279 params: { 8280 value: _extends({}, this.params, params), 8281 writable: false, 8282 enumerable: true 8283 } 8284 }); 8285 } 8286 8287 function _destroy() { 8288 var domCache = privateProps.domCache.get(this); 8289 var innerParams = privateProps.innerParams.get(this); 8290 8291 if (!innerParams) { 8292 return; // This instance has already been destroyed 8293 } // Check if there is another Swal closing 8294 8295 8296 if (domCache.popup && globalState.swalCloseEventFinishedCallback) { 8297 globalState.swalCloseEventFinishedCallback(); 8298 delete globalState.swalCloseEventFinishedCallback; 8299 } // Check if there is a swal disposal defer timer 8300 8301 8302 if (globalState.deferDisposalTimer) { 8303 clearTimeout(globalState.deferDisposalTimer); 8304 delete globalState.deferDisposalTimer; 8305 } 8306 8307 runDidDestroy(innerParams); 8308 disposeSwal(this); 8309 } 8310 8311 var runDidDestroy = function runDidDestroy(innerParams) { 8312 if (typeof innerParams.didDestroy === 'function') { 8313 innerParams.didDestroy(); 8314 } else if (typeof innerParams.onDestroy === 'function') { 8315 innerParams.onDestroy(); // @deprecated 8316 } 8317 }; 8318 8319 var disposeSwal = function disposeSwal(instance) { 8320 // Unset this.params so GC will dispose it (#1569) 8321 delete instance.params; // Unset globalState props so GC will dispose globalState (#1569) 8322 8323 delete globalState.keydownHandler; 8324 delete globalState.keydownTarget; // Unset WeakMaps so GC will be able to dispose them (#1569) 8325 8326 unsetWeakMaps(privateProps); 8327 unsetWeakMaps(privateMethods); 8328 }; 8329 8330 var unsetWeakMaps = function unsetWeakMaps(obj) { 8331 for (var i in obj) { 8332 obj[i] = new WeakMap(); 8333 } 8334 }; 8335 8336 8337 8338 var instanceMethods = /*#__PURE__*/Object.freeze({ 8339 hideLoading: hideLoading, 8340 disableLoading: hideLoading, 8341 getInput: getInput$1, 8342 close: close, 8343 closePopup: close, 8344 closeModal: close, 8345 closeToast: close, 8346 enableButtons: enableButtons, 8347 disableButtons: disableButtons, 8348 enableInput: enableInput, 8349 disableInput: disableInput, 8350 showValidationMessage: showValidationMessage, 8351 resetValidationMessage: resetValidationMessage$1, 8352 getProgressSteps: getProgressSteps$1, 8353 _main: _main, 8354 update: update, 8355 _destroy: _destroy 8356 }); 8357 8358 var currentInstance; 8359 8360 var SweetAlert = /*#__PURE__*/function () { 8361 function SweetAlert() { 8362 _classCallCheck(this, SweetAlert); 8363 8364 // Prevent run in Node env 8365 if (typeof window === 'undefined') { 8366 return; 8367 } // Check for the existence of Promise 8368 8369 8370 if (typeof Promise === 'undefined') { 8371 error('This package requires a Promise library, please include a shim to enable it in this browser (See: https://github.com/sweetalert2/sweetalert2/wiki/Migration-from-SweetAlert-to-SweetAlert2#1-ie-support)'); 8372 } 8373 8374 currentInstance = this; 8375 8376 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 8377 args[_key] = arguments[_key]; 8378 } 8379 8380 var outerParams = Object.freeze(this.constructor.argsToParams(args)); 8381 Object.defineProperties(this, { 8382 params: { 8383 value: outerParams, 8384 writable: false, 8385 enumerable: true, 8386 configurable: true 8387 } 8388 }); 8389 8390 var promise = this._main(this.params); 8391 8392 privateProps.promise.set(this, promise); 8393 } // `catch` cannot be the name of a module export, so we define our thenable methods here instead 8394 8395 8396 _createClass(SweetAlert, [{ 8397 key: "then", 8398 value: function then(onFulfilled) { 8399 var promise = privateProps.promise.get(this); 8400 return promise.then(onFulfilled); 8401 } 8402 }, {
8403 key: "finally", 8404 value: function _finally(onFinally) { 8405 var promise = privateProps.promise.get(this); 8406 return promise["finally"](onFinally); 8407 } 8408 }]); 8409 8410 return SweetAlert; 8411 }(); // Assign instance methods from src/instanceMethods/*.js to prototype 8412 8413 8414 _extends(SweetAlert.prototype, instanceMethods); // Assign static methods from src/staticMethods/*.js to constructor 8415 8416 8417 _extends(SweetAlert, staticMethods); // Proxy to instance methods to constructor, for now, for backwards compatibility 8418 8419 8420 Object.keys(instanceMethods).forEach(function (key) { 8421 SweetAlert[key] = function () { 8422 if (currentInstance) { 8423 var _currentInstance; 8424 8425 return (_currentInstance = currentInstance)[key].apply(_currentInstance, arguments); 8426 } 8427 }; 8428 }); 8429 SweetAlert.DismissReason = DismissReason; 8430 SweetAlert.version = '10.14.0'; 8431 8432 var Swal = SweetAlert; 8433 Swal["default"] = Swal; 8434 8435 return Swal; 8436 8437})); 8438if (typeof this !== 'undefined' && this.Sweetalert2){ this.swal = this.sweetAlert = this.Swal = this.SweetAlert = this.Sweetalert2} 8439 8440 8441/***/ }) 8442/******/ ]); 8443//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgNjIwMmU3ZWExNTUyMTMwNWNkOGMiLCJ3ZWJwYWNrOi8vLy4vbWFpbl9mcm9udGVuZC5qcyIsIndlYnBhY2s6Ly8vLi9mcm9udGVuZC9mcmFtZXdvcmsvUndiRXZlbnRzRm9ybUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vZnJvbnRlbmQvZnJhbWV3b3JrL1J3YkV2ZW50c0Zvcm1WaWV3LmpzIiwid2VicGFjazovLy8uL2Zyb250ZW5kL2ZyYW1ld29yay9Sd2JFdmVudHNGb3JtTW9kZWwuanMiLCJ3ZWJwYWNrOi8vLy4vZnJvbnRlbmQvZnJhbWV3b3JrL1J3YkV2ZW50c0Zvcm1TcGluZS5qcyIsIndlYnBhY2s6Ly8vL3Zhci93d3cvdmVnYXMudGVzdC93cC1jb250ZW50L3BsdWdpbnMvbm9kZV9tb2R1bGVzL3N3ZWV0YWxlcnQyL2Rpc3Qvc3dlZXRhbGVydDIuanMiXSwibmFtZXMiOlsiJCIsInVuZGVmaW5lZCIsInJ3YkV2ZW50c0Zvcm1Db250cm9sbGVyIiwiUndiRXZlbnRzRm9ybUNvbnRyb2xsZXIiLCJpbml0Iiwid2luZG93IiwialF1ZXJ5IiwiUndiRXZlbnRzRm9ybVZpZXciLCJjb25zdHJ1Y3RvciIsInNjcm9sbFdpbmRvdyIsImlzTW9iaWxlIiwic2VhbWxlc3MiLCJ3aW5kb3dTY3JvbGxCeSIsInNjcm9sbFdpbmRvdzIiLCJmaXhGdWxsU2NyZWVuIiwibGVuZ3RoIiwidGFyZ2V0Tm9kZSIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsImNvbmZpZyIsImF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVGaWx0ZXIiLCJjYWxsYmFjayIsIm11dGF0aW9uc0xpc3QiLCJvYnNlcnZlciIsIm11dGF0aW9uIiwiYXR0cmlidXRlTmFtZSIsInRhcmdldCIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiY3NzIiwiTXV0YXRpb25PYnNlcnZlciIsIm9ic2VydmUiLCJkYXRlUmFuZ2UiLCJzdGFydERhdGUiLCJzdGVwcyIsImRhdGVBcnJheSIsInNlbGYiLCJjdXJyZW50RGF0ZSIsIkRhdGUiLCJtYXhTdGVwcyIsInAiLCJwdXNoIiwic2V0VVRDRGF0ZSIsImdldFVUQ0RhdGUiLCJkYXRlUmFuZ2VQcmV2IiwicmV2ZXJzZSIsIm9uIiwiZWxlbWVudFNjcm9sbEludG9WaWV3IiwiYmVoYXZpb3IiLCJpbmxpbmUiLCJibG9jayIsIkpCdXlUaWNrZXRzIiwiaGlkZVF0eUFkZFRvQ2FydCIsImJ1eVRpY2tldHNBY3Rpb24iLCJKRmxhdENhbGVuZGFyIiwiSklzQXR0cmFjdGlvbiIsImNsb3Nlc3QiLCJyZW1vdmUiLCJpc0luVmlld3BvcnQiLCJoaWRlIiwic2hvdyIsIkpUaWNrZXRzQ2FydCIsIkpQcmljZU1hcCIsIkpQcmljZU1hcFNlYXRzIiwiSlByaWNlTWFwRXhwbGFuYXRpb24iLCJKRXZlbnRzUGVyRGF0ZSIsIkpFdmVudFNlbGVjdGlvbiIsIkpFdmVudHNQZXJEYXRlQmVmb3JlVGV4dCIsIkpUaWNrZXRzQnV0dG9uc0NhcnQiLCJKVGlja2V0c1NlbGVjdGVkQ2FydCIsImFwcGVuZCIsImFuaW1hdGUiLCJzY3JvbGxUb3AiLCJKVGhlbWUiLCJKQmxhbmtTZWF0c01hcCIsImh0bWwiLCJwb2RzIiwiZnJvbURlbGV0ZSIsImluaXRTZWF0c01hcCIsInNob3dQYWdlQWN0aW9ucyIsImhvdGVsUm9vbUFjdGlvbnMiLCJmcHNlYXJjaFMiLCJmbGF0cGlja3IiLCJtaW5EYXRlIiwiZGlzYWJsZU1vYmlsZSIsImRhdGVGb3JtYXQiLCJzaG93TW9udGhzIiwic2V0IiwiZ2V0UGFyYW1ldGVyQnlOYW1lIiwiSlNlYXJjaEJ1dHRvbkNhbGVuZGFyIiwic3RhcnRfZGF0ZSIsInNjYWx0eXBlIiwic2NhbGNhdCIsImNEYXRlIiwic2V0VGltZSIsImdldFRpbWUiLCJnZXRUaW1lem9uZUluTWlsaXNlY29uZHMiLCJzZXREYXRlIiwiZGF0ZXNSIiwidG9kYXkiLCJub3ciLCJnZXRUaW1lem9uZU9mZnNldCIsImkiLCJjb21wYXJlX2FzYyIsImZvcm1hdERhdGUiLCJjc3RhcnRfZGF0ZSIsImNlbmRfZGF0ZSIsImRhdGVzUjEiLCJyZW1vdmVDbGFzcyIsImRzZWxlY3RlZCIsImFkZENsYXNzIiwidmFsIiwiZGF0YSIsImFjdGlvbiIsImF0dHIiLCJzZWN1cml0eSIsIkxvYWRpbmdPdmVybGF5IiwiYWpheCIsInR5cGUiLCJkYXRhVHlwZSIsInVybCIsImJiTG9jYWwiLCJhamF4X3VybCIsInN1Y2Nlc3MiLCJwcm94eSIsImNhbENvbXBsZXRlZCIsInRyaWdnZXIiLCJzZWFyY2hDYWxlbmRhckJ1dHRvbiIsImZwc2VhcmNoIiwibW9kZSIsIm9uQ2hhbmdlIiwic2VsZWN0ZWREYXRlcyIsImRhdGVTdHIiLCJpbnN0YW5jZSIsImVsZW1lbnQiLCJ2YWx1ZSIsInJlcGxhY2UiLCJkaWZmVGltZSIsIk1hdGgiLCJhYnMiLCJkaWZmRGF5cyIsImNlaWwiLCJhZGREYXlzIiwibWF4IiwiZ2V0RGF0ZSIsInNldFRpbWVvdXQiLCJqdW1wVG9EYXRlIiwib3BlbiIsImxvY2F0aW9uIiwiaHJlZiIsIkpTZWFyY2hCdXR0b24iLCJlbmRfZGF0ZSIsImFkdWx0cyIsImNoaWxkcmVuIiwiY2hpbGRyZW5hZ2VzYSIsInJvb21zIiwiY0RhdGVlIiwiY2hpbGRyZW5hZ2VzIiwic3BsaXQiLCJzY3JvbGwiLCJzZWFyY2hIb3RlbHNCdXR0b24iLCJKUGFja0J1dHRvbiIsInN0YXJ0UGFja0J1dHRvbiIsImVhY2giLCJmb250c2l6ZSIsImNhbGN1bGF0ZVBhY2tQcmljZSIsIm1hZ25pZmljUG9wdXAiLCJpdGVtcyIsInNyYyIsIm1haW5DbGFzcyIsInByZWxvYWRlciIsIm92ZXJmbG93WSIsImZpeGVkQ29udGVudFBvcyIsImNhbGxiYWNrcyIsImFwcGVuZFRvIiwicmlkIiwiZmluZCIsImZsaWNraXR5IiwiY2VsbEFsaWduIiwiY29udGFpbiIsImZ1bGxzY3JlZW4iLCJ3cmFwQXJvdW5kIiwiZ3JvdXBDZWxscyIsImxhenlMb2FkIiwiaGFzaCIsImNlbGxTZWxlY3RvciIsImZyZW
8443VTY3JvbGwiLCJkcmFnZ2FibGUiLCJwYWdlRG90cyIsImNsb3NlIiwiSlJvb21SZXNlcnZlQnV0dG9uIiwib2ZmIiwicm9vbVJlc2VydmVBY3Rpb24iLCJldmVudCIsInJJRCIsInBJRCIsInJSYXRlIiwiZWwiLCJpc3AiLCJwYXJlbnQiLCJwaWQiLCJycmF0ZSIsInJvb21SZXNlcnZlQ29tcGxldGVkIiwicmVzcG9uc2UiLCJTd2FsIiwiZmlyZSIsInRpdGxlIiwidGV4dCIsIm1lc3NhZ2UiLCJpY29uIiwiY29uZmlybUJ1dHRvblRleHQiLCJjbG9zZU9uQ29uZmlybSIsInRoZW4iLCJyZXN1bHQiLCJpc0NvbmZpcm1lZCIsImlzRGVuaWVkIiwiZWxwIiwiaElEIiwicGFpcklEIiwiZmlyc3QiLCJoaWQiLCJwYWlyaWQiLCJzdGFydFBhY2thZ2VDb21wbGV0ZWQiLCJkYXRlcyIsInN1YnN0cmluZyIsInBhcmFtcyIsImluZGV4T2YiLCJoYXNDbGFzcyIsImJiIiwib3JpZ2luIiwibmFtZSIsInJlZ2V4IiwiUmVnRXhwIiwicmVzdWx0cyIsImV4ZWMiLCJkZWNvZGVVUklDb21wb25lbnQiLCJpc1BhY2siLCJwYWNrU3RhcnREYXRlIiwicGFja0VuZERhdGUiLCJyZW5kZXJFdmVudHMiLCJwcm9kdWN0X2lkIiwicmVuZGVyRXZlbnRzQ29tcGxldGVkIiwicmVuZGVyU2VhdENoYXJ0IiwiZXZlbnRfaWQiLCJjcmVhdGVEZXN0cm95U2VhdENoYXJ0IiwicmVuZGVyU2VhdENoYXJ0Q29tcGxldGVkIiwiY2xlYXJDYXJ0Iiwic2VsZWN0ZWRMYWJlbCIsInNlbGxhYiIsImsiLCJzZWxlY3RlZExhYmVscyIsInNlYXRDaGFydCIsImRlc2VsZWN0T2JqZWN0cyIsInNlbGVjdEJhc2VkT25Ecm9wRG93biIsInNlbGVjdGVkU2VhdHMiLCJjIiwibGFiZWxzIiwidG90YWxQcmljZSIsImhhc1R5cGUiLCJ0eXBlc1NlYXQiLCJzZWxlY3RTZWF0c0xhYmVsT25seSIsImV4aXN0aW5nU2VhdHMiLCJ0b3RhbFRpY2tldHMiLCJsYWJlbCIsInF0eSIsInV1aWQiLCJudW1TZWxlY3RlZCIsImxhYmVsb3JpZyIsInByaWNpbmciLCJ0aWNrZXRUeXBlcyIsInNlbGVjdGVkVGlja2V0VHlwZSIsInByaWNlIiwidHlwZW4iLCJpbkFycmF5IiwicGFyc2VGbG9hdCIsInRpY2tldFR5cGVBbGwiLCJudW1iZXJPZlNlbGVjdGVkU2VhdHMiLCJTY3JvbGxGcm9tQm90dG9tIiwiaGVpZ2h0IiwidGFibGVIZWlnaHQiLCJjcmVhdGVQcmljaW5nTWFwIiwiaGVhZGVycyIsInJvd3MiLCJyb3ciLCJjdXJMYWJlbCIsInRvRml4ZWQiLCJwcCIsImluaXRQYWNrUHJpY2UiLCJmb290ZXJzIiwiY3JlYXRlSHRtbFRhYmxlIiwiSlRpY2tldHNTZWxlY3RlZFRhYmxlIiwiazEiLCJKRnJlZVNlYXRpbmciLCJrcCIsImtwcCIsImlvMSIsInVwZGF0ZU9ialF1YW50aXR5IiwibGlzdFNlbGVjdGVkT2JqZWN0cyIsInNlbGVjdGVkT2JqZWN0cyIsIm15c2VsZWN0ZWRPYmplY3RzIiwiSlpvbmVJbWFnZSIsIkpCdXlCdXR0b24iLCJidXlOb3dBY3Rpb25BIiwiSkFkZFRvQ2FydEJ1dHRvbiIsImFkZFRvQ2FydEFjdGlvbkEiLCJidXlOb3dBY3Rpb24iLCJhZGRUb0NhcnRBY3Rpb24iLCJzZWxlY3RlZE51bWJlck9mVGlja2V0cyIsImRpZmZlcmVuY2UiLCJsYXN0TGFiZWwiLCJteXBvZCIsInN0YXJ0Iiwic2VhdHNCeVBvc2l0aW9uIiwibGFzdFNlYXRTZWxlY3RlZCIsImV2ZW50U2VhdHMiLCJmaW5kUG9zIiwiYXV0b1NlbGVjdGVkU2VhdHMiLCJzcGF0aWFsU2VhdCIsInBhcnNlSW50Iiwic2VsU2VhdCIsImlleGlzdCIsInNlbGVjdE9iamVjdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJ1c2VkQmxvY2tzVG9TZW5kIiwidXNlZEJsb2NrcyIsInByb2R1Y3RpZCIsInNlYXRsYWJlbHMiLCJldmVudGtleSIsInNlbGVjdGVkRXZlbnRJZCIsImV2ZW50RGF0YSIsInNlbGVjdGVkRXZlbnREYXRhIiwiaXNfYWRkX3RvX2NhcnQiLCJhZGRUb0NhcnRDb21wbGV0ZWQiLCJvbkJ0bkNsaWNrZWQiLCJidG5JZCIsImNyZWF0ZUJ1dHRvbiIsImNiIiwicmVyZW5kZXIiLCJhbGxvd091dHNpZGVDbGljayIsImFsbG93RXNjYXBlS2V5IiwicmVsb2FkIiwidGlja2V0RGF0YSIsInN0b3AiLCJwcm9tb19jb2RlIiwicHJpY2VMZXZlbElkIiwicGlja3VwbG9jIiwiYmJmbmFtZSIsImJibG5hbWUiLCJiYndlaWdodCIsInRpY2tldF9kYXRhIiwiYnV5Tm93Q29tcGxldGVkQSIsInNlbGVjdGVkRXZlbnQiLCJhZGRUb0NhcnRDb21wbGV0ZWRB
8443IiwiYnV5Tm93Q29tcGxldGVkIiwiY29tcGFyZVByaWNlQmxvY2tzIiwiYTEiLCJiMSIsImEiLCJiIiwiY29tcGFyZVByaWNlQmxvY2tzUGFjayIsIm9iamVjdFRvQXJyYXkiLCJvYmoiLCJfYXJyIiwia2V5IiwiZ2V0UHJpY2VCbG9ja3NBbmRVc2VkQmxvY2tzQXR0cmFjdGlvbiIsInByaWNlQmxvY2tzIiwiZXZlbnRQcm9tb3Rpb25zIiwia2V5UCIsInRtcGtleSIsInNlbGVjdGVkUHJvbW9Db2RlIiwibXlrZXlQIiwidG1wa2V5UCIsImJpZ1ByaWNlIiwic21hbGxQcmljZSIsIm11c3Rsb2dpbiIsInByb21vIiwiZ2V0UHJpY2VCbG9ja3NBbmRVc2VkQmxvY2tzWm9uZXMiLCJwb3NpdGlvbiIsImdldFByaWNlQmxvY2tzQW5kVXNlZEJsb2NrcyIsImdldFByaWNlTGV2ZWxJZHMiLCJwcmljZUxldmVsSWRzIiwiZ2V0VGFnSWRzIiwidGFnSWRzIiwiZ2V0U3ViaG9sZElkcyIsInN1YmhvbGRzSWRzIiwicHJpY2VCbG9ja3NBbmRVc2VkQmxvY2tzIiwicHJpY2VCbG9jayIsIkpQcmljZUJlc3RTZWF0cyIsInNlbGVjdGVkRmlsdGVyZWRDYXRlZ29yaWVzIiwicHJpY2VBcnIiLCJwcmljZUJsb2NrQXJyIiwic29ydCIsInBvIiwiaTEiLCJ1c2VkUHJpY2VMZXZlbElkcyIsImJpZ3ByaWNlY3V0IiwicHJpY2VEaXYiLCJjb2RlQXJyYXkiLCJvcHRpb25zYmVzdCIsInN0ZXAiLCJKVGlja2V0c0Nob29zZXIiLCJvbyIsInRvU3RyaW5nIiwiZHJvcGRvd25CZXN0U2VhdHMiLCJsZXZlbElkIiwiaW5kZXhPZkl0ZW0iLCJzcGxpY2UiLCJjaGFuZ2VDb25maWciLCJmaWx0ZXJlZENhdGVnb3JpZXMiLCJ0b2dnbGVDYXRlZ29yaWVzSGlnaGxpZ2h0UmVuZGVyIiwic2VsZWN0QmVzdEF2YWlsYWJsZSIsImV2ZW50X3NlYXRzIiwiZXZlbnRfcHJvbW90aW9ucyIsImV2ZW50U2VjdGlvbnMiLCJldmVudF9zZWN0aW9ucyIsInNlYXRBbGVydHNBbmRUb29sdGlwc1BlckxhYmVsIiwic2VhdF9hbGVydHMiLCJjcmVhdGVEcm9wRG93blNlbGVjdCIsImRyb3Bkb3duX3NlbGVjdCIsIndvcmtzcGFjZWtleSIsInJlbmRlclNlYXRNYXAiLCJjcmVhdGVDYWxlbmRhciIsImNhbGVuZGFyIiwiYWx0SW5wdXQiLCJjbGlja09wZW5zIiwiYWxsb3dJbnB1dCIsImRhdGVDaGFuZ2VkIiwib25Nb250aENoYW5nZSIsIm1vbnRoQ2hhbmdlZCIsIm9uRGF5Q3JlYXRlIiwiZGF5Q3JlYXRlIiwicHJvcCIsIkpHb1RvTW9udGgiLCJnZXRFbmRPZk1vbnRocyIsImZpcnN0RGF0ZVdpdGhFdmVudCIsImdldEVuZE9mTW9udGgiLCJjdXJNb250aCIsImN1cnJlbnRNb250aCIsIm
8443N1clllYXIiLCJjdXJyZW50WWVhciIsIkpEdWFsRGF0ZXMiLCJkeWVhciIsImRtb250aCIsImR0eXBlIiwiZHVybCIsImdldExhc3REYXkiLCJ5IiwibSIsImdldExhc3RUcnVlRGF5IiwiZGF0ZSIsIm5leHRNb250aCIsImdldEZ1bGxZZWFyIiwiZ2V0TW9udGgiLCJkYXRlWWVhciIsImRhdGVNb250aCIsImRPYmoiLCJkU3RyIiwiZnAiLCJkYXlFbGVtIiwiZm91bmQiLCJkYXRlT2JqIiwiZXZlbnRMaXN0IiwiY3JlYXRlRGF0ZUFzVVRDIiwiaW5uZXJIVE1MIiwiY3JlYXRlRHJvcERvd25BdHRyYWN0aW9uIiwibWludCIsIm1heHQiLCJyZXFldiIsImoiLCJkcm9wZCIsInJlbmRlclRpY2tldFNlbGVjdG9yIiwicmVuZGVyVGlja2V0U2VsZWN0b3JDb21wbGV0ZWQiLCJyZW5kZXJUaWNrZXRTZWxlY3RvckFjdGlvbiIsInNvcnRVc2luZ05lc3RlZFRleHQiLCJjaGlsZFNlbGVjdG9yIiwia2V5U2VsZWN0b3IiLCJ2QSIsInZCIiwiemltYWdlIiwiY2xvbmUiLCJzZWxlY3RlZFByaWNlTGV2ZWxJZHMiLCJwcmljZUJsb2Nrc0FsbCIsInByaWNlQmxvY2tzQXJyIiwibkJsb2NrcyIsImtleVNlYXRzIiwiaXNDYXQiLCJwcmljZUxldmVJZCIsIkFycmF5IiwiaXNBcnJheSIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsInAxIiwiSklzUmVkZWFtIiwiZGVzYyIsImhhc05hbWVXZWlnaHQiLCJwaWNrdXBMb2NhdGlvbnMiLCJwaWNrdXBMb2NhdGlvbnNOb25BcGkiLCJpUHJpY2UiLCJwcm9tb0NvZGUiLCJkcm9wZG93biIsImhhc253IiwiaGFzcHAiLCJ3aXRoRGVzY0RpdiIsIndpdGhvdXREZXNjRGl2IiwiaGFzQmlnIiwic1ZhbCIsInZ2IiwiaW5zZXJ0QWZ0ZXIiLCJldmVudFRpbWVzIiwiZXZlbnRJZHMiLCJwcmVwZW5kIiwiSlRpbWVFbGVtIiwic2VsZWN0ZWRldmVudFByb21vdGlvbnNJZHMiLCJldmlIb3VyIiwiZGVmX2V2IiwidXBkYXRlUGFnZURlc2lnbiIsIm1pblRpbWUiLCJkZWZfZGF0ZSIsImV2ZW50cyIsIkpGb3JtIiwicHJldiIsIm9wYWNpdHlUb0hleCIsImhleENvZGUiLCJnZXRQcmljaW5nQ2F0ZWdvcmllc0FuZENhdGVnb3JpZXNMYWJlbHNBbmRVbmF2YWlsYWJsZUNhdGVnb3JpZXNBbmRTZWF0TGFiZWxzQ2F0ZWdvcmllc0F6dXJlIiwiY2F0ZWdvcmllcyIsInNlbGVjdGVkSG9sZFN1YmNsYXNzSWQiLCJzZWxlY3RlZFRhZ3NJZCIsImNhdGVnb3JpZXNfcHJpY2luZyIsImNhdGVnb3JpZXNfbGFiZWxzIiwic2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50QW5kVXNlZEJsb2NrcyIsInNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudCIsInVzZUJsb2NrIiwic2VhdF9sYWJlbHNfY2F0ZWdvcmllcyIsIm9iamVjdF9jYXRlZ29yaWVzIiwiaWQiLCJjYXRlZ29yeUlkIiwic3RhdHVzSWQiLCJkaXNhYmlsaXR5IiwiYWxlcnQiLCJnYSIsImN1cnJlbnQiLCJrZXlQcmljZSIsInRpY2tldFR5cGUiLCJ0aWNrZXRUeXBlU2luZ3VsYXIiLCJjYXRlZ29yeV9wcmljaW5nIiwiY2F0ZWdvcnlfbGFiZWwiLCJjYXRlZ29yeV9sYWJlbF9ub3QiLCJjb252ZXJ0SGV4IiwiZXZlbnRTZWN0aW9uc0NhcGFjaXR5IiwiZ2V0UHJpY2luZ0NhdGVnb3JpZXNBbmRDYXRlZ29yaWVzTGFiZWxzQW5kVW5hdmFpbGFibGVDYXRlZ29yaWVzQW5kU2VhdExhYmVsc0NhdGVnb3JpZXMiLCJkZXN0cm95Iiwic2VsZWN0ZWRPYmplY3RDaGFydCIsIm9wYWNpdHkiLCJoZXgiLCJyIiwiZyIsIm1hdHJpeFRvQXNjaWlUYWJsZSIsIm9wdGlvbnMiLCJkZWZhdWx0cyIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0IiwiY29sU2VwYXJhdG9yIiwibGluZUJyZWFrIiwiY2VsbCIsImRlZmF1bHRBbGlnbkRpciIsImhyIiwic3RyIiwiZGVmYXVsdE9iaiIsImlzT2JqIiwieCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInJlcGVhdFN0ciIsIndpZHRoIiwiam9pbiIsInN1YnN0ciIsImFsaWduVGV4dCIsInR4dCIsInBhZCIsImRpciIsInBMIiwicFIiLCJjaGFyQXQiLCJjYWxjQ29sdW1uc1dpZHRoIiwibWF0cml4IiwiY29sc1dpZHRoIiwickxlbiIsImNvbHMiLCJjTGVuIiwicGFkZGluZ0xlbmd0aCIsImhyU2VwYXJhdG9yIiwidGFibGUiLCJ1c2VBenVyZSIsImV2ZW50QXJyIiwiY2hhcnRrZXkiLCJldmVudGlkIiwicHJpY2luZ0FsbCIsIm9ycGhhblNlYXQiLCJjb2xvclNjaGVtZSIsImJnY29sb3IiLCJzdGNvbG9yIiwibnRjb2xvciIsImNvbG9yMSIsImNvbG9yMiIsInNlYXRzaW8iLCJTZWF0aW5nQ2hhcnQiLCJkaXZJZCIsIndvcmtzcGFjZUtleSIsInNob3dGdWxsU2NyZWVuQnV0dG9uIiwiYWxsb3dPcnBoYW5TZWF0cyIsImV4dHJhQ29uZmlnIiwicHJpY2luZ0FsbFNlYXRMYWJlbHMiLCJ1bmF2YWlsYWJsZUNhdGVnb3JpZXNTZWF0TGFiZWxzIiwib2JqZWN0Q2F0ZWdvcmllcyIsInVuYXZhaWxhYmxlQ2F0ZWdvcmllcyIsIm9iamVjdENvbG9yIiwib2JqZWN0IiwiZGVmYXVsdENvbG9yIiwiY2F0ZWdvcnkiLCJjb2xvciIsImNhbkdBU2VsZWN0aW9uQmVJbmNyZWFzZWQiLCJnYUFyZWEiLCJkZWZhdWx0VmFsdWUiLCJudW1Cb29rZWQiLCJvYmplY3RJY29uIiwiZGVmYXVsdEljb24iLCJvYmplY3RXaXRob3V0Q2F0ZWdvcnlTZWxlY3RhYmxlIiwib2JqZWN0VG9vbHRpcCIsInNob3dBY3Rpb25IaW50Iiwic2hvd0F2YWlsYWJpbGl0eSIsInNob3dDYXRlZ29yeSIsInNob3dMYWJlbCIsInNob3dQcmljaW5nIiwic2hvd1VuYXZhaWxhYmxlTm90aWNlIiwic3R5bGl6ZWRMYWJlbCIsImNvbmZpcm1TZWxlY3Rpb25Pbk1vYmlsZSIsImNvbG9ycyIsImN1cnNvclRvb2x0aXBCYWNrZ3JvdW5kQ29sb3IiLCJ0b29sdGlwSW5mbyIsImZvcm1hdHRlZFByaWNlIiwic2VhdFNlY3Rpb24iLCJzZWN0aW9uIiwic2VhdFJvdyIsInNlYXRMYWJlbCIsIm93biIsInNlYXRQcmljZSIsInNlYXRQcmljZUYiLCJzZWF0Tm90aWNlIiwic2VhdEFsZXJ0Iiwib25DaGFydFJlbmRlcmVkIiwiY2hhcnQiLCJvbk9iamVjdERlc2VsZWN0ZWQiLCJkZXNlbGVjdGVkVGlja2V0VHlwZSIsIm9uT2JqZWN0U2VsZWN0ZWQiLCJkZXNlbGVjdGVkIiwiY29uZmlybSIsImRlc2VsZWN0IiwicHJpY2VGb3JtYXR0ZXIiLCJyZW5kZXIiLCJzdHlsZSIsImJnQ29sb3IiLCJzdHJva2VDb2xvciIsIm5vdEF2YWlsYWJsZUNvbG9yIiwiYmdDb2xvclNlbGVjdGVkIiwiZm9udCIsImZvbnRGYW1pbHkiLCJmb250V2VpZ2h0Iiwibm90QXZhaWxhYmxlUG9wb3Zlckh0bWwiLCJzaG93Wm9vbU91dEJ1dHRvbiIsIl9hcyIsIm
8443NoYXJ0TGF5b3V0IiwidG9rZW4iLCJjaGFydElkIiwiY29udGFpbmVySWQiLCJldmVudElkIiwicHJpY2VzIiwib2JqZWN0cyIsInRoZW1lIiwib25PYmplY3RDbGljayIsIm9uT2JqZWN0SG92ZXIiLCJtYWluIiwic2VhdCIsImZvb3RlciIsImZ1bGxSZXRhaWxQcmljZSIsInByaWNldCIsInNob3dQb3BvdmVyIiwibXlTZWxlY3RkT2JqZWN0IiwiY2F0SWQiLCJpMiIsIm9vb2JqIiwib2JqSWQiLCJuZXdNeXNlbGVjdGVkT2JqZWN0IiwiaTMiLCJ0b2dnbGVDYXRlZ29yeSIsInRlbXAiLCJuZXdDYXRlZ29yeSIsInRvZ2dsZUNhdGVnb3JpZXMiLCJzZWxlY3RlZFZhbCIsInByaWNlQiIsImtleXAiLCJtaW5UaWNrIiwibWF4VGljayIsIlJ3YkV2ZW50c0Zvcm1Nb2RlbCIsImdldFdhcm5pbmdEaXYiLCJtc2ciLCJzaG93TG9hZGluZyIsInN3YWwiLCJsb2FkaW5nX3RleHQiLCJzaG93U3VjY2VzcyIsInNob3dFcnJvciIsImNsb3NlTW9kYWwiLCJSd2JFdmVudHNGb3JtU3BpbmUiLCJVVEMiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwiZGF0ZWkiLCJkYXRlSW5wdXQiLCJmdWxsWWVhciIsImlzTGVhcFllYXIiLCJmdWxsTW9udGgiLCJvZmZzZXREc3QiLCJpc0RTVCIsInR6T2Zmc2V0IiwiY2hlY2siLCJ0ZXN0IiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwidmVuZG9yIiwib3BlcmEiLCJhcnIiLCJlbGVtIiwiaGVhZCIsImhlYWRUYWJsZSIsImJvZHlUYWJsZSIsImZvb3RlclRhYmxlIiwicm93SHRtbCIsImNvbHNwYW4iLCJjb2wiLCJyb3dIdG1sMSIsInNEYXRlIiwid2l0aFRpbWUiLCJlbGVtZW50VG9wIiwib2Zmc2V0IiwidG9wIiwiZWxlbWVudEJvdHRvbSIsIm91dGVySGVpZ2h0Iiwidmlld3BvcnRUb3AiLCJ2aWV3cG9ydEJvdHRvbSIsImQxIiwiZDIiLCJnZXRQcmljaW5nIiwic2xpY2UiLCJnZXRNYXhTZWxlY3RlZFNlYXRzIiwibWF4U2VsZWN0ZWQiLCJnZXROdW1iZXJPZlBsYWNlc1RvU2VsZWN0IiwiaXNOYU4iLCJnZXRXb3Jrc3BhY2UiLCJnZXRFdmVudEtleSIsImJ0biIsImN1cnJlbnRGb3JtIiwib3duUHJpY2luZ0RhdGEiLCJKRG9jdW1lbnQiLCJKQnRuIiwiSlNlYXRRdHkiLCJKU2VhdERpdiIsIkpQcm9kdWN0SWQiLCJKUXR5VGlja2V0cyIsIkpRdHkiLCJKRmxhdENhbGVuZGFySW5wdXQiLCJ0aW1lX3ZhbCIsIkpTZWF0c01hcCIsImZvcm0iLCJpcyIsIm1haW5Gb3JtIiwibmV4dEFsbCIsInByZXBlbmRUbyJdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxLQUFLO1FBQ0w7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7UUFFQTtRQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUM3REE7QUFBQTtBQUFBOztBQUVBLENBQUMsVUFBVUEsQ0FBVixFQUFhQyxTQUFiLEVBQXdCO0FBQ3JCLFFBQU1DLHVCQUF1QixHQUFHLElBQUlDLDRGQUFKLEVBQWhDO0FBQ0FELHlCQUF1QixDQUFDRSxJQUF4QjtBQUNILENBSEQsRUFHR0MsTUFBTSxDQUFDQyxNQUhWLEU7Ozs7Ozs7QUNGQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUNBLE1BQU1ILHVCQUFOLFNBQXNDSSxtRUFBdEMsQ0FBd0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VBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZFQUE2RTtBQUM3RTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0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BQUNBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEM7O0FBRTVDLHFEQUFxRDs7QUFFckQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFOztBQUVoRSx1REFBdUQ7O0FBRXZEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxtQkFBbUIsNkJBQTZCO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUN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FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EOztBQUVuRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLHFCQUFxQjtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixtQkFBbUI7QUFDeEM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QU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BQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBLG1EQUFtRDs7QUFFbkQ7QUFDQSxnQ0FBZ0M7O0FBRWhDO0FBQ0Esa0JBQWtCO0FBQ2xCLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBLDRDQUE0QztBQUM1QyxLQUFLO0FBQ0wsZ0NBQWdDO0FBQ2hDLEtB
8443QUs7QUFDTCwwQkFBMEI7QUFDMUIsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLDhCQUE4QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2Qzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLCtCQUErQjs7QUFFL0IsK0JBQStCOztBQUUvQiw0QkFBNEIsMERBQTBEOzs7QUFHdEY7QUFDQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDOztBQUVsQztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7O0FBRUwsbUNBQW1DOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYTtBQUNiLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsOEJBQThCO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJCQUEyQjs7QUFFM0I7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBOztBQUVBOztBQUVBLHlFQUF5RSxhQUFhO0FBQ3RGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHLEdBQUc7OztBQUdOLGtEQUFrRDs7O0FBR2xELHNDQUFzQzs7O0FBR3RDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsQ0FBQztBQUNELHFEQUFxRCIsImZpbGUiOiJyd2ItZXZlbnRzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybi
8443BnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL2Fzc2V0cy9qc1wiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDYyMDJlN2VhMTU1MjEzMDVjZDhjIiwiaW1wb3J0IFJ3YkV2ZW50c0Zvcm1Db250cm9sbGVyIGZyb20gJy4vZnJvbnRlbmQvZnJhbWV3b3JrL1J3YkV2ZW50c0Zvcm1Db250cm9sbGVyJztcclxuXHJcbihmdW5jdGlvbiAoJCwgdW5kZWZpbmVkKSB7XHJcbiAgICBjb25zdCByd2JFdmVudHNGb3JtQ29udHJvbGxlciA9IG5ldyBSd2JFdmVudHNGb3JtQ29udHJvbGxlcigpO1xyXG4gICAgcndiRXZlbnRzRm9ybUNvbnRyb2xsZXIuaW5pdCgpO1xyXG59KSh3aW5kb3cualF1ZXJ5KTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vbWFpbl9mcm9udGVuZC5qcyIsImltcG9ydCBSd2JFdmVudHNGb3JtVmlldyBmcm9tIFwiLi9Sd2JFdmVudHNGb3JtVmlld1wiO1xyXG5pbXBvcnQgU3dhbCBmcm9tICdzd2VldGFsZXJ0Mi9kaXN0L3N3ZWV0YWxlcnQyLmpzJ1xyXG5cclxuLyoqXHJcbiAqIENvbnRyb2xsZXIgdGFrZXMgY2FyZSB0byBhdHRhY2ggYW5kIGV4ZWN1dGUgYW55IGFjdGlvbnMgdHJpZ2dlcmVkIG9uIHRoZSBlbGVtZW50IGFuZCBpdHMgY2hpbGRyZW5cclxuICovXHJcbmNsYXNzIFJ3YkV2ZW50c0Zvcm1Db250cm9sbGVyIGV4dGVuZHMgUndiRXZlbnRzRm9ybVZpZXcge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHNjcm9sbFdpbmRvdygpIHtcclxuICAgICAgICBpZiAodGhpcy5pc01vYmlsZSgpKSB7XHJcbiAgICAgICAgICAgIC8vc2VhbWxlc3MuZWxlbWVudFNjcm9sbEJ5KHdpbmRvdywge2xlZnQ6IDAsIHRvcDogLTUwfSk7XHJcbiAgICAgICAgICAgIHNlYW1sZXNzLndpbmRvd1Njcm9sbEJ5KDAsIC01MCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2VhbWxlc3Mud2luZG93U2Nyb2xsQnkoMCwgLTEzMCk7XHJcbiAgICAgICAgICAgIC8vd2luZG93LnNjcm9sbEJ5KDAsIC0xMzApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzY3JvbGxXaW5kb3cyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTW9iaWxlKCkpIHtcclxuICAgICAgICAgICAgLy9zZWFtbGVzcy5lbGVtZW50U2Nyb2xsQnkod2luZG93LCB7bGVmdDogMCwgdG9wOiAtNTB9KTtcclxuICAgICAgICAgICAgc2VhbWxlc3Mud2luZG93U2Nyb2xsQnkoMCwgLTcwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZWFtbGVzcy53aW5kb3dTY3JvbGxCeSgwLCAtMTUwKTtcclxuICAgICAgICAgICAgLy93aW5kb3cuc2Nyb2xsQnkoMCwgLTEzMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmaXhGdWxsU2NyZWVuKCkge1xyXG4gICAgICAgIC8vIFNlbGVjdCB0aGUgbm9kZSB0aGF0IHdpbGwgYmUgb2JzZXJ2ZWQgZm9yIG11dGF0aW9uc1xyXG4gICAgICAgIC8vY29uc3QgdGFyZ2V0Tm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzb21lLWlkJyk7XHJcbiAgICAgICAgaWYgKGpRdWVyeSgnLmNhcm91c2VsJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXROb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNhcm91c2VsJyk7XHJcblxyXG4vLyBPcHRpb25zIGZvciB0aGUgb2JzZXJ2ZXIgKHdoaWNoIG11dGF0aW9ucyB0byBvYnNlcnZlKVxyXG4gICAgICAgICAgICAvL2NvbnN0IGNvbmZpZyA9IHsgYXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH07XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHthdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnY2xhc3MnXX07XHJcblxyXG4vLyBDYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gbXV0YXRpb25zIGFyZSBvYnNlcnZlZFxyXG4gICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGZ1bmN0aW9uIChtdXRhdGlvbnNMaXN0LCBvYnNlcnZlcikge1xyXG4gICAgICAgICAgICAgICAgLy8gVXNlIHRyYWRpdGlvbmFsICdmb3IgbG9vcHMnIGZvciBJRSAxMVxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnNMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9pZiAobXV0YXRpb24udHlwZSA9PT0gJ2F0dHJpYnV0ZXMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnVGhlICcgKyBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lICsgJyBhdHRyaWJ1dGUgd2FzIG1vZGlmaWVkLicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSAnY2xhc3MnICYmIG11dGF0aW9uLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWZ1bGxzY3JlZW4nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJyNoZWFkZXIuc3RpY2t5LWhlYWRlciAuaGVhZGVyLW1haW4uc3RpY2t5JykuY3NzKCd6LWluZGV4JywgJzEnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcubWFwY29sdW1uJykuY3NzKCd6LWluZGV4JywgJy0xJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLmJwcm9kc2VhcmNoaCcpLmNzcygnei1pbmRleCcsICctMScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnI2hlYWRlci5zdGlja3ktaGVhZGVyIC5oZWFkZXItbWFpbi5zdGlja3knKS5jc3MoJ3otaW5kZXgnLCAnMTAwMScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJy5icHJvZHNlYXJjaGgnKS5jc3MoJ3otaW5kZXgnLCAnNCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJy5tYXBjb2x1bW4nKS5jc3MoJ3otaW5kZXgnLCAnMTAwMDAwMDAnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuLy8gQ3JlYXRlIGFuIG9ic2VydmVyIGluc3RhbmNlIGxpbmtlZCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb25cclxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjayk7XHJcblxyXG4vLyBTdGFydCBvYnNlcnZpbmcgdGhlIHRhcmdldCBub2RlIGZvciBjb25maWd1cmVkIG11dGF0aW9uc1xyXG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRhcmdldE5vZGUsIGNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRhdGVSYW5nZShzdGFydERhdGUsIHN0ZXBzID0gMSkge1xyXG4gICAgICAgIGNvbnN0IGRhdGVBcnJheSA9IFtdO1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBsZXQgY3VycmVudERhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUpO1xyXG4gICAgICAgIGxldCBtYXhTdGVwcyA9IDc7XHJcbiAgICAgICAgaWYgKHNlbGYuaXNNb2JpbGUoKSkge1xyXG4gICAgICAgICAgICBtYXhTdGVwcyA9IDU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwID0gMTtcclxuICAgICAgICAvL3doaWxlIChjdXJyZW50RGF0ZSA8PSBuZXcgRGF0ZShlbmREYXRlKSkge1xyXG4gICAgICAgI
8443HdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgICAgIGRhdGVBcnJheS5wdXNoKG5ldyBEYXRlKGN1cnJlbnREYXRlKSk7XHJcbiAgICAgICAgICAgIC8vIFVzZSBVVEMgZGF0ZSB0byBwcmV2ZW50IHByb2JsZW1zIHdpdGggdGltZSB6b25lcyBhbmQgRFNUXHJcbiAgICAgICAgICAgIGN1cnJlbnREYXRlLnNldFVUQ0RhdGUoY3VycmVudERhdGUuZ2V0VVRDRGF0ZSgpICsgc3RlcHMpO1xyXG4gICAgICAgICAgICBpZiAocCA+PSBtYXhTdGVwcykge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcCsrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGVBcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBkYXRlUmFuZ2VQcmV2KHN0YXJ0RGF0ZSwgc3RlcHMgPSAxKSB7XHJcbiAgICAgICAgY29uc3QgZGF0ZUFycmF5ID0gW107XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZSk7XHJcbiAgICAgICAgbGV0IG1heFN0ZXBzID0gNztcclxuICAgICAgICBpZiAoc2VsZi5pc01vYmlsZSgpKSB7XHJcbiAgICAgICAgICAgIG1heFN0ZXBzID0gNTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHAgPSAxO1xyXG4gICAgICAgIC8vd2hpbGUgKGN1cnJlbnREYXRlIDw9IG5ldyBEYXRlKGVuZERhdGUpKSB7XHJcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgICAgICAgZGF0ZUFycmF5LnB1c2gobmV3IERhdGUoY3VycmVudERhdGUpKTtcclxuICAgICAgICAgICAgLy8gVXNlIFVUQyBkYXRlIHRvIHByZXZlbnQgcHJvYmxlbXMgd2l0aCB0aW1lIHpvbmVzIGFuZCBEU1RcclxuICAgICAgICAgICAgY3VycmVudERhdGUuc2V0VVRDRGF0ZShjdXJyZW50RGF0ZS5nZXRVVENEYXRlKCkgLSBzdGVwcyk7XHJcbiAgICAgICAgICAgIGlmIChwID49IG1heFN0ZXBzKSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwKys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGF0ZUFycmF5LnJldmVyc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChqUXVlcnkoJy5ob3RlbG1hcGNvbHVtbicpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZml4RnVsbFNjcmVlbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBqUXVlcnkoJy5iYXR0cmFjdGlvbl9saW5rJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBzZWFtbGVzcy5lbGVtZW50U2Nyb2xsSW50b1ZpZXcoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJwc21jX3dyYXBwZXInKSwge1xyXG4gICAgICAgICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxyXG4gICAgICAgICAgICAgICAgaW5saW5lOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgIGJsb2NrOiAnY2VudGVyJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc2VsZi5zY3JvbGxXaW5kb3coKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAodGhpcy5KQnV5VGlja2V0cygpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlUXR5QWRkVG9DYXJ0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuYnV5VGlja2V0c0FjdGlvbigpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5KRmxhdENhbGVuZGFyKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5KSXNBdHRyYWN0aW9uKCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChqUXVlcnkoJy5uYXZhaWxhYmxlJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLmJwc21fd3JhcHBlcicpLmNsb3Nlc3QoJy53cC1ibG9jay1xdWJlbHktcm93JykucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZSBzY3JvbGwnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpRdWVyeSgnI3RpY2tldHNfc2VsZWN0ZWQnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmlzSW5WaWV3cG9ydChqUXVlcnkoJyN0aWNrZXRzX3NlbGVjdGVkJykpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBzb21ldGhpbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLmJwcm9jZWVkX3RpY2tldHMnKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChzZWxmLmlzTW9iaWxlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLmJwcm9jZWVkX3RpY2tldHMnKS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLkpUaWNrZXRzQ2FydCgpLmhpZGUoKTtcclxuICAgICAgICAgICAgdGhpcy5KUHJpY2VNYXAoKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuSlByaWNlTWFwU2VhdHMoKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuSlByaWNlTWFwRXhwbGFuYXRpb24oKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuSkV2ZW50c1BlckRhdGUoKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuSkV2ZW50U2VsZWN0aW9uKCkuaGlkZSgpO1xyXG4gICAgICAgICAgICB0aGlzLkpFdmVudHNQZXJEYXRlQmVmb3JlVGV4dCgpLmhpZGUoKTtcclxuICAgICAgICAgICAgdGhpcy5KVGlja2V0c0J1dHRvbnNDYXJ0KCkuaGlkZSgpO1xyXG4gICAgICAgICAgICB0aGlzLkpUaWNrZXRzU2VsZWN0ZWRDYXJ0KCkuaGlkZSgpO1xyXG4gICAgICAgICAgICBqUXVlcnkoJ2JvZHknKS5hcHBlbmQoalF1ZXJ5KCc8YSBocmVmPVwiIzBcIiBjbGFzcz1cImJwcm9jZWVkX3RpY2tldHNcIj5Qcm9jZWVkIFdpdGggVGlja2V0czxpIGNsYXNzPVwic2x2IHNsdi1hcnJvdy1yaWdodFwiPjwvaT48L2E+JykpO1xyXG4gICAgICAgICAgICBqUXVlcnkoJy5icHJvY2VlZF90aWNrZXRzJykuaGlkZSgpO1xyXG4gICAgICAgICAgICBqUXVlcnkoJy5icHJvY2VlZF90aWNrZXRzJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgalF1ZXJ5KCdodG1sLGJvZHknKS5hbmltYXRlKHtzY3JvbGxUb3A6IDB9LCAnc2xvdycpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgalF1ZXJ5KCcucmV0dXJuX3RvX2NhbGVuZGFyJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc2VhbWxlc3MuZWxlbWVudFNjcm9sbEludG9WaWV3KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5icHNtY193cmFwcGVyJyksIHtcclxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5saW5lOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICBibG9jazogJ2NlbnRlcidcclxuICAgICAgICAgICAgICAgI
8443H0pO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zY3JvbGxXaW5kb3coKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5KVGhlbWUoKSA9PT0gJ2xpZ2h0Jykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5KQmxhbmtTZWF0c01hcCgpLmh0bWwoJzxpbWcgc3R5bGU9XCJwYWRkaW5nOjgwcHg7XCIgc3JjPVwiL3dwLWNvbnRlbnQvdGhlbWVzL3BvcnRvL2ltYWdlcy9ub19zZWxlY3Rpb25fZGF0ZV90aW1lX2xpZ2h0LnBuZ1wiLz48aDQ+UGljayBhIGRhdGUgdG8gc2VlIHRoZSBhdmFpbGFibGUgdGlja2V0czwvaDQ+Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkpCbGFua1NlYXRzTWFwKCkuaHRtbCgnPGg0PlNlbGVjdCBhIGRhdGUgZnJvbSB0aGUgQ2FsZW5kYXI8L2g0PjxpbWcgc3R5bGU9XCJwYWRkaW5nOjgwcHg7XCIgc3JjPVwiL3dwLWNvbnRlbnQvdGhlbWVzL3BvcnRvL2ltYWdlcy9ub19zZWxlY3Rpb25fZGF0ZV90aW1lLnBuZ1wiLz4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnBvZHMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5mcm9tRGVsZXRlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmluaXRTZWF0c01hcCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNob3dQYWdlQWN0aW9ucygpO1xyXG4gICAgICAgIHRoaXMuaG90ZWxSb29tQWN0aW9ucygpO1xyXG4gICAgICAgIGlmIChqUXVlcnkoXCIjcGVyaW9kc1wiKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHNlbGYuZnBzZWFyY2hTID0galF1ZXJ5KFwiI3BlcmlvZHNcIikuZmxh
8443dHBpY2tyKHtcclxuICAgICAgICAgICAgICAgIG1pbkRhdGU6IFwidG9kYXlcIixcclxuICAgICAgICAgICAgICAgIGRpc2FibGVNb2JpbGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBkYXRlRm9ybWF0OiBcIkQsIE0gZFwiLFxyXG4gICAgICAgICAgICAgICAgc2hvd01vbnRoczogMixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLmlzTW9iaWxlKCkpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuZnBzZWFyY2hTLnNldCgnc2hvd01vbnRocycsIDEpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZi5nZXRQYXJhbWV0ZXJCeU5hbWUoJ3NlYXJjaGNhbGInKSAhPT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzZWxmLkpTZWFyY2hCdXR0b25DYWxlbmRhcigpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRfZGF0ZSA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdjYWxzdGFydF9kYXRlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9sZXQgZW5kX2RhdGUgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnY2FsZW5kX2RhdGUnKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2NhbHR5cGUgPSBzZWxmLnNjYWx0eXBlO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzY2FsY2F0ID0gc2VsZi5zY2FsY2F0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRfZGF0ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY0RhdGUgPSBuZXcgRGF0ZShzdGFydF9kYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY0RhdGUuc2V0VGltZShjRGF0ZS5nZXRUaW1lKCkgKyBzZWxmLmdldFRpbWV6b25lSW5NaWxpc2Vjb25kcyhjRGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2xldCBjRGF0ZWUgPSBuZXcgRGF0ZShlbmRfZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY0RhdGVlLnNldFRpbWUoY0RhdGVlLmdldFRpbWUoKSArIHNlbGYuZ2V0VGltZXpvbmVJbk1pbGlzZWNvbmRzKGNEYXRlZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZwc2VhcmNoUy5zZXREYXRlKGNEYXRlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0ZXNSID0gc2VsZi5kYXRlUmFuZ2Uoc3RhcnRfZGF0ZSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b2RheSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZGF5ID0gdG9kYXkgKyAobmV3IERhdGUoKSkuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwICogMTAwMCAtIHRvZGF5ICUgKDM2MDAgKiAxMDAwICogMjQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGVzUi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29tcGFyZV9hc2MoZGF0ZXNSW2ldLmdldFRpbWUoKSwgdG9kYXkpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnI2JjYWxlbmRhci1zZWN0aW9uJykuYXBwZW5kKGpRdWVyeSgnPGRpdiBjbGFzcz1cImNhbC1jYXJkIGJkaXNhYmxlZFwiIGJiZGF0ZT1cIicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1JbaV0sICdZLW0tZCcpICsgJ1wiPjxzcGFuIGNsYXNzPVwibW9udGhcIj4nICsgZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSW2ldLCAnTScpICsgJzwvc3Bhbj48c3BhbiBjbGFzcz1cImRheVwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1JbaV0sICdkJykgKyAnPC9zcGFuPjxzcGFuIGNsYXNzPVwid2Vla2RcIj4nICsgZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSW2ldLCAnRCcpICsgJzwvc3Bhbj48L2Rpdj4nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnI2JjYWxlbmRhci1zZWN0aW9uJykuYXBwZW5kKGpRdWVyeSgnPGRpdiBjbGFzcz1cImNhbC1jYXJkXCIgYmJkYXRlPVwiJyArIGZsYXRwaWNrci5mb3JtYXREYXRlKGRhdGVzUltpXSwgJ1ktbS1kJykgKyAnXCI+PHNwYW4gY2xhc3M9XCJtb250aFwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1JbaV0sICdNJykgKyAnPC9zcGFuPjxzcGFuIGNsYXNzPVwiZGF5XCI+JyArIGZsYXRwaWNrci5mb3JtYXREYXRlKGRhdGVzUltpXSwgJ2QnKSArICc8L3NwYW4+PHNwYW4gY2xhc3M9XCJ3ZWVrZFwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1JbaV0sICdEJykgKyAnPC9zcGFuPjwvZGl2PicpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNzdGFydF9kYXRlID0gc3RhcnRfZGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jZW5kX2RhdGUgPSBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1JbZGF0ZXNSLmxlbmd0aCAtIDFdLCAnWS1tLWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjY3ByZXZfYnV0Jykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjYmNhbGVuZGFyLXNlY3Rpb24nKS5odG1sKCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b2RheSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2RheSA9IHRvZGF5ICsgKG5ldyBEYXRlKCkpLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MCAqIDEwMDAgLSB0b2RheSAlICgzNjAwICogMTAwMCAqIDI0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVzUjEgPSBzZWxmLmRhdGVSYW5nZVByZXYoc2VsZi5jc3RhcnRfZGF0ZSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNzdGFydF9kYXRlID0gZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSMVswXSwgJ1ktbS1kJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNlbmRfZGF0ZSA9IGZsYXRwaWNrci5mb3JtYXREYXRl
8443KGRhdGVzUjFbZGF0ZXNSMS5sZW5ndGggLSAxXSwgJ1ktbS1kJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRlc1IxLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29tcGFyZV9hc2MoZGF0ZXNSMVtpXS5nZXRUaW1lKCksIHRvZGF5KSA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjYmNhbGVuZGFyLXNlY3Rpb24nKS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwiY2FsLWNhcmQgYmRpc2FibGVkXCIgYmJkYXRlPVwiJyArIGZsYXRwaWNrci5mb3JtYXREYXRlKGRhdGVzUjFbaV0sICdZLW0tZCcpICsgJ1wiPjxzcGFuIGNsYXNzPVwibW9udGhcIj4nICsgZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSMVtpXSwgJ00nKSArICc8L3NwYW4+PHNwYW4gY2xhc3M9XCJkYXlcIj4nICsgZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSMVtpXSwgJ2QnKSArICc8L3NwYW4+PHNwYW4gY2xhc3M9XCJ3ZWVrZFwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1IxW2ldLCAnRCcpICsgJzwvc3Bhbj48L2Rpdj4nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjYmNhbGVuZGFyLXNlY3Rpb24nKS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwiY2FsLWNhcmRcIiBiYmRhdGU9XCInICsgZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSMVtpXSwgJ1ktbS1kJykgKyAnXCI+PHNwYW4gY2xhc3M9XCJtb250aFwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1IxW2ldLCAnTScpICsgJzwvc3Bhbj48c3BhbiBjbGFzcz1cImRheVwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1IxW2ldLCAnZCcpICsgJzwvc3Bhbj48c3BhbiBjbGFzcz1cIndlZWtkXCI+JyArIGZsYXRwaWNrci5mb3JtYXREYXRlKGRhdGVzUjFbaV0sICdEJykgKyAnPC9zcGFuPjwvZGl2PicpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJy5jYWwtY2FyZCcpLnJlbW92ZUNsYXNzKCdkc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnW2JiZGF0ZT1cIicgKyBzZWxmLmRzZWxlY3RlZCArICdcIl0nKS5hZGRDbGFzcygnZHNlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjY25leHRfYnV0Jykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjYmNhbGVuZGFyLXNlY3Rpb24nKS5odG1sKCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b2RheSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2RheSA9IHRvZGF5ICsgKG5ldyBEYXRlKCkpLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MCAqIDEwMDAgLSB0b2RheSAlICgzNjAwICogMTAwMCAqIDI0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVzUjEgPSBzZWxmLmRhdGVSYW5nZShzZWxmLmNlbmRfZGF0ZSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNzdGFydF9kYXRlID0gZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSMVswXSwgJ1ktbS1kJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNlbmRfZGF0ZSA9IGZsYXRwaWNrci5mb3JtYXREYXRlKGRhdGVzUjFbZGF0ZXNSMS5sZW5ndGggLSAxXSwgJ1ktbS1kJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRlc1IxLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29tcGFyZV9hc2MoZGF0ZXNSMVtpXS5nZXRUaW1lKCksIHRvZGF5KSA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjYmNhbGVuZGFyLXNlY3Rpb24nKS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwiY2FsLWNhcmQgYmRpc2FibGVkXCIgYmJkYXRlPVwiJyArIGZsYXRwaWNrci5mb3JtYXREYXRlKGRhdGVzUjFbaV0sICdZLW0tZCcpICsgJ1wiPjxzcGFuIGNsYXNzPVwibW9udGhcIj4nICsgZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSMVtpXSwgJ00nKSArICc8L3NwYW4+PHNwYW4gY2xhc3M9XCJkYXlcIj4nICsgZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSMVtpXSwgJ2QnKSArICc8L3NwYW4+PHNwYW4gY2xhc3M9XCJ3ZWVrZFwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1IxW2ldLCAnRCcpICsgJzwvc3Bhbj48L2Rpdj4nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjYmNhbGVuZGFyLXNlY3Rpb24nKS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwiY2FsLWNhcmRcIiBiYmRhdGU9XCInICsgZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSMVtpXSwgJ1ktbS1kJykgKyAnXCI+PHNwYW4gY2xhc3M9XCJtb250aFwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1IxW2ldLCAnTScpICsgJzwvc3Bhbj48c3BhbiBjbGFzcz1cImRheVwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1IxW2ldLCAnZCcpICsgJzwvc3Bhbj48c3BhbiBjbGFzcz1cIndlZWtkXCI+JyArIGZsYXRwaWNrci5mb3JtYXREYXRlKGRhdGVzUjFbaV0sICdEJykgKyAnPC9zcGFuPjwvZGl2PicpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJy5jYWwtY2FyZCcpLnJlbW92ZUNsYXNzKCdkc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnW2JiZGF0ZT1cIicgKyBzZWxmLmRzZWxlY3RlZCArICdcIl0nKS5hZGRDbGFzcygnZHNlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgI
8443H0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydF9kYXRlICE9PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJ2JvZHknKS5vbignY2hhbmdlJywgJyNzY2FsdHlwZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2NhbHR5cGUgPSBqUXVlcnkodGhpcykudmFsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2NhbF9zZWxlY3RlZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfZGF0ZTogalF1ZXJ5KHRoaXMpLmF0dHIoJ2RkZGF0ZScpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWx0eXBlOiBzZWxmLnNjYWx0eXBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxjYXQ6IHNlbGYuc2NhbGNhdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eTogalF1ZXJ5KCcjcndiX2NhbF9zZWxlY3RlZF9ub25jZScpLnZhbCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnI2JjYWxlbmRhci1zZWN0aW9uLXdyYXBwZXInKS5Mb2FkaW5nT3ZlcmxheShcInNob3dcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkuYWpheCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBiYkxvY2FsLmFqYXhfdXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogalF1ZXJ5LnByb3h5KHNlbGYuY2FsQ29tcGxldGVkLCBzZWxmKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCdib2R5Jykub24oJ2NoYW5nZScsICcjc2NhbGNhdCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2NhbGNhdCA9IGpRdWVyeSh0aGlzKS52YWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnY2FsX3NlbGVjdGVkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9kYXRlOiBqUXVlcnkodGhpcykuYXR0cignZGRkYXRlJyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbHR5cGU6IHNlbGYuc2NhbHR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGNhdDogc2VsZi5zY2FsY2F0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5OiBqUXVlcnkoJyNyd2JfY2FsX3NlbGVjdGVkX25vbmNlJykudmFsKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjYmNhbGVuZGFyLXNlY3Rpb24td3JhcHBlcicpLkxvYWRpbmdPdmVybGF5KFwic2hvd1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5hamF4KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGJiTG9jYWwuYWpheF91cmwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBqUXVlcnkucHJveHkoc2VsZi5jYWxDb21wbGV0ZWQsIHNlbGYpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJ2JvZHknKS5vbignY2xpY2snLCAnLmNhbC1jYXJkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjYmNhbGVuZGFyLXNlY3Rpb24td3JhcHBlcicpLkxvYWRpbmdPdmVybGF5KFwic2hvd1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLmNhbC1jYXJkJykucmVtb3ZlQ2xhc3MoJ2RzZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KHRoaXMpLmFkZENsYXNzKCdkc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZHNlbGVjdGVkID0galF1ZXJ5KHRoaXMpLmF0dHIoJ2JiZGF0ZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdjYWxfc2VsZWN0ZWQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2RhdGU6IGpRdWVyeSh0aGlzKS5hdHRyKCdiYmRhdGUnKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsdHlwZTogc2VsZi5zY2FsdHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsY2F0OiBzZWxmLnNjYWxjYXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHk6IGpRdWVyeSgnI3J3Yl9jYWxfc2VsZWN0ZWRfbm9uY2UnKS52YWwoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
8443HR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogYmJMb2NhbC5hamF4X3VybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGpRdWVyeS5wcm94eShzZWxmLmNhbENvbXBsZXRlZCwgc2VsZilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRzZWxlY3RlZCA9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCdbYmJkYXRlPVwiJyArIHN0YXJ0X2RhdGUgKyAnXCJdJykudHJpZ2dlcignY2xpY2snKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJyNiY2FsZW5kYXItc2VjdGlvbi13cmFwcGVyJykuY3NzKCdkaXNwbGF5JywgJ2dyaWQnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNlbGYuSlNlYXJjaEJ1dHRvbkNhbGVuZGFyKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5KU2VhcmNoQnV0dG9uQ2FsZW5kYXIoKS5vbignY2xpY2snLCBqUXVlcnkucHJveHkoc2VsZi5zZWFyY2hDYWxlbmRhckJ1dHRvbiwgc2VsZikpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChqUXVlcnkoXCIjcGVyaW9kXCIpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgc2VsZi5mcHNlYXJjaCA9IGpRdWVyeShcIiNwZXJpb2RcIikuZmxhdHBpY2tyKHtcclxuICAgICAgICAgICAgICAgIG1vZGU6IFwicmFuZ2VcIixcclxuICAgICAgICAgICAgICAgIG1pbkRhdGU6IFwidG9kYXlcIixcclxuICAgICAgICAgICAgICAgIGRpc2FibGVNb2JpbGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBkYXRlRm9ybWF0OiBcIkQsIE0gZFwiLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uIChzZWxlY3RlZERhdGVzLCBkYXRlU3RyLCBpbnN0YW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmVsZW1lbnQudmFsdWUgPSBkYXRlU3RyLnJlcGxhY2UoJ3RvJywgJy0nKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRlcy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpZmZUaW1lID0gTWF0aC5hYnMoc2VsZWN0ZWREYXRlc1sxXSAtIHNlbGVjdGVkRGF0ZXNbMF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlmZkRheXMgPSBNYXRoLmNlaWwoZGlmZlRpbWUgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRkRGF5cyA9IE1hdGgubWF4KDAsIDEgLSBkaWZmRGF5cyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkRGF5cyA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0ZXNbMV0uc2V0RGF0ZShzZWxlY3RlZERhdGVzWzFdLmdldERhdGUoKSArIGFkZERheXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Uuc2V0RGF0ZShzZWxlY3RlZERhdGVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmp1bXBUb0RhdGUoc2VsZWN0ZWREYXRlc1swXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Uub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc2hvd01vbnRoczogMixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLmlzTW9iaWxlKCkpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuZnBzZWFyY2guc2V0KCdzaG93TW9udGhzJywgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdzZWFyY2hoYicpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoJy5ob3RlbC1jYXJkJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0galF1ZXJ5KHRoaXMpLmF0dHIoJ3B1cmwnKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuSlNlYXJjaEJ1dHRvbigpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRfZGF0ZSA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdoc3RhcnRfZGF0ZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBlbmRfZGF0ZSA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdoZW5kX2RhdGUnKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYWR1bHRzID0gc2VsZi5nZXRQYXJhbWV0ZXJCeU5hbWUoJ2hhZHVsdHMnKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaGNoaWxkcmVuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuYWdlc2EgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaGNoaWxkcmVuYWdlcycpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByb29tcyA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdocm9vbXMnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRfZGF0ZSAhPT0gbnVsbCAmJiBlbmRfZGF0ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY0RhdGUgPSBuZXcgRGF0ZShzdGFydF9kYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY0RhdGUuc2V0VGltZS
8443hjRGF0ZS5nZXRUaW1lKCkgKyBzZWxmLmdldFRpbWV6b25lSW5NaWxpc2Vjb25kcyhjRGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY0RhdGVlID0gbmV3IERhdGUoZW5kX2RhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjRGF0ZWUuc2V0VGltZShjRGF0ZWUuZ2V0VGltZSgpICsgc2VsZi5nZXRUaW1lem9uZUluTWlsaXNlY29uZHMoY0RhdGVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZnBzZWFyY2guc2V0RGF0ZShbY0RhdGUsIGNEYXRlZV0sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYWR1bHRzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnI3NlbGVjdEFkdWx0cycpLnZhbChhZHVsdHMpLnRyaWdnZXIoJ2NoYW5nZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAocm9vbXMgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjc2VsZWN0Um9vbXMnKS52YWwocm9vbXMpLnRyaWdnZXIoJ2NoYW5nZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjc2VsZWN0Q2hpbGRyZW4nKS52YWwoY2hpbGRyZW4pLnRyaWdnZXIoJ2NoYW5nZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5hZ2VzYSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW5hZ2VzID0gY2hpbGRyZW5hZ2VzYS5zcGxpdCgnLScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuYWdlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjY2hpbGRyZW4tZ3Vlc3RzLXNlY3Rpb24gLmd1ZXN0YzplcSgnICsgaSArICcpJykudmFsKGNoaWxkcmVuYWdlc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNjcm9sbCA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdzY3JvbGwnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsID09ICcxJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoalF1ZXJ5KCcuYnBjc193cmFwcGVyJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcuYnBjc193cmFwcGVyJykuY2xvc2VzdCgnLnF1YmVseS1jb2x1bW4taW5uZXInKS5jc3MoJ3BhZGRpbmcnLCAnOHB4Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhbWxlc3MuZWxlbWVudFNjcm9sbEludG9WaWV3KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5icGNzX3dyYXBwZXInKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZTogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrOiAndG9wJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2Nyb2xsV2luZG93MigpO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCA2MDApO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZi5KU2VhcmNoQnV0dG9uKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5KU2VhcmNoQnV0dG9uKCkub24oJ2NsaWNrJywgalF1ZXJ5LnByb3h5KHNlbGYuc2VhcmNoSG90ZWxzQnV0dG9uLCBzZWxmKSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGYuSlBhY2tCdXR0b24oKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkpQYWNrQnV0dG9uKCkub24oJ2NsaWNrJywgalF1ZXJ5LnByb3h5KHNlbGYuc3RhcnRQYWNrQnV0dG9uLCBzZWxmKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBqUXVlcnkoJy5wYWNrX3ByaWNlJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkodGhpcykuaHRtbCgnUGxlYXNlIHdhaXQgYXMgd2UgY2FsY3VsYXRlIHRoZSB2YWx1ZScpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZvbnRzaXplID0galF1ZXJ5KHRoaXMpLmNzcygnZm9udC1zaXplJyk7XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkodGhpcykuY3NzKCdmb250LXNpemUnLCAnMTVweCcpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5jYWxjdWxhdGVQYWNrUHJpY2UoalF1ZXJ5KHRoaXMpLCBmb250c2l6ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgc2hvd1BhZ2VBY3Rpb25zKCkge1xyXG4gICAgICAgIGpRdWVyeSgnYm9keScpLm9uKCdjbGljaycsICcuYmJ2aWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8valF1ZXJ5KCcuYmJ2aWQnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGpRdWVyeS5tYWduaWZpY1BvcHVwLm9wZW4oe1xyXG4gICAgICAgICAgICAgICAgaXRlbXM6IHtcclxuICAgICAgICAgICAgICAgICAgICBzcmM6IGpRdWVyeSgnLmxpZ2h0Yl92aWRlbycpLmh0bWwoKSxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW5saW5lJyxcclxuICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgbWFpbkNsYXNzOiAnYmxvY2tz
8443LWNvbnQtYiBtZnAtZmFkZScsXHJcbiAgICAgICAgICAgICAgICAvL3JlbW92YWxEZWxheTogMTYwLFxyXG4gICAgICAgICAgICAgICAgcHJlbG9hZGVyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3dZOiAnYXV0bycsXHJcbiAgICAgICAgICAgICAgICBmaXhlZENvbnRlbnRQb3M6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBjYWxsYmFja3M6IHtcclxuICAgICAgICAgICAgICAgICAgICBvcGVuOiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBob3RlbFJvb21BY3Rpb25zKCkge1xyXG5cclxuICAgICAgICBqUXVlcnkoJy5yb29tZGV0YWlscycpLmFwcGVuZFRvKCcjY29udGVudCcpO1xyXG4gICAgICAgIGpRdWVyeSgnLnJvb20tY2FyZCAuaW1hZ2Utd3JhcHBlciwgLnJvb20tY2FyZCAuaG90ZWwtdGl0bGUnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCByaWQgPSBqUXVlcnkodGhpcykuYXR0cigncklkJyk7XHJcblxyXG4gICAgICAgICAgICBqUXVlcnkubWFnbmlmaWNQb3B1cC5vcGVuKHtcclxuICAgICAgICAgICAgICAgIGl0ZW1zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBqUXVlcnkoJy5yb29tZGV0YWlsc1tySWQ9JyArIHJpZCArICddJykuaHRtbCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbmxpbmUnLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgICAgICBtYWluQ2xhc3M6ICdibG9ja3MtY29udC1iIG1mcC1mYWRlJyxcclxuICAgICAgICAgICAgICAgIC8vcmVtb3ZhbERlbGF5OiAxNjAsXHJcbiAgICAgICAgICAgICAgICBwcmVsb2FkZXI6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBvdmVyZmxvd1k6ICdhdXRvJyxcclxuICAgICAgICAgICAgICAgIGZpeGVkQ29udGVudFBvczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrczoge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wZW46IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcubWZwLWNvbnRlbnQnKS5maW5kKCcuY2Fyb3VzZWxyJykuZmxpY2tpdHkoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbEFsaWduOiAnbGVmdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHNjcmVlbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBBcm91bmQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENlbGxzOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUxvYWQ6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFNlbGVjdG9yOiAnLmNhcm91c2Vsci1jZWxsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd3JhcEFyb3VuZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVTY3JvbGw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlRG90czogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBqUXVlcnkoJy5yb29tYmFjayAuYmFja2J0bicpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeS5tYWduaWZpY1BvcHVwLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvL2pRdWVyeSgnI2NvbnRlbnQgLnBvcnRvLWJsb2NrOmVxKDApJykuaGlkZSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLkpSb29tUmVzZXJ2ZUJ1dHRvbigpLm9mZignY2xpY2snKS5vbignY2xpY2snLCBqUXVlcnkucHJveHkodGhpcy5yb29tUmVzZXJ2ZUFjdGlvbiwgdGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJvb21SZXNlcnZlQWN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCBySUQsIHBJRCwgclJhdGUsIGVsLCBpc3A7XHJcbiAgICAgICAgaWYgKGpRdWVyeShldmVudC50YXJnZXQpLmF0dHIoJ3JpZCcpKSB7XHJcbiAgICAgICAgICAgIGVsID0galF1ZXJ5KGV2ZW50LnRhcmdldCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZWwgPSBqUXVlcnkoZXZlbnQudGFyZ2V0KS5wYXJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaXNwID0gZWwuYXR0cignaXNwYWNrJyk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBpc3AgPT09ICd1bmRlZmluZWQnIHx8IGlzcCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgaXNwID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcklEID0gZWwuYXR0cigncmlkJyk7XHJcblxyXG4gICAgICAgIHBJRCA9IGVsLmF0dHIoJ3BpZCcpO1xyXG4gICAgICAgIHJSYXRlID0gZWwuYXR0cigncnJhdGUnKTtcclxuICAgICAgICBsZXQgc3RhcnRfZGF0ZSA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdoc3RhcnRfZGF0ZScpO1xyXG4gICAgICAgIGxldCBlbmRfZGF0ZSA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdoZW5kX2RhdGUnKTtcclxuICAgICAgICBsZXQgYWR1bHRzID0gc2VsZi5nZXRQYXJhbWV0ZXJCeU5hbWUoJ2hhZHVsdHMnKTtcclxuICAgICAgICBsZXQgY2hpbGRyZW4gPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaGNoaWxkcmVuJyk7XHJcbiAgICAgICAgbGV0IGNoaWxkcmVuYWdlc2EgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaGNoaWxkcmVuYWdlcycpO1xyXG4gICAgICAgIGxldCByb29tcyA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdocm9vbXMnKTtcclxuICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICBhY3Rpb246ICdyZXNlcnZlX3Jvb20nLFxyXG4gICAgICAgICAgICBwaWQ6IH
8443BJRCxcclxuICAgICAgICAgICAgcmlkOiBySUQsXHJcbiAgICAgICAgICAgIGlzcDogaXNwLFxyXG4gICAgICAgICAgICBycmF0ZTogclJhdGUsXHJcbiAgICAgICAgICAgIHN0YXJ0X2RhdGU6IHN0YXJ0X2RhdGUsXHJcbiAgICAgICAgICAgIGVuZF9kYXRlOiBlbmRfZGF0ZSxcclxuICAgICAgICAgICAgYWR1bHRzOiBhZHVsdHMsXHJcbiAgICAgICAgICAgIHJvb21zOiByb29tcyxcclxuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLFxyXG4gICAgICAgICAgICBjaGlsZHJlbmFnZXM6IGNoaWxkcmVuYWdlc2EsXHJcblxyXG4gICAgICAgICAgICBzZWN1cml0eTogalF1ZXJ5KCcjcndiX3Jlc2VydmVfcm9vbV9ub25jZScpLnZhbCgpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZWwuTG9hZGluZ092ZXJsYXkoXCJzaG93XCIpO1xyXG4gICAgICAgIGpRdWVyeS5hamF4KHtcclxuICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICB1cmw6IGJiTG9jYWwuYWpheF91cmwsXHJcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGpRdWVyeS5wcm94eShzZWxmLnJvb21SZXNlcnZlQ29tcGxldGVkLCBzZWxmKVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8qZWxzZSB7XHJcbiAgICAgICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0Vycm9yIScsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgdGlja2V0JyxcclxuICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09rJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9ICovXHJcbiAgICB9XHJcblxyXG4gICAgcm9vbVJlc2VydmVDb21wbGV0ZWQocmVzcG9uc2UpIHtcclxuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdJbmZvcm1hdGlvbicsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiByZXNwb25zZS5tZXNzYWdlLF
8443xyXG4gICAgICAgICAgICAgICAgaWNvbjogJ2luZm8nLFxyXG4gICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICdPSycsXHJcbiAgICAgICAgICAgICAgICBjbG9zZU9uQ29uZmlybTogdHJ1ZSxcclxuICAgICAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvKiBSZWFkIG1vcmUgYWJvdXQgaXNDb25maXJtZWQsIGlzRGVuaWVkIGJlbG93ICovXHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzQ29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5KUm9vbVJlc2VydmVCdXR0b24oKS5Mb2FkaW5nT3ZlcmxheShcImhpZGVcIiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWxmLkpCdXlCdXR0b24oKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5pc0RlbmllZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU3dhbC5maXJlKCdDaGFuZ2VzIGFyZSBub3Qgc2F2ZWQnLCAnJywgJ2luZm8nKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5pc3AgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gcmVzcG9uc2UudXJsO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjYWxjdWxhdGVQYWNrUHJpY2UoZWxwLCBmb250c2l6ZSkge1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBsZXQgaElELCBlbCwgcGFpcklEO1xyXG4gICAgICAgIGVsID0gZWxwLnBhcmVudCgpLmZpbmQoJy5zdGFydHBhY2stYnV0dG9uJykuZmlyc3QoKTtcclxuICAgICAgICBoSUQgPSBlbC5hdHRyKCdoaWQnKTtcclxuICAgICAgICBwYWlySUQgPSBlbC5hdHRyKCdwYWlyaWQnKTtcclxuICAgICAgICBsZXQgc3RhcnRfZGF0ZSA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdoc3RhcnRfZGF0ZScpO1xyXG4gICAgICAgIGxldCBlbmRfZGF0ZSA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdoZW5kX2RhdGUnKTtcclxuICAgICAgICBsZXQgYWR1bHRzID0gc2VsZi5nZXRQYXJhbWV0ZXJCeU5hbWUoJ2hhZHVsdHMnKTtcclxuICAgICAgICBsZXQgY2hpbGRyZW4gPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaGNoaWxkcmVuJyk7XHJcbiAgICAgICAgbGV0IGNoaWxkcmVuYWdlc2EgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaGNoaWxkcmVuYWdlcycpO1xyXG4gICAgICAgIGxldCByb29tcyA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdocm9vbXMnKTtcclxuICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICBhY3Rpb246ICdwcmljZV9wYWNrYWdlJyxcclxuICAgICAgICAgICAgaGlkOiBoSUQsXHJcbiAgICAgICAgICAgIHBhaXJpZDogcGFpcklELFxyXG4gICAgICAgICAgICBzdGFydF9kYXRlOiBzdGFydF9kYXRlLFxyXG4gICAgICAgICAgICBlbmRfZGF0ZTogZW5kX2RhdGUsXHJcbiAgICAgICAgICAgIGFkdWx0czogYWR1bHRzLFxyXG4gICAgICAgICAgICByb29tczogcm9vbXMsXHJcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcclxuICAgICAgICAgICAgY2hpbGRyZW5hZ2VzOiBjaGlsZHJlbmFnZXNhLFxyXG4gICAgICAgICAgICBzZWN1cml0eTogalF1ZXJ5KCcjcndiX3ByaWNlX3BhY2thZ2Vfbm9uY2UnKS52YWwoKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGVscC5Mb2FkaW5nT3ZlcmxheShcInNob3dcIik7XHJcbiAgICAgICAgalF1ZXJ5LmFqYXgoe1xyXG4gICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgIHVybDogYmJMb2NhbC5hamF4X3VybCxcclxuICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICBlbHAuTG9hZGluZ092ZXJsYXkoXCJoaWRlXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmh0bWwgIT09ICdOb3QgQXZhaWxhYmxlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGVscC5jc3MoJ2ZvbnQtc2l6ZScsIGZvbnRzaXplKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWwucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHAuaHRtbChyZXNwb25zZS5odG1sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGFydFBhY2tCdXR0b24oKSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCBoSUQsIGVsLCBwYWlySUQ7XHJcbiAgICAgICAgZWwgPSBqUXVlcnkoZXZlbnQudGFyZ2V0KTtcclxuXHJcbiAgICAgICAgaElEID0gZWwuYXR0cignaGlkJyk7XHJcbiAgICAgICAgcGFpcklEID0gZWwuYXR0cigncGFpcmlkJyk7XHJcbiAgICAgICAgbGV0IHN0YXJ0X2RhdGUgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaHN0YXJ0X2RhdGUnKTtcclxuICAgICAgICBsZXQgZW5kX2RhdGUgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaGVuZF9kYXRlJyk7XHJcbiAgICAgICAgbGV0IGFkdWx0cyA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdoYWR1bHRzJyk7XHJcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gc2VsZi5nZXRQYXJhbWV0ZXJCeU5hbWUoJ2hjaGlsZHJlbicpO1xyXG4gICAgICAgIGxldCBjaGlsZHJlbmFnZXNhID0gc2VsZi5nZXRQYXJhbWV0ZXJCeU5hbWUoJ2hjaGlsZHJlbmFnZXMnKTtcclxuICAgICAgICBsZXQgcm9vbXMgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaHJvb21zJyk7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICAgICAgYWN0aW9uOiAnc3RhcnRfcGFja2FnZScsXHJcbiAgICAgICAgICAgIGhpZDogaElELFxyXG4gICAgICAgICAgICBwYWlyaWQ6IHBhaXJJRCxcclxuICAgICAgICAgICAgc3RhcnRfZGF0ZTogc3RhcnRfZGF0ZSxcclxuICAgICAgICAgICAgZW5kX2RhdGU6IGVuZF9kYXRlLFxyXG4gICAgICAgICAgICBhZHVsdHM6IGFkdWx0cyxcclxuICAgICAgICAgICAgcm9vbXM6IHJvb21zLFxyXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW4sXHJcbiAgICAgICAgICAgIGNoaWxkcmVuYWdlczogY2hpbGRyZW5hZ2VzYSxcclxuICAgICAgICAgICAgc2VjdXJpdHk6IGpRdWVyeSgnI3J3Yl9zdGFydF9wYWNrYWdlX25vbmNlJykudmFsKClcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBlbC5Mb2FkaW5nT3ZlcmxheShcInNob3dcIik7XHJcbiAgICAgICAgalF1ZXJ5LmFqYXgoe1xyXG4gICAgICAgICAgICB0eX
8443BlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgIHVybDogYmJMb2NhbC5hamF4X3VybCxcclxuICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgc3VjY2VzczogalF1ZXJ5LnByb3h5KHNlbGYuc3RhcnRQYWNrYWdlQ29tcGxldGVkLCBzZWxmKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbENvbXBsZXRlZChyZXNwb25zZSkge1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBqUXVlcnkoJyNiY2FsZW5kYXItc2VjdGlvbi13cmFwcGVyJykuTG9hZGluZ092ZXJsYXkoXCJoaWRlXCIpO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGpRdWVyeSgnI2NhbC1jYXJkLXJlc3VsdCcpLmh0bWwocmVzcG9uc2UuaHRtbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0UGFja2FnZUNvbXBsZXRlZChyZXNwb25zZSkge1xyXG4gICAgICAgIGpRdWVyeSgnYm9keScpLkxvYWRpbmdPdmVybGF5KFwiaGlkZVwiKTtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBsZXQgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKCcmaXNwYWNrPTEnLCAnJyk7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZWFyY2hIb3RlbHNCdXR0b24oKSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChzZWxmLmZwc2VhcmNoICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBsZXQgZGF0ZXMgPSBzZWxmLmZwc2VhcmNoLnNlbGVjdGVkRGF0ZXM7XHJcbiAgICAgICAgICAgIC8vYWxlcnQoZGF0ZXNbMF0gKyAnLScgKyBkYXRlc1sxXSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0X2RhdGUgPSBzZWxmLmZwc2VhcmNoLmZvcm1hdERhdGUoZGF0ZXNbMF0sICdZLW0tZCcpO1xyXG4gICAgICAgICAgICBjb25zdCBlbmRfZGF0ZSA9IHNlbGYuZnBzZWFyY2guZm9ybWF0RGF0ZShkYXRlc1sxXSwgJ1ktbS1kJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGFkdWx0cyA9IGpRdWVyeSgnI3NlbGVjdEFkdWx0cycpLnZhbCgpO1xyXG4gICAgICAgICAgICBjb25zdCByb29tcyA9IGpRdWVyeSgnI3NlbGVjdFJvb21zJykudmFsKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0galF1ZXJ5KCcjc2VsZWN0Q2hpbGRyZW4nKS52YWwoKTtcclxuICAgICAgICAgICAgbGV0IGNoaWxkcmVuYWdlcyA9ICcnO1xyXG4gICAgICAgICAgICBqUXVlcnkoJyNjaGlsZHJlbi1ndWVzdHMtc2VjdGlvbiAuZ3Vlc3RjJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbmFnZXMgKz0galF1ZXJ5KHRoaXMpLnZhbCgpICsgJy0nO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY2hpbGRyZW5hZ2VzID0gY2hpbGRyZW5hZ2VzLnN1YnN0cmluZygwLCBjaGlsZHJlbmFnZXMubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSAnJztcclxuICAgICAgICAgICAgaWYgKHN0YXJ0X2RhdGUgIT09ICcnICYmIGVuZF9kYXRlICE9PSAnJyAmJiBhZHVsdHMgIT09ICcnICYmIGFkdWx0cyAhPT0gJzAnICYmIHJvb21zICE9PSAnJyAmJiByb29tcyAhPT0gJzAnKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSAnP3NlYXJjaGhiPTEmaHN0YXJ0X2RhdGU9JyArIHN0YXJ0X2RhdGUgKyAnJmhlbmRfZGF0ZT0nICsgZW5kX2RhdGUgKyAnJmhhZHVsdHM9JyArIGFkdWx0cyArICcmaHJvb21zPScgKyByb29tcztcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAhPT0gJycgJiYgY2hpbGRyZW4gIT09ICcwJyAmJiBjaGlsZHJlbmFnZXMgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zICs9ICcmaGNoaWxkcmVuPScgKyBjaGlsZHJlbiArICcmaGNoaWxkcmVuYWdlcz0nICsgY2hpbGRyZW5hZ2VzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJ3BhY2thZ2VzJykgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zICs9ICcmaXNwYWNrPTEnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocGFyYW1zICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zICs9ICcmc2Nyb2xsPTEnO1xyXG4gICAgICAgICAgICAgICAgaWYgKGpRdWVyeSgnYm9keScpLmhhc0NsYXNzKCdzaW5nbGUtcHJvZHVjdCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJiID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJiLmluZGV4T2YoJz8nKSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmIgPSBiYi5zcGxpdChcIj9cIilbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYmIgKyBwYXJhbXM7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArICcvaG90ZWxzLycgKyBwYXJhbXM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2VhcmNoQ2FsZW5kYXJCdXR0b24oKSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChzZWxmLmZwc2VhcmNoUyAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgbGV0IGRhdGVzID0gc2VsZi5mcHNlYXJjaFMuc2VsZWN0ZWREYXRlcztcclxuICAgICAgICAgICAgLy9hbGVydChkYXRlc1swXSArICctJyArIGRhdGVzWzFdKTtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnRfZGF0ZSA9IHNlbGYuZnBzZWFyY2hTLmZvcm1hdERhdGUoZGF0ZXNbMF0sICdZLW0tZCcpO1xyXG4gICAgICAgICAgICAvL2NvbnN0IGVuZF9kYXRlID0gc2VsZi5mcHNlYXJjaFMuZm9ybWF0RGF0ZShkYXRlc1sxXSwgJ1ktbS1kJyk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcGFyYW1zID0gJyc7XHJcbiAgICAgICAgICAgIGlmIChzdGFydF9kYXRlICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zICs9ICc/c2VhcmNoY2FsYj0xJmNhbHN0YXJ0X2RhdGU9JyArIHN0YXJ0X2RhdGU7XHJcbiAgICAgICAgICAgI
8443H1cclxuXHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignYWFhLnNwb3RsaWdodC52ZWdhcycpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJ2h0dHBzOi8vc3BvdGxpZ2h0LnZlZ2FzL3Nob3dzL2NhbGVuZGFyLycgKyBwYXJhbXM7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJ2h0dHBzOi8vYWFhLnNwb3RsaWdodC52ZWdhcy9zaG93cy1jYWxlbmRhci8nICsgcGFyYW1zO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFBhcmFtZXRlckJ5TmFtZShuYW1lLCB1cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZikge1xyXG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1tcXFtcXF1dL2csICdcXFxcJCYnKTtcclxuICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKCdbPyZdJyArIG5hbWUgKyAnKD0oW14mI10qKXwmfCN8JCknKSxcclxuICAgICAgICAgICAgcmVzdWx0cyA9IHJlZ2V4LmV4ZWModXJsKTtcclxuICAgICAgICBpZiAoIXJlc3VsdHMpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGlmICghcmVzdWx0c1syXSkgcmV0dXJuICcnO1xyXG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocmVzdWx0c1syXS5yZXBsYWNlKC9cXCsvZywgJyAnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNQYWNrKCkge1xyXG4gICAgICAgIGlmIChqUXVlcnkoJyNwYWNrX2Rpc2NvdW50cycpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwYWNrU3RhcnREYXRlKCkge1xyXG4gICAgICAgIGxldCBzdGFydF9kYXRlID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGpRdWVyeSgnI3BhY2tfZGlzY291bnRzJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBzdGFydF9kYXRlID0gbmV3IERhdGUoalF1ZXJ5KCcjcGFja19kaXNjb3VudHMnKS5hdHRyKCdzdGFydF9kYXRlJykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RhcnRfZGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBwYWNrRW5kRGF0ZSgpIHtcclxuICAgICAgICBsZXQgZW5kX2RhdGUgPSBmYWxzZTtcclxuICAgICAgICBpZiAoalF1ZXJ5KCcjcGFja19kaXNjb3VudHMnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGVuZF9kYXRlID0gbmV3IERhdGUoalF1ZXJ5KCcjcGFja19kaXNjb3VudHMnKS5hdHRyKCdlbmRfZGF0ZScpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVuZF9kYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlckV2ZW50cygpIHtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgbGV0IHBJRDtcclxuICAgICAgICBpZiAoc2VsZi5KSXNBdHRyYWN0aW9uKCkpIHtcclxuICAgICAgICAgICAgcElEID0galF1ZXJ5KCcjYXR0cmFjdGlvbl9pZCcpLmF0dHIoJ3BpZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHBJRCA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdwcm9kdWN0X2lkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgIGFjdGlvbjogJ3NlYXRfc2VsZWN0aW9uX21hcCcsXHJcbiAgICAgICAgICAgIHByb2R1Y3RfaWQ6IHBJRCxcclxuICAgICAgICAgICAgc2VjdXJpdHk6IGpRdWVyeSgnI3J3Yl9zZWF0X3NlbGVjdGlvbl9tYXBfbm9uY2UnKS52YWwoKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgalF1ZXJ5KCdib2R5JykuTG9hZGluZ092ZXJsYXkoXCJzaG93XCIpO1xyXG4gICAgICAgIGpRdWVyeS5hamF4KHtcclxuICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICB1cmw6IGJiTG9jYWwuYWpheF91cmwsXHJcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGpRdWVyeS5wcm94eShzZWxmLnJlbmRlckV2ZW50c0NvbXBsZXRlZCwgc2VsZilcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJTZWF0Q2hhcnQoZXZlbnRfaWQpIHtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMuY3JlYXRlRGVzdHJveVNlYXRDaGFydCgpO1xyXG4gICAgICAgIHRoaXMuSlRpY2tldHNDYXJ0KCkuaGlkZSgpO1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgIGFjdGlvbjogJ2V2ZW50X3NlYXRzJyxcclxuICAgICAgICAgICAgcHJvZHVjdF9pZDogc2VsZi5nZXRQYXJhbWV0ZXJCeU5hbWUoJ3Byb2R1Y3RfaWQnKSxcclxuICAgICAgICAgICAgZXZlbnRfaWQ6IGV2ZW50X2lkLFxyXG4gICAgICAgICAgICBzZWN1cml0eTogalF1ZXJ5KCcjcndiX2V2ZW50X3NlYXRzX25vbmNlJykudmFsKClcclxuICAgICAgICB9O1xyXG4gICAgICAgIGpRdWVyeSgnYm9keScpLkxvYWRpbmdPdmVybGF5KFwic2hvd1wiKTtcclxuICAgICAgICBqUXVlcnkuYWpheCh7XHJcbiAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgdXJsOiBiYkxvY2FsLmFqYXhfdXJsLFxyXG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxyXG4gICAgICAgICAgICBzdWNjZXNzOiBqUXVlcnkucHJveHkoc2VsZi5yZW5kZXJTZWF0Q2hhcnRDb21wbGV0ZWQsIHNlbGYpXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJDYXJ0KCkge1xyXG5cclxuICAgICAgICB0aGlzLnBvZHMgPSBbXTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRMYWJlbCA9IGpRdWVyeSh0aGlzKS5hdHRyKCdsYWJlbCcpO1xyXG4gICAgICAgIC8vaXQgd2lsbCBjbGVhciB0aGUgd2hvbGUgY2FydCBiZWNhdXNlIHRoZSBzZWF0cyBhcmUgYXV0byBhZGRlZFxyXG4gICAgICAgIGxldCBzZWxsYWIgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IGsgaW4gdGhpcy5zZWxlY3RlZExhYmVscykge1xyXG4gICAgICAgICAgICBzZWxsYWIucHVzaCh0aGlzLnNlbGVjdGVkTGFiZWxzW2tdWydsYWJlbCddKVxyXG4gICAgICAgI
8443H1cclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2VhdENoYXJ0LmRlc2VsZWN0T2JqZWN0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWF0Q2hhcnQuZGVzZWxlY3RPYmplY3RzKHNlbGxhYik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdEJhc2VkT25Ecm9wRG93bihzZWxlY3RlZFNlYXRzKSB7XHJcbiAgICAgICAgLy91cGRhdGUgdGlja2V0c19jYXJ0IHdpdGggYnV0dG9ucyBhbmQgYWxsXHJcbiAgICAgICAgbGV0IGM7XHJcbiAgICAgICAgbGV0IHA7XHJcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBsZXQgdG90YWxQcmljZSA9IDA7XHJcbiAgICAgICAgbGV0IGhhc1R5cGUgPSBmYWxzZTtcclxuICAgICAgICBsZXQgdHlwZXNTZWF0ID0gW107XHJcbiAgICAgICAgbGV0IHNlbGVjdFNlYXRzTGFiZWxPbmx5ID0gW107XHJcbiAgICAgICAgbGV0IGV4aXN0aW5nU2VhdHMgPSBbXTtcclxuICAgICAgICBsZXQgdG90YWxUaWNrZXRzID0gMDtcclxuICAgICAgICBmb3IgKGMgPSAwOyBjIDwgc2VsZWN0ZWRTZWF0cy5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgICAgICBsZXQgbGFiZWwgPSB7fTtcclxuXHJcbiAgICAgICAgICAgIGxhYmVsLmxhYmVsID0gc2VsZWN0ZWRTZWF0c1tjXS5sYWJlbDtcclxuICAgICAgICAgICAgbGFiZWwucXR5ID0gMTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleGlzdGluZ1NlYXRzW3NlbGVjdGVkU2VhdHNbY10udXVpZF0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHNlbGVjdGVkU2VhdHNbY10ubnVtU2VsZWN0ZWQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICBsYWJlbC5xdHkgPSBzZWxlY3RlZFNlYXRzW2NdLm51bVNlbGVjdGVkO1xyXG4gICAgICAgICAgICAgICAgbGFiZWwubGFiZWxvcmlnID0gbGFiZWwubGFiZWw7XHJcbiAgICAgICAgICAgICAgICBsYWJlbC5sYWJlbCArPSAnKCcgKyBzZWxlY3RlZFNlYXRzW2NdLm51bVNlbGVjdGVkICsgJyknO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleGlzdGluZ1NlYXRzW3NlbGVjdGVkU2VhdHNbY10udXVpZF0gPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdTZWF0c1tzZWxlY3RlZFNlYXRzW2NdLnV1aWRdID0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdG90YWxUaWNrZXRzICs9IGxhYmVsLnF0eTtcclxuICAgICAgICAgICAgc2VsZWN0U2VhdHNMYWJlbE9ubHkucHVzaChsYWJlbC5sYWJlbCk7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsZWN0ZWRTZWF0c1tjXS5wcmljaW5nICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBzZWxlY3RlZFNlYXRzW2NdLnByaWNpbmcudGlja2V0VHlwZXMgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBzZWxlY3RlZFNlYXRzW2NdLnByaWNpbmcudGlja2V0VHlwZXMubGVuZ3RoOyBwKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTZWF0c1tjXS5wcmljaW5nLnRpY2tldFR5cGVzW3BdWyd0aWNrZXRUeXBlJ10gPT09IHNlbGVjdGVkU2VhdHNbY10uc2VsZWN0ZWRUaWNrZXRUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLnByaWNlID0gbGFiZWwucXR5ICogc2VsZWN0ZWRTZWF0c1tjXS5wcmljaW5nLnRpY2tldFR5cGVzW3BdWydwcmljZSddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbC50eXBlID0gc2VsZWN0ZWRTZWF0c1tjXS5wcmljaW5nLnRpY2tldFR5cGVzW3BdWyd0aWNrZXRUeXBlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLnR5cGVuID0gbGFiZWwudHlwZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmluQXJyYXkodHlwZXNTZWF0LCBsYWJlbC50eXBlKSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1R5cGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzU2VhdC5wdXNoKGxhYmVsLnR5cGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFByaWNlICs9IGxhYmVsLnF0eSAqIHBhcnNlRmxvYXQobGFiZWwucHJpY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxhYmVsLnR5cGVuID0gc2VsZi50aWNrZXRUeXBlQWxsO1xyXG4gICAgICAgICAgICAgICAgbGFiZWwucHJpY2UgPSBsYWJlbC5xdHkgKiBzZWxlY3RlZFNlYXRzW2NdLnByaWNpbmdbJ3ByaWNlJ107XHJcbiAgICAgICAgICAgICAgICB0b3RhbFByaWNlICs9IHBhcnNlRmxvYXQobGFiZWwucHJpY2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKGxhYmVsKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbGYuc2VsZWN0ZWRMYWJlbHMgPSBsYWJlbHM7XHJcbiAgICAgICAgbGV0IG51bWJlck9mU2VsZWN0ZWRTZWF0cyA9IHNlbGYuc2VsZWN0ZWRMYWJlbHMubGVuZ3RoO1xyXG5cclxuICAgICAgICBsZXQgU2Nyb2xsRnJvbUJvdHRvbSA9IGpRdWVyeShkb2N1bWVudCkuaGVpZ2h0KCkgLSBqUXVlcnkod2luZG93KS5zY3JvbGxUb3AoKTtcclxuICAgICAgICBsZXQgdGFibGVIZWlnaHQgPSBqUXVlcnkoJyN0aWNrZXRzX3NlbGVjdGVkJykuaGVpZ2h0KCk7XHJcbiAgICAgICAgc2VsZi5KVGlja2V0c1NlbGVjdGVkQ2FydCgpLmh0bWwoJycpO1xyXG4gICAgICAgIHNlbGYuSlRpY2tldHNCdXR0b25zQ2FydCgpLmh0bWwoJycpO1xyXG4gICAgICAgIGlmIChudW1iZXJPZlNlbGVjdGVkU2VhdHMgPT09IDApIHtcclxuXHJcbiAgICAgICAgICAgIHNlbGYuSlRpY2tldHNTZWxlY3RlZENhcnQoKS5odG1sKCcnKTtcclxuICAgICAgICAgICAgc2VsZi5KVGlja2V0c0J1dHRvbnNDYXJ0KCkuaGlkZSgpO1xyXG4gICAgICAgICAgICBzZWxmLmNyZWF0ZVByaWNpbmdNYXAoKTtcclxuICAgICAgICAgICAgalF1ZXJ5KCcuYnByb2NlZWRfdGlja2V0cycpLmhpZGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZWxmLkpUaWNrZXRzU2VsZWN0ZWRDYXJ0KCkuc2hvdygpO1xyXG4gICAgICAgICAgICBzZWxmLkpUaWNrZXRzQnV0dG9uc0NhcnQoKS5zaG93KCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgaGVhZGVycyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaGVhZGVycy5wdXNoKHsnbGFiZWwnOiAnJ30pO1xyXG4gICAgICAgICAgICBoZWFkZXJzLnB1c2goeydsYWJlbCc6ICdTZWN0aW9uJ30pO1xyXG4gICAgICAgICAgICBoZWFkZXJzLnB1c2goeydsYWJlbCc6ICdSb3cnfSk7XHJcbiAgICAgICAgICAgIGhlYWRlcnMucHVzaCh7J2xhYmVsJzogJ1NlYXQnfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaGFzVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKHsnbGFiZWwnOiAnVHlwZSd9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBoZWFkZXJzLnB1c2goeydsYWJlbCc6ICdQcmljZSd9KTtcclxuICAgICAgICAgICAgbGV0IHJvd3MgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrIGluIHNlbGYuc2VsZWN0ZWRMYWJlbHMpIHtcclxuICAgICAgICAgICAgICAgIGxldCByb3cgPSBbXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1ckxhYmVsID0gc2VsZi5zZWxlY3RlZExhYmVsc1trXTtcclxuICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IGN1ckxhYmVsWydsYWJlbCddLnNwbGl0KCctJyk7XHJcbiAgICAgICAgICAgICAgICByb3dbJ2NvbHVtbnMnXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgcm93Wydjb2x1bW5zJ10ucHVzaCgnPGkgc3R5bGU9XCJjdXJzb3I6cG9pbnRlclwiIGNsYXNzPVwiZmFyIGZhLXRyYXNoLWFsdCBkZWxldGVUaWNrZXRcIiBsYWJlbD1cIicgKyBjdXJMYWJlbFsnbGFiZWwnXSArICdcIj48L2k+Jyk7XHJcbiAgICAgICAgICAgICAgICByb3dbJ2NvbHVtbnMnXS5wdXNoKGxhYmVsWzBdKTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGFiZWxbMV0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93Wydjb2x1bW5zJ10ucHVzaChsYWJlbFsxXSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgI
8443HJvd1snY29sdW1ucyddLnB1c2goJycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsYWJlbFsyXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICByb3dbJ2NvbHVtbnMnXS5wdXNoKGxhYmVsWzJdKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93Wydjb2x1bW5zJ10ucHVzaCgnJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaGFzVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvd1snY29sdW1ucyddLnB1c2goY3VyTGFiZWxbJ3R5cGUnXSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc1BhY2soKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvd1snY29sdW1ucyddLnB1c2goJyQnICsgcGFyc2VGbG9hdChjdXJMYWJlbFsncHJpY2UnXSkudG9GaXhlZCgyKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcCA9IHBhcnNlRmxvYXQoY3VyTGFiZWxbJ3ByaWNlJ10pLnRvRml4ZWQoMikgLSBzZWxmLmluaXRQYWNrUHJpY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBwID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93Wydjb2x1bW5zJ10ucHVzaCgnSU5DTFVERUQnKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dbJ2NvbHVtbnMnXS5wdXNoKCcrJCcgKyBwcC50b0ZpeGVkKDIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByb3dzLnB1c2gocm93KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIGxldCBmb290ZXJzID0gW107XHJcbiAgICAgICAgICAgIGZvb3RlcnMucHVzaCh7J2xhYmVsJzogdG90YWxUaWNrZXRzICsgJyBUaWNrZXRzJywgJ2NvbHNwYW4nOiAzfSk7XHJcbiAgICAgICAgICAgIGlmICghc2VsZi5pc1BhY2soKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGhhc1R5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb290ZXJzLnB1c2goeydsYWJlbCc6ICdTdWJ0b3RhbDogJCcgKyBwYXJzZUZsb2F0KHRvdGFsUHJpY2UpLnRvRml4ZWQoMiksICdjb2xzcGFuJzogM30pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmb290ZXJzLnB1c2goeydsYWJlbCc6ICdTdWJ0b3RhbDogJCcgKyBwYXJzZUZsb2F0KHRvdGFsUHJpY2UpLnRvRml4ZWQoMiksICdjb2xzcGFuJzogMn0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IHBwID0gcGFyc2VGbG9hdCh0b3RhbFByaWNlKS50b0ZpeGVkKDIpIC0gc2VsZi5pbml0UGFja1ByaWNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBwID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb290ZXJzLnB1c2goeydsYWJlbCc6ICdTdWJ0b3RhbDogSU5DTFVERUQnLCAnY29sc3Bhbic6IDN9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb290ZXJzLnB1c2goeydsYWJlbCc6ICdTdWJ0b3RhbDogSU5DTFVERUQnLCAnY29sc3Bhbic6IDJ9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvb3RlcnMucHVzaCh7J2xhYmVsJzogJ1N1YnRvdGFsOiArJCcgKyBwcC50b0ZpeGVkKDIpLCAnY29sc3Bhbic6IDN9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb290ZXJzLnB1c2goeydsYWJlbCc6ICdTdWJ0b3RhbDogKyQnICsgcHAudG9GaXhlZCgyKSwgJ2NvbHNwYW4nOiAyfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzZWxmLkpUaWNrZXRzU2VsZWN0ZWRDYXJ0KCkuYXBwZW5kKHNlbGYuY3JlYXRlSHRtbFRhYmxlKCd0aWNrZXRzX3NlbGVjdGVkJywgaGVhZGVycywgcm93cywgZm9vdGVycykpO1xyXG4gICAgICAgICAgICBzZWxmLkpUaWNrZXRzU2VsZWN0ZWRUYWJsZSgpLmZpbmQoJy5kZWxldGVUaWNrZXQnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAvL3NlbGYuY2xlYXJDYXJ0KCk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLmZyb21EZWxldGUgPSBzZWxmLnNlbGVjdGVkTGFiZWxzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IGpRdWVyeSh0aGlzKS5hdHRyKCdsYWJlbCcpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrMSBpbiBzZWxmLnNlbGVjdGVkTGFiZWxzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VyTGFiZWwgPSBzZWxmLnNlbGVjdGVkTGFiZWxzW2sxXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VyTGFiZWxbJ2xhYmVsJ10gPT09IGxhYmVsICYmIHR5cGVvZiBjdXJMYWJlbFsnbGFiZWxvcmlnJ10gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gY3VyTGFiZWxbJ2xhYmVsb3JpZyddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuSkZyZWVTZWF0aW5nKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcG9kcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga3AgaW4gc2VsZi5wb2RzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga3BwIGluIHNlbGYucG9kc1trcF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBvZHNba3BdW2twcF0gPT09IGxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9kcyA9IHNlbGYucG9kc1trcF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLnNlYXRDaGFydC5kZXNlbGVjdE9iamVjdHMgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VhdENoYXJ0LmRlc2VsZWN0T2JqZWN0cyhwb2RzKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpbzEgPSAxOyBpbzEgPCBwb2RzLmxlbmd0aDsgaW8xKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlT2JqUXVhbnRpdHkocG9kc1tpbzFdLCAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLnNlYXRDaGFydC5kZXNlbGVjdE9iamVjdHMgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VhdENoYXJ0LmRlc2VsZWN0T2JqZWN0cyhbbGFiZWxdKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU9ialF1YW50aXR5KGxhYmVsLCAwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlbGYuc2VhdENoYXJ0Lmxpc3RTZWxlY3RlZE9iamVjdHMgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWF0Q2hhcnQubGlzdFNlbGVjdGVkT2JqZWN0cyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHNlbGVjdGVkT2JqZWN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jaGVjayB0aGUgc2VsZWN0ZWQgc2VhdHMgYW5kIGlmIHRoZSBudW1iZXIgaXMgc21hbGxlciBzZWxlY3QgYmFzZWQgb24gcmFuaywgYW5kIG5lYXJlc3RcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdEJhc2VkT25Ecm9wRG93bihzZWxlY3RlZE9iamVjdHMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0QmFzZWRPbkRyb3BEb3duKHNlbGYubXlzZWxlY3RlZE9iamVjdHMpO1xyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8qaWYgKHNlbGYuSklzQXR0cmFjdGlvbigpIHx8IHNlbGYuSlpvbmVJbWFnZSgpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc01vYmlsZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5KVGlja2V0c0J1dHRvbnNDYXJ0KCkuYXBwZW5kKGpRdWVyeSgnPGRpdiBjbGFzcz1cImJlc3RfcHJpY2VfZ3VhcmFudGVlZFwiPiA8c3BhbiBjbGFzcz1cInNsdiBzbHYtY2hlY2stY2lyY2xlXCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwiYmJfbGlua19wcm9kdWN0X3RleHRcIj5CZXN0IHByaWNlIGd1YXJhbnRlZWQ8L3NwYW4+IDwvZGl2PicpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5KVGlja2V0c0J1dHRvbnNDYXJ0KCkucGFyZW50KCkuYXBwZW5kKGpRdWVyeSgnPGRpdiBjbGFzcz1cImJlc3RfcHJpY2VfZ3VhcmFudGVlZFwiPiA8c3BhbiBjbGFzcz1cInNsdiBzbHYtY2hlY2stY2lyY2xlXCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwiYmJfbGlua19wcm9kdWN0X3RleHRcIj5CZXN0IHByaWNlIGd1YXJhbnRlZWQ8L3NwYW4+IDwvZGl2PicpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSovXHJcblxyXG4gICAgICAgICAgICBzZWxmLkpUaWNrZXRzQnV0dG9uc0NhcnQoKS5hcHBlbmQoalF1ZXJ5KCc8YSBocmVmPVwiIzBcIiBjbGFzcz1cInNhZGRjYXJ0XCI+QWRkIFRvIENhcnQ8L2E+JykpLmFwcGVuZChqUXVlcnkoJzxhIGhyZWY9XCIjMFwiIGNsYXNzPVwic2J1eW5vd1wiPkJ1eSBOb3c8L2E+JykpOy8vLmFwcGVuZChqUXVlcnkoJzxhIGhyZWY9XCIjMFwiIGNsYXNzPVwiYnV0dG9uIGJ0biBzYWRkX3RvX2NhcnRfYnRuXCI+QWRkIFRvIENhcnQ8L2E+JykpXHJcbiAgICAgICAgICAgIC8valF1ZXJ5KCdodG1sLGJvZHknKS5hbmltYXRlKHtzY3JvbGxUb3A6IDB9LCAnc2xvdycpO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5KSXNBdHRyYWN0aW9uKCkgfHwgc2VsZi5KWm9uZUltYWdlKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5KQnV5QnV0dG9uKCkub2ZmKCdjbGljaycpLm9uKCdjbGljaycsIGpRdWVyeS5wcm94eSh0aGlzLmJ1eU5vd0FjdGlvbkEsIHRoaXMpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuSkFkZFRvQ2FydEJ1dHRvbigpLm9mZignY2xpY2snKS5vbignY2xpY2snLCBqUXVlcnkucHJveHkodGhpcy5hZGRUb0NhcnRBY3Rpb25BLCB0aGlzKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkpCdXlCdXR0b24oKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgalF1ZXJ5LnByb3h5KHRoaXMuYnV5Tm93QWN0aW9uLCB0aGlzKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkpBZGRUb0NhcnRCdXR0b24oKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgalF1ZXJ5LnByb3h5KHRoaXMuYWRkVG9DYXJ0QWN0aW9uLCB0aGlzKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChqUXVlcnkoJyN0aWNrZXRzX3NlbGVjdGVkJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNJblZpZXdwb3J0KGpRdWVyeSgnI3RpY2tldHNfc2VsZWN0ZWQnKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBkbyBzb21ldGhpbmdcclxuICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJy5icHJvY2VlZF90aWNrZXRzJykuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJy5icHJvY2VlZF90aWNrZXRzJykuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZi5pc01vYmlsZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkod2luZG93KS5zY3JvbGxUb3AoalF1ZXJ5KGRvY3VtZW50KS5oZWlnaHQoKSAtIFNjcm9sbEZyb21Cb3R0b20gLSAyMCk7XHJcbiAgICAgICAgICAgI
8443H1cclxuXHJcbiAgICAgICAgICAgIGlmICghc2VsZi5KRnJlZVNlYXRpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWROdW1iZXJPZlRpY2tldHMgLSBudW1iZXJPZlNlbGVjdGVkU2VhdHMgJSBzZWxmLnNlbGVjdGVkTnVtYmVyT2ZUaWNrZXRzICE9PSBzZWxmLnNlbGVjdGVkTnVtYmVyT2ZUaWNrZXRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpZmZlcmVuY2UgPSBzZWxmLnNlbGVjdGVkTnVtYmVyT2ZUaWNrZXRzIC0gbnVtYmVyT2ZTZWxlY3RlZFNlYXRzICUgc2VsZi5zZWxlY3RlZE51bWJlck9mVGlja2V0cztcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdExhYmVsID0gc2VsZi5zZWxlY3RlZExhYmVsc1tzZWxmLnNlbGVjdGVkTGFiZWxzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBteXBvZCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIG15cG9kLnB1c2gobGFzdExhYmVsWydsYWJlbCddKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWF0c0J5UG9zaXRpb24gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdFNlYXRTZWxlY3RlZCA9IHNlbGYuZXZlbnRTZWF0c1tsYXN0TGFiZWxbJ2xhYmVsJ11dO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaW5kUG9zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGF1dG9TZWxlY3RlZFNlYXRzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrIGluIHNlbGYuZXZlbnRTZWF0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA9PT0gbGFzdExhYmVsWydsYWJlbCddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kUG9zID0gc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhdHNCeVBvc2l0aW9uLnB1c2goc2VsZi5ldmVudFNlYXRzW2tdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHAgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYXRpYWxTZWF0ID0gcGFyc2VJbnQobGFzdFNlYXRTZWxlY3RlZFsnc3BhdGlhbFNlYXRJZCddKTtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAocCA8IHNlbGYuc2VsZWN0ZWROdW1iZXJPZlRpY2tldHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWF0c0J5UG9zaXRpb25bZmluZFBvcyAtIHBdICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhdHNCeVBvc2l0aW9uW2ZpbmRQb3MgLSBwXVsnc3BhdGlhbFJvdyddID09PSBsYXN0U2VhdFNlbGVjdGVkWydzcGF0aWFsUm93J10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbFNlYXQgPSBwYXJzZUludChzZWF0c0J5UG9zaXRpb25bZmluZFBvcyAtIHBdWydzcGF0aWFsU2VhdElkJ10pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbFNlYXQgKyBwID09PSBzcGF0aWFsU2VhdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZXhpc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtwIGluIHNlbGYuc2VsZWN0ZWRMYWJlbHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWRMYWJlbHNba3BdWydsYWJlbCddID09PSBzZWF0c0J5UG9zaXRpb25bZmluZFBvcyAtIHBdWydrZXknXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWV4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZXhpc3QgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15cG9kLnB1c2goc2VhdHNCeVBvc2l0aW9uW2ZpbmRQb3MgLSBwXVsna2V5J10pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU2VsZWN0ZWRTZWF0cy5wdXNoKHNlYXRzQnlQb3NpdGlvbltmaW5kUG9zIC0gcF1bJ2tleSddKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZS0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZlcmVuY2UgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VhdHNCeVBvc2l0aW9uW2ZpbmRQb3MgKyBwXSAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VhdHNCeVBvc2l0aW9uW2ZpbmRQb3MgKyBwXVsnc3BhdGlhbFJvdyddID09PSBsYXN0U2VhdFNlbGVjdGVkWydzcGF0aWFsUm93J10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbFNlYXQgPSBwYXJzZUludChzZWF0c0J5UG9zaXRpb25bZmluZFBvcyArIHBdWydzcGF0aWFsU2VhdElkJ10pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKHNlbFNlYXQgLSBwKSA9PT0gc3BhdGlhbFNlYXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWV4aXN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrcCBpbiBzZWxmLnNlbGVjdGVkTGFiZWxzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNlbGVjdGVkTGFiZWxzW2twXVsnbGFiZWwnXSA9PT0gc2VhdHNCeVBvc2l0aW9uW2ZpbmRQb3MgKyBwXVsna2V5J10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlleGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWV4aXN0ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteXBvZC5wdXNoKHNlYXRzQnlQb3NpdGlvbltmaW5kUG9zICsgcF1bJ2tleSddKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NlbGVjdGVkU2VhdHMucHVzaChzZWF0c0J5UG9zaXRpb25bZmluZFBvcyArIHBdWydrZXknXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2UtLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwKys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlID09PSAwICYmIGF1dG9TZWxlY3RlZFNlYXRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb2RzLnB1c2gobXlwb2QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlYXRDaGFydC5zZWxlY3RPYmplY3RzKGF1dG9TZWxlY3RlZFNlYXRzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZlcmVuY2UgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0Vycm9yIScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnQ2Fubm90IHNlbGVjdCB0aGUgcmVzdCBvZiB0aGUgdGlja2V0cyBiZWNhdXNlIHRoZXJlIGFyZSBubyBzZWF0cyBhdmFpbGFibGUgb24gdGhlIHNhbWUgcm93JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09rJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWF0Q2hhcnQuZGVzZWxlY3RPYmplY3RzKFtzZWxlY3RTZWF0c0xhYmVsT25seVtzZWxlY3RTZWF0c0xhYmVsT25seS5sZW5ndGggLSAxXV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlYXRDaGFydC5saXN0U2VsZWN0ZWRPYmplY3RzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHNlbGVjdGVkT2JqZWN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgdGhlIHNlbGVjdGVkIHNlYXRzIGFuZCBpZiB0aGUgbnVtYmVyIGlzIHNtYWxsZXIgc2VsZWN0IGJhc2VkIG9uIHJhbmssIGFuZCBuZWFyZXN0XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0QmFzZWRPbkRyb3BEb3duKHNlbGVjdGVkT2JqZWN0cyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRUb0NhcnRBY3Rpb24oKSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCBsYWJlbHMgPSBPYmplY3QuYXNzaWduKHt9LCBzZWxmLnNlbGVjdGVkTGFiZWxzKTtcclxuICAgICAgICBsZXQgdXNlZEJsb2Nrc1RvU2VuZCA9IHt9O1xyXG4gICAgICAgIGZvciAoY29uc3QgaSBpbiBzZWxmLnVzZWRCbG9ja3MpIHtcclxuICAgICAgICAgICAgdXNlZEJsb2Nrc1RvU2VuZFtpXSA9IHt9O1xyXG4gICAgICAgICAgICB1c2VkQmxvY2tzVG9TZW5kW2ldWydwcm9tbyddID0ge307XHJcbiAgICAgICAgICAgIHVzZWRCbG9ja3NUb1NlbmRbaV1bJ3Byb21vJ11bJ3Byb21vdGlvbkNvZGUnXSA9IHNlbGYudXNlZEJsb2Nrc1tpXVsncHJvbW8nXVsncHJvbW90aW9uQ29kZSddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICBhY3Rpb246ICdob2xkX3NlYXRzJyxcclxuICAgICAgICAgICAgcHJvZHVjdGlkOiBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgncHJvZHVjdF9pZCcpLFxyXG4gICAgICAgICAgICBzZWF0bGFiZWxzOiBsYWJlbHMsXHJcbiAgICAgICAgICAgIHBvZHM6IHNlbGYucG9kcyxcclxuICAgICAgICAgICAgZXZlbnRrZXk6IHNlbGYuc2VsZWN0ZWRFdmVudElkLFxyXG4gICAgICAgICAgICBldmVudERhdGE6IHNlbGYuc2VsZWN0ZWRFdmVudERhdGEsXHJcbiAgICAgICAgICAgIHVzZWRCbG9ja3M6IHVzZWRCbG9ja3NUb1NlbmQsXHJcbiAgICAgICAgICAgIHF0eTogbGFiZWxzLmxlbmd0aCxcclxuICAgICAgICAgICAgaXNwOiBzZWxmLmlzUGFjaygpLFxyXG4gICAgICAgICAgICBpc19hZGRfdG9fY2FydDogdHJ1ZSxcclxuICAgICAgICAgICAgc2VjdXJpdHk6IGpRdWVyeSgnI3J3Yl9ob2xkX3NlYXRzX25vbmNlJykudmFsKClcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBzZWxmLkpBZGRUb0NhcnRCdXR0b24oKS5Mb2FkaW5nT3ZlcmxheShcInNob3dcIik7XHJcbiAgICAgICAgalF1ZXJ5LmFqYXgoe1xyXG4gICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgIHVybDogYmJMb2NhbC5hamF4X3VybCxcclxuICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgc3VjY2VzczogalF1ZXJ5LnByb3h5KHNlbGYuYWRkVG9DYXJ0Q29tcGxldGVkLCBzZWxmKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQnRuQ2xpY2tlZChidG5JZCkge1xyXG4gICAgICAgIFN3YWwuY2xvc2UoKTtcclxuICAgICAgICBpZiAoYnRuSWQgIT0gXCJjYW5jZWxcIikge1xyXG4gICAgICAgICAgICBTd2FsLmZpcmUoXCJ5b3UgY2hvb3NlZDogXCIgKyBidG5JZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUJ1dHRvbih0ZXh0LCBjYikge1xyXG4gICAgICAgI
8443HJldHVybiBqUXVlcnkoJzxidXR0b24gY2xhc3M9XCJidG4gYnRuLWluZm9cIj4nICsgdGV4dCArICc8L2J1dHRvbj4nKS5vbignY2xpY2snLCBjYik7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkVG9DYXJ0Q29tcGxldGVkKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZWF0Q2hhcnQucmVyZW5kZXIgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXRDaGFydC5yZXJlbmRlcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vdGhpcy5zZWF0Q2hhcnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy90aGlzLnNlbGVjdGVkT2JqZWN0Q2hhcnQgPSBudWxsO1xyXG4gICAgICAgICAgICAvL3RoaXMuc2VsZWN0ZWRFdmVudCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdJbmZvcm1hdGlvbicsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiByZXNwb25zZS5tZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgaWNvbjogJ2luZm8nLFxyXG4gICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICdPSycsXHJcbiAgICAgICAgICAgICAgICBjbG9zZU9uQ29uZmlybTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGFsbG93RXNjYXBlS2V5OiBmYWxzZVxyXG4gICAgICAgICAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIC8qIFJlYWQgbW9yZSBhYm91dCBpc0NvbmZpcm1lZCwgaXNEZW5pZWQgYmVsb3cgKi9cclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLkpBZGRUb0NhcnRCdXR0b24oKS5Mb2FkaW5nT3ZlcmxheShcImhpZGVcIiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy93aW5kb3cubG9jYXRpb24uaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2VsZi5KQnV5QnV0dG9uKCkuTG9hZGluZ092ZXJsYXkoXCJoaWRlXCIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2xlYXJDYXJ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RCYXNlZE9uRHJvcERvd24oW10pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2VsZi5KQWRkVG9DYXJ0QnV0dG9uKCkuaGlkZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL3JlZnJlc2ggbWFwXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlbG9hZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5KSXNBdHRyYWN0aW9uKCkgfHwgc2VsZi5KWm9uZUltYWdlKCkubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyU2VhdENoYXJ0KHNlbGYuc2VsZWN0ZWRFdmVudElkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5pc0RlbmllZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU3dhbC5maXJlKCdDaGFuZ2VzIGFyZSBub3Qgc2F2ZWQnLCAnJywgJ2luZm8nKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByZXNwb25zZS51cmw7XHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgIHNlbGYuY2xlYXJDYXJ0KCk7XHJcbiAgICAgICAgICAgIGpRdWVyeSgnLmFyb3VuZF9pY29uc19zaG9wcGluZycpLnJlbW92ZUNsYXNzKCdiZWVuX3JlZnJlc2hlZCcpO1xyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdJbmZvcm1hdGlvbicsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnWW91ciB0aWNrZXRzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgY2FydC4gSWYgeW91IHdhbnQgdG8gYnV5IG1vcmUgdGlja2V0cyBwbGVhc2Ugc2VsZWN0IHRoZW0gZnJvbSB0aGUgc2VhdGluZyBjaGFydCBhbmQgYWRkIHRoZW0gdG8gdGhlIGNhcnQuIElmIHlvdSBoYXZlIGZpbmlzaGVkIEdvIFRvIENoZWNrb3V0LicsXHJcbiAgICAgICAgICAgICAgICBpY29uOiAnaW5mbycsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ0NvbnRpbnVlJyxcclxuICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgc2hvd0RlbnlCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgICBkZW55QnV0dG9uVGV4dDogYEdvIFRvIENoZWNrb3V0YCxcclxuICAgICAgICAgICAgICAgIGNsb3NlT25Db25maXJtOiB0cnVlXHJcbiAgICAgICAgICAgIH0pLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2VsZi5KQWRkVG9DYXJ0QnV0dG9uKCkuTG9hZGluZ092ZXJsYXkoXCJoaWRlXCIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vd2luZG93LmxvY2F0aW9uLmhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlbGYuSkFkZFRvQ2FydEJ1dHRvbigpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmlzRGVuaWVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByZXNwb25zZS5jaGVja291dF91cmw7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Td2FsLmZpcmUoJ0NoYW5nZXMgYXJlIG5vdCBzYXZlZCcsICcnLCAnaW5mbycpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgI
8443H0pO1xyXG5cclxuICAgICAgICAgICAgICovXHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBidXlOb3dBY3Rpb25BKCkge1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgbGV0IHBJRDtcclxuICAgICAgICBpZiAoc2VsZi5KSXNBdHRyYWN0aW9uKCkpIHtcclxuICAgICAgICAgICAgcElEID0galF1ZXJ5KCcjYXR0cmFjdGlvbl9pZCcpLmF0dHIoJ3BpZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHBJRCA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdwcm9kdWN0X2lkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdGlja2V0RGF0YSA9IFtdO1xyXG4gICAgICAgIGxldCBzdG9wID0gZmFsc2U7XHJcbiAgICAgICAgalF1ZXJ5KCcuYXR0cmFjdGlvbl9taW50X21heHQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0IGF0dHIgPSB7fTtcclxuICAgICAgICAgICAgaWYgKHBhcnNlSW50KGpRdWVyeSh0aGlzKS52YWwoKSkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBhdHRyLnF0eSA9IGpRdWVyeSh0aGlzKS52YWwoKTtcclxuICAgICAgICAgICAgICAgIGF0dHIucHJvbW9fY29kZSA9IGpRdWVyeSh0aGlzKS5hdHRyKCdpJyk7XHJcbiAgICAgICAgICAgICAgICBhdHRyLnByaWNlTGV2ZWxJZCA9IGpRdWVyeSh0aGlzKS5hdHRyKCdqJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoalF1ZXJ5KHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLmZpbmQoJy5hdHRyYWN0aW9uX3BpY2t1cGxvYycpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhdHRyLnBpY2t1cGxvYyA9IGpRdWVyeSh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5maW5kKCcuYXR0cmFjdGlvbl9waWNrdXBsb2MnKS52YWwoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChqUXVlcnkodGhpcykucGFyZW50KCkuaGFzQ2xhc3MoJ2hhc253JykpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYmJmbmFtZSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGpRdWVyeSh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5maW5kKCcubndkYXRhIC5iYmZuYW1lJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqUXVlcnkodGhpcykudmFsKCkgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYmZuYW1lLnB1c2goalF1ZXJ5KHRoaXMpLnZhbCgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXR0ci5iYmZuYW1lID0gYmJmbmFtZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJibG5hbWUgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBqUXVlcnkodGhpcykucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkuZmluZCgnLm53ZGF0YSAuYmJsbmFtZScpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoalF1ZXJ5KHRoaXMpLnZhbCgpICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmJsbmFtZS5wdXNoKGpRdWVyeSh0aGlzKS52YWwoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dHIuYmJsbmFtZSA9IGJibG5hbWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBiYndlaWdodCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGpRdWVyeSh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5maW5kKCcubndkYXRhIC5iYndlaWdodCcpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoalF1ZXJ5KHRoaXMpLnZhbCgpICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmJ3ZWlnaHQucHVzaChqUXVlcnkodGhpcykudmFsKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBhdHRyLmJid2VpZ2h0ID0gYmJ3ZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aWNrZXREYXRhLnB1c2goYXR0cik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoc3RvcCkge1xyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdIb2xkIFVwIScsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnUGxlYXNlIHByb3ZpZGUgYWxsIGluZm9ybWF0aW9uJyxcclxuICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09rJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGlja2V0RGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCB1c2VkQmxvY2tzVG9TZW5kID0ge307XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBzZWxmLnVzZWRCbG9ja3MpIHtcclxuICAgICAgICAgICAgICAgIHVzZWRCbG9ja3NUb1NlbmRbaV0gPSB7fTtcclxuICAgICAgICAgICAgICAgIHVzZWRCbG9ja3NUb1NlbmRbaV1bJ3Byb21vJ10gPSB7fTtcclxuICAgICAgICAgICAgICAgI
8443HVzZWRCbG9ja3NUb1NlbmRbaV1bJ3Byb21vJ11bJ3Byb21vdGlvbkNvZGUnXSA9IHNlbGYudXNlZEJsb2Nrc1tpXVsncHJvbW8nXVsncHJvbW90aW9uQ29kZSddO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdob2xkX2F0dHJhY3Rpb24nLFxyXG4gICAgICAgICAgICAgICAgcHJvZHVjdGlkOiBwSUQsXHJcbiAgICAgICAgICAgICAgICBldmVudGtleTogc2VsZi5zZWxlY3RlZEV2ZW50SWQsXHJcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHNlbGYuc2VsZWN0ZWRFdmVudERhdGEsXHJcbiAgICAgICAgICAgICAgICB1c2VkQmxvY2tzOiB1c2VkQmxvY2tzVG9TZW5kLFxyXG4gICAgICAgICAgICAgICAgaXNwOiBzZWxmLmlzUGFjaygpLFxyXG4gICAgICAgICAgICAgICAgLy9xdHk6IHNlbGYuc2VsZWN0ZWROdW1iZXJPZlRpY2tldHMsXHJcbiAgICAgICAgICAgICAgICB0aWNrZXRfZGF0YTogdGlja2V0RGF0YSxcclxuICAgICAgICAgICAgICAgIHNlY3VyaXR5OiBqUXVlcnkoJyNyd2JfaG9sZF9hdHRyYWN0aW9uX25vbmNlJykudmFsKClcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHNlbGYuSkJ1eUJ1dHRvbigpLkxvYWRpbmdPdmVybGF5KFwic2hvd1wiKTtcclxuICAgICAgICAgICAgalF1ZXJ5LmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgICAgIHVybDogYmJMb2NhbC5hamF4X3VybCxcclxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBqUXVlcnkucHJveHkoc2VsZi5idXlOb3dDb21wbGV0ZWRBLCBzZWxmKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdIb2xkIFVwIScsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnUGxlYXNlIHByb3ZpZGUgYWxsIGluZm9ybWF0aW9uJyxcclxuICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09rJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYnV5Tm93Q29tcGxldGVkQShyZXNwb25zZSkge1xyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEV2ZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0luZm9ybWF0aW9uJyxcclxuICAgICAgICAgICAgICAgIHRleHQ6IHJlc3BvbnNlLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICBpY29uOiAnaW5mbycsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09LJyxcclxuICAgICAgICAgICAgICAgIGNsb3NlT25Db25maXJtOiB0cnVlLFxyXG4gICAgICAgICAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIC8qIFJlYWQgbW9yZSBhYm91dCBpc0NvbmZpcm1lZCwgaXNEZW5pZWQgYmVsb3cgKi9cclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLkpCdXlCdXR0b24oKS5Mb2FkaW5nT3ZlcmxheShcImhpZGVcIiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWxmLkpCdXlCdXR0b24oKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5pc0RlbmllZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU3dhbC5maXJlKCdDaGFuZ2VzIGFyZSBub3Qgc2F2ZWQnLCAnJywgJ2luZm8nKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gcmVzcG9uc2UudXJsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgYWRkVG9DYXJ0QWN0aW9uQSgpIHtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgIGxldCBwSUQ7XHJcbiAgICAgICAgaWYgKHNlbGYuSklzQXR0cmFjdGlvbigpKSB7XHJcbiAgICAgICAgICAgIHBJRCA9IGpRdWVyeSgnI2F0dHJhY3Rpb25faWQnKS5hdHRyKCdwaWQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwSUQgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgncHJvZHVjdF9pZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRpY2tldERhdGEgPSBbXTtcclxuICAgICAgICBsZXQgc3RvcCA9IGZhbHNlO1xyXG4gICAgICAgIGpRdWVyeSgnLmF0dHJhY3Rpb25fbWludF9tYXh0JykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCBhdHRyID0ge307XHJcbiAgICAgICAgICAgIGlmIChwYXJzZUludChqUXVlcnkodGhpcykudmFsKCkpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgYXR0ci5xdHkgPSBqUXVlcnkodGhpcykudmFsKCk7XHJcbiAgICAgICAgICAgICAgICBhdHRyLnByb21vX2NvZGUgPSBqUXVlcnkodGhpcykuYXR0cignaScpO1xyXG4gICAgICAgICAgICAgICAgYXR0ci5wcmljZUxldmVsSWQgPSBqUXVlcnkodGhpcykuYXR0cignaicpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGpRdWVyeSh0aGlzKS5wYXJlbnQoKS5oYXNDbGFzcygnaGFzbncnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dHIucGlja3VwbG9jID0galF1ZXJ5KHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLmZpbmQoJy5hdHRyYWN0aW9uX3BpY2t1cGxvYycpLnZhbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBiYmZuYW1lID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLmZpbmQoJy5ud2RhdGEgLmJiZm5hbWUnKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpRdWVyeSh0aGlzKS52YWwoKSAhPT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiZm5hbWUucHVzaChqUXVlcnkodGhpcykudmFsKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBhdHRyLmJiZm5hbWUgPSBiYmZuYW1lO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgYmJsbmFtZSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGpRdWVyeSh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5maW5kKCcubndkYXRhIC5iYmxuYW1lJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqUXVlcnkodGhpcykudmFsKCkgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYmxuYW1lLnB1c2goalF1ZXJ5KHRoaXMpLnZhbCgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXR0ci5iYmxuYW1lID0gYmJsbmFtZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJid2VpZ2h0ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLmZpbmQoJy5ud2RhdGEgLmJid2VpZ2h0JykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqUXVlcnkodGhpcykudmFsKCkgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYndlaWdodC5wdXNoKGpRdWVyeSh0aGlzKS52YWwoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dHIuYmJ3ZWlnaHQgPSBiYndlaWdodDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRpY2tldERhdGEucHVzaChhdHRyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoc3RvcCkge1xyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdIb2xkIFVwIScsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnUGxlYXNlIHByb3ZpZGUgYWxsIGluZm9ybWF0aW9uJyxcclxuICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09rJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGlja2V0RGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCB1c2VkQmxvY2tzVG9TZW5kID0ge307XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBzZWxmLnVzZWRCbG9ja3MpIHtcclxuICAgICAgICAgICAgICAgIHVzZWRCbG9ja3NUb1NlbmRbaV0gPSB7fTtcclxuICAgICAgICAgICAgICAgIHVzZWRCbG9ja3NUb1NlbmRbaV1bJ3Byb21vJ10gPSB7fTtcclxuICAgICAgICAgICAgICAgIHVzZWRCbG9ja3NUb1NlbmRbaV1bJ3Byb21vJ11bJ3Byb21vdGlvbkNvZGUnXSA9IHNlbGYudXNlZEJsb2Nrc1tpXVsncHJvbW8nXVsncHJvbW90aW9uQ29kZSddO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdob2xkX2F0dHJhY3Rpb24nLFxyXG4gICAgICAgICAgICAgICAgcHJvZHVjdGlkOiBwSUQsXHJcbiAgICAgICAgICAgICAgICBldmVudGtleTogc2VsZi5zZWxlY3RlZEV2ZW50SWQsXHJcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHNlbGYuc2VsZWN0ZWRFdmVudERhdGEsXHJcbiAgICAgICAgICAgICAgICB1c2VkQmxvY2tzOiB1c2VkQmxvY2tzVG9TZW5kLFxyXG4gICAgICAgICAgICAgICAgLy9xdHk6IHNlbGYuc2VsZWN0ZWROdW1iZXJPZlRpY2tldHMsXHJcbiAgICAgICAgICAgICAgICB0aWNrZXRfZGF0YTogdGlja2V0RGF0YSxcclxuICAgICAgICAgICAgICAgIGlzcDogc2VsZi5pc1BhY2soKSxcclxuICAgICAgICAgICAgICAgIGlzX2FkZF90b19jYXJ0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgc2VjdXJpdHk6IGpRdWVyeSgnI3J3Yl9ob2xkX2F0dHJhY3Rpb25fbm9uY2UnKS52YWwoKVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgc2VsZi5KQWRkVG9DYXJ0QnV0dG9uKCkuTG9hZGluZ092ZXJsYXkoXCJzaG93XCIpO1xyXG4gICAgICAgICAgICBqUXVlcnkuYWpheCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICAgICAgdXJsOiBiYkxvY2FsLmFqYXhfdXJsLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGpRdWVyeS5wcm94eShzZWxmLmFkZFRvQ2FydENvbXBsZXRlZEEsIHNlbGYpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0Vycm9yIScsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnUGxlYXNlIFNlbGVjdCBhdCBsZWFzdCBvbmUgdGlja2V0JyxcclxuICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09LJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWRkVG9DYXJ0Q29tcGxldGVkQShyZXNwb25zZSkge1xyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEV2ZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0luZm9ybWF0aW9uJyxcclxuICAgICAgICAgICAgICAgI
8443HRleHQ6IHJlc3BvbnNlLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICBpY29uOiAnaW5mbycsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09LJyxcclxuICAgICAgICAgICAgICAgIGNsb3NlT25Db25maXJtOiB0cnVlLFxyXG4gICAgICAgICAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIC8qIFJlYWQgbW9yZSBhYm91dCBpc0NvbmZpcm1lZCwgaXNEZW5pZWQgYmVsb3cgKi9cclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLkpBZGRUb0NhcnRCdXR0b24oKS5Mb2FkaW5nT3ZlcmxheShcImhpZGVcIiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWxmLkpBZGRUb0NhcnRCdXR0b24oKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5pc0RlbmllZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU3dhbC5maXJlKCdDaGFuZ2VzIGFyZSBub3Qgc2F2ZWQnLCAnJywgJ2luZm8nKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByZXNwb25zZS51cmw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBidXlOb3dBY3Rpb24oKSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCBsYWJlbHMgP
8443SBPYmplY3QuYXNzaWduKHt9LCBzZWxmLnNlbGVjdGVkTGFiZWxzKTtcclxuICAgICAgICBsZXQgdXNlZEJsb2Nrc1RvU2VuZCA9IHt9O1xyXG4gICAgICAgIGZvciAoY29uc3QgaSBpbiBzZWxmLnVzZWRCbG9ja3MpIHtcclxuICAgICAgICAgICAgdXNlZEJsb2Nrc1RvU2VuZFtpXSA9IHt9O1xyXG4gICAgICAgICAgICB1c2VkQmxvY2tzVG9TZW5kW2ldWydwcm9tbyddID0ge307XHJcbiAgICAgICAgICAgIHVzZWRCbG9ja3NUb1NlbmRbaV1bJ3Byb21vJ11bJ3Byb21vdGlvbkNvZGUnXSA9IHNlbGYudXNlZEJsb2Nrc1tpXVsncHJvbW8nXVsncHJvbW90aW9uQ29kZSddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICBhY3Rpb246ICdob2xkX3NlYXRzJyxcclxuICAgICAgICAgICAgcHJvZHVjdGlkOiBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgncHJvZHVjdF9pZCcpLFxyXG4gICAgICAgICAgICBzZWF0bGFiZWxzOiBsYWJlbHMsXHJcbiAgICAgICAgICAgIGV2ZW50a2V5OiBzZWxmLnNlbGVjdGVkRXZlbnRJZCxcclxuICAgICAgICAgICAgZXZlbnREYXRhOiBzZWxmLnNlbGVjdGVkRXZlbnREYXRhLFxyXG4gICAgICAgICAgICB1c2VkQmxvY2tzOiB1c2VkQmxvY2tzVG9TZW5kLFxyXG4gICAgICAgICAgICBxdHk6IGxhYmVscy5sZW5ndGgsXHJcbiAgICAgICAgICAgIGlzcDogc2VsZi5pc1BhY2soKSxcclxuICAgICAgICAgICAgc2VjdXJpdHk6IGpRdWVyeSgnI3J3Yl9ob2xkX3NlYXRzX25vbmNlJykudmFsKClcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBzZWxmLkpCdXlCdXR0b24oKS5Mb2FkaW5nT3ZlcmxheShcInNob3dcIik7XHJcbiAgICAgICAgalF1ZXJ5LmFqYXgoe1xyXG4gICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgIHVybDogYmJMb2NhbC5hamF4X3VybCxcclxuICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgc3VjY2VzczogalF1ZXJ5LnByb3h5KHNlbGYuYnV5Tm93Q29tcGxldGVkLCBzZWxmKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1eU5vd0NvbXBsZXRlZChyZXNwb25zZSkge1xyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNlYXRDaGFydC5yZXJlbmRlciAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhdENoYXJ0LnJlcmVuZGVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vdGhpcy5zZWF0Q2hhcnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy90aGlzLnNlbGVjdGVkT2JqZWN0Q2hhcnQgPSBudWxsO1xyXG4gICAgICAgICAgICAvL3RoaXMuc2VsZWN0ZWRFdmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIC8vdGhpcy5jbGVhckNhcnQoKTtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdJbmZvcm1hdGlvbicsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiByZXNwb25zZS5tZXNzYWdlLF
8443xyXG4gICAgICAgICAgICAgICAgaWNvbjogJ2luZm8nLFxyXG4gICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICdPSycsXHJcbiAgICAgICAgICAgICAgICBjbG9zZU9uQ29uZmlybTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGFsbG93RXNjYXBlS2V5OiBmYWxzZVxyXG4gICAgICAgICAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAvKiBSZWFkIG1vcmUgYWJvdXQgaXNDb25maXJtZWQsIGlzRGVuaWVkIGJlbG93ICovXHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzQ29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5KQnV5QnV0dG9uKCkuTG9hZGluZ092ZXJsYXkoXCJoaWRlXCIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2xlYXJDYXJ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RCYXNlZE9uRHJvcERvd24oW10pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2VsZi5KQnV5QnV0dG9uKCkuaGlkZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL3JlZnJlc2ggbWFwXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlbG9hZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5KSXNBdHRyYWN0aW9uKCkgfHwgc2VsZi5KWm9uZUltYWdlKCkubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyU2VhdENoYXJ0KHNlbGYuc2VsZWN0ZWRFdmVudElkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5pc0RlbmllZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU3dhbC5maXJlKCdDaGFuZ2VzIGFyZSBub3Qgc2F2ZWQnLCAnJywgJ2luZm8nKVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gcmVzcG9uc2UudXJsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb21wYXJlUHJpY2VCbG9ja3MoYTEsIGIxKSB7XHJcbiAgICAgICAgY29uc3QgYSA9IGExWzFdO1xyXG4gICAgICAgIGNvbnN0IGIgPSBiMVsxXTtcclxuICAgICAgICBpZiAoYVsnZnVsbFJldGFpbFByaWNlJ10gPCBiWydmdWxsUmV0YWlsUHJpY2UnXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFbJ2Z1bGxSZXRhaWxQcmljZSddID4gYlsnZnVsbFJldGFpbFByaWNlJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb21wYXJlUHJpY2VCbG9ja3NQYWNrKGExLCBiMSkge1xyXG4gICAgICAgIGNvbnN0IGEgPSBhMVsxXTtcclxuICAgICAgICBjb25zdCBiID0gYjFbMV07XHJcbiAgICAgICAgaWYgKGFbJ2Z1bGxSZXRhaWxQcmljZSddID4gYlsnZnVsbFJldGFpbFByaWNlJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhWydmdWxsUmV0YWlsUHJpY2UnXSA8IGJbJ2Z1bGxSZXRhaWxQcmljZSddKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgb2JqZWN0VG9BcnJheShvYmopIHtcclxuICAgICAgICBsZXQgX2FyciA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgIF9hcnIucHVzaChba2V5LCBvYmpba2V5XV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX2FycjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcmljZUJsb2Nrc0FuZFVzZWRCbG9ja3NBdHRyYWN0aW9uKCkge1xyXG4gICAgICAgIGxldCBwcmljZUJsb2NrcyA9IFtdO1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBsZXQgdXNlZEJsb2NrcyA9IHt9O1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzZWxmLmV2ZW50UHJvbW90aW9ucykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleVAgaW4gc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0bXBrZXkgaW4gc2VsZi5ldmVudFByb21vdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zZWxlY3RlZFByb21vQ29kZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3Byb21vdGlvbkNvZGUnXSAhPT0gc2VsZi5zZWxlY3RlZFByb21vQ29kZVsncHJvbW90aW9uQ29kZSddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBsZXQgbXlrZXlQID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0bXBrZXlQIGluIHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ3ByaWNlTGV2ZWxJZCddID09PSBzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW3RtcGtleVBdWydwcmljZUxldmVsSWQnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlrZXlQID0gdG1wa2V5UDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChteWtleVAgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydpc19leGNsdWRlZCddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydmdWxsUmV0YWlsUHJpY2UnXSkgPCBwYXJzZU
8443Zsb2F0KHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnZnVsbFJldGFpbFByaWNlJ10pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLmJpZ1ByaWNlID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLmJpZ1ByaWNlID0gc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydmdWxsUmV0YWlsUHJpY2UnXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLmJpZ1ByaWNlKSA8IHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydmdWxsUmV0YWlsUHJpY2UnXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0uYmlnUHJpY2UgPSBzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2lzX2Nsb3NlZGxvb3AnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsnZnVsbFJldGFpbFByaWNlJ10pID4gcGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5zbWFsbFByaWNlID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLnNtYWxsUHJpY2UgPSBzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLm11c3Rsb2dpbiA9IHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnaXNfY2xvc2VkbG9vcCddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0uc21hbGxQcmljZSkgPiBwYXJzZUZsb2F0KHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnZnVsbFJldGFpbFByaWNlJ10pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLnNtYWxsUHJpY2UgPSBzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5tdXN0bG9naW4gPSBzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2lzX2Nsb3NlZGxvb3AnXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsnaXNfZXhjbHVkZWQnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdXNlZEJsb2Nrc1tzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydwcmljZUxldmVsSWQnXV0gPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2VCbG9ja3MucHVzaChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2Nrc1tzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydwcmljZUxldmVsSWQnXSArICcnXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9tbyc6IFtzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3NpdGlvbic6IHByaWNlQmxvY2tzLmxlbmd0aCAtIDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgcHJvbW8gPSB1c2VkQmxvY2tzW3NlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ3ByaWNlTGV2ZWxJZCddXS5wcm9tbztcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgcG9zaXRpb24gPSB1c2VkQmxvY2tzW3NlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ3ByaWNlTGV2ZWxJZCddXS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAocGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydmdWxsUmV0YWlsUHJpY2UnXSkgPCBwYXJzZU
8443Zsb2F0KHByaWNlQmxvY2tzW3Bvc2l0aW9uXVsnZnVsbFJldGFpbFByaWNlJ10pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpY2VCbG9ja3NbcG9zaXRpb25dID0gc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2VCbG9ja3MucHVzaChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2Nrc1tzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydwcmljZUxldmVsSWQnXSArICcnXS5wcm9tby5wdXNoKHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsncHJpY2VCbG9jayc6IHByaWNlQmxvY2tzLCAndXNlQmxvY2snOiB1c2VkQmxvY2tzfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcmljZUJsb2Nrc0FuZFVzZWRCbG9ja3Nab25lcygpIHtcclxuICAgICAgICBsZXQgcHJpY2VCbG9ja3MgPSBbXTtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgbGV0IHVzZWRCbG9ja3MgPSB7fTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2VsZi5ldmVudFByb21vdGlvbnMpIHtcclxuICAgICAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJvbW90aW9uQ29kZSddICE9PSBzZWxmLnNlbGVjdGVkUHJvbW9Db2RlWydwcm9tb3Rpb25Db2RlJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleVAgaW4gc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0bXBrZXkgaW4gc2VsZi5ldmVudFByb21vdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvKmlmIChzZWxmLnNlbGVjdGVkUHJvbW9Db2RlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJvbW90aW9uQ29kZSddICE9PSBzZWxmLnNlbGVjdGVkUHJvbW9Db2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0qL1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBteWtleVAgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRtcGtleVAgaW4gc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsncHJpY2VMZXZlbElkJ10gPT09IHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bdG1wa2V5UF1bJ3ByaWNlTGV2ZWxJZCddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteWtleVAgPSB0bXBrZXlQO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG15a2V5UCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2lzX2V4Y2x1ZGVkJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddKSA8IHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydmdWxsUmV0YWlsUHJpY2UnXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0uYmlnUHJpY2UgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0uYmlnUHJpY2UgPSBzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0uYmlnUHJpY2UpIDwgcGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5iaWdQcmljZSA9IHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnZnVsbFJldGFpbFByaWNlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnaXNfY2xvc2VkbG9vcCddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydmdWxsUmV0YWlsUHJpY2UnXSkgPiBwYXJzZU
8443Zsb2F0KHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnZnVsbFJldGFpbFByaWNlJ10pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLnNtYWxsUHJpY2UgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0uc21hbGxQcmljZSA9IHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnZnVsbFJldGFpbFByaWNlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0ubXVzdGxvZ2luID0gc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydpc19jbG9zZWRsb29wJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5zbWFsbFByaWNlKSA+IHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydmdWxsUmV0YWlsUHJpY2UnXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0uc21hbGxQcmljZSA9IHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnZnVsbFJldGFpbFByaWNlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLm11c3Rsb2dpbiA9IHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnaXNfY2xvc2VkbG9vcCddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydpc19leGNsdWRlZCddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB1c2VkQmxvY2tzW3NlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ3ByaWNlTGV2ZWxJZCddXSA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmljZUJsb2Nrcy5wdXNoKHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tzW3NlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ3ByaWNlTGV2ZWxJZCddICsgJyddID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb21vJzogc2VsZi5ldmVudFByb21vdGlvbnNba2V5XSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3NpdGlvbic6IHByaWNlQmxvY2tzLmxlbmd0aCAtIDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb21vID0gdXNlZEJsb2Nrc1tzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydwcmljZUxldmVsSWQnXV0ucHJvbW87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IHVzZWRCbG9ja3Nbc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsncHJpY2VMZXZlbElkJ11dLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydmdWxsUmV0YWlsUHJpY2UnXSkgPCBwYXJzZUZsb2F0KHByaWNlQmxvY2tzW3Bvc2l0aW9uXVsnZnVsbFJldGFpbFByaWNlJ10pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZUJsb2Nrc1twb3NpdGlvbl0gPSBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2Nrc1tzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydwcmljZUxldmVsSWQnXSArICcnXS5wcm9tbyA9IHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsncHJpY2VCbG9jayc6IHByaWNlQmxvY2tzLCAndXNlQmxvY2snOiB1c2VkQmxvY2tzfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcmljZUJsb2Nrc0FuZFVzZWRCbG9ja3MoKSB7XHJcbiAgICAgICAgbGV0IHByaWNlQmxvY2tzID0gW107XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCB1c2VkQmxvY2tzID0ge307XHJcblxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNlbGYuZXZlbnRQcm9tb3Rpb25zKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnNlbGVjdGVkUHJvbW9Db2RlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3Byb21vdGlvbkNvZGUnXSAhPT0gc2VsZi5zZWxlY3RlZFByb21vQ29kZVsncHJvbW90aW9uQ29kZSddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7X
8443HJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXlQIGluIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ10pIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdG1wa2V5IGluIHNlbGYuZXZlbnRQcm9tb3Rpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcm9tb3Rpb25Db2RlJ10gIT09IHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGVbJ3Byb21vdGlvbkNvZGUnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG15a2V5UCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdG1wa2V5UCBpbiBzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydwcmljZUxldmVsSWQnXSA9PT0gc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVt0bXBrZXlQXVsncHJpY2VMZXZlbElkJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15a2V5UCA9IHRtcGtleVA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAobXlrZXlQICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnaXNfZXhjbHVkZWQnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsnZnVsbFJldGFpbFByaWNlJ10pIDwgcGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5iaWdQcmljZSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5iaWdQcmljZSA9IHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnZnVsbFJldGFpbFByaWNlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5iaWdQcmljZSkgPCBwYXJzZUZsb2F0KHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnZnVsbFJldGFpbFByaWNlJ10pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLmJpZ1ByaWNlID0gc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydmdWxsUmV0YWlsUHJpY2UnXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydpc19jbG9zZWRsb29wJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddKSA+IHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydmdWxsUmV0YWlsUHJpY2UnXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0uc21hbGxQcmljZSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5zbWFsbFByaWNlID0gc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydmdWxsUmV0YWlsUHJpY2UnXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5tdXN0bG9naW4gPSBzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2lzX2Nsb3NlZGxvb3AnXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLnNtYWxsUHJpY2UpID4gcGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5zbWFsbFByaWNlID0gc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydmdWxsUmV0YWlsUHJpY2UnXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
8443HNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0ubXVzdGxvZ2luID0gc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydpc19jbG9zZWRsb29wJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ2lzX2V4Y2x1ZGVkJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHVzZWRCbG9ja3Nbc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsncHJpY2VMZXZlbElkJ11dID09PSBcInVuZGVmaW5lZFwiKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmljZUJsb2Nrcy5wdXNoKHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tzW3NlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ3ByaWNlTGV2ZWxJZCddICsgJyddID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb21vJzogc2VsZi5ldmVudFByb21vdGlvbnNba2V5XSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3NpdGlvbic6IHByaWNlQmxvY2tzLmxlbmd0aCAtIDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb21vID0gdXNlZEJsb2Nrc1tzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydwcmljZUxldmVsSWQnXV0ucHJvbW87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IHVzZWRCbG9ja3Nbc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsncHJpY2VMZXZlbElkJ11dLnBvc2l0aW9uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsnZnVsbFJldGFpbFByaWNlJ10pIDwgcGFyc2VGbG9hdChwcmljZUJsb2Nrc1twb3NpdGlvbl1bJ2Z1bGxSZXRhaWxQcmljZSddKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2VCbG9ja3NbcG9zaXRpb25dID0gc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRCbG9ja3Nbc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsncHJpY2VMZXZlbElkJ10gKyAnJ10ucHJvbW8gPSBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7J3ByaWNlQmxvY2snOiBwcmljZUJsb2NrcywgJ3VzZUJsb2NrJzogdXNlZEJsb2Nrc307XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJpY2VMZXZlbElkcygpIHtcclxuXHJcbiAgICAgICAgbGV0IHByaWNlTGV2ZWxJZHMgPSBbXTtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2VsZi5ldmVudFByb21vdGlvbnMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXlQIGluIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlTGV2ZWxJZHMnXSkge1xyXG4gICAgICAgICAgICAgICAgcHJpY2VMZXZlbElkcy5wdXNoKHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlTGV2ZWxJZHMnXVtrZXlQXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByaWNlTGV2ZWxJZHM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VGFnSWRzKCkge1xyXG4gICAgICAgIGxldCB0YWdJZHMgPSBbXTtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2VsZi5ldmVudFByb21vdGlvbnMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXlQIGluIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3RhZ0lkcyddKSB7XHJcbiAgICAgICAgICAgICAgICB0YWdJZHMucHVzaChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWyd0YWdJZHMnXVtrZXlQXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRhZ0lkcztcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdWJob2xkSWRzKCkge1xyXG4gICAgICAgIGxldCBzdWJob2xkc0lkcyA9IFtdO1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzZWxmLmV2ZW50UHJvbW90aW9ucykge1xyXG4gICAgICAgICAgICAvL2ZvciAoY29uc3Qga2V5UCBpbiBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddKSB7XHJcbiAgICAgICAgICAgIHN1YmhvbGRzSWRzLnB1c2goc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsnaG9sZFN1YmNsYXNzSWQnXSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3ViaG9sZHNJZHM7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlUHJpY2luZ01hcCgpIHtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgbGV0IHByaWNlQmxvY2tzO1xyXG5cclxuICAgICAgICBsZXQgcHJpY2VCbG9ja3NBbmRVc2VkQmxvY2tzID0gc2VsZi5nZXRQcmljZUJsb2Nrc0FuZFVzZWRCbG9ja3MoKTtcclxuICAgICAgICBwcmljZUJsb2NrcyA9IHByaWNlQmxvY2tzQW5kVXNlZEJsb2Nrcy5wcmljZUJsb2NrO1xyXG5cclxuXHJcbiAgICAgICAgc2VsZi5KUHJpY2VNYXAoKS5odG1sKCcnKTtcclxuICAgICAgICBzZWxmLkpQcmljZU1hcCgpLnNob3coKTtcclxuICAgICAgICBzZWxmLkpQcmljZU1hcEV4cGxhbmF0aW9uKCkuc2hvdygpO1xyXG4gICAgICAgI
8443HNlbGYuSlByaWNlQmVzdFNlYXRzKCkucmVtb3ZlKCk7XHJcbiAgICAgICAgc2VsZi5zZWxlY3RlZEZpbHRlcmVkQ2F0ZWdvcmllcyA9IFtdO1xyXG4gICAgICAgIGxldCBwcmljZUFyciA9IFtdO1xyXG4gICAgICAgIGxldCBwcmljZUJsb2NrQXJyID0gc2VsZi5vYmplY3RUb0FycmF5KHByaWNlQmxvY2tzKTtcclxuICAgICAgICBwcmljZUJsb2NrQXJyLnNvcnQoc2VsZi5jb21wYXJlUHJpY2VCbG9ja3MpO1xyXG4gICAgICAgIGxldCBwbyA9IDA7XHJcbiAgICAgICAgalF1ZXJ5KCcjcHJpY2VfbG9naW5fc2lnbnVwJykuaGlkZSgpO1xyXG4gICAgICAgIGZvciAobGV0IGkxID0gcHJpY2VCbG9ja0Fyci5sZW5ndGggLSAxOyBpMSA+PSAwOyBpMS0tKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHByaWNlQmxvY2tBcnJbaTFdWzBdO1xyXG4gICAgICAgICAgICAvL2NvbnN0IHZhbHVlID0gcHJpY2VCbG9ja0FycltpMV1bMV07XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnVzZWRQcmljZUxldmVsSWRzICE9PSBmYWxzZSAmJiBzZWxmLmluQXJyYXkoc2VsZi51c2VkUHJpY2VMZXZlbElkcywgcHJpY2VCbG9ja3Nba2V5XVsncHJpY2VMZXZlbElkJ10pKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYmlncHJpY2VjdXQgPSAnJztcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJpY2VCbG9ja3Nba2V5XS5iaWdQcmljZSAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJpY2VCbG9ja3Nba2V5XVsnZnVsbFJldGFpbFByaWNlJ10gIT09IHByaWNlQmxvY2tzW2tleV0uYmlnUHJpY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBiaWdwcmljZWN1dCA9ICc8c3BhbiBjbGFzcz1cImJpZ3ByaWNlY3V0XCI+JyArIHBhcnNlRmxvYXQocHJpY2VCbG9ja3Nba2V5XS5iaWdQcmljZSkudG9GaXhlZCgyKSArICc8L3NwYW4+J1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHByaWNlQmxvY2tzW2tleV0ubXVzdGxvZ2luICYmIHR5cGVvZiBwcmljZUJsb2Nrc1trZXldLnNtYWxsUHJpY2UgIT09ICd1bmRlZmluZWQnICYmIHByaWNlQmxvY2tzW2tleV1bJ2Z1bGxSZXRhaWxQcmljZSddICE9PSBwcmljZUJsb2Nrc1trZXldLnNtYWxsUHJpY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJyNwcmljZV9sb2dpbl9zaWdudXAnKS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJpY2VEaXYgPSAnPGRpdiBjbGFzcz1cInByaWNlX2Jsb2NrXCIgcHJpY2VfbGV2ZWxfaWQ9XCInICsgcHJpY2VCbG9ja3Nba2V5XVsncHJpY2VMZXZlbElkJ10gKyAnXCI+PGkgY2xhc3M9XCJzbHYgc2x2LXJhZGlvLXVuY2hlY2tlZFwiIHN0eWxlPVwiY29sb3I6JyArIHNlbGYuY29kZUFycmF5KClbcG9dICsgJ1wiPjwvaT48c3BhbiBjbGFzcz1cInByaWNlX2Jsb2NrX3ByaWNpbmdcIj4kJyArIHBhcnNlRmxvYXQocHJpY2VCbG9ja3Nba2V5XVsnZnVsbFJldGFpbFByaWNlJ10pLnRvRml4ZWQoMikgKyBiaWdwcmljZWN1dCArICc8L3NwYW4+PC9kaXY+JztcclxuICAgICAgICAgICAgICAgIGlmIChzZWxmLmlzUGFjaygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlRGl2ID0gJzxkaXYgY2xhc3M9XCJwcmljZV9ibG9ja1wiIHByaWNlX2xldmVsX2lkPVwiJyArIHByaWNlQmxvY2tzW2tleV1bJ3ByaWNlTGV2ZWxJZCddICsgJ1wiPjxpIGNsYXNzPVwic2x2IHNsdi1yYWRpby11bmNoZWNrZWRcIiBzdHlsZT1cImNvbG9yOicgKyBzZWxmLmNvZGVBcnJheSgpW3BvXSArICdcIj48L2k+PHNwYW4gY2xhc3M9XCJwcmljZV9ibG9ja19wcmljaW5nXCI+SU5DTFVERUQ8L3NwYW4+PC9kaXY+JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0UGFja1ByaWNlID0gcGFyc2VGbG9hdChwcmljZUJsb2Nrc1trZXldWydmdWxsUmV0YWlsUHJpY2UnXSkudG9GaXhlZCgyKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmljZURpdiA9ICc8ZGl2IGNsYXNzPVwicHJpY2VfYmxvY2tcIiBwcmljZV9sZXZlbF9pZD1cIicgKyBwcmljZUJsb2Nrc1trZXldWydwcmljZUxldmVsSWQnXSArICdcIj48aSBjbGFzcz1cInNsdiBzbHYtcmFkaW8tdW5jaGVja2VkXCIgc3R5bGU9XCJjb2xvcjonICsgc2VsZi5jb2RlQXJyYXkoKVtwb10gKyAnXCI+PC9pPjxzcGFuIGNsYXNzPVwicHJpY2VfYmxvY2tfcHJpY2luZ1wiPiskJyArIChwYXJzZUZsb2F0KHByaWNlQmxvY2tzW2tleV1bJ2Z1bGxSZXRhaWxQcmljZSddKS50b0ZpeGVkKDIpIC0gc2VsZi5pbml0UGFja1ByaWNlKS50b0ZpeGVkKDIpICsgJzwvc3Bhbj48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vcHJpY2VBcnIgY2FuIGJlIHNvcnRlZFxyXG4gICAgICAgICAgICAgICAgcHJpY2VBcnIucHVzaChwcmljZURpdik7XHJcbiAgICAgICAgICAgICAgICBwbysrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qZm9yIChsZXQgazEgPSBwcmljZUFyci5sZW5ndGggLSAxOyBrMSA+PSAwOyBrMS0tKSB7XHJcbiAgICAgICAgICAgIHNlbGYuSlByaWNlTWFwKCkuYXBwZW5kKGpRdWVyeShwcmljZUFycltrMV0pKTtcclxuICAgICAgICB9Ki9cclxuICAgICAgICBmb3IgKGxldCBrMSA9IDA7IGsxIDwgcHJpY2VBcnIubGVuZ3RoOyBrMSsrKSB7XHJcbiAgICAgICAgICAgIHNlbGYuSlByaWNlTWFwKCkuYXBwZW5kKGpRdWVyeShwcmljZUFycltrMV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG9wdGlvbnNiZXN0ID0gJyc7XHJcbiAgICAgICAgbGV0IHN0ZXAgPSAxO1xyXG4gICAgICAgIGlmICghdGhpcy5KRnJlZVNlYXRpbmcoKSkge1xyXG4gICAgICAgICAgICBzdGVwID0gcGFyc2VJbnQodGhpcy5KVGlja2V0c0Nob29zZXIoKS52YWwoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdGVwID09PSAwKSB7XHJcbiAgICAgICAgICAgI
8443HN0ZXAgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBvbyA9IDA7IG9vIDw9IDMwOyBvbyArPSBzdGVwKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnNiZXN0ICs9ICc8b3B0aW9uIHZhbHVlPVwiJyArIG9vLnRvU3RyaW5nKCkgKyAnXCI+JyArIG9vLnRvU3RyaW5nKCkgKyAnPC9vcHRpb24+JztcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGRyb3Bkb3duQmVzdFNlYXRzID0gJ1NlbGVjdCAjIG9mIFNlYXRzOjxzZWxlY3QgY2xhc3M9XCJ0aWNrZXRfbnVtYmVyX2Jlc3RcIj4nICsgb3B0aW9uc2Jlc3QgKyAnPC9zZWxlY3Q+JztcclxuICAgICAgICAvL3NlbGYuSlByaWNlTWFwU2VhdHMoKS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwicHJpY2VfYmVzdF9zZWF0c1wiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+PGRpdiBjbGFzcz1cImJlc3Rfc2VhdHNfYnV0dG9uXCI+RklORCBCRVNUIFNFQVRTPC9kaXY+PGRpdiBjbGFzcz1cImJlc3Rfc2VhdHNfdGV4dFwiPlRoaXMgb3B0aW9uIHdpbGwgZmluZCB0aGUgdGhlIGJlc3Qgc2VhdHMgZm9yIHlvdXIgc2VsZWN0ZWQgY2F0ZWdvcnkuIFlvdSBjYW4gYWxzbyBtYW51YWxseSBzZWxlY3Qgc2VhdHMgYnkgY2xpY2tpbmcgb24gdGhlbS4nICsgZHJvcGRvd25CZXN0U2VhdHMgKyAnPC9kaXY+PC9kaXY+JykpO1xyXG4gICAgICAgIGpRdWVyeSgnLnByaWNlX2Jsb2NrJykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc3QgbGV2ZWxJZCA9IGpRdWVyeSh0aGlzKS5hdHRyKCdwcmljZV9sZXZlbF9pZCcpO1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleE9mSXRlbSA9IHNlbGYuc2VsZWN0ZWRGaWx0ZXJlZENhdGVnb3JpZXMuaW5kZXhPZihsZXZlbElkKTtcclxuICAgICAgICAgICAgaWYgKGluZGV4T2ZJdGVtID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RlZEZpbHRlcmVkQ2F0ZWdvcmllcy5wdXNoKGxldmVsSWQpO1xyXG4gICAgICAgICAgICAgICAgalF1ZXJ5KHRoaXMpLmFkZENsYXNzKCdwcmljZV9ibG9ja19zZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RlZEZpbHRlcmVkQ2F0ZWdvcmllcy5zcGxpY2UoaW5kZXhPZkl0ZW0sIDEpO1xyXG4gICAgICAgICAgICAgICAgalF1ZXJ5KHRoaXMpLnJlbW92ZUNsYXNzKCdwcmljZV9ibG9ja19zZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnNlbGVjdGVkRmlsdGVyZWRDYXRlZ29yaWVzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgalF1ZXJ5KCcucHJpY2VfYmVzdF9zZWF0cycpLnNob3coKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeSgnLnByaWNlX2Jlc3Rfc2VhdHMnKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsZi5zZWF0Q2hhcnQuY2hhbmdlQ29uZmlnICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zZWF0Q2hhcnQuY2hhbmdlQ29uZmlnKHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZENhdGVnb3JpZXM6IHNlbGYuc2VsZWN0ZWRGaWx0ZXJlZENhdGVnb3JpZXNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zZWF0Q2hhcnQudG9nZ2xlQ2F0ZWdvcmllc0hpZ2hsaWdodFJlbmRlcihzZWxmLnNlbGVjdGVkRmlsdGVyZWRDYXRlZ29yaWVzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgalF1ZXJ5KCcuYmVzdF9zZWF0c19idXR0b246bm90KC5iYnJ1biknKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBzZWxmLnNlYXRDaGFydC5zZWxlY3RCZXN0QXZhaWxhYmxlKHtcclxuICAgICAgICAgICAgICAgICdudW1iZXInOiBwYXJzZUludChqUXVlcnkoJy50aWNrZXRfbnVtYmVyX2Jlc3QnKS52YWwoKSksXHJcbiAgICAgICAgICAgICAgICAnY2F0ZWdvcnknOiBzZWxmLnNlbGVjdGVkRmlsdGVyZWRDYXRlZ29yaWVzWzBdXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBqUXVlcnkoJy5iZXN0X3NlYXRzX2J1dHRvbicpLmFkZENsYXNzKCdiYnJ1bicpO1xyXG4gICAgICAgICAgICBzZWxmLkpQcmljZU1hcFNlYXRzKCkuZmluZCgnLmJlc3Rfc2VhdHNfdGV4dCcpLmh0bWwoJzxpIGNsYXNzPVwic2x2IHNsdi1jaGVjay1jaXJjbGVcIiBzdHlsZT1cImNvbG9yOiNCQzVBRkZcIj48L2k+IFlvdVxcJ3ZlIGdvdCB0aGUgYmVzdCBzZWF0cycpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclNlYXRDaGFydENvbXBsZXRlZChyZXNwb25zZSkge1xyXG4gICAgICAgIGpRdWVyeSgnYm9keScpLkxvYWRpbmdPdmVybGF5KFwiaGlkZVwiKTtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTZWF0cyA9IHJlc3BvbnNlLmV2ZW50X3NlYXRzO1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50UHJvbW90aW9ucyA9IHJlc3BvbnNlLmV2ZW50X3Byb21vdGlvbnM7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTZWN0aW9ucyA9IHJlc3BvbnNlLmV2ZW50X3NlY3Rpb25zO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXRBbGVydHNBbmRUb29sdGlwc1BlckxhYmVsID0gcmVzcG9uc2Uuc2VhdF9hbGVydHM7XHJcbiAgICAgICAgICAgIGlmICghc2VsZi5KRnJlZVNlYXRpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVEcm9wRG93blNlbGVjdChyZXNwb25zZS5kcm9wZG93bl9zZWxlY3QsIHJlc3BvbnNlLndvcmtzcGFjZWtleSwgcmVzcG9uc2UuZXZlbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RlZE51bWJlck9mVGlja2V0cyA9IDA7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGVkUHJvbW9Db2RlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnJlbmRlclNlYXRNYXAocmVzcG9uc2Uud29ya3NwYWNla2V5LCByZXNwb25zZS5ldmVudCk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZVByaWNpbmdNYXAoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdFcnJvciEnLFxyXG4gICAgICAgICAgICAgICAgdGV4dDogJ1RoZXJlIHdhcyBhbiBlcnJvciByZW5kZXJpbmcgdGhlIHNlYXRzIGNoYXJ0LiBUaGUgcGFnZSB3aWxsIG5vdyByZWZyZXNoJyxcclxuICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09LJyxcclxuICAgICAgICAgICAgICAgIGNsb3NlT25Db25maXJtOiB0cnVlLFxyXG4gICAgICAgICAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIC8qIFJlYWQgbW9yZSBhYm91dCBpc0NvbmZpcm1lZCwgaXNEZW5pZWQgYmVsb3cgKi9cclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuaXNEZW5pZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1N3YWwuZmlyZSgnQ2hhbmdlcyBhcmUgbm90IHNhdmVkJywgJycsICdpbmZvJylcclxuICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUNhbGVuZGFyKCkge1xyXG4gICAgICAgIHRoaXMuY2FsZW5kYXIgPSB0aGlzLkpGbGF0Q2FsZW5kYXIoKS5mbGF0cGlja3Ioe1xyXG4gICAgICAgICAgICBtb2RlOiAnc2luZ2xlJyxcclxuICAgICAgICAgICAgZGlzYWJsZU1vYmlsZTogdHJ1ZSxcclxuICAgICAgICAgICAgaW5saW5lOiB0cnVlLFxyXG4gICAgICAgICAgICAvL2xvY2FsZTogYmJMb2NhbC5jdXJyZW50X2xhbmd1YWdlLFxyXG4gICAgICAgICAgICAvL2RhdGVGb3JtYXQ6IHRoaXMuZ2V0RGF0ZUZvcm1hdCgpLFxyXG4gICAgICAgICAgICBhbHRJbnB1dDogZmFsc2UsXHJcbiAgICAgICAgICAgIGNsaWNrT3BlbnM6IGZhbHNlLFxyXG4gICAgICAgICAgICBhbGxvd0lucHV0OiBmYWxzZSxcclxuICAgICAgICAgICAgLy9zdGF0aWM6IHRydWUsXHJcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBqUXVlcnkucHJveHkodGhpcy5kYXRlQ2hhbmdlZCwgdGhpcyksXHJcbiAgICAgICAgICAgIG9uTW9udGhDaGFuZ2U6IGpRdWVyeS5wcm94eSh0aGlzLm1vbnRoQ2hhbmdlZCwgdGhpcyksXHJcbiAgICAgICAgICAgIG9uRGF5Q3JlYXRlOiBqUXVlcnkucHJveHkodGhpcy5kYXlDcmVhdGUsIHRoaXMpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLkpUaGVtZSgpID09PSAnbGlnaHQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuSkJsYW5rU2VhdHNNYXAoKS5odG1sKCc8aW1nIHNyYz1cIi93cC1jb250ZW50L3RoZW1lcy9wb3J0by9pbWFnZXMvbm9fc2VsZWN0aW9uX2RhdGVfdGltZV9saWdodC5wbmdcIi8+PGg0PlBpY2sgYSBkYXRlIHRvIHNlZSB0aGUgYXZhaWxhYmxlIHRpY2tldHM8L2g0PicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuSkJsYW5rU2VhdHNNYXAoKS5odG1sKCc8aDQ+U2VsZWN0IGEgZGF0ZSBmcm9tIHRoZSBDYWxlbmRhcjwvaDQ+PGltZyBzdHlsZT1cInBhZGRpbmc6ODBweDtcIiBzcmM9XCIvd3AtY29udGVudC90aGVtZXMvcG9ydG8vaW1hZ2VzL25vX3NlbGVjdGlvbl9kYXRlX3RpbWUucG5nXCIvPicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9qUXVlcnkoJzxzcGFuPiw8L3NwYW4+JykuaW5zZXJ0QWZ0ZXIoalF1ZXJ5KCcuZmxhdHBpY2tyLW1vbnRoRHJvcGRvd24tbW9udGhzJykpO1xyXG4gICAgICAgIGpRdWVyeSgnLmZsYXRwaWNrci1tb250aERyb3Bkb3duLW1vbnRocycpLnByb3AoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgalF1ZXJ5KCcuZmxhdHBpY2tyLWN1cnJlbnQtbW9udGggaW5wdXQnKS5wcm9wKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICAgIGlmICh0aGlzLkpHb1RvTW9udGgoKSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxlbmRhci5qdW1wVG9EYXRlKHRoaXMuZ2V0RW5kT2ZNb250aHModGhpcy5KR29Ub01vbnRoKClbJ3llYXInXSwgdGhpcy5KR29Ub01vbnRoKClbJ21vbnRoJ10gLSAxKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZpcnN0RGF0ZVdpdGhFdmVudCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FsZW5kYXIuanVtcFRvRGF0ZSh0aGlzLmdldEVuZE9mTW9udGgodGhpcy5maXJzdERhdGVXaXRoRXZlbnQpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtb250aENoYW5nZWQoc2VsZWN0ZWREYXRlcywgZGF0ZVN0ciwgaW5zdGFuY2UpIHtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKGluc3RhbmNlLmN1cnJlbnRNb250aCk7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCBjdXJNb250aCA9IHBhcnNlSW50KGluc3RhbmNlLmN1cnJlbnRNb250aCkgKyAxO1xyXG4gICAgICAgIGxldCBjdXJZZWFyID0gcGFyc2VJbnQoaW5zdGFuY2UuY3VycmVudFllYXIpO1xyXG4gICAgICAgIGlmIChzZWxmLkpEdWFsRGF0ZXMoKSkge1xyXG4gICAgICAgICAgICBsZXQgZHllYXIgPSBwYXJzZUludChzZWxmLkpEdWFsRGF0ZXMoKS5hdHRyKCdkeWVhcicpKTtcclxuICAgICAgICAgICAgbGV0IGRtb250aCA9IHBhcnNlSW50KHNlbGYuSkR1YWxEYXRlcygpLmF0dHIoJ2Rtb250aCcpKTtcclxuICAgICAgICAgICAgbGV0IGR0eXBlID0gc2VsZi5KRHVhbERhdGVzKCkuYXR0cignZHR5cGUnKTtcclxuICAgICAgICAgICAgbGV0IGR1cmwgPSBzZWxmLkpEdWFsRGF0ZXMoKS5hdHRyKCdkdXJsJyk7XHJcbiAgICAgICAgICAgIGlmIChkdHlwZSA9PT0gJ2EnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZG1vbnRoIDw9IGN1ck1vbnRoICYmIGN1clllYXIgPT09IGR5ZWFyIHx8IGN1clllYXIgPiBkeWVhcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZHVybCArICcmZG1vbnRoPScgKyBjdXJNb250aCArICcmZHllYXI9JyArIGN1clllYXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdiJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRtb250aCA+IGN1ck1vbnRoICYmIGN1clllYXIgPT09IGR5ZWFyIHx8IGN1clllYXIgPCBkeWVhcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZHVybCArICcmZG1vbnRoPScgKyBjdXJNb250aCArICcmZHllYXI9JyArIGN1clllYXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGdldExhc3REYXkoeSwgbSkge1xyXG4gICAgICAgIHJldHVybiAzMCArIChtIDw9IDcgPyAoKG0gJSAyKSA/IDEgOiAwKSA6ICghKG0gJSAyKSA/IDEgOiAwKSkgLSAobSA9PSAyKSAtIChtID09IDIgJiYgeSAlIDQgIT0gMCB8fCAhKHkgJSAxMDAgPT0gMCAmJiB5ICUgNDAwID09IDApKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRMYXN0VHJ1ZURheSh5LCBtKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHksIG0gKyAxLCAwKS5nZXREYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RW5kT2ZNb250aChkYXRlKSB7XHJcbiAgICAgICAgbGV0IG5leHRNb250aCA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCB0aGlzLmdldExhc3RUcnVlRGF5KGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpKSk7XHJcbiAgICAgICAgcmV0dXJuIG5leHRNb250aDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRFbmRPZk1vbnRocyhkYXRlWWVhciwgZGF0ZU1vbnRoKSB7X
8443HJcbiAgICAgICAgbGV0IG5leHRNb250aCA9IG5ldyBEYXRlKGRhdGVZZWFyLCBkYXRlTW9udGgsIHRoaXMuZ2V0TGFzdERheShkYXRlWWVhciwgZGF0ZU1vbnRoKSk7XHJcbiAgICAgICAgcmV0dXJuIG5leHRNb250aDtcclxuICAgIH1cclxuXHJcbiAgICBkYXlDcmVhdGUoZE9iaiwgZFN0ciwgZnAsIGRheUVsZW0pIHtcclxuICAgICAgICBpZiAoalF1ZXJ5KGRheUVsZW0pLmhhc0NsYXNzKCdwcmV2TW9udGhEYXknKSB8fCBqUXVlcnkoZGF5RWxlbSkuaGFzQ2xhc3MoJ25leHRNb250aERheScpKSB7XHJcbiAgICAgICAgICAgIGpRdWVyeShkYXlFbGVtKS5hZGRDbGFzcygnZGlzYWJsZWQnKS5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICBsZXQgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIC8vaWYgKCFzZWxmLkpJc0F0dHJhY3Rpb24oKSkge1xyXG4gICAgICAgIHRvZGF5ID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgdG9kYXkuZ2V0RGF0ZSgpKTtcclxuICAgICAgICAvL31cclxuXHJcbiAgICAgICAgaWYgKHNlbGYuY29tcGFyZV9hc2MoZGF5RWxlbS5kYXRlT2JqLCB0b2RheS5nZXRUaW1lKCkpID49IDApIHtcclxuXHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNlbGYuZXZlbnRMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY0RhdGUgPSBzZWxmLmNyZWF0ZURhdGVBc1VUQyhkYXlFbGVtLmRhdGVPYmopO1xyXG4gICAgICAgICAgICAgICAgY0RhdGUuc2V0VGltZShjRGF0ZS5nZXRUaW1lKCkgKyBzZWxmLmdldFRpbWV6b25lSW5NaWxpc2Vjb25kcyhjRGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gZmxhdHBpY2tyLmZvcm1hdERhdGUoY0RhdGUsICdZLW0tZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzdGFydF9kYXRlID0gc2VsZi5wYWNrU3RhcnREYXRlKCk7XHJcbiAgICAgICAgbGV0IGVuZF9kYXRlID0gc2VsZi5wYWNrRW5kRGF0ZSgpO1xyXG5cclxuICAgICAgICBpZiAoc3RhcnRfZGF0ZSAhPT0gZmFsc2UgJiYgZW5kX2RhdGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLmNvbXBhcmVfYXNjKGRheUVsZW0uZGF0ZU9iaiwgc3RhcnRfZGF0ZS5nZXRUaW1lKCkgKyBzZWxmLmdldFRpbWV6b25lSW5NaWxpc2Vjb25kcyhzdGFydF9kYXRlKSkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoZGF5RWxlbSkuYWRkQ2xhc3MoJ2ZsYXRwaWNrci1kaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzZWxmLmNvbXBhcmVfYXNjKGRheUVsZW0uZGF0ZU9iaiwgZW5kX2RhdGUuZ2V0VGltZSgpICsgc2VsZi5nZXRUaW1lem9uZUluTWlsaXNlY29uZHMoZW5kX2RhdGUpKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeShkYXlFbGVtKS5hZGRDbGFzcygnZmxhdHBpY2tyLWRpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZvdW5kKSB7XHJcbiAgICAgICAgICAgIGRheUVsZW0uaW5uZXJIVE1MICs9IFwiPHNwYW4gY2xhc3M9J2JiZXZlbnQnPjwvc3Bhbj5cIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBqUXVlcnkoZGF5RWxlbSkuYWRkQ2xhc3MoJ2ZsYXRwaWNrci1kaXNhYmxlZCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVEcm9wRG93bkF0dHJhY3Rpb24obWludCwgbWF4dCwgcmVxZXYsIGksIGopIHtcclxuICAgICAgICBsZXQgZHJvcGQgPSAnPHNlbGVjdCBpPVwiJyArIGkgKyAnXCIgaj1cIicgKyBqICsgJ1wiIG5hbWU9XCJhdHRyYWN0aW9uX3NlbGVjdF8nICsgaSArICdfJyArIGogKyAnXCIgY2xhc3M9XCJhdHRyYWN0aW9uX21pbnRfbWF4dFwiPic7XHJcbiAgICAgICAgbGV0IHN0ZXAgPSAxOy8vdGhpcyBuZWVkcyB0byBiZSBhIHNldHRpbmcgYnV0IGJlY2F1c2Ugb25seSBicmFkIGdhcnJldGggaGFzIHpvbmVzIGFuZCBpcyBmcm9tIDIgKzIgdGhlbiB3ZSBsZWF2ZSBsaWtlIHRoaXNcclxuICAgICAgICBkcm9wZCArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyAwICsgJ1wiPicgKyAwICsgJzwvb3B0aW9uPic7XHJcbiAgICAgICAgZm9yIChsZXQgcCA9IG1pbnQgKyAxOyBwIDwgbWF4dDsgcCA9IHAgKyBzdGVwKSB7XHJcbiAgICAgICAgICAgIGRyb3BkICs9ICc8b3B0aW9uIHZhbHVlPVwiJyArIHAgKyAnXCI+JyArIHAgKyAnPC9vcHRpb24+JztcclxuICAgICAgICB9XHJcbiAgICAgICAgZHJvcGQgKz0gJzwvc2VsZWN0Pic7XHJcbiAgICAgICAgcmV0dXJuIGRyb3BkO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclRpY2tldFNlbGVjdG9yKGV2ZW50X2lkKSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCBwSUQ7XHJcbiAgICAgICAgaWYgKHNlbGYuSklzQXR0cmFjdGlvbigpKSB7XHJcbiAgICAgICAgICAgIHBJRCA9IGpRdWVyeSgnI2F0dHJhY3Rpb25faWQnKS5hdHRyKCdwaWQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwSUQgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgncHJvZHVjdF9pZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICBhY3Rpb246ICdldmVudF9zZWF0cycsXHJcbiAgICAgICAgICAgIHByb2R1Y3RfaWQ6IHBJRCxcclxuICAgICAgICAgICAgZXZlbnRfaWQ6IGV2ZW50X2lkLFxyXG4gICAgICAgICAgICBzZWN1cml0eTogalF1ZXJ5KCcjcndiX2V2ZW50X3NlYXRzX25vbmNlJykudmFsKClcclxuICAgICAgICB9O1xyXG4gICAgICAgIGpRdWVyeSgnYm9keScpLkxvYWRpbmdPdmVybGF5KFwic2hvd1wiKTtcclxuICAgICAgICBqUXVlcnkuYWpheCh7XHJcbiAgICAgICAgICAgI
8443HR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgdXJsOiBiYkxvY2FsLmFqYXhfdXJsLFxyXG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxyXG4gICAgICAgICAgICBzdWNjZXNzOiBqUXVlcnkucHJveHkoc2VsZi5yZW5kZXJUaWNrZXRTZWxlY3RvckNvbXBsZXRlZCwgc2VsZilcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJUaWNrZXRTZWxlY3RvckNvbXBsZXRlZChyZXNwb25zZSkge1xyXG4gICAgICAgIGpRdWVyeSgnYm9keScpLkxvYWRpbmdPdmVybGF5KFwiaGlkZVwiKTtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gdHJ1ZSkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5ldmVudFByb21vdGlvbnMgPSByZXNwb25zZS5ldmVudF9wcm9tb3Rpb25zO1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50U2VjdGlvbnMgPSByZXNwb25zZS5ldmVudF9zZWN0aW9ucztcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJUaWNrZXRTZWxlY3RvckFjdGlvbigpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdFcnJvciEnLFxyXG4gICAgICAgICAgICAgICAgdGV4dDogJ1RoZXJlIHdhcyBhbiBlcnJvciByZW5kZXJpbmcgdGhlIHNlYXRzIGNoYXJ0LiBUaGUgcGFnZSB3aWxsIG5vdyByZWZyZXNoJyxcclxuICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09LJyxcclxuICAgICAgICAgICAgICAgIGNsb3NlT25Db25maXJtOiB0cnVlLFxyXG4gICAgICAgICAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIC8qIFJlYWQgbW9yZSBhYm91dCBpc0NvbmZpcm1lZCwgaXNEZW5pZWQgYmVsb3cgKi9cclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuaXNEZW5pZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1N3YWwuZmlyZSgnQ2hhbmdlcyBhcmUgbm90IHNhdmVkJywgJycsICdpbmZvJylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNvcnRVc2luZ05lc3RlZFRleHQocGFyZW50LCBjaGlsZFNlbGVjdG9yLCBrZXlTZWxlY3Rvcikge1xyXG4gICAgICAgIHZhciBpdGVtcyA9IHBhcmVudC5jaGlsZHJlbihjaGlsZFNlbGVjdG9yKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XHJcbiAgICAgICAgICAgIHZhciB2QSA9IHBhcnNlRmxvYXQoalF1ZXJ5KGtleVNlbGVjdG9yLCBhKS50ZXh0KCkuc3Vic3RyaW5nKDEpKTtcclxuICAgICAgICAgICAgdmFyIHZCID0gcGFyc2VGbG9hdChqUXVlcnkoa2V5U2VsZWN0b3IsIGIpLnRleHQoKS5zdWJzdHJpbmcoMSkpO1xyXG4gICAgICAgICAgICByZXR1cm4gKHZBID4gdkIpID8gLTEgOiAodkEgPCB2QikgPyAxIDogMDtcclxuICAgICAgICB9KTtcclxuICAgICAgICBwYXJlbnQuYXBwZW5kKGl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJUaWNrZXRTZWxlY3RvckFjdGlvbigpIHtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5KQmxhbmtTZWF0c01hcCgpLmhpZGUoKTtcclxuICAgICAgICB0aGlzLkpQcmljZU1hcFNlYXRzKCkuc2hvdygpO1xyXG4gICAgICAgIHRoaXMuSlByaWNlTWFwU2VhdHMoKS5odG1sKCcnKTtcclxuICAgICAgICBpZiAodGhpcy5KWm9uZUltYWdlKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgemltYWdlID0gdGhpcy5KWm9uZUltYWdlKCkuY2xvbmUoKTtcclxuICAgICAgICAgICAgemltYWdlLnJlbW92ZUNsYXNzKCdpc19maXJzdCcpO1xyXG4gICAgICAgICAgICB6aW1hZ2Uuc2hvdygpO1xyXG4gICAgICAgICAgICB0aGlzLkpQcmljZU1hcFNlYXRzKCkuYXBwZW5kKHppbWFnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzZWxlY3RlZFByaWNlTGV2ZWxJZHMgPSBzZWxmLmdldFByaWNlTGV2ZWxJZHMoKTtcclxuXHJcbiAgICAgICAgbGV0IHByaWNlQmxvY2tzQWxsO1xyXG4gICAgICAgIGlmICh0aGlzLkpab25lSW1hZ2UoKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHByaWNlQmxvY2tzQWxsID0gc2VsZi5nZXRQcmljZUJsb2Nrc0FuZFVzZWRCbG9ja3Nab25lcygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHByaWNlQmxvY2tzQWxsID0gc2VsZi5nZXRQcmljZUJsb2Nrc0FuZFVzZWRCbG9ja3NBdHRyYWN0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwcmljZUJsb2Nrc0FyciA9IHByaWNlQmxvY2tzQWxsWydwcmljZUJsb2NrJ107XHJcbiAgICAgICAgbGV0IHByaWNlQmxvY2tzID0gc2VsZi5vYmplY3RUb0FycmF5KHByaWNlQmxvY2tzQXJyKTtcclxuICAgICAgICBwcmljZUJsb2Nrcy5zb3J0KHNlbGYuY29tcGFyZVByaWNlQmxvY2tzKTtcclxuXHJcbiAgICAgICAgbGV0IHVzZWRCbG9ja3MgPSBwcmljZUJsb2Nrc0FsbFsndXNlQmxvY2snXTtcclxuICAgICAgICBsZXQgbkJsb2NrcyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5U2VhdHMgaW4gc2VsZi5ldmVudFNlY3Rpb25zKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFByaWNlTGV2ZWxJZHMgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXNDYXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBzZWxlY3RlZFByaWNlTGV2ZWxJZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ10gPT09IHNlbGVjdGVkUHJpY2VMZXZlbElkc1tpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NhdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpc0NhdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXh0ID0gcGFyc2VJbnQoc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsnYXZhaWxhYmxlUXVhbnRpdHknXSkgKyAxO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgbWludCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydtaW5UaWNrZXRzJ10gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnQgPSBwYXJzZUludChzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydtaW5UaWNrZXRzJ10pIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydtYXhUaWNrZXRzJ10gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUludChzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydtYXhUaWNrZXRzJ10pICsgMSA8IG1heHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heHQgPSBwYXJzZUludChzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydtYXhUaWNrZXRzJ10pICsgMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAobWF4dCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByaWNlTGV2ZUlkID0gc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkpab25lSW1hZ2UoKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmluQXJyYXkobkJsb2NrcywgcHJpY2VMZXZlSWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQmxvY2tzLnB1c2gocHJpY2VMZXZlSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaiBpbiBwcmljZUJsb2Nrcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gcHJpY2VCbG9ja3Nbal1bMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJpY2VCbG9ja3NBcnJba2V5XVsncHJpY2VMZXZlbElkJ10gPT09IHByaWNlTGV2ZUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHVzZWRCbG9ja3NbcHJpY2VMZXZlSWRdWydwcm9tbyddKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodXNlZEJsb2Nrc1twcmljZUxldmVJZF1bJ3Byb21vJ10pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2Nrc1twcmljZUxldmVJZF1bJ3Byb21vJ11ba2V5XSA9IHA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcDEgaW4gdXNlZEJsb2Nrc1twcmljZUxldmVJZF1bJ3Byb21vJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAxID09PSBrZXkgfHwgdGhpcy5KWm9uZUltYWdlKCkubGVuZ3RoID4gMCB8fCB0aGlzLkpJc1JlZGVhbSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBwcmljZUJsb2Nrc0FycltrZXldWydhdHRyYWN0aW9uX3RpdGxlX3ByaWNlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVzYyA9IHByaWNlQmxvY2tzQXJyW2tleV1bJ2F0dHJhY3Rpb25fZGVzY19wcmljZSddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc05hbWVXZWlnaHQgPSBwcmljZUJsb2Nrc0FycltrZXldWydhdHRyYWN0aW9uX2hhc19udyddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBpY2t1cExvY2F0aW9ucyA9IHByaWNlQmxvY2tzQXJyW2tleV1bJ2F0dHJhY3Rpb25fcGlja3VwX2xvYyddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBpY2t1cExvY2F0aW9uc05vbkFwaSA9IHByaWNlQmxvY2tzQXJyW2tleV1bJ2F0dHJhY3Rpb25fcGlja3VwbCddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlQcmljZSA9ICckJyArIHBhcnNlRmxvYXQocHJpY2VCbG9ja3NBcnJba2V5XVsnZnVsbFJldGFpbFByaWNlJ10pLnRvRml4ZWQoMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVxZXYgPSBwcmljZUJsb2Nrc0FycltrZXldWydyZXF1aXJlX2V2ZW5fbnVtYmVyJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW9Db2RlID0gdXNlZEJsb2Nrc1twcmljZUxldmVJZF1bJ3Byb21vJ11bcDFdWydwcm9tb3Rpb25Db2RlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZHJvcGRvd24gPSBzZWxmLmNyZWF0ZURyb3BEb3duQXR0cmFjdGlvbihtaW50LCBtYXh0LCByZXFldiwgcHJvbW9Db2RlLCBwcmljZUxldmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmlncHJpY2VjdXQgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9tb0NvZGUuaW5kZXhPZignQURVTFQnKSA9PT0gLTEgJiYgcHJvbW9Db2RlLmluZGV4T2YoJ0NISUxEJykgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB1c2VkQmxvY2tzW3ByaWNlTGV2ZUlkXVsncHJvbW8nXVtwMV1bJ3ByaWNlQmxvY2tzJ11bcHJpY2VMZXZlSWRdLmJpZ1ByaWNlICE9PSAndW5kZWZpbmVkJyAmJiB1c2VkQmxvY2tzW3ByaWNlTGV2ZUlkXVsncHJvbW8nXVtwMV1bJ3ByaWNlQmxvY2tzJ11bcHJpY2VMZXZlSWRdWydmdWxsUmV0YWlsUHJpY2UnXSAhPT0gdXNlZEJsb2Nrc1twcmljZUxldmVJZF1bJ3Byb21vJ11bcDFdWydwcmljZUJsb2NrcyddW3ByaWNlTGV2ZUlkXS5iaWdQcmljZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWdwcmljZWN1dCA9ICc8c3BhbiBjbGFzcz1cImJpZ3ByaWNlY3V0XCI+JyArIHBhcnNlRmxvYXQodXNlZEJsb2Nrc1twcmljZUxldmVJZF1bJ3Byb21vJ11bcDFdWydwcmljZUJsb2NrcyddW3ByaWNlTGV2ZUlkXS5iaWdQcmljZSkudG9GaXhlZCgyKSArICc8L3NwYW4+J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VkQmxvY2tzW3ByaWNlTGV2ZUlkXVsncHJvbW8nXVtwMV1bJ3ByaWNlQmxvY2tzJ11bcHJpY2VMZXZlSWRdLm11c3Rsb2dpbiAmJiB0eXBlb2YgdXNlZEJsb2Nrc1twcmljZUxldmVJZF1bJ3Byb21vJ11bcDFdWydwcmljZUJsb2NrcyddW3ByaWNlTGV2ZUlkXS5zbWFsbFByaWNlICE9PSAndW5kZWZpbmVkJyAmJiB1c2VkQmxvY2tzW3ByaWNlTGV2ZUlkXVsncHJvbW8nXVtwMV1bJ3ByaWNlQmxvY2tzJ11bcHJpY2VMZXZlSWRdWydmdWxsUmV0YWlsUHJpY2UnXSAhPT0gdXNlZEJsb2Nrc1twcmljZUxldmVJZF1bJ3Byb21vJ11bcDFdWydwcmljZUJsb2NrcyddW3ByaWNlTGV2ZUlkXS5zbWFsbFByaWNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjcHJpY2VfbG9naW5fc2lnbnVwJykuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNudyA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc05hbWVXZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNudyA9ICcgaGFzbncnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc3BwID0gJyc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpdGhEZXNjRGl2ID0gJzxkaXYgY2xhc3M9XCJhdHRyYWN0aW9uX2JveCB3ZGVzY1wiPjxkaXYgY2xhc3M9XCJhdHRyYWN0aW9uX2JveF90aXRsZV9wcmljZVwiPjxkaXYgY2xhc3M9XCJhdHRyYWN0aW9uX2JveF90aXRsZVwiPicgKyB0aXRsZSArICc8L2Rpdj48ZGl2IGNsYXNzPVwiYXR0cmFjdGlvbl9ib3hfcHJpY2VcIj4nICsgaVByaWNlICsgYmlncHJpY2VjdXQgKyAnPC9kaXY+PC9kaXY+PGRpdiBjbGFzcz1cImF0dHJhY3Rpb25fYm94X2Rlc2NfZHJvcGRvd25cIj48ZGl2IGNsYXNzPVwiYXR0cmFjdGlvbl9ib3hfZGVzY1wiPicgKyBkZXNjICsgJzwvZGl2PjxkaXYgY2xhc3M9XCJhdHRyYWN0aW9uX2JveF9kcm9wZG93bicgKyBoYXNudyArICdcIj4nICsgZHJvcGRvd24gKyAnPC9kaXY+PC9kaXY+PC9kaXY+JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3aXRob3V0RGVzY0RpdiA9ICc8ZGl2IGNsYXNzPVwiYXR0cmFjdGlvbl9ib3hcIj48ZGl2IGNsYXNzPVwiYXR0cmFjdGlvbl9ib3hfdGl0bGVfcHJpY2VcIj48ZGl2IGNsYXNzPVwiYXR0cmFjdGlvbl9ib3hfdGl0bGVcIj4nICsgdGl0bGUgKyAnPC9kaXY+PC9kaXY+PGRpdiBjbGFzcz1cImF0dHJhY3Rpb25fYm94X3ByaWNlX2Ryb3Bkb3duXCI+PGRpdiBjbGFzcz1cImF0dHJhY3Rpb25fYm94X3ByaWNlXCI+JyArIGlQcmljZSArIGJpZ3ByaWNlY3V0ICsgJzwvZGl2PjxkaXYgY2xhc3M9XCJhdHRyYWN0aW9uX2JveF9kcm9wZG93bicgKyBoYXNudyArICdcIj4nICsgZHJvcGRvd24gKyAnPC9kaXY+PC9kaXY+PC9kaXY+JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSlByaWNlTWFwU2VhdHMoKS5hcHBlbmQoalF1ZXJ5KHdpdGhEZXNjRGl2KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSlByaWNlTWFwU2VhdHMoKS5hcHBlbmQoalF1ZXJ5KHdpdGhvdXREZXNjRGl2KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGlja3VwTG9jYXRpb25zICYmIHBpY2t1cExvY2F0aW9ucy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBpY2t1cGxvYyA9ICc8ZGl2IGNsYXNzPVwicGlra2xvY1wiPlNlbGVjdCBwaWNrdXAgbG9jYXRpb246IDxzZWxlY3QgbmFtZT1cInBpY2t1cGxvY1wiIGNsYXNzPVwiYXR0cmFjdGlvbl9waWNrdXBsb2NcIj4nO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3BpY2t1cGxvYyArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyAwICsgJ1wiPicgKyAwICsgJzwvb3B0aW9uPic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHBpY2t1cExvY2F0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNrdXBsb2MgKz0gJzxvcHRpb24gdmFsdWU9XCInICsgcGlja3VwTG9jYXRpb25zW2ldWydob3RlbExvY2F0aW9uSWQnXSArICdcIj4nICsgcGlja3VwTG9jYXRpb25zW2ldWydsb2NhdGlvbk5hbWUnXSArICc8L29wdGlvbj4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNrdXBsb2MgKz0gJzwvc2VsZWN0PjwvZGl2Pic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5KUHJpY2VNYXBTZWF0cygpLmFwcGVuZChwaWNrdXBsb2MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLnBpa2tsb2MnKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpY2t1cExvY2F0aW9uc05vbkFwaSAmJiBwaWNrdXBMb2NhdGlvbnNOb25BcGkubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwaWNrdXBsb2MgPSAnPGRpdiBjbGFzcz1cInBpa2tsb2NcIj5TZWxlY3QgcGlja3VwIGxvY2F0aW9uOiA8c2VsZWN0IG5hbWU9XCJwaWNrdXBsb2NcIiBjbGFzcz1cImF0dHJhY3Rpb25fcGlja3VwbG9jXCI+JztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9waWNrdXBsb2MgKz0gJzxvcHRpb24gdmFsdWU9XCInICsgMCArICdcIj4nICsgMCArICc8L29wdGlvbj4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBwaWNrdXBMb2NhdGlvbnNOb25BcGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja3VwbG9jICs9ICc8b3B0aW9uIHZhbHVlPVwiJyArIGkgKyAnXCI+JyArIHBpY2t1cExvY2F0aW9uc05vbkFwaVtpXSArICc8L29wdGlvbj4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNrdXBsb2MgKz0gJzwvc2VsZWN0PjwvZGl2Pic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5KUHJpY2VNYXBTZWF0cygpLmFwcGVuZChwaWNrdXBsb2MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLnBpa2tsb2MnKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWF0X2xhYmVsc19jYXRlZ29yaWVzW3NlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ2tleSddXSA9IFwiXCIgKyBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydwcmljZUxldmVsSUQnXTsvL3NlbGYuc2VsZWN0ZWRQcm9tb0NvZGVbJ3ByaWNlQmxvY2tzJ11bc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ11dWydwcmljZUxldmVsTmFtZSddO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vb2JqZWN0X2NhdGVnb3JpZXNbc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsna2V5J11dID0gc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsnYXZhaWxhYmxlUXVhbnRpdHknXTtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlbGYudXNlZFByaWNlTGV2ZWxJZHMucHVzaChzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydwcmljZUxldmVsSUQnXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbGYuc29ydFVzaW5nTmVzdGVkVGV4dChqUXVlcnkoJyNwcmljZV9tYXBfc2VhdHMnKSwgJy5hdHRyYWN0aW9uX2JveCcsICcuYXR0cmFjdGlvbl9ib3hfcHJpY2UnKTtcclxuICAgICAgICBzZWxmLkpUaWNrZXRzQnV0dG9uc0NhcnQoKS5odG1sKCcnKTtcclxuICAgICAgICBzZWxmLkpUaWNrZXRzQnV0dG9uc0NhcnQoKS5wYXJlbnQoKS5maW5kKCcuYmVzdF9wcmljZV9ndWFyYW50ZWVkJykucmVtb3ZlKCk7XHJcbiAgICAgICAgaWYgKHNlbGYuSklzQXR0cmFjdGlvbigpIHx8IHNlbGYuSlpvbmVJbWFnZSgpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKCFzZWxmLmlzTW9iaWxlKCkpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuSlRpY2tldHNCdXR0b25zQ2FydCgpLmFwcGVuZChqUXVlcnkoJzxkaXYgY2xhc3M9XCJiZXN0X3ByaWNlX2d1YXJhbnRlZWRcIj4gPHNwYW4gY2xhc3M9XCJzbHYgc2x2LWNoZWNrLWNpcmNsZVwiPjwvc3Bhbj48c3BhbiBjbGFzcz1cImJiX2xpbmtfcHJvZHVjdF90ZXh0XCI+QmVzdCBwcmljZSBndWFyYW50ZWVkPC9zcGFuPiA8L2Rpdj4nKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkpUaWNrZXRzQnV0dG9uc0NhcnQoKS5wYXJlbnQoKS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwiYmVzdF9wcmljZV9ndWFyYW50ZWVkXCI+IDxzcGFuIGNsYXNzPVwic2x2IHNsdi1jaGVjay1jaXJjbGVcIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJiYl9saW5rX3Byb2R1Y3RfdGV4dFwiPkJlc3QgcHJpY2UgZ3VhcmFudGVlZDwvc3Bhbj4gPC9kaXY+JykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZWxmLkpUaWNrZXRzQnV0dG9uc0NhcnQoKS5hcHBlbmQoalF1ZXJ5KCc8YSBocmVmPVwiIzBcIiBjbGFzcz1cInNhZGRjYXJ0XCI+QWRkIFRvIENhcnQ8L2E+JykpLmFwcGVuZChqUXVlcnkoJzxhIGhyZWY9XCIjMFwiIGNsYXNzPVwic2J1eW5vd1wiPkJ1eSBOb3c8L2E+JykpOy8vLmFwcGVuZChqUXVlcnkoJzxhIGhyZWY9XCIjMFwiIGNsYXNzPVwiYnV0dG9uIGJ0biBzYWRkX3RvX2NhcnRfYnRuXCI+QWRkIFRvIENhcnQ8L2E+JykpXHJcblxyXG4gICAgICAgIHRoaXMuSkJ1eUJ1dHRvbigpLm9mZignY2xpY2snKS5vbignY2xpY2snLCBqUXVlcnkucHJveHkodGhpcy5idXlOb3dBY3Rpb25BLCB0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5KQWRkVG9DYXJ0QnV0dG9uKCkub2ZmKCdjbGljaycpLm9uKCdjbGljaycsIGpRdWVyeS5wcm94eSh0aGlzLmFkZFRvQ2FydEFjdGlvbkEsIHRoaXMpKTtcclxuXHJcbiAgICAgICAgalF1ZXJ5KCcuYXR0cmFjdGlvbl9ib3hfZHJvcGRvd24gc2VsZWN0Jykub2ZmKCdjaGFuZ2UnKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgaGFzQmlnID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCBzVmFsID0gMDtcclxuXHJcbiAgICAgICAgICAgIGpRdWVyeSgnLmF0dHJhY3Rpb25fYm94X2Ryb3Bkb3duIHNlbGVjdCcpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlSW50KGpRdWVyeSh0aGlzKS52YWwoKSkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaGFzQmlnID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBzVmFsID0gcGFyc2VJbnQoalF1ZXJ5KHRoaXMpLnZhbCgpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGpRdWVyeSgnLm53ZGF0YScpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICBpZiAoaGFzQmlnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoalF1ZXJ5KHRoaXMpLnBhcmVudCgpLmhhc0NsYXNzKCdoYXNudycpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuSlByaWNlTWFwU2VhdHMoKS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwibndkYXRhXCI+PC9kaXY+JykpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoalF1ZXJ5KCcucGlra2xvYycpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcucGlra2xvYycpLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcucGlra2xvYycpLmFwcGVuZFRvKHNlbGYuSlByaWNlTWFwU2VhdHMoKS5maW5kKCcubndkYXRhJykpO1xyXG4gICAgICAgICAgICAgICAgICAgI
8443H1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaTEgPSAwOyBpMSA8IHNWYWw7IGkxKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5KUHJpY2VNYXBTZWF0cygpLmZpbmQoJy5ud2RhdGEnKS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwiYmR3bGhcIj5HdWVzdCAnICsgKGkxICsgMSkgKyAnIERldGFpbHM8L2Rpdj4nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuSlByaWNlTWFwU2VhdHMoKS5maW5kKCcubndkYXRhJykuYXBwZW5kKGpRdWVyeSgnPGRpdiBjbGFzcz1cImJkd2wgYmR3bCcgKyBpMSArICdcIj48L2Rpdj4nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2diA9IFwiLm53ZGF0YSAuYmR3bFwiICsgaTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuSlByaWNlTWFwU2VhdHMoKS5maW5kKHZ2KS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwiYndkbGlcIj4gPGxhYmVsIGNsYXNzPVwibndjYmJcIj5GaXJzdCBOYW1lOjwvbGFiZWw+IDxpbnB1dCBuYW1lPVwiZm5hbWVbXVwiIGNsYXNzPVwibndjYmIgYmJmbmFtZVwiIHR5cGU9XCJ0ZXh0XCI+PC9kaXY+JykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkpQcmljZU1hcFNlYXRzKCkuZmluZCh2dikuYXBwZW5kKGpRdWVyeSgnPGRpdiBjbGFzcz1cImJ3ZGxpXCI+IDxsYWJlbCBjbGFzcz1cIm53Y2JiXCI+TGFzdCBOYW1lOjwvbGFiZWw+IDxpbnB1dCBuYW1lPVwibG5hbWVbXVwiIGNsYXNzPVwibndjYmIgYmJsbmFtZVwiIHR5cGU9XCJ0ZXh0XCI+PC9kaXY+JykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkpQcmljZU1hcFNlYXRzKCkuZmluZCh2dikuYXBwZW5kKGpRdWVyeSgnPGRpdiBjbGFzcz1cImJ3ZGxpXCI+IDxsYWJlbCBjbGFzcz1cIm53Y2JiXCI+V2VpZ2h0OjwvbGFiZWw+IDxpbnB1dCBuYW1lPVwid2VpZ2h0W11cIiBjbGFzcz1cIm53Y2JiIGJid2VpZ2h0XCIgdHlwZT1cIm51bWJlclwiPiA8c3BhbiBjbGFzcz1cImJid2xiXCI+TEI8L3NwYW4+PC9kaXY+JykpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpRdWVyeSgnLnBpa2tsb2MnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLnBpa2tsb2MnKS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLnBpa2tsb2MnKS5hcHBlbmRUbyhzZWxmLkpQcmljZU1hcFNlYXRzKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGpRdWVyeSgnLnRpY2tldHNfY2FydCcpLmluc2VydEFmdGVyKHNlbGYuSlByaWNlTWFwU2VhdHMoKSk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkpUaWNrZXRzQ2FydCgpLnNob3coKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuSlRpY2tldHNCdXR0b25zQ2FydCgpLnNob3coKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZi5KVGlja2V0c0J1dHRvbnNDYXJ0KCkuaGFzQ2xhc3MoJ3RiX2F0dHJhY3Rpb24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuSlRpY2tldHNCdXR0b25zQ2FydCgpLmFkZENsYXNzKCd0Yl9hdHRyYWN0aW9uJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoJy5yd2JfaXNfYXR0cmFjdGlvbicpLmFuaW1hdGUoe3Njcm9sbFRvcDogMH0sICdzbG93Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkpUaWNrZXRzQ2FydCgpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuSlRpY2tldHNCdXR0b25zQ2FydCgpLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBkYXRlQ2hhbmdlZChzZWxlY3RlZERhdGVzLCBkYXRlU3RyLCBpbnN0YW5jZSkge1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgbGV0IGV2ZW50VGltZXMgPSB0aGlzLmV2ZW50TGlzdFtkYXRlU3RyXVsnZXZlbnRfdGltZXMnXTtcclxuICAgICAgICBsZXQgZXZlbnRJZHMgPSB0aGlzLmV2ZW50TGlzdFtkYXRlU3RyXVsnaWQnXTtcclxuICAgICAgICAvKmlmICh0aGlzLkpFdmVudHNQZXJEYXRlKCkuZmxpY2tpdHkoKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5KRXZlbnRzUGVyRGF0ZSgpLmZsaWNraXR5KCdkZXN0cm95Jyk7XHJcbiAgICAgICAgfSovXHJcbiAgICAgICAgc2VsZi5jcmVhdGVEZXN0cm95U2VhdENoYXJ0KCk7XHJcbiAgICAgICAgdGhpcy5KVGlja2V0c0NhcnQoKS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5KRXZlbnRzUGVyRGF0ZSgpLmh0bWwoJycpO1xyXG4gICAgICAgIHRoaXMuSkV2ZW50c1BlckRhdGVCZWZvcmVUZXh0KCkuZmluZCgnLm51bWJlcl9vZl90aWNrZXRzX3RleHQnKS5odG1sKCcnKTtcclxuICAgICAgICB0aGlzLkpFdmVudHNQZXJEYXRlKCkuc2hvdygpO1xyXG4gICAgICAgIHRoaXMuSkV2ZW50U2VsZWN0aW9uKCkuc2hvdygpO1xyXG4gICAgICAgIHRoaXMuSkV2ZW50c1BlckRhdGVCZWZvcmVUZXh0KCkuc2hvdygpO1xyXG4gICAgICAgIGlmIChldmVudFRpbWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5KRXZlbnRzUGVyRGF0ZUJlZm9yZVRleHQoKS5wcmVwZW5kKCc8ZGl2IGNsYXNzPVwibnVtYmVyX29mX3RpY2tldHNfdGV4dFwiPlNlbGVjdCBUaW1lOjwvZGl2PicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcCA9IDA7XHJcbiAgICAgICAgY29uc3QgYyA9IDE7XHJcbiAgICAgICAgZm9yIChjb25zdCBpIGluIGV2ZW50VGltZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5KRXZlbnRzUGVyRGF0ZSgpLmFwcGVuZCh0aGlzLkpUaW1lRWxlbShldmVudElkc1tpXSwgZXZlbnRUaW1lc1tpXSwgZGF0ZVN0ciwgaSkpO1xyXG4gICAgICAgICAgICAvL3RoaXMuSkV2ZW50c1BlckRhdGUoKS5hcHBlbmQodGhpcy5KVGltZUVsZW0oZXZlbnRJZHNbaV0sIGV2ZW50VGltZXNbaV0sIGRhdGVTdHIsIGkpKTtcclxuICAgICAgICAgICAgcCArPSBjO1xyXG4gICAgICAgICAgICAvL3RoaXMuSkV2ZW50c1BlckRhdGUoKS5hcHBlbmQodGhpcy5KVGltZUVsZW0oZXZlbnRJZHNbaV0sIGV2ZW50VGltZXNbaV0sIGRhdGVTdHIsIGkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNlbGYuSklzQXR0cmFjdGlvbigpICYmIHAgPiAxKSB7XHJcbiAgICAgICAgICAgIC8qdGh
8443pcy5KRXZlbnRzUGVyRGF0ZSgpLmZsaWNraXR5KHtcclxuICAgICAgICAgICAgICAgIC8vIG9wdGlvbnNcclxuICAgICAgICAgICAgICAgIGNlbGxBbGlnbjogJ2xlZnQnLFxyXG4gICAgICAgICAgICAgICAgY29udGFpbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGdyb3VwQ2VsbHM6IDEsXHJcbiAgICAgICAgICAgICAgICBjZWxsU2VsZWN0b3I6ICcudGltZV9lbGVtJyxcclxuICAgICAgICAgICAgICAgIC8vd3JhcEFyb3VuZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGZyZWVTY3JvbGw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBkcmFnZ2FibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBwYWdlRG90czogZmFsc2VcclxuICAgICAgICAgICAgfSk7Ki9cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNlYW1sZXNzLmVsZW1lbnRTY3JvbGxJbnRvVmlldyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZXZlbnRfc2VsZWN0aW9uX3RpY2tldCcpLCB7XHJcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcclxuICAgICAgICAgICAgaW5saW5lOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgYmxvY2s6ICdjZW50ZXInXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc2VsZi5zY3JvbGxXaW5kb3coKTtcclxuXHJcbiAgICAgICAgalF1ZXJ5KCcudGltZV9lbGVtJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBzZWxmLnNlbGVjdGVkRXZlbnRJZCA9IGpRdWVyeSh0aGlzKS5hdHRyKCdldmVudF9pZCcpO1xyXG4gICAgICAgICAgICBzZWxmLnNlbGVjdGVkZXZlbnRQcm9tb3Rpb25zSWRzID0gc2VsZi5ldmVudExpc3RbalF1ZXJ5KHRoaXMpLmF0dHIoJ2V2ZW50X2RhdGUnKV1bJ2V2ZW50X3Byb21vdGlvbnMnXVtwYXJzZUludChqUXVlcnkodGhpcykuYXR0cignZXZfcG9zJykpXTtcclxuICAgICAgICAgICAgbGV0IGV2aUhvdXI7XHJcbiAgICAgICAgICAgIGV2aUhvdXIgPSBqUXVlcnkodGhpcykuYXR0cignZXZlbnRfaG91cicpO1xyXG4gICAgICAgICAgICBpZiAoalF1ZXJ5KCcudGltZV9lbGVtJykubGVuZ3RoID09PSAxICYmIHNlbGYuSklzQXR0cmFjdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgICBldmlIb3VyID0gJ25vbmUnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWRFdmVudERhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICAnZXZlbnRfZGF0ZSc6IGpRdWVyeSh0aGlzKS5hdHRyKCdldmVudF9kYXRlJyksXHJcbiAgICAgICAgICAgICAgICAnZXZlbnRfbG9jYXRpb24nOiBqUXVlcnkoJy5zaG93X2xvY2F0aW9uJykuaHRtbCgpLFxyXG4gICAgICAgICAgICAgICAgJ2V2ZW50X3RpbWUnOiBldmlIb3VyLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgalF1ZXJ5KCcudGltZV9lbGVtJykucmVtb3ZlQ2xhc3MoJ3RpbWVfZWxlbV9hY3RpdmUnKTtcclxuICAgICAgICAgICAgalF1ZXJ5KHRoaXMpLmFkZENsYXNzKCd0aW1lX2VsZW1fYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIGlmIChqUXVlcnkoJy50aW1lX2VsZW0nKS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIHNlYW1sZXNzLmVsZW1lbnRTY3JvbGxJbnRvVmlldyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZXZlbnRfc2VsZWN0aW9uX3RpY2tldCcpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxyXG4gICAgICAgICAgICAgICAgICAgIGlubGluZTogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgYmxvY2s6ICdjZW50ZXInXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlYW1sZXNzLmVsZW1lbnRTY3JvbGxJbnRvVmlldyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnBzbV93cmFwcGVyJyksIHtcclxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5saW5lOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICBibG9jazogJ2NlbnRlcidcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNlbGYuc2Nyb2xsV2luZG93KCk7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLkpJc0F0dHJhY3Rpb24oKSB8fCBzZWxmLkpab25lSW1hZ2UoKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnJlbmRlclRpY2tldFNlbGVjdG9yKHNlbGYuc2VsZWN0ZWRFdmVudElkKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyU2VhdENoYXJ0KHNlbGYuc2VsZWN0ZWRFdmVudElkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxldCBkZWZfZXYgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnZGVmX2V2Jyk7XHJcbiAgICAgICAgaWYgKGRlZl9ldiAhPT0gbnVsbCAmJiBkZWZfZXYgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIGpRdWVyeSgnLnRpbWVfZWxlbVtldmVudF9pZD1cIicgKyBkZWZfZXYgKyAnXCJdJykudHJpZ2dlcignY2xpY2snKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoKHNlbGYuSklzQXR0cmFjdGlvbigpIHx8IHNlbGYuSlpvbmVJbWFnZSgpLmxlbmd0aCA+IDApICYmIHAgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeSgnLnRpbWVfZWxlbScpLnRyaWdnZXIoJ2NsaWNrJyk7XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoJy5ldmVudF9zZWxlY3Rpb25fdGlja2V0Om5vdCgucmlzem9uZSknKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFzZWxmLkpJc0F0dHJhY3Rpb24oKSAmJiBwID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoJy50aW1lX2VsZW0nKS50cmlnZ2VyKCdjbGljaycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgdXBkYXRlUGFnZURlc2lnbihkYXRhKSB7XHJcbiAgICAgICAgLy9qUXVlcnkoJy5zaG93X2ltYWdlX3RpY2tldHMnKS5odG1sKGRhdGEuc2VhdF9pbWFnZSk7XHJcbiAgICAgICAgLy9qUXVlcnkoJy5zaG93X2Rlc2NyaXB0aW9uX3RpY2tldHMnKS5odG1sKGRhdGEuc2VhdF90ZXh0KTtcclxuICAgICAgICAvL2pRdWVyeSgnLmZsYXRfY2FsZW5kYXInKS5odG1sKCc8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiZmxhdF9jYWxlbmRhclwiIGlkPVwiZmxhdF9jYWxlbmRhclwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+Jyk7XHJcbiAgICAgICAgLy9qUXVlcnkoJy5zaG93X2J0bl90aWNrZXRzJykuaHRtbCgnPGEgaHJlZj1cIicgKyBkYXRhLmV2ZW50X3VybCArICdcIiBjbGFzcz1cImJ1dHRvbiBidG5cIj4nICsgZGF0YS5ldmVudF91cmxfdGV4dCArICc8L2E+Jyk7XHJcbiAgICAgICAgdGhpcy5maXJzdERhdGVXaXRoRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgbGV0IHRvZGF5ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB0b2RheSA9IHRvZGF5ICsgKG5ldyBEYXRlKCkpLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MCAqIDEwMDAgLSB0b2RheSAlICgzNjAwICogMTAwMCAqIDI0KTtcclxuICAgICAgICBsZXQgbWluVGltZSA9IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwO1xyXG4gICAgICAgIC8vdG9kYXkuc2V0VGltZS
8443h0b2RheS5nZXRUaW1lKCkgKyB0b2RheS5nZXRUaW1lem9uZUluTWlsaXNlY29uZHModG9kYXkpKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmV2ZW50TGlzdCkge1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRfZGF0ZSA9IHNlbGYucGFja1N0YXJ0RGF0ZSgpO1xyXG4gICAgICAgICAgICBsZXQgZW5kX2RhdGUgPSBzZWxmLnBhY2tFbmREYXRlKCk7XHJcbiAgICAgICAgICAgIGxldCBjRGF0ZSA9IHNlbGYuY3JlYXRlRGF0ZUFzVVRDKG5ldyBEYXRlKGtleS5yZXBsYWNlKC8tL2csIFwiL1wiKSArIFwiIDAwOjAwOjAwXCIpKTtcclxuICAgICAgICAgICAgY0RhdGUuc2V0VGltZShjRGF0ZS5nZXRUaW1lKCkgKyBzZWxmLmdldFRpbWV6b25lSW5NaWxpc2Vjb25kcyhjRGF0ZSkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGYuY29tcGFyZV9hc2MoY0RhdGUuZ2V0VGltZSgpLCB0b2RheSkgPj0gMCAmJiBtaW5UaW1lID4gY0RhdGUuZ2V0VGltZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRfZGF0ZSAhPT0gZmFsc2UgJiYgZW5kX2RhdGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29tcGFyZV9hc2MoY0RhdGUuZ2V0VGltZSgpLCBzdGFydF9kYXRlLmdldFRpbWUoKSArIHNlbGYuZ2V0VGltZXpvbmVJbk1pbGlzZWNvbmRzKHN0YXJ0X2RhdGUpKSA+PSAwICYmIHNlbGYuY29tcGFyZV9hc2MoY0RhdGUuZ2V0VGltZSgpLCBlbmRfZGF0ZS5nZXRUaW1lKCkgKyBzZWxmLmdldFRpbWV6b25lSW5NaWxpc2Vjb25kcyhlbmRfZGF0ZSkpIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWluVGltZSA9IGNEYXRlLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJzdERhdGVXaXRoRXZlbnQgPSBjRGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9icmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG1pblRpbWUgPSBjRGF0ZS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJzdERhdGVXaXRoRXZlbnQgPSBjRGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAvL2JyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jcmVhdGVDYWxlbmRhcigpO1xyXG4gICAgICAgIGlmIChzZWxmLmlzUGFjaygpKSB7XHJcbiAgICAgICAgICAgIGpRdWVyeSgnLmJwYWNrc2VhdHMnKS5zaG93KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZGVmX2RhdGUgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnZGVmX2RhdGUnKTtcclxuICAgICAgICBpZiAoZGVmX2RhdGUgIT09IG51bGwgJiYgZGVmX2RhdGUgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXIuc2V0RGF0ZShkZWZfZGF0ZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlckV2ZW50c0NvbXBsZXRlZChyZXNwb25zZSkge1xyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBqUXVlcnkoJ2JvZHknKS5Mb2FkaW5nT3ZlcmxheShcImhpZGVcIik7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRMaXN0ID0gcmVzcG9uc2UuZXZlbnRzO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBhZ2VEZXNpZ24ocmVzcG9uc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0Vycm9yIScsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnVGhlcmUgd2FzIGFuIGVycm9yIHJlbmRlcmluZyB0aGUgZXZlbnRzLiBUaGUgcGFnZSB3aWxsIG5vdyByZWZyZXNoJyxcclxuICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09LJyxcclxuICAgICAgICAgICAgICAgIGNsb3NlT25Db25maXJtOiB0cnVlLFxyXG4gICAgICAgICAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIC8qIFJlYWQgbW9yZSBhYm91dCBpc0NvbmZpcm1lZCwgaXNEZW5pZWQgYmVsb3cgKi9cclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuaXNEZW5pZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1N3YWwuZmlyZSgnQ2hhbmdlcyBhcmUgbm90IHNhdmVkJywgJycsICdpbmZvJylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRTZWF0c01hcCgpIHtcclxuICAgICAgICB0aGlzLnJlbmRlckV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1eVRpY2tldHNBY3Rpb24oKSB7XHJcbiAgICAgICAgdGhpcy5KQnV5VGlja2V0cygpLmF0dHIoJ2hyZWYnLCBqUXVlcnkoJyN1cmxfc2VhdHMnKS5hdHRyKCd1cmwnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZVF0eUFkZFRvQ2FydCgpIHtcclxuICAgICAgICB0aGlzLkpGb3JtKCkuZmluZCgnLnNpbmdsZV9hZGRfdG9fY2FydF9idXR0b24gJykuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMuSkZvcm0oKS5maW5kKCcuc2luZ2xlX2FkZF90b19jYXJ0X2J1dHRvbiAnKS5wcmV2KCkuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAnY2F0ZWdvcnknOiAncmVkJywgJ3RpY2tldFR5cGVzJzogW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3RpY2tldFR5cGUnOiAnYWR1bHQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAncHJpY2UnOiAzMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2xhYmVsJzogJ0ZvciBhZHVsdHMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAnSW5jbHVkZXMgaG90IG1lYWwgYW5kIGEgZHJpbmsnXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd0aWNrZXRUeXBlJzogJ2NoaWxkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3ByaWNlJzogMjAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdsYWJlbCc6ICdGb3IgY2hpbGRyZW4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAnSW5jbHVkZXMgYnVyZ2VyIGFuZCBmcmllcydcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgI
8443H1cclxuICAgICAgICBdXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAge2tleTogJ3JlZCcsIGNvbG9yOiAncmVkJywgbGFiZWw6ICdDYXRlZ29yeSAxJywgYWNjZXNzaWJsZTogdHJ1ZX0sXHJcbiAgICAgICAgICAgICAgICB7a2V5OiAnYmx1ZScsIGNvbG9yOiAnYmx1ZScsIGxhYmVsOiAnQ2F0ZWdvcnkgMid9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgWydyZWQnXVxyXG4gICAgICAgICAgICAqL1xyXG5cclxuICAgIC8qXHJcbiAgIHtcclxuICAgICAgICAgICAgICAgJzEwMS1BLTEnOiAncmVkJyxcclxuICAgICAgICAgICAgICAgJzEwMS1BLTInOiAncmVkJyxcclxuICAgICAgICAgICB9XHJcbiAgICAqL1xyXG5cclxuICAgIG9wYWNpdHlUb0hleChoZXhDb2RlKSB7XHJcbiAgICAgICAgLy9yZXR1cm4gaGV4Q29kZSArICc0RCc7XHJcbiAgICB9XHJcblxyXG4gICAgY29kZUFycmF5KCkge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICcjNjQ5NUVEJywgJyNERTMxNjMnLCAnI0ZGQkYwMCcsICcjNjgwMDkzJyxcclxuICAgICAgICAgICAgJyM5RkUyQkYnLCAnI0ZGN0Y1MCcsICcjQ0NDQ0ZGJywgJyNmZmI2YzEnLFxyXG4gICAgICAgICAgICAnI2ZhODA3MicsICcjODAwMDgwJywgJyMyMGIyYWEnLCAnIzA4OGRhNScsXHJcbiAgICAgICAgICAgICcjZTY4YWJjJywgJyNiZjQ5NzQnLCAnI2Y4MjFmNicsICcjZTJkZTgyJ1xyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJpY2luZ0NhdGVnb3JpZXNBbmRDYXRlZ29yaWVzTGFiZWxzQW5kVW5hdmFpbGFibGVDYXRlZ29yaWVzQW5kU2VhdExhYmVsc0NhdGVnb3JpZXNBenVyZSgpIHtcclxuICAgICAgICBsZXQgY2F0ZWdvcmllcyA9IFtdO1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLnVzZWRQcmljZUxldmVsSWRzID0gW107XHJcbiAgICAgICAgY2F0ZWdvcmllc1sndW5hdmFpbGFibGVfY2F0ZWdvcmllcyddID0gW107XHJcbiAgICAgICAgLy9jYXRlZ29yaWVzWydhdmFpbGFibGVfY2F0ZWdvcmllcyddID0gW107XHJcbiAgICAgICAgY2F0ZWdvcmllc1snY2F0ZWdvcmllc19sYWJlbHMnXSA9IFtdO1xyXG4gICAgICAgIGNhdGVnb3JpZXNbJ3NlYXRfbGFiZWxzX2NhdGVnb3JpZXMnXSA9IFtdO1xyXG4gICAgICAgIGNhdGVnb3JpZXNbJ3ByaWNpbmdfY2F0ZWdvcmllcyddID0gW107XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkUHJpY2VMZXZlbElkcyA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEhvbGRTdWJjbGFzc0lkID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkVGFnc0lkID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzZWxmLnNlbGVjdGVkUHJvbW9Db2RlWydsaW1pdFR5cGUnXTtcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdQcmljZUxldmVsJykge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRQcmljZUxldmVsSWRzID0gc2VsZi5zZWxlY3RlZFByb21vQ29kZVsncHJpY2VMZXZlbElkcyddO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ0hvbGQnKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEhvbGRTdWJjbGFzc0lkID0gc2VsZi5zZWxlY3RlZFByb21vQ29kZVsnaG9sZFN1YmNsYXNzSWQnXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdUYWcnKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRhZ3NJZCA9IHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGVbJ3RhZ0lkcyddO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRQcmljZUxldmVsSWRzID0gc2VsZi5nZXRQcmljZUxldmVsSWRzKCk7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkSG9sZFN1YmNsYXNzSWQgPSBzZWxmLmdldFN1YmhvbGRJZHMoKTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUYWdzSWQgPSBzZWxmLmdldFRhZ0lkcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgY2F0ZWdvcmllc19wcmljaW5nID0gW107XHJcbiAgICAgICAgbGV0IGNhdGVnb3JpZXNfbGFiZWxzID0gW107XHJcbiAgICAgICAgc2VsZi50aWNrZXRUeXBlQWxsID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGxldCB0aWNrZXRUeXBlcyA9IFtdO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRBbmRVc2VkQmxvY2tzID0gc2VsZi5nZXRQcmljZUJsb2Nrc0FuZFVzZWRCbG9ja3MoKTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50ID0gc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50QW5kVXNlZEJsb2Nrcy5wcmljZUJsb2NrO1xyXG4gICAgICAgIHNlbGYudXNlZEJsb2NrcyA9IHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudEFuZFVzZWRCbG9ja3MudXNlQmxvY2s7XHJcbiAgICAgICAgbGV0IHBvID0gMDtcclxuICAgICAgICBsZXQgcHJpY2VCbG9ja0FyciA9IHNlbGYub2JqZWN0VG9BcnJheShzZWxlY3RlZFByb21vQ29kZUVsZW1lbnQpO1xyXG4gICAgICAgIC8vaWYgKCFzZWxmLmlzUGFjaygpKSB7XHJcbiAgICAgICAgcHJpY2VCbG9ja0Fyci5zb3J0KHNlbGYuY29tcGFyZVByaWNlQmxvY2tzUGFjayk7XHJcbiAgICAgICAgLy99IGVsc2Uge1xyXG4gICAgICAgIC8vcHJpY2VCbG9ja0Fyci5zb3J0KHNlbGYuY29tcGFyZVByaWNlQmxvY2tzKTtcclxuICAgICAgICAvL31cclxuXHJcbiAgICAgICAgbGV0IHNlYXRfbGFiZWxzX2NhdGVnb3JpZXMgPSBbXTtcclxuICAgICAgICBsZXQgb2JqZWN0X2NhdGVnb3JpZXMgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleVNlYXRzIGluIHNlbGYuZXZlbnRTZWF0cykge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRQcmljZUxldmVsSWRzICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGlzQ2F0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gc2VsZWN0ZWRQcmljZUxldmVsSWRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddID09PSBzZWxlY3RlZFByaWNlTGV2ZWxJZHNbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDYXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNDYXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlYXRfbGFiZWxzX2NhdGVnb3JpZXNba2V5U2VhdHNdID0gXCJcIiArIHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddOy8vc2VsZi5zZWxlY3RlZFByb21vQ29kZVsncHJpY2VCbG9ja3MnXVtzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXV1bJ3ByaWNlTGV2ZWxOYW1lJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhdF9sYWJlbHNfY2F0ZWdvcmllcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGtleVNlYXRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeUlkOiBcIlwiICsgc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBrZXlTZWF0cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzSWQ6ICdhY3RpdmUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmlsaXR5OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQ6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnYToge21heDogMCwgY3VycmVudDogMH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnVzZWRQcmljZUxldmVsSWRzLnB1c2goc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ10pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgI
8443H1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFRhZ3NJZCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpc0NhdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHNlbGVjdGVkVGFnc0lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3RhZ0lkJ10gPT09IHNlbGVjdGVkVGFnc0lkW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2F0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzQ2F0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWF0X2xhYmVsc19jYXRlZ29yaWVzW2tleVNlYXRzXSA9IFwiXCIgKyBzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXTsvL3NlbGYuc2VsZWN0ZWRQcm9tb0NvZGVbJ3ByaWNlQmxvY2tzJ11bc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ11dWydwcmljZUxldmVsTmFtZSddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlYXRfbGFiZWxzX2NhdGVnb3JpZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBrZXlTZWF0cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlJZDogXCJcIiArIHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDoga2V5U2VhdHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0lkOiAnYWN0aXZlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJpbGl0eTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0OiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2E6IHttYXg6IDAsIGN1cnJlbnQ6IDB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi51c2VkUHJpY2VMZXZlbElkcy5wdXNoKHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRIb2xkU3ViY2xhc3NJZCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpc0NhdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydob2xkU3ViY2xhc3NJZCddID09PSBzZWxlY3RlZEhvbGRTdWJjbGFzc0lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNDYXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzQ2F0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWF0X2xhYmVsc19jYXRlZ29yaWVzW2tleVNlYXRzXSA9IFwiXCIgKyBzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXTsvL3NlbGYuc2VsZWN0ZWRQcm9tb0NvZGVbJ3ByaWNlQmxvY2tzJ11bc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ11dWydwcmljZUxldmVsTmFtZSddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlYXRfbGFiZWxzX2NhdGVnb3JpZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBrZXlTZWF0cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlJZDogXCJcIiArIHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDoga2V5U2VhdHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0lkOiAnYWN0aXZlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJpbGl0eTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0OiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2E6IHttYXg6IDAsIGN1cnJlbnQ6IDB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi51c2VkUHJpY2VMZXZlbElkcy5wdXNoKHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vZ2FTZWN0aW9uc1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGtleVNlYXRzIGluIHNlbGYuZXZlbnRTZWN0aW9ucykge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRQcmljZUxldmVsSWRzICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGlzQ2F0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gc2VsZWN0ZWRQcmljZUxldmVsSWRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJRCddID09PSBzZWxlY3RlZFByaWNlTGV2ZWxJZHNbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDYXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNDYXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlYXRfbGFiZWxzX2NhdGVnb3JpZXNbc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsna2V5J11dID0gXCJcIiArIHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJRCddOy8vc2VsZi5zZWxlY3RlZFByb21vQ29kZVsncHJpY2VCbG9ja3MnXVtzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXV1bJ3ByaWNlTGV2ZWxOYW1lJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhdF9sYWJlbHNfY2F0ZWdvcmllcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ2tleSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeUlkOiBcIlwiICsgc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydrZXknXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzSWQ6ICdhY3RpdmUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmlsaXR5OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQ6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnYToge21heDogc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsnYXZhaWxhYmxlUXVhbnRpdHknXSwgY3VycmVudDogMH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0X2NhdGVnb3JpZXNbc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsna2V5J11dID0gc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsnYXZhaWxhYmxlUXVhbnRpdHknXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnVzZWRQcmljZUxldmVsSWRzLnB1c2goc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ10pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkVGFnc0lkICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGlzQ2F0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gc2VsZWN0ZWRUYWdzSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsndGFnSWQnXSA9PT0gc2VsZWN0ZWRUYWdzSWRbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDYXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNDYXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlYXRfbGFiZWxzX2NhdGVnb3JpZXNbc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsna2V5J11dID0gXCJcIiArIHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJRCddOy8vc2VsZi5zZWxlY3RlZFByb21vQ29kZVsncHJpY2VCbG9ja3MnXVtzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXV1bJ3ByaWNlTGV2ZWxOYW1lJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhdF9sYWJlbHNfY2F0ZWdvcmllcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ2tleSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeUlkOiBcIlwiICsgc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydrZXknXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzSWQ6ICdhY3RpdmUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmlsaXR5OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQ6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnYToge21heDogc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsnYXZhaWxhYmxlUXVhbnRpdHknXSwgY3VycmVudDogMH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RfY2F0ZWdvcmllc1tzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydrZXknXV0gPSBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydhdmFpbGFibGVRdWFudGl0eSddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudXNlZFByaWNlTGV2ZWxJZHMucHVzaChzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydwcmljZUxldmVsSUQnXSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkSG9sZFN1YmNsYXNzSWQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXNDYXQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsnaG9sZFN1YmNsYXNzSWQnXSA9PT0gc2VsZWN0ZWRIb2xkU3ViY2xhc3NJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlzQ2F0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpc0NhdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2VhdF9sYWJlbHNfY2F0ZWdvcmllc1tzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydrZXknXV0gPSBcIlwiICsgc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ107Ly9zZWxmLnNlbGVjdGVkUHJvbW9Db2RlWydwcmljZUJsb2NrcyddW3NlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddXVsncHJpY2VMZXZlbE5hbWUnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWF0X2xhYmVsc19jYXRlZ29yaWVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsna2V5J10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5SWQ6IFwiXCIgKyBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydwcmljZUxldmVsSUQnXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ2tleSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNJZDogJ2FjdGl2ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FiaWxpdHk6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGVydDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdhOiB7bWF4OiBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydhdmFpbGFibGVRdWFudGl0eSddLCBjdXJyZW50OiAwfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdF9jYXRlZ29yaWVzW3NlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ2tleSddXSA9IHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ2F2YWlsYWJsZVF1YW50aXR5J107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi51c2VkUHJpY2VMZXZlbElkcy5wdXNoKHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJRCddKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpMSA9IDA7IGkxIDwgcHJpY2VCbG9ja0Fyci5sZW5ndGg7IGkxKyspIHtcclxuICAgICAgICAgICAgY29uc3Qga2V5UHJpY2UgPSBwcmljZUJsb2NrQXJyW2kxXVswXTtcclxuICAgICAgICAgICAgLy9jb25zdCB2YWx1ZSA9IHByaWNlQmxvY2tBcnJbaTFdWzFdO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi51c2VkUHJpY2VMZXZlbElkcyAhPT0gZmFsc2UgJiYgc2VsZi5pbkFycmF5KHNlbGYudXNlZFByaWNlTGV2ZWxJZHMsIHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddKSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCB0aWNrZXRUeXBlID0gW107XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRpY2tldFR5cGVzW3NlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aWNrZXRUeXBlID0gdGlja2V0VHlwZXNbc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50W2tleVByaWNlXVsncHJpY2VMZXZlbElkJ11dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHRpY2tldFR5cGVTaW5ndWxhciA9IHt9O1xyXG4gICAgICAgICAgICAgICAgdGlja2V0VHlwZVNpbmd1bGFyWyd0aWNrZXRUeXBlJ10gPSBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZVR5cGVOYW1lJ107XHJcbiAgICAgICAgICAgICAgICB0aWNrZXRUeXBlU2luZ3VsYXJbJ2xhYmVsJ10gPSBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZVR5cGVOYW1lJ107XHJcbiAgICAgICAgICAgICAgICB0aWNrZXRUeXBlU2luZ3VsYXJbJ3ByaWNlJ10gPSBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydmdWxsUmV0YWlsUHJpY2UnXTtcclxuICAgICAgICAgICAgICAgI
8443HRpY2tldFR5cGUucHVzaCh0aWNrZXRUeXBlU2luZ3VsYXIpO1xyXG4gICAgICAgICAgICAgICAgdGlja2V0VHlwZXNbc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50W2tleVByaWNlXVsncHJpY2VMZXZlbElkJ11dID0gdGlja2V0VHlwZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaTEgPSAwOyBpMSA8IHByaWNlQmxvY2tBcnIubGVuZ3RoOyBpMSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleVByaWNlID0gcHJpY2VCbG9ja0FycltpMV1bMF07XHJcbiAgICAgICAgICAgIC8vY29uc3QgdmFsdWUgPSBwcmljZUJsb2NrQXJyW2kxXVsxXTtcclxuICAgICAgICAgICAgaWYgKHNlbGYudXNlZFByaWNlTGV2ZWxJZHMgIT09IGZhbHNlICYmIHNlbGYuaW5BcnJheShzZWxmLnVzZWRQcmljZUxldmVsSWRzLCBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXSkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY2F0ZWdvcnlfcHJpY2luZyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV0gIT09ICd1bmRlZmluZWQnICYmIHRpY2tldFR5cGVzW3NlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddXS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfcHJpY2luZ1snY2F0ZWdvcnlJZCddID0gXCJcIiArIHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X3ByaWNpbmdbJ3RpY2tldFR5cGVzJ10gPSB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV0gIT09ICd1bmRlZmluZWQnICYmIHRpY2tldFR5cGVzW3NlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddXS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2xldCB0aWNrZXRUeXBlU2luZ3VsYXIgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnRpY2tldFR5cGVBbGwgPSB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV1bMF1bJ3RpY2tldFR5cGUnXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9wcmljaW5nWyduYW1lJ10gPSB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV1bMF1bJ2xhYmVsJ107XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfcHJpY2luZ1sncHJpY2UnXSA9IHRpY2tldFR5cGVzW3NlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddXVswXVsncHJpY2UnXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9wcmljaW5nWydjYXRlZ29yeUlkJ10gPSBcIlwiICsgc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50W2tleVByaWNlXVsncHJpY2VMZXZlbElkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jYXRlZ29yeV9wcmljaW5nWydjYXRlZ29yeSddID0gdGlja2V0VHlwZVNpbmd1bGFyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNhdGVnb3JpZXNfcHJpY2luZy5wdXNoKGNhdGVnb3J5X3ByaWNpbmcpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjYXRlZ29yeV9sYWJlbCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlfbGFiZWxbJ2NhdGVnb3J5SWQnXSA9IFwiXCIgKyBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXTsvL2NyZWF0ZSBhIG5ldyBjYXQgYmFzZWQgb24gYWRhVHlwZXNcclxuICAgICAgICAgICAgICAgIGNhdGVnb3J5X2xhYmVsWydjb2xvciddID0gXCJcIiArIHNlbGYuY29kZUFycmF5KClbcG9dO1xyXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlfbGFiZWxbJ25hbWUnXSA9IFwiXCIgKyBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsTmFtZSddO1xyXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlfbGFiZWxbJ3N0YXR1cyddID0gJ2FjdGl2ZSc7XHJcbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzX2xhYmVscy5wdXNoKGNhdGVnb3J5X2xhYmVsKTtcclxuICAgICAgICAgICAgICAgIC8vY2F0ZWdvcmllc1snYXZhaWxhYmxlX2NhdGVnb3JpZXMnXS5wdXNoKGNhdGVnb3J5X2xhYmVsWydrZXknXSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2F0ZWdvcnlfbGFiZWxfbm90ID0ge307XHJcbiAgICAgICAgICAgICAgICBjYXRlZ29yeV9sYWJlbF9ub3RbJ2tleSddID0gXCJub3RfYXZhaWxhYmxlXCIgKyBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXTsvL2NyZWF0ZSBhIG5ldyBjYXQgYmFzZWQgb24gYWRhVHlwZXNcclxuICAgICAgICAgICAgICAgIGNhdGVnb3J5X2xhYmVsX25vdFsnY29sb3InXSA9IFwiXCIgKyBzZWxmLmNvbnZlcnRIZXgoc2VsZi5jb2RlQXJyYXkoKVtwb10sIDMyKTtcclxuICAgICAgICAgICAgICAgIGNhdGVnb3J5X2xhYmVsX25vdFsnbGFiZWwnXSA9IFwiTm90IEF2YWlsYWJsZVwiO1xyXG4gICAgICAgICAgICAgICAgY2F0ZWdvcmllc1sndW5hdmFpbGFibGVfY2F0ZWdvcmllcyddLnB1c2goY2F0ZWdvcnlfbGFiZWxfbm90WydrZXknXSk7XHJcbiAgICAgICAgICAgICAgICAvL2NhdGVnb3JpZXNfbGFiZWxzLnB1c2goY2F0ZWdvcnlfbGFiZWxfbm90KTtcclxuICAgICAgICAgICAgICAgIHBvKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhdGVnb3JpZXNbJ3NlYXRfbGFiZWxzX2NhdGVnb3JpZXMnXSA9IHNlYXRfbGFiZWxzX2NhdGVnb3JpZXM7XHJcbiAgICAgICAgc2VsZi5ldmVudFNlY3Rpb25zQ2FwYWNpdHkgPSBvYmplY3RfY2F0ZWdvcmllcztcclxuICAgICAgICBjYXRlZ29yaWVzWydvYmplY3RfY2F0ZWdvcmllcyddID0gb2JqZWN0X2NhdGVnb3JpZXM7XHJcbiAgICAgICAgY2F0ZWdvcmllc1sncHJpY2luZ19jYXRlZ29yaWVzJ10gPSBjYXRlZ29yaWVzX3ByaWNpbmc7XHJcbiAgICAgICAgY2F0ZWdvcmllc1snY2F0ZWdvcmllc19sYWJlbHMnXSA9IGNhdGVnb3JpZXNfbGFiZWxzO1xyXG5cclxuICAgICAgICByZXR1cm4gY2F0ZWdvcmllcztcclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0UHJpY2luZ0NhdGVnb3JpZXNBbmRDYXRlZ29yaWVzTGFiZWxzQW5kVW5hdmFpbGFibGVDYXRlZ29yaWVzQW5kU2VhdExhYmVsc0NhdGVnb3JpZXMoKSB7XHJcbiAgICAgICAgbGV0IGNhdGVnb3JpZXMgPSBbXTtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi51c2VkUHJpY2VMZXZlbElkcyA9IFtdO1xyXG4gICAgICAgIGNhdGVnb3JpZXNbJ3VuYXZhaWxhYmxlX2NhdGVnb3JpZXMnXSA9IFtdO1xyXG4gICAgICAgIC8vY2F0ZWdvcmllc1snYXZhaWxhYmxlX2NhdGVnb3JpZXMnXSA9IFtdO1xyXG4gICAgICAgIGNhdGVnb3JpZXNbJ2NhdGVnb3JpZXNfbGFiZWxzJ10gPSBbXTtcclxuICAgICAgICBjYXRlZ29yaWVzWydzZWF0X2xhYmVsc19jYXRlZ29yaWVzJ10gPSB7fTtcclxuICAgICAgICBjYXRlZ29yaWVzWydwcmljaW5nX2NhdGVnb3JpZXMnXSA9IFtdO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZFByaWNlTGV2ZWxJZHMgPSBmYWxzZTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRIb2xkU3ViY2xhc3NJZCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZFRhZ3NJZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChzZWxmLnNlbGVjdGVkUHJvbW9Db2RlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gc2VsZi5zZWxlY3RlZFByb21vQ29kZVsnbGltaXRUeXBlJ107XHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnUHJpY2VMZXZlbCcpIHtcclxuICAgICAgICAgICAgICAgI
8443HNlbGVjdGVkUHJpY2VMZXZlbElkcyA9IHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGVbJ3ByaWNlTGV2ZWxJZHMnXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdIb2xkJykge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRIb2xkU3ViY2xhc3NJZCA9IHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGVbJ2hvbGRTdWJjbGFzc0lkJ107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnVGFnJykge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUYWdzSWQgPSBzZWxmLnNlbGVjdGVkUHJvbW9Db2RlWyd0YWdJZHMnXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkUHJpY2VMZXZlbElkcyA9IHNlbGYuZ2V0UHJpY2VMZXZlbElkcygpO1xyXG4gICAgICAgICAgICBzZWxlY3RlZEhvbGRTdWJjbGFzc0lkID0gc2VsZi5nZXRTdWJob2xkSWRzKCk7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVGFnc0lkID0gc2VsZi5nZXRUYWdJZHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNhdGVnb3JpZXNfcHJpY2luZyA9IFtdO1xyXG4gICAgICAgIGxldCBjYXRlZ29yaWVzX2xhYmVscyA9IFtdO1xyXG4gICAgICAgIHNlbGYudGlja2V0VHlwZUFsbCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgdGlja2V0VHlwZXMgPSBbXTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50QW5kVXNlZEJsb2NrcyA9IHNlbGYuZ2V0UHJpY2VCbG9ja3NBbmRVc2VkQmxvY2tzKCk7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudCA9IHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudEFuZFVzZWRCbG9ja3MucHJpY2VCbG9jaztcclxuICAgICAgICBzZWxmLnVzZWRCbG9ja3MgPSBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRBbmRVc2VkQmxvY2tzLnVzZUJsb2NrO1xyXG4gICAgICAgIGxldCBwbyA9IDA7XHJcbiAgICAgICAgbGV0IHByaWNlQmxvY2tBcnIgPSBzZWxmLm9iamVjdFRvQXJyYXkoc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50KTtcclxuICAgICAgICAvL2lmICghc2VsZi5pc1BhY2soKSkge1xyXG4gICAgICAgIHByaWNlQmxvY2tBcnIuc29ydChzZWxmLmNvbXBhcmVQcmljZUJsb2Nrc1BhY2spO1xyXG4gICAgICAgIC8vfSBlbHNlIHtcclxuICAgICAgICAvL3ByaWNlQmxvY2tBcnIuc29ydChzZWxmLmNvbXBhcmVQcmljZUJsb2Nrcyk7XHJcbiAgICAgICAgLy99XHJcblxyXG4gICAgICAgIGxldCBzZWF0X2xhYmVsc19jYXRlZ29yaWVzID0ge307XHJcbiAgICAgICAgbGV0IG9iamVjdF9jYXRlZ29yaWVzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXlTZWF0cyBpbiBzZWxmLmV2ZW50U2VhdHMpIHtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkUHJpY2VMZXZlbElkcyAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpc0NhdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHNlbGVjdGVkUHJpY2VMZXZlbElkcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXSA9PT0gc2VsZWN0ZWRQcmljZUxldmVsSWRzW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2F0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzQ2F0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhdF9sYWJlbHNfY2F0ZWdvcmllc1trZXlTZWF0c10gPSBcIlwiICsgc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ107Ly9zZWxmLnNlbGVjdGVkUHJvbW9Db2RlWydwcmljZUJsb2NrcyddW3NlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddXVsncHJpY2VMZXZlbE5hbWUnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnVzZWRQcmljZUxldmVsSWRzLnB1c2goc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ10pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlYXRfbGFiZWxzX2NhdGVnb3JpZXNba2V5U2VhdHNdID0gJ25vdF9hdmFpbGFibGUnICsgc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFRhZ3NJZCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpc0NhdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHNlbGVjdGVkVGFnc0lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3RhZ0lkJ10gPT09IHNlbGVjdGVkVGFnc0lkW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2F0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzQ2F0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhdF9sYWJlbHNfY2F0ZWdvcmllc1trZXlTZWF0c10gPSBcIlwiICsgc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ107Ly9zZWxmLnNlbGVjdGVkUHJvbW9Db2RlWydwcmljZUJsb2NrcyddW3NlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddXVsncHJpY2VMZXZlbE5hbWUnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnVzZWRQcmljZUxldmVsSWRzLnB1c2goc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ10pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlYXRfbGFiZWxzX2NhdGVnb3JpZXNba2V5U2VhdHNdID0gXCJub3RfYXZhaWxhYmxlXCIgKyBzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXTtcclxuICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkSG9sZFN1YmNsYXNzSWQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXNDYXQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsnaG9sZFN1YmNsYXNzSWQnXSA9PT0gc2VsZWN0ZWRIb2xkU3ViY2xhc3NJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlzQ2F0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpc0NhdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlYXRfbGFiZWxzX2NhdGVnb3JpZXNba2V5U2VhdHNdID0gXCJcIiArIHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddOy8vc2VsZi5zZWxlY3RlZFByb21vQ29kZVsncHJpY2VCbG9ja3MnXVtzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXV1bJ3ByaWNlTGV2ZWxOYW1lJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi51c2VkUHJpY2VMZXZlbElkcy5wdXNoKHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWF0X2xhYmVsc19jYXRlZ29yaWVzW2tleVNlYXRzXSA9IFwibm90X2F2YWlsYWJsZVwiICsgc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy9nYVNlY3Rpb25zXHJcblxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5U2VhdHMgaW4gc2VsZi5ldmVudFNlY3Rpb25zKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFByaWNlTGV2ZWxJZHMgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXNDYXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBzZWxlY3RlZFByaWNlTGV2ZWxJZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ10gPT09IHNlbGVjdGVkUHJpY2VMZXZlbElkc1tpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NhdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpc0NhdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlYXRfbGFiZWxzX2NhdGVnb3JpZXNbc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsna2V5J11dID0gXCJcIiArIHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJRCddOy8vc2VsZi5zZWxlY3RlZFByb21vQ29kZVsncHJpY2VCbG9ja3MnXVtzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXV1bJ3ByaWNlTGV2ZWxOYW1lJ107XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0X2NhdGVnb3JpZXNbc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsna2V5J11dID0gc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsnYXZhaWxhYmxlUXVhbnRpdHknXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnVzZWRQcmljZUxldmVsSWRzLnB1c2goc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ10pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlYXRfbGFiZWxzX2NhdGVnb3JpZXNba2V5U2VhdHNdID0gJ25vdF9hdmFpbGFibGUnICsgc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFRhZ3NJZCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpc0NhdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHNlbGVjdGVkVGFnc0lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3RhZ0lkJ10gPT09IHNlbGVjdGVkVGFnc0lkW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2F0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzQ2F0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhdF9sYWJlbHNfY2F0ZWdvcmllc1tzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydrZXknXV0gPSBcIlwiICsgc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ107Ly9zZWxmLnNlbGVjdGVkUHJvbW9Db2RlWydwcmljZUJsb2NrcyddW3NlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddXVsncHJpY2VMZXZlbE5hbWUnXTtcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RfY2F0ZWdvcmllc1tzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydrZXknXV0gPSBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydhdmFpbGFibGVRdWFudGl0eSddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudXNlZFByaWNlTGV2ZWxJZHMucHVzaChzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydwcmljZUxldmVsSUQnXSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2VhdF9sYWJlbHNfY2F0ZWdvcmllc1trZXlTZWF0c10gPSBcIm5vdF9hdmFpbGFibGVcIiArIHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRIb2xkU3ViY2xhc3NJZCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpc0NhdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydob2xkU3ViY2xhc3NJZCddID09PSBzZWxlY3RlZEhvbGRTdWJjbGFzc0lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNDYXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzQ2F0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhdF9sYWJlbHNfY2F0ZWdvcmllc1tzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydrZXknXV0gPSBcIlwiICsgc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ107Ly9zZWxmLnNlbGVjdGVkUHJvbW9Db2RlWydwcmljZUJsb2NrcyddW3NlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddXVsncHJpY2VMZXZlbE5hbWUnXTtcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RfY2F0ZWdvcmllc1tzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydrZXknXV0gPSBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydhdmFpbGFibGVRdWFudGl0eSddO1xyXG4gICAgICAgICAgICAgICAgICAgI
8443HNlbGYudXNlZFByaWNlTGV2ZWxJZHMucHVzaChzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydwcmljZUxldmVsSUQnXSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2VhdF9sYWJlbHNfY2F0ZWdvcmllc1trZXlTZWF0c10gPSBcIm5vdF9hdmFpbGFibGVcIiArIHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpMSA9IDA7IGkxIDwgcHJpY2VCbG9ja0Fyci5sZW5ndGg7IGkxKyspIHtcclxuICAgICAgICAgICAgY29uc3Qga2V5UHJpY2UgPSBwcmljZUJsb2NrQXJyW2kxXVswXTtcclxuICAgICAgICAgICAgLy9jb25zdCB2YWx1ZSA9IHByaWNlQmxvY2tBcnJbaTFdWzFdO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi51c2VkUHJpY2VMZXZlbElkcyAhPT0gZmFsc2UgJiYgc2VsZi5pbkFycmF5KHNlbGYudXNlZFByaWNlTGV2ZWxJZHMsIHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddKSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCB0aWNrZXRUeXBlID0gW107XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRpY2tldFR5cGVzW3NlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aWNrZXRUeXBlID0gdGlja2V0VHlwZXNbc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50W2tleVByaWNlXVsncHJpY2VMZXZlbElkJ11dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHRpY2tldFR5cGVTaW5ndWxhciA9IHt9O1xyXG4gICAgICAgICAgICAgICAgdGlja2V0VHlwZVNpbmd1bGFyWyd0aWNrZXRUeXBlJ10gPSBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZVR5cGVOYW1lJ107XHJcbiAgICAgICAgICAgICAgICB0aWNrZXRUeXBlU2luZ3VsYXJbJ2xhYmVsJ10gPSBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZVR5cGVOYW1lJ107XHJcbiAgICAgICAgICAgICAgICB0aWNrZXRUeXBlU2luZ3VsYXJbJ3ByaWNlJ10gPSBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydmdWxsUmV0YWlsUHJpY2UnXTtcclxuICAgICAgICAgICAgICAgIHRpY2tldFR5cGUucHVzaCh0aWNrZXRUeXBlU2luZ3VsYXIpO1xyXG4gICAgICAgICAgICAgICAgdGlja2V0VHlwZXNbc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50W2tleVByaWNlXVsncHJpY2VMZXZlbElkJ11dID0gdGlja2V0VHlwZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaTEgPSAwOyBpMSA8IHByaWNlQmxvY2tBcnIubGVuZ3RoOyBpMSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleVByaWNlID0gcHJpY2VCbG9ja0FycltpMV1bMF07XHJcbiAgICAgICAgICAgIC8vY29uc3QgdmFsdWUgPSBwcmljZUJsb2NrQXJyW2kxXVsxXTtcclxuICAgICAgICAgICAgaWYgKHNlbGYudXNlZFByaWNlTGV2ZWxJZHMgIT09IGZhbHNlICYmIHNlbGYuaW5BcnJheShzZWxmLnVzZWRQcmljZUxldmVsSWRzLCBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXSkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY2F0ZWdvcnlfcHJpY2luZyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV0gIT09ICd1bmRlZmluZWQnICYmIHRpY2tldFR5cGVzW3NlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddXS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfcHJpY2luZ1snY2F0ZWdvcnknXSA9IHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X3ByaWNpbmdbJ3RpY2tldFR5cGVzJ10gPSB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV0gIT09ICd1bmRlZmluZWQnICYmIHRpY2tldFR5cGVzW3NlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddXS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2xldCB0aWNrZXRUeXBlU2luZ3VsYXIgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnRpY2tldFR5cGVBbGwgPSB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV1bMF1bJ3RpY2tldFR5cGUnXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9wcmljaW5nWydsYWJlbCddID0gdGlja2V0VHlwZXNbc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50W2tleVByaWNlXVsncHJpY2VMZXZlbElkJ11dWzBdWydsYWJlbCddO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X3ByaWNpbmdbJ3ByaWNlJ10gPSB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV1bMF1bJ3ByaWNlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfcHJpY2luZ1snY2F0ZWdvcnknXSA9IHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY2F0ZWdvcnlfcHJpY2luZ1snY2F0ZWdvcnknXSA9IHRpY2tldFR5cGVTaW5ndWxhcjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzX3ByaWNpbmcucHVzaChjYXRlZ29yeV9wcmljaW5nKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY2F0ZWdvcnlfbGFiZWwgPSB7fTtcclxuICAgICAgICAgICAgICAgIGNhdGVnb3J5X2xhYmVsWydrZXknXSA9IFwiXCIgKyBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXTsvL2NyZWF0ZSBhIG5ldyBjYXQgYmFzZWQgb24gYWRhVHlwZXNcclxuICAgICAgICAgICAgICAgIGNhdGVnb3J5X2xhYmVsWydjb2xvciddID0gXCJcIiArIHNlbGYuY29kZUFycmF5KClbcG9dO1xyXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlfbGFiZWxbJ2xhYmVsJ10gPSBcIlwiICsgc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50W2tleVByaWNlXVsncHJpY2VMZXZlbE5hbWUnXTtcclxuICAgICAgICAgICAgICAgIGNhdGVnb3JpZXNfbGFiZWxzLnB1c2goY2F0ZWdvcnlfbGFiZWwpO1xyXG4gICAgICAgICAgICAgICAgLy9jYXRlZ29yaWVzWydhdmFpbGFibGVfY2F0ZWdvcmllcyddLnB1c2goY2F0ZWdvcnlfbGFiZWxbJ2tleSddKTtcclxuICAgICAgICAgICAgICAgIGxldCBjYXRlZ29yeV9sYWJlbF9ub3QgPSB7fTtcclxuICAgICAgICAgICAgICAgIGNhdGVnb3J5X2xhYmVsX25vdFsna2V5J10gPSBcIm5vdF9hdmFpbGFibGVcIiArIHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddOy8vY3JlYXRlIGEgbmV3IGNhdCBiYXNlZCBvbiBhZGFUeXBlc1xyXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlfbGFiZWxfbm90Wydjb2xvciddID0gXCJcIiArIHNlbGYuY29udmVydEhleChzZWxmLmNvZGVBcnJheSgpW3BvXSwgMzIpO1xyXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlfbGFiZWxfbm90WydsYWJlbCddID0gXCJOb3QgQXZhaWxhYmxlXCI7XHJcbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzWyd1bmF2YWlsYWJsZV9jYXRlZ29yaWVzJ10ucHVzaChjYXRlZ29yeV9sYWJlbF9ub3RbJ2tleSddKTtcclxuICAgICAgICAgICAgICAgIGNhdGVnb3JpZXNfbGFiZWxzLnB1c2goY2F0ZWdvcnlfbGFiZWxfbm90KTtcclxuICAgICAgICAgICAgICAgI
8443HBvKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhdGVnb3JpZXNbJ3NlYXRfbGFiZWxzX2NhdGVnb3JpZXMnXSA9IHNlYXRfbGFiZWxzX2NhdGVnb3JpZXM7XHJcbiAgICAgICAgc2VsZi5ldmVudFNlY3Rpb25zQ2FwYWNpdHkgPSBvYmplY3RfY2F0ZWdvcmllcztcclxuICAgICAgICBjYXRlZ29yaWVzWydvYmplY3RfY2F0ZWdvcmllcyddID0gT2JqZWN0LmFzc2lnbih7fSwgb2JqZWN0X2NhdGVnb3JpZXMpO1xyXG4gICAgICAgIGNhdGVnb3JpZXNbJ3ByaWNpbmdfY2F0ZWdvcmllcyddID0gY2F0ZWdvcmllc19wcmljaW5nO1xyXG4gICAgICAgIGNhdGVnb3JpZXNbJ2NhdGVnb3JpZXNfbGFiZWxzJ10gPSBjYXRlZ29yaWVzX2xhYmVscztcclxuXHJcbiAgICAgICAgcmV0dXJuIGNhdGVnb3JpZXM7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlRGVzdHJveVNlYXRDaGFydCgpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWF0Q2hhcnQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJDYXJ0KCk7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZWF0Q2hhcnQuZGVzdHJveSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhdENoYXJ0LmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeSgnI3NlYXRzX21hcCcpLmh0bWwoJycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuSkJ1eUJ1dHRvbigpLkxvYWRpbmdPdmVybGF5KCdoaWRlJyk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RDaGFydCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFdmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VhdENoYXJ0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5KUHJpY2VNYXAoKS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5KUHJpY2VNYXBTZWF0cygpLmhpZGUoKTtcclxuICAgICAgICB0aGlzLkpQcmljZU1hcEV4cGxhbmF0aW9uKCkuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMuSkJsYW5rU2VhdHNNYXAoKS5zaG93KCk7XHJcbiAgICAgICAgaWYgKHRoaXMuSlRoZW1lKCkgPT09ICdsaWdodCcpIHtcclxuICAgICAgICAgICAgdGhpcy5KQmxhbmtTZWF0c01hcCgpLmh0bWwoJzxpbWcgc3R5bGU9XCJwYWRkaW5nOjgwcHg7XCIgc3JjPVwiL3dwLWNvbnRlbnQvdGhlbWVzL3BvcnRvL2ltYWdlcy9ub19zZWxlY3Rpb25fZGF0ZV90aW1lX2xpZ2h0LnBuZ1wiLz48aDQ+U2VsZWN0IGEgdGltZTwvaDQ+Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5KQmxhbmtTZWF0c01hcCgpLmh0bWwoJzxoND5TZWxlY3QgYSB0aW1lPC9oND48aW1nIHN0eWxlPVwicGFkZGluZzo4MHB4O1wiIHNyYz1cIi93cC1jb250ZW50L3RoZW1lcy9wb3J0by9pbWFnZXMvbm9fc2VsZWN0aW9uX2RhdGVfdGltZS5wbmdcIi8+Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuSlRpY2tldHNTZWxlY3RlZENhcnQoKS5odG1sKCcnKTtcclxuICAgICAgICB0aGlzLkpUaWNrZXRzQnV0dG9uc0NhcnQoKS5oaWRlKCk7XHJcbiAgICAgICAgalF1ZXJ5KCcuYnByb2NlZWRfdGlja2V0cycpLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb252ZXJ0SGV4KGhleENvZGUsIG9wYWNpdHkpIHtcclxuICAgICAgICB2Y
8443XIgaGV4ID0gaGV4Q29kZS5yZXBsYWNlKCcjJywgJycpO1xyXG5cclxuICAgICAgICBpZiAoaGV4Lmxlbmd0aCA9PT0gMykge1xyXG4gICAgICAgICAgICBoZXggPSBoZXhbMF0gKyBoZXhbMF0gKyBoZXhbMV0gKyBoZXhbMV0gKyBoZXhbMl0gKyBoZXhbMl07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgciA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoMCwgMiksIDE2KSxcclxuICAgICAgICAgICAgZyA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoMiwgNCksIDE2KSxcclxuICAgICAgICAgICAgYiA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcclxuXHJcbiAgICAgICAgcmV0dXJuICdyZ2JhKCcgKyByICsgJywnICsgZyArICcsJyArIGIgKyAnLCcgKyBvcGFjaXR5IC8gMTAwICsgJyknO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgQVNDSUkgdGFibGUgYmFzZWQgb24gYSBiaS1kaW1lbnNpb25hbCBhcnJheSBvZiBzdHJpbmdzXHJcbiAgICAgKiBAcGFyYW0gIHtBcnJheX0gICBtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaS1kaW1lbnNpb25hbCBhcnJheSBvZiBzdHJpbmdzXHJcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9ICBbb3B0aW9uc10gICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zIG9iamVjdFxyXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSAgW29wdGlvbnMucm93XSAgICAgICAgICAgICAgICAgICAgICAgUm93IG9wdGlvbnNcclxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gIFtvcHRpb25zLnJvdy5wYWRkaW5nTGVmdD1cInxcIl0gICAgICAgU3RyaW5nIGFkZGVkIGJlZm9yZSB0aGUgZmlyc3QgY29sdW1uXHJcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9ICBbb3B0aW9ucy5yb3cucGFkZGluZ1JpZ2h0PVwifFwiXSAgICAgIFN0cmluZyBhZGRlZCBhZnRlciB0aGUgbGFzdCBjb2x1bW5cclxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gIFtvcHRpb25zLnJvdy5jb2xTZXBhcmF0b3I9XCJ8XCJdICAgICAgU3RyaW5nIGFkZGVkIGJldHdlZW4gY29sdW1uc1xyXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgW29wdGlvbnMucm93LmxpbmVCcmVhaz1cIlxcblwiXSAgICAgICAgU3RyaW5nIHVzZWQgdG8gYnJlYWsgcm93c1xyXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSAgW29wdGlvbnMuY2VsbF0gICAgICAgICAgICAgICAgICAgICAgQ2VsbCBvcHRpb25zXHJcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9ICBbb3B0aW9ucy5jZWxsLnBhZGRpbmdMZWZ0PVwiIFwiXSAgICAgIFN0cmluZyBhZGRlZCBiZWZvcmUgdGhlIGNlbGwgY29udGVudFxyXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgW29wdGlvbnMuY2VsbC5wYWRkaW5nUmlnaHQ9XCIgXCJdICAgICBTdHJpbmcgYWRkZWQgYWZ0ZXIgdGhlIGNlbGwgY29udGVudFxyXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgW29wdGlvbnMuY2VsbC5kZWZhdWx0QWxpZ25EaXI9XCIxXCJdICBEZWZpbmUgdGhlIGRlZmF1bHQgYWxpZ25tZW50IHdoZW4gbm90IHNwZWNpZmllZCAoLTE9bGVmdCwgMD1jZW50ZXIsIDE9cmlnaHQpXHJcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9ICBbb3B0aW9ucy5ocl0gICAgICAgICAgICAgICAgICAgICAgICBIb3Jpem9udGFsIExpbmUgb3B0aW9uc1xyXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgW29wdGlvbnMuaHIuc3RyPVwi4oCUXCJdICAgICAgICAgICAgICAgIFN0cmluZyB0aGF0IHdpbGwgYmUgcmVwZWF0ZWQgdG8gbWFrZSB0aGUgSG9yaXpvbnRhbCBMaW5lXHJcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9ICBbb3B0aW9ucy5oci5jb2xTZXBhcmF0b3I9XCJ8XCJdICAgICAgIFN0cmluZyBhZGRlZCBiZXR3ZWVuIGNvbHVtbnNcclxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmaW5hbCBBU0NJSSB0YWJsZVxyXG4gICAgICogQGF1dGhvciBWaWN0b3IgTi4gd3d3dy52aWN0b3Jib3JnZXMuY29tXHJcbiAgICAgKiBAZGF0ZSAgIDIwMTYtMTItMjhcclxuICAgICAqL1xyXG4gICAgbWF0cml4VG9Bc2NpaVRhYmxlKG0sIG9wdGlvbnMpIHtcclxuXHJcbiAgICAgICAgb3B0aW9ucyA9IGRlZmF1bHRzKHtcclxuICAgICAgICAgICAgcm93OiB7XHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nTGVmdDogXCIgXCIsIC8vYmVmb3JlIGZpcnN0IGNvbHVtblxyXG4gICAgICAgICAgICAgICAgcGFkZGluZ1JpZ2h0OiBcIiBcIiwgLy9hZnRlciBsYXN0IGNvbHVtblxyXG4gICAgICAgICAgICAgICAgY29sU2VwYXJhdG9yOiBcIiBcIiwgLy9iZXR3ZWVuIGVhY2ggY29sdW1uXHJcbiAgICAgICAgICAgICAgICBsaW5lQnJlYWs6IFwiW2JyL11cIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjZWxsOiB7XHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nTGVmdDogXCIgXCIsXHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nUmlnaHQ6IFwiIFwiLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdEFsaWduRGlyOiAwIC8vbGVmdD0tMSBjZW50ZXI9MCByaWdodD0xXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGhyOiB7XHJcbiAgICAgICAgICAgICAgICBzdHI6IFwiIFwiLFxyXG4gICAgICAgICAgICAgICAgY29sU2VwYXJhdG9yOiBcIiBcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgb3B0aW9ucyk7XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBkZWZhdWx0cyhkZWZhdWx0T2JqLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIGxldCBpc09iaiA9IGZ1bmN0aW9uICh4KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geCAhPT0gbnVsbCAmJiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIjtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgaWYgKGlzT2JqKG9wdGlvbnMpKVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBkZWZhdWx0T2JqKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkZWZhdWx0T2JqLCBwcm9wKSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgcHJvcCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2JqKGRlZmF1bHRPYmpbcHJvcF0pKSBkZWZhdWx0cyhkZWZhdWx0T2JqW3Byb3BdLCBvcHRpb25zW3Byb3BdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRlZmF1bHRPYmpbcHJvcF0gPSBvcHRpb25zW3Byb3BdO1xyXG4gICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRPYmo7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gcmVwZWF0U3RyKHdpZHRoLCBzdHIpIHtcclxuICAgICAgICAgICAgc3RyID0gc3RyIHx8IFwiIFwiO1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gKHdpZHRoID4gMCkgPyBBcnJheShNYXRoLmNlaWwod2lkdGggLyBzdHIubGVuZ3RoKSArIDEpLmpvaW4oc3RyKSA6IFwiXCI7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID4gd2lkdGggPyByZXN1bHQuc3Vic3RyKDAsIHdpZHRoKSA6IHJlc3VsdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGFsaWduVGV4dCh0eHQsIHdpZHRoKSB7XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHBhZCh0eHQsIHdpZHRoLCBkaXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBwID0gd2lkdGggLSB0eHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgbGV0IHBMID0gKGRpciA+IDApID8gcCA6IChwIC8gMikgPDwgMDtcclxuICAgICAgICAgICAgICAgIGxldCBwUiA9IChkaXIgPCAwKSA/IHAgOiBwTCArIChwIC0gKHBMICogMikpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHAgPiAwID8gKGRpciA+PSAwID8gQXJyYXkocEwgKyAxKS5qb2luKFwiIFwiKSA6ICcnKSArIHR4dCArIChkaXIgPD0gMCA/IEFycmF5KHBSICsgMSkuam9pbihcIiBcIikgOiAnJykgOiB0eHQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHR4dCA9IFwiXCIgKyB0eHQ7IC8vdG9TdHJpbmdcclxuICAgICAgICAgICAgc3dpdGNoICh0eHQuY2hhckF0KDApKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICc8JzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFkKHR4dC5zdWJzdHIoMSksIHdpZHRoLCAtMSk7IC8vYWxpZ24gbGVmdFxyXG4gICAgICAgICAgICAgICAgY2FzZSAnXic6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhZCh0eHQuc3Vic3RyKDEpLCB3aWR0aCwgMCk7IC8vYWxpZ24gY2VudGVyXHJcbiAgICAgICAgICAgICAgICBjYXNlICc+JzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFkKHR4dC5zdWJzdHIoMSksIHdpZHRoLCAxKTsgLy9hbGlnbiByaWdodFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFkKHR4dCwgd2lkdGgsIG9wdGlvbnMuY2VsbC5kZWZhdWx0QWxpZ25EaXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBjYWxjQ29sdW1uc1dpZHRoKG1hdHJpeCkge1xyXG4gICAgICAgICAgICAvL2NhbGN1bGF0ZSBjb2x1bW5zIHdpZHRoXHJcbiAgICAgICAgICAgIGxldCBjb2xzV2lkdGggPSBbXTtcclxuICAgICAgICAgICAgcm93czogZm9yIChsZXQgciA9IDAsIHJMZW4gPSBtYXRyaXgubGVuZ3RoOyByIDwgckxlbjsgcisrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW1hdHJpeFtyXSkgY29udGludWU7IC8vc2VwYXJhdG9yXHJcbiAgICAgICAgICAgICAgICBjb2xzOiBmb3IgKGxldCBjID0gMCwgY0xlbiA9IG1hdHJpeFtyXS5sZW5ndGg7IGMgPCBjTGVuOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbHNXaWR0aFtjXSkgY29sc1dpZHRoW2NdID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBjb2xzV2lkdGhbY10gPSBNYXRoLm1heChjb2xzV2lkdGhbY10sIChcIlwiICsgbWF0cml4W3JdW2NdKS5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBjb2xzV2lkdGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcGFkZGluZ0xlbmd0aCA9IG9wdGlvbnMuY2VsbC5wYWRkaW5nTGVmdC5sZW5ndGggKyBvcHRpb25zLmNlbGwucGFkZGluZ1JpZ2h0Lmxlbmd0aDtcclxuICAgICAgICBsZXQgaHJTZXBhcmF0b3IgPSByZXBlYXRTdHIob3B0aW9ucy5yb3cuY29sU2VwYXJhdG9yLmxlbmd0aCwgb3B0aW9ucy5oci5jb2xTZXBhcmF0b3IgfHwgb3B0aW9ucy5oci5zdHIpO1xyXG4gICAgICAgIGxldCBjb2xzV2lkdGggPSBjYWxjQ29sdW1uc1dpZHRoKG0pO1xyXG5cclxuICAgICAgICAvL2NyZWF0ZSB0YWJsZVxyXG4gICAgICAgIGxldCB0YWJsZSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IHIgPSAwLCByTGVuID0gbS5sZW5ndGg7IHIgPCByTGVuOyByKyspIHtcclxuICAgICAgICAgICAgbGV0IGNvbHMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChtW3JdKSB7IC8vY3JlYXRlIGNvbHVtbnNcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY29sc1dpZHRoLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29scy5wdXNoKG9wdGlvbnMuY2VsbC5wYWRkaW5nTGVmdCArIGFsaWduVGV4dChtW3JdW2NdLCBjb2xzV2lkdGhbY10pICsgb3B0aW9ucy5jZWxsLnBhZGRpbmdSaWdodCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0YWJsZS5wdXNoKFtvcHRpb25zLnJvdy5wYWRkaW5nTGVmdCwgY29scy5qb2luKG9wdGlvbnMucm93LmNvbFNlcGFyYXRvciksIG9wdGlvbnMucm93LnBhZGRpbmdSaWdodF0uam9pbignJykpO1xyXG4gICAgICAgICAgICB9IGVsc2UgeyAvL2NyZWF0ZSBob3Jpem9udGFsIGxpbmVcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY29sc1dpZHRoLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29scy5wdXNoKHJlcGVhdFN0cihjb2xzV2lkdGhbY10gKyBwYWRkaW5nTGVuZ3RoLCBvcHRpb25zLmhyLnN0cikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGFibGUucHVzaChbb3B0aW9ucy5yb3cucGFkZGluZ0xlZnQsIGNvbHMuam9pbihoclNlcGFyYXRvciksIG9wdGlvbnMucm93LnBhZGRpbmdSaWdodF0uam9pbignJykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybi
8443B0YWJsZS5qb2luKG9wdGlvbnMucm93LmxpbmVCcmVhayk7XHJcbiAgICB9XHJcblxyXG4gICAgYWxpZ25UZXh0KHR4dCwgd2lkdGgpIHtcclxuICAgICAgICBmdW5jdGlvbiBwYWQodHh0LCB3aWR0aCwgZGlyKSB7XHJcbiAgICAgICAgICAgIGxldCBwID0gd2lkdGggLSB0eHQubGVuZ3RoO1xyXG4gICAgICAgICAgICBsZXQgcEwgPSAoZGlyID4gMCkgPyBwIDogKHAgLyAyKSA8PCAwO1xyXG4gICAgICAgICAgICBsZXQgcFIgPSAoZGlyIDwgMCkgPyBwIDogcEwgKyAocCAtIChwTCAqIDIpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHAgPiAwID8gKGRpciA+PSAwID8gQXJyYXkocEwgKyAxKS5qb2luKFwiIFwiKSA6ICcnKSArIHR4dCArIChkaXIgPD0gMCA/IEFycmF5KHBSICsgMSkuam9pbihcIiBcIikgOiAnJykgOiB0eHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0eHQgPSBcIlwiICsgdHh0OyAvL3RvU3RyaW5nXHJcbiAgICAgICAgc3dpdGNoICh0eHQuY2hhckF0KDApKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJzwnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhZCh0eHQuc3Vic3RyKDEpLCB3aWR0aCwgLTEpOyAvL2FsaWduIGxlZnRcclxuICAgICAgICAgICAgY2FzZSAnXic6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFkKHR4dC5zdWJzdHIoMSksIHdpZHRoLCAwKTsgLy9hbGlnbiBjZW50ZXJcclxuICAgICAgICAgICAgY2FzZSAnPic6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFkKHR4dC5zdWJzdHIoMSksIHdpZHRoLCAxKTsgLy9hbGlnbiByaWdodFxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhZCh0eHQsIHdpZHRoLCAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyU2VhdE1hcCh3b3Jrc3BhY2VrZXksIGV2ZW50KSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCB1c2VBenVyZSA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBldmVudEFycjtcclxuICAgICAgICBsZXQgY2hhcnRrZXkgPSAnJztcclxuICAgICAgICBsZXQgZXZlbnRpZCA9ICcnO1xyXG4gICAgICAgIGlmICh3b3Jrc3BhY2VrZXkuaW5kZXhPZignYXp1cmU7JykgIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHVzZUF6dXJlID0gdHJ1ZTtcclxuICAgICAgICAgICAgd29ya3NwYWNla2V5ID0gd29ya3NwYWNla2V5LnJlcGxhY2UoJ2F6dXJlOycsICcnKTtcclxuICAgICAgICAgICAgZXZlbnRBcnIgPSBldmVudC5zcGxpdCgnOycpO1xyXG4gICAgICAgICAgICBjaGFydGtleSA9IGV2ZW50QXJyWzBdO1xyXG4gICAgICAgICAgICBldmVudGlkID0gZXZlbnRBcnJbMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwcmljaW5nQWxsO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlRGVzdHJveVNlYXRDaGFydCgpO1xyXG4gICAgICAgIHRoaXMuSlByaWNlTWFwKCkuc2hvdygpO1xyXG4gICAgICAgIHRoaXMuSlByaWNlTWFwU2VhdHMoKS5zaG93KCk7XHJcbiAgICAgICAgdGhpcy5KUHJpY2VNYXBFeHBsYW5hdGlvbigpLnNob3coKTtcclxuICAgICAgICB0aGlzLkpCbGFua1NlYXRzTWFwKCkuaGlkZSgpO1xyXG4gICAgICAgIGxldCBvcnBoYW5TZWF0ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoc2VsZi5KRnJlZVNlYXRpbmcoKSkge1xyXG4gICAgICAgICAgICBvcnBoYW5TZWF0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjb2xvclNjaGVtZSA9ICdkYXJrJztcclxuICAgICAgICBsZXQgYmdjb2xvcjtcclxuICAgICAgICBsZXQgc3Rjb2xvcjtcclxuICAgICAgICBsZXQgbnRjb2xvcjtcclxuICAgICAgICBzZWxmLmNvbG9yMSA9ICcjMjUyNTI1JztcclxuICAgICAgICBzZWxmLmNvbG9yMiA9ICcjMzMzMzMzJztcclxuICAgICAgICBiZ2NvbG9yID0gJyMxRTFFMUUnO1xyXG4gICAgICAgIHN0Y29sb3IgPSAnIzAwMDAwMCc7XHJcbiAgICAgICAgbnRjb2xvciA9ICcjNDQ0NDQ0JztcclxuICAgICAgICBpZiAoc2VsZi5KVGhlbWUoKSA9PT0gJ2xpZ2h0Jykge1xyXG4gICAgICAgICAgICBjb2xvclNjaGVtZSA9ICdsaWdodCc7XHJcbiAgICAgICAgICAgIHNlbGYuY29sb3IxID0gJyNFRUYwRjInO1xyXG4gICAgICAgICAgICBzZWxmLmNvbG9yMiA9ICcjZmZmZmZmJztcclxuICAgICAgICAgICAgYmdjb2xvciA9ICcjZmZmZmZmJztcclxuICAgICAgICAgICAgc3Rjb2xvciA9ICcjRUVGMEYyJztcclxuICAgICAgICAgICAgbnRjb2xvciA9ICcjRThFOEU4JztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF1c2VBenVyZSkge1xyXG4gICAgICAgICAgICBwcmljaW5nQWxsID0gc2VsZi5nZXRQcmljaW5nQ2F0ZWdvcmllc0FuZENhdGVnb3JpZXNMYWJlbHNBbmRVbmF2YWlsYWJsZUNhdGVnb3JpZXNBbmRTZWF0TGFiZWxzQ2F0ZWdvcmllcygpO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXRDaGFydCA9IG5ldyBzZWF0c2lvLlNlYXRpbmdDaGFydCh7XHJcbiAgICAgICAgICAgICAgICBkaXZJZDogJ3NlYXRzX21hcCcsXHJcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VLZXk6IHdvcmtzcGFjZWtleSxcclxuICAgICAgICAgICAgICAgIGNvbG9yU2NoZW1lOiBjb2xvclNjaGVtZSxcclxuICAgICAgICAgICAgICAgIHNob3dGdWxsU2NyZWVuQnV0dG9uOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGFsbG93T3JwaGFuU2VhdHM6IG9ycGhhblNlYXQsXHJcbiAgICAgICAgICAgICAgICBleHRyYUNvbmZpZzoge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vcHJpY2luZ0FsbENhdGVnb3J5TGFiZWxzOiBwcmljaW5nQWxsWydjYXRlZ29yeV9sYWJlbHMnXSxcclxuICAgICAgICAgICAgICAgICAgICAvL3ByaWNpbmdBbGxDYXRlZ29yeVByaWNpbmc6IHByaWNpbmdBbGxbJ2NhdGVnb3J5X3ByaWNpbmcnXSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFNlY3Rpb25zQ2FwYWNpdHk6IHByaWNpbmdBbGxbJ29iamVjdF9jYXRlZ29yaWVzJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgcHJpY2luZ0FsbFNlYXRMYWJlbHM6IHByaWNpbmdBbGxbJ3NlYXRfbGFiZWxzX2NhdGVnb3JpZXMnXSxcclxuICAgICAgICAgICAgICAgICAgICB1bmF2YWlsYWJsZUNhdGVnb3JpZXNTZWF0TGFiZWxzOiBwcmljaW5nQWxsWyd1bmF2YWlsYWJsZV9jYXRlZ29yaWVzJ11cclxuICAgICAgICAgICAgICAgI
8443H0sXHJcbiAgICAgICAgICAgICAgICBwcmljaW5nOiBwcmljaW5nQWxsWydwcmljaW5nX2NhdGVnb3JpZXMnXSxcclxuICAgICAgICAgICAgICAgIGNhdGVnb3JpZXM6IHByaWNpbmdBbGxbJ2NhdGVnb3JpZXNfbGFiZWxzJ10sXHJcbiAgICAgICAgICAgICAgICBvYmplY3RDYXRlZ29yaWVzOiBwcmljaW5nQWxsWydzZWF0X2xhYmVsc19jYXRlZ29yaWVzJ10sXHJcbiAgICAgICAgICAgICAgICB1bmF2YWlsYWJsZUNhdGVnb3JpZXM6IHByaWNpbmdBbGxbJ3VuYXZhaWxhYmxlX2NhdGVnb3JpZXMnXSxcclxuICAgICAgICAgICAgICAgIG9iamVjdENvbG9yOiBmdW5jdGlvbiAob2JqZWN0LCBkZWZhdWx0Q29sb3IsIGV4dHJhQ29uZmlnKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGEgZnVsbCBzZWF0bWFwIGJ5IGNhdGVnb3J5LCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB3aGljaCBvbmUgZnJvbSB0aGUgc2VhdHMgYXJlIGFzc2lnbmVkIHRvIHdoaWNoIGNhdGVnb3JpZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgLy93ZSBnZXQgZnJvbSBhcGkgb25seSBhdmFpbGFibGUgc2VhdHNcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKG9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QuY2F0ZWdvcnkgIT09ICd1bmRlZmluZWQnKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0LmNhdGVnb3J5LmxhYmVsID09PSAnTm90IEF2YWlsYWJsZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QuY2F0ZWdvcnkuY29sb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhQ29uZmlnLnByaWNpbmdBbGxTZWF0TGFiZWxzW29iamVjdC5sYWJlbF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRDb2xvcjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbG9yMTtcclxuXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY2FuR0FTZWxlY3Rpb25CZUluY3JlYXNlZDogZnVuY3Rpb24gKGdhQXJlYSwgZGVmYXVsdFZhbHVlLCBleHRyYUNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXh0cmFDb25maWcuZXZlbnRTZWN0aW9uc0NhcGFjaXR5W2dhQXJlYS5sYWJlbF0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnYUFyZWEubnVtQm9va2VkICsgZ2FBcmVhLm51bVNlbGVjdGVkIDwgZXh0cmFDb25maWcuZXZlbnRTZWN0aW9uc0NhcGFjaXR5W2dhQXJlYS5sYWJlbF07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgb2JqZWN0SWNvbjogZnVuY3Rpb24gKG9iamVjdCwgZGVmYXVsdEljb24sIGV4dHJhQ29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRJY29uID09PSAnY2hlY2snKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndXNlcic7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0SWNvbjtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBvYmplY3RXaXRob3V0Q2F0ZWdvcnlTZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG9iamVjdFRvb2x0aXA6IHtcclxuICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uSGludDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd0F2YWlsYWJpbGl0eTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd0NhdGVnb3J5OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBzaG93TGFiZWw6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNob3dQcmljaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBzaG93VW5hdmFpbGFibGVOb3RpY2U6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGl6ZWRMYWJlbDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBjb25maXJtU2VsZWN0aW9uT25Nb2JpbGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbG9yczoge1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnNvclRvb2x0aXBCYWNrZ3JvdW5kQ29sb3I6IHNlbGYuY29sb3IyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdG9vbHRpcEluZm86IGZ1bmN0aW9uIChvYmplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlbGYuZXZlbnRTZWF0c1tvYmplY3QubGFiZWxdICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBvYmplY3QucHJpY2luZyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygb2JqZWN0LnByaWNpbmcuZm9ybWF0dGVkUHJpY2UgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG9iamVjdC5vYmplY3RUeXBlID09PSAnU2VhdCcpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlYXRTZWN0aW9uID0gb2JqZWN0LmxhYmVscy5zZWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWF0Um93ID0gb2JqZWN0LmxhYmVscy5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlYXRMYWJlbCA9IG9iamVjdC5sYWJlbHMub3duO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IHNlYXRQcmljZSA9IHBhcnNlRmxvYXQob2JqZWN0LnByaWNpbmcuZm9ybWF0dGVkUHJpY2UpLnRvRml4ZWQoMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWF0UHJpY2UgPSBvYmplY3QucHJpY2luZy5mb3JtYXR0ZWRQcmljZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlYXRQcmljZUYgPSBvYmplY3QucHJpY2luZy5wcmljZS50b0ZpeGVkKDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5pc1BhY2soKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzZWF0UHJpY2VGIC0gc2VsZi5pbml0UGFja1ByaWNlKSA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhdFByaWNlID0gJ0lOQ0xVREVEJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWF0UHJpY2UgPSAnKyQnICsgKHNlYXRQcmljZUYgLSBzZWxmLmluaXRQYWNrUHJpY2UpLnRvRml4ZWQoMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VhdE5vdGljZSA9ICdUaWNrZXQgcHJpY2VzIGV4Y2x1ZGVzIGFsbCBmZWVzJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlYXRBbGVydCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlbGYuZXZlbnRTZWF0c1tvYmplY3QubGFiZWxdW1wic2VhdEFsZXJ0SWRcIl0gIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHNlbGYuc2VhdEFsZXJ0c0FuZFRvb2x0aXBzUGVyTGFiZWxbc2VsZi5ldmVudFNlYXRzW29iamVjdC5sYWJlbF1bXCJzZWF0QWxlcnRJZFwiXV0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWF0QWxlcnQgPSAnW2JyL10nICsgc2VsZi5zZWF0QWxlcnRzQW5kVG9vbHRpcHNQZXJMYWJlbFtzZWxmLmV2ZW50U2VhdHNbb2JqZWN0LmxhYmVsXVtcInNlYXRBbGVydElkXCJdXVsnZGlzcGxheV9uYW1lJ10gKyAnW2JyL10nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtID0gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydeU2VjdGlvbicsICdeUm93JywgJ15TZWF0J10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ14nICsgc2VhdFNlY3Rpb24sICdeJyArIHNlYXRSb3csICdeJyArIHNlYXRMYWJlbF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuICdbcHJlXScgKyBzZWxmLm1hdHJpeFRvQXNjaWlUYWJsZShtKSArICdbL3ByZV0nICsgJ1twcmVdJyArIHNlbGYubWF0cml4VG9Bc2NpaVRhYmxlKG0xKSArICdbL3ByZV0nICsgJ1tici9dJyArICdbYnIvXScgKyBzZWF0Tm90aWNlICsgJ1tici9dJyArICdbYnIvXScgKyBzZWF0QWxlcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ByZV0nICsgc2VsZi5tYXRyaXhUb0FzY2lpVGFibGUobSkgKyAnWy9wcmVdJyArICdbYnIvXScgKyAnW3ByZV0nICsgXCLigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJRcIiArICdbL3ByZV0nICsgJ1tici9dJyArICdbYnIvXScgKyAnW3ByZV0nICsgc2VsZi5hbGlnblRleHQoJycgKyBzZWF0UHJpY2UsIDI1KSArICdbL3ByZV0nICsgJ1tici9dJyArICdbYnIvXScgKyBzZWxmLmFsaWduVGV4dChzZWF0Tm90aWNlLCAyNSkgKyAnW2JyL10nICsgJ1tici9dJyArIHNlbGYuYWxpZ25UZXh0KHNlYXRBbGVydCwgMjUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlbGYuZXZlbnRTZWN0aW9uc0NhcGFjaXR5W29iamVjdC5sYWJlbF0gIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIG9iamVjdC5wcmljaW5nICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBvYmplY3QucHJpY2luZy5mb3JtYXR0ZWRQcmljZSAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAob2JqZWN0Lm9iamVjdFR5cGUgPT09ICdTZWF0Jykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VhdFNlY3Rpb24gPSBvYmplY3QubGFiZWw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlYXROb3RpY2UgPSAnVGlja2V0IHByaWNlcyBleGNsdWRlcyBhbGwgZmVlcyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc3Qgc2VhdFByaWNlID0gcGFyc2VGbG9hdChvYmplY3QucHJpY2luZy5mb3JtYXR0ZWRQcmljZSkudG9GaXhlZCgyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlYXRQcmljZSA9IG9iamVjdC5wcmljaW5nLmZvcm1hdHRlZFByaWNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VhdFByaWNlRiA9IG9iamVjdC5wcmljaW5nLnByaWNlLnRvRml4ZWQoMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2VhdFByaWNlRiAtIHNlbGYuaW5pdFBhY2tQcmljZSkgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhdFByaWNlID0gJ0lOQ0xVREVEJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhdFByaWNlID0gJyskJyArIChzZWF0UHJpY2VGIC0gc2VsZi5pbml0UGFja1ByaWNlKS50b0ZpeGVkKDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtID0gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydeU2VjdGlvbiddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydeJyArIHNlYXRTZWN0aW9uXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gJ1twcmVdJyArIHNlbGYubWF0cml4VG9Bc2NpaVRhYmxlKG0pICsgJ1svcHJlXScgKyAnW3ByZV0nICsgc2VsZi5tYXRyaXhUb0FzY2lpVGFibGUobTEpICsgJ1svcHJlXScgKyAnW2JyL10nICsgJ1tici9dJyArIHNlYXROb3RpY2UgKyAnW2JyL10nICsgJ1tici9dJyArIHNlYXRBbGVydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJlXScgKyBzZWxmLm1hdHJpeFRvQXNjaWlUYWJsZShtKSArICdbL3ByZV0nICsgJ1tici9dJyArICdbcHJlXScgKyBcIuKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlFwiICsgJ1svcHJlXScgKyAnW2JyL10nICsgJ1tici9dJyArICdbcHJlXScgKyBzZWxmLmFsaWduVGV4dCgnJyArIHNlYXRQcmljZSwgMjUpICsgJ1svcHJlXScgKyAnW2JyL10nICsgJ1tici9dJyArIHNlbGYuYWxpZ25UZXh0KHNlYXROb3RpY2UsIDI1KSArICdbYnIvXScgKyAnW2JyL10nO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnTm90IEF2YWlsYWJsZSc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgb2JqZWN0IGxhYmVsIGhhcyBzZWF0IGFsZXJ0XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxyXG4gICAgICAgICAgICAgICAgb25DaGFydFJlbmRlcmVkOiBmdW5jdGlvbiAoY2hhcnQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgb25PYmplY3REZXNlbGVjdGVkOiBmdW5jdGlvbiAob2JqZWN0LCBkZXNlbGVjdGVkVGlja2V0VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5KRnJlZVNlYXRpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcG9kcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtwIGluIHNlbGYucG9kcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrcHAgaW4gc2VsZi5wb2RzW2twXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBvZHNba3BdW2twcF0gPT09IG9iamVjdC5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2RzID0gc2VsZi5wb2RzW2twXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgI
8443HNlbGYuc2VhdENoYXJ0LmRlc2VsZWN0T2JqZWN0cyhwb2RzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWF0Q2hhcnQubGlzdFNlbGVjdGVkT2JqZWN0cyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHNlbGVjdGVkT2JqZWN0cykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0c1tjXS5sYWJlbCA9PT0gb2JqZWN0LmxhYmVsICYmIHR5cGVvZiBzZWxlY3RlZE9iamVjdHNbY10ubnVtU2VsZWN0ZWQgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkT2JqZWN0cy5zcGxpY2UoYywgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5KRnJlZVNlYXRpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmZyb21EZWxldGUgIT09IGZhbHNlICYmIHNlbGVjdGVkT2JqZWN0cy5sZW5ndGggPCBzZWxmLmZyb21EZWxldGUgLSAyICYmIHNlbGYuZnJvbURlbGV0ZSA+IDEgfHwgc2VsZi5mcm9tRGVsZXRlID09PSBmYWxzZSAmJiBzZWxlY3RlZE9iamVjdHMubGVuZ3RoIDwgc2VsZi5zZWxlY3RlZExhYmVscy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0luZm9ybWF0aW9uJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdZb3Ugc2VsZWN0ZWQgc2VhdHMgaGF2ZSBiZWVuIHJlbW92ZWQgYmVjYXVzZSB5b3UgY2Fubm90IGhhdmUgb3JwaGFuIHNlYXRzJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICd3YXJuaW5nJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAnT2snXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZyb21EZWxldGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0QmFzZWRPbkRyb3BEb3duKHNlbGVjdGVkT2JqZWN0cyk7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9uT2JqZWN0U2VsZWN0ZWQ6IGZ1bmN0aW9uIChvYmplY3QsIHNlbGVjdGVkVGlja2V0VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkZXNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLmV2ZW50U2VhdHNbb2JqZWN0LmxhYmVsXSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHNlbGYuZXZlbnRTZWF0c1tvYmplY3QubGFiZWxdW1wic2VhdEFsZXJ0SWRcIl0gIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLnNlYXRBbGVydHNBbmRUb29sdGlwc1BlckxhYmVsW3NlbGYuZXZlbnRTZWF0c1tvYmplY3QubGFiZWxdW1wic2VhdEFsZXJ0SWRcIl1dICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc2VhdEFsZXJ0c0FuZFRvb2x0aXBzUGVyTGFiZWxbc2VsZi5ldmVudFNlYXRzW29iamVjdC5sYWJlbF1bXCJzZWF0QWxlcnRJZFwiXV1bJ3JlcXVpcmVfYWNrbm93bGVkZ2VtZW50J10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpcm0oc2VsZi5zZWF0QWxlcnRzQW5kVG9vbHRpcHNQZXJMYWJlbFtzZWxmLmV2ZW50U2VhdHNbb2JqZWN0LmxhYmVsXVtcInNlYXRBbGVydElkXCJdXVsnZGlzcGxheV9uYW1lJ10pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5kZXNlbGVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXNlbGVjdGVkKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlYXRDaGFydC5saXN0U2VsZWN0ZWRPYmplY3RzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHNlbGVjdGVkT2JqZWN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0QmFzZWRPbkRyb3BEb3duKHNlbGVjdGVkT2JqZWN0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHByaWNlRm9ybWF0dGVyOiBmdW5jdGlvbiAocHJpY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyQnICsgcGFyc2VGbG9hdChwcmljZSkudG9GaXhlZCgyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkucmVuZGVyKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcHJpY2luZ0FsbCA9IHNlbGYuZ2V0UHJpY2luZ0NhdGVnb3JpZXNBbmRDYXRlZ29yaWVzTGFiZWxzQW5kVW5hdmFpbGFibGVDYXRlZ29yaWVzQW5kU2VhdExhYmVsc0NhdGVnb3JpZXNBenVyZSgpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHN0eWxlID0ge1xyXG4gICAgICAgICAgICAgICAgYmdDb2xvcjogYmdjb2xvcixcclxuICAgICAgICAgICAgICAgI
8443HN0cm9rZUNvbG9yOiBzdGNvbG9yLFxyXG4gICAgICAgICAgICAgICAgbm90QXZhaWxhYmxlQ29sb3I6IG50Y29sb3IsXHJcbiAgICAgICAgICAgICAgICBiZ0NvbG9yU2VsZWN0ZWQ6ICcjMDAwMDAwJyxcclxuICAgICAgICAgICAgICAgIGZvbnQ6IHtcclxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyMwMDAwMDAnLFxyXG4gICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6ICdBcmlhbCcsXHJcbiAgICAgICAgICAgICAgICAgICAgZm9udFdlaWdodDogJ25vcm1hbCcgLy9ub3JtYWwsIGJvbGQsIGl0YWxpY1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbGV0IG5vdEF2YWlsYWJsZVBvcG92ZXJIdG1sID0gYDxkaXYgc3R5bGU9J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDI1MHB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzNlM2UzZTsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMTBweDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogI2ZmZjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IDFweCAwcHggMjVweCAtM3B4ICMzZTNlM2U7X
8443HJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIHN0eWxlPSdjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgwKTsgZm9udC1zaXplOiAxNHB4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA1MDA7IGxpbmUtaGVpZ2h0OiAyMnB4O3RleHQtYWxpZ246IGNlbnRlcjsgIG1hcmdpbi10b3A6IDEwcHg7Jz5Ob3QgYXZhaWxhYmUgPC9wPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9J2NvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODApOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogNTAwOyBsaW5lLWhlaWdodDogMjBweDsgYmFja2dyb3VuZC1jb2xvcjojMDAwOyB3aWR0aDoxMDAlOyBwYWRkaW5nOjAgNXB4Oyc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IGF2YWlsYWJsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YDtcclxuXHJcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGVzID0ge1xyXG4gICAgICAgICAgICAgICAgc2hvd1pvb21PdXRCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgICBhbGxvd09ycGhhblNlYXRzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgcG9kczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBub3RBdmFpbGFibGVQb3BvdmVySHRtbDogbm90QXZhaWxhYmxlUG9wb3Zlckh0bWxcclxuICAgICAgICAgICAgfTtcclxuLy8gICAgICAgICAgICB0aGlzLnRvZ2dsZUNhdGVnb3JpZXMgPSBbXTtcclxuICAgICAgICAgICAgLy90b2tlbjogXCJleUpoYkdjaU9pSklVekkxTmlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKeWIyeGxJam9pVTJWaGRHbHVaeUlzSW01aGJXVWlPaUl6SWl3aVpXMWhhV3dpT2lKelpXRjBhVzVuUUhKdmQyVmlMbkp2SWl3aVJuVnNiRTVoYldVaU9pSlRaV0YwYVc1bklFRndjQ0lzSW1oMGRIQTZMeTl6WTJobGJXRnpMbmh0YkhOdllYQXViM0puTDNkekx6SXdNRFV2TURVdmFXUmxiblJwZEhrdlkyeGhhVzF6TDNONWMzUmxiU0k2SWpFeU16SXpNak15SWl3aVJtbHljM1JPWVcxbElqb2lVMlZoZEdsdVp5SXNJa3hoYzNST1lXMWxJam9pUVhCd0lpd2libUptSWpveE5qYzJNamd4TVRNeExDSmxlSEFpT2pFMk56WTFOREF6TXpFc0ltbGhkQ0k2TVRZM05qSTRNVEV6TVgwLkJwSHNzSUFrbkxxRWlNSXdUZ2o4b3k0eDlFbU9LLWpodFBoa3BPSkI0U1lcIixcclxuICAgICAgICAgICAgLy9jaGFydElkOiBcImU3ZTI5MjA1LTQxYjAtNDdlMi1hODM2LTY1MzdkMzdjNmE3ZVwiLFxyXG4gICAgICAgICAgICAvL2V2ZW50SWQ6IFwiZTdlMjkyMDUtNDFiMC00N2UyLWE4MzYtNjUzN2QzN2M2YTdlXCIsXHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlYXRDaGFydCA9IG5ldyBfYXMuY2hhcnRMYXlvdXQoe1xyXG4gICAgICAgICAgICAgICAgdG9rZW46IHdvcmtzcGFjZWtleSArIFwiXCIsXHJcbiAgICAgICAgICAgICAgICBjaGFydElkOiBjaGFydGtleSArIFwiXCIsXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJJZDogXCJzZWF0c19tYXBcIixcclxuICAgICAgICAgICAgICAgIGV2ZW50SWQ6IGV2ZW50aWQgKyBcIlwiLFxyXG4gICAgICAgICAgICAgICAgcHJpY2VzOiBwcmljaW5nQWxsWydwcmljaW5nX2NhdGVnb3JpZXMnXSxcclxuICAgICAgICAgICAgICAgIGNhdGVnb3JpZXM6IHByaWNpbmdBbGxbJ2NhdGVnb3JpZXNfbGFiZWxzJ10sXHJcbiAgICAgICAgICAgICAgICBvYmplY3RzOiBwcmljaW5nQWxsWydzZWF0X2xhYmVsc19jYXRlZ29yaWVzJ10sXHJcbiAgICAgICAgICAgICAgICAvL3ByaWNlczogcHJpY2VzLFxyXG4gICAgICAgICAgICAgICAgLy9jYXRlZ29yaWVzOiBjYXRlZ29yaWVzLFxyXG4gICAgICAgICAgICAgICAgLy9vYmplY3RzOiBvYmplY3RzLFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHN0eWxlLFxyXG4gICAgICAgICAgICAgICAgdGhlbWU6IHNlbGYuSlRoZW1lKCksXHJcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWF0Q2hhcnQucmVuZGVyKHRoaXMub25PYmplY3RDbGljaywgdGhpcy5vbk9iamVjdEhvdmVyLCBzZWxmLCBwcmljaW5nQWxsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25PYmplY3RIb3ZlcihvYmosIG1haW4sIHNlbGYpIHtcclxuICAgICAgICBsZXQgc2VhdCA9IG9iai5vYmplY3Q7XHJcbiAgICAgICAgY29uc3Qgc3BsaXQgPSBzZWF0LmxhYmVsLnNwbGl0KCctJyk7XHJcblxyXG4gICAgICAgIGxldCBmb290ZXIgPSBgYDtcclxuICAgICAgICBsZXQgc2VhdEFsZXJ0ID0gJyc7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZi5ldmVudFNlYXRzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygc2VsZi5ldmVudFNlYXRzW3NlYXQubGFiZWxdICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygc2VsZi5zZWF0QWxlcnRzQW5kVG9vbHRpcHNQZXJMYWJlbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHNlbGYuZXZlbnRTZWF0c1tzZWF0LmxhYmVsXVtcInNlYXRBbGVydElkXCJdICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBzZWxmLnNlYXRBbGVydHNBbmRUb29sdGlwc1BlckxhYmVsW3NlbGYuZXZlbnRTZWF0c1tzZWF0LmxhYmVsXVtcInNlYXRBbGVydElkXCJdXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgc2VhdEFsZXJ0ID0gJzxwIHN0eWxlPVwibWFyZ2luLXRvcDogMTBweDsgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44MCk7IHRleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZTogMTJweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogNTAwOyBsaW5lLWhlaWdodDogMjBweDsgXCI+JyArIHNlbGYuc2VhdEFsZXJ0c0FuZFRvb2x0aXBzUGVyTGFiZWxbc2VsZi5ldmVudFNlYXRzW3NlYXQubGFiZWxdW
84431wic2VhdEFsZXJ0SWRcIl1dWydkaXNwbGF5X25hbWUnXSArICc8L3A+JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZWF0LnN0YXR1c0lkID09PSAnc2VsZWN0ZWQnKSB7XHJcbiAgICAgICAgICAgIGZvb3RlciA9IGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjojMGNhM2Q2OyB3aWR0aDoxMDAlOyBwYWRkaW5nOjAgNXB4Oyc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwcmljZUJsb2Nrc0FuZFVzZWRCbG9ja3MgPSBzZWxmLmdldFByaWNlQmxvY2tzQW5kVXNlZEJsb2NrcygpO1xyXG4gICAgICAgIGxldCBwcmljZUJsb2NrcyA9IHByaWNlQmxvY2tzQW5kVXNlZEJsb2Nrcy5wcmljZUJsb2NrO1xyXG5cclxuICAgICAgICBsZXQgYmlncHJpY2VjdXQgPSAnJztcclxuICAgICAgICBmb3IgKGxldCBpMSA9IHByaWNlQmxvY2tzLmxlbmd0aCAtIDE7IGkxID49IDA7IGkxLS0pIHtcclxuICAgICAgICAgICAgaWYgKHByaWNlQmxvY2tzW2kxXS5wcmljZUxldmVsSWQgPT0gc2VhdC5jYXRlZ29yeUlkKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZnVsbFJldGFpbFByaWNlID0gcHJpY2VCbG9ja3NbaTFdLmZ1bGxSZXRhaWxQcmljZTtcclxuICAgICAgICAgICAgICAgIGlmIChwcmljZUJsb2Nrc1tpMV0uYmlnUHJpY2UgJiYgc2VhdC5wcmljZXNbMF0ucHJpY2UgPT0gZnVsbFJldGFpbFByaWNlKVxyXG4gICAgICAgICAgICAgICAgICAgIGJpZ3ByaWNlY3V0ID0gJzxzcGFuIHN0eWxlPVwicG9zaXRpb246cmVsYXRpdmU7IGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7Zm9udC13ZWlnaHQ6IDQwMDtcIj4nICsgcHJpY2VCbG9ja3NbaTFdLmJpZ1ByaWNlLnRvRml4ZWQoMilcclxuICAgICAgICAgICAgICAgICAgICAgICAgKyAnPGRpdiBzdHlsZT1cIiBib3JkZXItYm90dG9tOiAwLjA3NWVtIHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsgbWFyZ2luLXRvcDogMnB4O2xlZnQ6IDA7cG9zaXRpb246IGFic29sdXRlO3JpZ2h0OiAwO3RvcDogNTAlO1wiPjwvZGl2Pjwvc3Bhbj4nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBodG1sID0gYDxkaXYgc3R5bGU9J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDI1MHB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzNlM2UzZTsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMTBweDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogI2ZmZjsgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7X
8443HJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAxcHggMHB4IDI1cHggLTNweCAjM2UzZTNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdHlsZT0nd2lkdGg6IDEwMCU7dGFibGUtbGF5b3V0OiBmaXhlZCc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIHN0eWxlPSdjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgwKTsgZm9udC1zaXplOiAxNHB4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA1MDA7IGxpbmUtaGVpZ2h0OiAyMnB4Oyc+YDtcclxuICAgICAgICBpZiAoc3BsaXRbMF0pIHtcclxuICAgICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsgcGFkZGluZzoycHg7Jz5TZWN0aW9uPC90ZD5gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc3BsaXRbMV0pIHtcclxuICAgICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjJweDsnPlJvdzwvdGQ+YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNwbGl0WzJdKSB7XHJcbiAgICAgICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7ICBwYWRkaW5nOjJweDsnPlNlYXQ8L3RkPmA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzZWF0LmdhICYmIHNlYXQuZ2EubWF4ID4gMCAmJiB0eXBlb2Ygc2VhdC5nYS5jdXJyZW50ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjsgYmFja2dyb3VuZC1jb2xvcjogIzI0MjEyMTsgcGFkZGluZzoycHg7XCI+U2VsZWN0ZWQgVGlja2V0czwvdGQ+YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaHRtbCArPSBgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgc3R5bGU9J2ZvbnQtc2l6ZTogMThweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogNjAwOyBsaW5lLWhlaWdodDogMjZweDsgJz5gO1xyXG4gICAgICAgIGlmIChzcGxpdFswXSkge1xyXG4gICAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyOyBwYWRkaW5nOjJweDsnPmAgKyBzcGxpdFswXSArIGA8L3RkPmA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzcGxpdFsxXSkge1xyXG4gICAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyOyAgcGFkZGluZzoycHg7Jz5gICsgc3BsaXRbMV0gKyBgPC90ZD5gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc3BsaXRbMl0pIHtcclxuICAgICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsgcGFkZGluZzoycHg7Jz5gICsgc3BsaXRbMl0gKyBgPC90ZD5gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VhdC5nYSAmJiBzZWF0LmdhLm1heCA+IDAgJiYgdHlwZW9mIHNlYXQuZ2EuY3VycmVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7IGJhY2tncm91bmQtY29sb3I6ICMyNDIxMjE7IHBhZGRpbmc6MnB4O1wiPmAgKyBzZWF0LmdhLmN1cnJlbnQgKyBgPC90ZD5gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcHJpY2V0ID0gc2VhdC5wcmljZXNbMF0ucHJpY2U7XHJcbiAgICAgICAgaWYgKHNlYXQuZ2EgJiYgc2VhdC5nYS5tYXggPiAwICYmIHR5cGVvZiBzZWF0LmdhLmN1cnJlbnQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWF0LmdhLmN1cnJlbnQgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHByaWNldCA9IHNlYXQucHJpY2VzWzBdLnByaWNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcHJpY2V0ID0gc2VhdC5wcmljZXNbMF0ucHJpY2UgKiBzZWF0LmdhLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaHRtbCArPSBgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3R5bGU9J3dpZHRoOiAxMDAlOyc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0nMycgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyOyBjb2xvcjogI0JDNUFGRjsgZm9udC13ZWlnaHQ6IDYwMDtmb250LXNpemU6IDI0cHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IDMycHg7IHBhZGRpbmc6MnB4Oyc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCArIGJpZ3ByaWNlY3V0ICsgYCAkYCArIHByaWNldC50b0ZpeGVkKDIpICsgYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPmA7XHJcbiAgICAgICAgaHRtbCArPSBgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+YDtcclxuICAgICAgICAvLyBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignYWFhLnNwb3RsaWdodC52ZWdhcycpID09PSAtMSkge1xyXG4gICAgICAgIC8vICAgICBodG1sICs9IHNlYXRBbGVydCArIGBcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIDxwIHN0eWxlPSdtYXJnaW4tdG9wOiAxMHB4OyBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgwKTsgdGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOiAxMnB4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA1MDA7IGxpbmUtaGVpZ2h0OiAyMHB4OyAnPlByaWNlIGV4Y2x1ZGVzIGFsbCBmZWVzPC9wPlxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBgICsgZm9vdGVyICsgYFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgIDwvZGl2PmA7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICBodG1sICs9IHNlYXRBbGVydCArIGZvb3RlciArIGBcclxuICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gO1xyXG4gICAgICAgIC8vfVxyXG4gICAgICAgIG1haW4uc2hvd1BvcG92ZXIoaHRtbCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25PYmplY3RDbGljayhvYmosIG1haW4sIHNlbGYsIHByaWNpbmdBbGwpIHtcclxuICAgICAgICBsZXQgbXlTZWxlY3RkT2JqZWN0ID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaTEgPSAwOyBpMSA8IG9iai5zZWxlY3RlZE9iamVjdHMubGVuZ3RoOyBpMSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBwcmljZSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJpY2luZ0FsbFsnc2VhdF9sYWJlbHNfY2F0ZWdvcmllcyddLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBwcmljaW5nQWxsWydzZWF0X2xhYmVsc19jYXRlZ29yaWVzJ11baV1bJ2xhYmVsJ107XHJcbiAgICAgICAgICAgICAgICBsZXQgY2F0SWQgPSBwcmljaW5nQWxsWydzZWF0X2xhYmVsc19jYXRlZ29yaWVzJ11baV1bJ2NhdGVnb3J5SWQnXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAob2JqLnNlbGVjdGVkT2JqZWN0c1tpMV0uaWQgPT09IGxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IHByaWNpbmdBbGxbJ3ByaWNpbmdfY2F0ZWdvcmllcyddLmxlbmd0aDsgaTIrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2F0SWQgPT09IHByaWNpbmdBbGxbJ3ByaWNpbmdfY2F0ZWdvcmllcyddW2kyXVsnY2F0ZWdvcnlJZCddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZSA9IHByaWNpbmdBbGxbJ3ByaWNpbmdfY2F0ZWdvcmllcyddW2kyXVsncHJpY2UnXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvb29iaiA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogb2JqLnNlbGVjdGVkT2JqZWN0c1tpMV0uaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZDogb2JqLnNlbGVjdGVkT2JqZWN0c1tpMV0uaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2luZzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZTogcHJpY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5zZWxlY3RlZE9iamVjdHNbaTFdLmlkLmluZGV4T2YoJy0nKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvb29iai5udW1TZWxlY3RlZCA9IG9iai5zZWxlY3RlZE9iamVjdHNbaTFdLnF0eTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15U2VsZWN0ZE9iamVjdC5wdXNoKG9vb2JqKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBzZWxmLnNlbGVjdEJhc2VkT25Ecm9wRG93bihteVNlbGVjdGRPYmplY3QpO1xyXG4gICAgICAgIHNlbGYubXlzZWxlY3RlZE9iamVjdHMgPSBteVNlbGVjdGRPYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlT2JqUXVhbnRpdHkob2JqSWQsIHF0eSkge1xyXG4gICAgICAgIGxldCBuZXdNeXNlbGVjdGVkT2JqZWN0ID0gW107XHJcbiAgICAgICAgaWYgKHF0eSA9PT0gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpMyA9IDA7IGkzIDwgdGhpcy5teXNlbGVjdGVkT2JqZWN0cy5sZW5ndGg7IGkzKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm15c2VsZWN0ZWRPYmplY3RzW2kzXVsnbGFiZWwnXSA9PT0gb2JqSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG5ld015c2VsZWN0ZWRPYmplY3QucHVzaCh0aGlzLm15c2VsZWN0ZWRPYmplY3RzW2kzXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5teXNlbGVjdGVkT2JqZWN0cyA9IG5ld015c2VsZWN0ZWRPYmplY3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VhdENoYXJ0LnVwZGF0ZU9ialF1YW50aXR5KG9iaklkLCBxdHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvZ2dsZUNhdGVnb3J5KGNhdGVnb3J5KSB7XHJcbiAgICAgICAgbGV0IHRlbXAgPSBbXTtcclxuICAgICAgICBsZXQgbmV3Q2F0ZWdvcnkgPSB0cnVlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9nZ2xlQ2F0ZWdvcmllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9IHRvZ2dsZUNhdGVnb3JpZXNbaV07XHJcbiAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PT0gZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgbmV3Q2F0ZWdvcnkgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRlbXAucHVzaChlbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV3Q2F0ZWdvcnkpIHtcclxuICAgICAgICAgICAgdGVtcC5wdXNoKGNhdGVnb3J5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50b2dnbGVDYXRlZ29yaWVzID0gdGVtcDtcclxuICAgICAgICB0aGlzLnNlYXRDaGFydC50b2dnbGVDYXRlZ29yaWVzSGlnaGxpZ2h0UmVuZGVyKHRlbXApO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZURyb3BEb3duU2VsZWN0KGRyb3Bkb3duLCB3b3Jrc3BhY2VrZXksIGV2ZW50KSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuSlRpY2tldHNDYXJ0KCkuaHRtbCgnJyk7XHJcbiAgICAgICAgdGhpcy5KVGlja2V0c0NhcnQoKS5zaG93KCk7XHJcbiAgICAgICAgdGhpcy5KVGlja2V0c0NhcnQoKS5hcHBlbmQoJzxkaXYgY2xhc3M9XCJudW1iZXJfb2ZfdGlja2V0c190ZXh0XCI+TnVtYmVyIG9mIHRpY2tldHM6IDwvZGl2PicgKyBkcm9wZG93bik7XHJcbiAgICAgICAgdGhpcy5KVGlja2V0c0Nob29zZXIoKS5vZmYoJ2NoYW5nZScpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVmFsID0gcGFyc2VJbnQoalF1ZXJ5KHRoaXMpLnZhbCgpKTtcclxuLy8gICAgICAgICAgICBpZiAoc2VsZWN0ZWRWYWwgPT09IDApIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgc2VsZi5zZWxlY3RlZE51bWJlck9mVGlja2V0cyA9IHNlbGVjdGVkVmFsO1xyXG4gICAgICAgICAgICBzZWxmLnNlbGVjdGVkUHJvbW9Db2RlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNlbGYuZXZlbnRQcm9tb3Rpb25zKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJpY2VCID0gc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXTtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5cCBpbiBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1pblRpY2ssIG1heFRpY2s7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleXBdWydtaW5fdGlja2V0cyddID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5UaWNrID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5UaWNrID0gc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlwXVsnbWluX3RpY2tldHMnXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlwXVsnbWF4X3RpY2tldHMnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGljayA9IDMwO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFRpY2sgPSBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleXBdWydtYXhfdGlja2V0cyddO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pblRpY2sgPD0gc2VsZWN0ZWRWYWwgJiYgbWF4VGljayA+PSBzZWxlY3RlZFZhbCAmJiBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydpc3BvZHMnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGVkUHJvbW9Db2RlID0gc2VsZi5ldmVudFByb21vdGlvbnNba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnJlbmRlclNlYXRNYXAod29ya3NwYWNla2V5LCBldmVudCk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZVByaWNpbmdNYXAoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuSlRpY2tldHNDaG9vc2VyKCkudHJpZ2dlcignY2hhbmdlJyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJ3YkV2ZW50c0Zvcm1Db250cm9sbGVyXHJcblxyXG4vKmdBY3Rpb25zKCkge1xyXG4gICAgICAgIHRoaXMuSkJ1eUJ1dHRvbigpLmhpZGUoKTtcclxuICAgICAgICB0aGlzLkpCdXlCdXR0b24oKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgalF1ZXJ5LnByb3h5KHRoaXMuYnV5Tm93QWN0aW9uLCB0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5KUXR5KCkub24oJ2NoYW5nZScsIGpRdWVyeS5wcm94eSh0aGlzLmNoYW5nZVF0eUFjdGlvbiwgdGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGNhcnRBY3Rpb25zKCkge1xyXG4gICAgICAgIHRoaXMuSkJ0bigpLm9uKCdjbGljaycsIGpRdWVyeS5wcm94eSh0aGlzLmJ1eVRpY2tldEJ0biwgdGhpcykpO1xyXG4gICAgfVxyXG4gICAgY2hhbmdlUXR5QWN0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHF0eSA9IHRoaXMuSlF0eSgpLnZhbCgpO1xyXG4gICAgICAgIHRoaXMuc2VhdENoYXJ0LmNoYW5nZUNvbmZpZyh7XHJcbiAgICAgICAgICAgIG51bWJlck9mUGxhY2VzVG9TZWxlY3Q6IHF0eSxcclxuICAgICAgICAgICAgbWF4U2VsZWN0ZWRPYmplY3RzOiBxdHlcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBidXlOb3dBY3Rpb24oKSB7XHJcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICB0aGlzLnNlYXRDaGFydC5saXN0U2VsZWN0ZWRPYmplY3RzKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoc2VsZWN0ZWRPYmplY3RzKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGVkT2JqZWN0Q2hhcnQgPSBzZWxlY3RlZE9iamVjdHM7XHJcbiAgICAgICAgICAgICAgICBsZXQgYztcclxuICAgICAgICAgICAgICAgIGxldCBwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IHNlbGYuc2VsZWN0ZWRPYmplY3RDaGFydC5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLmxhYmVsID0gc2VsZi5zZWxlY3RlZE9iamVjdENoYXJ0W2NdLmxhYmVsO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBzZWxmLnNlbGVjdGVkT2JqZWN0Q2hhcnRbY10ucHJpY2luZy50aWNrZXRUeXBlcy5sZW5ndGg7IHArKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zZWxlY3RlZE9iamVjdENoYXJ0W2NdLnByaWNpbmcudGlja2V0VHlwZXNbcF1bJ3RpY2tldFR5cGUnXSA9PT0gc2VsZi5zZWxlY3RlZE9iamVjdENoYXJ0W2NdLnNlbGVjdGVkVGlja2V0VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwucHJpY2UgPSBzZWxmLnNlbGVjdGVkT2JqZWN0Q2hhcnRbY10ucHJpY2luZy50aWNrZXRUeXBlc1twXVsncHJpY2UnXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLnR5cGUgPSBzZWxmLnNlbGVjdGVkT2JqZWN0Q2hhcnRbY10ucHJpY2luZy50aWNrZXRUeXBlc1twXVsndGlja2V0VHlwZSddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKGxhYmVsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxhYmVscyA9IE9iamVjdC5hc3NpZ24oe30sIGxhYmVscyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWF4UXR5ID0gc2VsZi5KUXR5KCkudmFsKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2hvbGRfc2VhdHMnLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3RpZDogc2VsZi5KUHJvZHVjdElkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgc2VhdGxhYmVsczogbGFiZWxzLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50a2V5OiBzZWxmLnNlbGVjdGVkRXZlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgcXR5OiBtYXhRdHksXHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHk6IGpRdWVyeSgnI3J3Yl9ob2xkX3NlYXRzX25vbmNlJykudmFsKClcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIC8vaWYgKEpTT04uc3RyaW5naWZ5KHNlbGYub2xkRGF0YVNlbnQpID09PSBKU09OLnN0cmluZ2lmeShkYXRhKSkge1xyXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgICAgICAvL3NlbGYub2xkRGF0YVNlbnQgPSBkYXRhO1xyXG5cclxuICAgICAgICAgICAgICAgIHNlbGYuSkJ1eUJ1dHRvbigpLkxvYWRpbmdPdmVybGF5KFwic2hvd1wiKTtcclxuICAgICAgICAgICAgICAgIGpRdWVyeS5hamF4KHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgICAgICAgICB1cmw6IGJiTG9jYWwuYWpheF91cmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBqUXVlcnkucHJveHkoc2VsZi5idXlOb3dDb21wbGV0ZWQsIHNlbGYpXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgYnV5Tm93Q29tcGxldGVkKHJlc3BvbnNlKSB7XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXRDaGFydC5yZXJlbmRlcigpO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXRDaGFydCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkT2JqZWN0Q2hhcnQgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRXZlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICBhbGVydChyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgdGhpcy5KQnV5QnV0dG9uKCkuTG9hZGluZ092ZXJsYXkoXCJoaWRlXCIsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLkpCdXlCdXR0b24oKS5oaWRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhy
8443ZWYgPSByZXNwb25zZS51cmw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGJ1eVRpY2tldEJ0bihldmVudCkge1xyXG4gICAgICAgIC8vdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBldmVudC50YXJnZXQgZG9lcyBub3QgaGF2ZSB0aGUgZWxlbWVudCBjYW4gYmUgYSBzcGFuIGluc2lkZSB0aGUgYnV0dG9uXHJcbiAgICAgICAgbGV0IGJ0biA9IGpRdWVyeShldmVudC50YXJnZXQpO1xyXG4gICAgICAgIGxldCBvYmogPSBidG4uZGF0YSgpO1xyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMCAmJiBvYmouY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xyXG4gICAgICAgICAgICBidG4gPSBidG4ucGFyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3JlYXRlRGVzdHJveVNlYXRDaGFydCgpO1xyXG5cclxuICAgICAgICB0aGlzLmdBY3Rpb25zKCk7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLnNlYXRDaGFydCA9IG5ldyBzZWF0c2lvLlNlYXRpbmdDaGFydCh7XHJcbiAgICAgICAgICAgIGRpdklkOiAnZGl2U2VhdHNpbycsXHJcbiAgICAgICAgICAgIHdvcmtzcGFjZUtleTogdGhpcy5nZXRXb3Jrc3BhY2UoYnRuKSxcclxuICAgICAgICAgICAgZXZlbnQ6IHRoaXMuZ2V0RXZlbnRLZXkoYnRuKSxcclxuICAgICAgICAgICAgcHJpY2luZzogcHJpY2luZ0pzb24sXHJcbiAgICAgICAgICAgIG9uQ2hhcnRSZW5kZXJlZDogZnVuY3Rpb24gKGNoYXJ0KSB7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG9uT2JqZWN0RGVzZWxlY3RlZDogZnVuY3Rpb24gKG9iamVjdCwgZGVzZWxlY3RlZFRpY2tldFR5cGUpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuc2VhdENoYXJ0Lmxpc3RTZWxlY3RlZE9iamVjdHMoXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHNlbGVjdGVkT2JqZWN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuSkJ1eUJ1dHRvbigpLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuSkJ1eUJ1dHRvbigpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvbk9iamVjdFNlbGVjdGVkOiBmdW5jdGlvbiAob2JqZWN0LCBzZWxlY3RlZFRpY2tldFR5cGUpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuc2VhdENoYXJ0Lmxpc3RTZWxlY3RlZE9iamVjdHMoXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHNlbGVjdGVkT2JqZWN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuSkJ1eUJ1dHRvbigpLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuSkJ1eUJ1dHRvbigpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIC8vbnVtYmVyT2ZQbGFjZXNUb1NlbGVjdDogMSxcclxuICAgICAgICAgICAgcHJpY2VGb3JtYXR0ZXI6IGZ1bmN0aW9uIChwcmljZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICckJyArIHByaWNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkucmVuZGVyKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IG1heFMgPSB0aGlzLmdldE1heFNlbGVjdGVkU2VhdHMoYnRuKTtcclxuICAgICAgICBpZiAobWF4Uy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBtYXhTZWF0cyA9IEZ1bmN0aW9uKCdcInVzZSBzdHJpY3RcIjtyZXR1cm4gKCcgKyAnWycgKyBtYXhTICsgJ10nICsgJyknKSgpO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXRDaGFydC5jaGFuZ2VDb25maWcoe1xyXG4gICAgICAgICAgICAgICAgbWF4U2VsZWN0ZWRPYmplY3RzOiBtYXhTZWF0c1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXRDaGFydC5jaGFuZ2VDb25maWcoe1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyT2ZQbGFjZXNUb1NlbGVjdDogMSxcclxuICAgICAgICAgICAgICAgIG1heFNlbGVjdGVkT2JqZWN0czogMVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlRGVzdHJveVNlYXRDaGFydCgpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWF0Q2hhcnQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhdENoYXJ0LmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgdGhpcy5KQnV5QnV0dG9uKCkuTG9hZGluZ092ZXJsYXkoJ2hpZGUnKTtcclxuICAgICAgICAgICAgdGhpcy5zZWF0Q2hhcnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdENoYXJ0ID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEV2ZW50ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAqL1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9mcm9udGVuZC9mcmFtZXdvcmsvUndiRXZlbnRzRm9ybUNvbnRyb2xsZXIuanMiLCJcclxuaW1wb3J0IFJ3YkV2ZW50c0Zvcm1Nb2RlbCBmcm9tICcuL1J3YkV2ZW50c0Zvcm1Nb2RlbCc7XHJcblxyXG4vKipcclxuICogVmlldyB0YWtlcyBjYXJlIHRvIGFueSBodG1sIHJlbmRlcmluZyBhbmQgYW55dGhpbmcgcmVsYXRlZCB0byBzaG93aW5nIG9uIHRoZSBlbGVtZW50IGFuZCBpdHMgY2hpbGRyZW5cclxuICovXHJcblxyXG5cclxuY2xhc3MgUndiRXZlbnRzRm9ybVZpZXcgZXh0ZW5kcyBSd2JFdmVudHNGb3JtTW9kZWwge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgI
8443HN1cGVyKCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGdldFdhcm5pbmdEaXYobXNnKSB7XHJcbiAgICAgICAgcmV0dXJuICc8ZGl2IGNsYXNzPVwiYmItd2FybmluZ1wiPicgKyBtc2cgKyAnPC9kaXY+JztcclxuICAgIH1cclxuICAgIFxyXG4gICAgc2hvd0xvYWRpbmcoKSB7XHJcbiAgICAgICAgc3dhbChcclxuICAgICAgICAgICAgYmJMb2NhbC5sb2FkaW5nX3RleHRcclxuICAgICAgICApO1xyXG4gICAgICAgIHN3YWwuc2hvd0xvYWRpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93U3VjY2VzcyhodG1sKSB7XHJcbiAgICAgICAgc3dhbChcclxuICAgICAgICAgICAgJ0dvb2Qgam9iIScsXHJcbiAgICAgICAgICAgIGh0bWwsXHJcbiAgICAgICAgICAgICdzdWNjZXNzJ1xyXG4gICAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICBzaG93RXJyb3IoaHRtbCkge1xyXG4gICAgICAgIHN3YWwoXHJcbiAgICAgICAgICAgICdPb3BzIScsXHJcbiAgICAgICAgICAgIGh0bWwsXHJcbiAgICAgICAgICAgICdlcnJvcidcclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2VNb2RhbCgpIHtcclxuICAgICAgICBzd2FsLmNsb3NlTW9kYWwoKTtcclxuICAgICAgICAvL3N3YWwuY2xvc2UoKTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJ3YkV2ZW50c0Zvcm1WaWV3XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2Zyb250ZW5kL2ZyYW1ld29yay9Sd2JFdmVudHNGb3JtVmlldy5qcyIsImltcG9ydCBSd2JFdmVudHNGb3JtU3BpbmUgZnJvbSAnLi9Sd2JFdmVudHNGb3JtU3BpbmUnO1xyXG5cclxuLyoqXHJcbiAqIE1vZGVsIHRha2VzIGNhcmUgdG8gdGhlIGRhdGEtYXR0cmlidXRlcyBhdHRhY2hlZCB0byB0aGUgZWxlbWVudC9yZWFkLXdyaXRlIGFuZCB0cmlnZ2VyIGV2ZW50cyBvbiBjaGFuZ2Ugb2YgaXQuXHJcbiAqL1xyXG5cclxuY2xhc3MgUndiRXZlbnRzRm9ybU1vZGVsIGV4dGVuZHMgUndiRXZlbnRzRm9ybVNwaW5lIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZURhdGVBc1VUQyhkYXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwgZGF0ZS5nZXRTZWNvbmRzKCkpKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUaW1lem9uZUluTWlsaXNlY29uZHMoZGF0ZWkpIHtcclxuICAgICAgICBsZXQgZGF0ZUlucHV0O1xyXG4gICAgICAgIGlmICghZGF0ZWkpIHtcclxuICAgICAgICAgICAgZGF0ZUlucHV0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkYXRlSW5wdXQgPSBuZXcgRGF0ZShkYXRlaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBmdWxsWWVhciA9IGRhdGVJbnB1dC5nZXRGdWxsWWVhcigpIHwgMDtcclxuICAgICAgICAvLyBcIkxlYXAgWWVhcnMgYXJlIGFueSB5ZWFyIHRoYXQgY2FuIGJlIGV4YWN0bHkgZGl2aWRlZCBieSA0ICgyMDEyLCAyMDE2LCBldGMpXHJcbiAgICAgICAgLy8gICBleGNlcHQgaWYgaXQgY2FuIGJlIGV4YWN0bHkgZGl2aWRlZCBieSAxMDAsIHRoZW4gaXQgaXNuJ3QgKDIxMDAsMjIwMCxldGMpXHJcbiAgICAgICAgLy9cdCAgZXhjZXB0IGlmIGl0IGNhbiBiZSBleGFjdGx5IGRpdmlkZWQgYnkgNDAwLCB0aGVuIGl0IGlzICgyMDAwLCAyNDAwKVwiXHJcbiAgICAgICAgLy8gKGh0dHBzOi8vd3d3Lm1hdGhzaXNmdW4uY29tL2xlYXAteWVhcnMuaHRtbCkuXHJcbiAgICAgICAgbGV0IGlzTGVhcFllYXIgPSAoKGZ1bGxZZWFyICYgMykgfCAoZnVsbFllYXIgLyAxMDAgJiAzKSkgPT09IDAgPyAxIDogMDtcclxuICAgICAgICAvLyAoZnVsbFllYXIgJiAzKSA9IChmdWxsWWVhciAlIDQpLCBidXQgZmFzdGVyXHJcbiAgICAgICAgLy9BbHRlcm5hdGl2ZTp2YXIgaXNMZWFwWWVhcj0obmV3IERhdGUoY3VycmVudFllYXIsMSwyOSwxMikpLmdldERhdGUoKT09PTI5PzE6MFxyXG4gICAgICAgIGxldCBmdWxsTW9udGggPSBkYXRlSW5wdXQuZ2V0TW9udGgoKSB8IDA7XHJcbiAgICAgICAgbGV0IG9mZnNldERzdCA9IDA7XHJcbiAgICAgICAgLyogb2Zmc2V0RHN0ID0gKFxyXG4gICAgICAgICAgICAvLyAxLiBXZSBrbm93IHdoYXQgdGhlIHRpbWUgc2luY2UgdGhlIEVwb2NoIHJlYWxseSBpc1xyXG4gICAgICAgICAgICAoK2RhdGVJbnB1dCkgLy8gc2FtZSBhcyB0aGUgZGF0ZUlucHV0LmdldFRpbWUoKSBtZXRob2RcclxuICAgICAgICAgICAgLy8gMi4gV2Uga25vdyB3aGF0IHRoZSB0aW1lIHNpbmNlIHRoZSBFcG9jaCBhdCB0aGUgc3RhcnQgb2YgdGhlIHllYXIgaXNcclxuICAgICAgICAgICAgLSAoK25ldyBEYXRlKGZ1bGxZZWFyLCAwLCAwKSkgLy8gZGF5IGRlZmF1bHRzIHRvIDEgaWYgbm90IGV4cGxpY2l0bHkgemVyb2VkXHJcbiAgICAgICAgICAgIC8vIDMuIE5vdywgc3VidHJhY3Qgd2hhdCB3ZSB3b3VsZCBleHBlY3QgdGhlIHRpbWUgdG8gYmUgaWYgZGF5bGlnaHQgc2F2aW5nc1xyXG4gICAgICAgICAgICAvLyAgICAgIGRpZCBub3QgZXhpc3QuIFRoaXMgeWllbGRzIHRoZSB0aW1lLW9mZnNldCBkdWUgdG8gZGF5bGlnaHQgc2F2aW5ncy5cclxuICAgICAgICAgICAgLSAoKFxyXG4gICAgICAgICAgICAgICAgKChcclxuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRheSBvZiB0aGUgeWVhciBpbiB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvZGUgYmVsb3cgd29ya3MgYmFzZWQgdXBvbiB0aGUgZmFjdHMgb2Ygc2lnbmVkIHJpZ2h0IHNoaWZ0c1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgIOKAoiAoeCkgPj4gbjogc2hpZnRzIG4gYW5kIGZpbGxzIGluIHRoZSBuIGhpZ2hlc3QgYml0cyB3aXRoIDBzXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAg4oCiICgteCkgPj4gbjogc2hpZnRzIG4gYW5kIGZpbGxzIGluIHRoZSBuIGhpZ2hlc3QgYml0cyB3aXRoIDFzXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gKFRoaXMgYXNzdW1lcyB0aGF0IHggaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyKVxyXG4gICAgICAgICAgICAgICAgICAgICgzMSAmICgoLWZ1bGxNb250aCkgPj4gNCkpICsgLy8gSmFudWFyeSAvLyAoLTExKT4+NCA9IC0xXHJcbiAgICAgICAgICAgICAgICAgICAgKCgyOCArIGlzTGVhcFllYXIpICYgKCgxIC0gZnVsbE1vbnRoKSA+PiA0KSkgKyAvLyBGZWJydWFyeVxyXG4gICAgICAgICAgICAgICAgICAgICgzMSAmICgoMiAtIGZ1bGxNb250aCkgPj4gNCkpICsgLy8gTWFyY2hcclxuICAgICAgICAgICAgICAgICAgICAoMzAgJiAoKDMgLSBmdWxsTW9udGgpID4+IDQpKSArIC8vIEFwcmlsXHJcbiAgICAgICAgICAgICAgICAgICAgKDMxICYgKCg0IC0gZnVsbE1vbnRoKSA+PiA0KSkgKyAvLyBNYXlcclxuICAgICAgICAgICAgICAgICAgICAoMzAgJiAoKDUgLSBmdWxsTW9udGgpID4+IDQpKSArIC8vIEp1bmVcclxuICAgICAgICAgICAgICAgICAgICAoMzEgJiAoKDYgLSBmdWxsTW9udGgpID4+IDQpKSArIC8vIEp1bHlcclxuICAgICAgICAgICAgICAgICAgICAoMzEgJiAoKDcgLSBmdWxsTW9udGgpID4+IDQpKSArIC8vIEF1Z3VzdFxyXG4gICAgICAgICAgICAgICAgICAgICgzMCAmICgoOCAtIGZ1bGxNb250aCkgPj4gNCkpICsgLy8gU2VwdGVtYmVyXHJcbiAgICAgICAgICAgICAgICAgICAgKDMxICYgKCg5IC0gZnVsbE1vbnRoKSA+PiA0KSkgKyAvLyBPY3RvYmVyXHJcbiAgICAgICAgICAgICAgICAgICAgKDMwICYgKCgxMCAtIGZ1bGxNb250aCkgPj4gNCkpICsgLy8gTm92ZW1iZXJcclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgbm8gbW9udGhzIHBhc3QgRGVjZW1iZXI6IHRoZSB5ZWFyIHJvbGxzIGludG8gdGhlIG5leHQuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGh1cywgZnVsbE1vbnRoIGlzIDAtYmFzZWQsIHNvIGl0IHdpbGwgbmV2ZXIgYmUgMTIgaW4gSmF2YXNjcmlwdFxyXG5cclxuICAgICAgICAgICAgICAgICAgICAoZGF0ZUlucHV0LmdldERhdGUoKSB8IDApIC8vIGdldCBkYXkgb2YgdGhlIG1vbnRoXHJcblxyXG4gICAgICAgICAgICAgICAgKSAmIDB4ZmZmZikgKiAyNCAqIDYwIC8vIDI0IGhvdXJzIGluIGEgZGF5LCA2MCBtaW51dGVzIGluIGFuIGhvdXJcclxuICAgICAgICAgICAgICAgICsgKGRhdGVJbnB1dC5nZXRIb3VycygpICYgMHhmZikgKiA2MCAvLyA2MCBtaW51dGVzIGluIGFuIGhvdXJcclxuICAgICAgICAgICAgICAgICsgKGRhdGVJbnB1dC5nZXRNaW51dGVzKCkgJiAweGZmKVxyXG4gICAgICAgICAgICApIHwgMCkgKiA2MCAqIDEwMDAgLy8gNjAgc2Vjb25kcyBpbiBhIG1pbnV0ZSAqIDEwMDAgbWlsbGlzZWNvbmRzIGluIGEgc2Vjb25kXHJcbiAgICAgICAgICAgIC0gKGRhdGVJbnB1dC5nZXRTZWNvbmRzKCkgJiAweGZmKSAqIDEwMDAgLy8gMTAwMCBtaWxsaXNlY29uZHMgaW4gYSBzZWNvbmRcclxuICAgICAgICAgICAgLSBkYXRlSW5wdXQuZ2V0TWlsbGlzZWNvbmRzKClcclxuICAgICAgICApO1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChkYXRlSW5wdXQuaXNEU1QoKSkge1xyXG4gICAgICAgICAgICBvZmZzZXREc3QgPSA2MCAqIDYwICogMTAwMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHR6T2Zmc2V0ID0gZGF0ZUlucHV0LmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MCAqIDEwMDA7XHJcbiAgICAgICAgLyppZiAodHpPZmZzZXQgPCAwKSB7XHJcbiAgICAgICAgICAgI
8443HR6T2Zmc2V0ID0gdHpPZmZzZXQgKyBvZmZzZXREc3Q7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdHpPZmZzZXQgPSB0ek9mZnNldCAtIG9mZnNldERzdDtcclxuICAgICAgICB9Ki9cclxuICAgICAgICByZXR1cm4gdHpPZmZzZXQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGlzTW9iaWxlKCkge1xyXG4gICAgICAgIGxldCBjaGVjayA9IGZhbHNlO1xyXG4gICAgICAgIChmdW5jdGlvbiAoYSkge1xyXG4gICAgICAgICAgICBpZiAoLyhhbmRyb2lkfGJiXFxkK3xtZWVnbykuK21vYmlsZXxhdmFudGdvfGJhZGFcXC98YmxhY2tiZXJyeXxibGF6ZXJ8Y29tcGFsfGVsYWluZXxmZW5uZWN8aGlwdG9wfGllbW9iaWxlfGlwKGhvbmV8b2QpfGlyaXN8a2luZGxlfGxnZSB8bWFlbW98bWlkcHxtbXB8bW9iaWxlLitmaXJlZm94fG5ldGZyb250fG9wZXJhIG0ob2J8aW4paXxwYWxtKCBvcyk/fHBob25lfHAoaXhpfHJlKVxcL3xwbHVja2VyfHBvY2tldHxwc3B8c2VyaWVzKDR8NikwfHN5bWJpYW58dHJlb3x1cFxcLihicm93c2VyfGxpbmspfHZvZGFmb25lfHdhcHx3aW5kb3dzIGNlfHhkYXx4aWluby9pLnRlc3QoYSkgfHwgLzEyMDd8NjMxMHw2NTkwfDNnc298NHRocHw1MFsxLTZdaXw3NzBzfDgwMnN8YSB3YXxhYmFjfGFjKGVyfG9vfHNcXC0pfGFpKGtvfHJuKXxhbChhdnxjYXxjbyl8YW1vaXxhbihleHxueXx5dyl8YXB0dXxhcihjaHxnbyl8YXModGV8dXMpfGF0dHd8YXUoZGl8XFwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihlfHYpd3xidW1ifGJ3XFwtKG58dSl8YzU1XFwvfGNhcGl8Y2N3YXxjZG1cXC18Y2VsbHxjaHRtfGNsZGN8Y21kXFwtfGNvKG1wfG5kKXxjcmF3fGRhKGl0fGxsfG5nKXxkYnRlfGRjXFwtc3xkZXZpfGRpY2F8ZG1vYnxkbyhjfHApb3xkcygxMnxcXC1kKXxlbCg0OXxhaSl8ZW0obDJ8dWwpfGVyKGljfGswKXxlc2w4fGV6KFs0LTddMHxvc3x3YXx6ZSl8ZmV0Y3xmbHkoXFwtfF8pfGcxIHV8ZzU2MHxnZW5lfGdmXFwtNXxnXFwtbW98Z28oXFwud3xvZCl8Z3IoYWR8dW4pfGhhaWV8aGNpdHxoZFxcLShtfHB8dCl8aGVpXFwtfGhpKHB0fHRhKXxocCggaXxpcCl8aHNcXC1jfGh0KGMoXFwtfCB8X3xhfGd8cHxzfHQpfHRwKXxodShhd3x0Yyl8aVxcLSgyMHxnb3xtYSl8aTIzMHxpYWMoIHxcXC18XFwvKXxpYnJvfGlkZWF8aWcwMXxpa29tfGltMWt8aW5ub3xpcGFxfGlyaXN8amEodHx2KWF8amJyb3xqZW11fGppZ3N8a2RkaXxrZWppfGtndCggfFxcLyl8a2xvbnxrcHQgfGt3Y1xcLXxreW8oY3xrKXxsZShub3x4aSl8bGcoIGd8XFwvKGt8bHx1KXw1MHw1NHxcXC1bYS13XSl8bGlid3xseW54fG0xXFwtd3xtM2dhfG01MFxcL3xtYSh0ZXx1aXx4byl8bWMoMDF8MjF8Y2EpfG1cXC1jcnxtZShyY3xyaSl8bWkobzh8b2F8dHMpfG1tZWZ8bW8oMDF8MDJ8Yml8ZGV8ZG98dChcXC18IHxvfHYpfHp6KXxtdCg1MHxwMXx2ICl8bXdicHxteXdhfG4xMFswLTJdfG4yMFsyLTNdfG4zMCgwfDIpfG41MCgwfDJ8NSl8bjcoMCgwfDEpfDEwKXxuZSgoY3xtKVxcLXxvbnx0Znx3Znx3Z3x3dCl8bm9rKDZ8aSl8bnpwaHxvMmltfG9wKHRpfHd2KXxvcmFufG93ZzF8cDgwMHxwYW4oYXxkfHQpfHBkeGd8cGcoMTN8XFwtKFsxLThdfGMpKXxwaGlsfHBpcmV8cGwoYXl8dWMpfHBuXFwtMnxwbyhja3xydHxzZSl8cHJveHxwc2lvfHB0XFwtZ3xxYVxcLWF8cWMoMDd8MTJ8MjF8MzJ8NjB8XFwtWzItN118aVxcLSl8cXRla3xyMzgwfHI2MDB8cmFrc3xyaW05fHJvKHZlfHpvKXxzNTVcXC98c2EoZ2V8bWF8bW18bXN8bnl8dmEpfHNjKDAxfGhcXC18b298cFxcLSl8c2RrXFwvfHNlKGMoXFwtfDB8MSl8NDd8bWN8bmR8cmkpfHNnaFxcLXxzaGFyfHNpZShcXC18bSl8c2tcXC0wfHNsKDQ1fGlkKXxzbShhbHxhcnxiM3xpdHx0NSl8c28oZnR8bnkpfHNwKDAxfGhcXC18dlxcLXx2ICl8c3koMDF8bWIpfHQyKDE4fDUwKXx0NigwMHwxMHwxOCl8dGEoZ3R8bGspfHRjbFxcLXx0ZGdcXC18dGVsKGl8bSl8dGltXFwtfHRcXC1tb3x0byhwbHxzaCl8dHMoNzB8bVxcLXxtM3xtNSl8dHhcXC05fHVwKFxcLmJ8ZzF8c2kpfHV0c3R8djQwMHx2NzUwfHZlcml8dmkocmd8dGUpfHZrKDQwfDVbMC0zXXxcXC12KXx2bTQwfHZvZGF8dnVsY3x2eCg1Mnw1M3w2MHw2MXw3MHw4MHw4MXw4M3w4NXw5OCl8dzNjKFxcLXwgKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhc1xcLXx5b3VyfHpldG98enRlXFwtL2kudGVzdChhLnN1YnN0cigwLCA0KSkpIGNoZWNrID0gdHJ1ZTtcclxuICAgICAgICB9KShuYXZpZ2F0b3IudXNlckFnZW50IHx8IG5hdmlnYXRvci52ZW5kb3IgfHwgd2luZG93Lm9wZXJhKTtcclxuICAgICAgICByZXR1cm4gY2hlY2s7XHJcbiAgICB9XHJcblxyXG4gICAgaW5BcnJheShhcnIsIGVsZW0pIHtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYXJyKSB7XHJcbiAgICAgICAgICAgIGlmICgoYXJyW2tleV0gKyBcIlwiKSA9PT0gKFwiXCIgKyBlbGVtKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlSHRtbFRhYmxlKGlkLCBoZWFkLCByb3dzLCBmb290ZXIpIHtcclxuICAgICAgICBsZXQgdGFibGUgPSBqUXVlcnkoJzx0YWJsZSBpZD1cIicgKyBpZCArICdcIj48L3RhYmxlPicpO1xyXG4gICAgICAgIGxldCBoZWFkVGFibGUgPSBqUXVlcnkoJzx0aGVhZD48L3RoZWFkPicpO1xyXG4gICAgICAgIGxldCBib2R5VGFibGUgPSBqUXVlcnkoJzx0Ym9keT48L3Rib2R5PicpO1xyXG4gICAgICAgIGxldCBmb290ZXJUYWJsZSA9IGpRdWVyeSgnPHRmb290PjwvdGZvb3Q+Jyk7XHJcbiAgICAgICAgbGV0IHJvd0h0bWwgPSBqUXVlcnkoJzx0cj48L3RyPicpO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGhlYWQpIHtcclxuICAgICAgICAgICAgbGV0IGNvbHNwYW4gPSAxO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGhlYWRba2V5XVsnY29sc3BhbiddICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgY29sc3BhbiA9IGhlYWRba2V5XVsnY29sc3BhbiddO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByb3dIdG1sLmFwcGVuZChqUXVlcnkoJzx0aCBjb2xzcGFuPVwiJyArIGNvbHNwYW4gKyAnXCI+JyArIGhlYWRba2V5XVsnbGFiZWwnXSArICc8L3RoPicpKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhlYWRUYWJsZS5hcHBlbmQocm93SHRtbCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcm93cykge1xyXG4gICAgICAgICAgICBsZXQgcm93SHRtbCA9IGpRdWVyeSgnPHRyPjwvdHI+Jyk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29sIGluIHJvd3Nba2V5XVsnY29sdW1ucyddKSB7XHJcbiAgICAgICAgICAgICAgICByb3dIdG1sLmFwcGVuZChqUXVlcnkoJzx0ZD4nICsgcm93c1trZXldWydjb2x1bW5zJ11bY29sXSArICc8L3RkPicpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBib2R5VGFibGUuYXBwZW5kKHJvd0h0bWwpO1xyXG4gICAgICAgI
8443H1cclxuICAgICAgICBsZXQgcm93SHRtbDEgPSBqUXVlcnkoJzx0cj48L3RyPicpO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZvb3Rlcikge1xyXG4gICAgICAgICAgICBsZXQgY29sc3BhbiA9IDE7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZm9vdGVyW2tleV1bJ2NvbHNwYW4nXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgIGNvbHNwYW4gPSBmb290ZXJba2V5XVsnY29sc3BhbiddO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByb3dIdG1sMS5hcHBlbmQoalF1ZXJ5KCc8dGQgY29sc3Bhbj1cIicgKyBjb2xzcGFuICsgJ1wiPicgKyBmb290ZXJba2V5XVsnbGFiZWwnXSArICc8L3RkPicpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9vdGVyVGFibGUuYXBwZW5kKHJvd0h0bWwxKTtcclxuICAgICAgICB0YWJsZS5hcHBlbmQoaGVhZFRhYmxlKS5hcHBlbmQoYm9keVRhYmxlKS5hcHBlbmQoZm9vdGVyVGFibGUpO1xyXG4gICAgICAgIHJldHVybiB0YWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUaW1lKHNEYXRlLCB3aXRoVGltZSA9IHRydWUpIHtcclxuICAgICAgICAvL2NvbnN0IGQgPSBnZXROb3JtYWxEYXRlKHNEYXRlKTtcclxuICAgICAgICBpZiAodHlwZW9mIHNEYXRlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICAvL3NEYXRlID0gdGhpcy5jcmVhdGVEYXRlQXNVVEMoc0RhdGUpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgc0RhdGUgPSBzRGF0ZS5nZXRUaW1lKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXdpdGhUaW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzRGF0ZSAtIChzRGF0ZSAlIDg2NDAwMDAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzRGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBpc0luVmlld3BvcnQoZWxlbSkge1xyXG5cclxuICAgICAgICBsZXQgZWxlbWVudFRvcCA9IGVsZW0ub2Zmc2V0KCkudG9wO1xyXG4gICAgICAgIGxldCBlbGVtZW50Qm90dG9tID0gZWxlbWVudFRvcCArIGVsZW0ub3V0ZXJIZWlnaHQoKTtcclxuXHJcbiAgICAgICAgbGV0IHZpZXdwb3J0VG9wID0galF1ZXJ5KHdpbmRvdykuc2Nyb2xsVG9wKCk7XHJcbiAgICAgICAgbGV0IHZpZXdwb3J0Qm90dG9tID0gdmlld3BvcnRUb3AgKyBqUXVlcnkod2luZG93KS5oZWlnaHQoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRCb3R0b20gPiB2aWV3cG9ydFRvcCAmJiBlbGVtZW50VG9wIDwgdmlld3BvcnRCb3R0b207XHJcbiAgICB9XHJcblxyXG4gICAgY29tcGFyZV9hc2MoZDEsIGQyKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBkMSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgZDEgPSB0aGlzLmdldFRpbWUoZDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGQyID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICBkMiA9IHRoaXMuZ2V0VGltZS
8443hkMik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkMSA+IGQyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZDEgPT09IGQyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkMSA8IGQyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldFByaWNpbmcoZWwpIHtcclxuICAgICAgICBsZXQgcHJpY2luZyA9IGVsLmRhdGEoJ3ByaWNpbmcnKVxyXG4gICAgICAgIGlmICghcHJpY2luZykge1xyXG4gICAgICAgICAgICBwcmljaW5nID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcmljaW5nLnNsaWNlKDEsIC0xKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNYXhTZWxlY3RlZFNlYXRzKGVsKSB7XHJcbiAgICAgICAgbGV0IG1heFNlbGVjdGVkID0gZWwuZGF0YSgnbWF4c2VsZWN0ZWRvYmplY3RzJylcclxuICAgICAgICBpZiAoIW1heFNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIG1heFNlbGVjdGVkID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtYXhTZWxlY3RlZC5zbGljZSgxLCAtMSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TnVtYmVyT2ZQbGFjZXNUb1NlbGVjdChlbCkge1xyXG4gICAgICAgIGNvbnN0IHF0eSA9IHBhcnNlSW50KGVsLmRhdGEoJ251bWJlcm9mcGxhY2VzdG9zZWxlY3QnKS5zbGljZSgxLCAtMSkpO1xyXG4gICAgICAgIGlmIChpc05hTihxdHkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcXR5O1xyXG4gICAgfVxyXG5cclxuICAgIGdldFdvcmtzcGFjZShlbCkge1xyXG4gICAgICAgIHJldHVybiBlbC5kYXRhKCd3b3Jrc3BhY2VrZXknKS5zbGljZSgxLCAtMSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RXZlbnRLZXkoZWwpIHtcclxuICAgICAgICByZXR1cm4gZWwuZGF0YSgnZXZlbnRrZXknKS5zbGljZSgxLCAtMSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJ3YkV2ZW50c0Zvcm1Nb2RlbFxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9mcm9udGVuZC9mcmFtZXdvcmsvUndiRXZlbnRzRm9ybU1vZGVsLmpzIiwiY2xhc3MgUndiRXZlbnRzRm9ybVNwaW5lIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmJ0biA9ICcucndiLXRpY2tldHMtYnRuJztcclxuICAgICAgICB0aGlzLnNlYXRDaGFydCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvcm0gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RDaGFydCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEV2ZW50ID0gbnVsbDtcclxuICAgICAgICB0aGlzLmV2ZW50TGlzdCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEV2ZW50SWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkZXZlbnRQcm9tb3Rpb25zSWRzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEV2ZW50RGF0YSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZmlyc3REYXRlV2l0aEV2ZW50ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pbml0UGFja1ByaWNlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5vd25QcmljaW5nRGF0YSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5ldmVudFNlYXRzID0gbnVsbDtcclxuICAgICAgICB0aGlzLmV2ZW50UHJvbW90aW9ucyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZWF0QWxlcnRzQW5kVG9vbHRpcHNQZXJMYWJlbCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFByb21vQ29kZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWROdW1iZXJPZlRpY2tldHMgPSAwO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMYWJlbHMgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmZwc2VhcmNoID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5teXNlbGVjdGVkT2JqZWN0cyA9IFtdO1xyXG4gICAgICAgIHRoaXMuc2NhbHR5cGUgPSAnc2NhbHBvcCc7XHJcbiAgICAgICAgdGhpcy5zY2FsY2F0ID0gJzAnO1xyXG4gICAgICAgIHRoaXMuY3N0YXJ0X2RhdGUgPSAnJztcclxuICAgICAgICB0aGlzLmNlbmRfZGF0ZSA9ICcnO1xyXG4gICAgICAgIHRoaXMuZHNlbGVjdGVkID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgSkRvY3VtZW50KCkge1xyXG4gICAgICAgIHJldHVybiAkKGRvY3VtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBKQnRuKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkpGb3JtKCkuZmluZCh0aGlzLmJ0bik7XHJcbiAgICB9XHJcblxyXG4gICAgSlNlYXRRdHkoKSB7XHJcbiAgICAgICAgcmV0dXJuICc8ZGl2IGlkPVwiZGl2U2VhdHNpb1wiPjwvZGl2PjxkaXYgaWQ9XCJxdHlUaWNrZXRzXCI+PC9kaXY+PGRpdiBpZD1cImNhcnRCdXR0b25cIj48YSBocmVmPVwiI1wiIGNsYXNzPVwiYnV0dG9uIGJ0biBidXlub3dcIj5CdXkgTm93PC9hPjwvZGl2Pic7XHJcbiAgICB9XHJcblxyXG4gICAgSlNlYXREaXYoKSB7XHJcbiAgICAgICAgcmV0dXJuIGpRdWVyeSgnI2RpdlNlYXRzaW8nKTtcclxuICAgIH1cclxuXHJcbiAgICBKUHJvZHVjdElkKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJ2J1dHRvbi5zaW5nbGVfYWRkX3RvX2NhcnRfYnV0dG9uJykudmFsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgSkJ1eUJ1dHRvbigpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcudGlja2V0c19jYXJ0IC5zYnV5bm93Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgSlJvb21SZXNlcnZlQnV0dG9uKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJy5yZXNlcnZlLWJ1dHRvbicpO1xyXG4gICAgfVxyXG5cclxuICAgIEpJc0F0dHJhY3Rpb24oKSB7XHJcbiAgICAgICAgaWYgKGpRdWVyeSgnI2hhc19hdHRyYWN0aW9uJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIE
8443pGcmVlU2VhdGluZygpIHtcclxuICAgICAgICBpZiAoalF1ZXJ5KCcjcmlzX2ZyZWVfc2VhdGluZycpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBKQWRkVG9DYXJ0QnV0dG9uKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJy50aWNrZXRzX2NhcnQgLnNhZGRjYXJ0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgSlByaWNlQmVzdFNlYXRzKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJy5wcmljZV9iZXN0X3NlYXRzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgSlpvbmVJbWFnZSgpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcuYXR0cmFjdGlvbl96b25lX2ltYWdlLmlzX2ZpcnN0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgSklzUmVkZWFtKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJy5yd2JfcmVkZWFtJykubGVuZ3RoID4gMDtcclxuICAgIH1cclxuXHJcbiAgICBKUXR5VGlja2V0cygpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcjcXR5VGlja2V0cycpO1xyXG4gICAgfVxyXG5cclxuICAgIEpRdHkoKSB7XHJcbiAgICAgICAgcmV0dXJuIGpRdWVyeSgnI3F0eVRpY2tldHMgLnF0eV9zZWxlY3QnKTtcclxuICAgIH1cclxuXHJcbiAgICBKQnV5VGlja2V0cygpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcuYnV5X3RpY2tldHNfc2VhdHMnKS5maW5kKCdhJyk7XHJcbiAgICB9XHJcblxyXG4gICAgSkZsYXRDYWxlbmRhcigpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcuZmxhdF9jYWxlbmRhcicpO1xyXG4gICAgfVxyXG5cclxuICAgIEpGbGF0Q2FsZW5kYXJJbnB1dCgpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcuZmxhdF9jYWxlbmRhcicpLmZpbmQoJ2lucHV0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgSkV2ZW50c1BlckRhdGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIGpRdWVyeSgnLmV2ZW50c19wZXJfZGF0ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIEpFdmVudHNQZXJEYXRlQmVmb3JlVGV4dCgpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcuZXZlbnRfc2VsZWN0aW9uX3RpY2tldF90ZXh0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgSkV2ZW50U2VsZWN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJy5ldmVudF9zZWxlY3Rpb25fdGlja2V0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgSlByaWNlTWFwRXhwbGFuYXRpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIGpRdWVyeSgnI3ByaWNlX21hcF9leHBsYW5hdGlvbicpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBKVGlja2V0c0NhcnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIGpRdWVyeSgnLmV2ZW50X3NlbGVjdGlvbl90aWNrZXQgLnRpY2tldF9iZWZvcmVfdGFibGVfc2VsZWN0ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICBKVGlja2V0c1NlbGVjdGVkQ2FydCgpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcudGlja2V0c19jYXJ0IC50aWNrZXRfc2VsZWN0ZWRfY2FydCcpO1xyXG4gICAgfVxyXG5cclxuICAgIEpUaWNrZXRzQnV0dG9uc0NhcnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIGpRdWVyeSgnLnRpY2tldHNfY2FydCAudGlja2V0X2J1dHRvbnNfY2FydCcpO1xyXG4gICAgfVxyXG5cclxuICAgIEpUaWNrZXRzQ2hvb3NlcigpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcjdGlja2V0X2Nob29zZXInKTtcclxuICAgIH1cclxuXHJcbiAgICBKVGlja2V0c1NlbGVjdGVkVGFibGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIGpRdWVyeSgnI3RpY2tldHNfc2VsZWN0ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICBKVGltZUVsZW0oZXZlbnRfaWQsIHRpbWVfdmFsLCBkYXRlU3RyLCBpKSB7XHJcbiAgICAgICAgcmV0dXJuIGpRdWVyeSgnPGRpdiBjbGFzcz1cInRpbWVfZWxlbVwiIGV2X3Bvcz1cIicgKyBpICsgJ1wiIGV2ZW50X2RhdGU9XCInICsgZGF0ZVN0ciArICdcIiBldmVudF9ob3VyPVwiJyArIHRpbWVfdmFsICsgJ1wiIGV2ZW50X2lkPVwiJyArIGV2ZW50X2lkICsgJ1wiPicgKyAnPGkgY2xhc3M9XCJzbHYgc2x2LXJhZGlvLXVuY2hlY2tlZFwiPjwvaT4nICsgdGltZV92YWwgKyAnPC9kaXY+Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgSlNlYXRzTWFwKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJyNzZWF0c19tYXAnKTtcclxuICAgIH1cclxuXHJcbiAgICBKU2VhcmNoQnV0dG9uKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJy5zZWFyY2gtY29udHJvbHMgLnNlYXJjaC1idXR0b24nKS5maXJzdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIEpTZWFyY2hCdXR0b25DYWxlbmRhcigpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcuc2VhcmNoLWNvbnRyb2xzIC5zZWFyY2gtYnV0dG9uLWNhbGVuZGFyJykuZmlyc3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBKUGFja0J1dHRvbigpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcuc3RhcnRwYWNrLWJ1dHRvbicpO1xyXG4gICAgfVxyXG5cclxuICAgIEpEdWFsRGF0ZXMoKSB7XHJcbiAgICAgICAgaWYgKGpRdWVyeSgnI2RkdWFsZGF0ZXMnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBqUXVlcnkoJyNkZHVhbGRhdGVzJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBKVGhlbWUoKSB7X
8443HJcbiAgICAgICAgaWYgKGpRdWVyeSgnI3Nwb3R0aGVtZScpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGpRdWVyeSgnI3Nwb3R0aGVtZScpLmF0dHIoJ3RoZW1lJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnZGFyayc7XHJcbiAgICB9XHJcblxyXG4gICAgSkdvVG9Nb250aCgpIHtcclxuICAgICAgICBpZiAoalF1ZXJ5KCcjZ3Rtb250aCcpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICd5ZWFyJzogcGFyc2VJbnQoalF1ZXJ5KCcjZ3Rtb250aCcpLmF0dHIoJ2R5ZWFyJykpLFxyXG4gICAgICAgICAgICAgICAgJ21vbnRoJzogcGFyc2VJbnQoalF1ZXJ5KCcjZ3Rtb250aCcpLmF0dHIoJ2Rtb250aCcpKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBKQmxhbmtTZWF0c01hcCgpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcjYmxhbmtfc2VhdHNfbWFwJyk7XHJcbiAgICB9XHJcblxyXG4gICAgSlByaWNlTWFwKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJyNwcmljZV9tYXAnKTtcclxuICAgIH1cclxuXHJcbiAgICBKUHJpY2VNYXBTZWF0cygpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcjcHJpY2VfbWFwX3NlYXRzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgSkZvcm0oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvcm0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGpRdWVyeSh0aGlzLmZvcm0pLnBhcmVudCgpLmlzKCdmb3JtJykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZvcm0gPSBqUXVlcnkodGhpcy5mb3JtKS5wYXJlbnQoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBqUXVlcnkodGhpcy5mb3JtKS5wYXJlbnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgbWFpbkZvcm0gPSBqUXVlcnkodGhpcy5mb3JtKS5uZXh0QWxsKCdmb3JtJykuZmlyc3QoKTtcclxuICAgICAgICAgICAgaWYgKG1haW5Gb3JtLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeSh0aGlzLmZvcm0pLnByZXBlbmRUbyhtYWluRm9ybSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBtYWluRm9ybSA9IGpRdWVyeSgnZm9ybS5jYXJ0JykuZmlyc3QoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtID0gbWFpbkZvcm07XHJcbiAgICAgICAgICAgIHJldHVybiBtYWluRm9ybTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Rm9ybTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSd2JFdmVudHNGb3JtU3BpbmVcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vZnJvbnRlbmQvZnJhbWV3b3JrL1J3YkV2ZW50c0Zvcm1TcGluZS5qcyIsIi8qIVxuKiBzd2VldGFsZXJ0MiB2MTAuMTQuMFxuKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4qL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eX
8443Blb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5Td2VldGFsZXJ0MiA9IGZhY3RvcnkoKSk7XG59KHRoaXMsIGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7XG4gICAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3R5cGVvZihvYmopO1xuICB9XG5cbiAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2Y
8443XIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICAgIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gICAgfVxuXG4gICAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7XG4gICAgfTtcbiAgICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pO1xuICB9XG5cbiAgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICAgIG8uX19wcm90b19fID0gcDtcbiAgICAgIHJldHVybiBvO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xuICB9XG5cbiAgZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gICAgaWYgKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSkge1xuICAgICAgX2NvbnN0cnVjdCA9IFJlZmxlY3QuY29uc3RydWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBfY29uc3RydWN0ID0gZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gICAgICAgIHZhciBhID0gW251bGxdO1xuICAgICAgICBhLnB1c2guYXBwbHkoYSwgYXJncyk7XG4gICAgICAgIHZhciBDb25zdHJ1Y3RvciA9IEZ1bmN0aW9uLmJpbmQuYXBwbHkoUGFyZW50LCBhKTtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICAgIGlmIChDbGFzcykgX3NldFByb3RvdHlwZU9mKGluc3RhbmNlLCBDbGFzcy5wcm90b3R5cGUpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBfY29uc3RydWN0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHtcbiAgICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cblxuICBmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gICAgaWYgKGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgICByZXR1cm4gY2FsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7XG4gICAgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7XG4gICAgICB2Y
8443XIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksXG4gICAgICAgICAgcmVzdWx0O1xuXG4gICAgICBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkge1xuICAgICAgICB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yO1xuXG4gICAgICAgIHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2Uob2JqZWN0LCBwcm9wZXJ0eSkge1xuICAgIHdoaWxlICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpKSB7XG4gICAgICBvYmplY3QgPSBfZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTtcbiAgICAgIGlmIChvYmplY3QgPT09IG51bGwpIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICBmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiICYmIFJlZmxlY3QuZ2V0KSB7XG4gICAgICBfZ2V0ID0gUmVmbGVjdC5nZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9nZXQgPSBmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gICAgICAgIHZhciBiYXNlID0gX3N1cGVyUHJvcEJhc2UodGFyZ2V0LCBwcm9wZXJ0eSk7XG5cbiAgICAgICAgaWYgKCFiYXNlKSByZXR1cm47XG4gICAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlLCBwcm9wZXJ0eSk7XG5cbiAgICAgICAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuIGRlc2MuZ2V0LmNhbGwocmVjZWl2ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlc2MudmFsdWU7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyIHx8IHRhcmdldCk7XG4gIH1cblxuICB2YXIgY29uc29sZVByZWZpeCA9ICdTd2VldEFsZXJ0MjonO1xuICAvKipcbiAgICogRmlsdGVyIHRoZSB1bmlxdWUgdmFsdWVzIGludG8gYSBuZXcgYXJyYXlcbiAgICogQHBhcmFtIGFyclxuICAgKi9cblxuICB2YXIgdW5pcXVlQXJyYXkgPSBmdW5jdGlvbiB1bmlxdWVBcnJheShhcnIpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlc3VsdC5pbmRleE9mKGFycltpXSkgPT09IC0xKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGFycltpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgLyoqXG4gICAqIENhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlciBvZiBhIHN0cmluZ1xuICAgKiBAcGFyYW0gc3RyXG4gICAqL1xuXG4gIHZhciBjYXBpdGFsaXplRmlyc3RMZXR0ZXIgPSBmdW5jdGlvbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbiAgfTtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIG9iamVjdCB2YWx1ZXMgKE9iamVjdC52YWx1ZXMgaXNuJ3Qgc3VwcG9ydGVkIGluIElFMTEpXG4gICAqIEBwYXJhbSBvYmpcbiAgICovXG5cbiAgdmFyIG9iamVjdFZhbHVlcyA9IGZ1bmN0aW9uIG9iamVjdFZhbHVlcyhvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldO1xuICAgIH0pO1xuICB9O1xuICAvKipcbiAgICogQ29udmVydCBOb2RlTGlzdCB0byBBcnJheVxuICAgKiBAcGFyYW0gbm9kZUxpc3RcbiAgICovXG5cbiAgdmFyIHRvQXJyYXkgPSBmdW5jdGlvbiB0b0FycmF5KG5vZGVMaXN0KSB7XG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG5vZGVMaXN0KTtcbiAgfTtcbiAgLyoqXG4gICAqIFN0YW5kYXJkaXNlIGNvbnNvbGUgd2FybmluZ3NcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG5cbiAgdmFyIHdhcm4gPSBmdW5jdGlvbiB3YXJuKG1lc3NhZ2UpIHtcbiAgICBjb25zb2xlLndhcm4oXCJcIi5jb25jYXQoY29uc29sZVByZWZpeCwgXCIgXCIpLmNvbmNhdChfdHlwZW9mKG1lc3NhZ2UpID09PSAnb2JqZWN0JyA/IG1lc3NhZ2Uuam9pbignICcpIDogbWVzc2FnZSkpO1xuICB9O1xuICAvKipcbiAgICogU3RhbmRhcmRpc2UgY29uc29sZSBlcnJvcnNcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG5cbiAgdmFyIGVycm9yID0gZnVuY3Rpb24gZXJyb3IobWVzc2FnZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJcIi5jb25jYXQoY29uc29sZVByZWZpeCwgXCIgXCIpLmNvbmNhdChtZXNzYWdlKSk7XG4gIH07XG4gIC8qKlxuICAgKiBQcml2YXRlIGdsb2JhbCBzdGF0ZSBmb3IgYHdhcm5PbmNlYFxuICAgKiBAdHlwZSB7QXJyYXl9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIHZhciBwcmV2aW91c1dhcm5PbmNlTWVzc2FnZXMgPSBbXTtcbiAgLyoqXG4gICAqIFNob3cgYSBjb25zb2xlIHdhcm5pbmcsIGJ1dCBvbmx5IGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gc2hvd25cbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG5cbiAgdmFyIHdhcm5PbmNlID0gZnVuY3Rpb24gd2Fybk9uY2UobWVzc2FnZSkge1xuICAgIGlmICghKHByZXZpb3VzV2Fybk9uY2VNZXNzYWdlcy5pbmRleE9mKG1lc3NhZ2UpICE9PSAtMSkpIHtcbiAgICAgIHByZXZpb3VzV2Fybk9uY2VNZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgd2FybihtZXNzYWdlKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBTaG93IGEgb25lLXRpbWUgY29uc29sZSB3YXJuaW5nIGFib3V0IGRlcHJlY2F0ZWQgcGFyYW1zL21ldGhvZHNcbiAgICovXG5cbiAgdmFyIHdhcm5BYm91dERlcHJlY2F0aW9uID0gZnVuY3Rpb24gd2FybkFib3V0RGVwcmVjYXRpb24oZGVwcmVjYXRlZFBhcmFtLCB1c2VJbnN0ZWFkKSB7XG4gICAgd2Fyb
8443k9uY2UoXCJcXFwiXCIuY29uY2F0KGRlcHJlY2F0ZWRQYXJhbSwgXCJcXFwiIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLiBQbGVhc2UgdXNlIFxcXCJcIikuY29uY2F0KHVzZUluc3RlYWQsIFwiXFxcIiBpbnN0ZWFkLlwiKSk7XG4gIH07XG4gIC8qKlxuICAgKiBJZiBgYXJnYCBpcyBhIGZ1bmN0aW9uLCBjYWxsIGl0ICh3aXRoIG5vIGFyZ3VtZW50cyBvciBjb250ZXh0KSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuXG4gICAqIE90aGVyd2lzZSwganVzdCBwYXNzIHRoZSB2YWx1ZSB0aHJvdWdoXG4gICAqIEBwYXJhbSBhcmdcbiAgICovXG5cbiAgdmFyIGNhbGxJZkZ1bmN0aW9uID0gZnVuY3Rpb24gY2FsbElmRnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbicgPyBhcmcoKSA6IGFyZztcbiAgfTtcbiAgdmFyIGhhc1RvUHJvbWlzZUZuID0gZnVuY3Rpb24gaGFzVG9Qcm9taXNlRm4oYXJnKSB7XG4gICAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnLnRvUHJvbWlzZSA9PT0gJ2Z1bmN0aW9uJztcbiAgfTtcbiAgdmFyIGFzUHJvbWlzZSA9IGZ1bmN0aW9uIGFzUHJvbWlzZShhcmcpIHtcbiAgICByZXR1cm4gaGFzVG9Qcm9taXNlRm4oYXJnKSA/IGFyZy50b1Byb21pc2UoKSA6IFByb21pc2UucmVzb2x2ZShhcmcpO1xuICB9O1xuICB2YXIgaXNQcm9taXNlID0gZnVuY3Rpb24gaXNQcm9taXNlKGFyZykge1xuICAgIHJldHVybiBhcmcgJiYgUHJvbWlzZS5yZXNvbHZlKGFyZykgPT09IGFyZztcbiAgfTtcblxuICB2YXIgRGlzbWlzc1JlYXNvbiA9IE9iamVjdC5mcmVlemUoe1xuICAgIGNhbmNlbDogJ2NhbmNlbCcsXG4gICAgYmFja2Ryb3A6ICdiYWNrZHJvcCcsXG4gICAgY2xvc2U6ICdjbG9zZScsXG4gICAgZXNjOiAnZXNjJyxcbiAgICB0aW1lcjogJ3RpbWVyJ1xuICB9KTtcblxuICB2YXIgaXNKcXVlcnlFbGVtZW50ID0gZnVuY3Rpb24gaXNKcXVlcnlFbGVtZW50KGVsZW0pIHtcbiAgICByZXR1cm4gX3R5cGVvZihlbGVtKSA9PT0gJ29iamVjdCcgJiYgZWxlbS5qcXVlcnk7XG4gIH07XG5cbiAgdmFyIGlzRWxlbWVudCA9IGZ1bmN0aW9uIGlzRWxlbWVudChlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0gaW5zdGFuY2VvZiBFbGVtZW50IHx8IGlzSnF1ZXJ5RWxlbWVudChlbGVtKTtcbiAgfTtcblxuICB2YXIgYXJnc1RvUGFyYW1zID0gZnVuY3Rpb24gYXJnc1RvUGFyYW1zKGFyZ3MpIHtcbiAgICB2YXIgcGFyYW1zID0ge307XG5cbiAgICBpZiAoX3R5cGVvZihhcmdzWzBdKSA9PT0gJ29iamVjdCcgJiYgIWlzRWxlbWVudChhcmdzWzBdKSkge1xuICAgICAgX2V4dGVuZHMocGFyYW1zLCBhcmdzWzBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgWyd0aXRsZScsICdodG1sJywgJ2ljb24nXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lLCBpbmRleCkge1xuICAgICAgICB2Y
8443XIgYXJnID0gYXJnc1tpbmRleF07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8IGlzRWxlbWVudChhcmcpKSB7XG4gICAgICAgICAgcGFyYW1zW25hbWVdID0gYXJnO1xuICAgICAgICB9IGVsc2UgaWYgKGFyZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZXJyb3IoXCJVbmV4cGVjdGVkIHR5cGUgb2YgXCIuY29uY2F0KG5hbWUsIFwiISBFeHBlY3RlZCBcXFwic3RyaW5nXFxcIiBvciBcXFwiRWxlbWVudFxcXCIsIGdvdCBcIikuY29uY2F0KF90eXBlb2YoYXJnKSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9O1xuXG4gIHZhciBzd2FsUHJlZml4ID0gJ3N3YWwyLSc7XG4gIHZhciBwcmVmaXggPSBmdW5jdGlvbiBwcmVmaXgoaXRlbXMpIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG5cbiAgICBmb3IgKHZhciBpIGluIGl0ZW1zKSB7XG4gICAgICByZXN1bHRbaXRlbXNbaV1dID0gc3dhbFByZWZpeCArIGl0ZW1zW2ldO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHZhciBzd2FsQ2xhc3NlcyA9IHByZWZpeChbJ2NvbnRhaW5lcicsICdzaG93bicsICdoZWlnaHQtYXV0bycsICdpb3NmaXgnLCAncG9wdXAnLCAnbW9kYWwnLCAnbm8tYmFja2Ryb3AnLCAnbm8tdHJhbnNpdGlvbicsICd0b2FzdCcsICd0b2FzdC1zaG93bicsICd0b2FzdC1jb2x1bW4nLCAnc2hvdycsICdoaWRlJywgJ2Nsb3NlJywgJ3RpdGxlJywgJ2hlYWRlcicsICdjb250ZW50JywgJ2h0bWwtY29udGFpbmVyJywgJ2FjdGlvbnMnLCAnY29uZmlybScsICdkZW55JywgJ2NhbmNlbCcsICdmb290ZXInLCAnaWNvbicsICdpY29uLWNvbnRlbnQnLCAnaW1hZ2UnLCAnaW5wdXQnLCAnZmlsZScsICdyYW5nZScsICdzZWxlY3QnLCAncmFkaW8nLCAnY2hlY2tib3gnLCAnbGFiZWwnLCAndGV4dGFyZWEnLCAnaW5wdXRlcnJvcicsICdpbnB1dC1sYWJlbCcsICd2YWxpZGF0aW9uLW1lc3NhZ2UnLCAncHJvZ3Jlc3Mtc3RlcHMnLCAnYWN0aXZlLXByb2dyZXNzLXN0ZXAnLCAncHJvZ3Jlc3Mtc3RlcCcsICdwcm9ncmVzcy1zdGVwLWxpbmUnLCAnbG9hZGVyJywgJ2xvYWRpbmcnLCAnc3R5bGVkJywgJ3RvcCcsICd0b3Atc3RhcnQnLCAndG9wLWVuZCcsICd0b3AtbGVmdCcsICd0b3AtcmlnaHQnLCAnY2VudGVyJywgJ2NlbnRlci1zdGFydCcsICdjZW50ZXItZW5kJywgJ2NlbnRlci1sZWZ0JywgJ2NlbnRlci1yaWdodCcsICdib3R0b20nLCAnYm90dG9tLXN0YXJ0JywgJ2JvdHRvbS1lbmQnLCAnYm90dG9tLWxlZnQnLCAnYm90dG9tLXJpZ2h0JywgJ2dyb3ctcm93JywgJ2dyb3ctY29sdW1uJywgJ2dyb3ctZnVsbHNjcmVlbicsICdydGwnLCAndGltZXItcHJvZ3Jlc3MtYmFyJywgJ3RpbWVyLXByb2dyZXNzLWJhci1jb250YWluZXInLCAnc2Nyb2xsYmFyLW1lYXN1cmUnLCAnaWNvbi1zdWNjZXNzJywgJ2ljb24td2FybmluZycsICdpY29uLWluZm8nLCAnaWNvbi1xdWVzdGlvbicsICdpY29uLWVycm9yJ10pO1xuICB2YXIgaWNvblR5cGVzID0gcHJlZml4KFsnc3VjY2VzcycsICd3YXJuaW5nJywgJ2luZm8nLCAncXVlc3Rpb24nLCAnZXJyb3InXSk7XG5cbiAgdmFyIGdldENvbnRhaW5lciA9IGZ1bmN0aW9uIGdldENvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChzd2FsQ2xhc3Nlcy5jb250YWluZXIpKTtcbiAgfTtcbiAgdmFyIGVsZW1lbnRCeVNlbGVjdG9yID0gZnVuY3Rpb24gZWxlbWVudEJ5U2VsZWN0b3Ioc2VsZWN0b3JTdHJpbmcpIHtcbiAgICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7XG4gICAgcmV0dXJuIGNvbnRhaW5lciA/IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yU3RyaW5nKSA6IG51bGw7XG4gIH07XG5cbiAgdmFyIGVsZW1lbnRCeUNsYXNzID0gZnVuY3Rpb24gZWxlbWVudEJ5Q2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRCeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChjbGFzc05hbWUpKTtcbiAgfTtcblxuICB2YXIgZ2V0UG9wdXAgPSBmdW5jdGlvbiBnZXRQb3B1cCgpIHtcbiAgICByZXR1cm4gZWxlbWVudEJ5Q2xhc3Moc3dhbENsYXNzZXMucG9wdXApO1xuICB9O1xuICB2YXIgZ2V0SWNvbnMgPSBmdW5jdGlvbiBnZXRJY29ucygpIHtcbiAgICB2YXIgcG9wdXAgPSBnZXRQb3B1cCgpO1xuICAgIHJldHVybiB0b0FycmF5KHBvcHVwLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuXCIuY29uY2F0KHN3YWxDbGFzc2VzLmljb24pKSk7XG4gIH07XG4gIHZhciBnZXRJY29uID0gZnVuY3Rpb24gZ2V0SWNvbigpIHtcbiAgICB2YXIgdmlzaWJsZUljb24gPSBnZXRJY29ucygpLmZpbHRlcihmdW5jdGlvbiAoaWNvbikge1xuICAgICAgcmV0dXJuIGlzVmlzaWJsZShpY29uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmlzaWJsZUljb24ubGVuZ3RoID8gdmlzaWJsZUljb25bMF0gOiBudWxsO1xuICB9O1xuICB2YXIgZ2V0VGl0bGUgPSBmdW5jdGlvbiBnZXRUaXRsZSgpIHtcbiAgICByZXR1cm4gZWxlbWVudEJ5Q2xhc3Moc3dhbENsYXNzZXMudGl0bGUpO1xuICB9O1xuICB2YXIgZ2V0Q29udGVudCA9IGZ1bmN0aW9uIGdldENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzLmNvbnRlbnQpO1xuICB9O1xuICB2YXIgZ2V0SHRtbENvbnRhaW5lciA9IGZ1bmN0aW9uIGdldEh0bWxDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzWy
8443dodG1sLWNvbnRhaW5lciddKTtcbiAgfTtcbiAgdmFyIGdldEltYWdlID0gZnVuY3Rpb24gZ2V0SW1hZ2UoKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzLmltYWdlKTtcbiAgfTtcbiAgdmFyIGdldFByb2dyZXNzU3RlcHMgPSBmdW5jdGlvbiBnZXRQcm9ncmVzc1N0ZXBzKCkge1xuICAgIHJldHVybiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlc1sncHJvZ3Jlc3Mtc3RlcHMnXSk7XG4gIH07XG4gIHZhciBnZXRWYWxpZGF0aW9uTWVzc2FnZSA9IGZ1bmN0aW9uIGdldFZhbGlkYXRpb25NZXNzYWdlKCkge1xuICAgIHJldHVybiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlc1sndmFsaWRhdGlvbi1tZXNzYWdlJ10pO1xuICB9O1xuICB2YXIgZ2V0Q29uZmlybUJ1dHRvbiA9IGZ1bmN0aW9uIGdldENvbmZpcm1CdXR0b24oKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRCeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChzd2FsQ2xhc3Nlcy5hY3Rpb25zLCBcIiAuXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5jb25maXJtKSk7XG4gIH07XG4gIHZhciBnZXREZW55QnV0dG9uID0gZnVuY3Rpb24gZ2V0RGVueUJ1dHRvbigpIHtcbiAgICByZXR1cm4gZWxlbWVudEJ5U2VsZWN0b3IoXCIuXCIuY29uY2F0KHN3YWxDbGFzc2VzLmFjdGlvbnMsIFwiIC5cIikuY29uY2F0KHN3YWxDbGFzc2VzLmRlbnkpKTtcbiAgfTtcbiAgdmFyIGdldElucHV0TGFiZWwgPSBmdW5jdGlvbiBnZXRJbnB1dExhYmVsKCkge1xuICAgIHJldHVybiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlc1snaW5wdXQtbGFiZWwnXSk7XG4gIH07XG4gIHZhciBnZXRMb2FkZXIgPSBmdW5jdGlvbiBnZXRMb2FkZXIoKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRCeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChzd2FsQ2xhc3Nlcy5sb2FkZXIpKTtcbiAgfTtcbiAgdmFyIGdldENhbmNlbEJ1dHRvbiA9IGZ1bmN0aW9uIGdldENhbmNlbEJ1dHRvbigpIHtcbiAgICByZXR1cm4gZWxlbWVudEJ5U2VsZWN0b3IoXCIuXCIuY29uY2F0KHN3YWxDbGFzc2VzLmFjdGlvbnMsIFwiIC5cIikuY29uY2F0KHN3YWxDbGFzc2VzLmNhbmNlbCkpO1xuICB9O1xuICB2YXIgZ2V0QWN0aW9ucyA9IGZ1bmN0aW9uIGdldEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzLmFjdGlvbnMpO1xuICB9O1xuICB2YXIgZ2V0SGVhZGVyID0gZnVuY3Rpb24gZ2V0SGVhZGVyKCkge1xuICAgIHJldHVybiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlcy5oZWFkZXIpO1xuICB9O1xuICB2YXIgZ2V0Rm9vdGVyID0gZnVuY3Rpb24gZ2V0Rm9vdGVyKCkge1xuICAgIHJldHVybiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlcy5mb290ZXIpO1xuICB9O1xuICB2YXIgZ2V0VGltZXJQcm9ncmVzc0JhciA9IGZ1bmN0aW9uIGdldFRpbWVyUHJvZ3Jlc3NCYXIoKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzWy
8443d0aW1lci1wcm9ncmVzcy1iYXInXSk7XG4gIH07XG4gIHZhciBnZXRDbG9zZUJ1dHRvbiA9IGZ1bmN0aW9uIGdldENsb3NlQnV0dG9uKCkge1xuICAgIHJldHVybiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlcy5jbG9zZSk7XG4gIH07IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qa3VwL2ZvY3VzYWJsZS9ibG9iL21hc3Rlci9pbmRleC5qc1xuXG4gIHZhciBmb2N1c2FibGUgPSBcIlxcbiAgYVtocmVmXSxcXG4gIGFyZWFbaHJlZl0sXFxuICBpbnB1dDpub3QoW2Rpc2FibGVkXSksXFxuICBzZWxlY3Q6bm90KFtkaXNhYmxlZF0pLFxcbiAgdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLFxcbiAgYnV0dG9uOm5vdChbZGlzYWJsZWRdKSxcXG4gIGlmcmFtZSxcXG4gIG9iamVjdCxcXG4gIGVtYmVkLFxcbiAgW3RhYmluZGV4PVxcXCIwXFxcIl0sXFxuICBbY29udGVudGVkaXRhYmxlXSxcXG4gIGF1ZGlvW2NvbnRyb2xzXSxcXG4gIHZpZGVvW2NvbnRyb2xzXSxcXG4gIHN1bW1hcnlcXG5cIjtcbiAgdmFyIGdldEZvY3VzYWJsZUVsZW1lbnRzID0gZnVuY3Rpb24gZ2V0Rm9jdXNhYmxlRWxlbWVudHMoKSB7XG4gICAgdmFyIGZvY3VzYWJsZUVsZW1lbnRzV2l0aFRhYmluZGV4ID0gdG9BcnJheShnZXRQb3B1cCgpLnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0YWJpbmRleF06bm90KFt0YWJpbmRleD1cIi0xXCJdKTpub3QoW3RhYmluZGV4PVwiMFwiXSknKSkgLy8gc29ydCBhY2NvcmRpbmcgdG8gdGFiaW5kZXhcbiAgICAuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgYSA9IHBhcnNlSW50KGEuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpKTtcbiAgICAgIGIgPSBwYXJzZUludChiLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSk7XG5cbiAgICAgIGlmIChhID4gYikge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSBpZiAoYSA8IGIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcbiAgICB2YXIgb3RoZXJGb2N1c2FibGVFbGVtZW50cyA9IHRvQXJyYXkoZ2V0UG9wdXAoKS5xdWVyeVNlbGVjdG9yQWxsKGZvY3VzYWJsZSkpLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcbiAgICAgIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JykgIT09ICctMSc7XG4gICAgfSk7XG4gICAgcmV0dXJuIHVuaXF1ZUFycmF5KGZvY3VzYWJsZUVsZW1lbnRzV2l0aFRhYmluZGV4LmNvbmNhdChvdGhlckZvY3VzYWJsZUVsZW1lbnRzKSkuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuICAgICAgcmV0dXJuIGlzVmlzaWJsZShlbCk7XG4gICAgfSk7XG4gIH07XG4gIHZhciBpc01vZGFsID0gZnVuY3Rpb24gaXNNb2RhbCgpIHtcbiAgICByZXR1cm4gIWlzVG9hc3QoKSAmJiAhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoc3dhbENsYXNzZXNbJ25vLWJhY2tkcm9wJ10pO1xuICB9O1xuICB2YXIgaXNUb2FzdCA9IGZ1bmN0aW9uIGlzVG9hc3QoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKHN3YWxDbGFzc2VzWy
8443d0b2FzdC1zaG93biddKTtcbiAgfTtcbiAgdmFyIGlzTG9hZGluZyA9IGZ1bmN0aW9uIGlzTG9hZGluZygpIHtcbiAgICByZXR1cm4gZ2V0UG9wdXAoKS5oYXNBdHRyaWJ1dGUoJ2RhdGEtbG9hZGluZycpO1xuICB9O1xuXG4gIHZhciBzdGF0ZXMgPSB7XG4gICAgcHJldmlvdXNCb2R5UGFkZGluZzogbnVsbFxuICB9O1xuICB2YXIgc2V0SW5uZXJIdG1sID0gZnVuY3Rpb24gc2V0SW5uZXJIdG1sKGVsZW0sIGh0bWwpIHtcbiAgICAvLyAjMTkyNlxuICAgIGVsZW0udGV4dENvbnRlbnQgPSAnJztcblxuICAgIGlmIChodG1sKSB7XG4gICAgICB2YXIgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgdmFyIHBhcnNlZCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaHRtbCwgXCJ0ZXh0L2h0bWxcIik7XG4gICAgICB0b0FycmF5KHBhcnNlZC5xdWVyeVNlbGVjdG9yKCdoZWFkJykuY2hpbGROb2RlcykuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgZWxlbS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICB9KTtcbiAgICAgIHRvQXJyYXkocGFyc2VkLnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5jaGlsZE5vZGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBlbGVtLmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgdmFyIGhhc0NsYXNzID0gZnVuY3Rpb24gaGFzQ2xhc3MoZWxlbSwgY2xhc3NOYW1lKSB7XG4gICAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgY2xhc3NMaXN0ID0gY2xhc3NOYW1lLnNwbGl0KC9cXHMrLyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsYXNzTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFlbGVtLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc0xpc3RbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICB2YXIgcmVtb3ZlQ3VzdG9tQ2xhc3NlcyA9IGZ1bmN0aW9uIHJlbW92ZUN1c3RvbUNsYXNzZXMoZWxlbSwgcGFyYW1zKSB7XG4gICAgdG9BcnJheShlbGVtLmNsYXNzTGlzdCkuZm9yRWFjaChmdW5jdGlvbiAoY2xhc3NOYW1lKSB7XG4gICAgICBpZiAoIShvYmplY3RWYWx1ZXMoc3dhbENsYXNzZXMpLmluZGV4T2YoY2xhc3NOYW1lKSAhPT0gLTEpICYmICEob2JqZWN0VmFsdWVzKGljb25UeXBlcykuaW5kZXhPZihjbGFzc05hbWUpICE9PSAtMSkgJiYgIShvYmplY3RWYWx1ZXMocGFyYW1zLnNob3dDbGFzcykuaW5kZXhPZihjbGFzc05hbWUpICE9PSAtMSkpIHtcbiAgICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGFwcGx5Q3VzdG9tQ2xhc3MgPSBmdW5jdGlvbiBhcHBseUN1c3RvbUNsYXNzKGVsZW0sIHBhcmFtcywgY2xhc3NOYW1lKSB7XG4gICAgcmVtb3ZlQ3VzdG9tQ2xhc3NlcyhlbGVtLCBwYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5jdXN0b21DbGFzcyAmJiBwYXJhbXMuY3VzdG9tQ2xhc3NbY2xhc3NOYW1lXSkge1xuICAgICAgaWYgKHR5cGVvZiBwYXJhbXMuY3VzdG9tQ2xhc3NbY2xhc3NOYW1lXSAhPT0gJ3N0cmluZycgJiYgIXBhcmFtcy5jdXN0b21DbGFzc1tjbGFzc05hbWVdLmZvckVhY2gpIHtcbiAgICAgICAgcmV0dXJuIHdhcm4oXCJJbnZhbGlkIHR5cGUgb2YgY3VzdG9tQ2xhc3MuXCIuY29uY2F0KGNsYXNzTmFtZSwgXCIhIEV4cGVjdGVkIHN0cmluZyBvciBpdGVyYWJsZSBvYmplY3QsIGdvdCBcXFwiXCIpLmNvbmNhdChfdHlwZW9mKHBhcmFtcy5jdXN0b21DbGFzc1tjbGFzc05hbWVdKSwgXCJcXFwiXCIpKTtcbiAgICAgIH1cblxuICAgICAgYWRkQ2xhc3MoZWxlbSwgcGFyYW1zLmN1c3RvbUNsYXNzW2NsYXNzTmFtZV0pO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gZ2V0SW5wdXQoY29udGVudCwgaW5wdXRUeXBlKSB7XG4gICAgaWYgKCFpbnB1dFR5cGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN3aXRjaCAoaW5wdXRUeXBlKSB7XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgY2FzZSAnZmlsZSc6XG4gICAgICAgIHJldHVybiBnZXRDaGlsZEJ5Q2xhc3MoY29udGVudCwgc3dhbENsYXNzZXNbaW5wdXRUeXBlXSk7XG5cbiAgICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQucXVlcnlTZWxlY3RvcihcIi5cIi5jb25jYXQoc3dhbENsYXNzZXMuY2hlY2tib3gsIFwiIGlucHV0XCIpKTtcblxuICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICByZXR1cm4gY29udGVudC5xdWVyeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChzd2FsQ2xhc3Nlcy5yYWRpbywgXCIgaW5wdXQ6Y2hlY2tlZFwiKSkgfHwgY29udGVudC5xdWVyeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChzd2FsQ2xhc3Nlcy5yYWRpbywgXCIgaW5wdXQ6Zmlyc3QtY2hpbGRcIikpO1xuXG4gICAgICBjYXNlICdyYW5nZSc6XG4gICAgICAgIHJldHVybiBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIuY29uY2F0KHN3YWxDbGFzc2VzLnJhbmdlLCBcIiBpbnB1dFwiKSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBnZXRDaGlsZEJ5Q2xhc3MoY29udGVudCwgc3dhbENsYXNzZXMuaW5wdXQpO1xuICAgIH1cbiAgfVxuICB2YXIgZm9jdXNJbnB1dCA9IGZ1bmN0aW9uIGZvY3VzSW5wdXQoaW5wdXQpIHtcbiAgICBpbnB1dC5mb2N1cygpOyAvLyBwbGFjZSBjdXJzb3IgYXQgZW5kIG9mIHRleHQgaW4gdGV4dCBpbnB1dFxuXG4gICAgaWYgKGlucHV0LnR5cGUgIT09ICdmaWxlJykge1xuICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjM0NTkxNVxuICAgICAgdmFyIHZhbCA9IGlucHV0LnZhbHVlO1xuICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICAgIGlucHV0LnZhbHVlID0gdmFsO1xuICAgIH1cbiAgfTtcbiAgdmFyIHRvZ2dsZUNsYXNzID0gZnVuY3Rpb24gdG9nZ2xlQ2xhc3ModGFyZ2V0LCBjbGFzc0xpc3QsIGNvbmRpdGlvbikge1xuICAgIGlmICghdGFyZ2V0IHx8ICFjbGFzc0xpc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNsYXNzTGlzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNsYXNzTGlzdCA9IGNsYXNzTGlzdC5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKTtcbiAgICB9XG5cbiAgICBjbGFzc0xpc3QuZm9yRWFjaChmdW5jdGlvbiAoY2xhc3NOYW1lKSB7XG4gICAgICBpZiAodGFyZ2V0LmZvckVhY2gpIHtcbiAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgICAgICBjb25kaXRpb24gPyBlbGVtLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKSA6IGVsZW0uY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbmRpdGlvbiA/IHRhcmdldC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSkgOiB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICB2YXIgYWRkQ2xhc3MgPSBmdW5jdGlvbiBhZGRDbGFzcyh0YXJnZXQsIGNsYXNzTGlzdCkge1xuICAgIHRvZ2dsZUNsYXNzKHRhcmdldCwgY2xhc3NMaXN0LCB0cnVlKTtcbiAgfTtcbiAgdmFyIHJlbW92ZUNsYXNzID0gZnVuY3Rpb24gcmVtb3ZlQ2xhc3ModGFyZ2V0LCBjbGFzc0xpc3QpIHtcbiAgICB0b2dnbGVDbGFzcyh0YXJnZXQsIGNsYXNzTGlzdCwgZmFsc2UpO1xuICB9O1xuICB2YXIgZ2V0Q2hpbGRCeUNsYXNzID0gZnVuY3Rpb24gZ2V0Q2hpbGRCeUNsYXNzKGVsZW0sIGNsYXNzTmFtZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGFzQ2xhc3MoZWxlbS5jaGlsZE5vZGVzW2ldLCBjbGFzc05hbWUpKSB7XG4gICAgICAgI
8443HJldHVybiBlbGVtLmNoaWxkTm9kZXNbaV07XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgYXBwbHlOdW1lcmljYWxTdHlsZSA9IGZ1bmN0aW9uIGFwcGx5TnVtZXJpY2FsU3R5bGUoZWxlbSwgcHJvcGVydHksIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiLmNvbmNhdChwYXJzZUludCh2YWx1ZSkpKSB7XG4gICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgfHwgcGFyc2VJbnQodmFsdWUpID09PSAwKSB7XG4gICAgICBlbGVtLnN0eWxlW3Byb3BlcnR5XSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyBcIlwiLmNvbmNhdCh2YWx1ZSwgXCJweFwiKSA6IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtLnN0eWxlLnJlbW92ZVByb3BlcnR5KHByb3BlcnR5KTtcbiAgICB9XG4gIH07XG4gIHZhciBzaG93ID0gZnVuY3Rpb24gc2hvdyhlbGVtKSB7XG4gICAgdmFyIGRpc3BsYXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICdmbGV4JztcbiAgICBlbGVtLnN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5O1xuICB9O1xuICB2YXIgaGlkZSA9IGZ1bmN0aW9uIGhpZGUoZWxlbSkge1xuICAgIGVsZW0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfTtcbiAgdmFyIHNldFN0eWxlID0gZnVuY3Rpb24gc2V0U3R5bGUocGFyZW50LCBzZWxlY3RvciwgcHJvcGVydHksIHZhbHVlKSB7XG4gICAgdmFyIGVsID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuXG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5zdHlsZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICB9XG4gIH07XG4gIHZhciB0b2dnbGUgPSBmdW5jdGlvbiB0b2dnbGUoZWxlbSwgY29uZGl0aW9uLCBkaXNwbGF5KSB7XG4gICAgY29uZGl0aW9uID8gc2hvdyhlbGVtLCBkaXNwbGF5KSA6IGhpZGUoZWxlbSk7XG4gIH07IC8vIGJvcnJvd2VkIGZyb20ganF1ZXJ5ICQoZWxlbSkuaXMoJzp2aXNpYmxlJykgaW1wbGVtZW50YXRpb25cblxuICB2YXIgaXNWaXNpYmxlID0gZnVuY3Rpb24gaXNWaXNpYmxlKGVsZW0pIHtcbiAgICByZXR1cm4gISEoZWxlbSAmJiAoZWxlbS5vZmZzZXRXaWR0aCB8fCBlbGVtLm9mZnNldEhlaWdodCB8fCBlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoKSk7XG4gIH07XG4gIHZhciBhbGxCdXR0b25zQXJlSGlkZGVuID0gZnVuY3Rpb24gYWxsQnV0dG9uc0FyZUhpZGRlbigpIHtcbiAgICByZXR1cm4gIWlzVmlzaWJsZShnZXRDb25maXJtQnV0dG9uKCkpICYmICFpc1Zpc2libGUoZ2V0RGVueUJ1dHRvbigpKSAmJiAhaXNWaXNpYmxlKGdldENhbmNlbEJ1dHRvbigpKTtcbiAgfTtcbiAgdmFyIGlzU2Nyb2xsYWJsZSA9IGZ1bmN0aW9uIGlzU2Nyb2xsYWJsZShlbGVtKSB7XG4gICAgcmV0dXJuICEhKGVsZW0uc2Nyb2xsSGVpZ2h0ID4gZWxlbS5jbGllbnRIZWlnaHQpO1xuICB9OyAvLyBib3Jyb3dlZCBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NjM1MjExOVxuXG4gIHZhciBoYXNDc3NBbmltYXRpb24gPSBmdW5jdGlvbiBoYXNDc3NBbmltYXRpb24oZWxlbSkge1xuICAgIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xuICAgIHZhciBhbmltRHVyYXRpb24gPSBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2FuaW1hdGlvbi1kdXJhdGlvbicpIHx8ICcwJyk7XG4gICAgdmFyIHRyYW5zRHVyYXRpb24gPSBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3RyYW5zaXRpb24tZHVyYXRpb24nKSB8fCAnMCcpO1xuICAgIHJldHVybiBhbmltRHVyYXRpb24gPiAwIHx8IHRyYW5zRHVyYXRpb24gPiAwO1xuICB9O1xuICB2YXIgY29udGFpbnMgPSBmdW5jdGlvbiBjb250YWlucyhoYXlzdGFjaywgbmVlZGxlKSB7XG4gICAgaWYgKHR5cGVvZiBoYXlzdGFjay5jb250YWlucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGhheXN0YWNrLmNvbnRhaW5zKG5lZWRsZSk7XG4gICAgfVxuICB9O1xuICB2YXIgYW5pbWF0ZVRpbWVyUHJvZ3Jlc3NCYXIgPSBmdW5jdGlvbiBhbmltYXRlVGltZXJQcm9ncmVzc0Jhcih0aW1lcikge1xuICAgIHZhciByZXNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgdmFyIHRpbWVyUHJvZ3Jlc3NCYXIgPSBnZXRUaW1lclByb2dyZXNzQmFyKCk7XG5cbiAgICBpZiAoaXNWaXNpYmxlKHRpbWVyUHJvZ3Jlc3NCYXIpKSB7XG4gICAgICBpZiAocmVzZXQpIHtcbiAgICAgICAgdGltZXJQcm9ncmVzc0Jhci5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuICAgICAgICB0aW1lclByb2dyZXNzQmFyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgfVxuXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGltZXJQcm9ncmVzc0Jhci5zdHlsZS50cmFuc2l0aW9uID0gXCJ3aWR0aCBcIi5jb25jYXQodGltZXIgLyAxMDAwLCBcInMgbGluZWFyXCIpO1xuICAgICAgICB0aW1lclByb2dyZXNzQmFyLnN0eWxlLndpZHRoID0gJzAlJztcbiAgICAgIH0sIDEwKTtcbiAgICB9XG4gIH07XG4gIHZhciBzdG9wVGltZXJQcm9ncmVzc0JhciA9IGZ1bmN0aW9uIHN0b3BUaW1lclByb2dyZXNzQmFyKCkge1xuICAgIHZhciB0aW1lclByb2dyZXNzQmFyID0gZ2V0VGltZXJQcm9ncmVzc0JhcigpO1xuICAgIHZhciB0aW1lclByb2dyZXNzQmFyV2lkdGggPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aW1lclByb2dyZXNzQmFyKS53aWR0aCk7XG4gICAgdGltZXJQcm9ncmVzc0Jhci5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgndHJhbnNpdGlvbicpO1xuICAgIHRpbWVyUHJvZ3Jlc3NCYXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgdmFyIHRpbWVyUHJvZ3Jlc3NCYXJGdWxsV2lkdGggPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aW1lclByb2dyZXNzQmFyKS53aWR0aCk7XG4gICAgdmFyIHRpbWVyUHJvZ3Jlc3NCYXJQZXJjZW50ID0gcGFyc2VJbnQodGltZXJQcm9ncmVzc0JhcldpZHRoIC8gdGltZXJQcm9ncmVzc0JhckZ1bGxXaWR0aCAqIDEwMCk7XG4gICAgdGltZXJQcm9ncmVzc0Jhci5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgndHJhbnNpdGlvbic
8443pO1xuICAgIHRpbWVyUHJvZ3Jlc3NCYXIuc3R5bGUud2lkdGggPSBcIlwiLmNvbmNhdCh0aW1lclByb2dyZXNzQmFyUGVyY2VudCwgXCIlXCIpO1xuICB9O1xuXG4gIC8vIERldGVjdCBOb2RlIGVudlxuICB2YXIgaXNOb2RlRW52ID0gZnVuY3Rpb24gaXNOb2RlRW52KCkge1xuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnO1xuICB9O1xuXG4gIHZhciBzd2VldEhUTUwgPSBcIlxcbiA8ZGl2IGFyaWEtbGFiZWxsZWRieT1cXFwiXCIuY29uY2F0KHN3YWxDbGFzc2VzLnRpdGxlLCBcIlxcXCIgYXJpYS1kZXNjcmliZWRieT1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5jb250ZW50LCBcIlxcXCIgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMucG9wdXAsIFwiXFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiPlxcbiAgIDxkaXYgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMuaGVhZGVyLCBcIlxcXCI+XFxuICAgICA8dWwgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXNbJ3Byb2dyZXNzLXN0ZXBzJ10sIFwiXFxcIj48L3VsPlxcbiAgICAgPGRpdiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5pY29uLCBcIiBcIikuY29uY2F0KGljb25UeXBlcy5lcnJvciwgXCJcXFwiPjwvZGl2PlxcbiAgICAgPGRpdiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5pY29uLCBcIiBcIikuY29uY2F0KGljb25UeXBlcy5xdWVzdGlvbiwgXCJcXFwiPjwvZGl2PlxcbiAgICAgPGRpdiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5pY29uLCBcIiBcIikuY29uY2F0KGljb25UeXBlcy53YXJuaW5nLCBcIlxcXCI+PC9kaXY+XFxuICAgICA8ZGl2IGNsYXNzPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzLmljb24sIFwiIFwiKS5jb25jYXQoaWNvblR5cGVzLmluZm8sIFwiXFxcIj48L2Rpdj5cXG4gICAgIDxkaXYgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMuaWNvbiwgXCIgXCIpLmNvbmNhdChpY29uVHlwZXMuc3VjY2VzcywgXCJcXFwiPjwvZGl2PlxcbiAgICAgPGltZyBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5pbWFnZSwgXCJcXFwiIC8+XFxuICAgICA8aDIgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMudGl0bGUsIFwiXFxcIiBpZD1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy50aXRsZSwgXCJcXFwiPjwvaDI+XFxuICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMuY2xvc2UsIFwiXFxcIj48L2J1dHRvbj5cXG4gICA8L2Rpdj5cXG4gICA8ZGl2IGNsYXNzPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzLmNvbnRlbnQsIFwiXFxcIj5cXG4gICAgIDxkaXYgaWQ9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMuY29udGVudCwgXCJcXFwiIGNsYXNzPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzWy
8443dodG1sLWNvbnRhaW5lciddLCBcIlxcXCI+PC9kaXY+XFxuICAgICA8aW5wdXQgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMuaW5wdXQsIFwiXFxcIiAvPlxcbiAgICAgPGlucHV0IHR5cGU9XFxcImZpbGVcXFwiIGNsYXNzPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzLmZpbGUsIFwiXFxcIiAvPlxcbiAgICAgPGRpdiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5yYW5nZSwgXCJcXFwiPlxcbiAgICAgICA8aW5wdXQgdHlwZT1cXFwicmFuZ2VcXFwiIC8+XFxuICAgICAgIDxvdXRwdXQ+PC9vdXRwdXQ+XFxuICAgICA8L2Rpdj5cXG4gICAgIDxzZWxlY3QgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMuc2VsZWN0LCBcIlxcXCI+PC9zZWxlY3Q+XFxuICAgICA8ZGl2IGNsYXNzPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzLnJhZGlvLCBcIlxcXCI+PC9kaXY+XFxuICAgICA8bGFiZWwgZm9yPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzLmNoZWNrYm94LCBcIlxcXCIgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMuY2hlY2tib3gsIFwiXFxcIj5cXG4gICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiAvPlxcbiAgICAgICA8c3BhbiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5sYWJlbCwgXCJcXFwiPjwvc3Bhbj5cXG4gICAgIDwvbGFiZWw+XFxuICAgICA8dGV4dGFyZWEgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMudGV4dGFyZWEsIFwiXFxcIj48L3RleHRhcmVhPlxcbiAgICAgPGRpdiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlc1sndmFsaWRhdGlvbi1tZXNzYWdlJ10sIFwiXFxcIiBpZD1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlc1sndmFsaWRhdGlvbi1tZXNzYWdlJ10sIFwiXFxcIj48L2Rpdj5cXG4gICA8L2Rpdj5cXG4gICA8ZGl2IGNsYXNzPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzLmFjdGlvbnMsIFwiXFxcIj5cXG4gICAgIDxkaXYgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMubG9hZGVyLCBcIlxcXCI+PC9kaXY+XFxuICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMuY29uZmlybSwgXCJcXFwiPjwvYnV0dG9uPlxcbiAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzLmRlbnksIFwiXFxcIj48L2J1dHRvbj5cXG4gICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5jYW5jZWwsIFwiXFxcIj48L2J1dHRvbj5cXG4gICA8L2Rpdj5cXG4gICA8ZGl2IGNsYXNzPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzLmZvb3RlciwgXCJcXFwiPjwvZGl2PlxcbiAgIDxkaXYgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXNbJ3RpbWVyLXByb2dyZXNzLWJhci1jb250YWluZXInXSwgXCJcXFwiPlxcbiAgICAgPGRpdiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlc1sndGltZXItcHJvZ3Jlc3MtYmFyJ10sIFwiXFxcIj48L2Rpdj5cXG4gICA8L2Rpdj5cXG4gPC9kaXY+XFxuXCIpLnJlcGxhY2UoLyhefFxcbilcXHMqL2csICcnKTtcblxuICB2YXIgcmVzZXRPbGRDb250YWluZXIgPSBmdW5jdGlvbiByZXNldE9sZENvbnRhaW5lcigpIHtcbiAgICB2YXIgb2xkQ29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7XG5cbiAgICBpZiAoIW9sZENvbnRhaW5lcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIG9sZENvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9sZENvbnRhaW5lcik7XG4gICAgcmVtb3ZlQ2xhc3MoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgZG9jdW1lbnQuYm9keV0sIFtzd2FsQ2xhc3Nlc1snbm8tYmFja2Ryb3AnXSwgc3dhbENsYXNzZXNbJ3RvYXN0LXNob3duJ10sIHN3YWxDbGFzc2VzWy
8443doYXMtY29sdW1uJ11dKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICB2YXIgb2xkSW5wdXRWYWw7IC8vIElFMTEgd29ya2Fyb3VuZCwgc2VlICMxMTA5IGZvciBkZXRhaWxzXG5cbiAgdmFyIHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UgPSBmdW5jdGlvbiByZXNldFZhbGlkYXRpb25NZXNzYWdlKGUpIHtcbiAgICBpZiAoU3dhbC5pc1Zpc2libGUoKSAmJiBvbGRJbnB1dFZhbCAhPT0gZS50YXJnZXQudmFsdWUpIHtcbiAgICAgIFN3YWwucmVzZXRWYWxpZGF0aW9uTWVzc2FnZSgpO1xuICAgIH1cblxuICAgIG9sZElucHV0VmFsID0gZS50YXJnZXQudmFsdWU7XG4gIH07XG5cbiAgdmFyIGFkZElucHV0Q2hhbmdlTGlzdGVuZXJzID0gZnVuY3Rpb24gYWRkSW5wdXRDaGFuZ2VMaXN0ZW5lcnMoKSB7XG4gICAgdmFyIGNvbnRlbnQgPSBnZXRDb250ZW50KCk7XG4gICAgdmFyIGlucHV0ID0gZ2V0Q2hpbGRCeUNsYXNzKGNvbnRlbnQsIHN3YWxDbGFzc2VzLmlucHV0KTtcbiAgICB2YXIgZmlsZSA9IGdldENoaWxkQnlDbGFzcyhjb250ZW50LCBzd2FsQ2xhc3Nlcy5maWxlKTtcbiAgICB2YXIgcmFuZ2UgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIuY29uY2F0KHN3YWxDbGFzc2VzLnJhbmdlLCBcIiBpbnB1dFwiKSk7XG4gICAgdmFyIHJhbmdlT3V0cHV0ID0gY29udGVudC5xdWVyeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChzd2FsQ2xhc3Nlcy5yYW5nZSwgXCIgb3V0cHV0XCIpKTtcbiAgICB2YXIgc2VsZWN0ID0gZ2V0Q2hpbGRCeUNsYXNzKGNvbnRlbnQsIHN3YWxDbGFzc2VzLnNlbGVjdCk7XG4gICAgdmFyIGNoZWNrYm94ID0gY29udGVudC5xdWVyeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChzd2FsQ2xhc3Nlcy5jaGVja2JveCwgXCIgaW5wdXRcIikpO1xuICAgIHZhciB0ZXh0YXJlYSA9IGdldENoaWxkQnlDbGFzcyhjb250ZW50LCBzd2FsQ2xhc3Nlcy50ZXh0YXJlYSk7XG4gICAgaW5wdXQub25pbnB1dCA9IHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgZmlsZS5vbmNoYW5nZSA9IHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgc2VsZWN0Lm9uY2hhbmdlID0gcmVzZXRWYWxpZGF0aW9uTWVzc2FnZTtcbiAgICBjaGVja2JveC5vbmNoYW5nZSA9IHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgdGV4dGFyZWEub25pbnB1dCA9IHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2U7XG5cbiAgICByYW5nZS5vbmlucHV0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoZSk7XG4gICAgICByYW5nZU91dHB1dC52YWx1ZSA9IHJhbmdlLnZhbHVlO1xuICAgIH07XG5cbiAgICByYW5nZS5vbmNoYW5nZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXNldFZhbGlkYXRpb25NZXNzYWdlKGUpO1xuICAgICAgcmFuZ2UubmV4dFNpYmxpbmcudmFsdWUgPSByYW5nZS52YWx1ZTtcbiAgICB9O1xuICB9O1xuXG4gIHZhciBnZXRUYXJnZXQgPSBmdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnID8gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpIDogdGFyZ2V0O1xuICB9O1xuXG4gIHZhciBzZXR1cEFjY2Vzc2liaWxpdHkgPSBmdW5jdGlvbiBzZXR1cEFjY2Vzc2liaWxpdHkocGFyYW1zKSB7XG4gICAgdmFyIHBvcHVwID0gZ2V0UG9wdXAoKTtcbiAgICBwb3B1cC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCBwYXJhbXMudG9hc3QgPyAnYWxlcnQnIDogJ2RpYWxvZycpO1xuICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgcGFyYW1zLnRvYXN0ID8gJ3BvbGl0ZScgOiAnYXNzZXJ0aXZlJyk7XG5cbiAgICBpZiAoIXBhcmFtcy50b2FzdCkge1xuICAgICAgcG9wdXAuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgJ3RydWUnKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHNldHVwUlRMID0gZnVuY3Rpb24gc2V0dXBSVEwodGFyZ2V0RWxlbWVudCkge1xuICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXRFbGVtZW50KS5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgICBhZGRDbGFzcyhnZXRDb250YWluZXIoKSwgc3dhbENsYXNzZXMucnRsKTtcbiAgICB9XG4gIH07XG4gIC8qXG4gICAqIEFkZCBtb2RhbCArIGJhY2tkcm9wIHRvIERPTVxuICAgKi9cblxuXG4gIHZhciBpbml0ID0gZnVuY3Rpb24gaW5pdChwYXJhbXMpIHtcbiAgICAvLyBDbGVhbiB1cCB0aGUgb2xkIHBvcHVwIGNvbnRhaW5lciBpZiBpdCBleGlzdHNcbiAgICB2YXIgb2xkQ29udGFpbmVyRXhpc3RlZCA9IHJlc2V0T2xkQ29udGFpbmVyKCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5cbiAgICBpZiAoaXNOb2RlRW52KCkpIHtcbiAgICAgIGVycm9yKCdTd2VldEFsZXJ0MiByZXF1aXJlcyBkb2N1bWVudCB0byBpbml0aWFsaXplJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSBzd2FsQ2xhc3Nlcy5jb250YWluZXI7XG5cbiAgICBpZiAob2xkQ29udGFpbmVyRXhpc3RlZCkge1xuICAgICAgYWRkQ2xhc3MoY29udGFpbmVyLCBzd2FsQ2xhc3Nlc1snbm8tdHJhbnNpdGlvbiddKTtcbiAgICB9XG5cbiAgICBzZXRJbm5lckh0bWwoY29udGFpbmVyLCBzd2VldEhUTUwpO1xuICAgIHZhciB0YXJnZXRFbGVtZW50ID0gZ2V0VGFyZ2V0KHBhcmFtcy50YXJnZXQpO1xuICAgIHRhcmdldEVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgICBzZXR1cEFjY2Vzc2liaWxpdHkocGFyYW1zKTtcbiAgICBzZXR1cFJUTCh0YXJnZXRFbGVtZW50KTtcbiAgICBhZGRJbnB1dENoYW5nZUxpc3RlbmVycygpO1xuICB9O1xuXG4gIHZhciBwYXJzZUh0bWxUb0NvbnRhaW5lciA9IGZ1bmN0aW9uIHBhcnNlSHRtbFRvQ29udGFpbmVyKHBhcmFtLCB0YXJnZXQpIHtcbiAgICAvLyBET00gZWxlbWVudFxuICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICB0YXJnZXQuYXBwZW5kQ2hpbGQocGFyYW0pOyAvLyBPYmplY3RcbiAgICB9IGVsc2UgaWYgKF90eXBlb2YocGFyYW0pID09PSAnb2JqZWN0Jykge1xuICAgICAgaGFuZGxlT2JqZWN0KHBhcmFtLCB0YXJnZXQpOyAvLyBQbGFpbiBzdHJpbmdcbiAgICB9IGVsc2UgaWYgKHBhcmFtKSB7XG4gICAgICBzZXRJbm5lckh0bWwodGFyZ2V0LCBwYXJhbSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVPYmplY3QgPSBmdW5jdGlvbiBoYW5kbGVPYmplY3QocGFyYW0sIHRhcmdldCkge1xuICAgIC8vIEpRdWVyeSBlbGVtZW50KHMpXG4gICAgaWYgKHBhcmFtLmpxdWVyeSkge1xuICAgICAgaGFuZGxlSnF1ZXJ5RWxlbSh0YXJnZXQsIHBhcmFtKTsgLy8gRm9yIG90aGVyIG9iamVjdHMgdXNlIHRoZWlyIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgI
8443H0gZWxzZSB7XG4gICAgICBzZXRJbm5lckh0bWwodGFyZ2V0LCBwYXJhbS50b1N0cmluZygpKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGhhbmRsZUpxdWVyeUVsZW0gPSBmdW5jdGlvbiBoYW5kbGVKcXVlcnlFbGVtKHRhcmdldCwgZWxlbSkge1xuICAgIHRhcmdldC50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgaWYgKDAgaW4gZWxlbSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IChpIGluIGVsZW0pOyBpKyspIHtcbiAgICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKGVsZW1baV0uY2xvbmVOb2RlKHRydWUpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKGVsZW0uY2xvbmVOb2RlKHRydWUpKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGFuaW1hdGlvbkVuZEV2ZW50ID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIFByZXZlbnQgcnVuIGluIE5vZGUgZW52XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXNOb2RlRW52KCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgdGVzdEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdmFyIHRyYW5zRW5kRXZlbnROYW1lcyA9IHtcbiAgICAgIFdlYmtpdEFuaW1hdGlvbjogJ3dlYmtpdEFuaW1hdGlvbkVuZCcsXG4gICAgICBPQW5pbWF0aW9uOiAnb0FuaW1hdGlvbkVuZCBvYW5pbWF0aW9uZW5kJyxcbiAgICAgIGFuaW1hdGlvbjogJ2FuaW1hdGlvbmVuZCdcbiAgICB9O1xuXG4gICAgZm9yICh2YXIgaSBpbiB0cmFuc0VuZEV2ZW50TmFtZXMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodHJhbnNFbmRFdmVudE5hbWVzLCBpKSAmJiB0eXBlb2YgdGVzdEVsLnN0eWxlW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdHJhbnNFbmRFdmVudE5hbWVzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSgpO1xuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9qcy9zcmMvbW9kYWwuanNcblxuICB2YXIgbWVhc3VyZVNjcm9sbGJhciA9IGZ1bmN0aW9uIG1lYXN1cmVTY3JvbGxiYXIoKSB7XG4gICAgdmFyIHNjcm9sbERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHNjcm9sbERpdi5jbGFzc05hbWUgPSBzd2FsQ2xhc3Nlc1snc2Nyb2xsYmFyLW1lYXN1cmUnXTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcm9sbERpdik7XG4gICAgdmFyIHNjcm9sbGJhcldpZHRoID0gc2Nyb2xsRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC0gc2Nyb2xsRGl2LmNsaWVudFdpZHRoO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc2Nyb2xsRGl2KTtcbiAgICByZXR1cm4gc2Nyb2xsYmFyV2lkdGg7XG4gIH07XG5cbiAgdmFyIHJlbmRlckFjdGlvbnMgPSBmdW5jdGlvbiByZW5kZXJBY3Rpb25zKGluc3RhbmNlLCBwYXJhbXMpIHtcbiAgICB2YXIgYWN0aW9ucyA9IGdldEFjdGlvbnMoKTtcbiAgICB2YXIgbG9hZGVyID0gZ2V0TG9hZGVyKCk7XG4gICAgdmFyIGNvbmZpcm1CdXR0b24gPSBnZXRDb25maXJtQnV0dG9uKCk7XG4gICAgdmFyIGRlbnlCdXR0b24gPSBnZXREZW55QnV0dG9uKCk7XG4gICAgdmFyIGNhbmNlbEJ1dHRvbiA9IGdldENhbmNlbEJ1dHRvbigpOyAvLyBBY3Rpb25zIChidXR0b25zKSB3cmFwcGVyXG5cbiAgICBpZiAoIXBhcmFtcy5zaG93Q29uZmlybUJ1dHRvbiAmJiAhcGFyYW1zLnNob3dEZW55QnV0dG9uICYmICFwYXJhbXMuc2hvd0NhbmNlbEJ1dHRvbikge1xuICAgICAgaGlkZShhY3Rpb25zKTtcbiAgICB9IC8vIEN1c3RvbSBjbGFzc1xuXG5cbiAgICBhcHBseUN1c3RvbUNsYXNzKGFjdGlvbnMsIHBhcmFtcywgJ2FjdGlvbnMnKTsgLy8gUmVuZGVyIGJ1dHRvbnNcblxuICAgIHJlbmRlckJ1dHRvbihjb25maXJtQnV0dG9uLCAnY29uZmlybScsIHBhcmFtcyk7XG4gICAgcmVuZGVyQnV0dG9uKGRlbnlCdXR0b24sICdkZW55JywgcGFyYW1zKTtcbiAgICByZW5kZXJCdXR0b24oY2FuY2VsQnV0dG9uLCAnY2FuY2VsJywgcGFyYW1zKTtcbiAgICBoYW5kbGVCdXR0b25zU3R5bGluZyhjb25maXJtQnV0dG9uLCBkZW55QnV0dG9uLCBjYW5jZWxCdXR0b24sIHBhcmFtcyk7XG5cbiAgICBpZiAocGFyYW1zLnJldmVyc2VCdXR0b25zKSB7XG4gICAgICBhY3Rpb25zLmluc2VydEJlZm9yZShjYW5jZWxCdXR0b24sIGxvYWRlcik7XG4gICAgICBhY3Rpb25zLmluc2VydEJlZm9yZShkZW55QnV0dG9uLCBsb2FkZXIpO1xuICAgICAgYWN0aW9ucy5pbnNlcnRCZWZvcmUoY29uZmlybUJ1dHRvbiwgbG9hZGVyKTtcbiAgICB9IC8vIExvYWRlclxuXG5cbiAgICBzZXRJbm5lckh0bWwobG9hZGVyLCBwYXJhbXMubG9hZGVySHRtbCk7XG4gICAgYXBwbHlDdXN0b21DbGFzcyhsb2FkZXIsIHBhcmFtcywgJ2xvYWRlcicpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGhhbmRsZUJ1dHRvbnNTdHlsaW5nKGNvbmZpcm1CdXR0b24sIGRlbnlCdXR0b24sIGNhbmNlbEJ1dHRvbiwgcGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXMuYnV0dG9uc1N0eWxpbmcpIHtcbiAgICAgIHJldHVybiByZW1vdmVDbGFzcyhbY29uZmlybUJ1dHRvbiwgZGVueUJ1dHRvbiwgY2FuY2VsQnV0dG9uXSwgc3dhbENsYXNzZXMuc3R5bGVkKTtcbiAgICB9XG5cbiAgICBhZGRDbGFzcyhbY29uZmlybUJ1dHRvbiwgZGVueUJ1dHRvbiwgY2FuY2VsQnV0dG9uXSwgc3dhbENsYXNzZXMuc3R5bGVkKTsgLy8gQnV0dG9ucyBiYWNrZ3JvdW5kIGNvbG9yc1xuXG4gICAgaWYgKHBhcmFtcy5jb25maXJtQnV0dG9uQ29sb3IpIHtcbiAgICAgIGNvbmZpcm1CdXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gcGFyYW1zLmNvbmZpcm1CdXR0b25Db2xvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmRlbnlCdXR0b25Db2xvcikge1xuICAgICAgZGVueUJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBwYXJhbXMuZGVueUJ1dHRvbkNvbG9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY2FuY2VsQnV0dG9uQ29sb3IpIHtcbiAgICAgIGNhbmNlbEJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5k
8443Q29sb3IgPSBwYXJhbXMuY2FuY2VsQnV0dG9uQ29sb3I7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyQnV0dG9uKGJ1dHRvbiwgYnV0dG9uVHlwZSwgcGFyYW1zKSB7XG4gICAgdG9nZ2xlKGJ1dHRvbiwgcGFyYW1zW1wic2hvd1wiLmNvbmNhdChjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYnV0dG9uVHlwZSksIFwiQnV0dG9uXCIpXSwgJ2lubGluZS1ibG9jaycpO1xuICAgIHNldElubmVySHRtbChidXR0b24sIHBhcmFtc1tcIlwiLmNvbmNhdChidXR0b25UeXBlLCBcIkJ1dHRvblRleHRcIildKTsgLy8gU2V0IGNhcHRpb24gdGV4dFxuXG4gICAgYnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHBhcmFtc1tcIlwiLmNvbmNhdChidXR0b25UeXBlLCBcIkJ1dHRvbkFyaWFMYWJlbFwiKV0pOyAvLyBBUklBIGxhYmVsXG4gICAgLy8gQWRkIGJ1dHRvbnMgY3VzdG9tIGNsYXNzZXNcblxuICAgIGJ1dHRvbi5jbGFzc05hbWUgPSBzd2FsQ2xhc3Nlc1tidXR0b25UeXBlXTtcbiAgICBhcHBseUN1c3RvbUNsYXNzKGJ1dHRvbiwgcGFyYW1zLCBcIlwiLmNvbmNhdChidXR0b25UeXBlLCBcIkJ1dHRvblwiKSk7XG4gICAgYWRkQ2xhc3MoYnV0dG9uLCBwYXJhbXNbXCJcIi5jb25jYXQoYnV0dG9uVHlwZSwgXCJCdXR0b25DbGFzc1wiKV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlQmFja2Ryb3BQYXJhbShjb250YWluZXIsIGJhY2tkcm9wKSB7XG4gICAgaWYgKHR5cGVvZiBiYWNrZHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kID0gYmFja2Ryb3A7XG4gICAgfSBlbHNlIGlmICghYmFja2Ryb3ApIHtcbiAgICAgIGFkZENsYXNzKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGRvY3VtZW50LmJvZHldLCBzd2FsQ2xhc3Nlc1snbm8tYmFja2Ryb3AnXSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlUG9zaXRpb25QYXJhbShjb250YWluZXIsIHBvc2l0aW9uKSB7XG4gICAgaWYgKHBvc2l0aW9uIGluIHN3YWxDbGFzc2VzKSB7XG4gICAgICBhZGRDbGFzcyhjb250YWluZXIsIHN3YWxDbGFzc2VzW3Bvc2l0aW9uXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm4oJ1RoZSBcInBvc2l0aW9uXCIgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZCwgZGVmYXVsdGluZyB0byBcImNlbnRlclwiJyk7XG4gICAgICBhZGRDbGFzcyhjb250YWluZXIsIHN3YWxDbGFzc2VzLmNlbnRlcik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlR3Jvd1BhcmFtKGNvbnRhaW5lciwgZ3Jvdykge1xuICAgIGlmIChncm93ICYmIHR5cGVvZiBncm93ID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIGdyb3dDbGFzcyA9IFwiZ3Jvdy1cIi5jb25jYXQoZ3Jvdyk7XG5cbiAgICAgIGlmIChncm93Q2xhc3MgaW4gc3dhbENsYXNzZXMpIHtcbiAgICAgICAgYWRkQ2xhc3MoY29udGFpbmVyLCBzd2FsQ2xhc3Nlc1tncm93Q2xhc3NdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcmVuZGVyQ29udGFpbmVyID0gZnVuY3Rpb24gcmVuZGVyQ29udGFpbmVyKGluc3RhbmNlLCBwYXJhbXMpIHtcbiAgICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7XG5cbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhhbmRsZUJhY2tkcm9wUGFyYW0oY29udGFpbmVyLCBwYXJhbXMuYmFja2Ryb3ApO1xuXG4gICAgaWYgKCFwYXJhbXMuYmFja2Ryb3AgJiYgcGFyYW1zLmFsbG93T3V0c2lkZUNsaWNrKSB7XG4gICAgICB3YXJuKCdcImFsbG93T3V0c2lkZUNsaWNrXCIgcGFyYW1ldGVyIHJlcXVpcmVzIGBiYWNrZHJvcGAgcGFyYW1ldGVyIHRvIGJlIHNldCB0byBgdHJ1ZWAnKTtcbiAgICB9XG5cbiAgICBoYW5kbGVQb3NpdGlvblBhcmFtKGNvbnRhaW5lciwgcGFyYW1zLnBvc2l0aW9uKTtcbiAgICBoYW5kbGVHcm93UGFyYW0oY29udGFpbmVyLCBwYXJhbXMuZ3Jvdyk7IC8vIEN1c3RvbSBjbGFzc1xuXG4gICAgYXBwbHlDdXN0b21DbGFzcyhjb250YWluZXIsIHBhcmFtcywgJ2NvbnRhaW5lcicpOyAvLyBTZXQgcXVldWUgc3RlcCBhdHRyaWJ1dGUgZm9yIGdldFF1ZXVlU3RlcCgpIG1ldGhvZFxuXG4gICAgdmFyIHF1ZXVlU3RlcCA9IGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCdkYXRhLXN3YWwyLXF1ZXVlLXN0ZXAnKTtcblxuICAgIGlmIChxdWV1ZVN0ZXApIHtcbiAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2RhdGEtcXVldWUtc3RlcCcsIHF1ZXVlU3RlcCk7XG4gICAgICBkb2
8443N1bWVudC5ib2R5LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1zd2FsMi1xdWV1ZS1zdGVwJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIG1vZHVsZSBjb250YWludHMgYFdlYWtNYXBgcyBmb3IgZWFjaCBlZmZlY3RpdmVseS1cInByaXZhdGUgIHByb3BlcnR5XCIgdGhhdCBhIGBTd2FsYCBoYXMuXG4gICAqIEZvciBleGFtcGxlLCB0byBzZXQgdGhlIHByaXZhdGUgcHJvcGVydHkgXCJmb29cIiBvZiBgdGhpc2AgdG8gXCJiYXJcIiwgeW91IGNhbiBgcHJpdmF0ZVByb3BzLmZvby5zZXQodGhpcywgJ2JhcicpYFxuICAgKiBUaGlzIGlzIHRoZSBhcHByb2FjaCB0aGF0IEJhYmVsIHdpbGwgcHJvYmFibHkgdGFrZSB0byBpbXBsZW1lbnQgcHJpdmF0ZSBtZXRob2RzL2ZpZWxkc1xuICAgKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByaXZhdGUtbWV0aG9kc1xuICAgKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJlbC9wdWxsLzc1NTVcbiAgICogT25jZSB3ZSBoYXZlIHRoZSBjaGFuZ2VzIGZyb20gdGhhdCBQUiBpbiBCYWJlbCwgYW5kIG91ciBjb3JlIGNsYXNzIGZpdHMgcmVhc29uYWJsZSBpbiAqb25lIG1vZHVsZSpcbiAgICogICB0aGVuIHdlIGNhbiB1c2UgdGhhdCBsYW5ndWFnZSBmZWF0dXJlLlxuICAgKi9cbiAgdmFyIHByaXZhdGVQcm9wcyA9IHtcbiAgICBwcm9taXNlOiBuZXcgV2Vha01hcCgpLFxuICAgIGlubmVyUGFyYW1zOiBuZXcgV2Vha01hcCgpLFxuICAgIGRvbUNhY2hlOiBuZXcgV2Vha01hcCgpXG4gIH07XG5cbiAgdmFyIGlucHV0VHlwZXMgPSBbJ2lucHV0JywgJ2ZpbGUnLCAncmFuZ2UnLCAnc2VsZWN0JywgJ3JhZGlvJywgJ2NoZWNrYm94JywgJ3RleHRhcmVhJ107XG4gIHZhciByZW5kZXJJbnB1dCA9IGZ1bmN0aW9uIHJlbmRlcklucHV0KGluc3RhbmNlLCBwYXJhbXMpIHtcbiAgICB2YXIgY29udGVudCA9IGdldENvbnRlbnQoKTtcbiAgICB2YXIgaW5uZXJQYXJhbXMgPSBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KGluc3RhbmNlKTtcbiAgICB2YXIgcmVyZW5kZXIgPSAhaW5uZXJQYXJhbXMgfHwgcGFyYW1zLmlucHV0ICE9PSBpbm5lclBhcmFtcy5pbnB1dDtcbiAgICBpbnB1dFR5cGVzLmZvckVhY2goZnVuY3Rpb24gKGlucHV0VHlwZSkge1xuICAgICAgdmFyIGlucHV0Q2xhc3MgPSBzd2FsQ2xhc3Nlc1tpbnB1dFR5cGVdO1xuICAgICAgdmFyIGlucHV0Q29udGFpbmVyID0gZ2V0Q2hpbGRCeUNsYXNzKGNvbnRlbnQsIGlucHV0Q2xhc3MpOyAvLyBzZXQgYXR0cmlidXRlc1xuXG4gICAgICBzZXRBdHRyaWJ1dGVzKGlucHV0VHlwZSwgcGFyYW1zLmlucHV0QXR0cmlidXRlcyk7IC8vIHNldCBjbGFzc1xuXG4gICAgICBpbnB1dENvbnRhaW5lci5jbGFzc05hbWUgPSBpbnB1dENsYXNzO1xuXG4gICAgICBpZiAocmVyZW5kZXIpIHtcbiAgICAgICAgaGlkZShpbnB1dENvbnRhaW5lcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAocGFyYW1zLmlucHV0KSB7XG4gICAgICBpZiAocmVyZW5kZXIpIHtcbiAgICAgICAgc2hvd0lucHV0KHBhcmFtcyk7XG4gICAgICB9IC8vIHNldCBjdXN0b20gY2xhc3NcblxuXG4gICAgICBzZXRDdXN0b21DbGFzcyhwYXJhbXMpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc2hvd0lucHV0ID0gZnVuY3Rpb24gc2hvd0lucHV0KHBhcmFtcykge1xuICAgIGlmICghcmVuZGVySW5wdXRUeXBlW3BhcmFtcy5pbnB1dF0pIHtcbiAgICAgIHJldHVybiBlcnJvcihcIlVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dCEgRXhwZWN0ZWQgXFxcInRleHRcXFwiLCBcXFwiZW1haWxcXFwiLCBcXFwicGFzc3dvcmRcXFwiLCBcXFwibnVtYmVyXFxcIiwgXFxcInRlbFxcXCIsIFxcXCJzZWxlY3RcXFwiLCBcXFwicmFkaW9cXFwiLCBcXFwiY2hlY2tib3hcXFwiLCBcXFwidGV4dGFyZWFcXFwiLCBcXFwiZmlsZVxcXCIgb3IgXFxcInVybFxcXCIsIGdvdCBcXFwiXCIuY29uY2F0KHBhcmFtcy5pbnB1dCwgXCJcXFwiXCIpKTtcbiAgICB9XG5cbiAgICB2YXIgaW5wdXRDb250YWluZXIgPSBnZXRJbnB1dENvbnRhaW5lcihwYXJhbXMuaW5wdXQpO1xuICAgIHZhciBpbnB1dCA9IHJlbmRlcklucHV0VHlwZVtwYXJhbXMuaW5wdXRdKGlucHV0Q29udGFpbmVyLCBwYXJhbXMpO1xuICAgIHNob3coaW5wdXQpOyAvLyBpbnB1dCBhdXRvZm9jdXNcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgZm9jdXNJbnB1dChpbnB1dCk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHJlbW92ZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiByZW1vdmVBdHRyaWJ1dGVzKGlucHV0KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2Y
8443XIgYXR0ck5hbWUgPSBpbnB1dC5hdHRyaWJ1dGVzW2ldLm5hbWU7XG5cbiAgICAgIGlmICghKFsndHlwZScsICd2YWx1ZScsICdzdHlsZSddLmluZGV4T2YoYXR0ck5hbWUpICE9PSAtMSkpIHtcbiAgICAgICAgaW5wdXQucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFyIHNldEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiBzZXRBdHRyaWJ1dGVzKGlucHV0VHlwZSwgaW5wdXRBdHRyaWJ1dGVzKSB7XG4gICAgdmFyIGlucHV0ID0gZ2V0SW5wdXQoZ2V0Q29udGVudCgpLCBpbnB1dFR5cGUpO1xuXG4gICAgaWYgKCFpbnB1dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJlbW92ZUF0dHJpYnV0ZXMoaW5wdXQpO1xuXG4gICAgZm9yICh2YXIgYXR0ciBpbiBpbnB1dEF0dHJpYnV0ZXMpIHtcbiAgICAgIC8vIERvIG5vdCBzZXQgYSBwbGFjZWhvbGRlciBmb3IgPGlucHV0IHR5cGU9XCJyYW5nZVwiPlxuICAgICAgLy8gaXQnbGwgY3Jhc2ggRWRnZSwgIzEyOThcbiAgICAgIGlmIChpbnB1dFR5cGUgPT09ICdyYW5nZScgJiYgYXR0ciA9PT0gJ3BsYWNlaG9sZGVyJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKGF0dHIsIGlucHV0QXR0cmlidXRlc1thdHRyXSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBzZXRDdXN0b21DbGFzcyA9IGZ1bmN0aW9uIHNldEN1c3RvbUNsYXNzKHBhcmFtcykge1xuICAgIHZhciBpbnB1dENvbnRhaW5lciA9IGdldElucHV0Q29udGFpbmVyKHBhcmFtcy5pbnB1dCk7XG5cbiAgICBpZiAocGFyYW1zLmN1c3RvbUNsYXNzKSB7XG4gICAgICBhZGRDbGFzcyhpbnB1dENvbnRhaW5lciwgcGFyYW1zLmN1c3RvbUNsYXNzLmlucHV0KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHNldElucHV0UGxhY2Vob2xkZXIgPSBmdW5jdGlvbiBzZXRJbnB1dFBsYWNlaG9sZGVyKGlucHV0LCBwYXJhbXMpIHtcbiAgICBpZiAoIWlucHV0LnBsYWNlaG9sZGVyIHx8IHBhcmFtcy5pbnB1dFBsYWNlaG9sZGVyKSB7XG4gICAgICBpbnB1dC5wbGFjZWhvbGRlciA9IHBhcmFtcy5pbnB1dFBsYWNlaG9sZGVyO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc2V0SW5wdXRMYWJlbCA9IGZ1bmN0aW9uIHNldElucHV0TGFiZWwoaW5wdXQsIHByZXBlbmRUbywgcGFyYW1zKSB7XG4gICAgaWYgKHBhcmFtcy5pbnB1dExhYmVsKSB7XG4gICAgICBpbnB1dC5pZCA9IHN3YWxDbGFzc2VzLmlucHV0O1xuICAgICAgdmFyIGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICAgIHZhciBsYWJlbENsYXNzID0gc3dhbENsYXNzZXNbJ2lucHV0LWxhYmVsJ107XG4gICAgICBsYWJlbC5zZXRBdHRyaWJ1dGUoJ2ZvcicsIGlucHV0LmlkKTtcbiAgICAgIGxhYmVsLmNsYXNzTmFtZSA9IGxhYmVsQ2xhc3M7XG4gICAgICBhZGRDbGFzcyhsYWJlbCwgcGFyYW1zLmN1c3RvbUNsYXNzLmlucHV0TGFiZWwpO1xuICAgICAgbGFiZWwuaW5uZXJUZXh0ID0gcGFyYW1zLmlucHV0TGFiZWw7XG4gICAgICBwcmVwZW5kVG8uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdiZWZvcmViZWdpbicsIGxhYmVsKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGdldElucHV0Q29udGFpbmVyID0gZnVuY3Rpb24gZ2V0SW5wdXRDb250YWluZXIoaW5wdXRUeXBlKSB7XG4gICAgdmFyIGlucHV0Q2xhc3MgPSBzd2FsQ2xhc3Nlc1tpbnB1dFR5cGVdID8gc3dhbENsYXNzZXNbaW5wdXRUeXBlXSA6IHN3YWxDbGFzc2VzLmlucHV0O1xuICAgIHJldHVybiBnZXRDaGlsZEJ5Q2xhc3MoZ2V0Q29udGVudCgpLCBpbnB1dENsYXNzKTtcbiAgfTtcblxuICB2YXIgcmVuZGVySW5wdXRUeXBlID0ge307XG5cbiAgcmVuZGVySW5wdXRUeXBlLnRleHQgPSByZW5kZXJJbnB1dFR5cGUuZW1haWwgPSByZW5kZXJJbnB1dFR5cGUucGFzc3dvcmQgPSByZW5kZXJJbnB1dFR5cGUubnVtYmVyID0gcmVuZGVySW5wdXRUeXBlLnRlbCA9IHJlbmRlcklucHV0VHlwZS51cmwgPSBmdW5jdGlvbiAoaW5wdXQsIHBhcmFtcykge1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLmlucHV0VmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwYXJhbXMuaW5wdXRWYWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlucHV0LnZhbHVlID0gcGFyYW1zLmlucHV0VmFsdWU7XG4gICAgfSBlbHNlIGlmICghaXNQcm9taXNlKHBhcmFtcy5pbnB1dFZhbHVlKSkge1xuICAgICAgd2FybihcIlVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dFZhbHVlISBFeHBlY3RlZCBcXFwic3RyaW5nXFxcIiwgXFxcIm51bWJlclxcXCIgb3IgXFxcIlByb21pc2VcXFwiLCBnb3QgXFxcIlwiLmNvbmNhdChfdHlwZW9mKHBhcmFtcy5pbnB1dFZhbHVlKSwgXCJcXFwiXCIpKTtcbiAgICB9XG5cbiAgICBzZXRJbnB1dExhYmVsKGlucHV0LCBpbnB1dCwgcGFyYW1zKTtcbiAgICBzZXRJbnB1dFBsYWNlaG9sZGVyKGlucHV0LCBwYXJhbXMpO1xuICAgIGlucHV0LnR5cGUgPSBwYXJhbXMuaW5wdXQ7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9O1xuXG4gIHJlbmRlcklucHV0VHlwZS5maWxlID0gZnVuY3Rpb24gKGlucHV0LCBwYXJhbXMpIHtcbiAgICBzZXRJbnB1dExhYmVsKGlucHV0LCBpbnB1dCwgcGFyYW1zKTtcbiAgICBzZXRJbnB1dFBsYWNlaG9sZGVyKGlucHV0LCBwYXJhbXMpO1xuICAgIHJldHVybiBpbnB1dDtcbiAgfTtcblxuICByZW5kZXJJbnB1dFR5cGUucmFuZ2UgPSBmdW5jdGlvbiAocmFuZ2UsIHBhcmFtcykge1xuICAgIHZhciByYW5nZUlucHV0ID0gcmFuZ2UucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICB2YXIgcmFuZ2VPdXRwdXQgPSByYW5nZS5xdWVyeVNlbGVjdG9yKCdvdXRwdXQnKTtcbiAgICByYW5nZUlucHV0LnZhbHVlID0gcGFyYW1zLmlucHV0VmFsdWU7XG4gICAgcmFuZ2VJbnB1dC50eXBlID0gcGFyYW1zLmlucHV0O1xuICAgIHJhbmdlT3V0cHV0LnZhbHVlID0gcGFyYW1zLmlucHV0VmFsdWU7XG4gICAgc2V0SW5wdXRMYWJlbChyYW5nZUlucHV0LCByYW5nZSwgcGFyYW1zKTtcbiAgICByZXR1cm4gcmFuZ2U7XG4gIH07XG5cbiAgcmVuZGVySW5wdXRUeXBlLnNlbGVjdCA9IGZ1bmN0aW9uIChzZWxlY3QsIHBhcmFtcykge1xuICAgIHNlbGVjdC50
8443ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgaWYgKHBhcmFtcy5pbnB1dFBsYWNlaG9sZGVyKSB7XG4gICAgICB2YXIgcGxhY2Vob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgIHNldElubmVySHRtbChwbGFjZWhvbGRlciwgcGFyYW1zLmlucHV0UGxhY2Vob2xkZXIpO1xuICAgICAgcGxhY2Vob2xkZXIudmFsdWUgPSAnJztcbiAgICAgIHBsYWNlaG9sZGVyLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHBsYWNlaG9sZGVyLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIHNlbGVjdC5hcHBlbmRDaGlsZChwbGFjZWhvbGRlcik7XG4gICAgfVxuXG4gICAgc2V0SW5wdXRMYWJlbChzZWxlY3QsIHNlbGVjdCwgcGFyYW1zKTtcbiAgICByZXR1cm4gc2VsZWN0O1xuICB9O1xuXG4gIHJlbmRlcklucHV0VHlwZS5yYWRpbyA9IGZ1bmN0aW9uIChyYWRpbykge1xuICAgIHJhZGlvLnRleHRDb250ZW50ID0gJyc7XG4gICAgcmV0dXJuIHJhZGlvO1xuICB9O1xuXG4gIHJlbmRlcklucHV0VHlwZS5jaGVja2JveCA9IGZ1bmN0aW9uIChjaGVja2JveENvbnRhaW5lciwgcGFyYW1zKSB7XG4gICAgdmFyIGNoZWNrYm94ID0gZ2V0SW5wdXQoZ2V0Q29udGVudCgpLCAnY2hlY2tib3gnKTtcbiAgICBjaGVja2JveC52YWx1ZSA9IDE7XG4gICAgY2hlY2tib3guaWQgPSBzd2FsQ2xhc3Nlcy5jaGVja2JveDtcbiAgICBjaGVja2JveC5jaGVja2VkID0gQm9vbGVhbihwYXJhbXMuaW5wdXRWYWx1ZSk7XG4gICAgdmFyIGxhYmVsID0gY2hlY2tib3hDb250YWluZXIucXVlcnlTZWxlY3Rvcignc3BhbicpO1xuICAgIHNldElubmVySHRtbChsYWJlbCwgcGFyYW1zLmlucHV0UGxhY2Vob2xkZXIpO1xuICAgIHJldHVybiBjaGVja2JveENvbnRhaW5lcjtcbiAgfTtcblxuICByZW5kZXJJbnB1dFR5cGUudGV4dGFyZWEgPSBmdW5jdGlvbiAodGV4dGFyZWEsIHBhcmFtcykge1xuICAgIHRleHRhcmVhLnZhbHVlID0gcGFyYW1zLmlucHV0VmFsdWU7XG4gICAgc2V0SW5wdXRQbGFjZWhvbGRlcih0ZXh0YXJlYSwgcGFyYW1zKTtcbiAgICBzZXRJbnB1dExhYmVsKHRleHRhcmVhLCB0ZXh0YXJlYSwgcGFyYW1zKTtcblxuICAgIHZhciBnZXRQYWRkaW5nID0gZnVuY3Rpb24gZ2V0UGFkZGluZyhlbCkge1xuICAgICAgcmV0dXJuIHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5wYWRkaW5nTGVmdCkgKyBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkucGFkZGluZ1JpZ2h0KTtcbiAgICB9O1xuXG4gICAgaWYgKCdNdXRhdGlvbk9ic2VydmVyJyBpbiB3aW5kb3cpIHtcbiAgICAgIC8vICMxNjk5XG4gICAgICB2Y
8443XIgaW5pdGlhbFBvcHVwV2lkdGggPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShnZXRQb3B1cCgpKS53aWR0aCk7XG5cbiAgICAgIHZhciBvdXRwdXRzaXplID0gZnVuY3Rpb24gb3V0cHV0c2l6ZSgpIHtcbiAgICAgICAgdmFyIGNvbnRlbnRXaWR0aCA9IHRleHRhcmVhLm9mZnNldFdpZHRoICsgZ2V0UGFkZGluZyhnZXRQb3B1cCgpKSArIGdldFBhZGRpbmcoZ2V0Q29udGVudCgpKTtcblxuICAgICAgICBpZiAoY29udGVudFdpZHRoID4gaW5pdGlhbFBvcHVwV2lkdGgpIHtcbiAgICAgICAgICBnZXRQb3B1cCgpLnN0eWxlLndpZHRoID0gXCJcIi5jb25jYXQoY29udGVudFdpZHRoLCBcInB4XCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdldFBvcHVwKCkuc3R5bGUud2lkdGggPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihvdXRwdXRzaXplKS5vYnNlcnZlKHRleHRhcmVhLCB7XG4gICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydzdHlsZSddXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGV4dGFyZWE7XG4gIH07XG5cbiAgdmFyIHJlbmRlckNvbnRlbnQgPSBmdW5jdGlvbiByZW5kZXJDb250ZW50KGluc3RhbmNlLCBwYXJhbXMpIHtcbiAgICB2YXIgY29udGVudCA9IGdldENvbnRlbnQoKS5xdWVyeVNlbGVjdG9yKFwiI1wiLmNvbmNhdChzd2FsQ2xhc3Nlcy5jb250ZW50KSk7IC8vIENvbnRlbnQgYXMgSFRNTFxuXG4gICAgaWYgKHBhcmFtcy5odG1sKSB7XG4gICAgICBwYXJzZUh0bWxUb0NvbnRhaW5lcihwYXJhbXMuaHRtbCwgY29udGVudCk7XG4gICAgICBzaG93KGNvbnRlbnQsICdibG9jaycpOyAvLyBDb250ZW50IGFzIHBsYWluIHRleHRcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy50ZXh0KSB7XG4gICAgICBjb250ZW50LnRleHRDb250ZW50ID0gcGFyYW1zLnRleHQ7XG4gICAgICBzaG93KGNvbnRlbnQsICdibG9jaycpOyAvLyBObyBjb250ZW50XG4gICAgfSBlbHNlIHtcbiAgICAgIGhpZGUoY29udGVudCk7XG4gICAgfVxuXG4gICAgcmVuZGVySW5wdXQoaW5zdGFuY2UsIHBhcmFtcyk7IC8vIEN1c3RvbSBjbGFzc1xuXG4gICAgYXBwbHlDdXN0b21DbGFzcyhnZXRDb250ZW50KCksIHBhcmFtcywgJ2NvbnRlbnQnKTtcbiAgfTtcblxuICB2YXIgcmVuZGVyRm9vdGVyID0gZnVuY3Rpb24gcmVuZGVyRm9vdGVyKGluc3RhbmNlLCBwYXJhbXMpIHtcbiAgICB2YXIgZm9vdGVyID0gZ2V0Rm9vdGVyKCk7XG4gICAgdG9nZ2xlKGZvb3RlciwgcGFyYW1zLmZvb3Rlcik7XG5cbiAgICBpZiAocGFyYW1zLmZvb3Rlcikge1xuICAgICAgcGFyc2VIdG1sVG9Db250YWluZXIocGFyYW1zLmZvb3RlciwgZm9vdGVyKTtcbiAgICB9IC8vIEN1c3RvbSBjbGFzc1xuXG5cbiAgICBhcHBseUN1c3RvbUNsYXNzKGZvb3RlciwgcGFyYW1zLCAnZm9vdGVyJyk7XG4gIH07XG5cbiAgdmFyIHJlbmRlckNsb3NlQnV0dG9uID0gZnVuY3Rpb24gcmVuZGVyQ2xvc2VCdXR0b24oaW5zdGFuY2UsIHBhcmFtcykge1xuICAgIHZhciBjbG9zZUJ1dHRvbiA9IGdldENsb3NlQnV0dG9uKCk7XG4gICAgc2V0SW5uZXJIdG1sKGNsb3NlQnV0dG9uLCBwYXJhbXMuY2xvc2VCdXR0b25IdG1sKTsgLy8gQ3VzdG9tIGNsYXNzXG5cbiAgICBhcHBseUN1c3RvbUNsYXNzKGNsb3NlQnV0dG9uLCBwYXJhbXMsICdjbG9zZUJ1dHRvbicpO1xuICAgIHRvZ2dsZShjbG9zZUJ1dHRvbiwgcGFyYW1zLnNob3dDbG9zZUJ1dHRvbik7XG4gICAgY2xvc2VCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgcGFyYW1zLmNsb3NlQnV0dG9uQXJpYUxhYmVsKTtcbiAgfTtcblxuICB2YXIgcmVuZGVySWNvbiA9IGZ1bmN0aW9uIHJlbmRlckljb24oaW5zdGFuY2UsIHBhcmFtcykge1xuICAgIHZhciBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UpOyAvLyBpZiB0aGUgZ2l2ZW4gaWNvbiBhbHJlYWR5IHJlbmRlcmVkLCBhcHBseSB0aGUgc3R5bGluZyB3aXRob3V0IHJlLXJlbmRlcmluZyB0aGUgaWNvblxuXG4gICAgaWYgKGlubmVyUGFyYW1zICYmIHBhcmFtcy5pY29uID09PSBpbm5lclBhcmFtcy5pY29uICYmIGdldEljb24oKSkge1xuICAgICAgYXBwbHlTdHlsZXMoZ2V0SWNvbigpLCBwYXJhbXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhpZGVBbGxJY29ucygpO1xuXG4gICAgaWYgKCFwYXJhbXMuaWNvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhpY29uVHlwZXMpLmluZGV4T2YocGFyYW1zLmljb24pICE9PSAtMSkge1xuICAgICAgdmFyIGljb24gPSBlbGVtZW50QnlTZWxlY3RvcihcIi5cIi5jb25jYXQoc3dhbENsYXNzZXMuaWNvbiwgXCIuXCIpLmNvbmNhdChpY29uVHlwZXNbcGFyYW1zLmljb25dKSk7XG4gICAgICBzaG93KGljb24pOyAvLyBDdXN0b20gb3IgZGVmYXVsdCBjb250ZW50XG5cbiAgICAgIHNldENvbnRlbnQoaWNvbiwgcGFyYW1zKTtcbiAgICAgIGFwcGx5U3R5bGVzKGljb24sIHBhcmFtcyk7IC8vIEFuaW1hdGUgaWNvblxuXG4gICAgICBhZGRDbGFzcyhpY29uLCBwYXJhbXMuc2hvd0NsYXNzLmljb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcihcIlVua25vd24gaWNvbiEgRXhwZWN0ZWQgXFxcInN1Y2Nlc3NcXFwiLCBcXFwiZXJyb3JcXFwiLCBcXFwid2FybmluZ1xcXCIsIFxcXCJpbmZvXFxcIiBvciBcXFwicXVlc3Rpb25cXFwiLCBnb3QgXFxcIlwiLmNvbmNhdChwYXJhbXMuaWNvbiwgXCJcXFwiXCIpKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGhpZGVBbGxJY29ucyA9IGZ1bmN0aW9uIGhpZGVBbGxJY29ucygpIHtcbiAgICB2YXIgaWNvbnMgPSBnZXRJY29ucygpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpY29ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaGlkZShpY29uc1tpXSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBhcHBseVN0eWxlcyA9IGZ1bmN0aW9uIGFwcGx5U3R5bGVzKGljb24sIHBhcmFtcykge1xuICAgIC8vIEljb24gY29sb3JcbiAgICBzZXRDb2xvcihpY29uLCBwYXJhbXMpOyAvLyBTdWNjZXNzIGljb24gYmFja2dyb3VuZCBjb2xvclxuXG4gICAgYWRqdXN0U3VjY2Vzc0ljb25CYWNrZ291bmRDb2xvcigpOyAvLyBDdXN0b20gY2xhc3NcblxuICAgIGFwcGx5Q3VzdG9tQ2xhc3MoaWNvbiwgcGFyYW1zLCAnaWNvbicpO1xuICB9OyAvLyBBZGp1c3Qgc3VjY2VzcyBpY29uIGJhY2tncm91bmQgY29sb3IgdG8gbWF0Y2ggdGhlIHBvcHVwIGJhY2tncm91bmQgY29sb3JcblxuXG4gI
8443HZhciBhZGp1c3RTdWNjZXNzSWNvbkJhY2tnb3VuZENvbG9yID0gZnVuY3Rpb24gYWRqdXN0U3VjY2Vzc0ljb25CYWNrZ291bmRDb2xvcigpIHtcbiAgICB2YXIgcG9wdXAgPSBnZXRQb3B1cCgpO1xuICAgIHZhciBwb3B1cEJhY2tncm91bmRDb2xvciA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBvcHVwKS5nZXRQcm9wZXJ0eVZhbHVlKCdiYWNrZ3JvdW5kLWNvbG9yJyk7XG4gICAgdmFyIHN1Y2Nlc3NJY29uUGFydHMgPSBwb3B1cC5xdWVyeVNlbGVjdG9yQWxsKCdbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV0sIC5zd2FsMi1zdWNjZXNzLWZpeCcpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWNjZXNzSWNvblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzdWNjZXNzSWNvblBhcnRzW2ldLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHBvcHVwQmFja2dyb3VuZENvbG9yO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc2V0Q29udGVudCA9IGZ1bmN0aW9uIHNldENvbnRlbnQoaWNvbiwgcGFyYW1zKSB7XG4gICAgaWNvbi50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgaWYgKHBhcmFtcy5pY29uSHRtbCkge1xuICAgICAgc2V0SW5uZXJIdG1sKGljb24sIGljb25Db250ZW50KHBhcmFtcy5pY29uSHRtbCkpO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLmljb24gPT09ICdzdWNjZXNzJykge1xuICAgICAgc2V0SW5uZXJIdG1sKGljb24sIFwiXFxuICAgICAgPGRpdiBjbGFzcz1cXFwic3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lLWxlZnRcXFwiPjwvZGl2PlxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJzd2FsMi1zdWNjZXNzLWxpbmUtdGlwXFxcIj48L3NwYW4+IDxzcGFuIGNsYXNzPVxcXCJzd2FsMi1zdWNjZXNzLWxpbmUtbG9uZ1xcXCI+PC9zcGFuPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcInN3YWwyLXN1Y2Nlc3MtcmluZ1xcXCI+PC9kaXY+IDxkaXYgY2xhc3M9XFxcInN3YWwyLXN1Y2Nlc3MtZml4XFxcIj48L2Rpdj5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtcmlnaHRcXFwiPjwvZGl2PlxcbiAgICBcIik7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMuaWNvbiA9PT0gJ2Vycm9yJykge1xuICAgICAgc2V0SW5uZXJIdG1sKGljb24sIFwiXFxuICAgICAgPHNwYW4gY2xhc3M9XFxcInN3YWwyLXgtbWFya1xcXCI+XFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwic3dhbDIteC1tYXJrLWxpbmUtbGVmdFxcXCI+PC9zcGFuPlxcbiAgICAgICAgPHNwYW4gY2xhc3M9XFxcInN3YWwyLXgtbWFyay1saW5lLXJpZ2h0XFxcIj48L3NwYW4+XFxuICAgICAgPC9zcGFuPlxcbiAgICBcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBkZWZhdWx0SWNvbkh0bWwgPSB7XG4gICAgICAgIHF1ZXN0aW9uOiAnPycsXG4gICAgICAgIHdhcm5pbmc6ICchJyxcbiAgICAgICAgaW5mbzogJ2knXG4gICAgICB9O1xuICAgICAgc2V0SW5uZXJIdG1sKGljb24sIGljb25Db250ZW50KGRlZmF1bHRJY29uSHRtbFtwYXJhbXMuaWNvbl0pKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHNldENvbG9yID0gZnVuY3Rpb24gc2V0Q29sb3IoaWNvbiwgcGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXMuaWNvbkNvbG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWNvbi5zdHlsZS5jb2xvciA9IHBhcmFtcy5pY29uQ29sb3I7XG4gICAgaWNvbi5zdHlsZS5ib3JkZXJDb2xvciA9IHBhcmFtcy5pY29uQ29sb3I7XG5cbiAgICBmb3IgKHZhciBfaSA9IDAsIF9hcnIgPSBbJy5zd2FsMi1zdWNjZXNzLWxpbmUtdGlwJywgJy5zd2FsMi1zdWNjZXNzLWxpbmUtbG9uZycsICcuc3dhbDIteC1tYXJrLWxpbmUtbGVmdCcsICcuc3dhbDIteC1tYXJrLWxpbmUtcmlnaHQnXTsgX2kgPCBfYXJyLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIHNlbCA9IF9hcnJbX2ldO1xuICAgICAgc2V0U3R5bGUoaWNvbiwgc2VsLCAnYmFja2dyb3VuZENvbG9yJywgcGFyYW1zLmljb25Db2xvcik7XG4gICAgfVxuXG4gICAgc2V0U3R5bGUoaWNvbiwgJy5zd2FsMi1zdWNjZXNzLXJpbmcnLCAnYm9yZGVyQ29sb3InLCBwYXJhbXMuaWNvbkNvbG9yKTtcbiAgfTtcblxuICB2YXIgaWNvbkNvbnRlbnQgPSBmdW5jdGlvbiBpY29uQ29udGVudChjb250ZW50KSB7XG4gICAgcmV0dXJuIFwiPGRpdiBjbGFzcz1cXFwiXCIuY29uY2F0KHN3YWxDbGFzc2VzWy
8443dpY29uLWNvbnRlbnQnXSwgXCJcXFwiPlwiKS5jb25jYXQoY29udGVudCwgXCI8L2Rpdj5cIik7XG4gIH07XG5cbiAgdmFyIHJlbmRlckltYWdlID0gZnVuY3Rpb24gcmVuZGVySW1hZ2UoaW5zdGFuY2UsIHBhcmFtcykge1xuICAgIHZhciBpbWFnZSA9IGdldEltYWdlKCk7XG5cbiAgICBpZiAoIXBhcmFtcy5pbWFnZVVybCkge1xuICAgICAgcmV0dXJuIGhpZGUoaW1hZ2UpO1xuICAgIH1cblxuICAgIHNob3coaW1hZ2UsICcnKTsgLy8gU3JjLCBhbHRcblxuICAgIGltYWdlLnNldEF0dHJpYnV0ZSgnc3JjJywgcGFyYW1zLmltYWdlVXJsKTtcbiAgICBpbWFnZS5zZXRBdHRyaWJ1dGUoJ2FsdCcsIHBhcmFtcy5pbWFnZUFsdCk7IC8vIFdpZHRoLCBoZWlnaHRcblxuICAgIGFwcGx5TnVtZXJpY2FsU3R5bGUoaW1hZ2UsICd3aWR0aCcsIHBhcmFtcy5pbWFnZVdpZHRoKTtcbiAgICBhcHBseU51bWVyaWNhbFN0eWxlKGltYWdlLCAnaGVpZ2h0JywgcGFyYW1zLmltYWdlSGVpZ2h0KTsgLy8gQ2xhc3NcblxuICAgIGltYWdlLmNsYXNzTmFtZSA9IHN3YWxDbGFzc2VzLmltYWdlO1xuICAgIGFwcGx5Q3VzdG9tQ2xhc3MoaW1hZ2UsIHBhcmFtcywgJ2ltYWdlJyk7XG4gIH07XG5cbiAgdmFyIGN1cnJlbnRTdGVwcyA9IFtdO1xuICAvKlxuICAgKiBHbG9iYWwgZnVuY3Rpb24gZm9yIGNoYWluaW5nIHN3ZWV0QWxlcnQgcG9wdXBzXG4gICAqL1xuXG4gIHZhciBxdWV1ZSA9IGZ1bmN0aW9uIHF1ZXVlKHN0ZXBzKSB7XG4gICAgdmFyIFN3YWwgPSB0aGlzO1xuICAgIGN1cnJlbnRTdGVwcyA9IHN0ZXBzO1xuXG4gICAgdmFyIHJlc2V0QW5kUmVzb2x2ZSA9IGZ1bmN0aW9uIHJlc2V0QW5kUmVzb2x2ZShyZXNvbHZlLCB2YWx1ZSkge1xuICAgICAgY3VycmVudFN0ZXBzID0gW107XG4gICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9O1xuXG4gICAgdmFyIHF1ZXVlUmVzdWx0ID0gW107XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAoZnVuY3Rpb24gc3RlcChpLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoaSA8IGN1cnJlbnRTdGVwcy5sZW5ndGgpIHtcbiAgICAgICAgICBkb2
8443N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZSgnZGF0YS1zd2FsMi1xdWV1ZS1zdGVwJywgaSk7XG4gICAgICAgICAgU3dhbC5maXJlKGN1cnJlbnRTdGVwc1tpXSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgcXVldWVSZXN1bHQucHVzaChyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICBzdGVwKGkgKyAxLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNldEFuZFJlc29sdmUocmVzb2x2ZSwge1xuICAgICAgICAgICAgICAgIGRpc21pc3M6IHJlc3VsdC5kaXNtaXNzXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc2V0QW5kUmVzb2x2ZShyZXNvbHZlLCB7XG4gICAgICAgICAgICB2YWx1ZTogcXVldWVSZXN1bHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSkoMCk7XG4gICAgfSk7XG4gIH07XG4gIC8qXG4gICAqIEdsb2JhbCBmdW5jdGlvbiBmb3IgZ2V0dGluZyB0aGUgaW5kZXggb2YgY3VycmVudCBwb3B1cCBpbiBxdWV1ZVxuICAgKi9cblxuICB2YXIgZ2V0UXVldWVTdGVwID0gZnVuY3Rpb24gZ2V0UXVldWVTdGVwKCkge1xuICAgIHJldHVybiBnZXRDb250YWluZXIoKSAmJiBnZXRDb250YWluZXIoKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcXVldWUtc3RlcCcpO1xuICB9O1xuICAvKlxuICAgKiBHbG9iYWwgZnVuY3Rpb24gZm9yIGluc2VydGluZyBhIHBvcHVwIHRvIHRoZSBxdWV1ZVxuICAgKi9cblxuICB2YXIgaW5zZXJ0UXVldWVTdGVwID0gZnVuY3Rpb24gaW5zZXJ0UXVldWVTdGVwKHN0ZXAsIGluZGV4KSB7XG4gICAgaWYgKGluZGV4ICYmIGluZGV4IDwgY3VycmVudFN0ZXBzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRTdGVwcy5zcGxpY2UoaW5kZXgsIDAsIHN0ZXApO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50U3RlcHMucHVzaChzdGVwKTtcbiAgfTtcbiAgLypcbiAgICogR2xvYmFsIGZ1bmN0aW9uIGZvciBkZWxldGluZyBhIHBvcHVwIGZyb20gdGhlIHF1ZXVlXG4gICAqL1xuXG4gIHZhciBkZWxldGVRdWV1ZVN0ZXAgPSBmdW5jdGlvbiBkZWxldGVRdWV1ZVN0ZXAoaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIGN1cnJlbnRTdGVwc1tpbmRleF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjdXJyZW50U3RlcHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGNyZWF0ZVN0ZXBFbGVtZW50ID0gZnVuY3Rpb24gY3JlYXRlU3RlcEVsZW1lbnQoc3RlcCkge1xuICAgIHZhciBzdGVwRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgIGFkZENsYXNzKHN0ZXBFbCwgc3dhbENsYXNzZXNbJ3Byb2dyZXNzLXN0ZXAnXSk7XG4gICAgc2V0SW5uZXJIdG1sKHN0ZXBFbCwgc3RlcCk7XG4gICAgcmV0dXJuIHN0ZXBFbDtcbiAgfTtcblxuICB2YXIgY3JlYXRlTGluZUVsZW1lbnQgPSBmdW5jdGlvbiBjcmVhdGVMaW5lRWxlbWVudChwYXJhbXMpIHtcbiAgICB2YXIgbGluZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICBhZGRDbGFzcyhsaW5lRWwsIHN3YWxDbGFzc2VzWy
8443dwcm9ncmVzcy1zdGVwLWxpbmUnXSk7XG5cbiAgICBpZiAocGFyYW1zLnByb2dyZXNzU3RlcHNEaXN0YW5jZSkge1xuICAgICAgbGluZUVsLnN0eWxlLndpZHRoID0gcGFyYW1zLnByb2dyZXNzU3RlcHNEaXN0YW5jZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZUVsO1xuICB9O1xuXG4gIHZhciByZW5kZXJQcm9ncmVzc1N0ZXBzID0gZnVuY3Rpb24gcmVuZGVyUHJvZ3Jlc3NTdGVwcyhpbnN0YW5jZSwgcGFyYW1zKSB7XG4gICAgdmFyIHByb2dyZXNzU3RlcHNDb250YWluZXIgPSBnZXRQcm9ncmVzc1N0ZXBzKCk7XG5cbiAgICBpZiAoIXBhcmFtcy5wcm9ncmVzc1N0ZXBzIHx8IHBhcmFtcy5wcm9ncmVzc1N0ZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGhpZGUocHJvZ3Jlc3NTdGVwc0NvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgc2hvdyhwcm9ncmVzc1N0ZXBzQ29udGFpbmVyKTtcbiAgICBwcm9ncmVzc1N0ZXBzQ29udGFpbmVyLnRleHRDb250ZW50ID0gJyc7XG4gICAgdmFyIGN1cnJlbnRQcm9ncmVzc1N0ZXAgPSBwYXJzZUludChwYXJhbXMuY3VycmVudFByb2dyZXNzU3RlcCA9PT0gdW5kZWZpbmVkID8gZ2V0UXVldWVTdGVwKCkgOiBwYXJhbXMuY3VycmVudFByb2dyZXNzU3RlcCk7XG5cbiAgICBpZiAoY3VycmVudFByb2dyZXNzU3RlcCA+PSBwYXJhbXMucHJvZ3Jlc3NTdGVwcy5sZW5ndGgpIHtcbiAgICAgIHdhcm4oJ0ludmFsaWQgY3VycmVudFByb2dyZXNzU3RlcCBwYXJhbWV0ZXIsIGl0IHNob3VsZCBiZSBsZXNzIHRoYW4gcHJvZ3Jlc3NTdGVwcy5sZW5ndGggJyArICcoY3VycmVudFByb2dyZXNzU3RlcCBsaWtlIEpTIGFycmF5cyBzdGFydHMgZnJvbSAwKScpO1xuICAgIH1cblxuICAgIHBhcmFtcy5wcm9ncmVzc1N0ZXBzLmZvckVhY2goZnVuY3Rpb24gKHN0ZXAsIGluZGV4KSB7XG4gICAgICB2Y
8443XIgc3RlcEVsID0gY3JlYXRlU3RlcEVsZW1lbnQoc3RlcCk7XG4gICAgICBwcm9ncmVzc1N0ZXBzQ29udGFpbmVyLmFwcGVuZENoaWxkKHN0ZXBFbCk7XG5cbiAgICAgIGlmIChpbmRleCA9PT0gY3VycmVudFByb2dyZXNzU3RlcCkge1xuICAgICAgICBhZGRDbGFzcyhzdGVwRWwsIHN3YWxDbGFzc2VzWydhY3RpdmUtcHJvZ3Jlc3Mtc3RlcCddKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluZGV4ICE9PSBwYXJhbXMucHJvZ3Jlc3NTdGVwcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHZhciBsaW5lRWwgPSBjcmVhdGVMaW5lRWxlbWVudChwYXJhbXMpO1xuICAgICAgICBwcm9ncmVzc1N0ZXBzQ29udGFpbmVyLmFwcGVuZENoaWxkKGxpbmVFbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHJlbmRlclRpdGxlID0gZnVuY3Rpb24gcmVuZGVyVGl0bGUoaW5zdGFuY2UsIHBhcmFtcykge1xuICAgIHZhciB0aXRsZSA9IGdldFRpdGxlKCk7XG4gICAgdG9nZ2xlKHRpdGxlLCBwYXJhbXMudGl0bGUgfHwgcGFyYW1zLnRpdGxlVGV4dCk7XG5cbiAgICBpZiAocGFyYW1zLnRpdGxlKSB7XG4gICAgICBwYXJzZUh0bWxUb0NvbnRhaW5lcihwYXJhbXMudGl0bGUsIHRpdGxlKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnRpdGxlVGV4dCkge1xuICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gcGFyYW1zLnRpdGxlVGV4dDtcbiAgICB9IC8vIEN1c3RvbSBjbGFzc1xuXG5cbiAgICBhcHBseUN1c3RvbUNsYXNzKHRpdGxlLCBwYXJhbXMsICd0aXRsZScpO1xuICB9O1xuXG4gIHZhciByZW5kZXJIZWFkZXIgPSBmdW5jdGlvbiByZW5kZXJIZWFkZXIoaW5zdGFuY2UsIHBhcmFtcykge1xuICAgIHZhciBoZWFkZXIgPSBnZXRIZWFkZXIoKTsgLy8gQ3VzdG9tIGNsYXNzXG5cbiAgICBhcHBseUN1c3RvbUNsYXNzKGhlYWRlciwgcGFyYW1zLCAnaGVhZGVyJyk7IC8vIFByb2dyZXNzIHN0ZXBzXG5cbiAgICByZW5kZXJQcm9ncmVzc1N0ZXBzKGluc3RhbmNlLCBwYXJhbXMpOyAvLyBJY29uXG5cbiAgICByZW5kZXJJY29uKGluc3RhbmNlLCBwYXJhbXMpOyAvLyBJbWFnZVxuXG4gICAgcmVuZGVySW1hZ2UoaW5zdGFuY2UsIHBhcmFtcyk7IC8vIFRpdGxlXG5cbiAgICByZW5kZXJUaXRsZShpbnN0YW5jZSwgcGFyYW1zKTsgLy8gQ2xvc2UgYnV0dG9uXG5cbiAgICByZW5kZXJDbG9zZUJ1dHRvbihpbnN0YW5jZSwgcGFyYW1zKTtcbiAgfTtcblxuICB2YXIgcmVuZGVyUG9wdXAgPSBmdW5jdGlvbiByZW5kZXJQb3B1cChpbnN0YW5jZSwgcGFyYW1zKSB7XG4gICAgdmFyIHBvcHVwID0gZ2V0UG9wdXAoKTsgLy8gV2lkdGhcblxuICAgIGFwcGx5TnVtZXJpY2FsU3R5bGUocG9wdXAsICd3aWR0aCcsIHBhcmFtcy53aWR0aCk7IC8vIFBhZGRpbmdcblxuICAgIGFwcGx5TnVtZXJpY2FsU3R5bGUocG9wdXAsICdwYWRkaW5nJywgcGFyYW1zLnBhZGRpbmcpOyAvLyBCYWNrZ3JvdW5kXG5cbiAgICBpZiAocGFyYW1zLmJhY2tncm91bmQpIHtcbiAgICAgIHBvcHVwLnN0eWxlLmJhY2tncm91bmQgPSBwYXJhbXMuYmFja2dyb3VuZDtcbiAgICB9IC8vIENsYXNzZXNcblxuXG4gICAgYWRkQ2xhc3Nlcyhwb3B1cCwgcGFyYW1zKTtcbiAgfTtcblxuICB2YXIgYWRkQ2xhc3NlcyA9IGZ1bmN0aW9uIGFkZENsYXNzZXMocG9wdXAsIHBhcmFtcykge1xuICAgIC8vIERlZmF1bHQgQ2xhc3MgKyBzaG93Q2xhc3Mgd2hlbiB1cGRhdGluZyBTd2FsLnVwZGF0ZSh7fSlcbiAgICBwb3B1cC5jbGFzc05hbWUgPSBcIlwiLmNvbmNhdChzd2FsQ2xhc3Nlcy5wb3B1cCwgXCIgXCIpLmNvbmNhdChpc1Zpc2libGUocG9wdXApID8gcGFyYW1zLnNob3dDbGFzcy5wb3B1cCA6ICcnKTtcblxuICAgIGlmIChwYXJhbXMudG9hc3QpIHtcbiAgICAgIGFkZENsYXNzKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGRvY3VtZW50LmJvZHldLCBzd2FsQ2xhc3Nlc1sndG9hc3Qtc2hvd24nXSk7XG4gICAgICBhZGRDbGFzcyhwb3B1cCwgc3dhbENsYXNzZXMudG9hc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRDbGFzcyhwb3B1cCwgc3dhbENsYXNzZXMubW9kYWwpO1xuICAgIH0gLy8gQ3VzdG9tIGNsYXNzXG5cblxuICAgIGFwcGx5Q3VzdG9tQ2xhc3MocG9wdXAsIHBhcmFtcywgJ3BvcHVwJyk7XG5cbiAgICBpZiAodHlwZW9mIHBhcmFtcy5jdXN0b21DbGFzcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGFkZENsYXNzKHBvcHVwLCBwYXJhbXMuY3VzdG9tQ2xhc3MpO1xuICAgIH0gLy8gSWNvbiBjbGFzcyAoIzE4NDIpXG5cblxuICAgIGlmIChwYXJhbXMuaWNvbikge1xuICAgICAgYWRkQ2xhc3MocG9wdXAsIHN3YWxDbGFzc2VzW1wiaWNvbi1cIi5jb25jYXQocGFyYW1zLmljb24pXSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciByZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoaW5zdGFuY2UsIHBhcmFtcykge1xuICAgIHJlbmRlclBvcHVwKGluc3RhbmNlLCBwYXJhbXMpO1xuICAgIHJlbmRlckNvbnRhaW5lcihpbnN0YW5jZSwgcGFyYW1zKTtcbiAgICByZW5kZXJIZWFkZXIoaW5zdGFuY2UsIHBhcmFtcyk7XG4gICAgcmVuZGVyQ29udGVudChpbnN0YW5jZSwgcGFyYW1zKTtcbiAgICByZW5kZXJBY3Rpb25zKGluc3RhbmNlLCBwYXJhbXMpO1xuICAgIHJlbmRlckZvb3RlcihpbnN0YW5jZSwgcGFyYW1zKTtcblxuICAgIGlmICh0eXBlb2YgcGFyYW1zLmRpZFJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGFyYW1zLmRpZFJlbmRlcihnZXRQb3B1cCgpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbXMub25SZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBhcmFtcy5vblJlbmRlcihnZXRQb3B1cCgpKTsgLy8gQGRlcHJlY2F0ZWRcbiAgICB9XG4gIH07XG5cbiAgLypcbiAgICogR2xvYmFsIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBTd2VldEFsZXJ0MiBwb3B1cCBpcyBzaG93blxuICAgKi9cblxuICB2YXIgaXNWaXNpYmxlJDEgPSBmdW5jdGlvbiBpc1Zpc2libGUkJDEoKSB7XG4gICAgcmV0dXJuIGlzVmlzaWJsZShnZXRQb3B1cCgpKTtcbiAgfTtcbiAgLypcbiAgICogR2xvYmFsIGZ1bmN0aW9uIHRvIGNsaWNrICdDb25maXJtJyBidXR0b25cbiAgICovXG5cbiAgdmFyIGNsaWNrQ29uZmlybSA9IGZ1bmN0aW9uIGNsaWNrQ29uZmlybSgpIHtcbiAgICByZXR1cm4gZ2V0Q29uZmlybUJ1dHRvbigpICYmIGdldENvbmZpcm1CdXR0b24oKS5jbGljaygpO1xuICB9O1xuICAvKlxuICAgKiBHbG9iYWwgZnVuY3Rpb24gdG8gY2xpY2sgJ0RlbnknIGJ1dHRvblxuICAgKi9cblxuICB2Y
8443XIgY2xpY2tEZW55ID0gZnVuY3Rpb24gY2xpY2tEZW55KCkge1xuICAgIHJldHVybiBnZXREZW55QnV0dG9uKCkgJiYgZ2V0RGVueUJ1dHRvbigpLmNsaWNrKCk7XG4gIH07XG4gIC8qXG4gICAqIEdsb2JhbCBmdW5jdGlvbiB0byBjbGljayAnQ2FuY2VsJyBidXR0b25cbiAgICovXG5cbiAgdmFyIGNsaWNrQ2FuY2VsID0gZnVuY3Rpb24gY2xpY2tDYW5jZWwoKSB7XG4gICAgcmV0dXJuIGdldENhbmNlbEJ1dHRvbigpICYmIGdldENhbmNlbEJ1dHRvbigpLmNsaWNrKCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gZmlyZSgpIHtcbiAgICB2YXIgU3dhbCA9IHRoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIF9jb25zdHJ1Y3QoU3dhbCwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleHRlbmRlZCB2ZXJzaW9uIG9mIGBTd2FsYCBjb250YWluaW5nIGBwYXJhbXNgIGFzIGRlZmF1bHRzLlxuICAgKiBVc2VmdWwgZm9yIHJldXNpbmcgU3dhbCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogQmVmb3JlOlxuICAgKiBjb25zdCB0ZXh0UHJvbXB0T3B0aW9ucyA9IHsgaW5wdXQ6ICd0ZXh0Jywgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSB9XG4gICAqIGNvbnN0IHt2YWx1ZTogZmlyc3ROYW1lfSA9IGF3YWl0IFN3YWwuZmlyZSh7IC4uLnRleHRQcm9tcHRPcHRpb25zLCB0aXRsZTogJ1doYXQgaXMgeW91ciBmaXJzdCBuYW1lPycgfSlcbiAgICogY29uc3Qge3ZhbHVlOiBsYXN0TmFtZX0gPSBhd2FpdCBTd2FsLmZpcmUoeyAuLi50ZXh0UHJvbXB0T3B0aW9ucywgdGl0bGU6ICdXaGF0IGlzIHlvdXIgbGFzdCBuYW1lPycgfSlcbiAgICpcbiAgICogQWZ0ZXI6XG4gICAqIGNvbnN0IFRleHRQcm9tcHQgPSBTd2FsLm1peGluKHsgaW5wdXQ6ICd0ZXh0Jywgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSB9KVxuICAgKiBjb25zdCB7dmFsdWU6IGZpcnN0TmFtZX0gPSBhd2FpdCBUZXh0UHJvbXB0KCdXaGF0IGlzIHlvdXIgZmlyc3QgbmFtZT8nKVxuICAgKiBjb25zdCB7dmFsdWU6IGxhc3ROYW1lfSA9IGF3YWl0IFRleHRQcm9tcHQoJ1doYXQgaXMgeW91ciBsYXN0IG5hbWU/JylcbiAgICpcbiAgICogQHBhcmFtIG1peGluUGFyYW1zXG4gICAqL1xuICBmdW5jdGlvbiBtaXhpbihtaXhpblBhcmFtcykge1xuICAgIHZhciBNaXhpblN3YWwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF90aGlzKSB7XG4gICAgICBfaW5oZXJpdHMoTWl4aW5Td2FsLCBfdGhpcyk7XG5cbiAgICAgIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTWl4aW5Td2FsKTtcblxuICAgICAgZnVuY3Rpb24gTWl4aW5Td2FsKCkge1xuICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWl4aW5Td2FsKTtcblxuICAgICAgICByZXR1cm4gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIF9jcmVhdGVDbGFzcyhNaXhpblN3YWwsIFt7XG4gICAgICAgIGtleTogXCJfbWFpblwiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX21haW4ocGFyYW1zLCBwcmV2TWl4aW5QYXJhbXMpIHtcbiAgICAgICAgICByZXR1cm4gX2dldChfZ2V0UHJvdG90eXBlT2YoTWl4aW5Td2FsLnByb3RvdHlwZSksIFwiX21haW5cIiwgdGhpcykuY2FsbCh0aGlzLCBwYXJhbXMsIF9leHRlbmRzKHt9LCBwcmV2TWl4aW5QYXJhbXMsIG1peGluUGFyYW1zKSk7XG4gICAgICAgIH1cbiAgICAgIH1dKTtcblxuICAgICAgcmV0dXJuIE1peGluU3dhbDtcbiAgICB9KHRoaXMpO1xuXG4gICAgcmV0dXJuIE1peGluU3dhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBsb2FkZXIgKHNwaW5uZXIpLCB0aGlzIGlzIHVzZWZ1bCB3aXRoIEFKQVggcmVxdWVzdHMuXG4gICAqIEJ5IGRlZmF1bHQgdGhlIGxvYWRlciBiZSBzaG93biBpbnN0ZWFkIG9mIHRoZSBcIkNvbmZpcm1cIiBidXR0b24uXG4gICAqL1xuXG4gIHZhciBzaG93TG9hZGluZyA9IGZ1bmN0aW9uIHNob3dMb2FkaW5nKGJ1dHRvblRvUmVwbGFjZSkge1xuICAgIHZhciBwb3B1cCA9IGdldFBvcHVwKCk7XG5cbiAgICBpZiAoIXBvcHVwKSB7XG4gICAgICBTd2FsLmZpcmUoKTtcbiAgICB9XG5cbiAgICBwb3B1cCA9IGdldFBvcHVwKCk7XG4gICAgdmFyIGFjdGlvbnMgPSBnZXRBY3Rpb25zKCk7XG4gICAgdmFyIGxvYWRlciA9IGdldExvYWRlcigpO1xuXG4gICAgaWYgKCFidXR0b25Ub1JlcGxhY2UgJiYgaXNWaXNpYmxlKGdldENvbmZpcm1CdXR0b24oKSkpIHtcbiAgICAgIGJ1dHRvblRvUmVwbGFjZSA9IGdldENvbmZpcm1CdXR0b24oKTtcbiAgICB9XG5cbiAgICBzaG93KGFjdGlvbnMpO1xuXG4gICAgaWYgKGJ1dHRvblRvUmVwbGFjZSkge1xuICAgICAgaGlkZShidXR0b25Ub1JlcGxhY2UpO1xuICAgICAgbG9hZGVyLnNldEF0dHJpYnV0ZSgnZGF0YS1idXR0b24tdG8tcmVwbGFjZScsIGJ1dHRvblRvUmVwbGFjZS5jbGFzc05hbWUpO1xuICAgIH1cblxuICAgIGxvYWRlci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShsb2FkZXIsIGJ1dHRvblRvUmVwbGFjZSk7XG4gICAgYWRkQ2xhc3MoW3BvcHVwLCBhY3Rpb25zXSwgc3dhbENsYXNzZXMubG9hZGluZyk7XG4gICAgc2hvdyhsb2FkZXIpO1xuICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgnZGF0YS1sb2FkaW5nJywgdHJ1ZSk7XG4gICAgcG9wdXAuc2V0QXR0cmlidXRlKCdhcmlhLWJ1c3knLCB0cnVlKTtcbiAgICBwb3B1cC5mb2N1cygpO1xuICB9O1xuXG4gIHZhciBSRVNUT1JFX0ZPQ1VTX1RJTUVPVVQgPSAxMDA7XG5cbiAgdmFyIGdsb2JhbFN0YXRlID0ge307XG5cbiAgdmFyIGZvY3VzUHJldmlvdXNBY3RpdmVFbGVtZW50ID0gZnVuY3Rpb24gZm9jdXNQcmV2aW91c0FjdGl2ZUVsZW1lbnQoKSB7XG4gICAgaWYgKGdsb2JhbFN0YXRlLnByZXZpb3VzQWN0aXZlRWxlbWVudCAmJiBnbG9iYWxTdGF0ZS5wcmV2aW91c0FjdGl2ZUVsZW1lbnQuZm9jdXMpIHtcbiAgICAgIGdsb2JhbFN0YXRlLnByZXZpb3VzQWN0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgZ2xvYmFsU3RhdGUucHJldmlvdXNBY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmJvZHkpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuZm9jdXMoKTtcbiAgICB9XG4gI
8443H07IC8vIFJlc3RvcmUgcHJldmlvdXMgYWN0aXZlIChmb2N1c2VkKSBlbGVtZW50XG5cblxuICB2YXIgcmVzdG9yZUFjdGl2ZUVsZW1lbnQgPSBmdW5jdGlvbiByZXN0b3JlQWN0aXZlRWxlbWVudCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHZhciB4ID0gd2luZG93LnNjcm9sbFg7XG4gICAgICB2YXIgeSA9IHdpbmRvdy5zY3JvbGxZO1xuICAgICAgZ2xvYmFsU3RhdGUucmVzdG9yZUZvY3VzVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBmb2N1c1ByZXZpb3VzQWN0aXZlRWxlbWVudCgpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LCBSRVNUT1JFX0ZPQ1VTX1RJTUVPVVQpOyAvLyBpc3N1ZXMvOTAwXG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuXG4gICAgICBpZiAodHlwZW9mIHggIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBJRSBkb2Vzbid0IGhhdmUgc2Nyb2xsWC9zY3JvbGxZIHN1cHBvcnRcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKHgsIHkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJZiBgdGltZXJgIHBhcmFtZXRlciBpcyBzZXQsIHJldHVybnMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvZiB0aW1lciByZW1haW5lZC5cbiAgICogT3RoZXJ3aXNlLCByZXR1cm5zIHVuZGVmaW5lZC5cbiAgICovXG5cbiAgdmFyIGdldFRpbWVyTGVmdCA9IGZ1bmN0aW9uIGdldFRpbWVyTGVmdCgpIHtcbiAgICByZXR1cm4gZ2xvYmFsU3RhdGUudGltZW91dCAmJiBnbG9iYWxTdGF0ZS50aW1lb3V0LmdldFRpbWVyTGVmdCgpO1xuICB9O1xuICAvKipcbiAgICogU3RvcCB0aW1lci4gUmV0dXJucyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9mIHRpbWVyIHJlbWFpbmVkLlxuICAgKiBJZiBgdGltZXJgIHBhcmFtZXRlciBpc24ndCBzZXQsIHJldHVybnMgdW5kZWZpbmVkLlxuICAgKi9cblxuICB2YXIgc3RvcFRpbWVyID0gZnVuY3Rpb24gc3RvcFRpbWVyKCkge1xuICAgIGlmIChnbG9iYWxTdGF0ZS50aW1lb3V0KSB7XG4gICAgICBzdG9wVGltZXJQcm9ncmVzc0JhcigpO1xuICAgICAgcmV0dXJuIGdsb2JhbFN0YXRlLnRpbWVvdXQuc3RvcCgpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIFJlc3VtZSB0aW1lci4gUmV0dXJucyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9mIHRpbWVyIHJlbWFpbmVkLlxuICAgKiBJZiBgdGltZXJgIHBhcmFtZXRlciBpc24ndCBzZXQsIHJldHVybnMgdW5kZWZpbmVkLlxuICAgKi9cblxuICB2YXIgcmVzdW1lVGltZXIgPSBmdW5jdGlvbiByZXN1bWVUaW1lcigpIHtcbiAgICBpZiAoZ2xvYmFsU3RhdGUudGltZW91dCkge1xuICAgICAgdmFyIHJlbWFpbmluZyA9IGdsb2JhbFN0YXRlLnRpbWVvdXQuc3RhcnQoKTtcbiAgICAgIGFuaW1hdGVUaW1lclByb2dyZXNzQmFyKHJlbWFpbmluZyk7XG4gICAgICByZXR1cm4gcmVtYWluaW5nO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIFJlc3VtZSB0aW1lci4gUmV0dXJucyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9mIHRpbWVyIHJlbWFpbmVkLlxuICAgKiBJZiBgdGltZXJgIHBhcmFtZXRlciBpc24ndCBzZXQsIHJldHVybnMgdW5kZWZpbmVkLlxuICAgKi9cblxuICB2YXIgdG9nZ2xlVGltZXIgPSBmdW5jdGlvbiB0b2dnbGVUaW1lcigpIHtcbiAgICB2YXIgdGltZXIgPSBnbG9iYWxTdGF0ZS50aW1lb3V0O1xuICAgIHJldHVybiB0aW1lciAmJiAodGltZXIucnVubmluZyA/IHN0b3BUaW1lcigpIDogcmVzdW1lVGltZXIoKSk7XG4gIH07XG4gIC8qKlxuICAgKiBJbmNyZWFzZSB0aW1lci4gUmV0dXJucyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9mIGFuIHVwZGF0ZWQgdGltZXIuXG4gICAqIElmIGB0aW1lcmAgcGFyYW1ldGVyIGlzbid0IHNldCwgcmV0dXJucyB1bmRlZmluZWQuXG4gICAqL1xuXG4gIHZhciBpbmNyZWFzZVRpbWVyID0gZnVuY3Rpb24gaW5jcmVhc2VUaW1lcihuKSB7XG4gICAgaWYgKGdsb2JhbFN0YXRlLnRpbWVvdXQpIHtcbiAgICAgIHZhciByZW1haW5pbmcgPSBnbG9iYWxTdGF0ZS50aW1lb3V0LmluY3JlYXNlKG4pO1xuICAgICAgYW5pbWF0ZVRpbWVyUHJvZ3Jlc3NCYXIocmVtYWluaW5nLCB0cnVlKTtcbiAgICAgIHJldHVybiByZW1haW5pbmc7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogQ2hlY2sgaWYgdGltZXIgaXMgcnVubmluZy4gUmV0dXJucyB0cnVlIGlmIHRpbWVyIGlzIHJ1bm5pbmdcbiAgICogb3IgZmFsc2UgaWYgdGltZXIgaXMgcGF1c2VkIG9yIHN0b3BwZWQuXG4gICAqIElmIGB0aW1lcmAgcGFyYW1ldGVyIGlzbid0IHNldCwgcmV0dXJucyB1bmRlZmluZWRcbiAgICovXG5cbiAgdmFyIGlzVGltZXJSdW5uaW5nID0gZnVuY3Rpb24gaXNUaW1lclJ1bm5pbmcoKSB7XG4gICAgcmV0dXJuIGdsb2JhbFN0YXRlLnRpbWVvdXQgJiYgZ2xvYmFsU3RhdGUudGltZW91dC5pc1J1bm5pbmcoKTtcbiAgfTtcblxuICB2YXIgYm9keUNsaWNrTGlzdGVuZXJBZGRlZCA9IGZhbHNlO1xuICB2YXIgY2xpY2tIYW5kbGVycyA9IHt9O1xuICBmdW5jdGlvbiBiaW5kQ2xpY2tIYW5kbGVyKCkge1xuICAgIHZhciBhdHRyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnZGF0YS1zd2FsLXRlbXBsYXRlJztcbiAgICBjbGlja0hhbmRsZXJzW2F0dHJdID0gdGhpcztcblxuICAgIGlmICghYm9keUNsaWNrTGlzdGVuZXJBZGRlZCkge1xuICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGJvZHlDbGlja0xpc3RlbmVyKTtcbiAgICAgIGJvZHlDbGlja0xpc3RlbmVyQWRkZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBib2R5Q2xpY2tMaXN0ZW5lciA9IGZ1bmN0aW9uIGJvZHlDbGlja0xpc3RlbmVyKGV2ZW50KSB7XG4gICAgLy8gMS4gdXNpbmcgLnBhcmVudE5vZGUgaW5zdGVhZCBvZiBldmVudC5wYXRoIGJlY2F1c2Ugb2YgYmV0dGVyIHN1cHBvcnQgYnkgb2xkIGJyb3dzZXJzIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTI0NTYzOFxuICAgIC8vIDIuIHVzaW5nIC5wYXJlbnROb2RlIGluc3RlYWQgb2YgLnBhcmVudEVsZW1lbnQgYmVjYXVzZSBvZiBJRTExICsgU1ZHIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNjI3MDM1NFxuICAgIGZvciAodmFyIGVsID0gZXZlbnQudGFyZ2V0OyBlbCAmJiBlbCAhPT0gZG9jdW1lbnQ7IGVsID0gZWwucGFyZW50Tm9kZSkge1xuICAgICAgZm9yICh2YXIgYXR0ciBpbiBjbGlja0hhbmRsZXJzKSB7XG4gICAgICAgI
8443HZhciB0ZW1wbGF0ZSA9IGVsLmdldEF0dHJpYnV0ZShhdHRyKTtcblxuICAgICAgICBpZiAodGVtcGxhdGUpIHtcbiAgICAgICAgICBjbGlja0hhbmRsZXJzW2F0dHJdLmZpcmUoe1xuICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhciBkZWZhdWx0UGFyYW1zID0ge1xuICAgIHRpdGxlOiAnJyxcbiAgICB0aXRsZVRleHQ6ICcnLFxuICAgIHRleHQ6ICcnLFxuICAgIGh0bWw6ICcnLFxuICAgIGZvb3RlcjogJycsXG4gICAgaWNvbjogdW5kZWZpbmVkLFxuICAgIGljb25Db2xvcjogdW5kZWZpbmVkLFxuICAgIGljb25IdG1sOiB1bmRlZmluZWQsXG4gICAgdGVtcGxhdGU6IHVuZGVmaW5lZCxcbiAgICB0b2FzdDogZmFsc2UsXG4gICAgYW5pbWF0aW9uOiB0cnVlLFxuICAgIHNob3dDbGFzczoge1xuICAgICAgcG9wdXA6ICdzd2FsMi1zaG93JyxcbiAgICAgIGJhY2tkcm9wOiAnc3dhbDItYmFja2Ryb3Atc2hvdycsXG4gICAgICBpY29uOiAnc3dhbDItaWNvbi1zaG93J1xuICAgIH0sXG4gICAgaGlkZUNsYXNzOiB7XG4gICAgICBwb3B1cDogJ3N3YWwyLWhpZGUnLFxuICAgICAgYmFja2Ryb3A6ICdzd2FsMi1iYWNrZHJvcC1oaWRlJyxcbiAgICAgIGljb246ICdzd2FsMi1pY29uLWhpZGUnXG4gICAgfSxcbiAgICBjdXN0b21DbGFzczoge30sXG4gICAgdGFyZ2V0OiAnYm9keScsXG4gICAgYmFja2Ryb3A6IHRydWUsXG4gICAgaGVpZ2h0QXV0bzogdHJ1ZSxcbiAgICBhbGxvd091dHNpZGVDbGljazogdHJ1ZSxcbiAgICBhbGxvd0VzY2FwZUtleTogdHJ1ZSxcbiAgICBhbGxvd0VudGVyS2V5OiB0cnVlLFxuICAgIHN0b3BLZXlkb3duUHJvcGFnYXRpb246IHRydWUsXG4gICAga2V5ZG93bkxpc3RlbmVyQ2FwdHVyZTogZmFsc2UsXG4gICAgc2hvd0NvbmZpcm1CdXR0b246IHRydWUsXG4gICAgc2hvd0RlbnlCdXR0b246IGZhbHNlLFxuICAgIHNob3dDYW5jZWxCdXR0b246IGZhbHNlLFxuICAgIHByZUNvbmZpcm06IHVuZGVmaW5lZCxcbiAgICBwcmVEZW55OiB1bmRlZmluZWQsXG4gICAgY29uZmlybUJ1dHRvblRleHQ6ICdPSycsXG4gICAgY29uZmlybUJ1dHRvbkFyaWFMYWJlbDogJycsXG4gICAgY29uZmlybUJ1dHRvbkNvbG9yOiB1bmRlZmluZWQsXG4gICAgZGVueUJ1dHRvblRleHQ6ICdObycsXG4gICAgZGVueUJ1dHRvbkFyaWFMYWJlbDogJycsXG4gICAgZGVueUJ1dHRvbkNvbG9yOiB1bmRlZmluZWQsXG4gICAgY2FuY2VsQnV0dG9uVGV4dDogJ0NhbmNlbCcsXG4gICAgY2FuY2VsQnV0dG9uQXJpYUxhYmVsOiAnJyxcbiAgICBjYW5jZWxCdXR0b25Db2xvcjogdW5kZWZpbmVkLFxuICAgIGJ1dHRvbnNTdHlsaW5nOiB0cnVlLFxuICAgIHJldmVyc2VCdXR0b25zOiBmYWxzZSxcbiAgICBmb2N1c0NvbmZpcm06IHRydWUsXG4gICAgZm9jdXNEZW55OiBmYWxzZSxcbiAgICBmb2N1c0NhbmNlbDogZmFsc2UsXG4gICAgc2hvd0Nsb3NlQnV0dG9uOiBmYWxzZSxcbiAgICBjbG9zZUJ1dHRvbkh0bWw6ICcmdGltZXM7JyxcbiAgICBjbG9zZUJ1dHRvbkFyaWFMYWJlbDogJ0Nsb3NlIHRoaXMgZGlhbG9nJyxcbiAgICBsb2FkZXJIdG1sOiAnJyxcbiAgICBzaG93TG9hZGVyT25Db25maXJtOiBmYWxzZSxcbiAgICBzaG93TG9hZGVyT25EZW55OiBmYWxzZSxcbiAgICBpbWFnZVVybDogdW5kZWZpbmVkLFxuICAgIGltYWdlV2lkdGg6IHVuZGVmaW5lZCxcbiAgICBpbWFnZUhlaWdodDogdW5kZWZpbmVkLFxuICAgIGltYWdlQWx0OiAnJyxcbiAgICB0aW1lcjogdW5kZWZpbmVkLFxuICAgIHRpbWVyUHJvZ3Jlc3NCYXI6IGZhbHNlLFxuICAgIHdpZHRoOiB1bmRlZmluZWQsXG4gICAgcGFkZGluZzogdW5kZWZpbmVkLFxuICAgIGJhY2tncm91bmQ6IHVuZGVmaW5lZCxcbiAgICBpbnB1dDogdW5kZWZpbmVkLFxuICAgIGlucHV0UGxhY2Vob2xkZXI6ICcnLFxuICAgIGlucHV0TGFiZWw6ICcnLFxuICAgIGlucHV0VmFsdWU6ICcnLFxuICAgIGlucHV0T3B0aW9uczoge30sXG4gICAgaW5wdXRBdXRvVHJpbTogdHJ1ZSxcbiAgICBpbnB1dEF0dHJpYnV0ZXM6IHt9LFxuICAgIGlucHV0VmFsaWRhdG9yOiB1bmRlZmluZWQsXG4gICAgcmV0dXJuSW5wdXRWYWx1ZU9uRGVueTogZmFsc2UsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2U6IHVuZGVmaW5lZCxcbiAgICBncm93OiBmYWxzZSxcbiAgICBwb3NpdGlvbjogJ2NlbnRlcicsXG4gICAgcHJvZ3Jlc3NTdGVwczogW10sXG4gICAgY3VycmVudFByb2dyZXNzU3RlcDogdW5kZWZpbmVkLFxuICAgIHByb2dyZXNzU3RlcHNEaXN0YW5jZTogdW5kZWZpbmVkLFxuICAgIG9uQmVmb3JlT3BlbjogdW5kZWZpbmVkLFxuICAgIG9uT3BlbjogdW5kZWZpbmVkLFxuICAgIHdpbGxPcGVuOiB1bmRlZmluZWQsXG4gICAgZGlkT3BlbjogdW5kZWZpbmVkLFxuICAgIG9uUmVuZGVyOiB1bmRlZmluZWQsXG4gICAgZGlkUmVuZGVyOiB1bmRlZmluZWQsXG4gICAgb25DbG9zZTogdW5kZWZpbmVkLFxuICAgIG9uQWZ0ZXJDbG9zZTogdW5kZWZpbmVkLFxuICAgIHdpbGxDbG9zZTogdW5kZWZpbmVkLFxuICAgIGRpZENsb3NlOiB1bmRlZmluZWQsXG4gICAgb25EZXN0cm95OiB1bmRlZmluZWQsXG4gICAgZGlkRGVzdHJveTogdW5kZWZpbmVkLFxuICAgIHNjcm9sbGJhclBhZGRpbmc6IHRydWVcbiAgfTtcbiAgdmFyIHVwZGF0YWJsZVBhcmFtcyA9IFsnYWxsb3dFc2NhcGVLZXknLCAnYWxsb3dPdXRzaWRlQ2xpY2snLCAnYmFja2dyb3VuZCcsICdidXR0b25zU3R5bGluZycsICdjYW5jZWxCdXR0b25BcmlhTGFiZWwnLCAnY2FuY2VsQnV0dG9uQ29sb3InLCAnY2FuY2VsQnV0dG9uVGV4dCcsICdjbG9zZUJ1dHRvbkFyaWFMYWJlbCcsICdjbG9zZUJ1dHRvbkh0bWwnLCAnY29uZmlybUJ1dHRvbkFyaWFMYWJlbCcsICdjb25maXJtQnV0dG9uQ29sb3InLCAnY29uZmlybUJ1dHRvblRleHQnLCAnY3VycmVudFByb2dyZXNzU3RlcCcsICdjdXN0b21DbGFzcycsICdkZW55QnV0dG9uQXJpYUxhYmVsJywgJ2RlbnlCdXR0b25Db2xvcicsICdkZW55QnV0dG9uVGV4dCcsICdkaWRDbG9zZScsICdkaWREZXN0cm95JywgJ2Zvb3RlcicsICdoaWRlQ2xhc3MnLCAnaHRtbCcsICdpY29uJywgJ2ljb25Db2xvcicsICdpbWFnZUFsdCcsICdpbWFnZUhlaWdodCcsICdpbWFnZVVybCcsICdpbWFnZVdpZHR
8443oJywgJ29uQWZ0ZXJDbG9zZScsICdvbkNsb3NlJywgJ29uRGVzdHJveScsICdwcm9ncmVzc1N0ZXBzJywgJ3JldmVyc2VCdXR0b25zJywgJ3Nob3dDYW5jZWxCdXR0b24nLCAnc2hvd0Nsb3NlQnV0dG9uJywgJ3Nob3dDb25maXJtQnV0dG9uJywgJ3Nob3dEZW55QnV0dG9uJywgJ3RleHQnLCAndGl0bGUnLCAndGl0bGVUZXh0JywgJ3dpbGxDbG9zZSddO1xuICB2YXIgZGVwcmVjYXRlZFBhcmFtcyA9IHtcbiAgICBhbmltYXRpb246ICdzaG93Q2xhc3NcIiBhbmQgXCJoaWRlQ2xhc3MnLFxuICAgIG9uQmVmb3JlT3BlbjogJ3dpbGxPcGVuJyxcbiAgICBvbk9wZW46ICdkaWRPcGVuJyxcbiAgICBvblJlbmRlcjogJ2RpZFJlbmRlcicsXG4gICAgb25DbG9zZTogJ3dpbGxDbG9zZScsXG4gICAgb25BZnRlckNsb3NlOiAnZGlkQ2xvc2UnLFxuICAgIG9uRGVzdHJveTogJ2RpZERlc3Ryb3knXG4gIH07XG4gIHZhciB0b2FzdEluY29tcGF0aWJsZVBhcmFtcyA9IFsnYWxsb3dPdXRzaWRlQ2xpY2snLCAnYWxsb3dFbnRlcktleScsICdiYWNrZHJvcCcsICdmb2N1c0NvbmZpcm0nLCAnZm9jdXNEZW55JywgJ2ZvY3VzQ2FuY2VsJywgJ2hlaWdodEF1dG8nLCAna2V5ZG93bkxpc3RlbmVyQ2FwdHVyZSddO1xuICAvKipcbiAgICogSXMgdmFsaWQgcGFyYW1ldGVyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbU5hbWVcbiAgICovXG5cbiAgdmFyIGlzVmFsaWRQYXJhbWV0ZXIgPSBmdW5jdGlvbiBpc1ZhbGlkUGFyYW1ldGVyKHBhcmFtTmFtZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVmYXVsdFBhcmFtcywgcGFyYW1OYW1lKTtcbiAgfTtcbiAgLyoqXG4gICAqIElzIHZhbGlkIHBhcmFtZXRlciBmb3IgU3dhbC51cGRhdGUoKSBtZXRob2RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtTmFtZVxuICAgKi9cblxuICB2YXIgaXNVcGRhdGFibGVQYXJhbWV0ZXIgPSBmdW5jdGlvbiBpc1VwZGF0YWJsZVBhcmFtZXRlcihwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gdXBkYXRhYmxlUGFyYW1zLmluZGV4T2YocGFyYW1OYW1lKSAhPT0gLTE7XG4gIH07XG4gIC8qKlxuICAgKiBJcyBkZXByZWNhdGVkIHBhcmFtZXRlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1OYW1lXG4gICAqL1xuXG4gIHZhciBpc0RlcHJlY2F0ZWRQYXJhbWV0ZXIgPSBmdW5jdGlvbiBpc0RlcHJlY2F0ZWRQYXJhbWV0ZXIocGFyYW1OYW1lKSB7XG4gICAgcmV0dXJuIGRlcHJlY2F0ZWRQYXJhbXNbcGFyYW1OYW1lXTtcbiAgfTtcblxuICB2YXIgY2hlY2tJZlBhcmFtSXNWYWxpZCA9IGZ1bmN0aW9uIGNoZWNrSWZQYXJhbUlzVmFsaWQocGFyYW0pIHtcbiAgICBpZiAoIWlzVmFsaWRQYXJhbWV0ZXIocGFyYW0pKSB7XG4gICAgICB3YXJuKFwiVW5rbm93biBwYXJhbWV0ZXIgXFxcIlwiLmNvbmNhdChwYXJhbSwgXCJcXFwiXCIpKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGNoZWNrSWZUb2FzdFBhcmFtSXNWYWxpZCA9IGZ1bmN0aW9uIGNoZWNrSWZUb2FzdFBhcmFtSXNWYWxpZChwYXJhbSkge1xuICAgIGlmICh0b2FzdEluY29tcGF0aWJsZVBhcmFtcy5pbmRleE9mKHBhcmFtKSAhPT0gLTEpIHtcbiAgICAgIHdhcm4oXCJUaGUgcGFyYW1ldGVyIFxcXCJcIi5jb25jYXQocGFyYW0sIFwiXFxcIiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0b2FzdHNcIikpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgY2hlY2tJZlBhcmFtSXNEZXByZWNhdGVkID0gZnVuY3Rpb24gY2hlY2tJZlBhcmFtSXNEZXByZWNhdGVkKHBhcmFtKSB7XG4gICAgaWYgKGlzRGVwcmVjYXRlZFBhcmFtZXRlcihwYXJhbSkpIHtcbiAgICAgIHdhcm5BYm91dERlcHJlY2F0aW9uKHBhcmFtLCBpc0RlcHJlY2F0ZWRQYXJhbWV0ZXIocGFyYW0pKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBTaG93IHJlbGV2YW50IHdhcm5pbmdzIGZvciBnaXZlbiBwYXJhbXNcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cblxuXG4gIHZhciBzaG93V2FybmluZ3NGb3JQYXJhbXMgPSBmdW5jdGlvbiBzaG93V2FybmluZ3NGb3JQYXJhbXMocGFyYW1zKSB7XG4gICAgZm9yICh2YXIgcGFyYW0gaW4gcGFyYW1zKSB7XG4gICAgICBjaGVja0lmUGFyYW1Jc1ZhbGlkKHBhcmFtKTtcblxuICAgICAgaWYgKHBhcmFtcy50b2FzdCkge1xuICAgICAgICBjaGVja0lmVG9hc3RQYXJhbUlzVmFsaWQocGFyYW0pO1xuICAgICAgfVxuXG4gICAgICBjaGVja0lmUGFyYW1Jc0RlcHJlY2F0ZWQocGFyYW0pO1xuICAgIH1cbiAgfTtcblxuXG5cbiAgdmFyIHN0YXRpY01ldGhvZHMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgaXNWYWxpZFBhcmFtZXRlcjogaXNWYWxpZFBhcmFtZXRlcixcbiAgICBpc1VwZGF0YWJsZVBhcmFtZXRlcjogaXNVcGRhdGFibGVQYXJhbWV0ZXIsXG4gICAgaXNEZXByZWNhdGVkUGFyYW1ldGVyOiBpc0RlcHJlY2F0ZWRQYXJhbWV0ZXIsXG4gICAgYXJnc1RvUGFyYW1zOiBhcmdzVG9QYXJhbXMsXG4gICAgaXNWaXNpYmxlOiBpc1Zpc2libGUkMSxcbiAgICBjbGlja0NvbmZpcm06IGNsaWNrQ29uZmlybSxcbiAgICBjbGlja0Rlbnk6IGNsaWNrRGVueSxcbiAgICBjbGlja0NhbmNlbDogY2xpY2tDYW5jZWwsXG4gICAgZ2V0Q29udGFpbmVyOiBnZXRDb250YWluZXIsXG4gICAgZ2V0UG9wdXA6IGdldFBvcHVwLFxuICAgIGdldFRpdGxlOiBnZXRUaXRsZSxcbiAgICBnZXRDb250ZW50OiBnZXRDb250ZW50LFxuICAgIGdldEh0bWxDb250YWluZXI6IGdldEh0bWxDb250YWluZXIsXG4gICAgZ2V0SW1hZ2U6IGdldEltYWdlLFxuICAgIGdldEljb246IGdldEljb24sXG4gICAgZ2V0SWNvbnM6IGdldEljb25zLFxuICAgIGdldElucHV0TGFiZWw6IGdldElucHV0TGFiZWwsXG4gICAgZ2V0Q2xvc2VCdXR0b246IGdldENsb3NlQnV0dG9uLFxuICAgIGdldEFjdGlvbnM6IGdldEFjdGlvbnMsXG4gICAgZ2V0Q29uZmlybUJ1dHRvbjogZ2V0Q29uZmlybUJ1dHRvbixcbiAgICBnZXREZW55QnV0dG9uOiBnZXREZW55QnV0dG9uLFxuICAgIGdldENhbmNlbEJ1dHRvbjogZ2V0Q2FuY2VsQnV0dG9uLFxuICAgIGdldExvYWRlcjogZ2V0TG9hZGVyLFxuICAgIGdldEhlYWRlcjogZ2V0SGVhZGVyLFxuICAgIGdldEZvb3RlcjogZ2V0Rm9vdGVyLFxuICAgIGdldFRpbWVyUHJvZ3Jlc3NCYXI6IGdldFRpbWVyUHJvZ3Jlc3NCYXIsXG4gICAgZ2V0Rm9jdXNhYmxlRWxlbWVudHM6IGdldEZvY3VzYWJsZUVsZW1lbnRzLFxuICAgIGdldFZhbGlkYXRpb25NZXNzYWdlOiBnZXRWYWxpZGF0aW9uTWVzc2FnZSxcbiAgICBpc0xvYWRpbmc6IGlzTG9hZGluZyxcbiAgICBmaXJlOiBmaXJlLFxuICAgIG1peGluOiBtaXhpbixcbiAgICBxdWV1ZTogcXVldWUsXG4gICAgZ2V0UXVldWVTdGVwOiBnZXRRdWV1ZVN0ZXAsXG4gICAgaW5zZXJ0UXVldWVTdGVwOiBpbnNlcnRRdWV1ZVN0ZXAsXG4gICAgZGVsZXRlUXVldWVTdGVwOiBkZWxldGVRdWV1ZVN0ZXAsXG4gICAgc2hvd0xvYWRpbmc6IHNob3dMb2FkaW5nLFxuICAgIGVuYWJsZUxvYWRpbmc6IHNob3dMb2FkaW5nLFxuICAgIGdldFRpbWVyTGVmdDogZ2V0VGltZXJMZWZ0LFxuICAgIHN0b3BUaW1lcjogc3RvcFRpbWVyLFxuICAgIHJlc3VtZVRpbWVyOiByZXN1bWVUaW
84431lcixcbiAgICB0b2dnbGVUaW1lcjogdG9nZ2xlVGltZXIsXG4gICAgaW5jcmVhc2VUaW1lcjogaW5jcmVhc2VUaW1lcixcbiAgICBpc1RpbWVyUnVubmluZzogaXNUaW1lclJ1bm5pbmcsXG4gICAgYmluZENsaWNrSGFuZGxlcjogYmluZENsaWNrSGFuZGxlclxuICB9KTtcblxuICAvKipcbiAgICogSGlkZXMgbG9hZGVyIGFuZCBzaG93cyBiYWNrIHRoZSBidXR0b24gd2hpY2ggd2FzIGhpZGRlbiBieSAuc2hvd0xvYWRpbmcoKVxuICAgKi9cblxuICBmdW5jdGlvbiBoaWRlTG9hZGluZygpIHtcbiAgICAvLyBkbyBub3RoaW5nIGlmIHBvcHVwIGlzIGNsb3NlZFxuICAgIHZhciBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQodGhpcyk7XG5cbiAgICBpZiAoIWlubmVyUGFyYW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGRvbUNhY2hlID0gcHJpdmF0ZVByb3BzLmRvbUNhY2hlLmdldCh0aGlzKTtcbiAgICBoaWRlKGRvbUNhY2hlLmxvYWRlcik7XG4gICAgdmFyIGJ1dHRvblRvUmVwbGFjZSA9IGRvbUNhY2hlLnBvcHVwLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZG9tQ2FjaGUubG9hZGVyLmdldEF0dHJpYnV0ZSgnZGF0YS1idXR0b24tdG8tcmVwbGFjZScpKTtcblxuICAgIGlmIChidXR0b25Ub1JlcGxhY2UubGVuZ3RoKSB7XG4gICAgICBzaG93KGJ1dHRvblRvUmVwbGFjZVswXSwgJ2lubGluZS1ibG9jaycpO1xuICAgIH0gZWxzZSBpZiAoYWxsQnV0dG9uc0FyZUhpZGRlbigpKSB7XG4gICAgICBoaWRlKGRvbUNhY2hlLmFjdGlvbnMpO1xuICAgIH1cblxuICAgIHJlbW92ZUNsYXNzKFtkb21DYWNoZS5wb3B1cCwgZG9tQ2FjaGUuYWN0aW9uc10sIHN3YWxDbGFzc2VzLmxvYWRpbmcpO1xuICAgIGRvbUNhY2hlLnBvcHVwLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1idXN5Jyk7XG4gICAgZG9tQ2FjaGUucG9wdXAucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWxvYWRpbmcnKTtcbiAgICBkb21DYWNoZS5jb25maXJtQnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgZG9tQ2FjaGUuZGVueUJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIGRvbUNhY2hlLmNhbmNlbEJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SW5wdXQkMShpbnN0YW5jZSkge1xuICAgIHZhciBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UgfHwgdGhpcyk7XG4gICAgdmFyIGRvbUNhY2hlID0gcHJpdmF0ZVByb3BzLmRvbUNhY2hlLmdldChpbnN0YW5jZSB8fCB0aGlzKTtcblxuICAgIGlmICghZG9tQ2FjaGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRJbnB1dChkb21DYWNoZS5jb250ZW50LCBpbm5lclBhcmFtcy5pbnB1dCk7XG4gIH1cblxuICB2YXIgZml4U2Nyb2xsYmFyID0gZnVuY3Rpb24gZml4U2Nyb2xsYmFyKCkge1xuICAgIC8vIGZvciBxdWV1ZXMsIGRvIG5vdCBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlXG4gICAgaWYgKHN0YXRlcy5wcmV2aW91c0JvZHlQYWRkaW5nICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBpZiB0aGUgYm9keSBoYXMgb3ZlcmZsb3dcblxuXG4gICAgaWYgKGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0KSB7XG4gICAgICAvLyBhZGQgcGFkZGluZyBzbyB0aGUgY29udGVudCBkb2Vzbid0IHNoaWZ0IGFmdGVyIHJlbW92YWwgb2Ygc2Nyb2xsYmFyXG4gICAgICBzdGF0ZXMucHJldmlvdXNCb2R5UGFkZGluZyA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctcmlnaHQnKSk7XG4gICAgICBkb2
8443N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IFwiXCIuY29uY2F0KHN0YXRlcy5wcmV2aW91c0JvZHlQYWRkaW5nICsgbWVhc3VyZVNjcm9sbGJhcigpLCBcInB4XCIpO1xuICAgIH1cbiAgfTtcbiAgdmFyIHVuZG9TY3JvbGxiYXIgPSBmdW5jdGlvbiB1bmRvU2Nyb2xsYmFyKCkge1xuICAgIGlmIChzdGF0ZXMucHJldmlvdXNCb2R5UGFkZGluZyAhPT0gbnVsbCkge1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBcIlwiLmNvbmNhdChzdGF0ZXMucHJldmlvdXNCb2R5UGFkZGluZywgXCJweFwiKTtcbiAgICAgIHN0YXRlcy5wcmV2aW91c0JvZHlQYWRkaW5nID0gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cblxuICB2YXIgaU9TZml4ID0gZnVuY3Rpb24gaU9TZml4KCkge1xuICAgIHZhciBpT1MgPSAvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhd2luZG93Lk1TU3RyZWFtIHx8IG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ01hY0ludGVsJyAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxO1xuXG4gICAgaWYgKGlPUyAmJiAhaGFzQ2xhc3MoZG9jdW1lbnQuYm9keSwgc3dhbENsYXNzZXMuaW9zZml4KSkge1xuICAgICAgdmFyIG9mZnNldCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS50b3AgPSBcIlwiLmNvbmNhdChvZmZzZXQgKiAtMSwgXCJweFwiKTtcbiAgICAgIGFkZENsYXNzKGRvY3VtZW50LmJvZHksIHN3YWxDbGFzc2VzLmlvc2ZpeCk7XG4gICAgICBsb2NrQm9keVNjcm9sbCgpO1xuICAgICAgYWRkQm90dG9tUGFkZGluZ0ZvclRhbGxQb3B1cHMoKTsgLy8gIzE5NDhcbiAgICB9XG4gIH07XG5cbiAgdmFyIGFkZEJvdHRvbVBhZGRpbmdGb3JUYWxsUG9wdXBzID0gZnVuY3Rpb24gYWRkQm90dG9tUGFkZGluZ0ZvclRhbGxQb3B1cHMoKSB7XG4gICAgdmFyIHNhZmFyaSA9ICFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC8oQ3JpT1N8RnhpT1N8RWRnaU9TfFlhQnJvd3NlcnxVQ0Jyb3dzZXIpL2kpO1xuXG4gICAgaWYgKHNhZmFyaSkge1xuICAgICAgdmFyIGJvdHRvbVBhbmVsSGVpZ2h0ID0gNDQ7XG5cbiAgICAgIGlmIChnZXRQb3B1cCgpLnNjcm9sbEhlaWdodCA+IHdpbmRvdy5pbm5lckhlaWdodCAtIGJvdHRvbVBhbmVsSGVpZ2h0KSB7XG4gICAgICAgIGdldENvbnRhaW5lcigpLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBcIlwiLmNvbmNhdChib3R0b21QYW5lbEhlaWdodCwgXCJweFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFyIGxvY2tCb2R5U2Nyb2xsID0gZnVuY3Rpb24gbG9ja0JvZHlTY3JvbGwoKSB7XG4gICAgLy8gIzEyNDZcbiAgICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7XG4gICAgdmFyIHByZXZlbnRUb3VjaE1vdmU7XG5cbiAgICBjb250YWluZXIub250b3VjaHN0YXJ0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHByZXZlbnRUb3VjaE1vdmUgPSBzaG91bGRQcmV2ZW50VG91Y2hNb3ZlKGUpO1xuICAgIH07XG5cbiAgICBjb250YWluZXIub250b3VjaG1vdmUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHByZXZlbnRUb3VjaE1vdmUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgdmFyIHNob3VsZFByZXZlbnRUb3VjaE1vdmUgPSBmdW5jdGlvbiBzaG91bGRQcmV2ZW50VG91Y2hNb3ZlKGV2ZW50KSB7XG4gICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7XG5cbiAgICBpZiAoaXNTdHlseXMoZXZlbnQpIHx8IGlzWm9vbShldmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGFyZ2V0ID09PSBjb250YWluZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICghaXNTY3JvbGxhYmxlKGNvbnRhaW5lcikgJiYgdGFyZ2V0LnRhZ05hbWUgIT09ICdJTlBVVCcgJiYgLy8gIzE2MDNcbiAgICAhKGlzU2Nyb2xsYWJsZShnZXRDb250ZW50KCkpICYmIC8vICMxOTQ0XG4gICAgZ2V0Q29udGVudCgpLmNvbnRhaW5zKHRhcmdldCkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgdmFyIGlzU3R5bHlzID0gZnVuY3Rpb24gaXNTdHlseXMoZXZlbnQpIHtcbiAgICAvLyAjMTc4NlxuICAgIHJldHVybiBldmVudC50b3VjaGVzICYmIGV2ZW50LnRvdWNoZXMubGVuZ3RoICYmIGV2ZW50LnRvdWNoZXNbMF0udG91Y2hUeXBlID09PSAnc3R5bHVzJztcbiAgfTtcblxuICB2YXIgaXNab29tID0gZnVuY3Rpb24gaXNab29tKGV2ZW50KSB7XG4gICAgLy8gIzE4OTFcbiAgICByZXR1cm4gZXZlbnQudG91Y2hlcyAmJiBldmVudC50b3VjaGVzLmxlbmd0aCA+IDE7XG4gIH07XG5cbiAgdmFyIHVuZG9JT1NmaXggPSBmdW5jdGlvbiB1bmRvSU9TZml4KCkge1xuICAgIGlmIChoYXNDbGFzcyhkb2N1bWVudC5ib2R5LCBzd2FsQ2xhc3Nlcy5pb3NmaXgpKSB7XG4gICAgICB2Y
8443XIgb2Zmc2V0ID0gcGFyc2VJbnQoZG9jdW1lbnQuYm9keS5zdHlsZS50b3AsIDEwKTtcbiAgICAgIHJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIHN3YWxDbGFzc2VzLmlvc2ZpeCk7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnRvcCA9ICcnO1xuICAgICAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSBvZmZzZXQgKiAtMTtcbiAgICB9XG4gIH07XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cblxuICB2YXIgaXNJRTExID0gZnVuY3Rpb24gaXNJRTExKCkge1xuICAgIHJldHVybiAhIXdpbmRvdy5NU0lucHV0TWV0aG9kQ29udGV4dCAmJiAhIWRvY3VtZW50LmRvY3VtZW50TW9kZTtcbiAgfTsgLy8gRml4IElFMTEgY2VudGVyaW5nIHN3ZWV0YWxlcnQyL2lzc3Vlcy85MzNcblxuXG4gIHZhciBmaXhWZXJ0aWNhbFBvc2l0aW9uSUUgPSBmdW5jdGlvbiBmaXhWZXJ0aWNhbFBvc2l0aW9uSUUoKSB7XG4gICAgdmFyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpO1xuICAgIHZhciBwb3B1cCA9IGdldFBvcHVwKCk7XG4gICAgY29udGFpbmVyLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdhbGlnbi1pdGVtcycpO1xuXG4gICAgaWYgKHBvcHVwLm9mZnNldFRvcCA8IDApIHtcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5hbGlnbkl0ZW1zID0gJ2ZsZXgtc3RhcnQnO1xuICAgIH1cbiAgfTtcblxuICB2YXIgSUVmaXggPSBmdW5jdGlvbiBJRWZpeCgpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNJRTExKCkpIHtcbiAgICAgIGZpeFZlcnRpY2FsUG9zaXRpb25JRSgpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZpeFZlcnRpY2FsUG9zaXRpb25JRSk7XG4gICAgfVxuICB9O1xuICB2YXIgdW5kb0lFZml4ID0gZnVuY3Rpb24gdW5kb0lFZml4KCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBpc0lFMTEoKSkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZpeFZlcnRpY2FsUG9zaXRpb25JRSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIEFkZGluZyBhcmlhLWhpZGRlbj1cInRydWVcIiB0byBlbGVtZW50cyBvdXRzaWRlIG9mIHRoZSBhY3RpdmUgbW9kYWwgZGlhbG9nIGVuc3VyZXMgdGhhdFxuICAvLyBlbGVtZW50cyBub3Qgd2l0aGluIHRoZSBhY3RpdmUgbW9kYWwgZGlhbG9nIHdpbGwgbm90IGJlIHN1cmZhY2VkIGlmIGEgdXNlciBvcGVucyBhIHNjcmVlblxuICAvLyByZWFkZXLigJlzIGxpc3Qgb2YgZWxlbWVudHMgKGhlYWRpbmdzLCBmb3JtIGNvbnRyb2xzLCBsYW5kbWFya3MsIGV0Yy4pIGluIHRoZSBkb2N1bWVudC5cblxuICB2YXIgc2V0QXJpYUhpZGRlbiA9IGZ1bmN0aW9uIHNldEFyaWFIaWRkZW4oKSB7XG4gICAgdmFyIGJvZHlDaGlsZHJlbiA9IHRvQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgYm9keUNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgICBpZiAoZWwgPT09IGdldENvbnRhaW5lcigpIHx8IGNvbnRhaW5zKGVsLCBnZXRDb250YWluZXIoKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWwuaGFzQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpKSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbicsIGVsLmdldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKSk7XG4gICAgICB9XG5cbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIH0pO1xuICB9O1xuICB2YXIgdW5zZXRBcmlhSGlkZGVuID0gZnVuY3Rpb24gdW5zZXRBcmlhSGlkZGVuKCkge1xuICAgIHZhciBib2R5Q2hpbGRyZW4gPSB0b0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICAgIGJvZHlDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgICAgaWYgKGVsLmhhc0F0dHJpYnV0ZSgnZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbicpKSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJldmlvdXMtYXJpYS1oaWRkZW4nKSk7XG4gICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIG1vZHVsZSBjb250YWludHMgYFdlYWtNYXBgcyBmb3IgZWFjaCBlZmZlY3RpdmVseS1cInByaXZhdGUgIHByb3BlcnR5XCIgdGhhdCBhIGBTd2FsYCBoYXMuXG4gICAqIEZvciBleGFtcGxlLCB0byBzZXQgdGhlIHByaXZhdGUgcHJvcGVydHkgXCJmb29cIiBvZiBgdGhpc2AgdG8gXCJiYXJcIiwgeW91IGNhbiBgcHJpdmF0ZVByb3BzLmZvby5zZXQodGhpcywgJ2JhcicpYFxuICAgKiBUaGlzIGlzIHRoZSBhcHByb2FjaCB0aGF0IEJhYmVsIHdpbGwgcHJvYmFibHkgdGFrZSB0byBpbXBsZW1lbnQgcHJpdmF0ZSBtZXRob2RzL2ZpZWxkc1xuICAgKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByaXZhdGUtbWV0aG9kc1xuICAgKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJlbC9wdWxsLzc1NTVcbiAgICogT25jZSB3ZSBoYXZlIHRoZSBjaGFuZ2VzIGZyb20gdGhhdCBQUiBpbiBCYWJlbCwgYW5kIG91ciBjb3JlIGNsYXNzIGZpdHMgcmVhc29uYWJsZSBpbiAqb25lIG1vZHVsZSpcbiAgICogICB0aGVuIHdlIGNhbiB1c2UgdGhhdCBsYW5ndWFnZSBmZWF0dXJlLlxuICAgKi9cbiAgdmFyIHByaXZhdGVNZXRob2RzID0ge1xuICAgIHN3YWxQcm9taXNlUmVzb2x2ZTogbmV3IFdlYWtNYXAoKVxuICB9O1xuXG4gIC8qXG4gICAqIEluc3RhbmNlIG1ldGhvZCB0byBjbG9zZSBzd2VldEFsZXJ0XG4gICAqL1xuXG4gIGZ1bmN0aW9uIHJlbW92ZVBvcHVwQW5kUmVzZXRTdGF0ZShpbnN0YW5jZSwgY29udGFpbmVyLCBpc1RvYXN0JCQxLCBkaWRDbG9zZSkge1xuICAgIGlmIChpc1RvYXN0JCQxKSB7XG4gICAgICB0cmlnZ2VyRGlkQ2xvc2VBbmREaXNwb3NlKGluc3RhbmNlLCBkaWRDbG9zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3RvcmVBY3RpdmVFbGVtZW50KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgI
8443HJldHVybiB0cmlnZ2VyRGlkQ2xvc2VBbmREaXNwb3NlKGluc3RhbmNlLCBkaWRDbG9zZSk7XG4gICAgICB9KTtcbiAgICAgIGdsb2JhbFN0YXRlLmtleWRvd25UYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGdsb2JhbFN0YXRlLmtleWRvd25IYW5kbGVyLCB7XG4gICAgICAgIGNhcHR1cmU6IGdsb2JhbFN0YXRlLmtleWRvd25MaXN0ZW5lckNhcHR1cmVcbiAgICAgIH0pO1xuICAgICAgZ2xvYmFsU3RhdGUua2V5ZG93bkhhbmRsZXJBZGRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChjb250YWluZXIucGFyZW50Tm9kZSAmJiAhZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3dhbDItcXVldWUtc3RlcCcpKSB7XG4gICAgICBjb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjb250YWluZXIpO1xuICAgIH1cblxuICAgIGlmIChpc01vZGFsKCkpIHtcbiAgICAgIHVuZG9TY3JvbGxiYXIoKTtcbiAgICAgIHVuZG9JT1NmaXgoKTtcbiAgICAgIHVuZG9JRWZpeCgpO1xuICAgICAgdW5zZXRBcmlhSGlkZGVuKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlQm9keUNsYXNzZXMoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZUJvZHlDbGFzc2VzKCkge1xuICAgIHJlbW92ZUNsYXNzKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGRvY3VtZW50LmJvZHldLCBbc3dhbENsYXNzZXMuc2hvd24sIHN3YWxDbGFzc2VzWydoZWlnaHQtYXV0byddLCBzd2FsQ2xhc3Nlc1snbm8tYmFja2Ryb3AnXSwgc3dhbENsYXNzZXNbJ3RvYXN0LXNob3duJ10sIHN3YWxDbGFzc2VzWy
8443d0b2FzdC1jb2x1bW4nXV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2UocmVzb2x2ZVZhbHVlKSB7XG4gICAgdmFyIHBvcHVwID0gZ2V0UG9wdXAoKTtcblxuICAgIGlmICghcG9wdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXNvbHZlVmFsdWUgPSBwcmVwYXJlUmVzb2x2ZVZhbHVlKHJlc29sdmVWYWx1ZSk7XG4gICAgdmFyIGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldCh0aGlzKTtcblxuICAgIGlmICghaW5uZXJQYXJhbXMgfHwgaGFzQ2xhc3MocG9wdXAsIGlubmVyUGFyYW1zLmhpZGVDbGFzcy5wb3B1cCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc3dhbFByb21pc2VSZXNvbHZlID0gcHJpdmF0ZU1ldGhvZHMuc3dhbFByb21pc2VSZXNvbHZlLmdldCh0aGlzKTtcbiAgICByZW1vdmVDbGFzcyhwb3B1cCwgaW5uZXJQYXJhbXMuc2hvd0NsYXNzLnBvcHVwKTtcbiAgICBhZGRDbGFzcyhwb3B1cCwgaW5uZXJQYXJhbXMuaGlkZUNsYXNzLnBvcHVwKTtcbiAgICB2YXIgYmFja2Ryb3AgPSBnZXRDb250YWluZXIoKTtcbiAgICByZW1vdmVDbGFzcyhiYWNrZHJvcCwgaW5uZXJQYXJhbXMuc2hvd0NsYXNzLmJhY2tkcm9wKTtcbiAgICBhZGRDbGFzcyhiYWNrZHJvcCwgaW5uZXJQYXJhbXMuaGlkZUNsYXNzLmJhY2tkcm9wKTtcbiAgICBoYW5kbGVQb3B1cEFuaW1hdGlvbih0aGlzLCBwb3B1cCwgaW5uZXJQYXJhbXMpOyAvLyBSZXNvbHZlIFN3YWwgcHJvbWlzZVxuXG4gICAgc3dhbFByb21pc2VSZXNvbHZlKHJlc29sdmVWYWx1ZSk7XG4gIH1cblxuICB2YXIgcHJlcGFyZVJlc29sdmVWYWx1ZSA9IGZ1bmN0aW9uIHByZXBhcmVSZXNvbHZlVmFsdWUocmVzb2x2ZVZhbHVlKSB7XG4gICAgLy8gV2hlbiB1c2VyIGNhbGxzIFN3YWwuY2xvc2UoKVxuICAgIGlmICh0eXBlb2YgcmVzb2x2ZVZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNDb25maXJtZWQ6IGZhbHNlLFxuICAgICAgICBpc0RlbmllZDogZmFsc2UsXG4gICAgICAgIGlzRGlzbWlzc2VkOiB0cnVlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICBpc0NvbmZpcm1lZDogZmFsc2UsXG4gICAgICBpc0RlbmllZDogZmFsc2UsXG4gICAgICBpc0Rpc21pc3NlZDogZmFsc2VcbiAgICB9LCByZXNvbHZlVmFsdWUpO1xuICB9O1xuXG4gIHZhciBoYW5kbGVQb3B1cEFuaW1hdGlvbiA9IGZ1bmN0aW9uIGhhbmRsZVBvcHVwQW5pbWF0aW9uKGluc3RhbmNlLCBwb3B1cCwgaW5uZXJQYXJhbXMpIHtcbiAgICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7IC8vIElmIGFuaW1hdGlvbiBpcyBzdXBwb3J0ZWQsIGFuaW1hdGVcblxuICAgIHZhciBhbmltYXRpb25Jc1N1cHBvcnRlZCA9IGFuaW1hdGlvbkVuZEV2ZW50ICYmIGhhc0Nzc0FuaW1hdGlvbihwb3B1cCk7XG4gICAgdmFyIG9uQ2xvc2UgPSBpbm5lclBhcmFtcy5vbkNsb3NlLFxuICAgICAgICBvbkFmdGVyQ2xvc2UgPSBpbm5lclBhcmFtcy5vbkFmdGVyQ2xvc2UsXG4gICAgICAgIHdpbGxDbG9zZSA9IGlubmVyUGFyYW1zLndpbGxDbG9zZSxcbiAgICAgICAgZGlkQ2xvc2UgPSBpbm5lclBhcmFtcy5kaWRDbG9zZTtcbiAgICBydW5EaWRDbG9zZShwb3B1cCwgd2lsbENsb3NlLCBvbkNsb3NlKTtcblxuICAgIGlmIChhbmltYXRpb25Jc1N1cHBvcnRlZCkge1xuICAgICAgYW5pbWF0ZVBvcHVwKGluc3RhbmNlLCBwb3B1cCwgY29udGFpbmVyLCBkaWRDbG9zZSB8fCBvbkFmdGVyQ2xvc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPdGhlcndpc2UsIHJlbW92ZSBpbW1lZGlhdGVseVxuICAgICAgcmVtb3ZlUG9wdXBBbmRSZXNldFN0YXRlKGluc3RhbmNlLCBjb250YWluZXIsIGlzVG9hc3QoKSwgZGlkQ2xvc2UgfHwgb25BZnRlckNsb3NlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHJ1bkRpZENsb3NlID0gZnVuY3Rpb24gcnVuRGlkQ2xvc2UocG9wdXAsIHdpbGxDbG9zZSwgb25DbG9zZSkge1xuICAgIGlmICh3aWxsQ2xvc2UgIT09IG51bGwgJiYgdHlwZW9mIHdpbGxDbG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd2lsbENsb3NlKHBvcHVwKTtcbiAgICB9IGVsc2UgaWYgKG9uQ2xvc2UgIT09IG51bGwgJiYgdHlwZW9mIG9uQ2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9uQ2xvc2UocG9wdXApOyAvLyBAZGVwcmVjYXRlZFxuICAgIH1cbiAgfTtcblxuICB2YXIgYW5pbWF0ZVBvcHVwID0gZnVuY3Rpb24gYW5pbWF0ZVBvcHVwKGluc3RhbmNlLCBwb3B1cCwgY29udGFpbmVyLCBkaWRDbG9zZSkge1xuICAgIGdsb2JhbFN0YXRlLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjayA9IHJlbW92ZVBvcHVwQW5kUmVzZXRTdGF0ZS5iaW5kKG51bGwsIGluc3RhbmNlLCBjb250YWluZXIsIGlzVG9hc3QoKSwgZGlkQ2xvc2UpO1xuICAgIHBvcHVwLmFkZEV2ZW50TGlzdGVuZXIoYW5pbWF0aW9uRW5kRXZlbnQsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZS50YXJnZXQgPT09IHBvcHVwKSB7XG4gICAgICAgIGdsb2JhbFN0YXRlLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjaygpO1xuICAgICAgICBkZWxldGUgZ2xvYmFsU3RhdGUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHZhciB0cmlnZ2VyRGlkQ2xvc2VBbmREaXNwb3NlID0gZnVuY3Rpb24gdHJpZ2dlckRpZENsb3NlQW5kRGlzcG9zZShpbnN0YW5jZSwgZGlkQ2xvc2UpIHtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0eXBlb2YgZGlkQ2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZGlkQ2xvc2UoKTtcbiAgICAgIH1cblxuICAgICAgaW5zdGFuY2UuX2Rlc3Ryb3koKTtcbiAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBzZXRCdXR0b25zRGlzYWJsZWQoaW5zdGFuY2UsIGJ1dHRvbnMsIGRpc2FibGVkKSB7XG4gICAgdmFyIGRvbUNhY2hlID0gcHJpdmF0ZVByb3BzLmRvbUNhY2hlLmdldChpbnN0YW5jZSk7XG4gICAgYnV0dG9ucy5mb3JFYWNoKGZ1bmN0aW9uIChidXR0b24pIHtcbiAgICAgIGRvbUNhY2hlW2J1dHRvbl0uZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldElu
8443cHV0RGlzYWJsZWQoaW5wdXQsIGRpc2FibGVkKSB7XG4gICAgaWYgKCFpbnB1dCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpbnB1dC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICB2YXIgcmFkaW9zQ29udGFpbmVyID0gaW5wdXQucGFyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgICAgdmFyIHJhZGlvcyA9IHJhZGlvc0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhZGlvcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByYWRpb3NbaV0uZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXQuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbmFibGVCdXR0b25zKCkge1xuICAgIHNldEJ1dHRvbnNEaXNhYmxlZCh0aGlzLCBbJ2NvbmZpcm1CdXR0b24nLCAnZGVueUJ1dHRvbicsICdjYW5jZWxCdXR0b24nXSwgZmFsc2UpO1xuICB9XG4gIGZ1bmN0aW9uIGRpc2FibGVCdXR0b25zKCkge1xuICAgIHNldEJ1dHRvbnNEaXNhYmxlZCh0aGlzLCBbJ2NvbmZpcm1CdXR0b24nLCAnZGVueUJ1dHRvbicsICdjYW5jZWxCdXR0b24nXSwgdHJ1ZSk7XG4gIH1cbiAgZnVuY3Rpb24gZW5hYmxlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHNldElucHV0RGlzYWJsZWQodGhpcy5nZXRJbnB1dCgpLCBmYWxzZSk7XG4gIH1cbiAgZnVuY3Rpb24gZGlzYWJsZUlucHV0KCkge1xuICAgIHJldHVybiBzZXRJbnB1dERpc2FibGVkKHRoaXMuZ2V0SW5wdXQoKSwgdHJ1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93VmFsaWRhdGlvbk1lc3NhZ2UoZXJyb3IpIHtcbiAgICB2YXIgZG9tQ2FjaGUgPSBwcml2YXRlUHJvcHMuZG9tQ2FjaGUuZ2V0KHRoaXMpO1xuICAgIHZhciBwYXJhbXMgPSBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpO1xuICAgIHNldElubmVySHRtbChkb21DYWNoZS52YWxpZGF0aW9uTWVzc2FnZSwgZXJyb3IpO1xuICAgIGRvbUNhY2hlLnZhbGlkYXRpb25NZXNzYWdlLmNsYXNzTmFtZSA9IHN3YWxDbGFzc2VzWy
8443d2YWxpZGF0aW9uLW1lc3NhZ2UnXTtcblxuICAgIGlmIChwYXJhbXMuY3VzdG9tQ2xhc3MgJiYgcGFyYW1zLmN1c3RvbUNsYXNzLnZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICBhZGRDbGFzcyhkb21DYWNoZS52YWxpZGF0aW9uTWVzc2FnZSwgcGFyYW1zLmN1c3RvbUNsYXNzLnZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICB9XG5cbiAgICBzaG93KGRvbUNhY2hlLnZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICB2YXIgaW5wdXQgPSB0aGlzLmdldElucHV0KCk7XG5cbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgdHJ1ZSk7XG4gICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkQnknLCBzd2FsQ2xhc3Nlc1sndmFsaWRhdGlvbi1tZXNzYWdlJ10pO1xuICAgICAgZm9jdXNJbnB1dChpbnB1dCk7XG4gICAgICBhZGRDbGFzcyhpbnB1dCwgc3dhbENsYXNzZXMuaW5wdXRlcnJvcik7XG4gICAgfVxuICB9IC8vIEhpZGUgYmxvY2sgd2l0aCB2YWxpZGF0aW9uIG1lc3NhZ2VcblxuICBmdW5jdGlvbiByZXNldFZhbGlkYXRpb25NZXNzYWdlJDEoKSB7XG4gICAgdmFyIGRvbUNhY2hlID0gcHJpdmF0ZVByb3BzLmRvbUNhY2hlLmdldCh0aGlzKTtcblxuICAgIGlmIChkb21DYWNoZS52YWxpZGF0aW9uTWVzc2FnZSkge1xuICAgICAgaGlkZShkb21DYWNoZS52YWxpZGF0aW9uTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdmFyIGlucHV0ID0gdGhpcy5nZXRJbnB1dCgpO1xuXG4gICAgaWYgKGlucHV0KSB7XG4gICAgICBpbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcpO1xuICAgICAgaW5wdXQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZEJ5Jyk7XG4gICAgICByZW1vdmVDbGFzcyhpbnB1dCwgc3dhbENsYXNzZXMuaW5wdXRlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NTdGVwcyQxKCkge1xuICAgIHZhciBkb21DYWNoZSA9IHByaXZhdGVQcm9wcy5kb21
8443DYWNoZS5nZXQodGhpcyk7XG4gICAgcmV0dXJuIGRvbUNhY2hlLnByb2dyZXNzU3RlcHM7XG4gIH1cblxuICB2YXIgVGltZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRpbWVyKGNhbGxiYWNrLCBkZWxheSkge1xuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRpbWVyKTtcblxuICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgdGhpcy5yZW1haW5pbmcgPSBkZWxheTtcbiAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5zdGFydCgpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhUaW1lciwgW3tcbiAgICAgIGtleTogXCJzdGFydFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgICAgICBpZiAoIXRoaXMucnVubmluZykge1xuICAgICAgICAgIHRoaXMucnVubmluZyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zdGFydGVkID0gbmV3IERhdGUoKTtcbiAgICAgICAgICB0aGlzLmlkID0gc2V0VGltZW91dCh0aGlzLmNhbGxiYWNrLCB0aGlzLnJlbWFpbmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZW1haW5pbmc7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcInN0b3BcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5ydW5uaW5nKSB7XG4gICAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaWQpO1xuICAgICAgICAgIHRoaXMucmVtYWluaW5nIC09IG5ldyBEYXRlKCkgLSB0aGlzLnN0YXJ0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZW1haW5pbmc7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImluY3JlYXNlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gaW5jcmVhc2Uobikge1xuICAgICAgICB2Y
8443XIgcnVubmluZyA9IHRoaXMucnVubmluZztcblxuICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1haW5pbmcgKz0gbjtcblxuICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgIHRoaXMuc3RhcnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnJlbWFpbmluZztcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiZ2V0VGltZXJMZWZ0XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VGltZXJMZWZ0KCkge1xuICAgICAgICBpZiAodGhpcy5ydW5uaW5nKSB7XG4gICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgICAgdGhpcy5zdGFydCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVtYWluaW5nO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJpc1J1bm5pbmdcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpc1J1bm5pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJ1bm5pbmc7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIFRpbWVyO1xuICB9KCk7XG5cbiAgdmFyIGRlZmF1bHRJbnB1dFZhbGlkYXRvcnMgPSB7XG4gICAgZW1haWw6IGZ1bmN0aW9uIGVtYWlsKHN0cmluZywgdmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiAvXlthLXpBLVowLTkuK18tXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aMC05LV17MiwyNH0kLy50ZXN0KHN0cmluZykgPyBQcm9taXNlLnJlc29sdmUoKSA6IFByb21pc2UucmVzb2x2ZSh2YWxpZGF0aW9uTWVzc2FnZSB8fCAnSW52YWxpZCBlbWFpbCBhZGRyZXNzJyk7XG4gICAgfSxcbiAgICB1cmw6IGZ1bmN0aW9uIHVybChzdHJpbmcsIHZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAvLyB0YWtlbiBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zODA5NDM1IHdpdGggYSBzbWFsbCBjaGFuZ2UgZnJvbSAjMTMwNiBhbmQgIzIwMTNcbiAgICAgIHJldHVybiAvXmh0dHBzPzpcXC9cXC8od3d3XFwuKT9bLWEtekEtWjAtOUA6JS5fK34jPV17MSwyNTZ9XFwuW2Etel17Miw2M31cXGIoWy1hLXpBLVowLTlAOiVfKy5+Iz8mLz1dKikkLy50ZXN0KHN0cmluZykgPyBQcm9taXNlLnJlc29sdmUoKSA6IFByb21pc2UucmVzb2x2ZSh2YWxpZGF0aW9uTWVzc2FnZSB8fCAnSW52YWxpZCBVUkwnKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gc2V0RGVmYXVsdElucHV0VmFsaWRhdG9ycyhwYXJhbXMpIHtcbiAgICAvLyBVc2UgZGVmYXVsdCBgaW5wdXRWYWxpZGF0b3JgIGZvciBzdXBwb3J0ZWQgaW5wdXQgdHlwZXMgaWYgbm90IHByb3ZpZGVkXG4gICAgaWYgKCFwYXJhbXMuaW5wdXRWYWxpZGF0b3IpIHtcbiAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRJbnB1dFZhbGlkYXRvcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAocGFyYW1zLmlucHV0ID09PSBrZXkpIHtcbiAgICAgICAgICBwYXJhbXMuaW5wdXRWYWxpZGF0b3IgPSBkZWZhdWx0SW5wdXRWYWxpZGF0b3JzW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlQ3VzdG9tVGFyZ2V0RWxlbWVudChwYXJhbXMpIHtcbiAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGN1c3RvbSB0YXJnZXQgZWxlbWVudCBpcyB2YWxpZFxuICAgIGlmICghcGFyYW1zLnRhcmdldCB8fCB0eXBlb2YgcGFyYW1zLnRhcmdldCA9PT0gJ3N0cmluZycgJiYgIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocGFyYW1zLnRhcmdldCkgfHwgdHlwZW9mIHBhcmFtcy50YXJnZXQgIT09ICdzdHJpbmcnICYmICFwYXJhbXMudGFyZ2V0LmFwcGVuZENoaWxkKSB7XG4gICAgICB3YXJuKCdUYXJnZXQgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZCwgZGVmYXVsdGluZyB0byBcImJvZHlcIicpO1xuICAgICAgcGFyYW1zLnRhcmdldCA9ICdib2R5JztcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0eXBlLCB0ZXh0IGFuZCBhY3Rpb25zIG9uIHBvcHVwXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gc2V0UGFyYW1ldGVycyhwYXJhbXMpIHtcbiAgICBzZXREZWZhdWx0SW5wdXRWYWxpZGF0b3JzKHBhcmFtcyk7IC8vIHNob3dMb2FkZXJPbkNvbmZpcm0gJiYgcHJlQ29uZmlybVxuXG4gICAgaWYgKHBhcmFtcy5zaG93TG9hZGVyT25Db25maXJtICYmICFwYXJhbXMucHJlQ29uZmlybSkge1xuICAgICAgd2Fybignc2hvd0xvYWRlck9uQ29uZmlybSBpcyBzZXQgdG8gdHJ1ZSwgYnV0IHByZUNvbmZpcm0gaXMgbm90IGRlZmluZWQuXFxuJyArICdzaG93TG9hZGVyT25Db25maXJtIHNob3VsZCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggcHJlQ29uZmlybSwgc2VlIHVzYWdlIGV4YW1wbGU6XFxuJyArICdodHRwczovL3N3ZWV0YWxlcnQyLmdpdGh1Yi5pby8jYWpheC1yZXF1ZXN0Jyk7XG4gICAgfSAvLyBwYXJhbXMuYW5pbWF0aW9uIHdpbGwgYmUgYWN0dWFsbHkgdXNlZCBpbiByZW5kZXJQb3B1cC5qc1xuICAgIC8vIGJ1dCBpbiBjYXNlIHdoZW4gcGFyYW1zLmFuaW1hdGlvbiBpcyBhIGZ1bmN0aW9uLCB3ZSBuZWVkIHRvIGNhbGwgdGhhdCBmdW5jdGlvblxuICAgIC8vIGJlZm9yZSBwb3B1cCAocmUpaW5pdGlhbGl6YXRpb24sIHNvIGl0J2xsIGJlIHBvc3NpYmxlIHRvIGNoZWNrIFN3YWwuaXNWaXNpYmxlKClcbiAgICAvLyBpbnNpZGUgdGhlIHBhcmFtcy5hbmltYXRpb24gZnVuY3Rpb25cblxuXG4gICAgcGFyYW1zLmFuaW1hdGlvbiA9IGNhbGxJZkZ1bmN0aW9uKHBhcmFtcy5hbmltYXRpb24pO1xuICAgIHZhbGlkYXRlQ3VzdG9tVGFyZ2V0RWxlbWVudChwYXJhbXMpOyAvLyBSZXBsYWNlIG5ld2xpbmVzIHdpdGggPGJyPiBpbiB0aXRsZVxuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMudGl0bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwYXJhbXMudGl0bGUgPSBwYXJhbXMudGl0bGUuc3BsaXQoJ1xcbicpLmpvaW4oJzxiciAvPicpO1xuICAgIH1cblxuICAgIGluaXQocGFyYW1zKTtcbiAgfVxuXG4gIHZhciBzd2FsU3RyaW5nUGFyYW1zID0gWydzd2FsLXRpdGxlJywgJ3N3YWwtaHRtbCcsICdzd2FsLWZvb3RlciddO1xuICB2YXIgZ2V0VGVtcGxhdGVQYXJhbXMgPSBmdW5jdGlvbiBnZXRUZW1wbGF0ZVBhcmFtcyhwYXJhbXMpIHtcbiAgICB2YXIgdGVtcGxhdGUgPSB0eXBlb2YgcGFyYW1zLnRlbXBsYXRlID09PSAnc3RyaW5nJyA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocGFyYW1zLnRlbXBsYXRlKSA6IHBhcmFtcy50ZW1wbGF0ZTtcblxuICAgIGlmICghdGVtcGxhdGUpIHtcbiAgICAgIHJldHVybi
8443B7fTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcGxhdGVDb250ZW50ID0gdGVtcGxhdGUuY29udGVudCB8fCB0ZW1wbGF0ZTsgLy8gSUUxMVxuXG4gICAgc2hvd1dhcm5pbmdzRm9yRWxlbWVudHModGVtcGxhdGVDb250ZW50KTtcblxuICAgIHZhciByZXN1bHQgPSBfZXh0ZW5kcyhnZXRTd2FsUGFyYW1zKHRlbXBsYXRlQ29udGVudCksIGdldFN3YWxCdXR0b25zKHRlbXBsYXRlQ29udGVudCksIGdldFN3YWxJbWFnZSh0ZW1wbGF0ZUNvbnRlbnQpLCBnZXRTd2FsSWNvbih0ZW1wbGF0ZUNvbnRlbnQpLCBnZXRTd2FsSW5wdXQodGVtcGxhdGVDb250ZW50KSwgZ2V0U3dhbFN0cmluZ1BhcmFtcyh0ZW1wbGF0ZUNvbnRlbnQsIHN3YWxTdHJpbmdQYXJhbXMpKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyIGdldFN3YWxQYXJhbXMgPSBmdW5jdGlvbiBnZXRTd2FsUGFyYW1zKHRlbXBsYXRlQ29udGVudCkge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICB0b0FycmF5KHRlbXBsYXRlQ29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdzd2FsLXBhcmFtJykpLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICBzaG93V2FybmluZ3NGb3JBdHRyaWJ1dGVzKHBhcmFtLCBbJ25hbWUnLCAndmFsdWUnXSk7XG4gICAgICB2YXIgcGFyYW1OYW1lID0gcGFyYW0uZ2V0QXR0cmlidXRlKCduYW1lJyk7XG4gICAgICB2YXIgdmFsdWUgPSBwYXJhbS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG5cbiAgICAgIGlmICh0eXBlb2YgZGVmYXVsdFBhcmFtc1twYXJhbU5hbWVdID09PSAnYm9vbGVhbicgJiYgdmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICAgICAgdmFsdWUgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKF90eXBlb2YoZGVmYXVsdFBhcmFtc1twYXJhbU5hbWVdKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFsdWUgPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0W3BhcmFtTmFtZV0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHZhciBnZXRTd2FsQnV0dG9ucyA9IGZ1bmN0aW9uIGdldFN3YWxCdXR0b25zKHRlbXBsYXRlQ29udGVudCkge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICB0b0FycmF5KHRlbXBsYXRlQ29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdzd2FsLWJ1dHRvbicpKS5mb3JFYWNoKGZ1bmN0aW9uIChidXR0b24pIHtcbiAgICAgIHNob3dXYXJuaW5nc0ZvckF0dHJpYnV0ZXMoYnV0dG9uLCBbJ3R5cGUnLCAnY29sb3InLCAnYXJpYS1sYWJlbCddKTtcbiAgICAgIHZhciB0eXBlID0gYnV0dG9uLmdldEF0dHJpYnV0ZSgndHlwZScpO1xuICAgICAgcmVzdWx0W1wiXCIuY29uY2F0KHR5cGUsIFwiQnV0dG9uVGV4dFwiKV0gPSBidXR0b24uaW5uZXJIVE1MO1xuICAgICAgcmVzdWx0W1wic2hvd1wiLmNvbmNhdChjYXBpdGFsaXplRmlyc3RMZXR0ZXIodHlwZSksIFwiQnV0dG9uXCIpXSA9IHRydWU7XG5cbiAgICAgIGlmIChidXR0b24uaGFzQXR0cmlidXRlKCdjb2xvcicpKSB7XG4gICAgICAgIHJlc3VsdFtcIlwiLmNvbmNhdCh0eXBlLCBcIkJ1dHRvbkNvbG9yXCIpXSA9IGJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2NvbG9yJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChidXR0b24uaGFzQXR0cmlidXRlKCdhcmlhLWxhYmVsJykpIHtcbiAgICAgICAgcmVzdWx0W1wiXCIuY29uY2F0KHR5cGUsIFwiQnV0dG9uQXJpYUxhYmVsXCIpXSA9IGJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHZhciBnZXRTd2FsSW1hZ2UgPSBmdW5jdGlvbiBnZXRTd2FsSW1hZ2UodGVtcGxhdGVDb250ZW50KSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHZhciBpbWFnZSA9IHRlbXBsYXRlQ29udGVudC5xdWVyeVNlbGVjdG9yKCdzd2FsLWltYWdlJyk7XG5cbiAgICBpZiAoaW1hZ2UpIHtcbiAgICAgIHNob3dXYXJuaW5nc0ZvckF0dHJpYnV0ZXMoaW1hZ2UsIFsnc3JjJywgJ3dpZHRoJywgJ2hlaWdodCcsICdhbHQnXSk7XG5cbiAgICAgIGlmIChpbWFnZS5oYXNBdHRyaWJ1dGUoJ3NyYycpKSB7XG4gICAgICAgIHJlc3VsdC5pbWFnZVVybCA9IGltYWdlLmdldEF0dHJpYnV0ZSgnc3JjJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbWFnZS5oYXNBdHRyaWJ1dGUoJ3dpZHRoJykpIHtcbiAgICAgICAgcmVzdWx0LmltYWdlV2lkdGggPSBpbWFnZS5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbWFnZS5oYXNBdHRyaWJ1dGUoJ2hlaWdodCcpKSB7XG4gICAgICAgIHJlc3VsdC5pbWFnZUhlaWdodCA9IGltYWdlLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbWFnZS5oYXNBdHRyaWJ1dGUoJ2FsdCcpKSB7XG4gICAgICAgIHJlc3VsdC5pbWFnZUFsdCA9IGltYWdlLmdldEF0dHJpYnV0ZSgnYWx0Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgZ2V0U3dhbEljb24gPSBmdW5jdGlvbiBnZXRTd2FsSWNvbih0ZW1wbGF0ZUNvbnRlbnQpIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgdmFyIGljb24gPSB0ZW1wbGF0ZUNvbnRlbnQucXVlcnlTZWxlY3Rvcignc3dhbC1pY29uJyk7XG5cbiAgICBpZiAoaWNvbikge1xuICAgICAgc2hvd1dhcm5pbmdzRm9yQXR0cmlidXRlcyhpY29uLCBbJ3R5cGUnLCAnY29sb3InXSk7XG5cbiAgICAgIGlmIChpY29uLmhhc0F0dHJpYnV0ZSgndHlwZScpKSB7XG4gICAgICAgIHJlc3VsdC5pY29uID0gaWNvbi5nZXRBdHRyaWJ1dGUoJ3R5cGUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGljb24uaGFzQXR0cmlidXRlKCdjb2xvcicpKSB7XG4gICAgICAgIHJlc3VsdC5pY29uQ29sb3IgPSBpY29uLmdldEF0dHJpYnV0ZSgnY29sb3InKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0Lmljb25IdG1sID0gaWNvbi5pbm5lckhUTUw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgZ2V0U3dhbElucHV0ID0gZnVuY3Rpb24gZ2V0U3dhbElucHV0KHRlbXBsYXRlQ29udGVudCkge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICB2YXIgaW5wdXQgPSB0ZW1wbGF0ZUNvbnRlbnQucXVlcnlTZWxlY3Rvcignc3dhbC1pbnB1dCcpO1xuXG4gICAgaWYgKGlucHV0KSB7XG4gICAgICBzaG93V2FybmluZ3NGb3JBdHRyaWJ1dGVzKGlucHV0LCBbJ3R5cGUnLCAnbGFiZWwnLCAncGxhY2Vob2xkZXInLCAndmFsdWUnXSk7XG4gICAgICByZXN1bHQuaW5wdXQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSB8fCAndGV4dCc7XG5cbiAgICAgIGlmIChpbnB1dC5oYXNBdHRyaWJ1dGUoJ2xhYmVsJykpIHtcbiAgICAgICAgcmVzdWx0LmlucHV0TGFiZWwgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoJ2xhYmVsJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnB1dC5oYXNBdHRyaWJ1dGUoJ3BsYWNlaG9sZG
8443VyJykpIHtcbiAgICAgICAgcmVzdWx0LmlucHV0UGxhY2Vob2xkZXIgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnB1dC5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykpIHtcbiAgICAgICAgcmVzdWx0LmlucHV0VmFsdWUgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGlucHV0T3B0aW9ucyA9IHRlbXBsYXRlQ29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdzd2FsLWlucHV0LW9wdGlvbicpO1xuXG4gICAgaWYgKGlucHV0T3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdC5pbnB1dE9wdGlvbnMgPSB7fTtcbiAgICAgIHRvQXJyYXkoaW5wdXRPcHRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgc2hvd1dhcm5pbmdzRm9yQXR0cmlidXRlcyhvcHRpb24sIFsndmFsdWUnXSk7XG4gICAgICAgIHZhciBvcHRpb25WYWx1ZSA9IG9wdGlvbi5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgICAgIHZhciBvcHRpb25OYW1lID0gb3B0aW9uLmlubmVySFRNTDtcbiAgICAgICAgcmVzdWx0LmlucHV0T3B0aW9uc1tvcHRpb25WYWx1ZV0gPSBvcHRpb25OYW1lO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgZ2V0U3dhbFN0cmluZ1BhcmFtcyA9IGZ1bmN0aW9uIGdldFN3YWxTdHJpbmdQYXJhbXModGVtcGxhdGVDb250ZW50LCBwYXJhbU5hbWVzKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSBpbiBwYXJhbU5hbWVzKSB7XG4gICAgICB2Y
8443XIgcGFyYW1OYW1lID0gcGFyYW1OYW1lc1tpXTtcbiAgICAgIHZhciB0YWcgPSB0ZW1wbGF0ZUNvbnRlbnQucXVlcnlTZWxlY3RvcihwYXJhbU5hbWUpO1xuXG4gICAgICBpZiAodGFnKSB7XG4gICAgICAgIHNob3dXYXJuaW5nc0ZvckF0dHJpYnV0ZXModGFnLCBbXSk7XG4gICAgICAgIHJlc3VsdFtwYXJhbU5hbWUucmVwbGFjZSgvXnN3YWwtLywgJycpXSA9IHRhZy5pbm5lckhUTUw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgc2hvd1dhcm5pbmdzRm9yRWxlbWVudHMgPSBmdW5jdGlvbiBzaG93V2FybmluZ3NGb3JFbGVtZW50cyh0ZW1wbGF0ZSkge1xuICAgIHZhciBhbGxvd2VkRWxlbWVudHMgPSBzd2FsU3RyaW5nUGFyYW1zLmNvbmNhdChbJ3N3YWwtcGFyYW0nLCAnc3dhbC1idXR0b24nLCAnc3dhbC1pbWFnZScsICdzd2FsLWljb24nLCAnc3dhbC1pbnB1dCcsICdzd2FsLWlucHV0LW9wdGlvbiddKTtcbiAgICB0b0FycmF5KHRlbXBsYXRlLnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSkuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcbiAgICAgIGlmIChlbC5wYXJlbnROb2RlICE9PSB0ZW1wbGF0ZSkge1xuICAgICAgICAvLyBjYW4ndCB1c2UgdGVtcGxhdGUuY2hpbGRyZW4gYmVjYXVzZSBvZiBJRTExXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHRhZ05hbWUgPSBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmIChhbGxvd2VkRWxlbWVudHMuaW5kZXhPZih0YWdOYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgd2FybihcIlVucmVjb2duaXplZCBlbGVtZW50IDxcIi5jb25jYXQodGFnTmFtZSwgXCI+XCIpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICB2YXIgc2hvd1dhcm5pbmdzRm9yQXR0cmlidXRlcyA9IGZ1bmN0aW9uIHNob3dXYXJuaW5nc0ZvckF0dHJpYnV0ZXMoZWwsIGFsbG93ZWRBdHRyaWJ1dGVzKSB7XG4gICAgdG9BcnJheShlbC5hdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgIGlmIChhbGxvd2VkQXR0cmlidXRlcy5pbmRleE9mKGF0dHJpYnV0ZS5uYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgd2FybihbXCJVbnJlY29nbml6ZWQgYXR0cmlidXRlIFxcXCJcIi5jb25jYXQoYXR0cmlidXRlLm5hbWUsIFwiXFxcIiBvbiA8XCIpLmNvbmNhdChlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCksIFwiPi5cIiksIFwiXCIuY29uY2F0KGFsbG93ZWRBdHRyaWJ1dGVzLmxlbmd0aCA/IFwiQWxsb3dlZCBhdHRyaWJ1dGVzIGFyZTogXCIuY29uY2F0KGFsbG93ZWRBdHRyaWJ1dGVzLmpvaW4oJywgJykpIDogJ1RvIHNldCB0aGUgdmFsdWUsIHVzZSBIVE1MIHdpdGhpbiB0aGUgZWxlbWVudC4nKV0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHZhciBTSE9XX0NMQVNTX1RJTUVPVVQgPSAxMDtcbiAgLyoqXG4gICAqIE9wZW4gcG9wdXAsIGFkZCBuZWNlc3NhcnkgY2xhc3NlcyBhbmQgc3R5bGVzLCBmaXggc2Nyb2xsYmFyXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG5cbiAgdmFyIG9wZW5Qb3B1cCA9IGZ1bmN0aW9uIG9wZW5Qb3B1cChwYXJhbXMpIHtcbiAgICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7XG4gICAgdmFyIHBvcHVwID0gZ2V0UG9wdXAoKTtcblxuICAgIGlmICh0eXBlb2YgcGFyYW1zLndpbGxPcGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwYXJhbXMud2lsbE9wZW4ocG9wdXApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtcy5vbkJlZm9yZU9wZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBhcmFtcy5vbkJlZm9yZU9wZW4ocG9wdXApOyAvLyBAZGVwcmVjYXRlZFxuICAgIH1cblxuICAgIHZhciBib2R5U3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSk7XG4gICAgdmFyIGluaXRpYWxCb2R5T3ZlcmZsb3cgPSBib2R5U3R5bGVzLm92ZXJmbG93WTtcbiAgICBhZGRDbGFzc2VzJDEoY29udGFpbmVyLCBwb3B1cCwgcGFyYW1zKTsgLy8gc2Nyb2xsaW5nIGlzICdoaWRkZW4nIHVudGlsIGFuaW1hdGlvbiBpcyBkb25lLCBhZnRlciB0aGF0ICdhdXRvJ1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRTY3JvbGxpbmdWaXNpYmlsaXR5KGNvbnRhaW5lciwgcG9wdXApO1xuICAgIH0sIFNIT1dfQ0xBU1NfVElNRU9VVCk7XG5cbiAgICBpZiAoaXNNb2RhbCgpKSB7XG4gICAgICBmaXhTY3JvbGxDb250YWluZXIoY29udGFpbmVyLCBwYXJhbXMuc2Nyb2xsYmFyUGFkZGluZywgaW5pdGlhbEJvZHlPdmVyZmxvdyk7XG4gICAgICBzZXRBcmlhSGlkZGVuKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1RvYXN0KCkgJiYgIWdsb2JhbFN0YXRlLnByZXZpb3VzQWN0aXZlRWxlbWVudCkge1xuICAgICAgZ2xvYmFsU3RhdGUucHJldmlvdXNBY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBydW5EaWRPcGVuKHBvcHVwLCBwYXJhbXMpO1xuICAgIHJlbW92ZUNsYXNzKGNvbnRhaW5lciwgc3dhbENsYXNzZXNbJ25vLXRyYW5zaXRpb24nXSk7XG4gIH07XG5cbiAgdmFyIHJ1bkRpZE9wZW4gPSBmdW5jdGlvbiBydW5EaWRPcGVuKHBvcHVwLCBwYXJhbXMpIHtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5kaWRPcGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtcy5kaWRPcGVuKHBvcHVwKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtcy5vbk9wZW4gPT
844309ICdmdW5jdGlvbicpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcGFyYW1zLm9uT3Blbihwb3B1cCk7XG4gICAgICB9KTsgLy8gQGRlcHJlY2F0ZWRcbiAgICB9XG4gIH07XG5cbiAgdmFyIHN3YWxPcGVuQW5pbWF0aW9uRmluaXNoZWQgPSBmdW5jdGlvbiBzd2FsT3BlbkFuaW1hdGlvbkZpbmlzaGVkKGV2ZW50KSB7XG4gICAgdmFyIHBvcHVwID0gZ2V0UG9wdXAoKTtcblxuICAgIGlmIChldmVudC50YXJnZXQgIT09IHBvcHVwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpO1xuICAgIHBvcHVwLnJlbW92ZUV2ZW50TGlzdGVuZXIoYW5pbWF0aW9uRW5kRXZlbnQsIHN3YWxPcGVuQW5pbWF0aW9uRmluaXNoZWQpO1xuICAgIGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvd1kgPSAnYXV0byc7XG4gIH07XG5cbiAgdmFyIHNldFNjcm9sbGluZ1Zpc2liaWxpdHkgPSBmdW5jdGlvbiBzZXRTY3JvbGxpbmdWaXNpYmlsaXR5KGNvbnRhaW5lciwgcG9wdXApIHtcbiAgICBpZiAoYW5pbWF0aW9uRW5kRXZlbnQgJiYgaGFzQ3NzQW5pbWF0aW9uKHBvcHVwKSkge1xuICAgICAgY29udGFpbmVyLnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuICAgICAgcG9wdXAuYWRkRXZlbnRMaXN0ZW5lcihhbmltYXRpb25FbmRFdmVudCwgc3dhbE9wZW5BbmltYXRpb25GaW5pc2hlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvd1kgPSAnYXV0byc7XG4gICAgfVxuICB9O1xuXG4gIHZhciBmaXhTY3JvbGxDb250YWluZXIgPSBmdW5jdGlvbiBmaXhTY3JvbGxDb250YWluZXIoY29udGFpbmVyLCBzY3JvbGxiYXJQYWRkaW5nLCBpbml0aWFsQm9keU92ZXJmbG93KSB7XG4gICAgaU9TZml4KCk7XG4gICAgSUVmaXgoKTtcblxuICAgIGlmIChzY3JvbGxiYXJQYWRkaW5nICYmIGluaXRpYWxCb2R5T3ZlcmZsb3cgIT09ICdoaWRkZW4nKSB7XG4gICAgICBmaXhTY3JvbGxiYXIoKTtcbiAgICB9IC8vIHN3ZWV0YWxlcnQyL2lzc3Vlcy8xMjQ3XG5cblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCA9IDA7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGFkZENsYXNzZXMkMSA9IGZ1bmN0aW9uIGFkZENsYXNzZXMoY29udGFpbmVyLCBwb3B1cCwgcGFyYW1zKSB7XG4gICAgYWRkQ2xhc3MoY29udGFpbmVyLCBwYXJhbXMuc2hvd0NsYXNzLmJhY2tkcm9wKTsgLy8gdGhlIHdvcmthcm91bmQgd2l0aCBzZXR0aW5nL3Vuc2V0dGluZyBvcGFjaXR5IGlzIG5lZWRlZCBmb3IgIzIwMTkgYW5kIDIwNTlcblxuICAgIHBvcHVwLnN0eWxlLnNldFByb3BlcnR5KCdvcGFjaXR5JywgJzAnLCAnaW1wb3J0YW50Jyk7XG4gICAgc2hvdyhwb3B1cCk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBBbmltYXRlIHBvcHVwIHJpZ2h0IGFmdGVyIHNob3dpbmcgaXRcbiAgICAgIGFkZENsYXNzKHBvcHVwLCBwYXJhbXMuc2hvd0NsYXNzLnBvcHVwKTsgLy8gYW5kIHJlbW92ZSB0aGUgb3BhY2l0eSB3b3JrYXJvdW5kXG5cbiAgICAgIHBvcHVwLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdvcGFjaXR5Jyk7XG4gICAgfSwgU0hPV19DTEFTU19USU1FT1VUKTsgLy8gMTBtcyBpbiBvcmRlciB0byBmaXggIzIwNjJcblxuICAgIGFkZENsYXNzKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGRvY3VtZW50LmJvZHldLCBzd2FsQ2xhc3Nlcy5zaG93bik7XG5cbiAgICBpZiAocGFyYW1zLmhlaWdodEF1dG8gJiYgcGFyYW1zLmJhY2tkcm9wICYmICFwYXJhbXMudG9hc3QpIHtcbiAgICAgIGFkZENsYXNzKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGRvY3VtZW50LmJvZHldLCBzd2FsQ2xhc3Nlc1snaGVpZ2h0LWF1dG8nXSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVJbnB1dE9wdGlvbnNBbmRWYWx1ZSA9IGZ1bmN0aW9uIGhhbmRsZUlucHV0T3B0aW9uc0FuZFZhbHVlKGluc3RhbmNlLCBwYXJhbXMpIHtcbiAgICBpZiAocGFyYW1zLmlucHV0ID09PSAnc2VsZWN0JyB8fCBwYXJhbXMuaW5wdXQgPT09ICdyYWRpbycpIHtcbiAgICAgIGhhbmRsZUlucHV0T3B0aW9ucyhpbnN0YW5jZSwgcGFyYW1zKTtcbiAgICB9IGVsc2UgaWYgKFsndGV4dCcsICdlbWFpbCcsICdudW1iZXInLCAndGVsJywgJ3RleHRhcmVhJ10uaW5kZXhPZihwYXJhbXMuaW5wdXQpICE9PSAtMSAmJiAoaGFzVG9Qcm9taXNlRm4ocGFyYW1zLmlucHV0VmFsdWUpIHx8IGlzUHJvbWlzZShwYXJhbXMuaW5wdXRWYWx1ZSkpKSB7XG4gICAgICBoYW5kbGVJbnB1dFZhbHVlKGluc3RhbmNlLCBwYXJhbXMpO1xuICAgIH1cbiAgfTtcbiAgdmFyIGdldElucHV0VmFsdWUgPSBmdW5jdGlvbiBnZXRJbnB1dFZhbHVlKGluc3RhbmNlLCBpbm5lclBhcmFtcykge1xuICAgIHZhciBpbnB1dCA9IGluc3RhbmNlLmdldElucHV0KCk7XG5cbiAgICBpZiAoIWlucHV0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGlubmVyUGFyYW1zLmlucHV0KSB7XG4gICAgICBjYXNlICdjaGVja2JveCc6XG4gICAgICAgIHJldHVybiBnZXRDaGVja2JveFZhbHVlKGlucHV0KTtcblxuICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICByZXR1cm4gZ2V0UmFkaW9WYWx1ZShpbnB1dCk7XG5cbiAgICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgICByZXR1cm4gZ2V0RmlsZVZhbHVlKGlucHV0KTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGlubmVyUGFyYW1zLmlucHV0QXV0b1RyaW0gPyBpbnB1dC52YWx1ZS50cmltKCkgOiBpbnB1dC52YWx1ZTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGdldENoZWNrYm94VmFsdWUgPSBmdW5jdGlvbiBnZXRDaGVja2JveFZhbHVlKGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0LmNoZWNrZWQgPyAxIDogMDtcbiAgfTtcblxuICB2YXIgZ2V0UmFkaW9WYWx1ZSA9IGZ1bmN0aW9uIGdldFJhZGlvVmFsdWUoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQuY2hlY2tlZCA/IGlucHV0LnZhbHVlIDogbnVsbDtcbiAgfTtcblxuICB2YXIgZ2V0RmlsZVZhbHVlID0gZnVuY3Rpb24gZ2V0RmlsZVZhbHVlKGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0LmZpbGVzLmxlbmd0aCA/IGlucHV0LmdldEF0dHJpYnV0ZSgnbXVsdGlwbGUnKSAhPT0gbnVsbCA/IGlucHV0LmZpbGVzIDogaW5wdXQuZmlsZXNbMF0gOiBudWxsO1xuICB9O1xuXG4gIHZhciBoYW5kbGVJbnB1dE9wdGlvbnMgPSBmdW5jdGlvbiBoYW5kbGVJbnB1dE9wdGlvbnMoaW5zdGFuY2UsIHBhcmFtcykge1xuICAgIHZhciBjb250ZW50ID0gZ2V0Q29udGVudCgpO1xuXG4gICAgdmFyIHByb2Nlc3NJbnB1dE9wdGlvbnMgPSBmdW5jdGlvbiBwcm9jZXNzSW5wdXRPcHRpb25zKGlucHV0T3B0aW9ucykge1xuICAgICAgcmV0dXJuIHBvcHVsYXRlSW5wdXRPcHRpb25zW3BhcmFtcy5pbnB1dF0oY29udGVudCwgZm9ybWF0SW5wdXRPcHRpb25zKGlucHV0T3B0aW9ucyksIHBhcmFtcyk7XG4gICAgfTtcblxuICAgIGlmIChoYXNUb1Byb21pc2VGbihwYXJhbXMuaW5wdXRPcHRpb25zKSB8fCBpc1Byb21pc2UocGFyYW1zLmlucHV0T3B0aW9ucykpIHtcbiAgICAgIHNob3dMb2FkaW5nKCk7XG4gICAgICBhc1Byb21pc2UocGFyYW1zLmlucHV0T3B0aW9ucykudGhlbihmdW5jdGlvbiAoaW5wdXRPcHRpb25zKSB7XG4gICAgICAgIGluc3RhbmNlLmhpZGVMb2FkaW5nKCk7XG4gICAgICAgI
8443HByb2Nlc3NJbnB1dE9wdGlvbnMoaW5wdXRPcHRpb25zKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoX3R5cGVvZihwYXJhbXMuaW5wdXRPcHRpb25zKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHByb2Nlc3NJbnB1dE9wdGlvbnMocGFyYW1zLmlucHV0T3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yKFwiVW5leHBlY3RlZCB0eXBlIG9mIGlucHV0T3B0aW9ucyEgRXhwZWN0ZWQgb2JqZWN0LCBNYXAgb3IgUHJvbWlzZSwgZ290IFwiLmNvbmNhdChfdHlwZW9mKHBhcmFtcy5pbnB1dE9wdGlvbnMpKSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVJbnB1dFZhbHVlID0gZnVuY3Rpb24gaGFuZGxlSW5wdXRWYWx1ZShpbnN0YW5jZSwgcGFyYW1zKSB7XG4gICAgdmFyIGlucHV0ID0gaW5zdGFuY2UuZ2V0SW5wdXQoKTtcbiAgICBoaWRlKGlucHV0KTtcbiAgICBhc1Byb21pc2UocGFyYW1zLmlucHV0VmFsdWUpLnRoZW4oZnVuY3Rpb24gKGlucHV0VmFsdWUpIHtcbiAgICAgIGlucHV0LnZhbHVlID0gcGFyYW1zLmlucHV0ID09PSAnbnVtYmVyJyA/IHBhcnNlRmxvYXQoaW5wdXRWYWx1ZSkgfHwgMCA6IFwiXCIuY29uY2F0KGlucHV0VmFsdWUpO1xuICAgICAgc2hvdyhpbnB1dCk7XG4gICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgaW5zdGFuY2UuaGlkZUxvYWRpbmcoKTtcbiAgICB9KVtcImNhdGNoXCJdKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGVycm9yKFwiRXJyb3IgaW4gaW5wdXRWYWx1ZSBwcm9taXNlOiBcIi5jb25jYXQoZXJyKSk7XG4gICAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgc2hvdyhpbnB1dCk7XG4gICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgaW5zdGFuY2UuaGlkZUxvYWRpbmcoKTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgcG9wdWxhdGVJbnB1dE9wdGlvbnMgPSB7XG4gICAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QoY29udGVudCwgaW5wdXRPcHRpb25zLCBwYXJhbXMpIHtcbiAgICAgIHZhciBzZWxlY3QgPSBnZXRDaGlsZEJ5Q2xhc3MoY29udGVudCwgc3dhbENsYXNzZXMuc2VsZWN0KTtcblxuICAgICAgdmFyIHJlbmRlck9wdGlvbiA9IGZ1bmN0aW9uIHJlbmRlck9wdGlvbihwYXJlbnQsIG9wdGlvbkxhYmVsLCBvcHRpb25WYWx1ZSkge1xuICAgICAgICB2Y
8443XIgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICAgIG9wdGlvbi52YWx1ZSA9IG9wdGlvblZhbHVlO1xuICAgICAgICBzZXRJbm5lckh0bWwob3B0aW9uLCBvcHRpb25MYWJlbCk7XG4gICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IGlzU2VsZWN0ZWQob3B0aW9uVmFsdWUsIHBhcmFtcy5pbnB1dFZhbHVlKTtcbiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKG9wdGlvbik7XG4gICAgICB9O1xuXG4gICAgICBpbnB1dE9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoaW5wdXRPcHRpb24pIHtcbiAgICAgICAgdmFyIG9wdGlvblZhbHVlID0gaW5wdXRPcHRpb25bMF07XG4gICAgICAgIHZhciBvcHRpb25MYWJlbCA9IGlucHV0T3B0aW9uWzFdOyAvLyA8b3B0Z3JvdXA+IHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxL2ludGVyYWN0L2Zvcm1zLmh0bWwjaC0xNy42XG4gICAgICAgIC8vIFwiLi4uYWxsIE9QVEdST1VQIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGRpcmVjdGx5IHdpdGhpbiBhIFNFTEVDVCBlbGVtZW50IChpLmUuLCBncm91cHMgbWF5IG5vdCBiZSBuZXN0ZWQpLi4uXCJcbiAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGlzIGlzIGEgPG9wdGdyb3VwPlxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbkxhYmVsKSkge1xuICAgICAgICAgIC8vIGlmIGl0IGlzIGFuIGFycmF5LCB0aGVuIGl0IGlzIGFuIDxvcHRncm91cD5cbiAgICAgICAgICB2YXIgb3B0Z3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRncm91cCcpO1xuICAgICAgICAgIG9wdGdyb3VwLmxhYmVsID0gb3B0aW9uVmFsdWU7XG4gICAgICAgICAgb3B0Z3JvdXAuZGlzYWJsZWQgPSBmYWxzZTsgLy8gbm90IGNvbmZpZ3VyYWJsZSBmb3Igbm93XG5cbiAgICAgICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQob3B0Z3JvdXApO1xuICAgICAgICAgIG9wdGlvbkxhYmVsLmZvckVhY2goZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIHJldHVybiByZW5kZXJPcHRpb24ob3B0Z3JvdXAsIG9bMV0sIG9bMF0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGNhc2Ugb2YgPG9wdGlvbj5cbiAgICAgICAgICByZW5kZXJPcHRpb24oc2VsZWN0LCBvcHRpb25MYWJlbCwgb3B0aW9uVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHNlbGVjdC5mb2N1cygpO1xuICAgIH0sXG4gICAgcmFkaW86IGZ1bmN0aW9uIHJhZGlvKGNvbnRlbnQsIGlucHV0T3B0aW9ucywgcGFyYW1zKSB7XG4gICAgICB2Y
8443XIgcmFkaW8gPSBnZXRDaGlsZEJ5Q2xhc3MoY29udGVudCwgc3dhbENsYXNzZXMucmFkaW8pO1xuICAgICAgaW5wdXRPcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKGlucHV0T3B0aW9uKSB7XG4gICAgICAgIHZhciByYWRpb1ZhbHVlID0gaW5wdXRPcHRpb25bMF07XG4gICAgICAgIHZhciByYWRpb0xhYmVsID0gaW5wdXRPcHRpb25bMV07XG4gICAgICAgIHZhciByYWRpb0lucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgdmFyIHJhZGlvTGFiZWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICAgICAgcmFkaW9JbnB1dC50eXBlID0gJ3JhZGlvJztcbiAgICAgICAgcmFkaW9JbnB1dC5uYW1lID0gc3dhbENsYXNzZXMucmFkaW87XG4gICAgICAgIHJhZGlvSW5wdXQudmFsdWUgPSByYWRpb1ZhbHVlO1xuXG4gICAgICAgIGlmIChpc1NlbGVjdGVkKHJhZGlvVmFsdWUsIHBhcmFtcy5pbnB1dFZhbHVlKSkge1xuICAgICAgICAgIHJhZGlvSW5wdXQuY2hlY2tlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIHNldElubmVySHRtbChsYWJlbCwgcmFkaW9MYWJlbCk7XG4gICAgICAgIGxhYmVsLmNsYXNzTmFtZSA9IHN3YWxDbGFzc2VzLmxhYmVsO1xuICAgICAgICByYWRpb0xhYmVsRWxlbWVudC5hcHBlbmRDaGlsZChyYWRpb0lucHV0KTtcbiAgICAgICAgcmFkaW9MYWJlbEVsZW1lbnQuYXBwZW5kQ2hpbGQobGFiZWwpO1xuICAgICAgICByYWRpby5hcHBlbmRDaGlsZChyYWRpb0xhYmVsRWxlbWVudCk7XG4gICAgICB9KTtcbiAgICAgIHZhciByYWRpb3MgPSByYWRpby5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpO1xuXG4gICAgICBpZiAocmFkaW9zLmxlbmd0aCkge1xuICAgICAgICByYWRpb3NbMF0uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgaW5wdXRPcHRpb25zYCBpbnRvIGFuIGFycmF5IG9mIGBbdmFsdWUsIGxhYmVsXWBzXG4gICAqIEBwYXJhbSBpbnB1dE9wdGlvbnNcbiAgICovXG5cbiAgdmFyIGZvcm1hdElucHV0T3B0aW9ucyA9IGZ1bmN0aW9uIGZvcm1hdElucHV0T3B0aW9ucyhpbnB1dE9wdGlvbnMpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICBpZiAodHlwZW9mIE1hcCAhPT0gJ3VuZGVmaW5lZCcgJiYgaW5wdXRPcHRpb25zIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICBpbnB1dE9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICB2Y
8443XIgdmFsdWVGb3JtYXR0ZWQgPSB2YWx1ZTtcblxuICAgICAgICBpZiAoX3R5cGVvZih2YWx1ZUZvcm1hdHRlZCkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgLy8gY2FzZSBvZiA8b3B0Z3JvdXA+XG4gICAgICAgICAgdmFsdWVGb3JtYXR0ZWQgPSBmb3JtYXRJbnB1dE9wdGlvbnModmFsdWVGb3JtYXR0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LnB1c2goW2tleSwgdmFsdWVGb3JtYXR0ZWRdKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBPYmplY3Qua2V5cyhpbnB1dE9wdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdmFsdWVGb3JtYXR0ZWQgPSBpbnB1dE9wdGlvbnNba2V5XTtcblxuICAgICAgICBpZiAoX3R5cGVvZih2YWx1ZUZvcm1hdHRlZCkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgLy8gY2FzZSBvZiA8b3B0Z3JvdXA+XG4gICAgICAgICAgdmFsdWVGb3JtYXR0ZWQgPSBmb3JtYXRJbnB1dE9wdGlvbnModmFsdWVGb3JtYXR0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LnB1c2goW2tleSwgdmFsdWVGb3JtYXR0ZWRdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyIGlzU2VsZWN0ZWQgPSBmdW5jdGlvbiBpc1NlbGVjdGVkKG9wdGlvblZhbHVlLCBpbnB1dFZhbHVlKSB7XG4gICAgcmV0dXJuIGlucHV0VmFsdWUgJiYgaW5wdXRWYWx1ZS50b1N0cmluZygpID09PSBvcHRpb25WYWx1ZS50b1N0cmluZygpO1xuICB9O1xuXG4gIHZhciBoYW5kbGVDb25maXJtQnV0dG9uQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDb25maXJtQnV0dG9uQ2xpY2soaW5zdGFuY2UsIGlubmVyUGFyYW1zKSB7XG4gICAgaW5zdGFuY2UuZGlzYWJsZUJ1dHRvbnMoKTtcblxuICAgIGlmIChpbm5lclBhcmFtcy5pbnB1dCkge1xuICAgICAgaGFuZGxlQ29uZmlybU9yRGVueVdpdGhJbnB1dChpbnN0YW5jZSwgaW5uZXJQYXJhbXMsICdjb25maXJtJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZpcm0oaW5zdGFuY2UsIGlubmVyUGFyYW1zLCB0cnVlKTtcbiAgICB9XG4gIH07XG4gIHZhciBoYW5kbGVEZW55QnV0dG9uQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVEZW55QnV0dG9uQ2xpY2soaW5zdGFuY2UsIGlubmVyUGFyYW1zKSB7XG4gICAgaW5zdGFuY2UuZGlzYWJsZUJ1dHRvbnMoKTtcblxuICAgIGlmIChpbm5lclBhcmFtcy5yZXR1cm5JbnB1dFZhbHVlT25EZW55KSB7XG4gICAgICBoYW5kbGVDb25maXJtT3JEZW55V2l0aElucHV0KGluc3RhbmNlLCBpbm5lclBhcmFtcywgJ2RlbnknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVueShpbnN0YW5jZSwgaW5uZXJQYXJhbXMsIGZhbHNlKTtcbiAgICB9XG4gIH07XG4gIHZhciBoYW5kbGVDYW5jZWxCdXR0b25DbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNhbmNlbEJ1dHRvbkNsaWNrKGluc3RhbmNlLCBkaXNtaXNzV2l0aCkge1xuICAgIGluc3RhbmNlLmRpc2FibGVCdXR0b25zKCk7XG4gICAgZGlzbWlzc1dpdGgoRGlzbWlzc1JlYXNvbi5jYW5jZWwpO1xuICB9O1xuXG4gIHZhciBoYW5kbGVDb25maXJtT3JEZW55V2l0aElucHV0ID0gZnVuY3Rpb24gaGFuZGxlQ29uZmlybU9yRGVueVdpdGhJbnB1dChpbnN0YW5jZSwgaW5uZXJQYXJhbXMsIHR5cGVcbiAgLyogdHlwZSBpcyBlaXRoZXIgJ2NvbmZpcm0nIG9yICdkZW55JyAqL1xuICApIHtcbiAgICB2YXIgaW5wdXRWYWx1ZSA9IGdldElucHV0VmFsdWUoaW5zdGFuY2UsIGlubmVyUGFyYW1zKTtcblxuICAgIGlmIChpbm5lclBhcmFtcy5pbnB1dFZhbGlkYXRvcikge1xuICAgICAgaGFuZGxlSW5wdXRWYWxpZGF0b3IoaW5zdGFuY2UsIGlubmVyUGFyYW1zLCBpbnB1dFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKCFpbnN0YW5jZS5nZXRJbnB1dCgpLmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgaW5zdGFuY2UuZW5hYmxlQnV0dG9ucygpO1xuICAgICAgaW5zdGFuY2Uuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKGlubmVyUGFyYW1zLnZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdkZW55Jykge1xuICAgICAgZGVueShpbnN0YW5jZSwgaW5uZXJQYXJhbXMsIGlucHV0VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maXJtKGluc3RhbmNlLCBpbm5lclBhcmFtcywgaW5wdXRWYWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVJbnB1dFZhbGlkYXRvciA9IGZ1bmN0aW9uIGhhbmRsZUlucHV0VmFsaWRhdG9yKGluc3RhbmNlLCBpbm5lclBhcmFtcywgaW5wdXRWYWx1ZSkge1xuICAgIGluc3RhbmNlLmRpc2FibGVJbnB1dCgpO1xuICAgIHZhciB2YWxpZGF0aW9uUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGFzUHJvbWlzZS
8443hpbm5lclBhcmFtcy5pbnB1dFZhbGlkYXRvcihpbnB1dFZhbHVlLCBpbm5lclBhcmFtcy52YWxpZGF0aW9uTWVzc2FnZSkpO1xuICAgIH0pO1xuICAgIHZhbGlkYXRpb25Qcm9taXNlLnRoZW4oZnVuY3Rpb24gKHZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICBpbnN0YW5jZS5lbmFibGVCdXR0b25zKCk7XG4gICAgICBpbnN0YW5jZS5lbmFibGVJbnB1dCgpO1xuXG4gICAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgICAgaW5zdGFuY2Uuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKHZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbmZpcm0oaW5zdGFuY2UsIGlubmVyUGFyYW1zLCBpbnB1dFZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICB2YXIgZGVueSA9IGZ1bmN0aW9uIGRlbnkoaW5zdGFuY2UsIGlubmVyUGFyYW1zLCB2YWx1ZSkge1xuICAgIGlmIChpbm5lclBhcmFtcy5zaG93TG9hZGVyT25EZW55KSB7XG4gICAgICBzaG93TG9hZGluZyhnZXREZW55QnV0dG9uKCkpO1xuICAgIH1cblxuICAgIGlmIChpbm5lclBhcmFtcy5wcmVEZW55KSB7XG4gICAgICB2YXIgcHJlRGVueVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFzUHJvbWlzZShpbm5lclBhcmFtcy5wcmVEZW55KHZhbHVlLCBpbm5lclBhcmFtcy52YWxpZGF0aW9uTWVzc2FnZSkpO1xuICAgICAgfSk7XG4gICAgICBwcmVEZW55UHJvbWlzZS50aGVuKGZ1bmN0aW9uIChwcmVEZW55VmFsdWUpIHtcbiAgICAgICAgaWYgKHByZURlbnlWYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBpbnN0YW5jZS5oaWRlTG9hZGluZygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluc3RhbmNlLmNsb3NlUG9wdXAoe1xuICAgICAgICAgICAgaXNEZW5pZWQ6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdHlwZW9mIHByZURlbnlWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyB2YWx1ZSA6IHByZURlbnlWYWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UuY2xvc2VQb3B1cCh7XG4gICAgICAgIGlzRGVuaWVkOiB0cnVlLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc3VjY2VlZFdpdGggPSBmdW5jdGlvbiBzdWNjZWVkV2l0aChpbnN0YW5jZSwgdmFsdWUpIHtcbiAgICBpbnN0YW5jZS5jbG9zZVBvcHVwKHtcbiAgICAgIGlzQ29uZmlybWVkOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGNvbmZpcm0gPSBmdW5jdGlvbiBjb25maXJtKGluc3RhbmNlLCBpbm5lclBhcmFtcywgdmFsdWUpIHtcbiAgICBpZiAoaW5uZXJQYXJhbXMuc2hvd0xvYWRlck9uQ29uZmlybSkge1xuICAgICAgc2hvd0xvYWRpbmcoKTsgLy8gVE9ETzogbWFrZSBzaG93TG9hZGluZyBhbiAqaW5zdGFuY2UqIG1ldGhvZFxuICAgIH1cblxuICAgIGlmIChpbm5lclBhcmFtcy5wcmVDb25maXJtKSB7XG4gICAgICBpbnN0YW5jZS5yZXNldFZhbGlkYXRpb25NZXNzYWdlKCk7XG4gICAgICB2Y
8443XIgcHJlQ29uZmlybVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFzUHJvbWlzZShpbm5lclBhcmFtcy5wcmVDb25maXJtKHZhbHVlLCBpbm5lclBhcmFtcy52YWxpZGF0aW9uTWVzc2FnZSkpO1xuICAgICAgfSk7XG4gICAgICBwcmVDb25maXJtUHJvbWlzZS50aGVuKGZ1bmN0aW9uIChwcmVDb25maXJtVmFsdWUpIHtcbiAgICAgICAgaWYgKGlzVmlzaWJsZShnZXRWYWxpZGF0aW9uTWVzc2FnZSgpKSB8fCBwcmVDb25maXJtVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgaW5zdGFuY2UuaGlkZUxvYWRpbmcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWNjZWVkV2l0aChpbnN0YW5jZSwgdHlwZW9mIHByZUNvbmZpcm1WYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyB2YWx1ZSA6IHByZUNvbmZpcm1WYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdWNjZWVkV2l0aChpbnN0YW5jZSwgdmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgYWRkS2V5ZG93bkhhbmRsZXIgPSBmdW5jdGlvbiBhZGRLZXlkb3duSGFuZGxlcihpbnN0YW5jZSwgZ2xvYmFsU3RhdGUsIGlubmVyUGFyYW1zLCBkaXNtaXNzV2l0aCkge1xuICAgIGlmIChnbG9iYWxTdGF0ZS5rZXlkb3duVGFyZ2V0ICYmIGdsb2JhbFN0YXRlLmtleWRvd25IYW5kbGVyQWRkZWQpIHtcbiAgICAgIGdsb2JhbFN0YXRlLmtleWRvd25UYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGdsb2JhbFN0YXRlLmtleWRvd25IYW5kbGVyLCB7XG4gICAgICAgIGNhcHR1cmU6IGdsb2JhbFN0YXRlLmtleWRvd25MaXN0ZW5lckNhcHR1cmVcbiAgICAgIH0pO1xuICAgICAgZ2xvYmFsU3RhdGUua2V5ZG93bkhhbmRsZXJBZGRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghaW5uZXJQYXJhbXMudG9hc3QpIHtcbiAgICAgIGdsb2JhbFN0YXRlLmtleWRvd25IYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGtleWRvd25IYW5kbGVyKGluc3RhbmNlLCBlLCBkaXNtaXNzV2l0aCk7XG4gICAgICB9O1xuXG4gICAgICBnbG9iYWxTdGF0ZS5rZXlkb3duVGFyZ2V0ID0gaW5uZXJQYXJhbXMua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZSA/IHdpbmRvdyA6IGdldFBvcHVwKCk7XG4gICAgICBnbG9iYWxTdGF0ZS5rZXlkb3duTGlzdGVuZXJDYXB0dXJlID0gaW5uZXJQYXJhbXMua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZTtcbiAgICAgIGdsb2JhbFN0YXRlLmtleWRvd25UYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGdsb2JhbFN0YXRlLmtleWRvd25IYW5kbGVyLCB7XG4gICAgICAgIGNhcHR1cmU6IGdsb2JhbFN0YXRlLmtleWRvd25MaXN0ZW5lckNhcHR1cmVcbiAgICAgIH0pO1xuICAgICAgZ2xvYmFsU3RhdGUua2V5ZG93bkhhbmRsZXJBZGRlZCA9IHRydWU7XG4gICAgfVxuICB9OyAvLyBGb2N1cyBoYW5kbGluZ1xuXG4gIHZhciBzZXRGb2N1cyA9IGZ1bmN0aW9uIHNldEZvY3VzKGlubmVyUGFyYW1zLCBpbmRleCwgaW5jcmVtZW50KSB7XG4gICAgdmFyIGZvY3VzYWJsZUVsZW1lbnRzID0gZ2V0Rm9jdXNhYmxlRWxlbWVudHMoKTsgLy8gc2VhcmNoIGZvciB2aXNpYmxlIGVsZW1lbnRzIGFuZCBzZWxlY3QgdGhlIG5leHQgcG9zc2libGUgbWF0Y2hcblxuICAgIGlmIChmb2N1c2FibGVFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIGluZGV4ID0gaW5kZXggKyBpbmNyZW1lbnQ7IC8vIHJvbGxvdmVyIHRvIGZpcnN0IGl0ZW1cblxuICAgICAgaWYgKGluZGV4ID09PSBmb2N1c2FibGVFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgaW5kZXggPSAwOyAvLyBnbyB0byBsYXN0IGl0ZW1cbiAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgIGluZGV4ID0gZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvY3VzYWJsZUVsZW1lbnRzW2luZGV4XS5mb2N1cygpO1xuICAgIH0gLy8gbm8gdmlzaWJsZSBmb2N1c2FibGUgZWxlbWVudHMsIGZvY3VzIHRoZSBwb3B1cFxuXG5cbiAgICBnZXRQb3B1cCgpLmZvY3VzKCk7XG4gIH07XG4gIHZhciBhcnJvd0tleXNOZXh0QnV0dG9uID0gWydBcnJvd1JpZ2h0JywgJ0Fycm93RG93bicsICdSaWdodCcsICdEb3duJyAvLyBJRTExXG4gIF07XG4gIHZhciBhcnJvd0tleXNQcmV2aW91c0J1dHRvbiA9IFsnQXJyb3dMZWZ0JywgJ0Fycm93VXAnLCAnTGVmdCcsICdVcCcgLy8gSUUxMVxuICBdO1xuICB2YXIgZXNjS2V5cyA9IFsnRXNjYXBlJywgJ0VzYycgLy8gSUUxMVxuICBdO1xuXG4gIHZhciBrZXlkb3duSGFuZGxlciA9IGZ1bmN0aW9uIGtleWRvd25IYW5kbGVyKGluc3RhbmNlLCBlLCBkaXNtaXNzV2l0aCkge1xuICAgIHZhciBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UpO1xuXG4gICAgaWYgKGlubmVyUGFyYW1zLnN0b3BLZXlkb3duUHJvcGFnYXRpb24pIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSAvLyBFTlRFUlxuXG5cbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIGhhbmRsZUVudGVyKGluc3RhbmNlLCBlLCBpbm5lclBhcmFtcyk7IC8vIFRBQlxuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdUYWInKSB7XG4gICAgICBoYW5kbGVUYWIoZSwgaW5uZXJQYXJhbXMpOyAvLyBBUlJPV1MgLSBzd2l0Y2ggZm9jdXMgYmV0d2VlbiBidXR0b25zXG4gICAgfSBlbHNlIGlmIChbXS5jb25jYXQoYXJyb3dLZXlzTmV4dEJ1dHRvbiwgYXJyb3dLZXlzUHJldmlvdXNCdXR0b24pLmluZGV4T2YoZS5rZXkpICE9PSAtMSkge1xuICAgICAgaGFuZGxlQXJyb3dzKGUua2V5KTsgLy8gRVNDXG4gICAgfSBlbHNlIGlmIChlc2NLZXlzLmluZGV4T2YoZS5rZXkpICE9PSAtMSkge1xuICAgICAgaGFuZGxlRXNjKGUsIGlubmVyUGFyYW1zLCBkaXNtaXNzV2l0aCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVFbnRlciA9IGZ1bmN0aW9uIGhhbmRsZUVudGVyKGluc3RhbmNlLCBlLCBpbm5lclBhcmFtcykge1xuICAgIC8vICM3MjAgIzcyMVxuICAgIGlmIChlLmlzQ29tcG9zaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGUudGFyZ2V0ICYmIGluc3RhbmNlLmdldElucHV0KCkgJiYgZS50YXJnZXQub3V0ZXJIVE1MID09PSBpbnN0YW5jZS5nZXRJbnB1dCgpLm91dGVySFRNTCkge1xuICAgICAgaWYgKFsndGV4dGFyZWEnLCAnZmlsZSddLmluZGV4T2YoaW5uZXJQYXJhbXMuaW5wdXQpICE9PSAtMSkge1xuICAgICAgICByZXR1cm47IC8vIGRvIG5vdCBzdWJtaXRcbiAgICAgIH1cblxuICAgICAgY2xpY2tDb25maXJtKCk7XG4gICAgICBlLnByZXZlbn
8443REZWZhdWx0KCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVUYWIgPSBmdW5jdGlvbiBoYW5kbGVUYWIoZSwgaW5uZXJQYXJhbXMpIHtcbiAgICB2YXIgdGFyZ2V0RWxlbWVudCA9IGUudGFyZ2V0O1xuICAgIHZhciBmb2N1c2FibGVFbGVtZW50cyA9IGdldEZvY3VzYWJsZUVsZW1lbnRzKCk7XG4gICAgdmFyIGJ0bkluZGV4ID0gLTE7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGFyZ2V0RWxlbWVudCA9PT0gZm9jdXNhYmxlRWxlbWVudHNbaV0pIHtcbiAgICAgICAgYnRuSW5kZXggPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWUuc2hpZnRLZXkpIHtcbiAgICAgIC8vIEN5Y2xlIHRvIHRoZSBuZXh0IGJ1dHRvblxuICAgICAgc2V0Rm9jdXMoaW5uZXJQYXJhbXMsIGJ0bkluZGV4LCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3ljbGUgdG8gdGhlIHByZXYgYnV0dG9uXG4gICAgICBzZXRGb2N1cyhpbm5lclBhcmFtcywgYnRuSW5kZXgsIC0xKTtcbiAgICB9XG5cbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfTtcblxuICB2YXIgaGFuZGxlQXJyb3dzID0gZnVuY3Rpb24gaGFuZGxlQXJyb3dzKGtleSkge1xuICAgIHZhciBjb25maXJtQnV0dG9uID0gZ2V0Q29uZmlybUJ1dHRvbigpO1xuICAgIHZhciBkZW55QnV0dG9uID0gZ2V0RGVueUJ1dHRvbigpO1xuICAgIHZhciBjYW5jZWxCdXR0b24gPSBnZXRDYW5jZWxCdXR0b24oKTtcblxuICAgIGlmICghKFtjb25maXJtQnV0dG9uLCBkZW55QnV0dG9uLCBjYW5jZWxCdXR0b25dLmluZGV4T2YoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgIT09IC0xKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gYXJyb3dLZXlzTmV4dEJ1dHRvbi5pbmRleE9mKGtleSkgIT09IC0xID8gJ25leHRFbGVtZW50U2libGluZycgOiAncHJldmlvdXNFbGVtZW50U2libGluZyc7XG4gICAgdmFyIGJ1dHRvblRvRm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50W3NpYmxpbmddO1xuXG4gICAgaWYgKGJ1dHRvblRvRm9jdXMpIHtcbiAgICAgIGJ1dHRvblRvRm9jdXMuZm9jdXMoKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGhhbmRsZUVzYyA9IGZ1bmN0aW9uIGhhbmRsZUVzYyhlLCBpbm5lclBhcmFtcywgZGlzbWlzc1dpdGgpIHtcbiAgICBpZiAoY2FsbElmRnVuY3Rpb24oaW5uZXJQYXJhbXMuYWxsb3dFc2NhcGVLZXkpKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBkaXNtaXNzV2l0aChEaXNtaXNzUmVhc29uLmVzYyk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVQb3B1cENsaWNrID0gZnVuY3Rpb24gaGFuZGxlUG9wdXBDbGljayhpbnN0YW5jZSwgZG9tQ2FjaGUsIGRpc21pc3NXaXRoKSB7XG4gICAgdmFyIGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldChpbnN0YW5jZSk7XG5cbiAgICBpZiAoaW5uZXJQYXJhbXMudG9hc3QpIHtcbiAgICAgIGhhbmRsZVRvYXN0Q2xpY2soaW5zdGFuY2UsIGRvbUNhY2hlLCBkaXNtaXNzV2l0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElnbm9yZSBjbGljayBldmVudHMgdGhhdCBoYWQgbW91c2Vkb3duIG9uIHRoZSBwb3B1cCBidXQgbW91c2V1cCBvbiB0aGUgY29udGFpbmVyXG4gICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgdXNlciBkcmFncyBhIHNsaWRlclxuICAgICAgaGFuZGxlTW9kYWxNb3VzZWRvd24oZG9tQ2FjaGUpOyAvLyBJZ25vcmUgY2xpY2sgZXZlbnRzIHRoYXQgaGFkIG1vdXNlZG93biBvbiB0aGUgY29udGFpbmVyIGJ1dCBtb3VzZXVwIG9uIHRoZSBwb3B1cFxuXG4gICAgICBoYW5kbGVDb250YWluZXJNb3VzZWRvd24oZG9tQ2FjaGUpO1xuICAgICAgaGFuZGxlTW9kYWxDbGljayhpbnN0YW5jZSwgZG9tQ2FjaGUsIGRpc21pc3NXaXRoKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGhhbmRsZVRvYXN0Q2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVUb2FzdENsaWNrKGluc3RhbmNlLCBkb21DYWNoZSwgZGlzbWlzc1dpdGgpIHtcbiAgICAvLyBDbG9zaW5nIHRvYXN0IGJ5IGludGVybmFsIGNsaWNrXG4gICAgZG9tQ2FjaGUucG9wdXAub25jbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UpO1xuXG4gICAgICBpZiAoaW5uZXJQYXJhbXMuc2hvd0NvbmZpcm1CdXR0b24gfHwgaW5uZXJQYXJhbXMuc2hvd0RlbnlCdXR0b24gfHwgaW5uZXJQYXJhbXMuc2hvd0NhbmNlbEJ1dHRvbiB8fCBpbm5lclBhcmFtcy5zaG93Q2xvc2VCdXR0b24gfHwgaW5uZXJQYXJhbXMudGltZXIgfHwgaW5uZXJQYXJhbXMuaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkaXNtaXNzV2l0aChEaXNtaXNzUmVhc29uLmNsb3NlKTtcbiAgICB9O1xuICB9O1xuXG4gIHZhciBpZ25vcmVPdXRzaWRlQ2xpY2sgPSBmYWxzZTtcblxuICB2YXIgaGFuZGxlTW9kYWxNb3VzZWRvd24gPSBmdW5jdGlvbiBoYW5kbGVNb2RhbE1vdXNlZG93bihkb21DYWNoZSkge1xuICAgIGRvbUNhY2hlLnBvcHVwLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgZG9tQ2FjaGUuY29udGFpbmVyLm9ubW91c2V1cCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGRvbUNhY2hlLmNvbnRhaW5lci5vbm1vdXNldXAgPSB1bmRlZmluZWQ7IC8vIFdlIG9ubHkgY2hlY2sgaWYgdGhlIG1vdXNldXAgdGFyZ2V0IGlzIHRoZSBjb250YWluZXIgYmVjYXVzZSB1c3VhbGx5IGl0IGRvZXNuJ3RcbiAgICAgICAgLy8gaGF2ZSBhbnkgb3RoZXIgZGlyZWN0IGNoaWxkcmVuIGFzaWRlIG9mIHRoZSBwb3B1cFxuXG4gICAgICAgIGlmIChlLnRhcmdldCA9PT0gZG9tQ2FjaGUuY29udGFpbmVyKSB7XG4gICAgICAgICAgaWdub3JlT3V0c2lkZUNsaWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICB9O1xuXG4gIHZhciBoYW5kbGVDb250YWluZXJNb3VzZWRvd24gPSBmdW5jdGlvbiBoYW5kbGVDb250YWluZXJNb3VzZWRvd24oZG9tQ2FjaGUpIHtcbiAgICBkb21DYWNoZS5jb250YWluZXIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBkb21DYWNoZS5wb3B1cC
84435vbm1vdXNldXAgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBkb21DYWNoZS5wb3B1cC5vbm1vdXNldXAgPSB1bmRlZmluZWQ7IC8vIFdlIGFsc28gbmVlZCB0byBjaGVjayBpZiB0aGUgbW91c2V1cCB0YXJnZXQgaXMgYSBjaGlsZCBvZiB0aGUgcG9wdXBcblxuICAgICAgICBpZiAoZS50YXJnZXQgPT09IGRvbUNhY2hlLnBvcHVwIHx8IGRvbUNhY2hlLnBvcHVwLmNvbnRhaW5zKGUudGFyZ2V0KSkge1xuICAgICAgICAgIGlnbm9yZU91dHNpZGVDbGljayA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgfTtcblxuICB2YXIgaGFuZGxlTW9kYWxDbGljayA9IGZ1bmN0aW9uIGhhbmRsZU1vZGFsQ2xpY2soaW5zdGFuY2UsIGRvbUNhY2hlLCBkaXNtaXNzV2l0aCkge1xuICAgIGRvbUNhY2hlLmNvbnRhaW5lci5vbmNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UpO1xuXG4gICAgICBpZiAoaWdub3JlT3V0c2lkZUNsaWNrKSB7XG4gICAgICAgIGlnbm9yZU91dHNpZGVDbGljayA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChlLnRhcmdldCA9PT0gZG9tQ2FjaGUuY29udGFpbmVyICYmIGNhbGxJZkZ1bmN0aW9uKGlubmVyUGFyYW1zLmFsbG93T3V0c2lkZUNsaWNrKSkge1xuICAgICAgICBkaXNtaXNzV2l0aChEaXNtaXNzUmVhc29uLmJhY2tkcm9wKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIF9tYWluKHVzZXJQYXJhbXMpIHtcbiAgICB2YXIgbWl4aW5QYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHNob3dXYXJuaW5nc0ZvclBhcmFtcyhfZXh0ZW5kcyh7fSwgbWl4aW5QYXJhbXMsIHVzZXJQYXJhbXMpKTtcblxuICAgIGlmIChnbG9iYWxTdGF0ZS5jdXJyZW50SW5zdGFuY2UpIHtcbiAgICAgIGdsb2JhbFN0YXRlLmN1cnJlbnRJbnN0YW5jZS5fZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGdsb2JhbFN0YXRlLmN1cnJlbnRJbnN0YW5jZSA9IHRoaXM7XG4gICAgdmFyIGlubmVyUGFyYW1zID0gcHJlcGFyZVBhcmFtcyh1c2VyUGFyYW1zLCBtaXhpblBhcmFtcyk7XG4gICAgc2V0UGFyYW1ldGVycyhpbm5lclBhcmFtcyk7XG4gICAgT2JqZWN0LmZyZWV6ZShpbm5lclBhcmFtcyk7IC8vIGNsZWFyIHRoZSBwcmV2aW91cyB0aW1lclxuXG4gICAgaWYgKGdsb2JhbFN0YXRlLnRpbWVvdXQpIHtcbiAgICAgIGdsb2JhbFN0YXRlLnRpbWVvdXQuc3RvcCgpO1xuICAgICAgZGVsZXRlIGdsb2JhbFN0YXRlLnRpbWVvdXQ7XG4gICAgfSAvLyBjbGVhciB0aGUgcmVzdG9yZSBmb2N1cyB0aW1lb3V0XG5cblxuICAgIGNsZWFyVGltZW91dChnbG9iYWxTdGF0ZS5yZXN0b3JlRm9jdXNUaW1lb3V0KTtcbiAgICB2YXIgZG9tQ2FjaGUgPSBwb3B1bGF0ZURvbUNhY2hlKHRoaXMpO1xuICAgIHJlbmRlcih0aGlzLCBpbm5lclBhcmFtcyk7XG4gICAgcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLnNldCh0aGlzLCBpbm5lclBhcmFtcyk7XG4gICAgcmV0dXJuIHN3YWxQcm9taXNlKHRoaXMsIGRvbUNhY2hlLCBpbm5lclBhcmFtcyk7XG4gIH1cblxuICB2YXIgcHJlcGFyZVBhcmFtcyA9IGZ1bmN0aW9uIHByZXBhcmVQYXJhbXModXNlclBhcmFtcywgbWl4aW5QYXJhbXMpIHtcbiAgICB2YXIgdGVtcGxhdGVQYXJhbXMgPSBnZXRUZW1wbGF0ZVBhcmFtcyh1c2VyUGFyYW1zKTtcblxuICAgIHZhciBzaG93Q2xhc3MgPSBfZXh0ZW5kcyh7fSwgZGVmYXVsdFBhcmFtcy5zaG93Q2xhc3MsIG1peGluUGFyYW1zLnNob3dDbGFzcywgdGVtcGxhdGVQYXJhbXMuc2hvd0NsYXNzLCB1c2VyUGFyYW1zLnNob3dDbGFzcyk7XG5cbiAgICB2YXIgaGlkZUNsYXNzID0gX2V4dGVuZHMoe30sIGRlZmF1bHRQYXJhbXMuaGlkZUNsYXNzLCBtaXhpblBhcmFtcy5oaWRlQ2xhc3MsIHRlbXBsYXRlUGFyYW1zLmhpZGVDbGFzcywgdXNlclBhcmFtcy5oaWRlQ2xhc3MpO1xuXG4gICAgdmFyIHBhcmFtcyA9IF9leHRlbmRzKHt9LCBkZWZhdWx0UGFyYW1zLCBtaXhpblBhcmFtcywgdGVtcGxhdGVQYXJhbXMsIHVzZXJQYXJhbXMpOyAvLyBwcmVjZWRlbmNlIGlzIGRlc2NyaWJlZCBpbiAjMjEzMVxuXG5cbiAgICBwYXJhbXMuc2hvd0NsYXNzID0gc2hvd0NsYXNzO1xuICAgIHBhcmFtcy5oaWRlQ2xhc3MgPSBoaWRlQ2xhc3M7IC8vIEBkZXByZWNhdGVkXG5cbiAgICBpZiAodXNlclBhcmFtcy5hbmltYXRpb24gPT09IGZhbHNlKSB7XG4gICAgICBwYXJhbXMuc2hvd0NsYXNzID0ge1xuICAgICAgICBwb3B1cDogJ3N3YWwyLW5vYW5pbWF0aW9uJyxcbiAgICAgICAgYmFja2Ryb3A6ICdzd2FsMi1ub2FuaW1hdGlvbidcbiAgICAgIH07XG4gICAgICBwYXJhbXMuaGlkZUNsYXNzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfTtcblxuICB2YXIgc3dhbFByb21pc2UgPSBmdW5jdGlvbiBzd2FsUHJvbWlzZShpbnN0YW5jZSwgZG9tQ2FjaGUsIGlubmVyUGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAvLyBmdW5jdGlvbnMgdG8gaGFuZGxlIGFsbCBjbG9zaW5ncy9kaXNtaXNzYWxzXG4gICAgICB2Y
8443XIgZGlzbWlzc1dpdGggPSBmdW5jdGlvbiBkaXNtaXNzV2l0aChkaXNtaXNzKSB7XG4gICAgICAgIGluc3RhbmNlLmNsb3NlUG9wdXAoe1xuICAgICAgICAgIGlzRGlzbWlzc2VkOiB0cnVlLFxuICAgICAgICAgIGRpc21pc3M6IGRpc21pc3NcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBwcml2YXRlTWV0aG9kcy5zd2FsUHJvbWlzZVJlc29sdmUuc2V0KGluc3RhbmNlLCByZXNvbHZlKTtcblxuICAgICAgZG9tQ2FjaGUuY29uZmlybUJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gaGFuZGxlQ29uZmlybUJ1dHRvbkNsaWNrKGluc3RhbmNlLCBpbm5lclBhcmFtcyk7XG4gICAgICB9O1xuXG4gICAgICBkb21DYWNoZS5kZW55QnV0dG9uLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVEZW55QnV0dG9uQ2xpY2soaW5zdGFuY2UsIGlubmVyUGFyYW1zKTtcbiAgICAgIH07XG5cbiAgICAgIGRvbUNhY2hlLmNhbmNlbEJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gaGFuZGxlQ2FuY2VsQnV0dG9uQ2xpY2soaW5zdGFuY2UsIGRpc21pc3NXaXRoKTtcbiAgICAgIH07XG5cbiAgICAgIGRvbUNhY2hlLmNsb3NlQnV0dG9uLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBkaXNtaXNzV2l0aChEaXNtaXNzUmVhc29uLmNsb3NlKTtcbiAgICAgIH07XG5cbiAgICAgIGhhbmRsZVBvcHVwQ2xpY2soaW5zdGFuY2UsIGRvbUNhY2hlLCBkaXNtaXNzV2l0aCk7XG4gICAgICBhZGRLZXlkb3duSGFuZGxlcihpbnN0YW5jZSwgZ2xvYmFsU3RhdGUsIGlubmVyUGFyYW1zLCBkaXNtaXNzV2l0aCk7XG5cbiAgICAgIGlmIChpbm5lclBhcmFtcy50b2FzdCAmJiAoaW5uZXJQYXJhbXMuaW5wdXQgfHwgaW5uZXJQYXJhbXMuZm9vdGVyIHx8IGlubmVyUGFyYW1zLnNob3dDbG9zZUJ1dHRvbikpIHtcbiAgICAgICAgYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgc3dhbENsYXNzZXNbJ3RvYXN0LWNvbHVtbiddKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIHN3YWxDbGFzc2VzWy
8443d0b2FzdC1jb2x1bW4nXSk7XG4gICAgICB9XG5cbiAgICAgIGhhbmRsZUlucHV0T3B0aW9uc0FuZFZhbHVlKGluc3RhbmNlLCBpbm5lclBhcmFtcyk7XG4gICAgICBvcGVuUG9wdXAoaW5uZXJQYXJhbXMpO1xuICAgICAgc2V0dXBUaW1lcihnbG9iYWxTdGF0ZSwgaW5uZXJQYXJhbXMsIGRpc21pc3NXaXRoKTtcbiAgICAgIGluaXRGb2N1cyhkb21DYWNoZSwgaW5uZXJQYXJhbXMpOyAvLyBTY3JvbGwgY29udGFpbmVyIHRvIHRvcCBvbiBvcGVuICgjMTI0NywgIzE5NDYpXG5cbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBkb21DYWNoZS5jb250YWluZXIuc2Nyb2xsVG9wID0gMDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciBwb3B1bGF0ZURvbUNhY2hlID0gZnVuY3Rpb24gcG9wdWxhdGVEb21DYWNoZShpbnN0YW5jZSkge1xuICAgIHZhciBkb21DYWNoZSA9IHtcbiAgICAgIHBvcHVwOiBnZXRQb3B1cCgpLFxuICAgICAgY29udGFpbmVyOiBnZXRDb250YWluZXIoKSxcbiAgICAgIGNvbnRlbnQ6IGdldENvbnRlbnQoKSxcbiAgICAgIGFjdGlvbnM6IGdldEFjdGlvbnMoKSxcbiAgICAgIGNvbmZpcm1CdXR0b246IGdldENvbmZpcm1CdXR0b24oKSxcbiAgICAgIGRlbnlCdXR0b246IGdldERlbnlCdXR0b24oKSxcbiAgICAgIGNhbmNlbEJ1dHRvbjogZ2V0Q2FuY2VsQnV0dG9uKCksXG4gICAgICBsb2FkZXI6IGdldExvYWRlcigpLFxuICAgICAgY2xvc2VCdXR0b246IGdldENsb3NlQnV0dG9uKCksXG4gICAgICB2YWxpZGF0aW9uTWVzc2FnZTogZ2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSxcbiAgICAgIHByb2dyZXNzU3RlcHM6IGdldFByb2dyZXNzU3RlcHMoKVxuICAgIH07XG4gICAgcHJpdmF0ZVByb3BzLmRvbUNhY2hlLnNldChpbnN0YW5jZSwgZG9tQ2FjaGUpO1xuICAgIHJldHVybiBkb21DYWNoZTtcbiAgfTtcblxuICB2YXIgc2V0dXBUaW1lciA9IGZ1bmN0aW9uIHNldHVwVGltZXIoZ2xvYmFsU3RhdGUkJDEsIGlubmVyUGFyYW1zLCBkaXNtaXNzV2l0aCkge1xuICAgIHZhciB0aW1lclByb2dyZXNzQmFyID0gZ2V0VGltZXJQcm9ncmVzc0JhcigpO1xuICAgIGhpZGUodGltZXJQcm9ncmVzc0Jhcik7XG5cbiAgICBpZiAoaW5uZXJQYXJhbXMudGltZXIpIHtcbiAgICAgIGdsb2JhbFN0YXRlJCQxLnRpbWVvdXQgPSBuZXcgVGltZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBkaXNtaXNzV2l0aCgndGltZXInKTtcbiAgICAgICAgZGVsZXRlIGdsb2JhbFN0YXRlJCQxLnRpbWVvdXQ7XG4gICAgICB9LCBpbm5lclBhcmFtcy50aW1lcik7XG5cbiAgICAgIGlmIChpbm5lclBhcmFtcy50aW1lclByb2dyZXNzQmFyKSB7XG4gICAgICAgIHNob3codGltZXJQcm9ncmVzc0Jhcik7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChnbG9iYWxTdGF0ZSQkMS50aW1lb3V0ICYmIGdsb2JhbFN0YXRlJCQxLnRpbWVvdXQucnVubmluZykge1xuICAgICAgICAgICAgLy8gdGltZXIgY2FuIGJlIGFscmVhZHkgc3RvcHBlZCBvciB1bnNldCBhdCB0aGlzIHBvaW50XG4gICAgICAgICAgICBhbmltYXRlVGltZXJQcm9ncmVzc0Jhcihpbm5lclBhcmFtcy50aW1lcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFyIGluaXRGb2N1cyA9IGZ1bmN0aW9uIGluaXRGb2N1cyhkb21DYWNoZSwgaW5uZXJQYXJhbXMpIHtcbiAgICBpZiAoaW5uZXJQYXJhbXMudG9hc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNhbGxJZkZ1bmN0aW9uKGlubmVyUGFyYW1zLmFsbG93RW50ZXJLZXkpKSB7XG4gICAgICByZXR1cm4gYmx1ckFjdGl2ZUVsZW1lbnQoKTtcbiAgICB9XG5cbiAgICBpZiAoIWZvY3VzQnV0dG9uKGRvbUNhY2hlLCBpbm5lclBhcmFtcykpIHtcbiAgICAgIHNldEZvY3VzKGlubmVyUGFyYW1zLCAtMSwgMSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBmb2N1c0J1dHRvbiA9IGZ1bmN0aW9uIGZvY3VzQnV0dG9uKGRvbUNhY2hlLCBpbm5lclBhcmFtcykge1xuICAgIGlmIChpbm5lclBhcmFtcy5mb2N1c0RlbnkgJiYgaXNWaXNpYmxlKGRvbUNhY2hlLmRlbnlCdXR0b24pKSB7XG4gICAgICBkb21DYWNoZS5kZW55QnV0dG9uLmZvY3VzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaW5uZXJQYXJhbXMuZm9jdXNDYW5jZWwgJiYgaXNWaXNpYmxlKGRvbUNhY2hlLmNhbmNlbEJ1dHRvbikpIHtcbiAgICAgIGRvbUNhY2hlLmNhbmNlbEJ1dHRvbi5mb2N1cygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlubmVyUGFyYW1zLmZvY3VzQ29uZmlybSAmJiBpc1Zpc2libGUoZG9tQ2FjaGUuY29uZmlybUJ1dHRvbikpIHtcbiAgICAgIGRvbUNhY2hlLmNvbmZpcm1CdXR0b24uZm9jdXMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICB2YXIgYmx1ckFjdGl2ZUVsZW1lbnQgPSBmdW5jdGlvbiBibHVyQWN0aXZlRWxlbWVudCgpIHtcbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiB0eXBlb2YgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBkb2
8443N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgcG9wdXAgcGFyYW1ldGVycy5cbiAgICovXG5cbiAgZnVuY3Rpb24gdXBkYXRlKHBhcmFtcykge1xuICAgIHZhciBwb3B1cCA9IGdldFBvcHVwKCk7XG4gICAgdmFyIGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldCh0aGlzKTtcblxuICAgIGlmICghcG9wdXAgfHwgaGFzQ2xhc3MocG9wdXAsIGlubmVyUGFyYW1zLmhpZGVDbGFzcy5wb3B1cCkpIHtcbiAgICAgIHJldHVybiB3YXJuKFwiWW91J3JlIHRyeWluZyB0byB1cGRhdGUgdGhlIGNsb3NlZCBvciBjbG9zaW5nIHBvcHVwLCB0aGF0IHdvbid0IHdvcmsuIFVzZSB0aGUgdXBkYXRlKCkgbWV0aG9kIGluIHByZUNvbmZpcm0gcGFyYW1ldGVyIG9yIHNob3cgYSBuZXcgcG9wdXAuXCIpO1xuICAgIH1cblxuICAgIHZhciB2YWxpZFVwZGF0YWJsZVBhcmFtcyA9IHt9OyAvLyBhc3NpZ24gdmFsaWQgcGFyYW1zIGZyb20gYHBhcmFtc2AgdG8gYGRlZmF1bHRzYFxuXG4gICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgaWYgKFN3YWwuaXNVcGRhdGFibGVQYXJhbWV0ZXIocGFyYW0pKSB7XG4gICAgICAgIHZhbGlkVXBkYXRhYmxlUGFyYW1zW3BhcmFtXSA9IHBhcmFtc1twYXJhbV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKFwiSW52YWxpZCBwYXJhbWV0ZXIgdG8gdXBkYXRlOiBcXFwiXCIuY29uY2F0KHBhcmFtLCBcIlxcXCIuIFVwZGF0YWJsZSBwYXJhbXMgYXJlIGxpc3RlZCBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvYmxvYi9tYXN0ZXIvc3JjL3V0aWxzL3BhcmFtcy5qc1xcblxcbklmIHlvdSB0aGluayB0aGlzIHBhcmFtZXRlciBzaG91bGQgYmUgdXBkYXRhYmxlLCByZXF1ZXN0IGl0IGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi9pc3N1ZXMvbmV3P3RlbXBsYXRlPTAyX2ZlYXR1cmVfcmVxdWVzdC5tZFwiKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIgdXBkYXRlZFBhcmFtcyA9IF9leHRlbmRzKHt9LCBpbm5lclBhcmFtcywgdmFsaWRVcGRhdGFibGVQYXJhbXMpO1xuXG4gICAgcmVuZGVyKHRoaXMsIHVwZGF0ZWRQYXJhbXMpO1xuICAgIHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5zZXQodGhpcywgdXBkYXRlZFBhcmFtcyk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIHZhbHVlOiBfZXh0ZW5kcyh7fSwgdGhpcy5wYXJhbXMsIHBhcmFtcyksXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gX2Rlc3Ryb3koKSB7XG4gICAgdmFyIGRvbUNhY2hlID0gcHJpdmF0ZVByb3BzLmRvbUNhY2hlLmdldCh0aGlzKTtcbiAgICB2YXIgaW5uZXJQYXJhbXMgPSBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpO1xuXG4gICAgaWYgKCFpbm5lclBhcmFtcykge1xuICAgICAgcmV0dXJuOyAvLyBUaGlzIGluc3RhbmNlIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkXG4gICAgfSAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbm90aGVyIFN3YWwgY2xvc2luZ1xuXG5cbiAgICBpZiAoZG9tQ2FjaGUucG9wdXAgJiYgZ2xvYmFsU3RhdGUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKSB7XG4gICAgICBnbG9iYWxTdGF0ZS5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2soKTtcbiAgICAgIGRlbGV0ZSBnbG9iYWxTdGF0ZS5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2s7XG4gICAgfSAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHN3YWwgZGlzcG9zYWwgZGVmZXIgdGltZXJcblxuXG4gICAgaWYgKGdsb2JhbFN0YXRlLmRlZmVyRGlzcG9zYWxUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KGdsb2JhbFN0YXRlLmRlZmVyRGlzcG9zYWxUaW1lcik7XG4gICAgICBkZWxldGUgZ2xvYmFsU3RhdGUuZGVmZXJEaXNwb3NhbFRpbWVyO1xuICAgIH1cblxuICAgIHJ1bkRpZERlc3Ryb3koaW5uZXJQYXJhbXMpO1xuICAgIGRpc3Bvc2VTd2FsKHRoaXMpO1xuICB9XG5cbiAgdmFyIHJ1bkRpZERlc3Ryb3kgPSBmdW5jdGlvbiBydW5EaWREZXN0cm95KGlubmVyUGFyYW1zKSB7XG4gICAgaWYgKHR5cGVvZiBpbm5lclBhcmFtcy5kaWREZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbm5lclBhcmFtcy5kaWREZXN0cm95KCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5uZXJQYXJhbXMub25EZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbm5lclBhcmFtcy5vbkRlc3Ryb3koKTsgLy8gQGRlcHJlY2F0ZWRcbiAgICB9XG4gIH07XG5cbiAgdmFyIGRpc3Bvc2VTd2FsID0gZnVuY3Rpb24gZGlzcG9zZVN3YWwoaW5zdGFuY2UpIHtcbiAgICAvLyBVbnNldCB0aGlzLnBhcmFtcyBzbyBHQyB3aWxsIGRpc3Bvc2UgaXQgKCMxNTY5KVxuICAgIGRlbGV0ZSBpbnN0YW5jZS5wYXJhbXM7IC8vIFVuc2V0IGdsb2JhbFN0YXRlIHByb3BzIHNvIEdDIHdpbGwgZGlzcG9zZSBnbG9iYWxTdGF0ZSAoIzE1NjkpXG5cbiAgICBkZWxldGUgZ2xvYmFsU3RhdGUua2V5ZG93bkhhbmRsZXI7XG4gICAgZGVsZXRlIGdsb2JhbFN0YXRlLmtleWRvd25UYXJnZXQ7IC8vIFVuc2V0IFdlYWtNYXBzIHNvIEdDIHdpbGwgYmUgYWJsZSB0byBkaXNwb3NlIHRoZW0gKCMxNTY5KVxuXG4gICAgdW5zZXRXZWFrTWFwcyhwcml2YXRlUHJvcHMpO1xuICAgIHVuc2V0V2Vha01hcHMocHJpdmF0ZU1ldGhvZHMpO1xuICB9O1xuXG4gIHZhciB1bnNldFdlYWtNYXBzID0gZnVuY3Rpb24gdW5zZXRXZWFrTWFwcyhvYmopIHtcbiAgICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgICAgb2JqW2ldID0gbmV3IFdlYWtNYXAoKTtcbiAgICB9XG4gIH07XG5cblxuXG4gI
8443HZhciBpbnN0YW5jZU1ldGhvZHMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgaGlkZUxvYWRpbmc6IGhpZGVMb2FkaW5nLFxuICAgIGRpc2FibGVMb2FkaW5nOiBoaWRlTG9hZGluZyxcbiAgICBnZXRJbnB1dDogZ2V0SW5wdXQkMSxcbiAgICBjbG9zZTogY2xvc2UsXG4gICAgY2xvc2VQb3B1cDogY2xvc2UsXG4gICAgY2xvc2VNb2RhbDogY2xvc2UsXG4gICAgY2xvc2VUb2FzdDogY2xvc2UsXG4gICAgZW5hYmxlQnV0dG9uczogZW5hYmxlQnV0dG9ucyxcbiAgICBkaXNhYmxlQnV0dG9uczogZGlzYWJsZUJ1dHRvbnMsXG4gICAgZW5hYmxlSW5wdXQ6IGVuYWJsZUlucHV0LFxuICAgIGRpc2FibGVJbnB1dDogZGlzYWJsZUlucHV0LFxuICAgIHNob3dWYWxpZGF0aW9uTWVzc2FnZTogc2hvd1ZhbGlkYXRpb25NZXNzYWdlLFxuICAgIHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2U6IHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UkMSxcbiAgICBnZXRQcm9ncmVzc1N0ZXBzOiBnZXRQcm9ncmVzc1N0ZXBzJDEsXG4gICAgX21haW46IF9tYWluLFxuICAgIHVwZGF0ZTogdXBkYXRlLFxuICAgIF9kZXN0cm95OiBfZGVzdHJveVxuICB9KTtcblxuICB2YXIgY3VycmVudEluc3RhbmNlO1xuXG4gIHZhciBTd2VldEFsZXJ0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTd2VldEFsZXJ0KCkge1xuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN3ZWV0QWxlcnQpO1xuXG4gICAgICAvLyBQcmV2ZW50IHJ1biBpbiBOb2RlIGVudlxuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgUHJvbWlzZVxuXG5cbiAgICAgIGlmICh0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZXJyb3IoJ1RoaXMgcGFja2FnZSByZXF1aXJlcyBhIFByb21pc2UgbGlicmFyeSwgcGxlYXNlIGluY2x1ZGUgYSBzaGltIHRvIGVuYWJsZSBpdCBpbiB0aGlzIGJyb3dzZXIgKFNlZTogaHR0cHM6Ly9naXRodWIuY29tL3N3ZWV0YWxlcnQyL3N3ZWV0YWxlcnQyL3dpa2kvTWlncmF0aW9uLWZyb20tU3dlZXRBbGVydC10by1Td2VldEFsZXJ0MiMxLWllLXN1cHBvcnQpJyk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRJbnN0YW5jZSA9IHRoaXM7XG5cbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICB2Y
8443XIgb3V0ZXJQYXJhbXMgPSBPYmplY3QuZnJlZXplKHRoaXMuY29uc3RydWN0b3IuYXJnc1RvUGFyYW1zKGFyZ3MpKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgdmFsdWU6IG91dGVyUGFyYW1zLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdmFyIHByb21pc2UgPSB0aGlzLl9tYWluKHRoaXMucGFyYW1zKTtcblxuICAgICAgcHJpdmF0ZVByb3BzLnByb21pc2Uuc2V0KHRoaXMsIHByb21pc2UpO1xuICAgIH0gLy8gYGNhdGNoYCBjYW5ub3QgYmUgdGhlIG5hbWUgb2YgYSBtb2R1bGUgZXhwb3J0LCBzbyB3ZSBkZWZpbmUgb3VyIHRoZW5hYmxlIG1ldGhvZHMgaGVyZSBpbnN0ZWFkXG5cblxuICAgIF9jcmVhdGVDbGFzcyhTd2VldEFsZXJ0LCBbe1xuICAgICAga2V5OiBcInRoZW5cIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkKSB7XG4gICAgICAgIHZhciBwcm9taXNlID0gcHJpdmF0ZVByb3BzLnByb21pc2UuZ2V0KHRoaXMpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKG9uRnVsZmlsbGVkKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiZmluYWxseVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9maW5hbGx5KG9uRmluYWxseSkge1xuICAgICAgICB2YXIgcHJvbWlzZSA9IHByaXZhdGVQcm9wcy5wcm9taXNlLmdldCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2VbXCJmaW5hbGx5XCJdKG9uRmluYWxseSk7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIFN3ZWV0QWxlcnQ7XG4gIH0oKTsgLy8gQXNzaWduIGluc3RhbmNlIG1ldGhvZHMgZnJvbSBzcmMvaW5zdGFuY2VNZXRob2RzLyouanMgdG8gcHJvdG90eXBlXG5cblxuICBfZXh0ZW5kcyhTd2VldEFsZXJ0LnByb3RvdHlwZSwgaW5zdGFuY2VNZXRob2RzKTsgLy8gQXNzaWduIHN0YXRpYyBtZXRob2RzIGZyb20gc3JjL3N0YXRpY01ldGhvZHMvKi5qcyB0byBjb25zdHJ1Y3RvclxuXG5cbiAgX2V4dGVuZHMoU3dlZXRBbGVydCwgc3RhdGljTWV0aG9kcyk7IC8vIFByb3h5IHRvIGluc3RhbmNlIG1ldGhvZHMgdG8gY29uc3RydWN0b3IsIGZvciBub3csIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG5cbiAgT2JqZWN0LmtleXMoaW5zdGFuY2VNZXRob2RzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBTd2VldEFsZXJ0W2tleV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoY3VycmVudEluc3RhbmNlKSB7XG4gICAgICAgIHZhciBfY3VycmVudEluc3RhbmNlO1xuXG4gICAgICAgIHJldHVybiAoX2N1cnJlbnRJbnN0YW5jZSA9IGN1cnJlbnRJbnN0YW5jZSlba2V5XS5hcHBseShfY3VycmVudEluc3RhbmNlLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuICBTd2VldEFsZXJ0LkRpc21pc3NSZWFzb24gPSBEaXNtaXNzUmVhc29uO1xuICBTd2VldEFsZXJ0LnZlcnNpb24gPSAnMTAuMTQuMCc7XG5cbiAgdmFyIFN3YWwgPSBTd2VldEFsZXJ0O1xuICBTd2FsW1wiZGVmYXVsdFwiXSA9IFN3YWw7XG5cbiAgcmV0dXJuIFN3YWw7XG5cbn0pKTtcbmlmICh0eXBlb2YgdGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5Td2VldGFsZXJ0Mil7ICB0aGlzLnN3YWwgPSB0aGlzLnN3ZWV0QWxlcnQgPSB0aGlzLlN3YWwgPSB0aGlzLlN3ZWV0QWxlcnQgPSB0aGlzLlN3ZWV0YWxlcnQyfVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gL3Zhci93d3cvdmVnYXMudGVzdC93cC1jb250ZW50L3BsdWdpbnMvbm9kZV9tb2R1bGVzL3N3ZWV0YWxlcnQyL2Rpc3Qvc3dlZXRhbGVydDIuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.