vendor: 39,252 bytes, lines 1-1234
1function isObject$1(obj) { 2 return obj !== null && typeof obj === "object" && "constructor" in obj && obj.constructor === Object; 3} 4function extend$1(target, src) { 5 if (target === void 0) { 6 target = {}; 7 } 8 if (src === void 0) { 9 src = {}; 10 } 11 Object.keys(src).forEach((key) => { 12 if (typeof target[key] === "undefined") 13 target[key] = src[key]; 14 else if (isObject$1(src[key]) && isObject$1(target[key]) && Object.keys(src[key]).length > 0) { 15 extend$1(target[key], src[key]); 16 } 17 }); 18} 19const ssrDocument = { 20 body: {}, 21 addEventListener() { 22 }, 23 removeEventListener() { 24 }, 25 activeElement: { 26 blur() { 27 }, 28 nodeName: "" 29 }, 30 querySelector() { 31 return null; 32 }, 33 querySelectorAll() { 34 return []; 35 }, 36 getElementById() { 37 return null; 38 }, 39 createEvent() { 40 return { 41 initEvent() { 42 } 43 }; 44 }, 45 createElement() { 46 return { 47 children: [], 48 childNodes: [], 49 style: {}, 50 setAttribute() { 51 }, 52 getElementsByTagName() { 53 return []; 54 } 55 }; 56 }, 57 createElementNS() { 58 return {}; 59 }, 60 importNode() { 61 return null; 62 }, 63 location: { 64 hash: "", 65 host: "", 66 hostname: "", 67 href: "", 68 origin: "", 69 pathname: "", 70 protocol: "", 71 search: "" 72 } 73}; 74function getDocument() { 75 const doc = typeof document !== "undefined" ? document : {}; 76 extend$1(doc, ssrDocument); 77 return doc; 78} 79const ssrWindow = { 80 document: ssrDocument, 81 navigator: { 82 userAgent: "" 83 }, 84 location: { 85 hash: "", 86 host: "", 87 hostname: "", 88 href: "", 89 origin: "", 90 pathname: "", 91 protocol: "", 92 search: "" 93 }, 94 history: { 95 replaceState() { 96 }, 97 pushState() { 98 }, 99 go() { 100 }, 101 back() { 102 } 103 }, 104 CustomEvent: function CustomEvent() { 105 return this; 106 }, 107 addEventListener() { 108 }, 109 removeEventListener() { 110 }, 111 getComputedStyle() { 112 return { 113 getPropertyValue() { 114 return ""; 115 } 116 }; 117 }, 118 Image() { 119 }, 120 Date() { 121 }, 122 screen: {}, 123 setTimeout() { 124 }, 125 clearTimeout() { 126 }, 127 matchMedia() { 128 return {}; 129 }, 130 requestAnimationFrame(callback) { 131 if (typeof setTimeout === "undefined") { 132 callback(); 133 return null; 134 } 135 return setTimeout(callback, 0); 136 }, 137 cancelAnimationFrame(id) { 138 if (typeof setTimeout === "undefined") { 139 return; 140 } 141 clearTimeout(id); 142 } 143}; 144function getWindow() { 145 const win = typeof window !== "undefined" ? window : {}; 146 extend$1(win, ssrWindow); 147 return win; 148} 149function classesToTokens(classes2) { 150 if (classes2 === void 0) { 151 classes2 = ""; 152 } 153 return classes2.trim().split(" ").filter((c) => !!c.trim()); 154} 155function deleteProps(obj) { 156 const object = obj; 157 Object.keys(object).forEach((key) => { 158 try { 159 object[key] = null; 160 } catch (e) { 161 } 162 try { 163 delete object[key]; 164 } catch (e) { 165 } 166 }); 167} 168function nextTick(callback, delay) { 169 if (delay === void 0) { 170 delay = 0; 171 } 172 return setTimeout(callback, delay); 173} 174function now() { 175 return Date.now(); 176} 177function getComputedStyle$1(el) { 178 const window2 = getWindow(); 179 let style; 180 if (window2.getComputedStyle) { 181 style = window2.getComputedStyle(el, null); 182 } 183 if (!style && el.currentStyle) { 184 style = el.currentStyle; 185 } 186 if (!style) { 187 style = el.style; 188 } 189 return style; 190} 191function getTranslate(el, axis) { 192 if (axis === void 0) { 193 axis = "x"; 194 } 195 const window2 = getWindow(); 196 let matrix; 197 let curTransform; 198 let transformMatrix; 199 const curStyle = getComputedStyle$1(el); 200 if (window2.WebKitCSSMatrix) { 201 curTransform = curStyle.transform || curStyle.webkitTransform; 202 if (curTransform.split(",").length > 6) { 203 curTransform = curTransform.split(", ").map((a) => a.replace(",", ".")).join(", "); 204 } 205 transformMatrix = new window2.WebKitCSSMatrix(curTransform === "none" ? "" : curTransform); 206 } else { 207 transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue("transform").replace("translate(", "matrix(1, 0, 0, 1,"); 208 matrix = transformMatrix.toString().split(","); 209 } 210 if (axis === "x") { 211 if (window2.WebKitCSSMatrix) 212 curTransform = transformMatrix.m41; 213 else if (matrix.length === 16) 214 curTransform = parseFloat(matrix[12]); 215 else 216 curTransform = parseFloat(matrix[4]); 217 } 218 if (axis === "y") { 219 if (window2.WebKitCSSMatrix) 220 curTransform = transformMatrix.m42; 221 else if (matrix.length === 16) 222 curTransform = parseFloat(matrix[13]); 223 else 224 curTransform = parseFloat(matrix[5]); 225 } 226 return curTransform || 0; 227} 228function isObject(o) { 229 return typeof o === "object" && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === "Object"; 230} 231function isNode(node) { 232 if (typeof window !== "undefined" && typeof window.HTMLElement !== "undefined") { 233 return node instanceof HTMLElement; 234 } 235 return node && (node.nodeType === 1 || node.nodeType === 11); 236} 237function extend() { 238 const to = Object(arguments.length <= 0 ? void 0 : arguments[0]); 239 const noExtend = ["__proto__", "constructor", "prototype"]; 240 for (let i = 1; i < arguments.length; i += 1) { 241 const nextSource = i < 0 || arguments.length <= i ? void 0 : arguments[i]; 242 if (nextSource !== void 0 && nextSource !== null && !isNode(nextSource)) { 243 const keysArray = Object.keys(Object(nextSource)).filter((key) => noExtend.indexOf(key) < 0); 244 for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) { 245 const nextKey = keysArray[nextIndex]; 246 const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); 247 if (desc !== void 0 && desc.enumerable) { 248 if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) { 249 if (nextSource[nextKey].__swiper__) { 250 to[nextKey] = nextSource[nextKey]; 251 } else { 252 extend(to[nextKey], nextSource[nextKey]); 253 } 254 } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) { 255 to[nextKey] = {}; 256 if (nextSource[nextKey].__swiper__) { 257 to[nextKey] = nextSource[nextKey]; 258 } else { 259 extend(to[nextKey], nextSource[nextKey]); 260 } 261 } else { 262 to[nextKey] = nextSource[nextKey]; 263 } 264 } 265 } 266 } 267 } 268 return to; 269} 270function setCSSProperty(el, varName, varValue) { 271 el.style.setProperty(varName, varValue); 272} 273function animateCSSModeScroll(_ref) { 274 let { 275 swiper, 276 targetPosition, 277 side 278 } = _ref; 279 const window2 = getWindow(); 280 const startPosition = -swiper.translate; 281 let startTime = null; 282 let time; 283 const duration = swiper.params.speed; 284 swiper.wrapperEl.style.scrollSnapType = "none"; 285 window2.cancelAnimationFrame(swiper.cssModeFrameID); 286 const dir = targetPosition > startPosition ? "next" : "prev"; 287 const isOutOfBound = (current, target) => { 288 return dir === "next" && current >= target || dir === "prev" && current <= target; 289 }; 290 const animate = () => { 291 time = (/* @__PURE__ */ new Date()).getTime(); 292 if (startTime === null) { 293 startTime = time; 294 } 295 const progress = Math.max(Math.min((time - startTime) / duration, 1), 0); 296 const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2; 297 let currentPosition = startPosition + easeProgress * (targetPosition - startPosition); 298 if (isOutOfBound(currentPosition, targetPosition)) { 299 currentPosition = targetPosition; 300 } 301 swiper.wrapperEl.scrollTo({ 302 [side]: currentPosition 303 }); 304 if (isOutOfBound(currentPosition, targetPosition)) { 305 swiper.wrapperEl.style.overflow = "hidden"; 306 swiper.wrapperEl.style.scrollSnapType = ""; 307 setTimeout(() => { 308 swiper.wrapperEl.style.overflow = ""; 309 swiper.wrapperEl.scrollTo({ 310 [side]: currentPosition 311 }); 312 }); 313 window2.cancelAnimationFrame(swiper.cssModeFrameID); 314 return; 315 } 316 swiper.cssModeFrameID = window2.requestAnimationFrame(animate); 317 }; 318 animate(); 319} 320function elementChildren(element, selector) { 321 if (selector === void 0) { 322 selector = ""; 323 } 324 return [...element.children].filter((el) => el.matches(selector)); 325} 326function showWarning(text) { 327 try { 328 console.warn(text); 329 return; 330 } catch (err) { 331 } 332} 333function createElement(tag, classes2) { 334 if (classes2 === void 0) { 335 classes2 = []; 336 } 337 const el = document.createElement(tag); 338 el.classList.add(...Array.isArray(classes2) ? classes2 : classesToTokens(classes2)); 339 return el; 340} 341function elementPrevAll(el, selector) { 342 const prevEls = []; 343 while (el.previousElementSibling) { 344 const prev = el.previousElementSibling; 345 if (selector) { 346 if (prev.matches(selector)) 347 prevEls.push(prev); 348 } else 349 prevEls.push(prev); 350 el = prev; 351 } 352 return prevEls; 353} 354function elementNextAll(el, selector) { 355 const nextEls = []; 356 while (el.nextElementSibling) { 357 const next = el.nextElementSibling; 358 if (selector) { 359 if (next.matches(selector)) 360 nextEls.push(next); 361 } else 362 nextEls.push(next); 363 el = next; 364 } 365 return nextEls; 366} 367function elementStyle(el, prop) { 368 const window2 = getWindow(); 369 return window2.getComputedStyle(el, null).getPropertyValue(prop); 370} 371function elementIndex(el) { 372 let child = el; 373 let i; 374 if (child) { 375 i = 0; 376 while ((child = child.previousSibling) !== null) { 377 if (child.nodeType === 1) 378 i += 1; 379 } 380 return i; 381 } 382 return void 0; 383} 384function elementParents(el, selector) { 385 const parents = []; 386 let parent = el.parentElement; 387 while (parent) { 388 if (selector) { 389 if (parent.matches(selector)) 390 parents.push(parent); 391 } else { 392 parents.push(parent); 393 } 394 parent = parent.parentElement; 395 } 396 return parents; 397} 398function elementOuterSize(el, size, includeMargins) { 399 const window2 = getWindow(); 400 if (includeMargins) { 401 return el[size === "width" ? "offsetWidth" : "offsetHeight"] + parseFloat(window2.getComputedStyle(el, null).getPropertyValue(size === "width" ? "margin-right" : "margin-top")) + parseFloat(window2.getComputedStyle(el, null).getPropertyValue(size === "width" ? "margin-left" : "margin-bottom")); 402 } 403 return el.offsetWidth; 404} 405function makeElementsArray(el) { 406 return (Array.isArray(el) ? el : [el]).filter((e) => !!e); 407} 408let support; 409function calcSupport() { 410 const window2 = getWindow(); 411 const document2 = getDocument(); 412 return { 413 smoothScroll: document2.documentElement && document2.documentElement.style && "scrollBehavior" in document2.documentElement.style, 414 touch: !!("ontouchstart" in window2 || window2.DocumentTouch && document2 instanceof window2.DocumentTouch) 415 }; 416} 417function getSupport() { 418 if (!support) { 419 support = calcSupport(); 420 } 421 return support; 422} 423let deviceCached; 424function calcDevice(_temp) { 425 let { 426 userAgent 427 } = _temp === void 0 ? {} : _temp; 428 const support2 = getSupport(); 429 const window2 = getWindow(); 430 const platform = window2.navigator.platform; 431 const ua = userAgent || window2.navigator.userAgent; 432 const device = { 433 ios: false, 434 android: false 435 }; 436 const screenWidth = window2.screen.width; 437 const screenHeight = window2.screen.height; 438 const android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); 439 let ipad = ua.match(/(iPad).*OS\s([\d_]+)/); 440 const ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); 441 const iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/); 442 const windows = platform === "Win32"; 443 let macos = platform === "MacIntel"; 444 const iPadScreens = ["1024x1366", "1366x1024", "834x1194", "1194x834", "834x1112", "1112x834", "768x1024", "1024x768", "820x1180", "1180x820", "810x1080", "1080x810"]; 445 if (!ipad && macos && support2.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) { 446 ipad = ua.match(/(Version)\/([\d.]+)/); 447 if (!ipad) 448 ipad = [0, 1, "13_0_0"]; 449 macos = false; 450 } 451 if (android && !windows) { 452 device.os = "android"; 453 device.android = true; 454 } 455 if (ipad || iphone || ipod) { 456 device.os = "ios"; 457 device.ios = true; 458 } 459 return device; 460} 461function getDevice(overrides) { 462 if (overrides === void 0) { 463 overrides = {}; 464 } 465 if (!deviceCached) { 466 deviceCached = calcDevice(overrides); 467 } 468 return deviceCached; 469} 470let browser; 471function calcBrowser() { 472 const window2 = getWindow(); 473 const device = getDevice(); 474 let needPerspectiveFix = false; 475 function isSafari() { 476 const ua = window2.navigator.userAgent.toLowerCase(); 477 return ua.indexOf("safari") >= 0 && ua.indexOf("chrome") < 0 && ua.indexOf("android") < 0; 478 } 479 if (isSafari()) { 480 const ua = String(window2.navigator.userAgent); 481 if (ua.includes("Version/")) { 482 const [major, minor] = ua.split("Version/")[1].split(" ")[0].split(".").map((num) => Number(num)); 483 needPerspectiveFix = major < 16 || major === 16 && minor < 2; 484 } 485 } 486 const isWebView = /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window2.navigator.userAgent); 487 const isSafariBrowser = isSafari(); 488 const need3dFix = isSafariBrowser || isWebView && device.ios; 489 return { 490 isSafari: needPerspectiveFix || isSafariBrowser, 491 needPerspectiveFix, 492 need3dFix, 493 isWebView 494 }; 495} 496function getBrowser() { 497 if (!browser) { 498 browser = calcBrowser(); 499 } 500 return browser; 501} 502function Resize(_ref) { 503 let { 504 swiper, 505 on, 506 emit 507 } = _ref; 508 const window2 = getWindow(); 509 let observer = null; 510 let animationFrame = null; 511 const resizeHandler = () => { 512 if (!swiper || swiper.destroyed || !swiper.initialized) 513 return; 514 emit("beforeResize"); 515 emit("resize"); 516 }; 517 const createObserver = () => { 518 if (!swiper || swiper.destroyed || !swiper.initialized) 519 return; 520 observer = new ResizeObserver((entries) => { 521 animationFrame = window2.requestAnimationFrame(() => { 522 const { 523 width, 524 height 525 } = swiper; 526 let newWidth = width; 527 let newHeight = height; 528 entries.forEach((_ref2) => { 529 let { 530 contentBoxSize, 531 contentRect, 532 target 533 } = _ref2; 534 if (target && target !== swiper.el) 535 return; 536 newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize; 537 newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize; 538 }); 539 if (newWidth !== width || newHeight !== height) { 540 resizeHandler(); 541 } 542 }); 543 }); 544 observer.observe(swiper.el); 545 }; 546 const removeObserver = () => { 547 if (animationFrame) { 548 window2.cancelAnimationFrame(animationFrame); 549 } 550 if (observer && observer.unobserve && swiper.el) { 551 observer.unobserve(swiper.el); 552 observer = null; 553 } 554 }; 555 const orientationChangeHandler = () => { 556 if (!swiper || swiper.destroyed || !swiper.initialized) 557 return; 558 emit("orientationchange"); 559 }; 560 on("init", () => { 561 if (swiper.params.resizeObserver && typeof window2.ResizeObserver !== "undefined") { 562 createObserver(); 563 return; 564 } 565 window2.addEventListener("resize", resizeHandler); 566 window2.addEventListener("orientationchange", orientationChangeHandler); 567 }); 568 on("destroy", () => { 569 removeObserver(); 570 window2.removeEventListener("resize", resizeHandler); 571 window2.removeEventListener("orientationchange", orientationChangeHandler); 572 }); 573} 574function Observer(_ref) { 575 let { 576 swiper, 577 extendParams, 578 on, 579 emit 580 } = _ref; 581 const observers = []; 582 const window2 = getWindow(); 583 const attach = function(target, options) { 584 if (options === void 0) { 585 options = {}; 586 } 587 const ObserverFunc = window2.MutationObserver || window2.WebkitMutationObserver; 588 const observer = new ObserverFunc((mutations) => { 589 if (swiper.__preventObserver__) 590 return; 591 if (mutations.length === 1) { 592 emit("observerUpdate", mutations[0]); 593 return; 594 } 595 const observerUpdate = function observerUpdate2() { 596 emit("observerUpdate", mutations[0]); 597 }; 598 if (window2.requestAnimationFrame) { 599 window2.requestAnimationFrame(observerUpdate); 600 } else { 601 window2.setTimeout(observerUpdate, 0); 602 } 603 }); 604 observer.observe(target, { 605 attributes: typeof options.attributes === "undefined" ? true : options.attributes, 606 childList: typeof options.childList === "undefined" ? true : options.childList, 607 characterData: typeof options.characterData === "undefined" ? true : options.characterData 608 }); 609 observers.push(observer); 610 }; 611 const init = () => { 612 if (!swiper.params.observer) 613 return; 614 if (swiper.params.observeParents) { 615 const containerParents = elementParents(swiper.hostEl); 616 for (let i = 0; i < containerParents.length; i += 1) { 617 attach(containerParents[i]); 618 } 619 } 620 attach(swiper.hostEl, { 621 childList: swiper.params.observeSlideChildren 622 }); 623 attach(swiper.wrapperEl, { 624 attributes: false 625 }); 626 }; 627 const destroy = () => { 628 observers.forEach((observer) => { 629 observer.disconnect(); 630 }); 631 observers.splice(0, observers.length); 632 }; 633 extendParams({ 634 observer: false, 635 observeParents: false, 636 observeSlideChildren: false 637 }); 638 on("init", init); 639 on("destroy", destroy); 640} 641var eventsEmitter = { 642 on(events2, handler, priority) { 643 const self = this; 644 if (!self.eventsListeners || self.destroyed) 645 return self; 646 if (typeof handler !== "function") 647 return self; 648 const method = priority ? "unshift" : "push"; 649 events2.split(" ").forEach((event) => { 650 if (!self.eventsListeners[event]) 651 self.eventsListeners[event] = []; 652 self.eventsListeners[event][method](handler); 653 }); 654 return self; 655 }, 656 once(events2, handler, priority) { 657 const self = this; 658 if (!self.eventsListeners || self.destroyed) 659 return self; 660 if (typeof handler !== "function") 661 return self; 662 function onceHandler() { 663 self.off(events2, onceHandler); 664 if (onceHandler.__emitterProxy) { 665 delete onceHandler.__emitterProxy; 666 } 667 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 668 args[_key] = arguments[_key]; 669 } 670 handler.apply(self, args); 671 } 672 onceHandler.__emitterProxy = handler; 673 return self.on(events2, onceHandler, priority); 674 }, 675 onAny(handler, priority) { 676 const self = this; 677 if (!self.eventsListeners || self.destroyed) 678 return self; 679 if (typeof handler !== "function") 680 return self; 681 const method = priority ? "unshift" : "push"; 682 if (self.eventsAnyListeners.indexOf(handler) < 0) { 683 self.eventsAnyListeners[method](handler); 684 } 685 return self; 686 }, 687 offAny(handler) { 688 const self = this; 689 if (!self.eventsListeners || self.destroyed) 690 return self; 691 if (!self.eventsAnyListeners) 692 return self; 693 const index = self.eventsAnyListeners.indexOf(handler); 694 if (index >= 0) { 695 self.eventsAnyListeners.splice(index, 1); 696 } 697 return self; 698 }, 699 off(events2, handler) { 700 const self = this; 701 if (!self.eventsListeners || self.destroyed) 702 return self; 703 if (!self.eventsListeners) 704 return self; 705 events2.split(" ").forEach((event) => { 706 if (typeof handler === "undefined") { 707 self.eventsListeners[event] = []; 708 } else if (self.eventsListeners[event]) { 709 self.eventsListeners[event].forEach((eventHandler, index) => { 710 if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) { 711 self.eventsListeners[event].splice(index, 1); 712 } 713 }); 714 } 715 }); 716 return self; 717 }, 718 emit() { 719 const self = this; 720 if (!self.eventsListeners || self.destroyed) 721 return self; 722 if (!self.eventsListeners) 723 return self; 724 let events2; 725 let data; 726 let context; 727 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { 728 args[_key2] = arguments[_key2]; 729 } 730 if (typeof args[0] === "string" || Array.isArray(args[0])) { 731 events2 = args[0]; 732 data = args.slice(1, args.length); 733 context = self; 734 } else { 735 events2 = args[0].events; 736 data = args[0].data; 737 context = args[0].context || self; 738 } 739 data.unshift(context); 740 const eventsArray = Array.isArray(events2) ? events2 : events2.split(" "); 741 eventsArray.forEach((event) => { 742 if (self.eventsAnyListeners && self.eventsAnyListeners.length) { 743 self.eventsAnyListeners.forEach((eventHandler) => { 744 eventHandler.apply(context, [event, ...data]); 745 }); 746 } 747 if (self.eventsListeners && self.eventsListeners[event]) { 748 self.eventsListeners[event].forEach((eventHandler) => { 749 eventHandler.apply(context, data); 750 }); 751 } 752 }); 753 return self; 754 } 755}; 756function updateSize() { 757 const swiper = this; 758 let width; 759 let height; 760 const el = swiper.el; 761 if (typeof swiper.params.width !== "undefined" && swiper.params.width !== null) { 762 width = swiper.params.width; 763 } else { 764 width = el.clientWidth; 765 } 766 if (typeof swiper.params.height !== "undefined" && swiper.params.height !== null) { 767 height = swiper.params.height; 768 } else { 769 height = el.clientHeight; 770 } 771 if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) { 772 return; 773 } 774 width = width - parseInt(elementStyle(el, "padding-left") || 0, 10) - parseInt(elementStyle(el, "padding-right") || 0, 10); 775 height = height - parseInt(elementStyle(el, "padding-top") || 0, 10) - parseInt(elementStyle(el, "padding-bottom") || 0, 10); 776 if (Number.isNaN(width)) 777 width = 0; 778 if (Number.isNaN(height)) 779 height = 0; 780 Object.assign(swiper, { 781 width, 782 height, 783 size: swiper.isHorizontal() ? width : height 784 }); 785} 786function updateSlides() { 787 const swiper = this; 788 function getDirectionPropertyValue(node, label) { 789 return parseFloat(node.getPropertyValue(swiper.getDirectionLabel(label)) || 0); 790 } 791 const params = swiper.params; 792 const { 793 wrapperEl, 794 slidesEl, 795 size: swiperSize, 796 rtlTranslate: rtl, 797 wrongRTL 798 } = swiper; 799 const isVirtual = swiper.virtual && params.virtual.enabled; 800 const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length; 801 const slides = elementChildren(slidesEl, `.${swiper.params.slideClass}, swiper-slide`); 802 const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length; 803 let snapGrid = []; 804 const slidesGrid = []; 805 const slidesSizesGrid = []; 806 let offsetBefore = params.slidesOffsetBefore; 807 if (typeof offsetBefore === "function") { 808 offsetBefore = params.slidesOffsetBefore.call(swiper); 809 } 810 let offsetAfter = params.slidesOffsetAfter; 811 if (typeof offsetAfter === "function") { 812 offsetAfter = params.slidesOffsetAfter.call(swiper); 813 } 814 const previousSnapGridLength = swiper.snapGrid.length; 815 const previousSlidesGridLength = swiper.slidesGrid.length; 816 let spaceBetween = params.spaceBetween; 817 let slidePosition = -offsetBefore; 818 let prevSlideSize = 0; 819 let index = 0; 820 if (typeof swiperSize === "undefined") { 821 return; 822 } 823 if (typeof spaceBetween === "string" && spaceBetween.indexOf("%") >= 0) { 824 spaceBetween = parseFloat(spaceBetween.replace("%", "")) / 100 * swiperSize; 825 } else if (typeof spaceBetween === "string") { 826 spaceBetween = parseFloat(spaceBetween); 827 } 828 swiper.virtualSize = -spaceBetween; 829 slides.forEach((slideEl) => { 830 if (rtl) { 831 slideEl.style.marginLeft = ""; 832 } else { 833 slideEl.style.marginRight = ""; 834 } 835 slideEl.style.marginBottom = ""; 836 slideEl.style.marginTop = ""; 837 }); 838 if (params.centeredSlides && params.cssMode) { 839 setCSSProperty(wrapperEl, "--swiper-centered-offset-before", ""); 840 setCSSProperty(wrapperEl, "--swiper-centered-offset-after", ""); 841 } 842 const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid; 843 if (gridEnabled) { 844 swiper.grid.initSlides(slides); 845 } else if (swiper.grid) { 846 swiper.grid.unsetSlides(); 847 } 848 let slideSize; 849 const shouldResetSlideSize = params.slidesPerView === "auto" && params.breakpoints && Object.keys(params.breakpoints).filter((key) => { 850 return typeof params.breakpoints[key].slidesPerView !== "undefined"; 851 }).length > 0; 852 for (let i = 0; i < slidesLength; i += 1) { 853 slideSize = 0; 854 let slide2; 855 if (slides[i]) 856 slide2 = slides[i]; 857 if (gridEnabled) { 858 swiper.grid.updateSlide(i, slide2, slides); 859 } 860 if (slides[i] && elementStyle(slide2, "display") === "none") 861 continue; 862 if (params.slidesPerView === "auto") { 863 if (shouldResetSlideSize) { 864 slides[i].style[swiper.getDirectionLabel("width")] = ``; 865 } 866 const slideStyles = getComputedStyle(slide2); 867 const currentTransform = slide2.style.transform; 868 const currentWebKitTransform = slide2.style.webkitTransform; 869 if (currentTransform) { 870 slide2.style.transform = "none"; 871 } 872 if (currentWebKitTransform) { 873 slide2.style.webkitTransform = "none"; 874 } 875 if (params.roundLengths) { 876 slideSize = swiper.isHorizontal() ? elementOuterSize(slide2, "width", true) : elementOuterSize(slide2, "height", true); 877 } else { 878 const width = getDirectionPropertyValue(slideStyles, "width"); 879 const paddingLeft = getDirectionPropertyValue(slideStyles, "padding-left"); 880 const paddingRight = getDirectionPropertyValue(slideStyles, "padding-right"); 881 const marginLeft = getDirectionPropertyValue(slideStyles, "margin-left"); 882 const marginRight = getDirectionPropertyValue(slideStyles, "margin-right"); 883 const boxSizing = slideStyles.getPropertyValue("box-sizing"); 884 if (boxSizing && boxSizing === "border-box") { 885 slideSize = width + marginLeft + marginRight; 886 } else { 887 const { 888 clientWidth, 889 offsetWidth 890 } = slide2; 891 slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth); 892 } 893 } 894 if (currentTransform) { 895 slide2.style.transform = currentTransform; 896 } 897 if (currentWebKitTransform) { 898 slide2.style.webkitTransform = currentWebKitTransform; 899 } 900 if (params.roundLengths) 901 slideSize = Math.floor(slideSize); 902 } else { 903 slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView; 904 if (params.roundLengths) 905 slideSize = Math.floor(slideSize); 906 if (slides[i]) { 907 slides[i].style[swiper.getDirectionLabel("width")] = `${slideSize}px`; 908 } 909 } 910 if (slides[i]) { 911 slides[i].swiperSlideSize = slideSize; 912 } 913 slidesSizesGrid.push(slideSize); 914 if (params.centeredSlides) { 915 slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween; 916 if (prevSlideSize === 0 && i !== 0) 917 slidePosition = slidePosition - swiperSize / 2 - spaceBetween; 918 if (i === 0) 919 slidePosition = slidePosition - swiperSize / 2 - spaceBetween; 920 if (Math.abs(slidePosition) < 1 / 1e3) 921 slidePosition = 0; 922 if (params.roundLengths) 923 slidePosition = Math.floor(slidePosition); 924 if (index % params.slidesPerGroup === 0) 925 snapGrid.push(slidePosition); 926 slidesGrid.push(slidePosition); 927 } else { 928 if (params.roundLengths) 929 slidePosition = Math.floor(slidePosition); 930 if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) 931 snapGrid.push(slidePosition); 932 slidesGrid.push(slidePosition); 933 slidePosition = slidePosition + slideSize + spaceBetween; 934 } 935 swiper.virtualSize += slideSize + spaceBetween; 936 prevSlideSize = slideSize; 937 index += 1; 938 } 939 swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter; 940 if (rtl && wrongRTL && (params.effect === "slide" || params.effect === "coverflow")) { 941 wrapperEl.style.width = `${swiper.virtualSize + spaceBetween}px`; 942 } 943 if (params.setWrapperSize) { 944 wrapperEl.style[swiper.getDirectionLabel("width")] = `${swiper.virtualSize + spaceBetween}px`; 945 } 946 if (gridEnabled) { 947 swiper.grid.updateWrapperSize(slideSize, snapGrid); 948 } 949 if (!params.centeredSlides) { 950 const newSlidesGrid = []; 951 for (let i = 0; i < snapGrid.length; i += 1) { 952 let slidesGridItem = snapGrid[i]; 953 if (params.roundLengths) 954 slidesGridItem = Math.floor(slidesGridItem); 955 if (snapGrid[i] <= swiper.virtualSize - swiperSize) { 956 newSlidesGrid.push(slidesGridItem); 957 } 958 } 959 snapGrid = newSlidesGrid; 960 if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) { 961 snapGrid.push(swiper.virtualSize - swiperSize); 962 } 963 } 964 if (isVirtual && params.loop) { 965 const size = slidesSizesGrid[0] + spaceBetween; 966 if (params.slidesPerGroup > 1) { 967 const groups = Math.ceil((swiper.virtual.slidesBefore + swiper.virtual.slidesAfter) / params.slidesPerGroup); 968 const groupSize = size * params.slidesPerGroup; 969 for (let i = 0; i < groups; i += 1) { 970 snapGrid.push(snapGrid[snapGrid.length - 1] + groupSize); 971 } 972 } 973 for (let i = 0; i < swiper.virtual.slidesBefore + swiper.virtual.slidesAfter; i += 1) { 974 if (params.slidesPerGroup === 1) { 975 snapGrid.push(snapGrid[snapGrid.length - 1] + size); 976 } 977 slidesGrid.push(slidesGrid[slidesGrid.length - 1] + size); 978 swiper.virtualSize += size; 979 } 980 } 981 if (snapGrid.length === 0) 982 snapGrid = [0]; 983 if (spaceBetween !== 0) { 984 const key = swiper.isHorizontal() && rtl ? "marginLeft" : swiper.getDirectionLabel("marginRight"); 985 slides.filter((_, slideIndex) => { 986 if (!params.cssMode || params.loop) 987 return true; 988 if (slideIndex === slides.length - 1) { 989 return false; 990 } 991 return true; 992 }).forEach((slideEl) => { 993 slideEl.style[key] = `${spaceBetween}px`; 994 }); 995 } 996 if (params.centeredSlides && params.centeredSlidesBounds) { 997 let allSlidesSize = 0; 998 slidesSizesGrid.forEach((slideSizeValue) => { 999 allSlidesSize += slideSizeValue + (spaceBetween || 0); 1000 }); 1001 allSlidesSize -= spaceBetween; 1002 const maxSnap = allSlidesSize - swiperSize; 1003 snapGrid = snapGrid.map((snap) => { 1004 if (snap <= 0) 1005 return -offsetBefore; 1006 if (snap > maxSnap) 1007 return maxSnap + offsetAfter; 1008 return snap; 1009 }); 1010 } 1011 if (params.centerInsufficientSlides) { 1012 let allSlidesSize = 0; 1013 slidesSizesGrid.forEach((slideSizeValue) => { 1014 allSlidesSize += slideSizeValue + (spaceBetween || 0); 1015 }); 1016 allSlidesSize -= spaceBetween; 1017 if (allSlidesSize < swiperSize) { 1018 const allSlidesOffset = (swiperSize - allSlidesSize) / 2; 1019 snapGrid.forEach((snap, snapIndex) => { 1020 snapGrid[snapIndex] = snap - allSlidesOffset; 1021 }); 1022 slidesGrid.forEach((snap, snapIndex) => { 1023 slidesGrid[snapIndex] = snap + allSlidesOffset; 1024 }); 1025 } 1026 } 1027 Object.assign(swiper, { 1028 slides, 1029 snapGrid, 1030 slidesGrid, 1031 slidesSizesGrid 1032 }); 1033 if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) { 1034 setCSSProperty(wrapperEl, "--swiper-centered-offset-before", `${-snapGrid[0]}px`); 1035 setCSSProperty(wrapperEl, "--swiper-centered-offset-after", `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`); 1036 const addToSnapGrid = -swiper.snapGrid[0]; 1037 const addToSlidesGrid = -swiper.slidesGrid[0]; 1038 swiper.snapGrid = swiper.snapGrid.map((v) => v + addToSnapGrid); 1039 swiper.slidesGrid = swiper.slidesGrid.map((v) => v + addToSlidesGrid); 1040 } 1041 if (slidesLength !== previousSlidesLength) { 1042 swiper.emit("slidesLengthChange"); 1043 } 1044 if (snapGrid.length !== previousSnapGridLength) { 1045 if (swiper.params.watchOverflow) 1046 swiper.checkOverflow(); 1047 swiper.emit("snapGridLengthChange"); 1048 } 1049 if (slidesGrid.length !== previousSlidesGridLength) { 1050 swiper.emit("slidesGridLengthChange"); 1051 } 1052 if (params.watchSlidesProgress) { 1053 swiper.updateSlidesOffset(); 1054 } 1055 swiper.emit("slidesUpdated"); 1056 if (!isVirtual && !params.cssMode && (params.effect === "slide" || params.effect === "fade")) { 1057 const backFaceHiddenClass = `${params.containerModifierClass}backface-hidden`; 1058 const hasClassBackfaceClassAdded = swiper.el.classList.contains(backFaceHiddenClass); 1059 if (slidesLength <= params.maxBackfaceHiddenSlides) { 1060 if (!hasClassBackfaceClassAdded) 1061 swiper.el.classList.add(backFaceHiddenClass); 1062 } else if (hasClassBackfaceClassAdded) { 1063 swiper.el.classList.remove(backFaceHiddenClass); 1064 } 1065 } 1066} 1067function updateAutoHeight(speed) { 1068 const swiper = this; 1069 const activeSlides = []; 1070 const isVirtual = swiper.virtual && swiper.params.virtual.enabled; 1071 let newHeight = 0; 1072 let i; 1073 if (typeof speed === "number") { 1074 swiper.setTransition(speed); 1075 } else if (speed === true) { 1076 swiper.setTransition(swiper.params.speed); 1077 } 1078 const getSlideByIndex = (index) => { 1079 if (isVirtual) { 1080 return swiper.slides[swiper.getSlideIndexByData(index)]; 1081 } 1082 return swiper.slides[index]; 1083 }; 1084 if (swiper.params.slidesPerView !== "auto" && swiper.params.slidesPerView > 1) { 1085 if (swiper.params.centeredSlides) { 1086 (swiper.visibleSlides || []).forEach((slide2) => { 1087 activeSlides.push(slide2); 1088 }); 1089 } else { 1090 for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) { 1091 const index = swiper.activeIndex + i; 1092 if (index > swiper.slides.length && !isVirtual) 1093 break; 1094 activeSlides.push(getSlideByIndex(index)); 1095 } 1096 } 1097 } else { 1098 activeSlides.push(getSlideByIndex(swiper.activeIndex)); 1099 } 1100 for (i = 0; i < activeSlides.length; i += 1) { 1101 if (typeof activeSlides[i] !== "undefined") { 1102 const height = activeSlides[i].offsetHeight; 1103 newHeight = height > newHeight ? height : newHeight; 1104 } 1105 } 1106 if (newHeight || newHeight === 0) 1107 swiper.wrapperEl.style.height = `${newHeight}px`; 1108} 1109function updateSlidesOffset() { 1110 const swiper = this; 1111 const slides = swiper.slides; 1112 const minusOffset = swiper.isElement ? swiper.isHorizontal() ? swiper.wrapperEl.offsetLeft : swiper.wrapperEl.offsetTop : 0; 1113 for (let i = 0; i < slides.length; i += 1) { 1114 slides[i].swiperSlideOffset = (swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop) - minusOffset - swiper.cssOverflowAdjustment(); 1115 } 1116} 1117function updateSlidesProgress(translate2) { 1118 if (translate2 === void 0) { 1119 translate2 = this && this.translate || 0; 1120 } 1121 const swiper = this; 1122 const params = swiper.params; 1123 const { 1124 slides, 1125 rtlTranslate: rtl, 1126 snapGrid 1127 } = swiper; 1128 if (slides.length === 0) 1129 return; 1130 if (typeof slides[0].swiperSlideOffset === "undefined") 1131 swiper.updateSlidesOffset(); 1132 let offsetCenter = -translate2; 1133 if (rtl) 1134 offsetCenter = translate2; 1135 slides.forEach((slideEl) => { 1136 slideEl.classList.remove(params.slideVisibleClass, params.slideFullyVisibleClass); 1137 }); 1138 swiper.visibleSlidesIndexes = []; 1139 swiper.visibleSlides = []; 1140 let spaceBetween = params.spaceBetween; 1141 if (typeof spaceBetween === "string" && spaceBetween.indexOf("%") >= 0) { 1142 spaceBetween = parseFloat(spaceBetween.replace("%", "")) / 100 * swiper.size; 1143 } else if (typeof spaceBetween === "string") { 1144 spaceBetween = parseFloat(spaceBetween); 1145 } 1146 for (let i = 0; i < slides.length; i += 1) { 1147 const slide2 = slides[i]; 1148 let slideOffset = slide2.swiperSlideOffset; 1149 if (params.cssMode && params.centeredSlides) { 1150 slideOffset -= slides[0].swiperSlideOffset; 1151 } 1152 const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide2.swiperSlideSize + spaceBetween); 1153 const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide2.swiperSlideSize + spaceBetween); 1154 const slideBefore = -(offsetCenter - slideOffset); 1155 const slideAfter = slideBefore + swiper.slidesSizesGrid[i]; 1156 const isFullyVisible = slideBefore >= 0 && slideBefore <= swiper.size - swiper.slidesSizesGrid[i]; 1157 const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size; 1158 if (isVisible) { 1159 swiper.visibleSlides.push(slide2); 1160 swiper.visibleSlidesIndexes.push(i); 1161 slides[i].classList.add(params.slideVisibleClass); 1162 } 1163 if (isFullyVisible) { 1164 slides[i].classList.add(params.slideFullyVisibleClass); 1165 } 1166 slide2.progress = rtl ? -slideProgress : slideProgress; 1167 slide2.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress; 1168 } 1169} 1170function updateProgress(translate2) { 1171 const swiper = this; 1172 if (typeof translate2 === "undefined") { 1173 const multiplier = swiper.rtlTranslate ? -1 : 1; 1174 translate2 = swiper && swiper.translate && swiper.translate * multiplier || 0; 1175 } 1176 const params = swiper.params; 1177 const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); 1178 let { 1179 progress, 1180 isBeginning, 1181 isEnd, 1182 progressLoop 1183 } = swiper; 1184 const wasBeginning = isBeginning; 1185 const wasEnd = isEnd; 1186 if (translatesDiff === 0) { 1187 progress = 0; 1188 isBeginning = true; 1189 isEnd = true; 1190 } else { 1191 progress = (translate2 - swiper.minTranslate()) / translatesDiff; 1192 const isBeginningRounded = Math.abs(translate2 - swiper.minTranslate()) < 1; 1193 const isEndRounded = Math.abs(translate2 - swiper.maxTranslate()) < 1; 1194 isBeginning = isBeginningRounded || progress <= 0; 1195 isEnd = isEndRounded || progress >= 1; 1196 if (isBeginningRounded) 1197 progress = 0; 1198 if (isEndRounded) 1199 progress = 1; 1200 } 1201 if (params.loop) { 1202 const firstSlideIndex = swiper.getSlideIndexByData(0); 1203 const lastSlideIndex = swiper.getSlideIndexByData(swiper.slides.length - 1); 1204 const firstSlideTranslate = swiper.slidesGrid[firstSlideIndex]; 1205 const lastSlideTranslate = swiper.slidesGrid[lastSlideIndex]; 1206 const translateMax = swiper.slidesGrid[swiper.slidesGrid.length - 1]; 1207 const translateAbs = Math.abs(translate2); 1208 if (translateAbs >= firstSlideTranslate) { 1209 progressLoop = (translateAbs - firstSlideTranslate) / translateMax; 1210 } else { 1211 progressLoop = (translateAbs + translateMax - lastSlideTranslate) / translateMax; 1212 } 1213 if (progressLoop > 1) 1214 progressLoop -= 1; 1215 } 1216 Object.assign(swiper, { 1217 progress, 1218 progressLoop, 1219 isBeginning, 1220 isEnd 1221 }); 1222 if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) 1223 swiper.updateSlidesProgress(translate2); 1224 if (isBeginning && !wasBeginning) { 1225 swiper.emit("reachBeginning toEdge"); 1226 } 1227 if (isEnd && !wasEnd) { 1228 swiper.emit("reachEnd toEdge"); 1229 } 1230 if (wasBeginning && !isBeginning || wasEnd && !isEnd) { 1231 swiper.emit("fromEdge"); 1232 } 1233 swiper.emit("progress", progress); 1234}
1235const toggleSlideClasses = (slideEl, condition, className) => { 1236 if (condition && !slideEl.classList.contains(className)) { 1237 slideEl.classList.add(className); 1238 } else if (!condition && slideEl.classList.contains(className)) { 1239 slideEl.classList.remove(className); 1240 } 1241}; 1242function updateSlidesClasses() { 1243 const swiper = this; 1244 const { 1245 slides, 1246 params, 1247 slidesEl, 1248 activeIndex 1249 } = swiper; 1250 const isVirtual = swiper.virtual && params.virtual.enabled; 1251 const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1; 1252 const getFilteredSlide = (selector) => { 1253 return elementChildren(slidesEl, `.${params.slideClass}${selector}, swiper-slide${selector}`)[0]; 1254 }; 1255 let activeSlide; 1256 let prevSlide; 1257 let nextSlide; 1258 if (isVirtual) { 1259 if (params.loop) { 1260 let slideIndex = activeIndex - swiper.virtual.slidesBefore; 1261 if (slideIndex < 0) 1262 slideIndex = swiper.virtual.slides.length + slideIndex; 1263 if (slideIndex >= swiper.virtual.slides.length) 1264 slideIndex -= swiper.virtual.slides.length; 1265 activeSlide = getFilteredSlide(`[data-swiper-slide-index="${slideIndex}"]`); 1266 } else { 1267 activeSlide = getFilteredSlide(`[data-swiper-slide-index="${activeIndex}"]`); 1268 } 1269 } else { 1270 if (gridEnabled) { 1271 activeSlide = slides.filter((slideEl) => slideEl.column === activeIndex)[0]; 1272 nextSlide = slides.filter((slideEl) => slideEl.column === activeIndex + 1)[0]; 1273 prevSlide = slides.filter((slideEl) => slideEl.column === activeIndex - 1)[0]; 1274 } else { 1275 activeSlide = slides[activeIndex]; 1276 } 1277 } 1278 if (activeSlide) { 1279 if (!gridEnabled) { 1280 nextSlide = elementNextAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0]; 1281 if (params.loop && !nextSlide) { 1282 nextSlide = slides[0]; 1283 } 1284 prevSlide = elementPrevAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0]; 1285 if (params.loop && !prevSlide === 0) { 1286 prevSlide = slides[slides.length - 1]; 1287 } 1288 } 1289 } 1290 slides.forEach((slideEl) => { 1291 toggleSlideClasses(slideEl, slideEl === activeSlide, params.slideActiveClass); 1292 toggleSlideClasses(slideEl, slideEl === nextSlide, params.slideNextClass); 1293 toggleSlideClasses(slideEl, slideEl === prevSlide, params.slidePrevClass); 1294 }); 1295 swiper.emitSlidesClasses(); 1296} 1297const processLazyPreloader = (swiper, imageEl) => { 1298 if (!swiper || swiper.destroyed || !swiper.params) 1299 return; 1300 const slideSelector = () => swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`; 1301 const slideEl = imageEl.closest(slideSelector()); 1302 if (slideEl) { 1303 let lazyEl = slideEl.querySelector(`.${swiper.params.lazyPreloaderClass}`); 1304 if (!lazyEl && swiper.isElement) { 1305 if (slideEl.shadowRoot) { 1306 lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`); 1307 } else { 1308 requestAnimationFrame(() => { 1309 if (slideEl.shadowRoot) { 1310 lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`); 1311 if (lazyEl) 1312 lazyEl.remove(); 1313 } 1314 }); 1315 } 1316 } 1317 if (lazyEl) 1318 lazyEl.remove(); 1319 } 1320}; 1321const unlazy = (swiper, index) => { 1322 if (!swiper.slides[index]) 1323 return; 1324 const imageEl = swiper.slides[index].querySelector('[loading="lazy"]'); 1325 if (imageEl) 1326 imageEl.removeAttribute("loading"); 1327}; 1328const preload = (swiper) => { 1329 if (!swiper || swiper.destroyed || !swiper.params) 1330 return; 1331 let amount = swiper.params.lazyPreloadPrevNext; 1332 const len = swiper.slides.length; 1333 if (!len || !amount || amount < 0) 1334 return; 1335 amount = Math.min(amount, len); 1336 const slidesPerView = swiper.params.slidesPerView === "auto" ? swiper.slidesPerViewDynamic() : Math.ceil(swiper.params.slidesPerView); 1337 const activeIndex = swiper.activeIndex; 1338 if (swiper.params.grid && swiper.params.grid.rows > 1) { 1339 const activeColumn = activeIndex; 1340 const preloadColumns = [activeColumn - amount]; 1341 preloadColumns.push(...Array.from({ 1342 length: amount 1343 }).map((_, i) => { 1344 return activeColumn + slidesPerView + i; 1345 }));
vendor: 54,598 bytes, lines 1346-2976
1346 swiper.slides.forEach((slideEl, i) => { 1347 if (preloadColumns.includes(slideEl.column)) 1348 unlazy(swiper, i); 1349 }); 1350 return; 1351 } 1352 const slideIndexLastInView = activeIndex + slidesPerView - 1; 1353 if (swiper.params.rewind || swiper.params.loop) { 1354 for (let i = activeIndex - amount; i <= slideIndexLastInView + amount; i += 1) { 1355 const realIndex = (i % len + len) % len; 1356 if (realIndex < activeIndex || realIndex > slideIndexLastInView) 1357 unlazy(swiper, realIndex); 1358 } 1359 } else { 1360 for (let i = Math.max(activeIndex - amount, 0); i <= Math.min(slideIndexLastInView + amount, len - 1); i += 1) { 1361 if (i !== activeIndex && (i > slideIndexLastInView || i < activeIndex)) { 1362 unlazy(swiper, i); 1363 } 1364 } 1365 } 1366}; 1367function getActiveIndexByTranslate(swiper) { 1368 const { 1369 slidesGrid, 1370 params 1371 } = swiper; 1372 const translate2 = swiper.rtlTranslate ? swiper.translate : -swiper.translate; 1373 let activeIndex; 1374 for (let i = 0; i < slidesGrid.length; i += 1) { 1375 if (typeof slidesGrid[i + 1] !== "undefined") { 1376 if (translate2 >= slidesGrid[i] && translate2 < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) { 1377 activeIndex = i; 1378 } else if (translate2 >= slidesGrid[i] && translate2 < slidesGrid[i + 1]) { 1379 activeIndex = i + 1; 1380 } 1381 } else if (translate2 >= slidesGrid[i]) { 1382 activeIndex = i; 1383 } 1384 } 1385 if (params.normalizeSlideIndex) { 1386 if (activeIndex < 0 || typeof activeIndex === "undefined") 1387 activeIndex = 0; 1388 } 1389 return activeIndex; 1390} 1391function updateActiveIndex(newActiveIndex) { 1392 const swiper = this; 1393 const translate2 = swiper.rtlTranslate ? swiper.translate : -swiper.translate; 1394 const { 1395 snapGrid, 1396 params, 1397 activeIndex: previousIndex, 1398 realIndex: previousRealIndex, 1399 snapIndex: previousSnapIndex 1400 } = swiper; 1401 let activeIndex = newActiveIndex; 1402 let snapIndex; 1403 const getVirtualRealIndex = (aIndex) => { 1404 let realIndex2 = aIndex - swiper.virtual.slidesBefore; 1405 if (realIndex2 < 0) { 1406 realIndex2 = swiper.virtual.slides.length + realIndex2; 1407 } 1408 if (realIndex2 >= swiper.virtual.slides.length) { 1409 realIndex2 -= swiper.virtual.slides.length; 1410 } 1411 return realIndex2; 1412 }; 1413 if (typeof activeIndex === "undefined") { 1414 activeIndex = getActiveIndexByTranslate(swiper); 1415 } 1416 if (snapGrid.indexOf(translate2) >= 0) { 1417 snapIndex = snapGrid.indexOf(translate2); 1418 } else { 1419 const skip = Math.min(params.slidesPerGroupSkip, activeIndex); 1420 snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup); 1421 } 1422 if (snapIndex >= snapGrid.length) 1423 snapIndex = snapGrid.length - 1; 1424 if (activeIndex === previousIndex && !swiper.params.loop) { 1425 if (snapIndex !== previousSnapIndex) { 1426 swiper.snapIndex = snapIndex; 1427 swiper.emit("snapIndexChange"); 1428 } 1429 return; 1430 } 1431 if (activeIndex === previousIndex && swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) { 1432 swiper.realIndex = getVirtualRealIndex(activeIndex); 1433 return; 1434 } 1435 const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1; 1436 let realIndex; 1437 if (swiper.virtual && params.virtual.enabled && params.loop) { 1438 realIndex = getVirtualRealIndex(activeIndex); 1439 } else if (gridEnabled) { 1440 const firstSlideInColumn = swiper.slides.filter((slideEl) => slideEl.column === activeIndex)[0]; 1441 let activeSlideIndex = parseInt(firstSlideInColumn.getAttribute("data-swiper-slide-index"), 10); 1442 if (Number.isNaN(activeSlideIndex)) { 1443 activeSlideIndex = Math.max(swiper.slides.indexOf(firstSlideInColumn), 0); 1444 } 1445 realIndex = Math.floor(activeSlideIndex / params.grid.rows); 1446 } else if (swiper.slides[activeIndex]) { 1447 const slideIndex = swiper.slides[activeIndex].getAttribute("data-swiper-slide-index"); 1448 if (slideIndex) { 1449 realIndex = parseInt(slideIndex, 10); 1450 } else { 1451 realIndex = activeIndex; 1452 } 1453 } else { 1454 realIndex = activeIndex; 1455 } 1456 Object.assign(swiper, { 1457 previousSnapIndex, 1458 snapIndex, 1459 previousRealIndex, 1460 realIndex, 1461 previousIndex, 1462 activeIndex 1463 }); 1464 if (swiper.initialized) { 1465 preload(swiper); 1466 } 1467 swiper.emit("activeIndexChange"); 1468 swiper.emit("snapIndexChange"); 1469 if (swiper.initialized || swiper.params.runCallbacksOnInit) { 1470 if (previousRealIndex !== realIndex) { 1471 swiper.emit("realIndexChange"); 1472 } 1473 swiper.emit("slideChange"); 1474 } 1475} 1476function updateClickedSlide(el, path) { 1477 const swiper = this; 1478 const params = swiper.params; 1479 let slide2 = el.closest(`.${params.slideClass}, swiper-slide`); 1480 if (!slide2 && swiper.isElement && path && path.length > 1 && path.includes(el)) { 1481 [...path.slice(path.indexOf(el) + 1, path.length)].forEach((pathEl) => { 1482 if (!slide2 && pathEl.matches && pathEl.matches(`.${params.slideClass}, swiper-slide`)) { 1483 slide2 = pathEl; 1484 } 1485 }); 1486 } 1487 let slideFound = false; 1488 let slideIndex; 1489 if (slide2) { 1490 for (let i = 0; i < swiper.slides.length; i += 1) { 1491 if (swiper.slides[i] === slide2) { 1492 slideFound = true; 1493 slideIndex = i; 1494 break; 1495 } 1496 } 1497 } 1498 if (slide2 && slideFound) { 1499 swiper.clickedSlide = slide2; 1500 if (swiper.virtual && swiper.params.virtual.enabled) { 1501 swiper.clickedIndex = parseInt(slide2.getAttribute("data-swiper-slide-index"), 10); 1502 } else { 1503 swiper.clickedIndex = slideIndex; 1504 } 1505 } else { 1506 swiper.clickedSlide = void 0; 1507 swiper.clickedIndex = void 0; 1508 return; 1509 } 1510 if (params.slideToClickedSlide && swiper.clickedIndex !== void 0 && swiper.clickedIndex !== swiper.activeIndex) { 1511 swiper.slideToClickedSlide(); 1512 } 1513} 1514var update = { 1515 updateSize, 1516 updateSlides, 1517 updateAutoHeight, 1518 updateSlidesOffset, 1519 updateSlidesProgress, 1520 updateProgress, 1521 updateSlidesClasses, 1522 updateActiveIndex, 1523 updateClickedSlide 1524}; 1525function getSwiperTranslate(axis) { 1526 if (axis === void 0) { 1527 axis = this.isHorizontal() ? "x" : "y"; 1528 } 1529 const swiper = this; 1530 const { 1531 params, 1532 rtlTranslate: rtl, 1533 translate: translate2, 1534 wrapperEl 1535 } = swiper; 1536 if (params.virtualTranslate) { 1537 return rtl ? -translate2 : translate2; 1538 } 1539 if (params.cssMode) { 1540 return translate2; 1541 } 1542 let currentTranslate = getTranslate(wrapperEl, axis); 1543 currentTranslate += swiper.cssOverflowAdjustment(); 1544 if (rtl) 1545 currentTranslate = -currentTranslate; 1546 return currentTranslate || 0; 1547} 1548function setTranslate(translate2, byController) { 1549 const swiper = this; 1550 const { 1551 rtlTranslate: rtl, 1552 params, 1553 wrapperEl, 1554 progress 1555 } = swiper; 1556 let x = 0; 1557 let y = 0; 1558 const z = 0; 1559 if (swiper.isHorizontal()) { 1560 x = rtl ? -translate2 : translate2; 1561 } else { 1562 y = translate2; 1563 } 1564 if (params.roundLengths) { 1565 x = Math.floor(x); 1566 y = Math.floor(y); 1567 } 1568 swiper.previousTranslate = swiper.translate; 1569 swiper.translate = swiper.isHorizontal() ? x : y; 1570 if (params.cssMode) { 1571 wrapperEl[swiper.isHorizontal() ? "scrollLeft" : "scrollTop"] = swiper.isHorizontal() ? -x : -y; 1572 } else if (!params.virtualTranslate) { 1573 if (swiper.isHorizontal()) { 1574 x -= swiper.cssOverflowAdjustment(); 1575 } else { 1576 y -= swiper.cssOverflowAdjustment(); 1577 } 1578 wrapperEl.style.transform = `translate3d(${x}px, ${y}px, ${z}px)`; 1579 } 1580 let newProgress; 1581 const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); 1582 if (translatesDiff === 0) { 1583 newProgress = 0; 1584 } else { 1585 newProgress = (translate2 - swiper.minTranslate()) / translatesDiff; 1586 } 1587 if (newProgress !== progress) { 1588 swiper.updateProgress(translate2); 1589 } 1590 swiper.emit("setTranslate", swiper.translate, byController); 1591} 1592function minTranslate() { 1593 return -this.snapGrid[0]; 1594} 1595function maxTranslate() { 1596 return -this.snapGrid[this.snapGrid.length - 1]; 1597} 1598function translateTo(translate2, speed, runCallbacks, translateBounds, internal) { 1599 if (translate2 === void 0) { 1600 translate2 = 0; 1601 } 1602 if (speed === void 0) { 1603 speed = this.params.speed; 1604 } 1605 if (runCallbacks === void 0) { 1606 runCallbacks = true; 1607 } 1608 if (translateBounds === void 0) { 1609 translateBounds = true; 1610 } 1611 const swiper = this; 1612 const { 1613 params, 1614 wrapperEl 1615 } = swiper; 1616 if (swiper.animating && params.preventInteractionOnTransition) { 1617 return false; 1618 } 1619 const minTranslate2 = swiper.minTranslate(); 1620 const maxTranslate2 = swiper.maxTranslate(); 1621 let newTranslate; 1622 if (translateBounds && translate2 > minTranslate2) 1623 newTranslate = minTranslate2; 1624 else if (translateBounds && translate2 < maxTranslate2) 1625 newTranslate = maxTranslate2; 1626 else 1627 newTranslate = translate2; 1628 swiper.updateProgress(newTranslate); 1629 if (params.cssMode) { 1630 const isH = swiper.isHorizontal(); 1631 if (speed === 0) { 1632 wrapperEl[isH ? "scrollLeft" : "scrollTop"] = -newTranslate; 1633 } else { 1634 if (!swiper.support.smoothScroll) { 1635 animateCSSModeScroll({ 1636 swiper, 1637 targetPosition: -newTranslate, 1638 side: isH ? "left" : "top" 1639 }); 1640 return true; 1641 } 1642 wrapperEl.scrollTo({ 1643 [isH ? "left" : "top"]: -newTranslate, 1644 behavior: "smooth" 1645 }); 1646 } 1647 return true; 1648 } 1649 if (speed === 0) { 1650 swiper.setTransition(0); 1651 swiper.setTranslate(newTranslate); 1652 if (runCallbacks) { 1653 swiper.emit("beforeTransitionStart", speed, internal); 1654 swiper.emit("transitionEnd"); 1655 } 1656 } else { 1657 swiper.setTransition(speed); 1658 swiper.setTranslate(newTranslate); 1659 if (runCallbacks) { 1660 swiper.emit("beforeTransitionStart", speed, internal); 1661 swiper.emit("transitionStart"); 1662 } 1663 if (!swiper.animating) { 1664 swiper.animating = true; 1665 if (!swiper.onTranslateToWrapperTransitionEnd) { 1666 swiper.onTranslateToWrapperTransitionEnd = function transitionEnd2(e) { 1667 if (!swiper || swiper.destroyed) 1668 return; 1669 if (e.target !== this) 1670 return; 1671 swiper.wrapperEl.removeEventListener("transitionend", swiper.onTranslateToWrapperTransitionEnd); 1672 swiper.onTranslateToWrapperTransitionEnd = null; 1673 delete swiper.onTranslateToWrapperTransitionEnd; 1674 swiper.animating = false; 1675 if (runCallbacks) { 1676 swiper.emit("transitionEnd"); 1677 } 1678 }; 1679 } 1680 swiper.wrapperEl.addEventListener("transitionend", swiper.onTranslateToWrapperTransitionEnd); 1681 } 1682 } 1683 return true; 1684} 1685var translate = { 1686 getTranslate: getSwiperTranslate, 1687 setTranslate, 1688 minTranslate, 1689 maxTranslate, 1690 translateTo 1691}; 1692function setTransition(duration, byController) { 1693 const swiper = this; 1694 if (!swiper.params.cssMode) { 1695 swiper.wrapperEl.style.transitionDuration = `${duration}ms`; 1696 swiper.wrapperEl.style.transitionDelay = duration === 0 ? `0ms` : ""; 1697 } 1698 swiper.emit("setTransition", duration, byController); 1699} 1700function transitionEmit(_ref) { 1701 let { 1702 swiper, 1703 runCallbacks, 1704 direction, 1705 step 1706 } = _ref; 1707 const { 1708 activeIndex, 1709 previousIndex 1710 } = swiper; 1711 let dir = direction; 1712 if (!dir) { 1713 if (activeIndex > previousIndex) 1714 dir = "next"; 1715 else if (activeIndex < previousIndex) 1716 dir = "prev"; 1717 else 1718 dir = "reset"; 1719 } 1720 swiper.emit(`transition${step}`); 1721 if (runCallbacks && activeIndex !== previousIndex) { 1722 if (dir === "reset") { 1723 swiper.emit(`slideResetTransition${step}`); 1724 return; 1725 } 1726 swiper.emit(`slideChangeTransition${step}`); 1727 if (dir === "next") { 1728 swiper.emit(`slideNextTransition${step}`); 1729 } else { 1730 swiper.emit(`slidePrevTransition${step}`); 1731 } 1732 } 1733} 1734function transitionStart(runCallbacks, direction) { 1735 if (runCallbacks === void 0) { 1736 runCallbacks = true; 1737 } 1738 const swiper = this; 1739 const { 1740 params 1741 } = swiper; 1742 if (params.cssMode) 1743 return; 1744 if (params.autoHeight) { 1745 swiper.updateAutoHeight(); 1746 } 1747 transitionEmit({ 1748 swiper, 1749 runCallbacks, 1750 direction, 1751 step: "Start" 1752 }); 1753} 1754function transitionEnd(runCallbacks, direction) { 1755 if (runCallbacks === void 0) { 1756 runCallbacks = true; 1757 } 1758 const swiper = this; 1759 const { 1760 params 1761 } = swiper; 1762 swiper.animating = false; 1763 if (params.cssMode) 1764 return; 1765 swiper.setTransition(0); 1766 transitionEmit({ 1767 swiper, 1768 runCallbacks, 1769 direction, 1770 step: "End" 1771 }); 1772} 1773var transition = { 1774 setTransition, 1775 transitionStart, 1776 transitionEnd 1777}; 1778function slideTo(index, speed, runCallbacks, internal, initial) { 1779 if (index === void 0) { 1780 index = 0; 1781 } 1782 if (runCallbacks === void 0) { 1783 runCallbacks = true; 1784 } 1785 if (typeof index === "string") { 1786 index = parseInt(index, 10); 1787 } 1788 const swiper = this; 1789 let slideIndex = index; 1790 if (slideIndex < 0) 1791 slideIndex = 0; 1792 const { 1793 params, 1794 snapGrid, 1795 slidesGrid, 1796 previousIndex, 1797 activeIndex, 1798 rtlTranslate: rtl, 1799 wrapperEl, 1800 enabled 1801 } = swiper; 1802 if (!enabled && !internal && !initial || swiper.destroyed || swiper.animating && params.preventInteractionOnTransition) { 1803 return false; 1804 } 1805 if (typeof speed === "undefined") { 1806 speed = swiper.params.speed; 1807 } 1808 const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex); 1809 let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup); 1810 if (snapIndex >= snapGrid.length) 1811 snapIndex = snapGrid.length - 1; 1812 const translate2 = -snapGrid[snapIndex]; 1813 if (params.normalizeSlideIndex) { 1814 for (let i = 0; i < slidesGrid.length; i += 1) { 1815 const normalizedTranslate = -Math.floor(translate2 * 100); 1816 const normalizedGrid = Math.floor(slidesGrid[i] * 100); 1817 const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100); 1818 if (typeof slidesGrid[i + 1] !== "undefined") { 1819 if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) { 1820 slideIndex = i; 1821 } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) { 1822 slideIndex = i + 1; 1823 } 1824 } else if (normalizedTranslate >= normalizedGrid) { 1825 slideIndex = i; 1826 } 1827 } 1828 } 1829 if (swiper.initialized && slideIndex !== activeIndex) { 1830 if (!swiper.allowSlideNext && (rtl ? translate2 > swiper.translate && translate2 > swiper.minTranslate() : translate2 < swiper.translate && translate2 < swiper.minTranslate())) { 1831 return false; 1832 } 1833 if (!swiper.allowSlidePrev && translate2 > swiper.translate && translate2 > swiper.maxTranslate()) { 1834 if ((activeIndex || 0) !== slideIndex) { 1835 return false; 1836 } 1837 } 1838 } 1839 if (slideIndex !== (previousIndex || 0) && runCallbacks) { 1840 swiper.emit("beforeSlideChangeStart"); 1841 } 1842 swiper.updateProgress(translate2); 1843 let direction; 1844 if (slideIndex > activeIndex) 1845 direction = "next"; 1846 else if (slideIndex < activeIndex) 1847 direction = "prev"; 1848 else 1849 direction = "reset"; 1850 if (rtl && -translate2 === swiper.translate || !rtl && translate2 === swiper.translate) { 1851 swiper.updateActiveIndex(slideIndex); 1852 if (params.autoHeight) { 1853 swiper.updateAutoHeight(); 1854 } 1855 swiper.updateSlidesClasses(); 1856 if (params.effect !== "slide") { 1857 swiper.setTranslate(translate2); 1858 } 1859 if (direction !== "reset") { 1860 swiper.transitionStart(runCallbacks, direction); 1861 swiper.transitionEnd(runCallbacks, direction); 1862 } 1863 return false; 1864 } 1865 if (params.cssMode) { 1866 const isH = swiper.isHorizontal(); 1867 const t = rtl ? translate2 : -translate2; 1868 if (speed === 0) { 1869 const isVirtual = swiper.virtual && swiper.params.virtual.enabled; 1870 if (isVirtual) { 1871 swiper.wrapperEl.style.scrollSnapType = "none"; 1872 swiper._immediateVirtual = true; 1873 } 1874 if (isVirtual && !swiper._cssModeVirtualInitialSet && swiper.params.initialSlide > 0) { 1875 swiper._cssModeVirtualInitialSet = true; 1876 requestAnimationFrame(() => { 1877 wrapperEl[isH ? "scrollLeft" : "scrollTop"] = t; 1878 }); 1879 } else { 1880 wrapperEl[isH ? "scrollLeft" : "scrollTop"] = t; 1881 } 1882 if (isVirtual) { 1883 requestAnimationFrame(() => { 1884 swiper.wrapperEl.style.scrollSnapType = ""; 1885 swiper._immediateVirtual = false; 1886 }); 1887 } 1888 } else { 1889 if (!swiper.support.smoothScroll) { 1890 animateCSSModeScroll({ 1891 swiper, 1892 targetPosition: t, 1893 side: isH ? "left" : "top" 1894 }); 1895 return true; 1896 } 1897 wrapperEl.scrollTo({ 1898 [isH ? "left" : "top"]: t, 1899 behavior: "smooth" 1900 }); 1901 } 1902 return true; 1903 } 1904 swiper.setTransition(speed); 1905 swiper.setTranslate(translate2); 1906 swiper.updateActiveIndex(slideIndex); 1907 swiper.updateSlidesClasses(); 1908 swiper.emit("beforeTransitionStart", speed, internal); 1909 swiper.transitionStart(runCallbacks, direction); 1910 if (speed === 0) { 1911 swiper.transitionEnd(runCallbacks, direction); 1912 } else if (!swiper.animating) { 1913 swiper.animating = true; 1914 if (!swiper.onSlideToWrapperTransitionEnd) { 1915 swiper.onSlideToWrapperTransitionEnd = function transitionEnd2(e) { 1916 if (!swiper || swiper.destroyed) 1917 return; 1918 if (e.target !== this) 1919 return; 1920 swiper.wrapperEl.removeEventListener("transitionend", swiper.onSlideToWrapperTransitionEnd); 1921 swiper.onSlideToWrapperTransitionEnd = null; 1922 delete swiper.onSlideToWrapperTransitionEnd; 1923 swiper.transitionEnd(runCallbacks, direction); 1924 }; 1925 } 1926 swiper.wrapperEl.addEventListener("transitionend", swiper.onSlideToWrapperTransitionEnd); 1927 } 1928 return true; 1929} 1930function slideToLoop(index, speed, runCallbacks, internal) { 1931 if (index === void 0) { 1932 index = 0; 1933 } 1934 if (runCallbacks === void 0) { 1935 runCallbacks = true; 1936 } 1937 if (typeof index === "string") { 1938 const indexAsNumber = parseInt(index, 10); 1939 index = indexAsNumber; 1940 } 1941 const swiper = this; 1942 if (swiper.destroyed) 1943 return; 1944 if (typeof speed === "undefined") { 1945 speed = swiper.params.speed; 1946 } 1947 const gridEnabled = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1; 1948 let newIndex = index; 1949 if (swiper.params.loop) { 1950 if (swiper.virtual && swiper.params.virtual.enabled) { 1951 newIndex = newIndex + swiper.virtual.slidesBefore; 1952 } else { 1953 let targetSlideIndex; 1954 if (gridEnabled) { 1955 const slideIndex = newIndex * swiper.params.grid.rows; 1956 targetSlideIndex = swiper.slides.filter((slideEl) => slideEl.getAttribute("data-swiper-slide-index") * 1 === slideIndex)[0].column; 1957 } else { 1958 targetSlideIndex = swiper.getSlideIndexByData(newIndex); 1959 } 1960 const cols = gridEnabled ? Math.ceil(swiper.slides.length / swiper.params.grid.rows) : swiper.slides.length; 1961 const { 1962 centeredSlides 1963 } = swiper.params; 1964 let slidesPerView = swiper.params.slidesPerView; 1965 if (slidesPerView === "auto") { 1966 slidesPerView = swiper.slidesPerViewDynamic(); 1967 } else { 1968 slidesPerView = Math.ceil(parseFloat(swiper.params.slidesPerView, 10)); 1969 if (centeredSlides && slidesPerView % 2 === 0) { 1970 slidesPerView = slidesPerView + 1; 1971 } 1972 } 1973 let needLoopFix = cols - targetSlideIndex < slidesPerView; 1974 if (centeredSlides) { 1975 needLoopFix = needLoopFix || targetSlideIndex < Math.ceil(slidesPerView / 2); 1976 } 1977 if (internal && centeredSlides && swiper.params.slidesPerView !== "auto" && !gridEnabled) { 1978 needLoopFix = false; 1979 } 1980 if (needLoopFix) { 1981 const direction = centeredSlides ? targetSlideIndex < swiper.activeIndex ? "prev" : "next" : targetSlideIndex - swiper.activeIndex - 1 < swiper.params.slidesPerView ? "next" : "prev"; 1982 swiper.loopFix({ 1983 direction, 1984 slideTo: true, 1985 activeSlideIndex: direction === "next" ? targetSlideIndex + 1 : targetSlideIndex - cols + 1, 1986 slideRealIndex: direction === "next" ? swiper.realIndex : void 0 1987 }); 1988 } 1989 if (gridEnabled) { 1990 const slideIndex = newIndex * swiper.params.grid.rows; 1991 newIndex = swiper.slides.filter((slideEl) => slideEl.getAttribute("data-swiper-slide-index") * 1 === slideIndex)[0].column; 1992 } else { 1993 newIndex = swiper.getSlideIndexByData(newIndex); 1994 } 1995 } 1996 } 1997 requestAnimationFrame(() => { 1998 swiper.slideTo(newIndex, speed, runCallbacks, internal); 1999 }); 2000 return swiper; 2001} 2002function slideNext(speed, runCallbacks, internal) { 2003 if (runCallbacks === void 0) { 2004 runCallbacks = true; 2005 } 2006 const swiper = this; 2007 const { 2008 enabled, 2009 params, 2010 animating 2011 } = swiper; 2012 if (!enabled || swiper.destroyed) 2013 return swiper; 2014 if (typeof speed === "undefined") { 2015 speed = swiper.params.speed; 2016 } 2017 let perGroup = params.slidesPerGroup; 2018 if (params.slidesPerView === "auto" && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) { 2019 perGroup = Math.max(swiper.slidesPerViewDynamic("current", true), 1); 2020 } 2021 const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup; 2022 const isVirtual = swiper.virtual && params.virtual.enabled; 2023 if (params.loop) { 2024 if (animating && !isVirtual && params.loopPreventsSliding) 2025 return false; 2026 swiper.loopFix({ 2027 direction: "next" 2028 }); 2029 swiper._clientLeft = swiper.wrapperEl.clientLeft; 2030 if (swiper.activeIndex === swiper.slides.length - 1 && params.cssMode) { 2031 requestAnimationFrame(() => { 2032 swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal); 2033 }); 2034 return true; 2035 } 2036 } 2037 if (params.rewind && swiper.isEnd) { 2038 return swiper.slideTo(0, speed, runCallbacks, internal); 2039 } 2040 return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal); 2041} 2042function slidePrev(speed, runCallbacks, internal) { 2043 if (runCallbacks === void 0) { 2044 runCallbacks = true; 2045 } 2046 const swiper = this; 2047 const { 2048 params, 2049 snapGrid, 2050 slidesGrid, 2051 rtlTranslate, 2052 enabled, 2053 animating 2054 } = swiper; 2055 if (!enabled || swiper.destroyed) 2056 return swiper; 2057 if (typeof speed === "undefined") { 2058 speed = swiper.params.speed; 2059 } 2060 const isVirtual = swiper.virtual && params.virtual.enabled; 2061 if (params.loop) { 2062 if (animating && !isVirtual && params.loopPreventsSliding) 2063 return false; 2064 swiper.loopFix({ 2065 direction: "prev" 2066 }); 2067 swiper._clientLeft = swiper.wrapperEl.clientLeft; 2068 } 2069 const translate2 = rtlTranslate ? swiper.translate : -swiper.translate; 2070 function normalize(val) { 2071 if (val < 0) 2072 return -Math.floor(Math.abs(val)); 2073 return Math.floor(val); 2074 } 2075 const normalizedTranslate = normalize(translate2); 2076 const normalizedSnapGrid = snapGrid.map((val) => normalize(val)); 2077 let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1]; 2078 if (typeof prevSnap === "undefined" && params.cssMode) { 2079 let prevSnapIndex; 2080 snapGrid.forEach((snap, snapIndex) => { 2081 if (normalizedTranslate >= snap) { 2082 prevSnapIndex = snapIndex; 2083 } 2084 }); 2085 if (typeof prevSnapIndex !== "undefined") { 2086 prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex]; 2087 } 2088 } 2089 let prevIndex = 0; 2090 if (typeof prevSnap !== "undefined") { 2091 prevIndex = slidesGrid.indexOf(prevSnap); 2092 if (prevIndex < 0) 2093 prevIndex = swiper.activeIndex - 1; 2094 if (params.slidesPerView === "auto" && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) { 2095 prevIndex = prevIndex - swiper.slidesPerViewDynamic("previous", true) + 1; 2096 prevIndex = Math.max(prevIndex, 0); 2097 } 2098 } 2099 if (params.rewind && swiper.isBeginning) { 2100 const lastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1; 2101 return swiper.slideTo(lastIndex, speed, runCallbacks, internal); 2102 } else if (params.loop && swiper.activeIndex === 0 && params.cssMode) { 2103 requestAnimationFrame(() => { 2104 swiper.slideTo(prevIndex, speed, runCallbacks, internal); 2105 }); 2106 return true; 2107 } 2108 return swiper.slideTo(prevIndex, speed, runCallbacks, internal); 2109} 2110function slideReset(speed, runCallbacks, internal) { 2111 if (runCallbacks === void 0) { 2112 runCallbacks = true; 2113 } 2114 const swiper = this; 2115 if (swiper.destroyed) 2116 return; 2117 if (typeof speed === "undefined") { 2118 speed = swiper.params.speed; 2119 } 2120 return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal); 2121} 2122function slideToClosest(speed, runCallbacks, internal, threshold) { 2123 if (runCallbacks === void 0) { 2124 runCallbacks = true; 2125 } 2126 if (threshold === void 0) { 2127 threshold = 0.5; 2128 } 2129 const swiper = this; 2130 if (swiper.destroyed) 2131 return; 2132 if (typeof speed === "undefined") { 2133 speed = swiper.params.speed; 2134 } 2135 let index = swiper.activeIndex; 2136 const skip = Math.min(swiper.params.slidesPerGroupSkip, index); 2137 const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup); 2138 const translate2 = swiper.rtlTranslate ? swiper.translate : -swiper.translate; 2139 if (translate2 >= swiper.snapGrid[snapIndex]) { 2140 const currentSnap = swiper.snapGrid[snapIndex]; 2141 const nextSnap = swiper.snapGrid[snapIndex + 1]; 2142 if (translate2 - currentSnap > (nextSnap - currentSnap) * threshold) { 2143 index += swiper.params.slidesPerGroup; 2144 } 2145 } else { 2146 const prevSnap = swiper.snapGrid[snapIndex - 1]; 2147 const currentSnap = swiper.snapGrid[snapIndex]; 2148 if (translate2 - prevSnap <= (currentSnap - prevSnap) * threshold) { 2149 index -= swiper.params.slidesPerGroup; 2150 } 2151 } 2152 index = Math.max(index, 0); 2153 index = Math.min(index, swiper.slidesGrid.length - 1); 2154 return swiper.slideTo(index, speed, runCallbacks, internal); 2155} 2156function slideToClickedSlide() { 2157 const swiper = this; 2158 if (swiper.destroyed) 2159 return; 2160 const { 2161 params, 2162 slidesEl 2163 } = swiper; 2164 const slidesPerView = params.slidesPerView === "auto" ? swiper.slidesPerViewDynamic() : params.slidesPerView; 2165 let slideToIndex = swiper.clickedIndex; 2166 let realIndex; 2167 const slideSelector = swiper.isElement ? `swiper-slide` : `.${params.slideClass}`; 2168 if (params.loop) { 2169 if (swiper.animating) 2170 return; 2171 realIndex = parseInt(swiper.clickedSlide.getAttribute("data-swiper-slide-index"), 10); 2172 if (params.centeredSlides) { 2173 if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) { 2174 swiper.loopFix(); 2175 slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0]); 2176 nextTick(() => { 2177 swiper.slideTo(slideToIndex); 2178 }); 2179 } else { 2180 swiper.slideTo(slideToIndex); 2181 } 2182 } else if (slideToIndex > swiper.slides.length - slidesPerView) { 2183 swiper.loopFix(); 2184 slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0]); 2185 nextTick(() => { 2186 swiper.slideTo(slideToIndex); 2187 }); 2188 } else { 2189 swiper.slideTo(slideToIndex); 2190 } 2191 } else { 2192 swiper.slideTo(slideToIndex); 2193 } 2194} 2195var slide = { 2196 slideTo, 2197 slideToLoop, 2198 slideNext, 2199 slidePrev, 2200 slideReset, 2201 slideToClosest, 2202 slideToClickedSlide 2203}; 2204function loopCreate(slideRealIndex) { 2205 const swiper = this; 2206 const { 2207 params, 2208 slidesEl 2209 } = swiper; 2210 if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) 2211 return; 2212 const initSlides = () => { 2213 const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`); 2214 slides.forEach((el, index) => { 2215 el.setAttribute("data-swiper-slide-index", index); 2216 }); 2217 }; 2218 const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1; 2219 const slidesPerGroup = params.slidesPerGroup * (gridEnabled ? params.grid.rows : 1); 2220 const shouldFillGroup = swiper.slides.length % slidesPerGroup !== 0; 2221 const shouldFillGrid = gridEnabled && swiper.slides.length % params.grid.rows !== 0; 2222 const addBlankSlides = (amountOfSlides) => { 2223 for (let i = 0; i < amountOfSlides; i += 1) { 2224 const slideEl = swiper.isElement ? createElement("swiper-slide", [params.slideBlankClass]) : createElement("div", [params.slideClass, params.slideBlankClass]); 2225 swiper.slidesEl.append(slideEl); 2226 } 2227 }; 2228 if (shouldFillGroup) { 2229 if (params.loopAddBlankSlides) { 2230 const slidesToAdd = slidesPerGroup - swiper.slides.length % slidesPerGroup; 2231 addBlankSlides(slidesToAdd); 2232 swiper.recalcSlides(); 2233 swiper.updateSlides(); 2234 } else { 2235 showWarning("Swiper Loop Warning: The number of slides is not even to slidesPerGroup, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)"); 2236 } 2237 initSlides(); 2238 } else if (shouldFillGrid) { 2239 if (params.loopAddBlankSlides) { 2240 const slidesToAdd = params.grid.rows - swiper.slides.length % params.grid.rows; 2241 addBlankSlides(slidesToAdd); 2242 swiper.recalcSlides(); 2243 swiper.updateSlides(); 2244 } else { 2245 showWarning("Swiper Loop Warning: The number of slides is not even to grid.rows, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)"); 2246 } 2247 initSlides(); 2248 } else { 2249 initSlides(); 2250 } 2251 swiper.loopFix({ 2252 slideRealIndex, 2253 direction: params.centeredSlides ? void 0 : "next" 2254 }); 2255} 2256function loopFix(_temp) { 2257 let { 2258 slideRealIndex, 2259 slideTo: slideTo2 = true, 2260 direction, 2261 setTranslate: setTranslate2, 2262 activeSlideIndex, 2263 byController, 2264 byMousewheel 2265 } = _temp === void 0 ? {} : _temp; 2266 const swiper = this; 2267 if (!swiper.params.loop) 2268 return; 2269 swiper.emit("beforeLoopFix"); 2270 const { 2271 slides, 2272 allowSlidePrev, 2273 allowSlideNext, 2274 slidesEl, 2275 params 2276 } = swiper; 2277 const { 2278 centeredSlides 2279 } = params; 2280 swiper.allowSlidePrev = true; 2281 swiper.allowSlideNext = true; 2282 if (swiper.virtual && params.virtual.enabled) { 2283 if (slideTo2) { 2284 if (!params.centeredSlides && swiper.snapIndex === 0) { 2285 swiper.slideTo(swiper.virtual.slides.length, 0, false, true); 2286 } else if (params.centeredSlides && swiper.snapIndex < params.slidesPerView) { 2287 swiper.slideTo(swiper.virtual.slides.length + swiper.snapIndex, 0, false, true); 2288 } else if (swiper.snapIndex === swiper.snapGrid.length - 1) { 2289 swiper.slideTo(swiper.virtual.slidesBefore, 0, false, true); 2290 } 2291 } 2292 swiper.allowSlidePrev = allowSlidePrev; 2293 swiper.allowSlideNext = allowSlideNext; 2294 swiper.emit("loopFix"); 2295 return; 2296 } 2297 let slidesPerView = params.slidesPerView; 2298 if (slidesPerView === "auto") { 2299 slidesPerView = swiper.slidesPerViewDynamic(); 2300 } else { 2301 slidesPerView = Math.ceil(parseFloat(params.slidesPerView, 10)); 2302 if (centeredSlides && slidesPerView % 2 === 0) { 2303 slidesPerView = slidesPerView + 1; 2304 } 2305 } 2306 const slidesPerGroup = params.slidesPerGroupAuto ? slidesPerView : params.slidesPerGroup; 2307 let loopedSlides = slidesPerGroup; 2308 if (loopedSlides % slidesPerGroup !== 0) { 2309 loopedSlides += slidesPerGroup - loopedSlides % slidesPerGroup; 2310 } 2311 loopedSlides += params.loopAdditionalSlides; 2312 swiper.loopedSlides = loopedSlides; 2313 const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1; 2314 if (slides.length < slidesPerView + loopedSlides) { 2315 showWarning("Swiper Loop Warning: The number of slides is not enough for loop mode, it will be disabled and not function properly. You need to add more slides (or make duplicates) or lower the values of slidesPerView and slidesPerGroup parameters"); 2316 } else if (gridEnabled && params.grid.fill === "row") { 2317 showWarning("Swiper Loop Warning: Loop mode is not compatible with grid.fill = `row`"); 2318 } 2319 const prependSlidesIndexes = []; 2320 const appendSlidesIndexes = []; 2321 let activeIndex = swiper.activeIndex; 2322 if (typeof activeSlideIndex === "undefined") { 2323 activeSlideIndex = swiper.getSlideIndex(slides.filter((el) => el.classList.contains(params.slideActiveClass))[0]); 2324 } else { 2325 activeIndex = activeSlideIndex; 2326 } 2327 const isNext = direction === "next" || !direction; 2328 const isPrev = direction === "prev" || !direction; 2329 let slidesPrepended = 0; 2330 let slidesAppended = 0; 2331 const cols = gridEnabled ? Math.ceil(slides.length / params.grid.rows) : slides.length; 2332 const activeColIndex = gridEnabled ? slides[activeSlideIndex].column : activeSlideIndex; 2333 const activeColIndexWithShift = activeColIndex + (centeredSlides && typeof setTranslate2 === "undefined" ? -slidesPerView / 2 + 0.5 : 0); 2334 if (activeColIndexWithShift < loopedSlides) { 2335 slidesPrepended = Math.max(loopedSlides - activeColIndexWithShift, slidesPerGroup); 2336 for (let i = 0; i < loopedSlides - activeColIndexWithShift; i += 1) { 2337 const index = i - Math.floor(i / cols) * cols; 2338 if (gridEnabled) { 2339 const colIndexToPrepend = cols - index - 1; 2340 for (let i2 = slides.length - 1; i2 >= 0; i2 -= 1) { 2341 if (slides[i2].column === colIndexToPrepend) 2342 prependSlidesIndexes.push(i2); 2343 } 2344 } else { 2345 prependSlidesIndexes.push(cols - index - 1); 2346 } 2347 } 2348 } else if (activeColIndexWithShift + slidesPerView > cols - loopedSlides) { 2349 slidesAppended = Math.max(activeColIndexWithShift - (cols - loopedSlides * 2), slidesPerGroup); 2350 for (let i = 0; i < slidesAppended; i += 1) { 2351 const index = i - Math.floor(i / cols) * cols; 2352 if (gridEnabled) { 2353 slides.forEach((slide2, slideIndex) => { 2354 if (slide2.column === index) 2355 appendSlidesIndexes.push(slideIndex); 2356 }); 2357 } else { 2358 appendSlidesIndexes.push(index); 2359 } 2360 } 2361 } 2362 swiper.__preventObserver__ = true; 2363 requestAnimationFrame(() => { 2364 swiper.__preventObserver__ = false; 2365 }); 2366 if (isPrev) { 2367 prependSlidesIndexes.forEach((index) => { 2368 slides[index].swiperLoopMoveDOM = true; 2369 slidesEl.prepend(slides[index]); 2370 slides[index].swiperLoopMoveDOM = false; 2371 }); 2372 } 2373 if (isNext) { 2374 appendSlidesIndexes.forEach((index) => { 2375 slides[index].swiperLoopMoveDOM = true; 2376 slidesEl.append(slides[index]); 2377 slides[index].swiperLoopMoveDOM = false; 2378 }); 2379 } 2380 swiper.recalcSlides(); 2381 if (params.slidesPerView === "auto") { 2382 swiper.updateSlides(); 2383 } else if (gridEnabled && (prependSlidesIndexes.length > 0 && isPrev || appendSlidesIndexes.length > 0 && isNext)) { 2384 swiper.slides.forEach((slide2, slideIndex) => { 2385 swiper.grid.updateSlide(slideIndex, slide2, swiper.slides); 2386 }); 2387 } 2388 if (params.watchSlidesProgress) { 2389 swiper.updateSlidesOffset(); 2390 } 2391 if (slideTo2) { 2392 if (prependSlidesIndexes.length > 0 && isPrev) { 2393 if (typeof slideRealIndex === "undefined") { 2394 const currentSlideTranslate = swiper.slidesGrid[activeIndex]; 2395 const newSlideTranslate = swiper.slidesGrid[activeIndex + slidesPrepended]; 2396 const diff = newSlideTranslate - currentSlideTranslate; 2397 if (byMousewheel) { 2398 swiper.setTranslate(swiper.translate - diff); 2399 } else { 2400 swiper.slideTo(activeIndex + Math.ceil(slidesPrepended), 0, false, true); 2401 if (setTranslate2) { 2402 swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff; 2403 swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff; 2404 } 2405 } 2406 } else { 2407 if (setTranslate2) { 2408 const shift = gridEnabled ? prependSlidesIndexes.length / params.grid.rows : prependSlidesIndexes.length; 2409 swiper.slideTo(swiper.activeIndex + shift, 0, false, true); 2410 swiper.touchEventsData.currentTranslate = swiper.translate; 2411 } 2412 } 2413 } else if (appendSlidesIndexes.length > 0 && isNext) { 2414 if (typeof slideRealIndex === "undefined") { 2415 const currentSlideTranslate = swiper.slidesGrid[activeIndex]; 2416 const newSlideTranslate = swiper.slidesGrid[activeIndex - slidesAppended]; 2417 const diff = newSlideTranslate - currentSlideTranslate; 2418 if (byMousewheel) { 2419 swiper.setTranslate(swiper.translate - diff); 2420 } else { 2421 swiper.slideTo(activeIndex - slidesAppended, 0, false, true); 2422 if (setTranslate2) { 2423 swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff; 2424 swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff; 2425 } 2426 } 2427 } else { 2428 const shift = gridEnabled ? appendSlidesIndexes.length / params.grid.rows : appendSlidesIndexes.length; 2429 swiper.slideTo(swiper.activeIndex - shift, 0, false, true); 2430 } 2431 } 2432 } 2433 swiper.allowSlidePrev = allowSlidePrev; 2434 swiper.allowSlideNext = allowSlideNext; 2435 if (swiper.controller && swiper.controller.control && !byController) { 2436 const loopParams = { 2437 slideRealIndex, 2438 direction, 2439 setTranslate: setTranslate2, 2440 activeSlideIndex, 2441 byController: true 2442 }; 2443 if (Array.isArray(swiper.controller.control)) { 2444 swiper.controller.control.forEach((c) => { 2445 if (!c.destroyed && c.params.loop) 2446 c.loopFix({ 2447 ...loopParams, 2448 slideTo: c.params.slidesPerView === params.slidesPerView ? slideTo2 : false 2449 }); 2450 }); 2451 } else if (swiper.controller.control instanceof swiper.constructor && swiper.controller.control.params.loop) { 2452 swiper.controller.control.loopFix({ 2453 ...loopParams, 2454 slideTo: swiper.controller.control.params.slidesPerView === params.slidesPerView ? slideTo2 : false 2455 }); 2456 } 2457 } 2458 swiper.emit("loopFix"); 2459} 2460function loopDestroy() { 2461 const swiper = this; 2462 const { 2463 params, 2464 slidesEl 2465 } = swiper; 2466 if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) 2467 return; 2468 swiper.recalcSlides(); 2469 const newSlidesOrder = []; 2470 swiper.slides.forEach((slideEl) => { 2471 const index = typeof slideEl.swiperSlideIndex === "undefined" ? slideEl.getAttribute("data-swiper-slide-index") * 1 : slideEl.swiperSlideIndex; 2472 newSlidesOrder[index] = slideEl; 2473 }); 2474 swiper.slides.forEach((slideEl) => { 2475 slideEl.removeAttribute("data-swiper-slide-index"); 2476 }); 2477 newSlidesOrder.forEach((slideEl) => { 2478 slidesEl.append(slideEl); 2479 }); 2480 swiper.recalcSlides(); 2481 swiper.slideTo(swiper.realIndex, 0); 2482} 2483var loop = { 2484 loopCreate, 2485 loopFix, 2486 loopDestroy 2487}; 2488function setGrabCursor(moving) { 2489 const swiper = this; 2490 if (!swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) 2491 return; 2492 const el = swiper.params.touchEventsTarget === "container" ? swiper.el : swiper.wrapperEl; 2493 if (swiper.isElement) { 2494 swiper.__preventObserver__ = true; 2495 } 2496 el.style.cursor = "move"; 2497 el.style.cursor = moving ? "grabbing" : "grab"; 2498 if (swiper.isElement) { 2499 requestAnimationFrame(() => { 2500 swiper.__preventObserver__ = false; 2501 }); 2502 } 2503} 2504function unsetGrabCursor() { 2505 const swiper = this; 2506 if (swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) { 2507 return; 2508 } 2509 if (swiper.isElement) { 2510 swiper.__preventObserver__ = true; 2511 } 2512 swiper[swiper.params.touchEventsTarget === "container" ? "el" : "wrapperEl"].style.cursor = ""; 2513 if (swiper.isElement) { 2514 requestAnimationFrame(() => { 2515 swiper.__preventObserver__ = false; 2516 }); 2517 } 2518} 2519var grabCursor = { 2520 setGrabCursor, 2521 unsetGrabCursor 2522}; 2523function closestElement(selector, base) { 2524 if (base === void 0) { 2525 base = this; 2526 } 2527 function __closestFrom(el) { 2528 if (!el || el === getDocument() || el === getWindow()) 2529 return null; 2530 if (el.assignedSlot) 2531 el = el.assignedSlot; 2532 const found = el.closest(selector); 2533 if (!found && !el.getRootNode) { 2534 return null; 2535 } 2536 return found || __closestFrom(el.getRootNode().host); 2537 } 2538 return __closestFrom(base); 2539} 2540function preventEdgeSwipe(swiper, event, startX) { 2541 const window2 = getWindow(); 2542 const { 2543 params 2544 } = swiper; 2545 const edgeSwipeDetection = params.edgeSwipeDetection; 2546 const edgeSwipeThreshold = params.edgeSwipeThreshold; 2547 if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window2.innerWidth - edgeSwipeThreshold)) { 2548 if (edgeSwipeDetection === "prevent") { 2549 event.preventDefault(); 2550 return true; 2551 } 2552 return false; 2553 } 2554 return true; 2555} 2556function onTouchStart(event) { 2557 const swiper = this; 2558 const document2 = getDocument(); 2559 let e = event; 2560 if (e.originalEvent) 2561 e = e.originalEvent; 2562 const data = swiper.touchEventsData; 2563 if (e.type === "pointerdown") { 2564 if (data.pointerId !== null && data.pointerId !== e.pointerId) { 2565 return; 2566 } 2567 data.pointerId = e.pointerId; 2568 } else if (e.type === "touchstart" && e.targetTouches.length === 1) { 2569 data.touchId = e.targetTouches[0].identifier; 2570 } 2571 if (e.type === "touchstart") { 2572 preventEdgeSwipe(swiper, e, e.targetTouches[0].pageX); 2573 return; 2574 } 2575 const { 2576 params, 2577 touches, 2578 enabled 2579 } = swiper; 2580 if (!enabled) 2581 return; 2582 if (!params.simulateTouch && e.pointerType === "mouse") 2583 return; 2584 if (swiper.animating && params.preventInteractionOnTransition) { 2585 return; 2586 } 2587 if (!swiper.animating && params.cssMode && params.loop) { 2588 swiper.loopFix(); 2589 } 2590 let targetEl = e.target; 2591 if (params.touchEventsTarget === "wrapper") { 2592 if (!swiper.wrapperEl.contains(targetEl)) 2593 return; 2594 } 2595 if ("which" in e && e.which === 3) 2596 return; 2597 if ("button" in e && e.button > 0) 2598 return; 2599 if (data.isTouched && data.isMoved) 2600 return; 2601 const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== ""; 2602 const eventPath = e.composedPath ? e.composedPath() : e.path; 2603 if (swipingClassHasValue && e.target && e.target.shadowRoot && eventPath) { 2604 targetEl = eventPath[0]; 2605 } 2606 const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`; 2607 const isTargetShadow = !!(e.target && e.target.shadowRoot); 2608 if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, targetEl) : targetEl.closest(noSwipingSelector))) { 2609 swiper.allowClick = true; 2610 return; 2611 } 2612 if (params.swipeHandler) { 2613 if (!targetEl.closest(params.swipeHandler)) 2614 return; 2615 } 2616 touches.currentX = e.pageX; 2617 touches.currentY = e.pageY; 2618 const startX = touches.currentX; 2619 const startY = touches.currentY; 2620 if (!preventEdgeSwipe(swiper, e, startX)) { 2621 return; 2622 } 2623 Object.assign(data, { 2624 isTouched: true, 2625 isMoved: false, 2626 allowTouchCallbacks: true, 2627 isScrolling: void 0, 2628 startMoving: void 0 2629 }); 2630 touches.startX = startX; 2631 touches.startY = startY; 2632 data.touchStartTime = now(); 2633 swiper.allowClick = true; 2634 swiper.updateSize(); 2635 swiper.swipeDirection = void 0; 2636 if (params.threshold > 0) 2637 data.allowThresholdMove = false; 2638 let preventDefault = true; 2639 if (targetEl.matches(data.focusableElements)) { 2640 preventDefault = false; 2641 if (targetEl.nodeName === "SELECT") { 2642 data.isTouched = false; 2643 } 2644 } 2645 if (document2.activeElement && document2.activeElement.matches(data.focusableElements) && document2.activeElement !== targetEl) { 2646 document2.activeElement.blur(); 2647 } 2648 const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault; 2649 if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !targetEl.isContentEditable) { 2650 e.preventDefault(); 2651 } 2652 if (params.freeMode && params.freeMode.enabled && swiper.freeMode && swiper.animating && !params.cssMode) { 2653 swiper.freeMode.onTouchStart(); 2654 } 2655 swiper.emit("touchStart", e); 2656} 2657function onTouchMove(event) { 2658 const document2 = getDocument(); 2659 const swiper = this; 2660 const data = swiper.touchEventsData; 2661 const { 2662 params, 2663 touches, 2664 rtlTranslate: rtl, 2665 enabled 2666 } = swiper; 2667 if (!enabled) 2668 return; 2669 if (!params.simulateTouch && event.pointerType === "mouse") 2670 return; 2671 let e = event; 2672 if (e.originalEvent) 2673 e = e.originalEvent; 2674 if (e.type === "pointermove") { 2675 if (data.touchId !== null) 2676 return; 2677 const id = e.pointerId; 2678 if (id !== data.pointerId) 2679 return; 2680 } 2681 let targetTouch; 2682 if (e.type === "touchmove") { 2683 targetTouch = [...e.changedTouches].filter((t) => t.identifier === data.touchId)[0]; 2684 if (!targetTouch || targetTouch.identifier !== data.touchId) 2685 return; 2686 } else { 2687 targetTouch = e; 2688 } 2689 if (!data.isTouched) { 2690 if (data.startMoving && data.isScrolling) { 2691 swiper.emit("touchMoveOpposite", e); 2692 } 2693 return; 2694 } 2695 const pageX = targetTouch.pageX; 2696 const pageY = targetTouch.pageY; 2697 if (e.preventedByNestedSwiper) { 2698 touches.startX = pageX; 2699 touches.startY = pageY; 2700 return; 2701 } 2702 if (!swiper.allowTouchMove) { 2703 if (!e.target.matches(data.focusableElements)) { 2704 swiper.allowClick = false; 2705 } 2706 if (data.isTouched) { 2707 Object.assign(touches, { 2708 startX: pageX, 2709 startY: pageY, 2710 currentX: pageX, 2711 currentY: pageY 2712 }); 2713 data.touchStartTime = now(); 2714 } 2715 return; 2716 } 2717 if (params.touchReleaseOnEdges && !params.loop) { 2718 if (swiper.isVertical()) { 2719 if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) { 2720 data.isTouched = false; 2721 data.isMoved = false; 2722 return; 2723 } 2724 } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) { 2725 return; 2726 } 2727 } 2728 if (document2.activeElement) { 2729 if (e.target === document2.activeElement && e.target.matches(data.focusableElements)) { 2730 data.isMoved = true; 2731 swiper.allowClick = false; 2732 return; 2733 } 2734 } 2735 if (data.allowTouchCallbacks) { 2736 swiper.emit("touchMove", e); 2737 } 2738 touches.previousX = touches.currentX; 2739 touches.previousY = touches.currentY; 2740 touches.currentX = pageX; 2741 touches.currentY = pageY; 2742 const diffX = touches.currentX - touches.startX; 2743 const diffY = touches.currentY - touches.startY; 2744 if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) 2745 return; 2746 if (typeof data.isScrolling === "undefined") { 2747 let touchAngle; 2748 if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) { 2749 data.isScrolling = false; 2750 } else { 2751 if (diffX * diffX + diffY * diffY >= 25) { 2752 touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI; 2753 data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle; 2754 } 2755 } 2756 } 2757 if (data.isScrolling) { 2758 swiper.emit("touchMoveOpposite", e); 2759 } 2760 if (typeof data.startMoving === "undefined") { 2761 if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) { 2762 data.startMoving = true; 2763 } 2764 } 2765 if (data.isScrolling || e.type === "touchmove" && data.preventTouchMoveFromPointerMove) { 2766 data.isTouched = false; 2767 return; 2768 } 2769 if (!data.startMoving) { 2770 return; 2771 } 2772 swiper.allowClick = false; 2773 if (!params.cssMode && e.cancelable) { 2774 e.preventDefault(); 2775 } 2776 if (params.touchMoveStopPropagation && !params.nested) { 2777 e.stopPropagation(); 2778 } 2779 let diff = swiper.isHorizontal() ? diffX : diffY; 2780 let touchesDiff = swiper.isHorizontal() ? touches.currentX - touches.previousX : touches.currentY - touches.previousY; 2781 if (params.oneWayMovement) { 2782 diff = Math.abs(diff) * (rtl ? 1 : -1); 2783 touchesDiff = Math.abs(touchesDiff) * (rtl ? 1 : -1); 2784 } 2785 touches.diff = diff; 2786 diff *= params.touchRatio; 2787 if (rtl) { 2788 diff = -diff; 2789 touchesDiff = -touchesDiff; 2790 } 2791 const prevTouchesDirection = swiper.touchesDirection; 2792 swiper.swipeDirection = diff > 0 ? "prev" : "next"; 2793 swiper.touchesDirection = touchesDiff > 0 ? "prev" : "next"; 2794 const isLoop = swiper.params.loop && !params.cssMode; 2795 const allowLoopFix = swiper.touchesDirection === "next" && swiper.allowSlideNext || swiper.touchesDirection === "prev" && swiper.allowSlidePrev; 2796 if (!data.isMoved) { 2797 if (isLoop && allowLoopFix) { 2798 swiper.loopFix({ 2799 direction: swiper.swipeDirection 2800 }); 2801 } 2802 data.startTranslate = swiper.getTranslate(); 2803 swiper.setTransition(0); 2804 if (swiper.animating) { 2805 const evt = new window.CustomEvent("transitionend", { 2806 bubbles: true, 2807 cancelable: true 2808 }); 2809 swiper.wrapperEl.dispatchEvent(evt); 2810 } 2811 data.allowMomentumBounce = false; 2812 if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { 2813 swiper.setGrabCursor(true); 2814 } 2815 swiper.emit("sliderFirstMove", e); 2816 } 2817 let loopFixed; 2818 (/* @__PURE__ */ new Date()).getTime(); 2819 if (data.isMoved && data.allowThresholdMove && prevTouchesDirection !== swiper.touchesDirection && isLoop && allowLoopFix && Math.abs(diff) >= 1) { 2820 Object.assign(touches, { 2821 startX: pageX, 2822 startY: pageY, 2823 currentX: pageX, 2824 currentY: pageY, 2825 startTranslate: data.currentTranslate 2826 }); 2827 data.loopSwapReset = true; 2828 data.startTranslate = data.currentTranslate; 2829 return; 2830 } 2831 swiper.emit("sliderMove", e); 2832 data.isMoved = true; 2833 data.currentTranslate = diff + data.startTranslate; 2834 let disableParentSwiper = true; 2835 let resistanceRatio = params.resistanceRatio; 2836 if (params.touchReleaseOnEdges) { 2837 resistanceRatio = 0; 2838 } 2839 if (diff > 0) { 2840 if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate > (params.centeredSlides ? swiper.minTranslate() - swiper.slidesSizesGrid[swiper.activeIndex + 1] : swiper.minTranslate())) { 2841 swiper.loopFix({ 2842 direction: "prev", 2843 setTranslate: true, 2844 activeSlideIndex: 0 2845 }); 2846 } 2847 if (data.currentTranslate > swiper.minTranslate()) { 2848 disableParentSwiper = false; 2849 if (params.resistance) { 2850 data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio; 2851 } 2852 } 2853 } else if (diff < 0) { 2854 if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate < (params.centeredSlides ? swiper.maxTranslate() + swiper.slidesSizesGrid[swiper.slidesSizesGrid.length - 1] : swiper.maxTranslate())) { 2855 swiper.loopFix({ 2856 direction: "next", 2857 setTranslate: true, 2858 activeSlideIndex: swiper.slides.length - (params.slidesPerView === "auto" ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10))) 2859 }); 2860 } 2861 if (data.currentTranslate < swiper.maxTranslate()) { 2862 disableParentSwiper = false; 2863 if (params.resistance) { 2864 data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio; 2865 } 2866 } 2867 } 2868 if (disableParentSwiper) { 2869 e.preventedByNestedSwiper = true; 2870 } 2871 if (!swiper.allowSlideNext && swiper.swipeDirection === "next" && data.currentTranslate < data.startTranslate) { 2872 data.currentTranslate = data.startTranslate; 2873 } 2874 if (!swiper.allowSlidePrev && swiper.swipeDirection === "prev" && data.currentTranslate > data.startTranslate) { 2875 data.currentTranslate = data.startTranslate; 2876 } 2877 if (!swiper.allowSlidePrev && !swiper.allowSlideNext) { 2878 data.currentTranslate = data.startTranslate; 2879 } 2880 if (params.threshold > 0) { 2881 if (Math.abs(diff) > params.threshold || data.allowThresholdMove) { 2882 if (!data.allowThresholdMove) { 2883 data.allowThresholdMove = true; 2884 touches.startX = touches.currentX; 2885 touches.startY = touches.currentY; 2886 data.currentTranslate = data.startTranslate; 2887 touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY; 2888 return; 2889 } 2890 } else { 2891 data.currentTranslate = data.startTranslate; 2892 return; 2893 } 2894 } 2895 if (!params.followFinger || params.cssMode) 2896 return; 2897 if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) { 2898 swiper.updateActiveIndex(); 2899 swiper.updateSlidesClasses(); 2900 } 2901 if (params.freeMode && params.freeMode.enabled && swiper.freeMode) { 2902 swiper.freeMode.onTouchMove(); 2903 } 2904 swiper.updateProgress(data.currentTranslate); 2905 swiper.setTranslate(data.currentTranslate); 2906} 2907function onTouchEnd(event) { 2908 const swiper = this; 2909 const data = swiper.touchEventsData; 2910 let e = event; 2911 if (e.originalEvent) 2912 e = e.originalEvent; 2913 let targetTouch; 2914 const isTouchEvent = e.type === "touchend" || e.type === "touchcancel"; 2915 if (!isTouchEvent) { 2916 if (data.touchId !== null) 2917 return; 2918 if (e.pointerId !== data.pointerId) 2919 return; 2920 targetTouch = e; 2921 } else { 2922 targetTouch = [...e.changedTouches].filter((t) => t.identifier === data.touchId)[0]; 2923 if (!targetTouch || targetTouch.identifier !== data.touchId) 2924 return; 2925 } 2926 if (["pointercancel", "pointerout", "pointerleave", "contextmenu"].includes(e.type)) { 2927 const proceed = ["pointercancel", "contextmenu"].includes(e.type) && (swiper.browser.isSafari || swiper.browser.isWebView); 2928 if (!proceed) { 2929 return; 2930 } 2931 } 2932 data.pointerId = null; 2933 data.touchId = null; 2934 const { 2935 params, 2936 touches, 2937 rtlTranslate: rtl, 2938 slidesGrid, 2939 enabled 2940 } = swiper; 2941 if (!enabled) 2942 return; 2943 if (!params.simulateTouch && e.pointerType === "mouse") 2944 return; 2945 if (data.allowTouchCallbacks) { 2946 swiper.emit("touchEnd", e); 2947 } 2948 data.allowTouchCallbacks = false; 2949 if (!data.isTouched) { 2950 if (data.isMoved && params.grabCursor) { 2951 swiper.setGrabCursor(false); 2952 } 2953 data.isMoved = false; 2954 data.startMoving = false; 2955 return; 2956 } 2957 if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { 2958 swiper.setGrabCursor(false); 2959 } 2960 const touchEndTime = now(); 2961 const timeDiff = touchEndTime - data.touchStartTime; 2962 if (swiper.allowClick) { 2963 const pathTree = e.path || e.composedPath && e.composedPath(); 2964 swiper.updateClickedSlide(pathTree && pathTree[0] || e.target, pathTree); 2965 swiper.emit("tap click", e); 2966 if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) { 2967 swiper.emit("doubleTap doubleClick", e); 2968 } 2969 } 2970 data.lastClickTime = now(); 2971 nextTick(() => { 2972 if (!swiper.destroyed) 2973 swiper.allowClick = true; 2974 }); 2975 if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 && !data.loopSwapReset || data.currentTranslate === data.startTranslate && !data.loopSwapReset) { 2976 data.isTouched = false;
vendor: 6,013 bytes, lines 2977-3160
2977 data.isMoved = false; 2978 data.startMoving = false; 2979 return; 2980 } 2981 data.isTouched = false; 2982 data.isMoved = false; 2983 data.startMoving = false; 2984 let currentPos; 2985 if (params.followFinger) { 2986 currentPos = rtl ? swiper.translate : -swiper.translate; 2987 } else { 2988 currentPos = -data.currentTranslate; 2989 } 2990 if (params.cssMode) { 2991 return; 2992 } 2993 if (params.freeMode && params.freeMode.enabled) { 2994 swiper.freeMode.onTouchEnd({ 2995 currentPos 2996 }); 2997 return; 2998 } 2999 const swipeToLast = currentPos >= -swiper.maxTranslate() && !swiper.params.loop; 3000 let stopIndex = 0; 3001 let groupSize = swiper.slidesSizesGrid[0]; 3002 for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) { 3003 const increment2 = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup; 3004 if (typeof slidesGrid[i + increment2] !== "undefined") { 3005 if (swipeToLast || currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment2]) { 3006 stopIndex = i; 3007 groupSize = slidesGrid[i + increment2] - slidesGrid[i]; 3008 } 3009 } else if (swipeToLast || currentPos >= slidesGrid[i]) { 3010 stopIndex = i; 3011 groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2]; 3012 } 3013 } 3014 let rewindFirstIndex = null; 3015 let rewindLastIndex = null; 3016 if (params.rewind) { 3017 if (swiper.isBeginning) { 3018 rewindLastIndex = params.virtual && params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1; 3019 } else if (swiper.isEnd) { 3020 rewindFirstIndex = 0; 3021 } 3022 } 3023 const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize; 3024 const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup; 3025 if (timeDiff > params.longSwipesMs) { 3026 if (!params.longSwipes) { 3027 swiper.slideTo(swiper.activeIndex); 3028 return; 3029 } 3030 if (swiper.swipeDirection === "next") { 3031 if (ratio >= params.longSwipesRatio) 3032 swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment); 3033 else 3034 swiper.slideTo(stopIndex); 3035 } 3036 if (swiper.swipeDirection === "prev") { 3037 if (ratio > 1 - params.longSwipesRatio) { 3038 swiper.slideTo(stopIndex + increment); 3039 } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) { 3040 swiper.slideTo(rewindLastIndex); 3041 } else { 3042 swiper.slideTo(stopIndex); 3043 } 3044 } 3045 } else { 3046 if (!params.shortSwipes) { 3047 swiper.slideTo(swiper.activeIndex); 3048 return; 3049 } 3050 const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl); 3051 if (!isNavButtonTarget) { 3052 if (swiper.swipeDirection === "next") { 3053 swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment); 3054 } 3055 if (swiper.swipeDirection === "prev") { 3056 swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex); 3057 } 3058 } else if (e.target === swiper.navigation.nextEl) { 3059 swiper.slideTo(stopIndex + increment); 3060 } else { 3061 swiper.slideTo(stopIndex); 3062 } 3063 } 3064} 3065function onResize() { 3066 const swiper = this; 3067 const { 3068 params, 3069 el 3070 } = swiper; 3071 if (el && el.offsetWidth === 0) 3072 return; 3073 if (params.breakpoints) { 3074 swiper.setBreakpoint(); 3075 } 3076 const { 3077 allowSlideNext, 3078 allowSlidePrev, 3079 snapGrid 3080 } = swiper; 3081 const isVirtual = swiper.virtual && swiper.params.virtual.enabled; 3082 swiper.allowSlideNext = true; 3083 swiper.allowSlidePrev = true; 3084 swiper.updateSize(); 3085 swiper.updateSlides(); 3086 swiper.updateSlidesClasses(); 3087 const isVirtualLoop = isVirtual && params.loop; 3088 if ((params.slidesPerView === "auto" || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides && !isVirtualLoop) { 3089 swiper.slideTo(swiper.slides.length - 1, 0, false, true); 3090 } else { 3091 if (swiper.params.loop && !isVirtual) { 3092 swiper.slideToLoop(swiper.realIndex, 0, false, true); 3093 } else { 3094 swiper.slideTo(swiper.activeIndex, 0, false, true); 3095 } 3096 } 3097 if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) { 3098 clearTimeout(swiper.autoplay.resizeTimeout); 3099 swiper.autoplay.resizeTimeout = setTimeout(() => { 3100 if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) { 3101 swiper.autoplay.resume(); 3102 } 3103 }, 500); 3104 } 3105 swiper.allowSlidePrev = allowSlidePrev; 3106 swiper.allowSlideNext = allowSlideNext; 3107 if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) { 3108 swiper.checkOverflow(); 3109 } 3110} 3111function onClick(e) { 3112 const swiper = this; 3113 if (!swiper.enabled) 3114 return; 3115 if (!swiper.allowClick) { 3116 if (swiper.params.preventClicks) 3117 e.preventDefault(); 3118 if (swiper.params.preventClicksPropagation && swiper.animating) { 3119 e.stopPropagation(); 3120 e.stopImmediatePropagation(); 3121 } 3122 } 3123} 3124function onScroll() { 3125 const swiper = this; 3126 const { 3127 wrapperEl, 3128 rtlTranslate, 3129 enabled 3130 } = swiper; 3131 if (!enabled) 3132 return; 3133 swiper.previousTranslate = swiper.translate; 3134 if (swiper.isHorizontal()) { 3135 swiper.translate = -wrapperEl.scrollLeft; 3136 } else { 3137 swiper.translate = -wrapperEl.scrollTop; 3138 } 3139 if (swiper.translate === 0) 3140 swiper.translate = 0; 3141 swiper.updateActiveIndex(); 3142 swiper.updateSlidesClasses(); 3143 let newProgress; 3144 const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); 3145 if (translatesDiff === 0) { 3146 newProgress = 0; 3147 } else { 3148 newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff; 3149 } 3150 if (newProgress !== swiper.progress) { 3151 swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate); 3152 } 3153 swiper.emit("setTranslate", swiper.translate, false); 3154} 3155function onLoad(e) { 3156 const swiper = this; 3157 processLazyPreloader(swiper, e.target); 3158 if (swiper.params.cssMode || swiper.params.slidesPerView !== "auto" && !swiper.params.autoHeight) { 3159 return; 3160 }
vendor: 4,275 bytes, lines 3161-3295
3161 swiper.update(); 3162} 3163function onDocumentTouchStart() { 3164 const swiper = this; 3165 if (swiper.documentTouchHandlerProceeded) 3166 return; 3167 swiper.documentTouchHandlerProceeded = true; 3168 if (swiper.params.touchReleaseOnEdges) { 3169 swiper.el.style.touchAction = "auto"; 3170 } 3171} 3172const events = (swiper, method) => { 3173 const document2 = getDocument(); 3174 const { 3175 params, 3176 el, 3177 wrapperEl, 3178 device 3179 } = swiper; 3180 const capture = !!params.nested; 3181 const domMethod = method === "on" ? "addEventListener" : "removeEventListener"; 3182 const swiperMethod = method; 3183 document2[domMethod]("touchstart", swiper.onDocumentTouchStart, { 3184 passive: false, 3185 capture 3186 }); 3187 el[domMethod]("touchstart", swiper.onTouchStart, { 3188 passive: false 3189 }); 3190 el[domMethod]("pointerdown", swiper.onTouchStart, { 3191 passive: false 3192 }); 3193 document2[domMethod]("touchmove", swiper.onTouchMove, { 3194 passive: false, 3195 capture 3196 }); 3197 document2[domMethod]("pointermove", swiper.onTouchMove, { 3198 passive: false, 3199 capture 3200 }); 3201 document2[domMethod]("touchend", swiper.onTouchEnd, { 3202 passive: true 3203 }); 3204 document2[domMethod]("pointerup", swiper.onTouchEnd, { 3205 passive: true 3206 }); 3207 document2[domMethod]("pointercancel", swiper.onTouchEnd, { 3208 passive: true 3209 }); 3210 document2[domMethod]("touchcancel", swiper.onTouchEnd, { 3211 passive: true 3212 }); 3213 document2[domMethod]("pointerout", swiper.onTouchEnd, { 3214 passive: true 3215 }); 3216 document2[domMethod]("pointerleave", swiper.onTouchEnd, { 3217 passive: true 3218 }); 3219 document2[domMethod]("contextmenu", swiper.onTouchEnd, { 3220 passive: true 3221 }); 3222 if (params.preventClicks || params.preventClicksPropagation) { 3223 el[domMethod]("click", swiper.onClick, true); 3224 } 3225 if (params.cssMode) { 3226 wrapperEl[domMethod]("scroll", swiper.onScroll); 3227 } 3228 if (params.updateOnWindowResize) { 3229 swiper[swiperMethod](device.ios || device.android ? "resize orientationchange observerUpdate" : "resize observerUpdate", onResize, true); 3230 } else { 3231 swiper[swiperMethod]("observerUpdate", onResize, true); 3232 } 3233 el[domMethod]("load", swiper.onLoad, { 3234 capture: true 3235 }); 3236}; 3237function attachEvents() { 3238 const swiper = this; 3239 const { 3240 params 3241 } = swiper; 3242 swiper.onTouchStart = onTouchStart.bind(swiper); 3243 swiper.onTouchMove = onTouchMove.bind(swiper); 3244 swiper.onTouchEnd = onTouchEnd.bind(swiper); 3245 swiper.onDocumentTouchStart = onDocumentTouchStart.bind(swiper); 3246 if (params.cssMode) { 3247 swiper.onScroll = onScroll.bind(swiper); 3248 } 3249 swiper.onClick = onClick.bind(swiper); 3250 swiper.onLoad = onLoad.bind(swiper); 3251 events(swiper, "on"); 3252} 3253function detachEvents() { 3254 const swiper = this; 3255 events(swiper, "off"); 3256} 3257var events$1 = { 3258 attachEvents, 3259 detachEvents 3260}; 3261const isGridEnabled = (swiper, params) => { 3262 return swiper.grid && params.grid && params.grid.rows > 1; 3263}; 3264function setBreakpoint() { 3265 const swiper = this; 3266 const { 3267 realIndex, 3268 initialized, 3269 params, 3270 el 3271 } = swiper; 3272 const breakpoints2 = params.breakpoints; 3273 if (!breakpoints2 || breakpoints2 && Object.keys(breakpoints2).length === 0) 3274 return; 3275 const breakpoint = swiper.getBreakpoint(breakpoints2, swiper.params.breakpointsBase, swiper.el); 3276 if (!breakpoint || swiper.currentBreakpoint === breakpoint) 3277 return; 3278 const breakpointOnlyParams = breakpoint in breakpoints2 ? breakpoints2[breakpoint] : void 0; 3279 const breakpointParams = breakpointOnlyParams || swiper.originalParams; 3280 const wasMultiRow = isGridEnabled(swiper, params); 3281 const isMultiRow = isGridEnabled(swiper, breakpointParams); 3282 const wasGrabCursor = swiper.params.grabCursor; 3283 const isGrabCursor = breakpointParams.grabCursor; 3284 const wasEnabled = params.enabled; 3285 if (wasMultiRow && !isMultiRow) { 3286 el.classList.remove(`${params.containerModifierClass}grid`, `${params.containerModifierClass}grid-column`); 3287 swiper.emitContainerClasses(); 3288 } else if (!wasMultiRow && isMultiRow) { 3289 el.classList.add(`${params.containerModifierClass}grid`); 3290 if (breakpointParams.grid.fill && breakpointParams.grid.fill === "column" || !breakpointParams.grid.fill && params.grid.fill === "column") { 3291 el.classList.add(`${params.containerModifierClass}grid-column`); 3292 } 3293 swiper.emitContainerClasses(); 3294 } 3295 if (wasGrabCursor && !isGrabCursor) {
vendor: 25,549 bytes, lines 3296-4157
3296 swiper.unsetGrabCursor(); 3297 } else if (!wasGrabCursor && isGrabCursor) { 3298 swiper.setGrabCursor(); 3299 } 3300 ["navigation", "pagination", "scrollbar"].forEach((prop) => { 3301 if (typeof breakpointParams[prop] === "undefined") 3302 return; 3303 const wasModuleEnabled = params[prop] && params[prop].enabled; 3304 const isModuleEnabled = breakpointParams[prop] && breakpointParams[prop].enabled; 3305 if (wasModuleEnabled && !isModuleEnabled) { 3306 swiper[prop].disable(); 3307 } 3308 if (!wasModuleEnabled && isModuleEnabled) { 3309 swiper[prop].enable(); 3310 } 3311 }); 3312 const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction; 3313 const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged); 3314 const wasLoop = params.loop; 3315 if (directionChanged && initialized) { 3316 swiper.changeDirection(); 3317 } 3318 extend(swiper.params, breakpointParams); 3319 const isEnabled = swiper.params.enabled; 3320 const hasLoop = swiper.params.loop; 3321 Object.assign(swiper, { 3322 allowTouchMove: swiper.params.allowTouchMove, 3323 allowSlideNext: swiper.params.allowSlideNext, 3324 allowSlidePrev: swiper.params.allowSlidePrev 3325 }); 3326 if (wasEnabled && !isEnabled) { 3327 swiper.disable(); 3328 } else if (!wasEnabled && isEnabled) { 3329 swiper.enable(); 3330 } 3331 swiper.currentBreakpoint = breakpoint; 3332 swiper.emit("_beforeBreakpoint", breakpointParams); 3333 if (initialized) { 3334 if (needsReLoop) { 3335 swiper.loopDestroy(); 3336 swiper.loopCreate(realIndex); 3337 swiper.updateSlides(); 3338 } else if (!wasLoop && hasLoop) { 3339 swiper.loopCreate(realIndex); 3340 swiper.updateSlides(); 3341 } else if (wasLoop && !hasLoop) { 3342 swiper.loopDestroy(); 3343 } 3344 } 3345 swiper.emit("breakpoint", breakpointParams); 3346} 3347function getBreakpoint(breakpoints2, base, containerEl) { 3348 if (base === void 0) { 3349 base = "window"; 3350 } 3351 if (!breakpoints2 || base === "container" && !containerEl) 3352 return void 0; 3353 let breakpoint = false; 3354 const window2 = getWindow(); 3355 const currentHeight = base === "window" ? window2.innerHeight : containerEl.clientHeight; 3356 const points = Object.keys(breakpoints2).map((point) => { 3357 if (typeof point === "string" && point.indexOf("@") === 0) { 3358 const minRatio = parseFloat(point.substr(1)); 3359 const value = currentHeight * minRatio; 3360 return { 3361 value, 3362 point 3363 }; 3364 } 3365 return { 3366 value: point, 3367 point 3368 }; 3369 }); 3370 points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10)); 3371 for (let i = 0; i < points.length; i += 1) { 3372 const { 3373 point, 3374 value 3375 } = points[i]; 3376 if (base === "window") { 3377 if (window2.matchMedia(`(min-width: ${value}px)`).matches) { 3378 breakpoint = point; 3379 } 3380 } else if (value <= containerEl.clientWidth) { 3381 breakpoint = point; 3382 } 3383 } 3384 return breakpoint || "max"; 3385} 3386var breakpoints = { 3387 setBreakpoint, 3388 getBreakpoint 3389}; 3390function prepareClasses(entries, prefix) { 3391 const resultClasses = []; 3392 entries.forEach((item) => { 3393 if (typeof item === "object") { 3394 Object.keys(item).forEach((classNames) => { 3395 if (item[classNames]) { 3396 resultClasses.push(prefix + classNames); 3397 } 3398 }); 3399 } else if (typeof item === "string") { 3400 resultClasses.push(prefix + item); 3401 } 3402 }); 3403 return resultClasses; 3404} 3405function addClasses() { 3406 const swiper = this; 3407 const { 3408 classNames, 3409 params, 3410 rtl, 3411 el, 3412 device 3413 } = swiper; 3414 const suffixes = prepareClasses(["initialized", params.direction, { 3415 "free-mode": swiper.params.freeMode && params.freeMode.enabled 3416 }, { 3417 "autoheight": params.autoHeight 3418 }, { 3419 "rtl": rtl 3420 }, { 3421 "grid": params.grid && params.grid.rows > 1 3422 }, { 3423 "grid-column": params.grid && params.grid.rows > 1 && params.grid.fill === "column" 3424 }, { 3425 "android": device.android 3426 }, { 3427 "ios": device.ios 3428 }, { 3429 "css-mode": params.cssMode 3430 }, { 3431 "centered": params.cssMode && params.centeredSlides 3432 }, { 3433 "watch-progress": params.watchSlidesProgress 3434 }], params.containerModifierClass); 3435 classNames.push(...suffixes); 3436 el.classList.add(...classNames); 3437 swiper.emitContainerClasses(); 3438} 3439function removeClasses() { 3440 const swiper = this; 3441 const { 3442 el, 3443 classNames 3444 } = swiper; 3445 el.classList.remove(...classNames); 3446 swiper.emitContainerClasses(); 3447} 3448var classes = { 3449 addClasses, 3450 removeClasses 3451}; 3452function checkOverflow() { 3453 const swiper = this; 3454 const { 3455 isLocked: wasLocked, 3456 params 3457 } = swiper; 3458 const { 3459 slidesOffsetBefore 3460 } = params; 3461 if (slidesOffsetBefore) { 3462 const lastSlideIndex = swiper.slides.length - 1; 3463 const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2; 3464 swiper.isLocked = swiper.size > lastSlideRightEdge; 3465 } else { 3466 swiper.isLocked = swiper.snapGrid.length === 1; 3467 } 3468 if (params.allowSlideNext === true) { 3469 swiper.allowSlideNext = !swiper.isLocked; 3470 } 3471 if (params.allowSlidePrev === true) { 3472 swiper.allowSlidePrev = !swiper.isLocked; 3473 } 3474 if (wasLocked && wasLocked !== swiper.isLocked) { 3475 swiper.isEnd = false; 3476 } 3477 if (wasLocked !== swiper.isLocked) { 3478 swiper.emit(swiper.isLocked ? "lock" : "unlock"); 3479 } 3480} 3481var checkOverflow$1 = { 3482 checkOverflow 3483}; 3484var defaults = { 3485 init: true, 3486 direction: "horizontal", 3487 oneWayMovement: false, 3488 swiperElementNodeName: "SWIPER-CONTAINER", 3489 touchEventsTarget: "wrapper", 3490 initialSlide: 0, 3491 speed: 300, 3492 cssMode: false, 3493 updateOnWindowResize: true, 3494 resizeObserver: true, 3495 nested: false, 3496 createElements: false, 3497 eventsPrefix: "swiper", 3498 enabled: true, 3499 focusableElements: "input, select, option, textarea, button, video, label", 3500 // Overrides 3501 width: null, 3502 height: null, 3503 // 3504 preventInteractionOnTransition: false, 3505 // ssr 3506 userAgent: null, 3507 url: null, 3508 // To support iOS's swipe-to-go-back gesture (when being used in-app). 3509 edgeSwipeDetection: false, 3510 edgeSwipeThreshold: 20, 3511 // Autoheight 3512 autoHeight: false, 3513 // Set wrapper width 3514 setWrapperSize: false, 3515 // Virtual Translate 3516 virtualTranslate: false, 3517 // Effects 3518 effect: "slide", 3519 // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip' 3520 // Breakpoints 3521 breakpoints: void 0, 3522 breakpointsBase: "window", 3523 // Slides grid 3524 spaceBetween: 0, 3525 slidesPerView: 1, 3526 slidesPerGroup: 1, 3527 slidesPerGroupSkip: 0, 3528 slidesPerGroupAuto: false, 3529 centeredSlides: false, 3530 centeredSlidesBounds: false, 3531 slidesOffsetBefore: 0, 3532 // in px 3533 slidesOffsetAfter: 0, 3534 // in px 3535 normalizeSlideIndex: true, 3536 centerInsufficientSlides: false, 3537 // Disable swiper and hide navigation when container not overflow 3538 watchOverflow: true, 3539 // Round length 3540 roundLengths: false, 3541 // Touches 3542 touchRatio: 1, 3543 touchAngle: 45, 3544 simulateTouch: true, 3545 shortSwipes: true, 3546 longSwipes: true, 3547 longSwipesRatio: 0.5, 3548 longSwipesMs: 300, 3549 followFinger: true, 3550 allowTouchMove: true, 3551 threshold: 5, 3552 touchMoveStopPropagation: false, 3553 touchStartPreventDefault: true, 3554 touchStartForcePreventDefault: false, 3555 touchReleaseOnEdges: false, 3556 // Unique Navigation Elements 3557 uniqueNavElements: true, 3558 // Resistance 3559 resistance: true, 3560 resistanceRatio: 0.85, 3561 // Progress 3562 watchSlidesProgress: false, 3563 // Cursor 3564 grabCursor: false, 3565 // Clicks 3566 preventClicks: true, 3567 preventClicksPropagation: true, 3568 slideToClickedSlide: false, 3569 // loop 3570 loop: false, 3571 loopAddBlankSlides: true, 3572 loopAdditionalSlides: 0, 3573 loopPreventsSliding: true, 3574 // rewind 3575 rewind: false, 3576 // Swiping/no swiping 3577 allowSlidePrev: true, 3578 allowSlideNext: true, 3579 swipeHandler: null, 3580 // '.swipe-handler', 3581 noSwiping: true, 3582 noSwipingClass: "swiper-no-swiping", 3583 noSwipingSelector: null, 3584 // Passive Listeners 3585 passiveListeners: true, 3586 maxBackfaceHiddenSlides: 10, 3587 // NS 3588 containerModifierClass: "swiper-", 3589 // NEW 3590 slideClass: "swiper-slide", 3591 slideBlankClass: "swiper-slide-blank", 3592 slideActiveClass: "swiper-slide-active", 3593 slideVisibleClass: "swiper-slide-visible", 3594 slideFullyVisibleClass: "swiper-slide-fully-visible", 3595 slideNextClass: "swiper-slide-next", 3596 slidePrevClass: "swiper-slide-prev", 3597 wrapperClass: "swiper-wrapper", 3598 lazyPreloaderClass: "swiper-lazy-preloader", 3599 lazyPreloadPrevNext: 0, 3600 // Callbacks 3601 runCallbacksOnInit: true, 3602 // Internals 3603 _emitClasses: false 3604}; 3605function moduleExtendParams(params, allModulesParams) { 3606 return function extendParams(obj) { 3607 if (obj === void 0) { 3608 obj = {}; 3609 } 3610 const moduleParamName = Object.keys(obj)[0]; 3611 const moduleParams = obj[moduleParamName]; 3612 if (typeof moduleParams !== "object" || moduleParams === null) { 3613 extend(allModulesParams, obj); 3614 return; 3615 } 3616 if (params[moduleParamName] === true) { 3617 params[moduleParamName] = { 3618 enabled: true 3619 }; 3620 } 3621 if (moduleParamName === "navigation" && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].prevEl && !params[moduleParamName].nextEl) { 3622 params[moduleParamName].auto = true; 3623 } 3624 if (["pagination", "scrollbar"].indexOf(moduleParamName) >= 0 && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].el) { 3625 params[moduleParamName].auto = true; 3626 } 3627 if (!(moduleParamName in params && "enabled" in moduleParams)) { 3628 extend(allModulesParams, obj); 3629 return; 3630 } 3631 if (typeof params[moduleParamName] === "object" && !("enabled" in params[moduleParamName])) { 3632 params[moduleParamName].enabled = true; 3633 } 3634 if (!params[moduleParamName]) 3635 params[moduleParamName] = { 3636 enabled: false 3637 }; 3638 extend(allModulesParams, obj); 3639 }; 3640} 3641const prototypes = { 3642 eventsEmitter, 3643 update, 3644 translate, 3645 transition, 3646 slide, 3647 loop, 3648 grabCursor, 3649 events: events$1, 3650 breakpoints, 3651 checkOverflow: checkOverflow$1, 3652 classes 3653}; 3654const extendedDefaults = {}; 3655class Swiper { 3656 constructor() { 3657 let el; 3658 let params; 3659 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 3660 args[_key] = arguments[_key]; 3661 } 3662 if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === "Object") { 3663 params = args[0]; 3664 } else { 3665 [el, params] = args; 3666 } 3667 if (!params) 3668 params = {}; 3669 params = extend({}, params); 3670 if (el && !params.el) 3671 params.el = el; 3672 const document2 = getDocument(); 3673 if (params.el && typeof params.el === "string" && document2.querySelectorAll(params.el).length > 1) { 3674 const swipers = []; 3675 document2.querySelectorAll(params.el).forEach((containerEl) => { 3676 const newParams = extend({}, params, { 3677 el: containerEl 3678 }); 3679 swipers.push(new Swiper(newParams)); 3680 }); 3681 return swipers; 3682 } 3683 const swiper = this; 3684 swiper.__swiper__ = true; 3685 swiper.support = getSupport(); 3686 swiper.device = getDevice({ 3687 userAgent: params.userAgent 3688 }); 3689 swiper.browser = getBrowser(); 3690 swiper.eventsListeners = {}; 3691 swiper.eventsAnyListeners = []; 3692 swiper.modules = [...swiper.__modules__]; 3693 if (params.modules && Array.isArray(params.modules)) { 3694 swiper.modules.push(...params.modules); 3695 } 3696 const allModulesParams = {}; 3697 swiper.modules.forEach((mod) => { 3698 mod({ 3699 params, 3700 swiper, 3701 extendParams: moduleExtendParams(params, allModulesParams), 3702 on: swiper.on.bind(swiper), 3703 once: swiper.once.bind(swiper), 3704 off: swiper.off.bind(swiper), 3705 emit: swiper.emit.bind(swiper) 3706 }); 3707 }); 3708 const swiperParams = extend({}, defaults, allModulesParams); 3709 swiper.params = extend({}, swiperParams, extendedDefaults, params); 3710 swiper.originalParams = extend({}, swiper.params); 3711 swiper.passedParams = extend({}, params); 3712 if (swiper.params && swiper.params.on) { 3713 Object.keys(swiper.params.on).forEach((eventName) => { 3714 swiper.on(eventName, swiper.params.on[eventName]); 3715 }); 3716 } 3717 if (swiper.params && swiper.params.onAny) { 3718 swiper.onAny(swiper.params.onAny); 3719 } 3720 Object.assign(swiper, { 3721 enabled: swiper.params.enabled, 3722 el, 3723 // Classes 3724 classNames: [], 3725 // Slides 3726 slides: [], 3727 slidesGrid: [], 3728 snapGrid: [], 3729 slidesSizesGrid: [], 3730 // isDirection 3731 isHorizontal() { 3732 return swiper.params.direction === "horizontal"; 3733 }, 3734 isVertical() { 3735 return swiper.params.direction === "vertical"; 3736 }, 3737 // Indexes 3738 activeIndex: 0, 3739 realIndex: 0, 3740 // 3741 isBeginning: true, 3742 isEnd: false, 3743 // Props 3744 translate: 0, 3745 previousTranslate: 0, 3746 progress: 0, 3747 velocity: 0, 3748 animating: false, 3749 cssOverflowAdjustment() { 3750 return Math.trunc(this.translate / 2 ** 23) * 2 ** 23; 3751 }, 3752 // Locks 3753 allowSlideNext: swiper.params.allowSlideNext, 3754 allowSlidePrev: swiper.params.allowSlidePrev, 3755 // Touch Events 3756 touchEventsData: { 3757 isTouched: void 0, 3758 isMoved: void 0, 3759 allowTouchCallbacks: void 0, 3760 touchStartTime: void 0, 3761 isScrolling: void 0, 3762 currentTranslate: void 0, 3763 startTranslate: void 0, 3764 allowThresholdMove: void 0, 3765 // Form elements to match 3766 focusableElements: swiper.params.focusableElements, 3767 // Last click time 3768 lastClickTime: 0, 3769 clickTimeout: void 0, 3770 // Velocities 3771 velocities: [], 3772 allowMomentumBounce: void 0, 3773 startMoving: void 0, 3774 pointerId: null, 3775 touchId: null 3776 }, 3777 // Clicks 3778 allowClick: true, 3779 // Touches 3780 allowTouchMove: swiper.params.allowTouchMove, 3781 touches: { 3782 startX: 0, 3783 startY: 0, 3784 currentX: 0, 3785 currentY: 0, 3786 diff: 0 3787 }, 3788 // Images 3789 imagesToLoad: [], 3790 imagesLoaded: 0 3791 }); 3792 swiper.emit("_swiper"); 3793 if (swiper.params.init) { 3794 swiper.init(); 3795 } 3796 return swiper; 3797 } 3798 getDirectionLabel(property) { 3799 if (this.isHorizontal()) { 3800 return property; 3801 } 3802 return { 3803 "width": "height", 3804 "margin-top": "margin-left", 3805 "margin-bottom ": "margin-right", 3806 "margin-left": "margin-top", 3807 "margin-right": "margin-bottom", 3808 "padding-left": "padding-top", 3809 "padding-right": "padding-bottom", 3810 "marginRight": "marginBottom" 3811 }[property]; 3812 } 3813 getSlideIndex(slideEl) { 3814 const { 3815 slidesEl, 3816 params 3817 } = this; 3818 const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`); 3819 const firstSlideIndex = elementIndex(slides[0]); 3820 return elementIndex(slideEl) - firstSlideIndex; 3821 } 3822 getSlideIndexByData(index) { 3823 return this.getSlideIndex(this.slides.filter((slideEl) => slideEl.getAttribute("data-swiper-slide-index") * 1 === index)[0]); 3824 } 3825 recalcSlides() { 3826 const swiper = this; 3827 const { 3828 slidesEl, 3829 params 3830 } = swiper; 3831 swiper.slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`); 3832 } 3833 enable() { 3834 const swiper = this; 3835 if (swiper.enabled) 3836 return; 3837 swiper.enabled = true; 3838 if (swiper.params.grabCursor) { 3839 swiper.setGrabCursor(); 3840 } 3841 swiper.emit("enable"); 3842 } 3843 disable() { 3844 const swiper = this; 3845 if (!swiper.enabled) 3846 return; 3847 swiper.enabled = false; 3848 if (swiper.params.grabCursor) { 3849 swiper.unsetGrabCursor(); 3850 } 3851 swiper.emit("disable"); 3852 } 3853 setProgress(progress, speed) { 3854 const swiper = this; 3855 progress = Math.min(Math.max(progress, 0), 1); 3856 const min = swiper.minTranslate(); 3857 const max = swiper.maxTranslate(); 3858 const current = (max - min) * progress + min; 3859 swiper.translateTo(current, typeof speed === "undefined" ? 0 : speed); 3860 swiper.updateActiveIndex(); 3861 swiper.updateSlidesClasses(); 3862 } 3863 emitContainerClasses() { 3864 const swiper = this; 3865 if (!swiper.params._emitClasses || !swiper.el) 3866 return; 3867 const cls = swiper.el.className.split(" ").filter((className) => { 3868 return className.indexOf("swiper") === 0 || className.indexOf(swiper.params.containerModifierClass) === 0; 3869 }); 3870 swiper.emit("_containerClasses", cls.join(" ")); 3871 } 3872 getSlideClasses(slideEl) { 3873 const swiper = this; 3874 if (swiper.destroyed) 3875 return ""; 3876 return slideEl.className.split(" ").filter((className) => { 3877 return className.indexOf("swiper-slide") === 0 || className.indexOf(swiper.params.slideClass) === 0; 3878 }).join(" "); 3879 } 3880 emitSlidesClasses() { 3881 const swiper = this; 3882 if (!swiper.params._emitClasses || !swiper.el) 3883 return; 3884 const updates = []; 3885 swiper.slides.forEach((slideEl) => { 3886 const classNames = swiper.getSlideClasses(slideEl); 3887 updates.push({ 3888 slideEl, 3889 classNames 3890 }); 3891 swiper.emit("_slideClass", slideEl, classNames); 3892 }); 3893 swiper.emit("_slideClasses", updates); 3894 } 3895 slidesPerViewDynamic(view, exact) { 3896 if (view === void 0) { 3897 view = "current"; 3898 } 3899 if (exact === void 0) { 3900 exact = false; 3901 } 3902 const swiper = this; 3903 const { 3904 params, 3905 slides, 3906 slidesGrid, 3907 slidesSizesGrid, 3908 size: swiperSize, 3909 activeIndex 3910 } = swiper; 3911 let spv = 1; 3912 if (typeof params.slidesPerView === "number") 3913 return params.slidesPerView; 3914 if (params.centeredSlides) { 3915 let slideSize = slides[activeIndex] ? Math.ceil(slides[activeIndex].swiperSlideSize) : 0; 3916 let breakLoop; 3917 for (let i = activeIndex + 1; i < slides.length; i += 1) { 3918 if (slides[i] && !breakLoop) { 3919 slideSize += Math.ceil(slides[i].swiperSlideSize); 3920 spv += 1; 3921 if (slideSize > swiperSize) 3922 breakLoop = true; 3923 } 3924 } 3925 for (let i = activeIndex - 1; i >= 0; i -= 1) { 3926 if (slides[i] && !breakLoop) { 3927 slideSize += slides[i].swiperSlideSize; 3928 spv += 1; 3929 if (slideSize > swiperSize) 3930 breakLoop = true; 3931 } 3932 } 3933 } else { 3934 if (view === "current") { 3935 for (let i = activeIndex + 1; i < slides.length; i += 1) { 3936 const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize; 3937 if (slideInView) { 3938 spv += 1; 3939 } 3940 } 3941 } else { 3942 for (let i = activeIndex - 1; i >= 0; i -= 1) { 3943 const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize; 3944 if (slideInView) { 3945 spv += 1; 3946 } 3947 } 3948 } 3949 } 3950 return spv; 3951 } 3952 update() { 3953 const swiper = this; 3954 if (!swiper || swiper.destroyed) 3955 return; 3956 const { 3957 snapGrid, 3958 params 3959 } = swiper; 3960 if (params.breakpoints) { 3961 swiper.setBreakpoint(); 3962 } 3963 [...swiper.el.querySelectorAll('[loading="lazy"]')].forEach((imageEl) => { 3964 if (imageEl.complete) { 3965 processLazyPreloader(swiper, imageEl); 3966 } 3967 }); 3968 swiper.updateSize(); 3969 swiper.updateSlides(); 3970 swiper.updateProgress(); 3971 swiper.updateSlidesClasses(); 3972 function setTranslate2() { 3973 const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate; 3974 const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate()); 3975 swiper.setTranslate(newTranslate); 3976 swiper.updateActiveIndex(); 3977 swiper.updateSlidesClasses(); 3978 } 3979 let translated; 3980 if (params.freeMode && params.freeMode.enabled && !params.cssMode) { 3981 setTranslate2(); 3982 if (params.autoHeight) { 3983 swiper.updateAutoHeight(); 3984 } 3985 } else { 3986 if ((params.slidesPerView === "auto" || params.slidesPerView > 1) && swiper.isEnd && !params.centeredSlides) { 3987 const slides = swiper.virtual && params.virtual.enabled ? swiper.virtual.slides : swiper.slides; 3988 translated = swiper.slideTo(slides.length - 1, 0, false, true); 3989 } else { 3990 translated = swiper.slideTo(swiper.activeIndex, 0, false, true); 3991 } 3992 if (!translated) { 3993 setTranslate2(); 3994 } 3995 } 3996 if (params.watchOverflow && snapGrid !== swiper.snapGrid) { 3997 swiper.checkOverflow(); 3998 } 3999 swiper.emit("update"); 4000 } 4001 changeDirection(newDirection, needUpdate) { 4002 if (needUpdate === void 0) { 4003 needUpdate = true; 4004 } 4005 const swiper = this; 4006 const currentDirection = swiper.params.direction; 4007 if (!newDirection) { 4008 newDirection = currentDirection === "horizontal" ? "vertical" : "horizontal"; 4009 } 4010 if (newDirection === currentDirection || newDirection !== "horizontal" && newDirection !== "vertical") { 4011 return swiper; 4012 } 4013 swiper.el.classList.remove(`${swiper.params.containerModifierClass}${currentDirection}`); 4014 swiper.el.classList.add(`${swiper.params.containerModifierClass}${newDirection}`); 4015 swiper.emitContainerClasses(); 4016 swiper.params.direction = newDirection; 4017 swiper.slides.forEach((slideEl) => { 4018 if (newDirection === "vertical") { 4019 slideEl.style.width = ""; 4020 } else { 4021 slideEl.style.height = ""; 4022 } 4023 }); 4024 swiper.emit("changeDirection"); 4025 if (needUpdate) 4026 swiper.update(); 4027 return swiper; 4028 } 4029 changeLanguageDirection(direction) { 4030 const swiper = this; 4031 if (swiper.rtl && direction === "rtl" || !swiper.rtl && direction === "ltr") 4032 return; 4033 swiper.rtl = direction === "rtl"; 4034 swiper.rtlTranslate = swiper.params.direction === "horizontal" && swiper.rtl; 4035 if (swiper.rtl) { 4036 swiper.el.classList.add(`${swiper.params.containerModifierClass}rtl`); 4037 swiper.el.dir = "rtl"; 4038 } else { 4039 swiper.el.classList.remove(`${swiper.params.containerModifierClass}rtl`); 4040 swiper.el.dir = "ltr"; 4041 } 4042 swiper.update(); 4043 } 4044 mount(element) { 4045 const swiper = this; 4046 if (swiper.mounted) 4047 return true; 4048 let el = element || swiper.params.el; 4049 if (typeof el === "string") { 4050 el = document.querySelector(el); 4051 } 4052 if (!el) { 4053 return false; 4054 } 4055 el.swiper = swiper; 4056 if (el.parentNode && el.parentNode.host && el.parentNode.host.nodeName === swiper.params.swiperElementNodeName.toUpperCase()) { 4057 swiper.isElement = true; 4058 } 4059 const getWrapperSelector = () => { 4060 return `.${(swiper.params.wrapperClass || "").trim().split(" ").join(".")}`; 4061 }; 4062 const getWrapper = () => { 4063 if (el && el.shadowRoot && el.shadowRoot.querySelector) { 4064 const res = el.shadowRoot.querySelector(getWrapperSelector()); 4065 return res; 4066 } 4067 return elementChildren(el, getWrapperSelector())[0]; 4068 }; 4069 let wrapperEl = getWrapper(); 4070 if (!wrapperEl && swiper.params.createElements) { 4071 wrapperEl = createElement("div", swiper.params.wrapperClass); 4072 el.append(wrapperEl); 4073 elementChildren(el, `.${swiper.params.slideClass}`).forEach((slideEl) => { 4074 wrapperEl.append(slideEl); 4075 }); 4076 } 4077 Object.assign(swiper, { 4078 el, 4079 wrapperEl, 4080 slidesEl: swiper.isElement && !el.parentNode.host.slideSlots ? el.parentNode.host : wrapperEl, 4081 hostEl: swiper.isElement ? el.parentNode.host : el, 4082 mounted: true, 4083 // RTL 4084 rtl: el.dir.toLowerCase() === "rtl" || elementStyle(el, "direction") === "rtl", 4085 rtlTranslate: swiper.params.direction === "horizontal" && (el.dir.toLowerCase() === "rtl" || elementStyle(el, "direction") === "rtl"), 4086 wrongRTL: elementStyle(wrapperEl, "display") === "-webkit-box" 4087 }); 4088 return true; 4089 } 4090 init(el) { 4091 const swiper = this; 4092 if (swiper.initialized) 4093 return swiper; 4094 const mounted = swiper.mount(el); 4095 if (mounted === false) 4096 return swiper; 4097 swiper.emit("beforeInit"); 4098 if (swiper.params.breakpoints) { 4099 swiper.setBreakpoint(); 4100 } 4101 swiper.addClasses(); 4102 swiper.updateSize(); 4103 swiper.updateSlides(); 4104 if (swiper.params.watchOverflow) { 4105 swiper.checkOverflow(); 4106 } 4107 if (swiper.params.grabCursor && swiper.enabled) { 4108 swiper.setGrabCursor(); 4109 } 4110 if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) { 4111 swiper.slideTo(swiper.params.initialSlide + swiper.virtual.slidesBefore, 0, swiper.params.runCallbacksOnInit, false, true); 4112 } else { 4113 swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true); 4114 } 4115 if (swiper.params.loop) { 4116 swiper.loopCreate(); 4117 } 4118 swiper.attachEvents(); 4119 const lazyElements = [...swiper.el.querySelectorAll('[loading="lazy"]')]; 4120 if (swiper.isElement) { 4121 lazyElements.push(...swiper.hostEl.querySelectorAll('[loading="lazy"]')); 4122 } 4123 lazyElements.forEach((imageEl) => { 4124 if (imageEl.complete) { 4125 processLazyPreloader(swiper, imageEl); 4126 } else { 4127 imageEl.addEventListener("load", (e) => { 4128 processLazyPreloader(swiper, e.target); 4129 }); 4130 } 4131 }); 4132 preload(swiper); 4133 swiper.initialized = true; 4134 preload(swiper); 4135 swiper.emit("init"); 4136 swiper.emit("afterInit"); 4137 return swiper; 4138 } 4139 destroy(deleteInstance, cleanStyles) { 4140 if (deleteInstance === void 0) { 4141 deleteInstance = true; 4142 } 4143 if (cleanStyles === void 0) { 4144 cleanStyles = true; 4145 } 4146 const swiper = this; 4147 const { 4148 params, 4149 el, 4150 wrapperEl, 4151 slides 4152 } = swiper; 4153 if (typeof swiper.params === "undefined" || swiper.destroyed) { 4154 return null; 4155 } 4156 swiper.emit("beforeDestroy"); 4157 swiper.initialized = false;
4158 swiper.detachEvents(); 4159 if (params.loop) { 4160 swiper.loopDestroy(); 4161 } 4162 if (cleanStyles) { 4163 swiper.removeClasses(); 4164 el.removeAttribute("style"); 4165 wrapperEl.removeAttribute("style"); 4166 if (slides && slides.length) { 4167 slides.forEach((slideEl) => { 4168 slideEl.classList.remove(params.slideVisibleClass, params.slideFullyVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass); 4169 slideEl.removeAttribute("style"); 4170 slideEl.removeAttribute("data-swiper-slide-index"); 4171 }); 4172 } 4173 } 4174 swiper.emit("destroy"); 4175 Object.keys(swiper.eventsListeners).forEach((eventName) => { 4176 swiper.off(eventName); 4177 }); 4178 if (deleteInstance !== false) { 4179 swiper.el.swiper = null; 4180 deleteProps(swiper); 4181 } 4182 swiper.destroyed = true; 4183 return null; 4184 } 4185 static extendDefaults(newDefaults) { 4186 extend(extendedDefaults, newDefaults); 4187 } 4188 static get extendedDefaults() { 4189 return extendedDefaults; 4190 } 4191 static get defaults() { 4192 return defaults; 4193 } 4194 static installModule(mod) { 4195 if (!Swiper.prototype.__modules__) 4196 Swiper.prototype.__modules__ = []; 4197 const modules = Swiper.prototype.__modules__; 4198 if (typeof mod === "function" && modules.indexOf(mod) < 0) { 4199 modules.push(mod); 4200 } 4201 } 4202 static use(module) { 4203 if (Array.isArray(module)) { 4204 module.forEach((m) => Swiper.installModule(m)); 4205 return Swiper; 4206 } 4207 Swiper.installModule(module); 4208 return Swiper; 4209 } 4210} 4211Object.keys(prototypes).forEach((prototypeGroup) => { 4212 Object.keys(prototypes[prototypeGroup]).forEach((protoMethod) => { 4213 Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod]; 4214 }); 4215}); 4216Swiper.use([Resize, Observer]); 4217function createElementIfNotDefined(swiper, originalParams, params, checkProps) { 4218 if (swiper.params.createElements) { 4219 Object.keys(checkProps).forEach((key) => { 4220 if (!params[key] && params.auto === true) { 4221 let element = elementChildren(swiper.el, `.${checkProps[key]}`)[0]; 4222 if (!element) { 4223 element = createElement("div", checkProps[key]); 4224 element.className = checkProps[key]; 4225 swiper.el.append(element); 4226 } 4227 params[key] = element; 4228 originalParams[key] = element; 4229 } 4230 }); 4231 } 4232 return params; 4233} 4234function Navigation(_ref) { 4235 let { 4236 swiper, 4237 extendParams, 4238 on, 4239 emit 4240 } = _ref; 4241 extendParams({ 4242 navigation: { 4243 nextEl: null, 4244 prevEl: null, 4245 hideOnClick: false, 4246 disabledClass: "swiper-button-disabled", 4247 hiddenClass: "swiper-button-hidden", 4248 lockClass: "swiper-button-lock", 4249 navigationDisabledClass: "swiper-navigation-disabled" 4250 } 4251 }); 4252 swiper.navigation = { 4253 nextEl: null, 4254 prevEl: null 4255 }; 4256 function getEl(el) { 4257 let res; 4258 if (el && typeof el === "string" && swiper.isElement) { 4259 res = swiper.el.querySelector(el); 4260 if (res) 4261 return res; 4262 } 4263 if (el) { 4264 if (typeof el === "string") 4265 res = [...document.querySelectorAll(el)]; 4266 if (swiper.params.uniqueNavElements && typeof el === "string" && res && res.length > 1 && swiper.el.querySelectorAll(el).length === 1) { 4267 res = swiper.el.querySelector(el); 4268 } else if (res && res.length === 1) { 4269 res = res[0]; 4270 } 4271 } 4272 if (el && !res) 4273 return el; 4274 return res; 4275 } 4276 function toggleEl(el, disabled) { 4277 const params = swiper.params.navigation; 4278 el = makeElementsArray(el); 4279 el.forEach((subEl) => { 4280 if (subEl) { 4281 subEl.classList[disabled ? "add" : "remove"](...params.disabledClass.split(" ")); 4282 if (subEl.tagName === "BUTTON") 4283 subEl.disabled = disabled; 4284 if (swiper.params.watchOverflow && swiper.enabled) { 4285 subEl.classList[swiper.isLocked ? "add" : "remove"](params.lockClass); 4286 } 4287 } 4288 }); 4289 } 4290 function update2() { 4291 const { 4292 nextEl, 4293 prevEl 4294 } = swiper.navigation; 4295 if (swiper.params.loop) { 4296 toggleEl(prevEl, false); 4297 toggleEl(nextEl, false); 4298 return; 4299 } 4300 toggleEl(prevEl, swiper.isBeginning && !swiper.params.rewind); 4301 toggleEl(nextEl, swiper.isEnd && !swiper.params.rewind); 4302 } 4303 function onPrevClick(e) { 4304 e.preventDefault(); 4305 if (swiper.isBeginning && !swiper.params.loop && !swiper.params.rewind) 4306 return; 4307 swiper.slidePrev(); 4308 emit("navigationPrev"); 4309 } 4310 function onNextClick(e) { 4311 e.preventDefault(); 4312 if (swiper.isEnd && !swiper.params.loop && !swiper.params.rewind) 4313 return; 4314 swiper.slideNext(); 4315 emit("navigationNext"); 4316 }
4317 function init() { 4318 const params = swiper.params.navigation; 4319 swiper.params.navigation = createElementIfNotDefined(swiper, swiper.originalParams.navigation, swiper.params.navigation, { 4320 nextEl: "swiper-button-next", 4321 prevEl: "swiper-button-prev" 4322 }); 4323 if (!(params.nextEl || params.prevEl)) 4324 return; 4325 let nextEl = getEl(params.nextEl); 4326 let prevEl = getEl(params.prevEl); 4327 Object.assign(swiper.navigation, { 4328 nextEl, 4329 prevEl 4330 }); 4331 nextEl = makeElementsArray(nextEl); 4332 prevEl = makeElementsArray(prevEl); 4333 const initButton = (el, dir) => { 4334 if (el) { 4335 el.addEventListener("click", dir === "next" ? onNextClick : onPrevClick); 4336 } 4337 if (!swiper.enabled && el) { 4338 el.classList.add(...params.lockClass.split(" ")); 4339 } 4340 }; 4341 nextEl.forEach((el) => initButton(el, "next")); 4342 prevEl.forEach((el) => initButton(el, "prev")); 4343 } 4344 function destroy() { 4345 let { 4346 nextEl, 4347 prevEl 4348 } = swiper.navigation; 4349 nextEl = makeElementsArray(nextEl); 4350 prevEl = makeElementsArray(prevEl); 4351 const destroyButton = (el, dir) => { 4352 el.removeEventListener("click", dir === "next" ? onNextClick : onPrevClick); 4353 el.classList.remove(...swiper.params.navigation.disabledClass.split(" ")); 4354 }; 4355 nextEl.forEach((el) => destroyButton(el, "next")); 4356 prevEl.forEach((el) => destroyButton(el, "prev")); 4357 } 4358 on("init", () => { 4359 if (swiper.params.navigation.enabled === false) { 4360 disable(); 4361 } else { 4362 init(); 4363 update2(); 4364 } 4365 }); 4366 on("toEdge fromEdge lock unlock", () => { 4367 update2(); 4368 }); 4369 on("destroy", () => { 4370 destroy(); 4371 }); 4372 on("enable disable", () => { 4373 let { 4374 nextEl, 4375 prevEl 4376 } = swiper.navigation; 4377 nextEl = makeElementsArray(nextEl); 4378 prevEl = makeElementsArray(prevEl); 4379 if (swiper.enabled) { 4380 update2(); 4381 return; 4382 } 4383 [...nextEl, ...prevEl].filter((el) => !!el).forEach((el) => el.classList.add(swiper.params.navigation.lockClass)); 4384 }); 4385 on("click", (_s, e) => { 4386 let { 4387 nextEl, 4388 prevEl 4389 } = swiper.navigation; 4390 nextEl = makeElementsArray(nextEl); 4391 prevEl = makeElementsArray(prevEl); 4392 const targetEl = e.target; 4393 if (swiper.params.navigation.hideOnClick && !prevEl.includes(targetEl) && !nextEl.includes(targetEl)) { 4394 if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) 4395 return; 4396 let isHidden; 4397 if (nextEl.length) { 4398 isHidden = nextEl[0].classList.contains(swiper.params.navigation.hiddenClass); 4399 } else if (prevEl.length) { 4400 isHidden = prevEl[0].classList.contains(swiper.params.navigation.hiddenClass); 4401 } 4402 if (isHidden === true) { 4403 emit("navigationShow"); 4404 } else { 4405 emit("navigationHide"); 4406 } 4407 [...nextEl, ...prevEl].filter((el) => !!el).forEach((el) => el.classList.toggle(swiper.params.navigation.hiddenClass)); 4408 } 4409 }); 4410 const enable = () => { 4411 swiper.el.classList.remove(...swiper.params.navigation.navigationDisabledClass.split(" ")); 4412 init(); 4413 update2(); 4414 }; 4415 const disable = () => { 4416 swiper.el.classList.add(...swiper.params.navigation.navigationDisabledClass.split(" ")); 4417 destroy(); 4418 }; 4419 Object.assign(swiper.navigation, { 4420 enable, 4421 disable, 4422 update: update2, 4423 init, 4424 destroy 4425 }); 4426} 4427function classesToSelector(classes2) { 4428 if (classes2 === void 0) { 4429 classes2 = ""; 4430 } 4431 return `.${classes2.trim().replace(/([\.:!+\/])/g, "\\$1").replace(/ /g, ".")}`; 4432} 4433function Pagination(_ref) { 4434 let { 4435 swiper, 4436 extendParams, 4437 on, 4438 emit 4439 } = _ref; 4440 const pfx = "swiper-pagination"; 4441 extendParams({ 4442 pagination: { 4443 el: null, 4444 bulletElement: "span", 4445 clickable: false, 4446 hideOnClick: false, 4447 renderBullet: null, 4448 renderProgressbar: null, 4449 renderFraction: null, 4450 renderCustom: null, 4451 progressbarOpposite: false, 4452 type: "bullets", 4453 // 'bullets' or 'progressbar' or 'fraction' or 'custom' 4454 dynamicBullets: false, 4455 dynamicMainBullets: 1, 4456 formatFractionCurrent: (number) => number, 4457 formatFractionTotal: (number) => number, 4458 bulletClass: `${pfx}-bullet`, 4459 bulletActiveClass: `${pfx}-bullet-active`, 4460 modifierClass: `${pfx}-`, 4461 currentClass: `${pfx}-current`, 4462 totalClass: `${pfx}-total`, 4463 hiddenClass: `${pfx}-hidden`, 4464 progressbarFillClass: `${pfx}-progressbar-fill`, 4465 progressbarOppositeClass: `${pfx}-progressbar-opposite`, 4466 clickableClass: `${pfx}-clickable`, 4467 lockClass: `${pfx}-lock`, 4468 horizontalClass: `${pfx}-horizontal`, 4469 verticalClass: `${pfx}-vertical`, 4470 paginationDisabledClass: `${pfx}-disabled` 4471 } 4472 }); 4473 swiper.pagination = { 4474 el: null, 4475 bullets: [] 4476 }; 4477 let bulletSize; 4478 let dynamicBulletIndex = 0; 4479 function isPaginationDisabled() { 4480 return !swiper.params.pagination.el || !swiper.pagination.el || Array.isArray(swiper.pagination.el) && swiper.pagination.el.length === 0; 4481 } 4482 function setSideBullets(bulletEl, position) { 4483 const { 4484 bulletActiveClass 4485 } = swiper.params.pagination; 4486 if (!bulletEl) 4487 return; 4488 bulletEl = bulletEl[`${position === "prev" ? "previous" : "next"}ElementSibling`]; 4489 if (bulletEl) { 4490 bulletEl.classList.add(`${bulletActiveClass}-${position}`); 4491 bulletEl = bulletEl[`${position === "prev" ? "previous" : "next"}ElementSibling`]; 4492 if (bulletEl) { 4493 bulletEl.classList.add(`${bulletActiveClass}-${position}-${position}`); 4494 } 4495 } 4496 } 4497 function onBulletClick(e) { 4498 const bulletEl = e.target.closest(classesToSelector(swiper.params.pagination.bulletClass)); 4499 if (!bulletEl) { 4500 return; 4501 } 4502 e.preventDefault(); 4503 const index = elementIndex(bulletEl) * swiper.params.slidesPerGroup; 4504 if (swiper.params.loop) { 4505 if (swiper.realIndex === index) 4506 return; 4507 swiper.slideToLoop(index); 4508 } else { 4509 swiper.slideTo(index); 4510 } 4511 } 4512 function update2() { 4513 const rtl = swiper.rtl; 4514 const params = swiper.params.pagination; 4515 if (isPaginationDisabled()) 4516 return; 4517 let el = swiper.pagination.el; 4518 el = makeElementsArray(el);
vendor: 23,751 bytes, lines 4519-5196
4519 let current; 4520 let previousIndex; 4521 const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length; 4522 const total = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length; 4523 if (swiper.params.loop) { 4524 previousIndex = swiper.previousRealIndex || 0; 4525 current = swiper.params.slidesPerGroup > 1 ? Math.floor(swiper.realIndex / swiper.params.slidesPerGroup) : swiper.realIndex; 4526 } else if (typeof swiper.snapIndex !== "undefined") { 4527 current = swiper.snapIndex; 4528 previousIndex = swiper.previousSnapIndex; 4529 } else { 4530 previousIndex = swiper.previousIndex || 0; 4531 current = swiper.activeIndex || 0; 4532 } 4533 if (params.type === "bullets" && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) { 4534 const bullets = swiper.pagination.bullets; 4535 let firstIndex; 4536 let lastIndex; 4537 let midIndex; 4538 if (params.dynamicBullets) { 4539 bulletSize = elementOuterSize(bullets[0], swiper.isHorizontal() ? "width" : "height", true); 4540 el.forEach((subEl) => { 4541 subEl.style[swiper.isHorizontal() ? "width" : "height"] = `${bulletSize * (params.dynamicMainBullets + 4)}px`; 4542 }); 4543 if (params.dynamicMainBullets > 1 && previousIndex !== void 0) { 4544 dynamicBulletIndex += current - (previousIndex || 0); 4545 if (dynamicBulletIndex > params.dynamicMainBullets - 1) { 4546 dynamicBulletIndex = params.dynamicMainBullets - 1; 4547 } else if (dynamicBulletIndex < 0) { 4548 dynamicBulletIndex = 0; 4549 } 4550 } 4551 firstIndex = Math.max(current - dynamicBulletIndex, 0); 4552 lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1); 4553 midIndex = (lastIndex + firstIndex) / 2; 4554 } 4555 bullets.forEach((bulletEl) => { 4556 const classesToRemove = [...["", "-next", "-next-next", "-prev", "-prev-prev", "-main"].map((suffix) => `${params.bulletActiveClass}${suffix}`)].map((s) => typeof s === "string" && s.includes(" ") ? s.split(" ") : s).flat(); 4557 bulletEl.classList.remove(...classesToRemove); 4558 }); 4559 if (el.length > 1) { 4560 bullets.forEach((bullet) => { 4561 const bulletIndex = elementIndex(bullet); 4562 if (bulletIndex === current) { 4563 bullet.classList.add(...params.bulletActiveClass.split(" ")); 4564 } else if (swiper.isElement) { 4565 bullet.setAttribute("part", "bullet"); 4566 } 4567 if (params.dynamicBullets) { 4568 if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) { 4569 bullet.classList.add(...`${params.bulletActiveClass}-main`.split(" ")); 4570 } 4571 if (bulletIndex === firstIndex) { 4572 setSideBullets(bullet, "prev"); 4573 } 4574 if (bulletIndex === lastIndex) { 4575 setSideBullets(bullet, "next"); 4576 } 4577 } 4578 }); 4579 } else { 4580 const bullet = bullets[current]; 4581 if (bullet) { 4582 bullet.classList.add(...params.bulletActiveClass.split(" ")); 4583 } 4584 if (swiper.isElement) { 4585 bullets.forEach((bulletEl, bulletIndex) => { 4586 bulletEl.setAttribute("part", bulletIndex === current ? "bullet-active" : "bullet"); 4587 }); 4588 } 4589 if (params.dynamicBullets) { 4590 const firstDisplayedBullet = bullets[firstIndex]; 4591 const lastDisplayedBullet = bullets[lastIndex]; 4592 for (let i = firstIndex; i <= lastIndex; i += 1) { 4593 if (bullets[i]) { 4594 bullets[i].classList.add(...`${params.bulletActiveClass}-main`.split(" ")); 4595 } 4596 } 4597 setSideBullets(firstDisplayedBullet, "prev"); 4598 setSideBullets(lastDisplayedBullet, "next"); 4599 } 4600 } 4601 if (params.dynamicBullets) { 4602 const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4); 4603 const bulletsOffset = (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize; 4604 const offsetProp = rtl ? "right" : "left"; 4605 bullets.forEach((bullet) => { 4606 bullet.style[swiper.isHorizontal() ? offsetProp : "top"] = `${bulletsOffset}px`; 4607 }); 4608 } 4609 } 4610 el.forEach((subEl, subElIndex) => { 4611 if (params.type === "fraction") { 4612 subEl.querySelectorAll(classesToSelector(params.currentClass)).forEach((fractionEl) => { 4613 fractionEl.textContent = params.formatFractionCurrent(current + 1); 4614 }); 4615 subEl.querySelectorAll(classesToSelector(params.totalClass)).forEach((totalEl) => { 4616 totalEl.textContent = params.formatFractionTotal(total); 4617 }); 4618 } 4619 if (params.type === "progressbar") { 4620 let progressbarDirection; 4621 if (params.progressbarOpposite) { 4622 progressbarDirection = swiper.isHorizontal() ? "vertical" : "horizontal"; 4623 } else { 4624 progressbarDirection = swiper.isHorizontal() ? "horizontal" : "vertical"; 4625 } 4626 const scale = (current + 1) / total; 4627 let scaleX = 1; 4628 let scaleY = 1; 4629 if (progressbarDirection === "horizontal") { 4630 scaleX = scale; 4631 } else { 4632 scaleY = scale; 4633 } 4634 subEl.querySelectorAll(classesToSelector(params.progressbarFillClass)).forEach((progressEl) => { 4635 progressEl.style.transform = `translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`; 4636 progressEl.style.transitionDuration = `${swiper.params.speed}ms`; 4637 }); 4638 } 4639 if (params.type === "custom" && params.renderCustom) { 4640 subEl.innerHTML = params.renderCustom(swiper, current + 1, total); 4641 if (subElIndex === 0) 4642 emit("paginationRender", subEl); 4643 } else { 4644 if (subElIndex === 0) 4645 emit("paginationRender", subEl); 4646 emit("paginationUpdate", subEl); 4647 } 4648 if (swiper.params.watchOverflow && swiper.enabled) { 4649 subEl.classList[swiper.isLocked ? "add" : "remove"](params.lockClass); 4650 } 4651 }); 4652 } 4653 function render() { 4654 const params = swiper.params.pagination; 4655 if (isPaginationDisabled()) 4656 return; 4657 const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.grid && swiper.params.grid.rows > 1 ? swiper.slides.length / Math.ceil(swiper.params.grid.rows) : swiper.slides.length; 4658 let el = swiper.pagination.el; 4659 el = makeElementsArray(el); 4660 let paginationHTML = ""; 4661 if (params.type === "bullets") { 4662 let numberOfBullets = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length; 4663 if (swiper.params.freeMode && swiper.params.freeMode.enabled && numberOfBullets > slidesLength) { 4664 numberOfBullets = slidesLength; 4665 } 4666 for (let i = 0; i < numberOfBullets; i += 1) { 4667 if (params.renderBullet) { 4668 paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass); 4669 } else { 4670 paginationHTML += `<${params.bulletElement} ${swiper.isElement ? 'part="bullet"' : ""} class="${params.bulletClass}"></${params.bulletElement}>`; 4671 } 4672 } 4673 } 4674 if (params.type === "fraction") { 4675 if (params.renderFraction) { 4676 paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass); 4677 } else { 4678 paginationHTML = `<span class="${params.currentClass}"></span> / <span class="${params.totalClass}"></span>`; 4679 } 4680 } 4681 if (params.type === "progressbar") { 4682 if (params.renderProgressbar) { 4683 paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass); 4684 } else { 4685 paginationHTML = `<span class="${params.progressbarFillClass}"></span>`; 4686 } 4687 } 4688 swiper.pagination.bullets = []; 4689 el.forEach((subEl) => { 4690 if (params.type !== "custom") { 4691 subEl.innerHTML = paginationHTML || ""; 4692 } 4693 if (params.type === "bullets") { 4694 swiper.pagination.bullets.push(...subEl.querySelectorAll(classesToSelector(params.bulletClass))); 4695 } 4696 }); 4697 if (params.type !== "custom") { 4698 emit("paginationRender", el[0]); 4699 } 4700 } 4701 function init() { 4702 swiper.params.pagination = createElementIfNotDefined(swiper, swiper.originalParams.pagination, swiper.params.pagination, { 4703 el: "swiper-pagination" 4704 }); 4705 const params = swiper.params.pagination; 4706 if (!params.el) 4707 return; 4708 let el; 4709 if (typeof params.el === "string" && swiper.isElement) { 4710 el = swiper.el.querySelector(params.el); 4711 } 4712 if (!el && typeof params.el === "string") { 4713 el = [...document.querySelectorAll(params.el)]; 4714 } 4715 if (!el) { 4716 el = params.el; 4717 } 4718 if (!el || el.length === 0) 4719 return; 4720 if (swiper.params.uniqueNavElements && typeof params.el === "string" && Array.isArray(el) && el.length > 1) { 4721 el = [...swiper.el.querySelectorAll(params.el)]; 4722 if (el.length > 1) { 4723 el = el.filter((subEl) => { 4724 if (elementParents(subEl, ".swiper")[0] !== swiper.el) 4725 return false; 4726 return true; 4727 })[0]; 4728 } 4729 } 4730 if (Array.isArray(el) && el.length === 1) 4731 el = el[0]; 4732 Object.assign(swiper.pagination, { 4733 el 4734 }); 4735 el = makeElementsArray(el); 4736 el.forEach((subEl) => { 4737 if (params.type === "bullets" && params.clickable) { 4738 subEl.classList.add(...(params.clickableClass || "").split(" ")); 4739 } 4740 subEl.classList.add(params.modifierClass + params.type); 4741 subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass); 4742 if (params.type === "bullets" && params.dynamicBullets) { 4743 subEl.classList.add(`${params.modifierClass}${params.type}-dynamic`); 4744 dynamicBulletIndex = 0; 4745 if (params.dynamicMainBullets < 1) { 4746 params.dynamicMainBullets = 1; 4747 } 4748 } 4749 if (params.type === "progressbar" && params.progressbarOpposite) { 4750 subEl.classList.add(params.progressbarOppositeClass); 4751 } 4752 if (params.clickable) { 4753 subEl.addEventListener("click", onBulletClick); 4754 } 4755 if (!swiper.enabled) { 4756 subEl.classList.add(params.lockClass); 4757 } 4758 }); 4759 } 4760 function destroy() { 4761 const params = swiper.params.pagination; 4762 if (isPaginationDisabled()) 4763 return; 4764 let el = swiper.pagination.el; 4765 if (el) { 4766 el = makeElementsArray(el); 4767 el.forEach((subEl) => { 4768 subEl.classList.remove(params.hiddenClass); 4769 subEl.classList.remove(params.modifierClass + params.type); 4770 subEl.classList.remove(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass); 4771 if (params.clickable) { 4772 subEl.classList.remove(...(params.clickableClass || "").split(" ")); 4773 subEl.removeEventListener("click", onBulletClick); 4774 } 4775 }); 4776 } 4777 if (swiper.pagination.bullets) 4778 swiper.pagination.bullets.forEach((subEl) => subEl.classList.remove(...params.bulletActiveClass.split(" "))); 4779 } 4780 on("changeDirection", () => { 4781 if (!swiper.pagination || !swiper.pagination.el) 4782 return; 4783 const params = swiper.params.pagination; 4784 let { 4785 el 4786 } = swiper.pagination; 4787 el = makeElementsArray(el); 4788 el.forEach((subEl) => { 4789 subEl.classList.remove(params.horizontalClass, params.verticalClass); 4790 subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass); 4791 }); 4792 }); 4793 on("init", () => { 4794 if (swiper.params.pagination.enabled === false) { 4795 disable(); 4796 } else { 4797 init(); 4798 render(); 4799 update2(); 4800 } 4801 }); 4802 on("activeIndexChange", () => { 4803 if (typeof swiper.snapIndex === "undefined") { 4804 update2(); 4805 } 4806 }); 4807 on("snapIndexChange", () => { 4808 update2(); 4809 }); 4810 on("snapGridLengthChange", () => { 4811 render(); 4812 update2(); 4813 }); 4814 on("destroy", () => { 4815 destroy(); 4816 }); 4817 on("enable disable", () => { 4818 let { 4819 el 4820 } = swiper.pagination; 4821 if (el) { 4822 el = makeElementsArray(el); 4823 el.forEach((subEl) => subEl.classList[swiper.enabled ? "remove" : "add"](swiper.params.pagination.lockClass)); 4824 } 4825 }); 4826 on("lock unlock", () => { 4827 update2(); 4828 }); 4829 on("click", (_s, e) => { 4830 const targetEl = e.target; 4831 const el = makeElementsArray(swiper.pagination.el); 4832 if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && el && el.length > 0 && !targetEl.classList.contains(swiper.params.pagination.bulletClass)) { 4833 if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) 4834 return; 4835 const isHidden = el[0].classList.contains(swiper.params.pagination.hiddenClass); 4836 if (isHidden === true) { 4837 emit("paginationShow"); 4838 } else { 4839 emit("paginationHide"); 4840 } 4841 el.forEach((subEl) => subEl.classList.toggle(swiper.params.pagination.hiddenClass)); 4842 } 4843 }); 4844 const enable = () => { 4845 swiper.el.classList.remove(swiper.params.pagination.paginationDisabledClass); 4846 let { 4847 el 4848 } = swiper.pagination; 4849 if (el) { 4850 el = makeElementsArray(el); 4851 el.forEach((subEl) => subEl.classList.remove(swiper.params.pagination.paginationDisabledClass)); 4852 } 4853 init(); 4854 render(); 4855 update2(); 4856 }; 4857 const disable = () => { 4858 swiper.el.classList.add(swiper.params.pagination.paginationDisabledClass); 4859 let { 4860 el 4861 } = swiper.pagination; 4862 if (el) { 4863 el = makeElementsArray(el); 4864 el.forEach((subEl) => subEl.classList.add(swiper.params.pagination.paginationDisabledClass)); 4865 } 4866 destroy(); 4867 }; 4868 Object.assign(swiper.pagination, { 4869 enable, 4870 disable, 4871 render, 4872 update: update2, 4873 init, 4874 destroy 4875 }); 4876} 4877function Autoplay(_ref) { 4878 let { 4879 swiper, 4880 extendParams, 4881 on, 4882 emit, 4883 params 4884 } = _ref; 4885 swiper.autoplay = { 4886 running: false, 4887 paused: false, 4888 timeLeft: 0 4889 }; 4890 extendParams({ 4891 autoplay: { 4892 enabled: false, 4893 delay: 3e3, 4894 waitForTransition: true, 4895 disableOnInteraction: false, 4896 stopOnLastSlide: false, 4897 reverseDirection: false, 4898 pauseOnMouseEnter: false 4899 } 4900 }); 4901 let timeout; 4902 let raf; 4903 let autoplayDelayTotal = params && params.autoplay ? params.autoplay.delay : 3e3; 4904 let autoplayDelayCurrent = params && params.autoplay ? params.autoplay.delay : 3e3; 4905 let autoplayTimeLeft; 4906 let autoplayStartTime = (/* @__PURE__ */ new Date()).getTime(); 4907 let wasPaused; 4908 let isTouched; 4909 let pausedByTouch; 4910 let touchStartTimeout; 4911 let slideChanged; 4912 let pausedByInteraction; 4913 let pausedByPointerEnter; 4914 function onTransitionEnd(e) { 4915 if (!swiper || swiper.destroyed || !swiper.wrapperEl) 4916 return; 4917 if (e.target !== swiper.wrapperEl) 4918 return; 4919 swiper.wrapperEl.removeEventListener("transitionend", onTransitionEnd); 4920 if (pausedByPointerEnter) { 4921 return; 4922 } 4923 resume(); 4924 } 4925 const calcTimeLeft = () => { 4926 if (swiper.destroyed || !swiper.autoplay.running) 4927 return; 4928 if (swiper.autoplay.paused) { 4929 wasPaused = true; 4930 } else if (wasPaused) { 4931 autoplayDelayCurrent = autoplayTimeLeft; 4932 wasPaused = false; 4933 } 4934 const timeLeft = swiper.autoplay.paused ? autoplayTimeLeft : autoplayStartTime + autoplayDelayCurrent - (/* @__PURE__ */ new Date()).getTime(); 4935 swiper.autoplay.timeLeft = timeLeft; 4936 emit("autoplayTimeLeft", timeLeft, timeLeft / autoplayDelayTotal); 4937 raf = requestAnimationFrame(() => { 4938 calcTimeLeft(); 4939 }); 4940 }; 4941 const getSlideDelay = () => { 4942 let activeSlideEl; 4943 if (swiper.virtual && swiper.params.virtual.enabled) { 4944 activeSlideEl = swiper.slides.filter((slideEl) => slideEl.classList.contains("swiper-slide-active"))[0]; 4945 } else { 4946 activeSlideEl = swiper.slides[swiper.activeIndex]; 4947 } 4948 if (!activeSlideEl) 4949 return void 0; 4950 const currentSlideDelay = parseInt(activeSlideEl.getAttribute("data-swiper-autoplay"), 10); 4951 return currentSlideDelay; 4952 }; 4953 const run = (delayForce) => { 4954 if (swiper.destroyed || !swiper.autoplay.running) 4955 return; 4956 cancelAnimationFrame(raf); 4957 calcTimeLeft(); 4958 let delay = typeof delayForce === "undefined" ? swiper.params.autoplay.delay : delayForce; 4959 autoplayDelayTotal = swiper.params.autoplay.delay; 4960 autoplayDelayCurrent = swiper.params.autoplay.delay; 4961 const currentSlideDelay = getSlideDelay(); 4962 if (!Number.isNaN(currentSlideDelay) && currentSlideDelay > 0 && typeof delayForce === "undefined") { 4963 delay = currentSlideDelay; 4964 autoplayDelayTotal = currentSlideDelay; 4965 autoplayDelayCurrent = currentSlideDelay; 4966 } 4967 autoplayTimeLeft = delay; 4968 const speed = swiper.params.speed; 4969 const proceed = () => { 4970 if (!swiper || swiper.destroyed) 4971 return; 4972 if (swiper.params.autoplay.reverseDirection) { 4973 if (!swiper.isBeginning || swiper.params.loop || swiper.params.rewind) { 4974 swiper.slidePrev(speed, true, true); 4975 emit("autoplay"); 4976 } else if (!swiper.params.autoplay.stopOnLastSlide) { 4977 swiper.slideTo(swiper.slides.length - 1, speed, true, true); 4978 emit("autoplay"); 4979 } 4980 } else { 4981 if (!swiper.isEnd || swiper.params.loop || swiper.params.rewind) { 4982 swiper.slideNext(speed, true, true); 4983 emit("autoplay"); 4984 } else if (!swiper.params.autoplay.stopOnLastSlide) { 4985 swiper.slideTo(0, speed, true, true); 4986 emit("autoplay"); 4987 } 4988 } 4989 if (swiper.params.cssMode) { 4990 autoplayStartTime = (/* @__PURE__ */ new Date()).getTime(); 4991 requestAnimationFrame(() => { 4992 run(); 4993 }); 4994 } 4995 }; 4996 if (delay > 0) { 4997 clearTimeout(timeout); 4998 timeout = setTimeout(() => { 4999 proceed(); 5000 }, delay); 5001 } else { 5002 requestAnimationFrame(() => { 5003 proceed(); 5004 }); 5005 } 5006 return delay; 5007 }; 5008 const start = () => { 5009 autoplayStartTime = (/* @__PURE__ */ new Date()).getTime(); 5010 swiper.autoplay.running = true; 5011 run(); 5012 emit("autoplayStart"); 5013 }; 5014 const stop = () => { 5015 swiper.autoplay.running = false; 5016 clearTimeout(timeout); 5017 cancelAnimationFrame(raf); 5018 emit("autoplayStop"); 5019 }; 5020 const pause = (internal, reset) => { 5021 if (swiper.destroyed || !swiper.autoplay.running) 5022 return; 5023 clearTimeout(timeout); 5024 if (!internal) { 5025 pausedByInteraction = true; 5026 } 5027 const proceed = () => { 5028 emit("autoplayPause"); 5029 if (swiper.params.autoplay.waitForTransition) { 5030 swiper.wrapperEl.addEventListener("transitionend", onTransitionEnd); 5031 } else { 5032 resume(); 5033 } 5034 }; 5035 swiper.autoplay.paused = true; 5036 if (reset) { 5037 if (slideChanged) { 5038 autoplayTimeLeft = swiper.params.autoplay.delay; 5039 } 5040 slideChanged = false; 5041 proceed(); 5042 return; 5043 } 5044 const delay = autoplayTimeLeft || swiper.params.autoplay.delay; 5045 autoplayTimeLeft = delay - ((/* @__PURE__ */ new Date()).getTime() - autoplayStartTime); 5046 if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop) 5047 return; 5048 if (autoplayTimeLeft < 0) 5049 autoplayTimeLeft = 0; 5050 proceed(); 5051 }; 5052 const resume = () => { 5053 if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop || swiper.destroyed || !swiper.autoplay.running) 5054 return; 5055 autoplayStartTime = (/* @__PURE__ */ new Date()).getTime(); 5056 if (pausedByInteraction) { 5057 pausedByInteraction = false; 5058 run(autoplayTimeLeft); 5059 } else { 5060 run(); 5061 } 5062 swiper.autoplay.paused = false; 5063 emit("autoplayResume"); 5064 }; 5065 const onVisibilityChange = () => { 5066 if (swiper.destroyed || !swiper.autoplay.running) 5067 return; 5068 const document2 = getDocument(); 5069 if (document2.visibilityState === "hidden") { 5070 pausedByInteraction = true; 5071 pause(true); 5072 } 5073 if (document2.visibilityState === "visible") { 5074 resume(); 5075 } 5076 }; 5077 const onPointerEnter = (e) => { 5078 if (e.pointerType !== "mouse") 5079 return; 5080 pausedByInteraction = true; 5081 pausedByPointerEnter = true; 5082 if (swiper.animating || swiper.autoplay.paused) 5083 return; 5084 pause(true); 5085 }; 5086 const onPointerLeave = (e) => { 5087 if (e.pointerType !== "mouse") 5088 return; 5089 pausedByPointerEnter = false; 5090 if (swiper.autoplay.paused) { 5091 resume(); 5092 } 5093 }; 5094 const attachMouseEvents = () => { 5095 if (swiper.params.autoplay.pauseOnMouseEnter) { 5096 swiper.el.addEventListener("pointerenter", onPointerEnter); 5097 swiper.el.addEventListener("pointerleave", onPointerLeave); 5098 } 5099 }; 5100 const detachMouseEvents = () => { 5101 swiper.el.removeEventListener("pointerenter", onPointerEnter); 5102 swiper.el.removeEventListener("pointerleave", onPointerLeave); 5103 }; 5104 const attachDocumentEvents = () => { 5105 const document2 = getDocument(); 5106 document2.addEventListener("visibilitychange", onVisibilityChange); 5107 }; 5108 const detachDocumentEvents = () => { 5109 const document2 = getDocument(); 5110 document2.removeEventListener("visibilitychange", onVisibilityChange); 5111 }; 5112 on("init", () => { 5113 if (swiper.params.autoplay.enabled) { 5114 attachMouseEvents(); 5115 attachDocumentEvents(); 5116 start(); 5117 } 5118 }); 5119 on("destroy", () => { 5120 detachMouseEvents(); 5121 detachDocumentEvents(); 5122 if (swiper.autoplay.running) { 5123 stop(); 5124 } 5125 }); 5126 on("_freeModeStaticRelease", () => { 5127 if (pausedByTouch || pausedByInteraction) { 5128 resume(); 5129 } 5130 }); 5131 on("_freeModeNoMomentumRelease", () => { 5132 if (!swiper.params.autoplay.disableOnInteraction) { 5133 pause(true, true); 5134 } else { 5135 stop(); 5136 } 5137 }); 5138 on("beforeTransitionStart", (_s, speed, internal) => { 5139 if (swiper.destroyed || !swiper.autoplay.running) 5140 return; 5141 if (internal || !swiper.params.autoplay.disableOnInteraction) { 5142 pause(true, true); 5143 } else { 5144 stop(); 5145 } 5146 }); 5147 on("sliderFirstMove", () => { 5148 if (swiper.destroyed || !swiper.autoplay.running) 5149 return; 5150 if (swiper.params.autoplay.disableOnInteraction) { 5151 stop(); 5152 return; 5153 } 5154 isTouched = true; 5155 pausedByTouch = false; 5156 pausedByInteraction = false; 5157 touchStartTimeout = setTimeout(() => { 5158 pausedByInteraction = true; 5159 pausedByTouch = true; 5160 pause(true); 5161 }, 200); 5162 }); 5163 on("touchEnd", () => { 5164 if (swiper.destroyed || !swiper.autoplay.running || !isTouched) 5165 return; 5166 clearTimeout(touchStartTimeout); 5167 clearTimeout(timeout); 5168 if (swiper.params.autoplay.disableOnInteraction) { 5169 pausedByTouch = false; 5170 isTouched = false; 5171 return; 5172 } 5173 if (pausedByTouch && swiper.params.cssMode) 5174 resume(); 5175 pausedByTouch = false; 5176 isTouched = false; 5177 }); 5178 on("slideChange", () => { 5179 if (swiper.destroyed || !swiper.autoplay.running) 5180 return; 5181 slideChanged = true; 5182 }); 5183 Object.assign(swiper.autoplay, { 5184 start, 5185 stop, 5186 pause, 5187 resume 5188 }); 5189} 5190export { 5191 Autoplay as A, 5192 Navigation as N, 5193 Pagination as P, 5194 Swiper as S 5195}; 5196//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b3BsYXktZTk5MmIyZTYuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zd2lwZXIvc2hhcmVkL3Nzci13aW5kb3cuZXNtLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zd2lwZXIvc2hhcmVkL3V0aWxzLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zd2lwZXIvc2hhcmVkL3N3aXBlci1jb3JlLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zd2lwZXIvc2hhcmVkL2NyZWF0ZS1lbGVtZW50LWlmLW5vdC1kZWZpbmVkLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zd2lwZXIvbW9kdWxlcy9uYXZpZ2F0aW9uLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zd2lwZXIvc2hhcmVkL2NsYXNzZXMtdG8tc2VsZWN0b3IubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N3aXBlci9tb2R1bGVzL3BhZ2luYX
5196Rpb24ubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N3aXBlci9tb2R1bGVzL2F1dG9wbGF5Lm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNTUiBXaW5kb3cgNC4wLjJcbiAqIEJldHRlciBoYW5kbGluZyBmb3Igd2luZG93IG9iamVjdCBpbiBTU1IgZW52aXJvbm1lbnRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2xpbWl0czR3ZWIvc3NyLXdpbmRvd1xuICpcbiAqIENvcHlyaWdodCAyMDIxLCBWbGFkaW1pciBLaGFybGFtcGlkaVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVFxuICpcbiAqIFJlbGVhc2VkIG9uOiBEZWNlbWJlciAxMywgMjAyMVxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gIHJldHVybiBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvYmogJiYgb2JqLmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG59XG5mdW5jdGlvbiBleHRlbmQodGFyZ2V0LCBzcmMpIHtcbiAgaWYgKHRhcmdldCA9PT0gdm9pZCAwKSB7XG4gICAgdGFyZ2V0ID0ge307XG4gIH1cbiAgaWYgKHNyYyA9PT0gdm9pZCAwKSB7XG4gICAgc3JjID0ge307XG4gIH1cbiAgT2JqZWN0LmtleXMoc3JjKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHRhcmdldFtrZXldID0gc3JjW2tleV07ZWxzZSBpZiAoaXNPYmplY3Qoc3JjW2tleV0pICYmIGlzT2JqZWN0KHRhcmdldFtrZXldKSAmJiBPYmplY3Qua2V5cyhzcmNba2V5XSkubGVuZ3RoID4gMCkge1xuICAgICAgZXh0ZW5kKHRhcmdldFtrZXldLCBzcmNba2V5XSk7XG4gICAgfVxuICB9KTtcbn1cbmNvbnN0IHNzckRvY3VtZW50ID0ge1xuICBib2R5OiB7fSxcbiAgYWRkRXZlbnRMaXN0ZW5lcigpIHt9LFxuICByZW1vdmVFdmVudExpc3RlbmVyKCkge30sXG4gIGFjdGl2ZUVsZW1lbnQ6IHtcbiAgICBibHVyKCkge30sXG4gICAgbm9kZU5hbWU6ICcnXG4gIH0sXG4gIHF1ZXJ5U2VsZWN0b3IoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIHF1ZXJ5U2VsZWN0b3JBbGwoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9LFxuICBnZXRFbGVtZW50QnlJZCgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgY3JlYXRlRXZlbnQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXRFdmVudCgpIHt9XG4gICAgfTtcbiAgfSxcbiAgY3JlYXRlRWxlbWVudCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgY2hpbGROb2RlczogW10sXG4gICAgICBzdHlsZToge30sXG4gICAgICBzZXRBdHRyaWJ1dGUoKSB7fSxcbiAgICAgIGdldEVsZW1lbnRzQnlUYWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgY3JlYXRlRWxlbWVudE5TKCkge1xuICAgIHJldHVybiB7fTtcbiAgfSxcbiAgaW1wb3J0Tm9kZSgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgbG9jYXRpb246IHtcbiAgICBoYXNoOiAnJyxcbiAgICBob3N0OiAnJyxcbiAgICBob3N0bmFtZTogJycsXG4gICAgaHJlZjogJycsXG4gICAgb3JpZ2luOiAnJyxcbiAgICBwYXRobmFtZTogJycsXG4gICAgcHJvdG9jb2w6ICcnLFxuICAgIHNlYXJjaDogJydcbiAgfVxufTtcbmZ1bmN0aW9uIGdldERvY3VtZW50KCkge1xuICBjb25zdCBkb2MgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQgOiB7fTtcbiAgZXh0ZW5kKGRvYywgc3NyRG9jdW1lbnQpO1xuICByZXR1cm4gZG9jO1xufVxuY29uc3Qgc3NyV2luZG93ID0ge1xuICBkb2N1bWVudDogc3NyRG9jdW1lbnQsXG4gIG5hdmlnYXRvcjoge1xuICAgIHVzZXJBZ2VudDogJydcbiAgfSxcbiAgbG9jYXRpb246IHtcbiAgICBoYXNoOiAnJyxcbiAgICBob3N0OiAnJyxcbiAgICBob3N0bmFtZTogJycsXG4gICAgaHJlZjogJycsXG4gICAgb3JpZ2luOiAnJyxcbiAgICBwYXRobmFtZTogJycsXG4gICAgcHJvdG9jb2w6ICcnLFxuICAgIHNlYXJjaDogJydcbiAgfSxcbiAgaGlzdG9yeToge1xuICAgIHJlcGxhY2VTdGF0ZSgpIHt9LFxuICAgIHB1c2hTdGF0ZSgpIHt9LFxuICAgIGdvKCkge30sXG4gICAgYmFjaygpIHt9XG4gIH0sXG4gIEN1c3RvbUV2ZW50OiBmdW5jdGlvbiBDdXN0b21FdmVudCgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgYWRkRXZlbnRMaXN0ZW5lcigpIHt9LFxuICByZW1vdmVFdmVudExpc3RlbmVyKCkge30sXG4gIGdldENvbXB1dGVkU3R5bGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldFByb3BlcnR5VmFsdWUoKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICBJbWFnZSgpIHt9LFxuICBEYXRlKCkge30sXG4gIHNjcmVlbjoge30sXG4gIHNldFRpbWVvdXQoKSB7fSxcbiAgY2xlYXJUaW1lb3V0KCkge30sXG4gIG1hdGNoTWVkaWEoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9LFxuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBzZXRUaW1lb3V0KGNhbGxiYWNrLCAwKTtcbiAgfSxcbiAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpIHtcbiAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNsZWFyVGltZW91dChpZCk7XG4gIH1cbn07XG5mdW5jdGlvbiBnZXRXaW5kb3coKSB7XG4gIGNvbnN0IHdpbiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDoge307XG4gIGV4dGVuZCh3aW4sIHNzcldpbmRvdyk7XG4gIHJldHVybiB3aW47XG59XG5cbmV4cG9ydCB7IGdldFdpbmRvdyBhcyBhLCBnZXREb2N1bWVudCBhcyBnIH07XG4iLCJpbXBvcnQgeyBhIGFzIGdldFdpbmRvdywgZyBhcyBnZXREb2N1bWVudCB9IGZyb20gJy4vc3NyLXdpbmRvdy5lc20ubWpzJztcblxuZnVuY3Rpb24gY2xhc3Nlc1RvVG9rZW5zKGNsYXNzZXMpIHtcbiAgaWYgKGNsYXNzZXMgPT09IHZvaWQgMCkge1xuICAgIGNsYXNzZXMgPSAnJztcbiAgfVxuICByZXR1cm4gY2xhc3Nlcy50cmltKCkuc3BsaXQoJyAnKS5maWx0ZXIoYyA9PiAhIWMudHJpbSgpKTtcbn1cblxuZnVuY3Rpb24gZGVsZXRlUHJvcHMob2JqKSB7XG4gIGNvbnN0IG9iamVjdCA9IG9iajtcbiAgT2JqZWN0LmtleXMob2JqZWN0KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIG9iamVjdFtrZXldID0gbnVsbDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBubyBnZXR0ZXIgZm9yIG9iamVjdFxuICAgIH1cbiAgICB0cnkge1xuICAgICAgZGVsZXRlIG9iamVjdFtrZXldO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHNvbWV0aGluZyBnb3Qgd3JvbmdcbiAgICB9XG4gI
5196H0pO1xufVxuZnVuY3Rpb24gbmV4dFRpY2soY2FsbGJhY2ssIGRlbGF5KSB7XG4gIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7XG4gICAgZGVsYXkgPSAwO1xuICB9XG4gIHJldHVybiBzZXRUaW1lb3V0KGNhbGxiYWNrLCBkZWxheSk7XG59XG5mdW5jdGlvbiBub3coKSB7XG4gIHJldHVybiBEYXRlLm5vdygpO1xufVxuZnVuY3Rpb24gZ2V0Q29tcHV0ZWRTdHlsZShlbCkge1xuICBjb25zdCB3aW5kb3cgPSBnZXRXaW5kb3coKTtcbiAgbGV0IHN0eWxlO1xuICBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUpIHtcbiAgICBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTtcbiAgfVxuICBpZiAoIXN0eWxlICYmIGVsLmN1cnJlbnRTdHlsZSkge1xuICAgIHN0eWxlID0gZWwuY3VycmVudFN0eWxlO1xuICB9XG4gIGlmICghc3R5bGUpIHtcbiAgICBzdHlsZSA9IGVsLnN0eWxlO1xuICB9XG4gIHJldHVybiBzdHlsZTtcbn1cbmZ1bmN0aW9uIGdldFRyYW5zbGF0ZShlbCwgYXhpcykge1xuICBpZiAoYXhpcyA9PT0gdm9pZCAwKSB7XG4gICAgYXhpcyA9ICd4JztcbiAgfVxuICBjb25zdCB3aW5kb3cgPSBnZXRXaW5kb3coKTtcbiAgbGV0IG1hdHJpeDtcbiAgbGV0IGN1clRyYW5zZm9ybTtcbiAgbGV0IHRyYW5zZm9ybU1hdHJpeDtcbiAgY29uc3QgY3VyU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsKTtcbiAgaWYgKHdpbmRvdy5XZWJLaXRDU1NNYXRyaXgpIHtcbiAgICBjdXJUcmFuc2Zvcm0gPSBjdXJTdHlsZS50cmFuc2Zvcm0gfHwgY3VyU3R5bGUud2Via2l0VHJhbnNmb3JtO1xuICAgIGlmIChjdXJUcmFuc2Zvcm0uc3BsaXQoJywnKS5sZW5ndGggPiA2KSB7XG4gICAgICBjdXJUcmFuc2Zvcm0gPSBjdXJUcmFuc2Zvcm0uc3BsaXQoJywgJykubWFwKGEgPT4gYS5yZXBsYWNlKCcsJywgJy4nKSkuam9pbignLCAnKTtcbiAgICB9XG4gICAgLy8gU29tZSBvbGQgdmVyc2lvbnMgb2YgV2Via2l0IGNob2tlIHdoZW4gJ25vbmUnIGlzIHBhc3NlZDsgcGFzc1xuICAgIC8vIGVtcHR5IHN0cmluZyBpbnN0ZWFkIGluIHRoaXMgY2FzZVxuICAgIHRyYW5zZm9ybU1hdHJpeCA9IG5ldyB3aW5kb3cuV2ViS2l0Q1NTTWF0cml4KGN1clRyYW5zZm9ybSA9PT0gJ25vbmUnID8gJycgOiBjdXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIHRyYW5zZm9ybU1hdHJpeCA9IGN1clN0eWxlLk1velRyYW5zZm9ybSB8fCBjdXJTdHlsZS5PVHJhbnNmb3JtIHx8IGN1clN0eWxlLk1zVHJhbnNmb3JtIHx8IGN1clN0eWxlLm1zVHJhbnNmb3JtIHx8IGN1clN0eWxlLnRyYW5zZm9ybSB8fCBjdXJTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd0cmFuc2Zvcm0nKS5yZXBsYWNlKCd0cmFuc2xhdGUoJywgJ21hdHJpeCgxLCAwLCAwLCAxLCcpO1xuICAgIG1hdHJpeCA9IHRyYW5zZm9ybU1hdHJpeC50b1N0cmluZygpLnNwbGl0KCcsJyk7XG4gIH1cbiAgaWYgKGF4aXMgPT09ICd4Jykge1xuICAgIC8vIExhdGVzdCBDaHJvbWUgYW5kIHdlYmtpdHMgRml4XG4gICAgaWYgKHdpbmRvdy5XZWJLaXRDU1NNYXRyaXgpIGN1clRyYW5zZm9ybSA9IHRyYW5zZm9ybU1hdHJpeC5tNDE7XG4gICAgLy8gQ3JhenkgSUUxMCBNYXRyaXhcbiAgICBlbHNlIGlmIChtYXRyaXgubGVuZ3RoID09PSAxNikgY3VyVHJhbnNmb3JtID0gcGFyc2VGbG9hdChtYXRyaXhbMTJdKTtcbiAgICAvLyBOb3JtYWwgQnJvd3NlcnNcbiAgICBlbHNlIGN1clRyYW5zZm9ybSA9IHBhcnNlRmxvYXQobWF0cml4WzRdKTtcbiAgfVxuICBpZiAoYXhpcyA9PT0gJ3knKSB7XG4gICAgLy8gTGF0ZXN0IENocm9tZSBhbmQgd2Via2l0cyBGaXhcbiAgICBpZiAod2luZG93LldlYktpdENTU01hdHJpeCkgY3VyVHJhbnNmb3JtID0gdHJhbnNmb3JtTWF0cml4Lm00MjtcbiAgICAvLyBDcmF6eSBJRTEwIE1hdHJpeFxuICAgIGVsc2UgaWYgKG1hdHJpeC5sZW5ndGggPT09IDE2KSBjdXJUcmFuc2Zvcm0gPSBwYXJzZUZsb2F0KG1hdHJpeFsxM10pO1xuICAgIC8vIE5vcm1hbCBCcm93c2Vyc1xuICAgIGVsc2UgY3VyVHJhbnNmb3JtID0gcGFyc2VGbG9hdChtYXRyaXhbNV0pO1xuICB9XG4gIHJldHVybiBjdXJUcmFuc2Zvcm0gfHwgMDtcbn1cbmZ1bmN0aW9uIGlzT2JqZWN0KG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSAnb2JqZWN0JyAmJiBvICE9PSBudWxsICYmIG8uY29uc3RydWN0b3IgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKSA9PT0gJ09iamVjdCc7XG59XG5mdW5jdGlvbiBpc05vZGUobm9kZSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbiAgfVxuICByZXR1cm4gbm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gMSB8fCBub2RlLm5vZGVUeXBlID09PSAxMSk7XG59XG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gIGNvbnN0IHRvID0gT2JqZWN0KGFyZ3VtZW50cy5sZW5ndGggPD0gMCA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1swXSk7XG4gIGNvbnN0IG5vRXh0ZW5kID0gWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ107XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgbmV4dFNvdXJjZSA9IGkgPCAwIHx8IGFyZ3VtZW50cy5sZW5ndGggPD0gaSA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1tpXTtcbiAgICBpZiAobmV4dFNvdXJjZSAhPT0gdW5kZWZpbmVkICYmIG5leHRTb3VyY2UgIT09IG51bGwgJiYgIWlzTm9kZShuZXh0U291cmNlKSkge1xuICAgICAgY29uc3Qga2V5c0FycmF5ID0gT2JqZWN0LmtleXMoT2JqZWN0KG5leHRTb3VyY2UpKS5maWx0ZXIoa2V5ID0+IG5vRXh0ZW5kLmluZGV4T2Yoa2V5KSA8IDApO1xuICAgICAgZm9yIChsZXQgbmV4dEluZGV4ID0gMCwgbGVuID0ga2V5c0FycmF5Lmxlbmd0aDsgbmV4dEluZGV4IDwgbGVuOyBuZXh0SW5kZXggKz0gMSkge1xuICAgICAgICBjb25zdCBuZXh0S2V5ID0ga2V5c0FycmF
51965W25leHRJbmRleF07XG4gICAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5leHRTb3VyY2UsIG5leHRLZXkpO1xuICAgICAgICBpZiAoZGVzYyAhPT0gdW5kZWZpbmVkICYmIGRlc2MuZW51bWVyYWJsZSkge1xuICAgICAgICAgIGlmIChpc09iamVjdCh0b1tuZXh0S2V5XSkgJiYgaXNPYmplY3QobmV4dFNvdXJjZVtuZXh0S2V5XSkpIHtcbiAgICAgICAgICAgIGlmIChuZXh0U291cmNlW25leHRLZXldLl9fc3dpcGVyX18pIHtcbiAgICAgICAgICAgICAgdG9bbmV4dEtleV0gPSBuZXh0U291cmNlW25leHRLZXldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZXh0ZW5kKHRvW25leHRLZXldLCBuZXh0U291cmNlW25leHRLZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKCFpc09iamVjdCh0b1tuZXh0S2V5XSkgJiYgaXNPYmplY3QobmV4dFNvdXJjZVtuZXh0S2V5XSkpIHtcbiAgICAgICAgICAgIHRvW25leHRLZXldID0ge307XG4gICAgICAgICAgICBpZiAobmV4dFNvdXJjZVtuZXh0S2V5XS5fX3N3aXBlcl9fKSB7XG4gICAgICAgICAgICAgIHRvW25leHRLZXldID0gbmV4dFNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGV4dGVuZCh0b1tuZXh0S2V5XSwgbmV4dFNvdXJjZVtuZXh0S2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvW25leHRLZXldID0gbmV4dFNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvO1xufVxuZnVuY3Rpb24gc2V0Q1NTUHJvcGVydHkoZWwsIHZhck5hbWUsIHZhclZhbHVlKSB7XG4gIGVsLnN0eWxlLnNldFByb3BlcnR5KHZhck5hbWUsIHZhclZhbHVlKTtcbn1cbmZ1bmN0aW9uIGFuaW1hdGVDU1NNb2RlU2Nyb2xsKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBzd2lwZXIsXG4gICAgdGFyZ2V0UG9zaXRpb24sXG4gICAgc2lkZVxuICB9ID0gX3JlZjtcbiAgY29uc3Qgd2luZG93ID0gZ2V0V2luZG93KCk7XG4gIGNvbnN0IHN0YXJ0UG9zaXRpb24gPSAtc3dpcGVyLnRyYW5zbGF0ZTtcbiAgbGV0IHN0YXJ0VGltZSA9IG51bGw7XG4gIGxldCB0aW1lO1xuICBjb25zdCBkdXJhdGlvbiA9IHN3aXBlci5wYXJhbXMuc3BlZWQ7XG4gIHN3aXBlci53cmFwcGVyRWwuc3R5bGUuc2Nyb2xsU25hcFR5cGUgPSAnbm9uZSc7XG4gIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShzd2lwZXIuY3NzTW9kZUZyYW1lSUQpO1xuICBjb25zdCBkaXIgPSB0YXJnZXRQb3NpdGlvbiA+IHN0YXJ0UG9zaXRpb24gPyAnbmV4dCcgOiAncHJldic7XG4gIGNvbnN0IGlzT3V0T2ZCb3VuZCA9IChjdXJyZW50LCB0YXJnZXQpID0+IHtcbiAgICByZXR1cm4gZGlyID09PSAnbmV4dCcgJiYgY3VycmVudCA+PSB0YXJnZXQgfHwgZGlyID09PSAncHJldicgJiYgY3VycmVudCA8PSB0YXJnZXQ7XG4gIH07XG4gIGNvbnN0IGFuaW1hdGUgPSAoKSA9PiB7XG4gICAgdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIGlmIChzdGFydFRpbWUgPT09IG51bGwpIHtcbiAgICAgIHN0YXJ0VGltZSA9IHRpbWU7XG4gICAgfVxuICAgIGNvbnN0IHByb2dyZXNzID0gTWF0aC5tYXgoTWF0aC5taW4oKHRpbWUgLSBzdGFydFRpbWUpIC8gZHVyYXRpb24sIDEpLCAwKTtcbiAgICBjb25zdCBlYXNlUHJvZ3Jlc3MgPSAwLjUgLSBNYXRoLmNvcyhwcm9ncmVzcyAqIE1hdGguUEkpIC8gMjtcbiAgICBsZXQgY3VycmVudFBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbiArIGVhc2VQcm9ncmVzcyAqICh0YXJnZXRQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24pO1xuICAgIGlmIChpc091dE9mQm91bmQoY3VycmVudFBvc2l0aW9uLCB0YXJnZXRQb3NpdGlvbikpIHtcbiAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IHRhcmdldFBvc2l0aW9uO1xuICAgIH1cbiAgICBzd2lwZXIud3JhcHBlckVsLnNjcm9sbFRvKHtcbiAgICAgIFtzaWRlXTogY3VycmVudFBvc2l0aW9uXG4gICAgfSk7XG4gICAgaWYgKGlzT3V0T2ZCb3VuZChjdXJyZW50UG9zaXRpb24sIHRhcmdldFBvc2l0aW9uKSkge1xuICAgICAgc3dpcGVyLndyYXBwZXJFbC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgc3dpcGVyLndyYXBwZXJFbC5zdHlsZS5zY3JvbGxTbmFwVHlwZSA9ICcnO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHN3aXBlci53cmFwcGVyRWwuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgICAgICAgc3dpcGVyLndyYXBwZXJFbC5zY3JvbGxUbyh7XG4gICAgICAgICAgW3NpZGVdOiBjdXJyZW50UG9zaXRpb25cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShzd2lwZXIuY3NzTW9kZUZyYW1lSUQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzd2lwZXIuY3NzTW9kZUZyYW1lSUQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xuICB9O1xuICBhbmltYXRlKCk7XG59XG5mdW5jdGlvbiBnZXRTbGlkZVRyYW5zZm9ybUVsKHNsaWRlRWwpIHtcbiAgcmV0dXJuIHNsaWRlRWwucXVlcnlTZWxlY3RvcignLnN3aXBlci1zbGlkZS10cmFuc2Zvcm0nKSB8fCBzbGlkZUVsLnNoYWRvd1Jvb3QgJiYgc2xpZGVFbC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5zd2lwZXItc2xpZGUtdHJhbnNmb3JtJykgfHwgc2xpZGVFbDtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRDaGlsZHJlbihlbGVtZW50LCBzZWxlY3Rvcikge1xuICBpZiAoc2VsZWN0b3IgPT09IHZvaWQgMCkge1xuICAgIHNlbGVjdG9yID0gJyc7XG4gIH1cbiAgcmV0dXJuIFsuLi5lbGVtZW50LmNoaWxkcmVuXS5maWx0ZXIoZWwgPT4gZWwubWF0Y2hlcyhzZWxlY3RvcikpO1xufVxuZnVuY3Rpb24gc2hvd1dhcm5pbmcodGV4dCkge1xuICB0cnkge1xuICAgIGNvbnNvbGUud2Fybih0ZXh0KTtcbiAgICByZXR1cm47XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIGVyclxuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRhZywgY2xhc3Nlcykge1xuICBpZiAoY2xhc3NlcyA9PT0gdm9pZCAwKSB7XG4gICAgY2xhc3NlcyA9IFtdO1xuICB9XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuICBlbC5jbGFzc0xpc3QuYWRkKC4uLihBcnJheS5pc0FycmF
51965KGNsYXNzZXMpID8gY2xhc3NlcyA6IGNsYXNzZXNUb1Rva2VucyhjbGFzc2VzKSkpO1xuICByZXR1cm4gZWw7XG59XG5mdW5jdGlvbiBlbGVtZW50T2Zmc2V0KGVsKSB7XG4gIGNvbnN0IHdpbmRvdyA9IGdldFdpbmRvdygpO1xuICBjb25zdCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7XG4gIGNvbnN0IGJveCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuYm9keTtcbiAgY29uc3QgY2xpZW50VG9wID0gZWwuY2xpZW50VG9wIHx8IGJvZHkuY2xpZW50VG9wIHx8IDA7XG4gIGNvbnN0IGNsaWVudExlZnQgPSBlbC5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwO1xuICBjb25zdCBzY3JvbGxUb3AgPSBlbCA9PT0gd2luZG93ID8gd2luZG93LnNjcm9sbFkgOiBlbC5zY3JvbGxUb3A7XG4gIGNvbnN0IHNjcm9sbExlZnQgPSBlbCA9PT0gd2luZG93ID8gd2luZG93LnNjcm9sbFggOiBlbC5zY3JvbGxMZWZ0O1xuICByZXR1cm4ge1xuICAgIHRvcDogYm94LnRvcCArIHNjcm9sbFRvcCAtIGNsaWVudFRvcCxcbiAgICBsZWZ0OiBib3gubGVmdCArIHNjcm9sbExlZnQgLSBjbGllbnRMZWZ0XG4gIH07XG59XG5mdW5jdGlvbiBlbGVtZW50UHJldkFsbChlbCwgc2VsZWN0b3IpIHtcbiAgY29uc3QgcHJldkVscyA9IFtdO1xuICB3aGlsZSAoZWwucHJldmlvdXNFbGVtZW50U2libGluZykge1xuICAgIGNvbnN0IHByZXYgPSBlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICBpZiAocHJldi5tYXRjaGVzKHNlbGVjdG9yKSkgcHJldkVscy5wdXNoKHByZXYpO1xuICAgIH0gZWxzZSBwcmV2RWxzLnB1c2gocHJldik7XG4gICAgZWwgPSBwcmV2O1xuICB9XG4gIHJldHVybiBwcmV2RWxzO1xufVxuZnVuY3Rpb24gZWxlbWVudE5leHRBbGwoZWwsIHNlbGVjdG9yKSB7XG4gIGNvbnN0IG5leHRFbHMgPSBbXTtcbiAgd2hpbGUgKGVsLm5leHRFbGVtZW50U2libGluZykge1xuICAgIGNvbnN0IG5leHQgPSBlbC5uZXh0RWxlbWVudFNpYmxpbmc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgIGlmIChuZXh0Lm1hdGNoZXMoc2VsZWN0b3IpKSBuZXh0RWxzLnB1c2gobmV4dCk7XG4gICAgfSBlbHNlIG5leHRFbHMucHVzaChuZXh0KTtcbiAgICBlbCA9IG5leHQ7XG4gIH1cbiAgcmV0dXJuIG5leHRFbHM7XG59XG5mdW5jdGlvbiBlbGVtZW50U3R5bGUoZWwsIHByb3ApIHtcbiAgY29uc3Qgd2luZG93ID0gZ2V0V2luZG93KCk7XG4gIHJldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShwcm9wKTtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRJbmRleChlbCkge1xuICBsZXQgY2hpbGQgPSBlbDtcbiAgbGV0IGk7XG4gIGlmIChjaGlsZCkge1xuICAgIGkgPSAwO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHdoaWxlICgoY2hpbGQgPSBjaGlsZC5wcmV2aW91c1NpYmxpbmcpICE9PSBudWxsKSB7XG4gICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEpIGkgKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRQYXJlbnRzKGVsLCBzZWxlY3Rvcikge1xuICBjb25zdCBwYXJlbnRzID0gW107IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgbGV0IHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgaWYgKHBhcmVudC5tYXRjaGVzKHNlbGVjdG9yKSkgcGFyZW50cy5wdXNoKHBhcmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudHMucHVzaChwYXJlbnQpO1xuICAgIH1cbiAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudDtcbiAgfVxuICByZXR1cm4gcGFyZW50cztcbn1cbmZ1bmN0aW9uIGVsZW1lbnRUcmFuc2l0aW9uRW5kKGVsLCBjYWxsYmFjaykge1xuICBmdW5jdGlvbiBmaXJlQ2FsbEJhY2soZSkge1xuICAgIGlmIChlLnRhcmdldCAhPT0gZWwpIHJldHVybjtcbiAgICBjYWxsYmFjay5jYWxsKGVsLCBlKTtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZmlyZUNhbGxCYWNrKTtcbiAgfVxuICBpZiAoY2FsbGJhY2spIHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZmlyZUNhbGxCYWNrKTtcbiAgfVxufVxuZnVuY3Rpb24gZWxlbWVudE91dGVyU2l6ZShlbCwgc2l6ZSwgaW5jbHVkZU1hcmdpbnMpIHtcbiAgY29uc3Qgd2luZG93ID0gZ2V0V2luZG93KCk7XG4gIGlmIChpbmNsdWRlTWFyZ2lucykge1xuICAgIHJldHVybiBlbFtzaXplID09PSAnd2lkdGgnID8gJ29mZnNldFdpZHRoJyA6ICdvZmZzZXRIZWlnaHQnXSArIHBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpLmdldFByb3BlcnR5VmFsdWUoc2l6ZSA9PT0gJ3dpZHRoJyA/ICdtYXJnaW4tcmlnaHQnIDogJ21hcmdpbi10b3AnKSkgKyBwYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKHNpemUgPT09ICd3aWR0aCcgPyAnbWFyZ2luLWxlZnQnIDogJ21hcmdpbi1ib3R0b20nKSk7XG4gIH1cbiAgcmV0dXJuIGVsLm9mZnNldFdpZHRoO1xufVxuZnVuY3Rpb24gbWFrZUVsZW1lbnRzQXJyYXkoZWwpIHtcbiAgcmV0dXJuIChBcnJheS5pc0FycmF5KGVsKSA/IGVsIDogW2VsXSkuZmlsdGVyKGUgPT4gISFlKTtcbn1cblxuZXhwb3J0IHsgZWxlbWVudFBhcmVudHMgYXMgYSwgZWxlbWVudE9mZnNldCBhcyBiLCBjcmVhdGVFbGVtZW50IGFzIGMsIG5vdyBhcyBkLCBlbGVtZW50Q2hpbGRyZW4gYXMgZSwgZWxlbWVudE91dGVyU2l6ZSBhcyBmLCBnZXRTbGlkZVRyYW5zZm9ybUVsIGFzIGcsIGVsZW1lbnRJbmRleCBhcyBoLCBjbGFzc2VzVG9Ub2tlbnMgYXMgaSwgZ2V0VHJhbnNsYXRlIGFzIGosIGVsZW1lbnRUcmFuc2l0aW9uRW5kIGFzIGssIGlzT2JqZWN0IGFzIGwsIG1ha2VFbGVtZW50c0FycmF5IGFzIG0sIG5leHRUaWNrIGFzIG4sIGVsZW1lbnRTdHlsZSBhcyBvLCBlbGVtZW50TmV4dEFsbCBhcyBwLCBlbGVtZW50UHJldkFsbCBhcyBxLCBhbmltYXRlQ1NTTW9kZVNjcm9sbCBhcyByLCBzZXRDU1NQcm9wZXJ0eSBhcyBzLCBzaG93V2FybmluZyBhcyB0LCBleHRlbmQgYXMgdSwgZGVsZXRlUHJvcHMgYXMgdiB9O1xuIiwiaW1wb3J0IHsgYSBhcyBnZXRXaW5kb3csIGcgYXMgZ2V0RG9jdW1lbnQgfSBmcm9tICcuL3Nzci13aW5kb3cuZXNtLm1qcyc7XG5pbXBvcnQgeyBhIGFzIGVsZW1lbnRQYXJlbnRzLCBvIGFzIGVsZW1lbnRTdHlsZSwgZSBhcyBlbGVtZW50Q2hpbGRyZW4sIHMgYXMgc2V0Q1NTUHJvcGVydHksIGYgYXMgZWxlbWVudE91dGVyU2l6ZSwgcCBhcyBlbGVtZW50TmV4dEFsbCwgcSBhcyBlbGVtZW50UHJldkFsbCwgaiBhcyBnZXRUcmFuc2xhdGUsIHIgYXMgYW5pbWF0ZUNTU01vZGVTY3JvbGwsIG4gYXMgbm
5196V4dFRpY2ssIHQgYXMgc2hvd1dhcm5pbmcsIGMgYXMgY3JlYXRlRWxlbWVudCwgZCBhcyBub3csIHUgYXMgZXh0ZW5kLCBoIGFzIGVsZW1lbnRJbmRleCwgdiBhcyBkZWxldGVQcm9wcyB9IGZyb20gJy4vdXRpbHMubWpzJztcblxubGV0IHN1cHBvcnQ7XG5mdW5jdGlvbiBjYWxjU3VwcG9ydCgpIHtcbiAgY29uc3Qgd2luZG93ID0gZ2V0V2luZG93KCk7XG4gIGNvbnN0IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcbiAgcmV0dXJuIHtcbiAgICBzbW9vdGhTY3JvbGw6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgJ3Njcm9sbEJlaGF2aW9yJyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUsXG4gICAgdG91Y2g6ICEhKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyB8fCB3aW5kb3cuRG9jdW1lbnRUb3VjaCAmJiBkb2N1bWVudCBpbnN0YW5jZW9mIHdpbmRvdy5Eb2N1bWVudFRvdWNoKVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0U3VwcG9ydCgpIHtcbiAgaWYgKCFzdXBwb3J0KSB7XG4gICAgc3VwcG9ydCA9IGNhbGNTdXBwb3J0KCk7XG4gIH1cbiAgcmV0dXJuIHN1cHBvcnQ7XG59XG5cbmxldCBkZXZpY2VDYWNoZWQ7XG5mdW5jdGlvbiBjYWxjRGV2aWNlKF90ZW1wKSB7XG4gIGxldCB7XG4gICAgdXNlckFnZW50XG4gIH0gPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDtcbiAgY29uc3Qgc3VwcG9ydCA9IGdldFN1cHBvcnQoKTtcbiAgY29uc3Qgd2luZG93ID0gZ2V0V2luZG93KCk7XG4gIGNvbnN0IHBsYXRmb3JtID0gd2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybTtcbiAgY29uc3QgdWEgPSB1c2VyQWdlbnQgfHwgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG4gIGNvbnN0IGRldmljZSA9IHtcbiAgICBpb3M6IGZhbHNlLFxuICAgIGFuZHJvaWQ6IGZhbHNlXG4gIH07XG4gIGNvbnN0IHNjcmVlbldpZHRoID0gd2luZG93LnNjcmVlbi53aWR0aDtcbiAgY29uc3Qgc2NyZWVuSGVpZ2h0ID0gd2luZG93LnNjcmVlbi5oZWlnaHQ7XG4gIGNvbnN0IGFuZHJvaWQgPSB1YS5tYXRjaCgvKEFuZHJvaWQpOz9bXFxzXFwvXSsoW1xcZC5dKyk/Lyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgbGV0IGlwYWQgPSB1YS5tYXRjaCgvKGlQYWQpLipPU1xccyhbXFxkX10rKS8pO1xuICBjb25zdCBpcG9kID0gdWEubWF0Y2goLyhpUG9kKSguKk9TXFxzKFtcXGRfXSspKT8vKTtcbiAgY29uc3QgaXBob25lID0gIWlwYWQgJiYgdWEubWF0Y2goLyhpUGhvbmVcXHNPU3xpT1MpXFxzKFtcXGRfXSspLyk7XG4gIGNvbnN0IHdpbmRvd3MgPSBwbGF0Zm9ybSA9PT0gJ1dpbjMyJztcbiAgbGV0IG1hY29zID0gcGxhdGZvcm0gPT09ICdNYWNJbnRlbCc7XG5cbiAgLy8gaVBhZE9zIDEzIGZpeFxuICBjb25zdCBpUGFkU2NyZWVucyA9IFsnMTAyNHgxMzY2JywgJzEzNjZ4MTAyNCcsICc4MzR4MTE5NCcsICcxMTk0eDgzNCcsICc4MzR4MTExMicsICcxMTEyeDgzNCcsICc3Njh4MTAyNCcsICcxMDI0eDc2OCcsICc4MjB4MTE4MCcsICcxMTgweDgyMCcsICc4MTB4MTA4MCcsICcxMDgweDgxMCddO1xuICBpZiAoIWlwYWQgJiYgbWFjb3MgJiYgc3VwcG9ydC50b3VjaCAmJiBpUGFkU2NyZWVucy5pbmRleE9mKGAke3NjcmVlbldpZHRofXgke3NjcmVlbkhlaWdodH1gKSA+PSAwKSB7XG4gICAgaXBhZCA9IHVhLm1hdGNoKC8oVmVyc2lvbilcXC8oW1xcZC5dKykvKTtcbiAgICBpZiAoIWlwYWQpIGlwYWQgPSBbMCwgMSwgJzEzXzBfMCddO1xuICAgIG1hY29zID0gZmFsc2U7XG4gIH1cblxuICAvLyBBbmRyb2lkXG4gIGlmIChhbmRyb2lkICYmICF3aW5kb3dzKSB7XG4gICAgZGV2aWNlLm9zID0gJ2FuZHJvaWQnO1xuICAgIGRldmljZS5hbmRyb2lkID0gdHJ1ZTtcbiAgfVxuICBpZiAoaXBhZCB8fCBpcGhvbmUgfHwgaXBvZCkge1xuICAgIGRldmljZS5vcyA9ICdpb3MnO1xuICAgIGRldmljZS5pb3MgPSB0cnVlO1xuICB9XG5cbiAgLy8gRXhwb3J0IG9iamVjdFxuICByZXR1cm4gZGV2aWNlO1xufVxuZnVuY3Rpb24gZ2V0RGV2aWNlKG92ZXJyaWRlcykge1xuICBpZiAob3ZlcnJpZGVzID09PSB2b2lkIDApIHtcbiAgICBvdmVycmlkZXMgPSB7fTtcbiAgfVxuICBpZiAoIWRldmljZUNhY2hlZCkge1xuICAgIGRldmljZUNhY2hlZCA9IGNhbGNEZXZpY2Uob3ZlcnJpZGVzKTtcbiAgfVxuICByZXR1cm4gZGV2aWNlQ2FjaGVkO1xufVxuXG5sZXQgYnJvd3NlcjtcbmZ1bmN0aW9uIGNhbGNCcm93c2VyKCkge1xuICBjb25zdCB3aW5kb3cgPSBnZXRXaW5kb3coKTtcbiAgY29uc3QgZGV2aWNlID0gZ2V0RGV2aWNlKCk7XG4gIGxldCBuZWVkUGVyc3BlY3RpdmVGaXggPSBmYWxzZTtcbiAgZnVuY3Rpb24gaXNTYWZhcmkoKSB7XG4gICAgY29uc3QgdWEgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB1YS5pbmRleE9mKCdzYWZhcmknKSA+PSAwICYmIHVhLmluZGV4T2YoJ2Nocm9tZScpIDwgMCAmJiB1YS5pbmRleE9mKCdhbmRyb2lkJykgPCAwO1xuICB9XG4gIGlmIChpc1NhZmFyaSgpKSB7XG4gICAgY29uc3QgdWEgPSBTdHJpbmcod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIGlmICh1YS5pbmNsdWRlcygnVmVyc2lvbi8nKSkge1xuICAgICAgY29uc3QgW21ham9yLCBtaW5vcl0gPSB1YS5zcGxpdCgnVmVyc2lvbi8nKVsxXS5zcGxpdCgnICcpWzBdLnNwbGl0KCcuJykubWFwKG51bSA9PiBOdW1iZXIobnVtKSk7XG4gICAgICBuZWVkUGVyc3BlY3RpdmVGaXggPSBtYWpvciA8IDE2IHx8IG1ham9yID09PSAxNiAmJiBtaW5vciA8IDI7XG4gICAgfVxuICB9XG4gIGNvbnN0IGlzV2ViVmlldyA9IC8oaVBob25lfGlQb2R8aVBhZCkuKkFwcGxlV2ViS2l0KD8hLipTYWZhcmkpL2kudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gIGNvbnN0IGlzU2FmYXJpQnJvd3NlciA9IGlzU2FmYXJpKCk7XG4gIGNvbnN0IG5lZWQzZEZpeCA9IGlzU2FmYXJpQnJvd3NlciB8fCBpc1dlYlZpZXcgJiYgZGV2aWNlLmlvcztcbiAgcmV0dXJuIHtcbiAgICBpc1NhZmFyaTogbmVlZFBlcnNwZWN0aXZlRml4IHx8IGlzU2FmYXJpQnJvd3NlcixcbiAgICBuZWVkUGVyc3BlY3RpdmVGaXgsXG4gICAgbmVlZDNkRml4LFxuICAgIGlzV2ViVmlld1xuICB9O1xufVxuZnVuY3Rpb24gZ2V0QnJvd3NlcigpIHtcbiAgaWYgKCFicm93c2VyKSB7XG4gICAgYnJvd3NlciA9IGNhbGNCcm93c2VyKCk7XG4gIH1cbiAgcmV0dXJuIGJyb3dzZXI7XG59XG5cbmZ1bmN0aW9uIFJlc2l6ZShfcmVmKSB7XG4gIGxldCB7XG4gICAgc3dpcGVyLFxuICAgIG9uLFxuICAgIGVtaXRcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHdpbmRvdyA9IGdldFdpbmRvdygpO1xuICBsZXQgb2JzZXJ2ZXIgPSBudWxsO1xuICBsZXQgYW5pbWF0aW9uRnJhbWUgPSBudWxsO1xuICBjb25zdCByZXNpemVIYW5kbGVyID0gKCkgPT4ge1xuICAgIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci5pbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIGVtaXQoJ2JlZm9yZVJlc2l6ZScpO1xuICAgIGVtaXQoJ3Jlc2l6ZScpO1xuICB9O1xuICBjb25zdCBjcmVhdGVPYnNlcnZlciA9ICgpID0+IHtcbiAgICBpZiAoIXN3aXBlciB8fCBzd2lwZXIuZGVzdHJveWVkIHx8ICFzd2lwZXIuaW5pdGlhbGl6ZWQpIHJldHVybjtcbiAgICBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgIGFuaW1hdGlvbkZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHRcbiAgICAgICAgfSA9IHN3aXBlcjtcbiAgICAgICAgbGV0IG5ld1dpZHRoID0gd2lkdGg7XG4gICAgICAgIGxldCBuZXdIZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGVudHJpZXMuZm9yRWFjaChfcmVmMiA9PiB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGNvbnRlbn
5196RCb3hTaXplLFxuICAgICAgICAgICAgY29udGVudFJlY3QsXG4gICAgICAgICAgICB0YXJnZXRcbiAgICAgICAgICB9ID0gX3JlZjI7XG4gICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09IHN3aXBlci5lbCkgcmV0dXJuO1xuICAgICAgICAgIG5ld1dpZHRoID0gY29udGVudFJlY3QgPyBjb250ZW50UmVjdC53aWR0aCA6IChjb250ZW50Qm94U2l6ZVswXSB8fCBjb250ZW50Qm94U2l6ZSkuaW5saW5lU2l6ZTtcbiAgICAgICAgICBuZXdIZWlnaHQgPSBjb250ZW50UmVjdCA/IGNvbnRlbnRSZWN0LmhlaWdodCA6IChjb250ZW50Qm94U2l6ZVswXSB8fCBjb250ZW50Qm94U2l6ZSkuYmxvY2tTaXplO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG5ld1dpZHRoICE9PSB3aWR0aCB8fCBuZXdIZWlnaHQgIT09IGhlaWdodCkge1xuICAgICAgICAgIHJlc2l6ZUhhbmRsZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShzd2lwZXIuZWwpO1xuICB9O1xuICBjb25zdCByZW1vdmVPYnNlcnZlciA9ICgpID0+IHtcbiAgICBpZiAoYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShhbmltYXRpb25GcmFtZSk7XG4gICAgfVxuICAgIGlmIChvYnNlcnZlciAmJiBvYnNlcnZlci51bm9ic2VydmUgJiYgc3dpcGVyLmVsKSB7XG4gICAgICBvYnNlcnZlci51bm9ic2VydmUoc3dpcGVyLmVsKTtcbiAgICAgIG9ic2VydmVyID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG9yaWVudGF0aW9uQ2hhbmdlSGFuZGxlciA9ICgpID0+IHtcbiAgICBpZiAoIXN3aXBlciB8fCBzd2lwZXIuZGVzdHJveWVkIHx8ICFzd2lwZXIuaW5pdGlhbGl6ZWQpIHJldHVybjtcbiAgICBlbWl0KCdvcmllbnRhdGlvbmNoYW5nZScpO1xuICB9O1xuICBvbignaW5pdCcsICgpID0+IHtcbiAgICBpZiAoc3dpcGVyLnBhcmFtcy5yZXNpemVPYnNlcnZlciAmJiB0eXBlb2Ygd2luZG93LlJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY3JlYXRlT2JzZXJ2ZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHJlc2l6ZUhhbmRsZXIpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvcmllbnRhdGlvbmNoYW5nZScsIG9yaWVudGF0aW9uQ2hhbmdlSGFuZGxlcik7XG4gIH0pO1xuICBvbignZGVzdHJveScsICgpID0+IHtcbiAgICByZW1vdmVPYnNlcnZlcigpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCByZXNpemVIYW5kbGVyKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignb3JpZW50YXRpb25jaGFuZ2UnLCBvcmllbnRhdGlvbkNoYW5nZUhhbmRsZXIpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gT2JzZXJ2ZXIoX3JlZikge1xuICBsZXQge1xuICAgIHN3aXBlcixcbiAgICBleHRlbmRQYXJhbXMsXG4gICAgb24sXG4gICAgZW1pdFxuICB9ID0gX3JlZjtcbiAgY29uc3Qgb2JzZXJ2ZXJzID0gW107XG4gIGNvbnN0IHdpbmRvdyA9IGdldFdpbmRvdygpO1xuICBjb25zdCBhdHRhY2ggPSBmdW5jdGlvbiAodGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBjb25zdCBPYnNlcnZlckZ1bmMgPSB3aW5kb3cuTXV0YXRpb25PYnNlcnZlciB8fCB3aW5kb3cuV2Via2l0TXV0YXRpb25PYnNlcnZlcjtcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBPYnNlcnZlckZ1bmMobXV0YXRpb25zID0+IHtcbiAgICAgIC8vIFRoZSBvYnNlcnZlclVwZGF0ZSBldmVudCBzaG91bGQgb25seSBiZSB0cmlnZ2VyZWRcbiAgICAgIC8vIG9uY2UgZGVzcGl0ZSB0aGUgbnVtYmVyIG9mIG11dGF0aW9ucy4gIEFkZGl0aW9uYWxcbiAgICAgIC8vIHRyaWdnZXJzIGFyZSByZWR1bmRhbnQgYW5kIGFyZSB2ZXJ5IGNvc3RseVxuICAgICAgaWYgKHN3aXBlci5fX3ByZXZlbnRPYnNlcnZlcl9fKSByZXR1cm47XG4gICAgICBpZiAobXV0YXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBlbWl0KCdvYnNlcnZlclVwZGF0ZScsIG11dGF0aW9uc1swXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmVyVXBkYXRlID0gZnVuY3Rpb24gb2JzZXJ2ZXJVcGRhdGUoKSB7XG4gICAgICAgIGVtaXQoJ29ic2VydmVyVXBkYXRlJywgbXV0YXRpb25zWzBdKTtcbiAgICAgIH07XG4gICAgICBpZiAod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKG9ic2VydmVyVXBkYXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KG9ic2VydmVyVXBkYXRlLCAwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKHRhcmdldCwge1xuICAgICAgYXR0cmlidXRlczogdHlwZW9mIG9wdGlvbnMuYXR0cmlidXRlcyA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogb3B0aW9ucy5hdHRyaWJ1dGVzLFxuICAgICAgY2hpbGRMaXN0OiB0eXBlb2Ygb3B0aW9ucy5jaGlsZExpc3QgPT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6IG9wdGlvbnMuY2hpbGRMaXN0LFxuICAgICAgY2hhcmFjdGVyRGF0YTogdHlwZW9mIG9wdGlvbnMuY2hhcmFjdGVyRGF0YSA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogb3B0aW9ucy5jaGFyYWN0ZXJEYXRhXG4gICAgfSk7XG4gICAgb2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpO1xuICB9O1xuICBjb25zdCBpbml0ID0gKCkgPT4ge1xuICAgIGlmICghc3dpcGVyLnBhcmFtcy5vYnNlcnZlcikgcmV0dXJuO1xuICAgIGlmIChzd2lwZXIucGFyYW1zLm9ic2VydmVQYXJlbnRzKSB7XG4gICAgICBjb25zdCBjb250YWluZXJQYXJlbnRzID0gZWxlbWVudFBhcmVudHMoc3dpcGVyLmhvc3RFbCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRhaW5lclBhcmVudHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgYXR0YWNoKGNvbnRhaW5lclBhcmVudHNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBPYnNlcnZlIGNvbnRhaW5lclxuICAgIGF0dGFjaChzd2lwZXIuaG9zdEVsLCB7XG4gICAgICBjaGlsZExpc3Q6IHN3aXBlci5wYXJhbXMub2JzZXJ2ZVNsaWRlQ2hpbGRyZW5cbiAgICB9KTtcblxuICAgIC8vIE9ic2VydmUgd3JhcHBlclxuICAgIGF0dGFjaChzd2lwZXIud3JhcHBlckVsLCB7XG4gICAgICBhdHRyaWJ1dGVzOiBmYWxzZVxuICAgIH0pO1xuICB9O1xuICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgIG9ic2VydmVycy5mb3JFYWNoKG9ic2VydmVyID0+IHtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9KTtcbiAgICBvYnNlcnZlcnMuc3BsaWNlKDAsIG9ic2VydmVycy5sZW5ndGgpO1xuICB9O1xuICBleHRlbmRQYXJhbXMoe1xuICAgIG9ic2VydmVyOiBmYWxzZSxcbiAgICBvYnNlcnZlUGFyZW50czogZmFsc2UsXG4gICAgb2JzZXJ2ZVNsaWRlQ2hpbGRyZW46IGZhbHNlXG4gI
5196H0pO1xuICBvbignaW5pdCcsIGluaXQpO1xuICBvbignZGVzdHJveScsIGRlc3Ryb3kpO1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlcnNjb3JlLWRhbmdsZSAqL1xuXG52YXIgZXZlbnRzRW1pdHRlciA9IHtcbiAgb24oZXZlbnRzLCBoYW5kbGVyLCBwcmlvcml0eSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGlmICghc2VsZi5ldmVudHNMaXN0ZW5lcnMgfHwgc2VsZi5kZXN0cm95ZWQpIHJldHVybiBzZWxmO1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHNlbGY7XG4gICAgY29uc3QgbWV0aG9kID0gcHJpb3JpdHkgPyAndW5zaGlmdCcgOiAncHVzaCc7XG4gICAgZXZlbnRzLnNwbGl0KCcgJykuZm9yRWFjaChldmVudCA9PiB7XG4gICAgICBpZiAoIXNlbGYuZXZlbnRzTGlzdGVuZXJzW2V2ZW50XSkgc2VsZi5ldmVudHNMaXN0ZW5lcnNbZXZlbnRdID0gW107XG4gICAgICBzZWxmLmV2ZW50c0xpc3RlbmVyc1tldmVudF1bbWV0aG9kXShoYW5kbGVyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZjtcbiAgfSxcbiAgb25jZShldmVudHMsIGhhbmRsZXIsIHByaW9yaXR5KSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCFzZWxmLmV2ZW50c0xpc3RlbmVycyB8fCBzZWxmLmRlc3Ryb3llZCkgcmV0dXJuIHNlbGY7XG4gICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gc2VsZjtcbiAgICBmdW5jdGlvbiBvbmNlSGFuZGxlcigpIHtcbiAgICAgIHNlbGYub2ZmKGV2ZW50cywgb25jZUhhbmRsZXIpO1xuICAgICAgaWYgKG9uY2VIYW5kbGVyLl9fZW1pdHRlclByb3h5KSB7XG4gICAgICAgIGRlbGV0ZSBvbmNlSGFuZGxlci5fX2VtaXR0ZXJQcm94eTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuICAgICAgaGFuZGxlci5hcHBseShzZWxmLCBhcmdzKTtcbiAgICB9XG4gICAgb25jZUhhbmRsZXIuX19lbWl0dGVyUHJveHkgPSBoYW5kbGVyO1xuICAgIHJldHVybiBzZWxmLm9uKGV2ZW50cywgb25jZUhhbmRsZXIsIHByaW9yaXR5KTtcbiAgfSxcbiAgb25BbnkoaGFuZGxlciwgcHJpb3JpdHkpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBpZiAoIXNlbGYuZXZlbnRzTGlzdGVuZXJzIHx8IHNlbGYuZGVzdHJveWVkKSByZXR1cm4gc2VsZjtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09ICdmdW5jdGlvbicpIHJldHVybiBzZWxmO1xuICAgIGNvbnN0IG1ldGhvZCA9IHByaW9yaXR5ID8gJ3Vuc2hpZnQnIDogJ3B1c2gnO1xuICAgIGlmIChzZWxmLmV2ZW50c0FueUxpc3RlbmVycy5pbmRleE9mKGhhbmRsZXIpIDwgMCkge1xuICAgICAgc2VsZi5ldmVudHNBbnlMaXN0ZW5lcnNbbWV0aG9kXShoYW5kbGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH0sXG4gIG9mZkFueShoYW5kbGVyKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCFzZWxmLmV2ZW50c0xpc3RlbmVycyB8fCBzZWxmLmRlc3Ryb3llZCkgcmV0dXJuIHNlbGY7XG4gICAgaWYgKCFzZWxmLmV2ZW50c0FueUxpc3RlbmVycykgcmV0dXJuIHNlbGY7XG4gICAgY29uc3QgaW5kZXggPSBzZWxmLmV2ZW50c0FueUxpc3RlbmVycy5pbmRleE9mKGhhbmRsZXIpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICBzZWxmLmV2ZW50c0FueUxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZjtcbiAgfSxcbiAgb2ZmKGV2ZW50cywgaGFuZGxlcikge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGlmICghc2VsZi5ldmVudHNMaXN0ZW5lcnMgfHwgc2VsZi5kZXN0cm95ZWQpIHJldHVybiBzZWxmO1xuICAgIGlmICghc2VsZi5ldmVudHNMaXN0ZW5lcnMpIHJldHVybiBzZWxmO1xuICAgIGV2ZW50cy5zcGxpdCgnICcpLmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzZWxmLmV2ZW50c0xpc3RlbmVyc1tldmVudF0gPSBbXTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5ldmVudHNMaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgIHNlbGYuZXZlbnRzTGlzdGVuZXJzW2V2ZW50XS5mb3JFYWNoKChldmVudEhhbmRsZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50SGFuZGxlciA9PT0gaGFuZGxlciB8fCBldmVudEhhbmRsZXIuX19lbWl0dGVyUHJveHkgJiYgZXZlbnRIYW5kbGVyLl9fZW1pdHRlclByb3h5ID09PSBoYW5kbGVyKSB7XG4gICAgICAgICAgICBzZWxmLmV2ZW50c0xpc3RlbmVyc1tldmVudF0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzZWxmO1xuICB9LFxuICBlbWl0KCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGlmICghc2VsZi5ldmVudHNMaXN0ZW5lcnMgfHwgc2VsZi5kZXN0cm95ZWQpIHJldHVybiBzZWxmO1xuICAgIGlmICghc2VsZi5ldmVudHNMaXN0ZW5lcnMpIHJldHVybiBzZWxmO1xuICAgIGxldCBldmVudHM7XG4gICAgbGV0IGRhdGE7XG4gICAgbGV0IGNvbnRleHQ7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycgfHwgQXJyYXkuaXNBcnJheShhcmdzWzBdKSkge1xuICAgICAgZXZlbnRzID0gYXJnc1swXTtcbiAgICAgIGRhdGEgPSBhcmdzLnNsaWNlKDEsIGFyZ3MubGVuZ3RoKTtcbiAgICAgIGNvbnRleHQgPSBzZWxmO1xuICAgIH0gZWxzZSB7XG4gICAgICBldmVudHMgPSBhcmdzWzBdLmV2ZW50cztcbiAgICAgIGRhdGEgPSBhcmdzWzBdLmRhdGE7XG4gICAgICBjb250ZXh0ID0gYXJnc1swXS5jb250ZXh0IHx8IHNlbGY7XG4gICAgfVxuICAgIGRhdGEudW5zaGlmdChjb250ZXh0KTtcbiAgICBjb25zdCBldmVudHNBcnJheSA9IEFycmF5LmlzQXJyYXkoZXZlbnRzKSA/IGV2ZW50cyA6
5196IGV2ZW50cy5zcGxpdCgnICcpO1xuICAgIGV2ZW50c0FycmF5LmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgaWYgKHNlbGYuZXZlbnRzQW55TGlzdGVuZXJzICYmIHNlbGYuZXZlbnRzQW55TGlzdGVuZXJzLmxlbmd0aCkge1xuICAgICAgICBzZWxmLmV2ZW50c0FueUxpc3RlbmVycy5mb3JFYWNoKGV2ZW50SGFuZGxlciA9PiB7XG4gICAgICAgICAgZXZlbnRIYW5kbGVyLmFwcGx5KGNvbnRleHQsIFtldmVudCwgLi4uZGF0YV0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWxmLmV2ZW50c0xpc3RlbmVycyAmJiBzZWxmLmV2ZW50c0xpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgc2VsZi5ldmVudHNMaXN0ZW5lcnNbZXZlbnRdLmZvckVhY2goZXZlbnRIYW5kbGVyID0+IHtcbiAgICAgICAgICBldmVudEhhbmRsZXIuYXBwbHkoY29udGV4dCwgZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzZWxmO1xuICB9XG59O1xuXG5mdW5jdGlvbiB1cGRhdGVTaXplKCkge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBsZXQgd2lkdGg7XG4gIGxldCBoZWlnaHQ7XG4gIGNvbnN0IGVsID0gc3dpcGVyLmVsO1xuICBpZiAodHlwZW9mIHN3aXBlci5wYXJhbXMud2lkdGggIT09ICd1bmRlZmluZWQnICYmIHN3aXBlci5wYXJhbXMud2lkdGggIT09IG51bGwpIHtcbiAgICB3aWR0aCA9IHN3aXBlci5wYXJhbXMud2lkdGg7XG4gIH0gZWxzZSB7XG4gICAgd2lkdGggPSBlbC5jbGllbnRXaWR0aDtcbiAgfVxuICBpZiAodHlwZW9mIHN3aXBlci5wYXJhbXMuaGVpZ2h0ICE9PSAndW5kZWZpbmVkJyAmJiBzd2lwZXIucGFyYW1zLmhlaWdodCAhPT0gbnVsbCkge1xuICAgIGhlaWdodCA9IHN3aXBlci5wYXJhbXMuaGVpZ2h0O1xuICB9IGVsc2Uge1xuICAgIGhlaWdodCA9IGVsLmNsaWVudEhlaWdodDtcbiAgfVxuICBpZiAod2lkdGggPT09IDAgJiYgc3dpcGVyLmlzSG9yaXpvbnRhbCgpIHx8IGhlaWdodCA9PT0gMCAmJiBzd2lwZXIuaXNWZXJ0aWNhbCgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU3VidHJhY3QgcGFkZGluZ3NcbiAgd2lkdGggPSB3aWR0aCAtIHBhcnNlSW50KGVsZW1lbnRTdHlsZShlbCwgJ3BhZGRpbmctbGVmdCcpIHx8IDAsIDEwKSAtIHBhcnNlSW50KGVsZW1lbnRTdHlsZShlbCwgJ3BhZGRpbmctcmlnaHQnKSB8fCAwLCAxMCk7XG4gIGhlaWdodCA9IGhlaWdodCAtIHBhcnNlSW50KGVsZW1lbnRTdHlsZShlbCwgJ3BhZGRpbmctdG9wJykgfHwgMCwgMTApIC0gcGFyc2VJbnQoZWxlbWVudFN0eWxlKGVsLCAncGFkZGluZy1ib3R0b20nKSB8fCAwLCAxMCk7XG4gIGlmIChOdW1iZXIuaXNOYU4od2lkdGgpKSB3aWR0aCA9IDA7XG4gIGlmIChOdW1iZXIuaXNOYU4oaGVpZ2h0KSkgaGVpZ2h0ID0gMDtcbiAgT2JqZWN0LmFzc2lnbihzd2lwZXIsIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgc2l6ZTogc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gd2lkdGggOiBoZWlnaHRcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNsaWRlcygpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgZnVuY3Rpb24gZ2V0RGlyZWN0aW9uUHJvcGVydHlWYWx1ZShub2RlLCBsYWJlbCkge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KG5vZGUuZ2V0UHJvcGVydHlWYWx1ZShzd2lwZXIuZ2V0RGlyZWN0aW9uTGFiZWwobGFiZWwpKSB8fCAwKTtcbiAgfVxuICBjb25zdCBwYXJhbXMgPSBzd2lwZXIucGFyYW1zO1xuICBjb25zdCB7XG4gICAgd3JhcHBlckVsLFxuICAgIHNsaWRlc0VsLFxuICAgIHNpemU6IHN3aXBlclNpemUsXG4gICAgcnRsVHJhbnNsYXRlOiBydGwsXG4gICAgd3JvbmdSVExcbiAgfSA9IHN3aXBlcjtcbiAgY29uc3QgaXNWaXJ0dWFsID0gc3dpcGVyLnZpcnR1YWwgJiYgcGFyYW1zLnZpcnR1YWwuZW5hYmxlZDtcbiAgY29uc3QgcHJldmlvdXNTbGlkZXNMZW5ndGggPSBpc1ZpcnR1YWwgPyBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoIDogc3dpcGVyLnNsaWRlcy5sZW5ndGg7XG4gIGNvbnN0IHNsaWRlcyA9IGVsZW1lbnRDaGlsZHJlbihzbGlkZXNFbCwgYC4ke3N3aXBlci5wYXJhbXMuc2xpZGVDbGFzc30sIHN3aXBlci1zbGlkZWApO1xuICBjb25zdCBzbGlkZXNMZW5ndGggPSBpc1ZpcnR1YWwgPyBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoIDogc2xpZGVzLmxlbmd0aDtcbiAgbGV0IHNuYXBHcmlkID0gW107XG4gIGNvbnN0IHNsaWRlc0dyaWQgPSBbXTtcbiAgY29uc3Qgc2xpZGVzU2l6ZXNHcmlkID0gW107XG4gIGxldCBvZmZzZXRCZWZvcmUgPSBwYXJhbXMuc2xpZGVzT2Zmc2V0QmVmb3JlO1xuICBpZiAodHlwZW9mIG9mZnNldEJlZm9yZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9mZnNldEJlZm9yZSA9IHBhcmFtcy5zbGlkZXNPZmZzZXRCZWZvcmUuY2FsbChzd2lwZXIpO1xuICB9XG4gIGxldCBvZmZzZXRBZnRlciA9IHBhcmFtcy5zbGlkZXNPZmZzZXRBZnRlcjtcbiAgaWYgKHR5cGVvZiBvZmZzZXRBZnRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9mZnNldEFmdGVyID0gcGFyYW1zLnNsaWRlc09mZnNldEFmdGVyLmNhbGwoc3dpcGVyKTtcbiAgfVxuICBjb25zdCBwcmV2aW91c1NuYXBHcmlkTGVuZ3RoID0gc3dpcGVyLnNuYXBHcmlkLmxlbmd0aDtcbiAgY29uc3QgcHJldmlvdXNTbGlkZXNHcmlkTGVuZ3RoID0gc3dpcGVyLnNsaWRlc0dyaWQubGVuZ3RoO1xuICBsZXQgc3BhY2VCZXR3ZWVuID0gcGFyYW1zLnNwYWNlQmV0d2VlbjtcbiAgbGV0IHNsaWRlUG9zaXRpb24gPSAtb2Zmc2V0QmVmb3JlO1xuICBsZXQgcHJldlNsaWRlU2l6ZSA9IDA7XG4gIGxldCBpbmRleCA9IDA7XG4gIGlmICh0eXBlb2Ygc3dpcGVyU2l6ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHR5cGVvZiBzcGFjZUJldHdlZW4gPT09ICdzdHJpbmcnICYmIHNwYWNlQmV0d2Vlbi5pbmRleE9mKCclJykgPj0gMCkge1xuICAgIHNwYWNlQmV0d2VlbiA9IHBhcnNlRmxvYXQoc3BhY2VCZXR3ZWVuLnJlcGxhY2UoJyUnLCAnJykpIC8gMTAwICogc3dpcGVyU2l6ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygc3BhY2VCZXR3ZWVuID09PSAnc3RyaW5nJykge1xuICAgIHNwYWNlQmV0d2VlbiA9IHBhcnNlRmxvYXQoc3BhY2VCZXR3ZWVuKTtcbiAgfVxuICBzd2lwZXIudmlydHVhbFNpemUgPSAtc3B
5196hY2VCZXR3ZWVuO1xuXG4gIC8vIHJlc2V0IG1hcmdpbnNcbiAgc2xpZGVzLmZvckVhY2goc2xpZGVFbCA9PiB7XG4gICAgaWYgKHJ0bCkge1xuICAgICAgc2xpZGVFbC5zdHlsZS5tYXJnaW5MZWZ0ID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNsaWRlRWwuc3R5bGUubWFyZ2luUmlnaHQgPSAnJztcbiAgICB9XG4gICAgc2xpZGVFbC5zdHlsZS5tYXJnaW5Cb3R0b20gPSAnJztcbiAgICBzbGlkZUVsLnN0eWxlLm1hcmdpblRvcCA9ICcnO1xuICB9KTtcblxuICAvLyByZXNldCBjc3NNb2RlIG9mZnNldHNcbiAgaWYgKHBhcmFtcy5jZW50ZXJlZFNsaWRlcyAmJiBwYXJhbXMuY3NzTW9kZSkge1xuICAgIHNldENTU1Byb3BlcnR5KHdyYXBwZXJFbCwgJy0tc3dpcGVyLWNlbnRlcmVkLW9mZnNldC1iZWZvcmUnLCAnJyk7XG4gICAgc2V0Q1NTUHJvcGVydHkod3JhcHBlckVsLCAnLS1zd2lwZXItY2VudGVyZWQtb2Zmc2V0LWFmdGVyJywgJycpO1xuICB9XG4gIGNvbnN0IGdyaWRFbmFibGVkID0gcGFyYW1zLmdyaWQgJiYgcGFyYW1zLmdyaWQucm93cyA+IDEgJiYgc3dpcGVyLmdyaWQ7XG4gIGlmIChncmlkRW5hYmxlZCkge1xuICAgIHN3aXBlci5ncmlkLmluaXRTbGlkZXMoc2xpZGVzKTtcbiAgfSBlbHNlIGlmIChzd2lwZXIuZ3JpZCkge1xuICAgIHN3aXBlci5ncmlkLnVuc2V0U2xpZGVzKCk7XG4gIH1cblxuICAvLyBDYWxjIHNsaWRlc1xuICBsZXQgc2xpZGVTaXplO1xuICBjb25zdCBzaG91bGRSZXNldFNsaWRlU2l6ZSA9IHBhcmFtcy5zbGlkZXNQZXJWaWV3ID09PSAnYXV0bycgJiYgcGFyYW1zLmJyZWFrcG9pbnRzICYmIE9iamVjdC5rZXlzKHBhcmFtcy5icmVha3BvaW50cykuZmlsdGVyKGtleSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiBwYXJhbXMuYnJlYWtwb2ludHNba2V5XS5zbGlkZXNQZXJWaWV3ICE9PSAndW5kZWZpbmVkJztcbiAgfSkubGVuZ3RoID4gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbGlkZXNMZW5ndGg7IGkgKz0gMSkge1xuICAgIHNsaWRlU2l6ZSA9IDA7XG4gICAgbGV0IHNsaWRlO1xuICAgIGlmIChzbGlkZXNbaV0pIHNsaWRlID0gc2xpZGVzW2ldO1xuICAgIGlmIChncmlkRW5hYmxlZCkge1xuICAgICAgc3dpcGVyLmdyaWQudXBkYXRlU2xpZGUoaSwgc2xpZGUsIHNsaWRlcyk7XG4gICAgfVxuICAgIGlmIChzbGlkZXNbaV0gJiYgZWxlbWVudFN0eWxlKHNsaWRlLCAnZGlzcGxheScpID09PSAnbm9uZScpIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgICBpZiAocGFyYW1zLnNsaWRlc1BlclZpZXcgPT09ICdhdXRvJykge1xuICAgICAgaWYgKHNob3VsZFJlc2V0U2xpZGVTaXplKSB7XG4gICAgICAgIHNsaWRlc1tpXS5zdHlsZVtzd2lwZXIuZ2V0RGlyZWN0aW9uTGFiZWwoJ3dpZHRoJyldID0gYGA7XG4gICAgICB9XG4gICAgICBjb25zdCBzbGlkZVN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUoc2xpZGUpO1xuICAgICAgY29uc3QgY3VycmVudFRyYW5zZm9ybSA9IHNsaWRlLnN0eWxlLnRyYW5zZm9ybTtcbiAgICAgIGNvbnN0IGN1cnJlbnRXZWJLaXRUcmFuc2Zvcm0gPSBzbGlkZS5zdHlsZS53ZWJraXRUcmFuc2Zvcm07XG4gICAgICBpZiAoY3VycmVudFRyYW5zZm9ybSkge1xuICAgICAgICBzbGlkZS5zdHlsZS50cmFuc2Zvcm0gPSAnbm9uZSc7XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudFdlYktpdFRyYW5zZm9ybSkge1xuICAgICAgICBzbGlkZS5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSAnbm9uZSc7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnJvdW5kTGVuZ3Rocykge1xuICAgICAgICBzbGlkZVNpemUgPSBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyBlbGVtZW50T3V0ZXJTaXplKHNsaWRlLCAnd2lkdGgnLCB0cnVlKSA6IGVsZW1lbnRPdXRlclNpemUoc2xpZGUsICdoZWlnaHQnLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICBjb25zdCB3aWR0aCA9IGdldERpcmVjdGlvblByb3BlcnR5VmFsdWUoc2xpZGVTdHlsZXMsICd3aWR0aCcpO1xuICAgICAgICBjb25zdCBwYWRkaW5nTGVmdCA9IGdldERpcmVjdGlvblByb3BlcnR5VmFsdWUoc2xpZGVTdHlsZXMsICdwYWRkaW5nLWxlZnQnKTtcbiAgICAgICAgY29uc3QgcGFkZGluZ1JpZ2h0ID0gZ2V0RGlyZWN0aW9uUHJvcGVydHlWYWx1ZShzbGlkZVN0eWxlcywgJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICAgY29uc3QgbWFyZ2luTGVmdCA9IGdldERpcmVjdGlvblByb3BlcnR5VmFsdWUoc2xpZGVTdHlsZXMsICdtYXJnaW4tbGVmdCcpO1xuICAgICAgICBjb25zdCBtYXJnaW5SaWdodCA9IGdldERpcmVjdGlvblByb3BlcnR5VmFsdWUoc2xpZGVTdHlsZXMsICdtYXJnaW4tcmlnaHQnKTtcbiAgICAgICAgY29uc3QgYm94U2l6aW5nID0gc2xpZGVTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnYm94LXNpemluZycpO1xuICAgICAgICBpZiAoYm94U2l6aW5nICYmIGJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnKSB7XG4gICAgICAgICAgc2xpZGVTaXplID0gd2lkdGggKyBtYXJnaW5MZWZ0ICsgbWFyZ2luUmlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgY2xpZW50V2lkdGgsXG4gICAgICAgICAgICBvZmZzZXRXaWR0aFxuICAgICAgICAgIH0gPSBzbGlkZTtcbiAgICAgICAgICBzbGlkZVNpemUgPSB3aWR0aCArIHBhZGRpbmdMZWZ0ICsgcGFkZGluZ1JpZ2h0ICsgbWFyZ2luTGVmdCArIG1hcmdpblJpZ2h0ICsgKG9mZnNldFdpZHRoIC0gY2xpZW50V2lkdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudFRyYW5zZm9ybSkge1xuICAgICAgICBzbGlkZS5zdHlsZS50cmFuc2Zvcm0gPSBjdXJyZW50VHJhbnNmb3JtO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRXZWJLaXRUcmFuc2Zvcm0pIHtcbiAgICAgICAgc2xpZGUuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gY3VycmVudFdlYktpdFRyYW5zZm9ybTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMucm91bmRMZW5ndGhzKSBzbGlkZVNpemUgPSBNYXRoLmZsb29yKHNsaWRlU2l6ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNsaWRlU2l6ZSA9IChzd2lwZXJTaXplIC0gKHBhcmFtcy5zbGlkZXNQZXJWaWV3IC0gMSkgKiBzcGFjZUJldHdlZW4pIC8gcGFyYW1zLnNsaWRlc1BlclZpZXc7XG4gICAgICBpZiAocGFyYW1zLnJvdW5kTGVuZ3Rocykgc2xpZGVTaXplID0gTWF0aC5mbG9vcihzbGlkZVNpemUpO1xuICAgICAgaWYgKHNsaWRlc1tpXSkge1xuICAgICAgICBzbGlkZXNbaV0uc3R5bGVbc3dpcGVyLmdldERpcmVjdGlvbkxhYmVsKCd3aWR0aCcpXSA9IGAke3NsaWRlU2l6ZX1weGA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzbGlkZXNbaV0pIHtcbiAgICAgIHNsaWRlc1tpXS5zd2lwZXJTbGlkZVNpemUgPSBzbGlkZVNpemU7XG4gICAgfVxuICAgIHNsaWRlc1NpemVzR3JpZC5wdXNoKHNsaWRlU2l6ZSk7XG4gICAgaWYgKHBhcmFtcy5jZW50ZXJlZFNsaWRlcykge1xuICAgICAgc2xpZGVQb3NpdGlvbiA9IHNsaWRlUG9zaXRpb24gKyBzbGlkZVNpemUgLyAyICsgcHJldlNsaWRlU2l6ZSAvIDIgKyBzcGFjZUJldHdlZW47XG4gICAgICBpZiAocHJldlNsaWRlU2l6ZSA9PT0gMCAmJiBpICE9PSAwKSBzbGlkZVBvc2l0aW9uID0gc2xpZGVQb3NpdGlvbiAtIHN3aXBlclNpemUgLyAyIC0gc3BhY2VCZXR3ZWVuO1xuICAgICAgaWYgKGkgPT09IDApIHNsaWRlUG9zaXRpb24gPSBzbGlkZVBvc2l0aW9uIC0gc3dpcGVyU2l6ZSAvIDIgLSBzcGFjZUJldHdlZW47XG4gICAgICBpZiAoTWF0aC5hYnMoc2xpZGVQb3NpdGlvbikgPCAxIC8gMTAwMCkgc2xpZGVQb3NpdGlvbiA9IDA7XG4gICAgICBpZiAocGFyYW1zLnJvdW5kTGVuZ3Rocykgc2xpZGVQb3NpdGlvbiA9IE1hdGguZmxvb3Ioc2xpZGVQb3NpdGlvbik7XG4gICAgICBpZiAoaW5kZXggJSBwYXJhbXMuc2xpZGVzUGVyR3JvdXAgPT09IDApIHNuYXBHcmlkLnB1c2goc2xpZGVQb3NpdGlvbik7XG4gICAgICBzbGlkZXNHcmlkLnB1c2goc2xpZGVQb3NpdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwYXJhbXMucm91bmRMZW5ndGhzKSBzbGlkZVBvc2l0aW9uID0gTWF0aC5mbG9vcihzbGlkZVBvc2l0aW9uKTtcbiAgICAgIGlmICgoaW5kZXggLSBNYXRoLm1pbihzd2lwZXIucGFyYW1zLnNsaWRlc1Blckdyb3VwU2tpcCwgaW5kZXgpKSAlIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyR3JvdXAgPT09IDApIHNuYXBHcmlkLnB1c2goc2xpZGVQb3NpdGlvbik7XG4gICAgICBzbGlkZXNHcmlkLnB1c2goc2xpZGVQb3NpdGlvbik7XG4gICAgICBzbGlkZVBvc2l0aW9uID0gc2xpZGVQb3NpdGlvbiArIHNsaWRlU2l6ZSArIHNwYWNlQmV0d2VlbjtcbiAgICB9XG4gICAgc3dpcGVyLnZpcnR1YWxTaXplICs9IHNsaWRlU2l6ZSArIHNwYWNlQmV0d2VlbjtcbiAgICBwcmV2U2xpZGVTaXplID0gc2xpZGVTaXplO1xuICAgIGluZGV4ICs9IDE7XG4gIH1cbiAgc3dpcGVyLnZpcnR1YWxTaXplID0gTWF0aC5tYXgoc3dpcGVyLnZpcnR1YWxTaXplLCBzd2lwZXJTaXplKSArIG9mZnNldEFmdGVyO1xuICBpZiAocnRsICYmIHdyb25nUlRMICYmIChwYXJhbXMuZWZmZWN0ID09PSAnc2xpZGUnIHx8IHBhcmFtcy5lZmZlY3QgPT09ICdjb3ZlcmZsb3cnKSkge1xuICAgIHdyYXBwZXJFbC5zdHlsZS53aWR0aCA9IGAke3N3aXBlci52aXJ0dWFsU2l6ZSArIHNwYWNlQmV0d2Vlbn1weGA7XG4gIH1cbiAgaWYgKHBhcmFtcy5zZXRXcmFwcGVyU2l6ZSkge1xuICAgIHdyYXBwZXJFbC5zdHlsZVtzd2lwZXIuZ2V0RGlyZWN0aW9uTGFiZWwoJ3dpZHRoJyldID0gYCR7c3dpcGVyLnZpcnR1YWxTaXplICsgc3BhY2VCZXR3ZWVufXB4YDtcbiAgfVxuICBpZiAoZ3JpZEVuYWJsZWQpIHtcbiAgICBzd2lwZXIuZ3JpZC51cGRhdGVXcmFwcGVyU2l6ZShzbGlkZVNpemUsIHNuYXBHcmlkKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSBsYXN0IGdyaWQgZWxlbWVudHMgZGVwZW5kaW5nIG9uIHdpZHRoXG4gIGlmICghcGFyYW1zLmNlbnRlcmVkU2xpZGVzKSB7XG4gICAgY29uc3QgbmV3U2xpZGVzR3JpZCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc25hcEdyaWQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGxldCBzbGlkZXNHcmlkSXRlbSA9IHNuYXBHcmlkW2ldO1xuICAgICAgaWYgKHBhcmFtcy5yb3VuZExlbmd0aHMpIHNsaWRlc0dyaWRJdGVtID0gTWF0aC5mbG9vcihzbGlkZXNHcmlkSXRlbSk7XG4gICAgICBpZiAoc25hcEdyaWRbaV0gPD0gc3dpcGVyLnZpcnR1YWxTaXplIC0gc3dpcGVyU2l6ZSkge1xuICAgICAgICBuZXdTbGlkZXNHcmlkLnB1c2goc2xpZGVzR3JpZEl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgICBzbmFwR3JpZCA9IG5ld1NsaWRlc0dyaWQ7XG4gICAgaWYgKE1hdGguZmxvb3Ioc3dpcGVyLnZpcnR1YWxTaXplIC0gc3dpcGVyU2l6ZSkgLSBNYXRoLmZsb29yKHNuYXBHcmlkW3NuYXBHcmlkLmxlbmd0aCAtIDFdKSA+IDEpIHtcbiAgICAgIHNuYXBHcmlkLnB1c2goc3dpcGVyLnZpcnR1YWxTaXplIC0gc3dpcGVyU2l6ZSk7XG4gICAgfVxuICB9XG4gIGlmIChpc1ZpcnR1YWwgJiYgcGFyYW1zLmxvb3ApIHtcbiAgICBjb25zdCBzaXplID0gc2xpZGVzU2l6ZXNHcmlkWzBdICsgc3BhY2VCZXR3ZWVuO1xuICAgIGlmIChwYXJhbXMuc2xpZGVzUGVyR3JvdXAgPiAxKSB7XG4gICAgICBjb25zdCBncm91cHMgPSBNYXRoLmNlaWwoKHN3aXBlci52aXJ0dWFsLnNsaWRlc0JlZm9yZSArIHN3aXBlci52aXJ0dWFsLnNsaWRlc0FmdGVyKSAvIHBhcmFtcy5zbGlkZXNQZXJHcm91cCk7XG4gICAgICBjb25zdCBncm91cFNpemUgPSBzaXplICogcGFyYW1zLnNsaWRlc1Blckdyb3VwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cHM7IGkgKz
51960gMSkge1xuICAgICAgICBzbmFwR3JpZC5wdXNoKHNuYXBHcmlkW3NuYXBHcmlkLmxlbmd0aCAtIDFdICsgZ3JvdXBTaXplKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzd2lwZXIudmlydHVhbC5zbGlkZXNCZWZvcmUgKyBzd2lwZXIudmlydHVhbC5zbGlkZXNBZnRlcjsgaSArPSAxKSB7XG4gICAgICBpZiAocGFyYW1zLnNsaWRlc1Blckdyb3VwID09PSAxKSB7XG4gICAgICAgIHNuYXBHcmlkLnB1c2goc25hcEdyaWRbc25hcEdyaWQubGVuZ3RoIC0gMV0gKyBzaXplKTtcbiAgICAgIH1cbiAgICAgIHNsaWRlc0dyaWQucHVzaChzbGlkZXNHcmlkW3NsaWRlc0dyaWQubGVuZ3RoIC0gMV0gKyBzaXplKTtcbiAgICAgIHN3aXBlci52aXJ0dWFsU2l6ZSArPSBzaXplO1xuICAgIH1cbiAgfVxuICBpZiAoc25hcEdyaWQubGVuZ3RoID09PSAwKSBzbmFwR3JpZCA9IFswXTtcbiAgaWYgKHNwYWNlQmV0d2VlbiAhPT0gMCkge1xuICAgIGNvbnN0IGtleSA9IHN3aXBlci5pc0hvcml6b250YWwoKSAmJiBydGwgPyAnbWFyZ2luTGVmdCcgOiBzd2lwZXIuZ2V0RGlyZWN0aW9uTGFiZWwoJ21hcmdpblJpZ2h0Jyk7XG4gICAgc2xpZGVzLmZpbHRlcigoXywgc2xpZGVJbmRleCkgPT4ge1xuICAgICAgaWYgKCFwYXJhbXMuY3NzTW9kZSB8fCBwYXJhbXMubG9vcCkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoc2xpZGVJbmRleCA9PT0gc2xpZGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSkuZm9yRWFjaChzbGlkZUVsID0+IHtcbiAgICAgIHNsaWRlRWwuc3R5bGVba2V5XSA9IGAke3NwYWNlQmV0d2Vlbn1weGA7XG4gICAgfSk7XG4gIH1cbiAgaWYgKHBhcmFtcy5jZW50ZXJlZFNsaWRlcyAmJiBwYXJhbXMuY2VudGVyZWRTbGlkZXNCb3VuZHMpIHtcbiAgICBsZXQgYWxsU2xpZGVzU2l6ZSA9IDA7XG4gICAgc2xpZGVzU2l6ZXNHcmlkLmZvckVhY2goc2xpZGVTaXplVmFsdWUgPT4ge1xuICAgICAgYWxsU2xpZGVzU2l6ZSArPSBzbGlkZVNpemVWYWx1ZSArIChzcGFjZUJldHdlZW4gfHwgMCk7XG4gICAgfSk7XG4gICAgYWxsU2xpZGVzU2l6ZSAtPSBzcGFj
5196ZUJldHdlZW47XG4gICAgY29uc3QgbWF4U25hcCA9IGFsbFNsaWRlc1NpemUgLSBzd2lwZXJTaXplO1xuICAgIHNuYXBHcmlkID0gc25hcEdyaWQubWFwKHNuYXAgPT4ge1xuICAgICAgaWYgKHNuYXAgPD0gMCkgcmV0dXJuIC1vZmZzZXRCZWZvcmU7XG4gICAgICBpZiAoc25hcCA+IG1heFNuYXApIHJldHVybiBtYXhTbmFwICsgb2Zmc2V0QWZ0ZXI7XG4gICAgICByZXR1cm4gc25hcDtcbiAgICB9KTtcbiAgfVxuICBpZiAocGFyYW1zLmNlbnRlckluc3VmZmljaWVudFNsaWRlcykge1xuICAgIGxldCBhbGxTbGlkZXNTaXplID0gMDtcbiAgICBzbGlkZXNTaXplc0dyaWQuZm9yRWFjaChzbGlkZVNpemVWYWx1ZSA9PiB7XG4gICAgICBhbGxTbGlkZXNTaXplICs9IHNsaWRlU2l6ZVZhbHVlICsgKHNwYWNlQmV0d2VlbiB8fCAwKTtcbiAgICB9KTtcbiAgICBhbGxTbGlkZXNTaXplIC09IHNwYWNlQmV0d2VlbjtcbiAgICBpZiAoYWxsU2xpZGVzU2l6ZSA8IHN3aXBlclNpemUpIHtcbiAgICAgIGNvbnN0IGFsbFNsaWRlc09mZnNldCA9IChzd2lwZXJTaXplIC0gYWxsU2xpZGVzU2l6ZSkgLyAyO1xuICAgICAgc25hcEdyaWQuZm9yRWFjaCgoc25hcCwgc25hcEluZGV4KSA9PiB7XG4gICAgICAgIHNuYXBHcmlkW3NuYXBJbmRleF0gPSBzbmFwIC0gYWxsU2xpZGVzT2Zmc2V0O1xuICAgICAgfSk7XG4gICAgICBzbGlkZXNHcmlkLmZvckVhY2goKHNuYXAsIHNuYXBJbmRleCkgPT4ge1xuICAgICAgICBzbGlkZXNHcmlkW3NuYXBJbmRleF0gPSBzbmFwICsgYWxsU2xpZGVzT2Zmc2V0O1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIE9iamVjdC5hc3NpZ24oc3dpcGVyLCB7XG4gICAgc2xpZGVzLFxuICAgIHNuYXBHcmlkLFxuICAgIHNsaWRlc0dyaWQsXG4gICAgc2xpZGVzU2l6ZXNHcmlkXG4gIH0pO1xuICBpZiAocGFyYW1zLmNlbnRlcmVkU2xpZGVzICYmIHBhcmFtcy5jc3NNb2RlICYmICFwYXJhbXMuY2VudGVyZWRTbGlkZXNCb3VuZHMpIHtcbiAgICBzZXRDU1NQcm9wZXJ0eSh3cmFwcGVyRWwsICctLXN3aXBlci1jZW50ZXJlZC1vZmZzZXQtYmVmb3JlJywgYCR7LXNuYXBHcmlkWzBdfXB4YCk7XG4gICAgc2V0Q1NTUHJvcGVydHkod3JhcHBlckVsLCAnLS1zd2lwZXItY2VudGVyZWQtb2Zmc2V0LWFmdGVyJywgYCR7c3dpcGVyLnNpemUgLyAyIC0gc2xpZGVzU2l6ZXNHcmlkW3NsaWRlc1NpemVzR3JpZC5sZW5ndGggLSAxXSAvIDJ9cHhgKTtcbiAgICBjb25zdCBhZGRUb1NuYXBHcmlkID0gLXN3aXBlci5zbmFwR3JpZFswXTtcbiAgICBjb25zdCBhZGRUb1NsaWRlc0dyaWQgPSAtc3dpcGVyLnNsaWRlc0dyaWRbMF07XG4gICAgc3dpcGVyLnNuYXBHcmlkID0gc3dpcGVyLnNuYXBHcmlkLm1hcCh2ID0+IHYgKyBhZGRUb1NuYXBHcmlkKTtcbiAgICBzd2lwZXIuc2xpZGVzR3JpZCA9IHN3aXBlci5zbGlkZXNHcmlkLm1hcCh2ID0+IHYgKyBhZGRUb1NsaWRlc0dyaWQpO1xuICB9XG4gIGlmIChzbGlkZXNMZW5ndGggIT09IHByZXZpb3VzU2xpZGVzTGVuZ3RoKSB7XG4gICAgc3dpcGVyLmVtaXQoJ3NsaWRlc0xlbmd0aENoYW5nZScpO1xuICB9XG4gIGlmIChzbmFwR3JpZC5sZW5ndGggIT09IHByZXZpb3VzU25hcEdyaWRMZW5ndGgpIHtcbiAgICBpZiAoc3dpcGVyLnBhcmFtcy53YXRjaE92ZXJmbG93KSBzd2lwZXIuY2hlY2tPdmVyZmxvdygpO1xuICAgIHN3aXBlci5lbWl0KCdzbmFwR3JpZExlbmd0aENoYW5nZScpO1xuICB9XG4gIGlmIChzbGlkZXNHcmlkLmxlbmd0aCAhPT0gcHJldmlvdXNTbGlkZXNHcmlkTGVuZ3RoKSB7XG4gICAgc3dpcGVyLmVtaXQoJ3NsaWRlc0dyaWRMZW5ndGhDaGFuZ2UnKTtcbiAgfVxuICBpZiAocGFyYW1zLndhdGNoU2xpZGVzUHJvZ3Jlc3MpIHtcbiAgICBzd2lwZXIudXBkYXRlU2xpZGVzT2Zmc2V0KCk7XG4gIH1cbiAgc3dpcGVyLmVtaXQoJ3NsaWRlc1VwZGF0ZWQnKTtcbiAgaWYgKCFpc1ZpcnR1YWwgJiYgIXBhcmFtcy5jc3NNb2RlICYmIChwYXJhbXMuZWZmZWN0ID09PSAnc2xpZGUnIHx8IHBhcmFtcy5lZmZlY3QgPT09ICdmYWRlJykpIHtcbiAgICBjb25zdCBiYWNrRmFjZUhpZGRlbkNsYXNzID0gYCR7cGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3N9YmFja2ZhY2UtaGlkZGVuYDtcbiAgICBjb25zdCBoYXNDbGFzc0JhY2tmYWNlQ2xhc3NBZGRlZCA9IHN3aXBlci5lbC5jbGFzc0xpc3QuY29udGFpbnMoYmFja0ZhY2VIaWRkZW5DbGFzcyk7XG4gICAgaWYgKHNsaWRlc0xlbmd0aCA8PSBwYXJhbXMubWF4QmFja2ZhY2VIaWRkZW5TbGlkZXMpIHtcbiAgICAgIGlmICghaGFzQ2xhc3NCYWNrZmFjZUNsYXNzQWRkZWQpIHN3aXBlci5lbC5jbGFzc0xpc3QuYWRkKGJhY2tGYWNlSGlkZGVuQ2xhc3MpO1xuICAgIH0gZWxzZSBpZiAoaGFzQ2xhc3NCYWNrZmFjZUNsYXNzQWRkZWQpIHtcbiAgICAgIHN3aXBlci5lbC5jbGFzc0xpc3QucmVtb3ZlKGJhY2tGYWNlSGlkZGVuQ2xhc3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVBdXRvSGVpZ2h0KHNwZWVkKSB7XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IGFjdGl2ZVNsaWRlcyA9IFtdO1xuICBjb25zdCBpc1ZpcnR1YWwgPSBzd2lwZXIudmlydHVhbCAmJiBzd2lwZXIucGFyYW1zLnZpcnR1YWwuZW5hYmxlZDtcbiAgbGV0IG5ld0hlaWdodCA9IDA7XG4gIGxldCBpO1xuICBpZiAodHlwZW9mIHNwZWVkID09PSAnbnVtYmVyJykge1xuICAgIHN3aXBlci5zZXRUcmFuc2l0aW9uKHNwZWVkKTtcbiAgfSBlbHNlIGlmIChzcGVlZCA9PT0gdHJ1ZSkge1xuICAgIHN3aXBlci5zZXRUcmFuc2l0aW9uKHN3aXBlci5wYXJhbXMuc3BlZWQpO1xuICB9XG4gIGNvbnN0IGdldFNsaWRlQnlJbmRleCA9IGluZGV4ID0+IHtcbiAgICBpZiAoaXNWaXJ0dWFsKSB7XG4gICAgICByZXR1cm4gc3dpcGVyLnNsaWRlc1tzd2lwZXIuZ2V0U2xpZGVJbmRleEJ5RGF0YShpbmRleCldO1xuICAgIH1cbiAgICByZXR1cm4gc3dpcGVyLnNsaWRlc1tpbmRleF07XG4gIH07XG4gIC8vIEZpbmQgc2xpZGVzIGN1cnJlbnRseSBpbiB2aWV3XG4gIGlmIChzd2lwZXIucGFyYW1zLnNsaWRlc1BlclZpZXcgIT09ICdhdXRvJyAmJiBzd2lwZXIucGFyYW1zLnNsaWRlc1BlclZpZXcgPiAxKSB7XG4gICAgaWYgKHN3aXBlci5wYXJhbXMuY2VudGVyZWRTbGlkZXMpIHtcbiAgICAgIChzd2lwZXIudmlzaWJsZVNsaWRlcyB8fCBbXSkuZm9yRWFjaChzbGlkZSA9PiB7XG4gICAgICAgIGFjdGl2ZVNsaWRlcy5wdXNoKHNsaWRlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgTWF0aC5jZWlsKHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyVmlldyk7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleCArIGk7XG4gICAgICAgIGlmIChpbmRleCA+IHN3aXBlci5zbGlkZXMubGVuZ3RoICYmICFpc1ZpcnR1YWwpIGJyZWFrO1xuICAgICAgICBhY3RpdmVTbGlkZXMucHVzaChnZXRTbGlkZUJ5SW5kZXgoaW5kZXgpKTtcbiAgICAgIH1cbiAgICB9XG4gI
5196H0gZWxzZSB7XG4gICAgYWN0aXZlU2xpZGVzLnB1c2goZ2V0U2xpZGVCeUluZGV4KHN3aXBlci5hY3RpdmVJbmRleCkpO1xuICB9XG5cbiAgLy8gRmluZCBuZXcgaGVpZ2h0IGZyb20gaGlnaGVzdCBzbGlkZSBpbiB2aWV3XG4gIGZvciAoaSA9IDA7IGkgPCBhY3RpdmVTbGlkZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAodHlwZW9mIGFjdGl2ZVNsaWRlc1tpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IGhlaWdodCA9IGFjdGl2ZVNsaWRlc1tpXS5vZmZzZXRIZWlnaHQ7XG4gICAgICBuZXdIZWlnaHQgPSBoZWlnaHQgPiBuZXdIZWlnaHQgPyBoZWlnaHQgOiBuZXdIZWlnaHQ7XG4gICAgfVxuICB9XG5cbiAgLy8gVXBkYXRlIEhlaWdodFxuICBpZiAobmV3SGVpZ2h0IHx8IG5ld0hlaWdodCA9PT0gMCkgc3dpcGVyLndyYXBwZXJFbC5zdHlsZS5oZWlnaHQgPSBgJHtuZXdIZWlnaHR9cHhgO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTbGlkZXNPZmZzZXQoKSB7XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBjb25zdCBtaW51c09mZnNldCA9IHN3aXBlci5pc0VsZW1lbnQgPyBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyBzd2lwZXIud3JhcHBlckVsLm9mZnNldExlZnQgOiBzd2lwZXIud3JhcHBlckVsLm9mZnNldFRvcCA6IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2xpZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgc2xpZGVzW2ldLnN3aXBlclNsaWRlT2Zmc2V0ID0gKHN3aXBlci5pc0hvcml6b250YWwoKSA/IHNsaWRlc1tpXS5vZmZzZXRMZWZ0IDogc2xpZGVzW2ldLm9mZnNldFRvcCkgLSBtaW51c09mZnNldCAtIHN3aXBlci5jc3NPdmVyZmxvd0FkanVzdG1lbnQoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVTbGlkZXNQcm9ncmVzcyh0cmFuc2xhdGUpIHtcbiAgaWYgKHRyYW5zbGF0ZSA9PT0gdm9pZCAwKSB7XG4gICAgdHJhbnNsYXRlID0gdGhpcyAmJiB0aGlzLnRyYW5zbGF0ZSB8fCAwO1xuICB9XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gIGNvbnN0IHtcbiAgICBzbGlkZXMsXG4gICAgcnRsVHJhbnNsYXRlOiBydGwsXG4gICAgc25hcEdyaWRcbiAgfSA9IHN3aXBlcjtcbiAgaWYgKHNsaWRlcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgaWYgKHR5cGVvZiBzbGlkZXNbMF0uc3dpcGVyU2xpZGVPZmZzZXQgPT09ICd1bmRlZmluZWQnKSBzd2lwZXIudXBkYXRlU2xpZGVzT2Zmc2V0KCk7XG4gIGxldCBvZmZzZXRDZW50ZXIgPSAtdHJhbnNsYXRlO1xuICBpZiAocnRsKSBvZmZzZXRDZW50ZXIgPSB0cmFuc2xhdGU7XG5cbiAgLy8gVmlzaWJsZSBTbGlkZXNcbiAgc2xpZGVzLmZvckVhY2goc2xpZGVFbCA9PiB7XG4gICAgc2xpZGVFbC5jbGFzc0xpc3QucmVtb3ZlKHBhcmFtcy5zbGlkZVZpc2libGVDbGFzcywgcGFyYW1zLnNsaWRlRnVsbHlWaXNpYmxlQ2xhc3MpO1xuICB9KTtcbiAgc3dpcGVyLnZpc2libGVTbGlkZXNJbmRleGVzID0gW107XG4gIHN3aXBlci52aXNpYmxlU2xpZGVzID0gW107XG4gIGxldCBzcGFjZUJldHdlZW4gPSBwYXJhbXMuc3BhY2VCZXR3ZWVuO1xuICBpZiAodHlwZW9mIHNwYWNlQmV0d2VlbiA9PT0gJ3N0cmluZycgJiYgc3BhY2VCZXR3ZWVuLmluZGV4T2YoJyUnKSA+PSAwKSB7XG4gICAgc3BhY2VCZXR3ZWVuID0gcGFyc2VGbG9hdChzcGFjZUJldHdlZW4ucmVwbGFjZSgnJScsICcnKSkgLyAxMDAgKiBzd2lwZXIuc2l6ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygc3BhY2VCZXR3ZWVuID09PSAnc3RyaW5nJykge1xuICAgIHNwYWNlQmV0d2VlbiA9IHBhcnNlRmxvYXQoc3BhY2VCZXR3ZWVuKTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHNsaWRlID0gc2xpZGVzW2ldO1xuICAgIGxldCBzbGlkZU9mZnNldCA9IHNsaWRlLnN3aXBlclNsaWRlT2Zmc2V0O1xuICAgIGlmIChwYXJhbXMuY3NzTW9kZSAmJiBwYXJhbXMuY2VudGVyZWRTbGlkZXMpIHtcbiAgICAgIHNsaWRlT2Zmc2V0IC09IHNsaWRlc1swXS5zd2lwZXJTbGlkZU9mZnNldDtcbiAgICB9XG4gICAgY29uc3Qgc2xpZGVQcm9ncmVzcyA9IChvZmZzZXRDZW50ZXIgKyAocGFyYW1zLmNlbnRlcmVkU2xpZGVzID8gc3dpcGVyLm1pblRyYW5zbGF0ZSgpIDogMCkgLSBzbGlkZU9mZnNldCkgLyAoc2xpZGUuc3dpcGVyU2xpZGVTaXplICsgc3BhY2VCZXR3ZWVuKTtcbiAgICBjb25zdCBvcmlnaW5hbFNsaWRlUHJvZ3Jlc3MgPSAob2Zmc2V0Q2VudGVyIC0gc25hcEdyaWRbMF0gKyAocGFyYW1zLmNlbnRlcmVkU2xpZGVzID8gc3dpcGVyLm1pblRyYW5zbGF0ZSgpIDogMCkgLSBzbGlkZU9mZnNldCkgLyAoc2xpZGUuc3dpcGVyU2xpZGVTaXplICsgc3BhY2VCZXR3ZWVuKTtcbiAgICBjb25zdCBzbGlkZUJlZm9yZSA9IC0ob2Zmc2V0Q2VudGVyIC0gc2xpZGVPZmZzZXQpO1xuICAgIGNvbnN0IHNsaWRlQWZ0ZXIgPSBzbGlkZUJlZm9yZSArIHN3aXBlci5zbGlkZXNTaXplc0dyaWRbaV07XG4gICAgY29uc3QgaXNGdWxseVZpc2libGUgPSBzbGlkZUJlZm9yZSA+PSAwICYmIHNsaWRlQmVmb3JlIDw9IHN3aXBlci5zaXplIC0gc3dpcGVyLnNsaWRlc1NpemVzR3JpZFtpXTtcbiAgICBjb25zdCBpc1Zpc2libGUgPSBzbGlkZUJlZm9yZSA+PSAwICYmIHNsaWRlQmVmb3JlIDwgc3dpcGVyLnNpemUgLSAxIHx8IHNsaWRlQWZ0ZXIgPiAxICYmIHNsaWRlQWZ0ZXIgPD0gc3dpcGVyLnNpemUgfHwgc2xpZGVCZWZvcmUgPD0gMCAmJiBzbGlkZUFmdGVyID49IHN3aXBlci5zaXplO1xuICAgIGlmIChpc1Zpc2libGUpIHtcbiAgICAgIHN3aXBlci52aXNpYmxlU2xpZGVzLnB1c2goc2xpZGUpO1xuICAgICAgc3dpcGVyLnZpc2libGVTbGlkZXNJbmRleGVzLnB1c2goaSk7XG4gICAgICBzbGlkZXNbaV0uY2xhc3NMaXN0LmFkZChwYXJhbXMuc2xpZGVWaXNpYmxlQ2xhc3MpO1xuICAgIH1cbiAgICBpZiAoaXNGdWxseVZpc2libGUpIHtcbiAgICAgIHNsaWRlc1tpXS5jbGFzc0xpc3QuYWRkKHBhcmFtcy5zbGlkZUZ1bGx5VmlzaWJsZUNsYXNzKTtcbiAgICB9XG4gICAgc2xpZGUucHJvZ3Jlc3MgPSBydGwgPyAtc2xpZGVQcm9ncmVzcyA6IHNsaWRlUHJvZ3Jlc3M7XG4gICAgc2xpZGUub3JpZ2luYWxQcm9ncmVzcyA9IHJ0bCA/IC1vcmlnaW5hbFNsaWRlUHJvZ3Jlc3MgOiBvcmlnaW5hbFNsaWRlUHJvZ3Jlc3M7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlUHJvZ3Jlc3ModHJhbnNsYXRlKSB7XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGlmICh0eXBlb2YgdHJhbnNsYXRlID09PSAndW5kZWZpbmVkJykge1xuICAgIGNvbnN0IG11bHRpcGxpZXIgPSBzd2lwZXIucnRsVHJhbnNsYXRlID8gLTEgOiAxO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHRyYW5zbGF0ZSA9IHN3aXBlciAmJiBzd2lwZXIudHJhbnNsYXRlICYmIHN3aXBlci50cmFuc2xhdGUgKiBtdWx0aXBsaWVyIHx8IDA7XG4gIH1cbiAgY29uc3QgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgY29uc3QgdHJhbnNsYXRlc0RpZmYgPSBzd2lwZXIubWF4VHJhbnNsYXRlKCkgLSBzd2lwZXIubWluVHJhbnNsYXRlKCk7XG4gIGxldCB7XG4gICAgcHJvZ3Jlc3MsXG4gICAgaXNCZWdpbm5pbmcsXG4gICAgaXNFbmQsXG4gICAgcHJvZ3Jlc3NMb29wXG4gIH0gPSBzd2lwZXI7XG4gIGNvbnN0IHdhc0JlZ2lubmluZyA9IGlzQmVnaW5uaW5nO1xuICBjb25zdCB3YXNFbmQgPSBpc0VuZDtcbiAgaWYgKHRyYW5zbGF0ZXNEaWZmID09PSAwKSB7XG4gICAgcHJvZ3Jlc3MgPSAwO1xuICAgIGlzQmVnaW5uaW5nID0gdHJ1ZTtcbiAgICBpc0VuZCA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcHJvZ3Jlc3MgPSAodHJhbnNsYXRlIC0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpKSAvIHRyYW5zbGF0ZXNEaWZmO1xuICAgIGNvbnN0IGlzQmVnaW5uaW5nUm91bmRlZCA9IE1hdGguYWJzKHRyYW5zbGF0ZSAtIHN3aXBlci5taW5UcmFuc2xhdGUoKSkgPCAxO1xuICAgIGNvbnN0IGlzRW5kUm91bmRlZCA9IE1hdGguYWJzKHRyYW5zbGF0ZSAtIHN3aXBlci5tYXhUcmFuc2xhdGUoKSkgPCAxO1xuICAgIGlzQmVnaW5uaW5nID0gaXNCZWdpbm5pbmdSb3VuZGVkIHx8IHByb2dyZXNzIDw9IDA7XG4gICAgaXNFbmQgPSBpc0VuZFJvdW5kZWQgfHwgcHJvZ3Jlc3MgPj0gMTtcbiAgICBpZiAoaXNCZWdpbm5pbmdSb3VuZGVkKSBwcm9ncmVzcyA9IDA7XG4gICAgaWYgKGlzRW5kUm91bmRlZCkgcHJvZ3Jlc3MgPSAxO1xuICB9XG4gIGlmIChwYXJhbXMubG9vcCkge1xuICAgIGNvbnN0IGZpcnN0U2xpZGVJbmRleCA9IHN3aXBlci5nZXRTbGlkZUluZGV4QnlEYXRhKDApO1xuICAgIGNvbnN0IGxhc3RTbGlkZUluZGV4ID0gc3dpcGVyLmdldFNsaWRlSW5kZXhCeURhdGEoc3dpcGVyLnNsaWRlcy5sZW5ndGggLSAxKTtcbiAgICBjb25zdCBmaXJzdFNsaWRlVHJhbnNsYXRlID0gc3dpcGVyLnNsaWRlc0dyaWRbZmlyc3RTbGlkZUluZGV4XTtcbiAgICBjb25zdCBsYXN0U2xpZGVUcmFuc2xhdGUgPSBzd2lwZXIuc2xpZGVzR3JpZFtsYXN0U2xpZGVJbmRleF07XG4gICAgY29uc3QgdHJhbnNsYXRlTWF4ID0gc3dpcGVyLnNsaWRlc0dyaWRbc3dpcGVyLnNsaWRlc0dyaWQubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgdHJhbnNsYXRlQWJzID0gTWF0aC5hYnModHJhbnNsYXRlKTtcbiAgICBpZiAodHJhbnNsYXRlQWJzID49IGZpcnN0U2xpZGVUcmFuc2xhdGUpIHtcbiAgICAgIHByb2dyZXNzTG9vcCA9ICh0cmFuc2xhdGVBYnMgLSBmaXJzdFNsaWRlVHJhbnNsYXRlKSAvIHRyYW5zbGF0ZU1heDtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZ3Jlc3NMb29wID0gKHRyYW5zbGF0ZUFicyArIHRyYW5zbGF0ZU1heCAtIGxhc3RTbGlkZVRyYW5zbGF0ZSkgLyB0cmFuc2xhdGVNYXg7XG4gICAgfVxuICAgIGlmIChwcm9ncmVzc0xvb3AgPiAxKSBwcm9ncmVzc0xvb3AgLT0gMTtcbiAgfVxuICBPYmplY3QuYXNzaWduKHN3aXBlciwge1xuICAgIHByb2dyZXNzLFxuICAgIHByb2dyZXNzTG9vcCxcbiAgICBpc0JlZ2lubmluZyxcbiAgICBpc0VuZFxuICB9KTtcbiAgaWYgKHBhcmFtcy53YXRjaFNsaWRlc1Byb2dyZXNzIHx8IHBhcmFtcy5jZW50ZXJlZFNsaWRlcyAmJiBwYXJhbXMuYXV0b0hlaWdodCkgc3dpcGVyLnVwZGF0ZVNsaWRlc1Byb2dyZXNzKHRyYW5zbGF0ZSk7XG4gIGlmIChpc0JlZ2lubmluZyAmJiAhd2FzQmVnaW5uaW5nKSB7XG4gICAgc3dpcGVyLmVtaXQoJ3JlYWNoQmVnaW5uaW5nIHRvRWRnZScpO1xuICB9XG4gIGlmIChpc0VuZCAmJiAhd2FzRW5kKSB7XG4gICAgc3dpcGVyLmVtaXQoJ3JlYWNoRW5kIHRvRWRnZScpO1xuICB9XG4gIGlmICh3YXNCZWdpbm5pbmcgJiYgIWlzQmVnaW5uaW5nIHx8IHdhc0VuZCAmJiAhaXNFbmQpIHtcbiAgICBzd2lwZXIuZW1pdCgnZnJvbUVkZ2UnKTtcbiAgfVxuICBzd2lwZXIuZW1pdCgnc
5196HJvZ3Jlc3MnLCBwcm9ncmVzcyk7XG59XG5cbmNvbnN0IHRvZ2dsZVNsaWRlQ2xhc3NlcyA9IChzbGlkZUVsLCBjb25kaXRpb24sIGNsYXNzTmFtZSkgPT4ge1xuICBpZiAoY29uZGl0aW9uICYmICFzbGlkZUVsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSB7XG4gICAgc2xpZGVFbC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gIH0gZWxzZSBpZiAoIWNvbmRpdGlvbiAmJiBzbGlkZUVsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSB7XG4gICAgc2xpZGVFbC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gIH1cbn07XG5mdW5jdGlvbiB1cGRhdGVTbGlkZXNDbGFzc2VzKCkge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBjb25zdCB7XG4gICAgc2xpZGVzLFxuICAgIHBhcmFtcyxcbiAgICBzbGlkZXNFbCxcbiAgICBhY3RpdmVJbmRleFxuICB9ID0gc3dpcGVyO1xuICBjb25zdCBpc1ZpcnR1YWwgPSBzd2lwZXIudmlydHVhbCAmJiBwYXJhbXMudmlydHVhbC5lbmFibGVkO1xuICBjb25zdCBncmlkRW5hYmxlZCA9IHN3aXBlci5ncmlkICYmIHBhcmFtcy5ncmlkICYmIHBhcmFtcy5ncmlkLnJvd3MgPiAxO1xuICBjb25zdCBnZXRGaWx0ZXJlZFNsaWRlID0gc2VsZWN0b3IgPT4ge1xuICAgIHJldHVybiBlbGVtZW50Q2hpbGRyZW4oc2xpZGVzRWwsIGAuJHtwYXJhbXMuc2xpZGVDbGFzc30ke3NlbGVjdG9yfSwgc3dpcGVyLXNsaWRlJHtzZWxlY3Rvcn1gKVswXTtcbiAgfTtcbiAgbGV0IGFjdGl2ZVNsaWRlO1xuICBsZXQgcHJldlNsaWRlO1xuICBsZXQgbmV4dFNsaWRlO1xuICBpZiAoaXNWaXJ0dWFsKSB7XG4gICAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgICBsZXQgc2xpZGVJbmRleCA9IGFjdGl2ZUluZGV4IC0gc3dpcGVyLnZpcnR1YWwuc2xpZGVzQmVmb3JlO1xuICAgICAgaWYgKHNsaWRlSW5kZXggPCAwKSBzbGlkZUluZGV4ID0gc3dpcGVyLnZpcnR1YWwuc2xpZGVzLmxlbmd0aCArIHNsaWRlSW5kZXg7XG4gICAgICBpZiAoc2xpZGVJbmRleCA+PSBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoKSBzbGlkZUluZGV4IC09IHN3aXBlci52aXJ0dWFsLnNsaWRlcy5sZW5ndGg7XG4gICAgICBhY3RpdmVTbGlkZSA9IGdldEZpbHRlcmVkU2xpZGUoYFtkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cIiR7c2xpZGVJbmRleH1cIl1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aXZlU2xpZGUgPSBnZXRGaWx0ZXJlZFNsaWRlKGBbZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XCIke2FjdGl2ZUluZGV4fVwiXWApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZ3JpZEVuYWJsZWQpIHtcbiAgICAgIGFjdGl2ZVNsaWRlID0gc2xpZGVzLmZpbHRlcihzbGlkZUVsID0+IHNsaWRlRWwuY29sdW1uID09PSBhY3RpdmVJbmRleClbMF07XG4gICAgICBuZXh0U2xpZGUgPSBzbGlkZXMuZmlsdGVyKHNsaWRlRWwgPT4gc2xpZGVFbC5jb2x1bW4gPT09IGFjdGl2ZUluZGV4ICsgMSlbMF07XG4gICAgICBwcmV2U2xpZGUgPSBzbGlkZXMuZmlsdGVyKHNsaWRlRWwgPT4gc2xpZGVFbC5jb2x1bW4gPT09IGFjdGl2ZUluZGV4IC0gMSlbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGl2ZVNsaWRlID0gc2xpZGVzW2FjdGl2ZUluZGV4XTtcbiAgICB9XG4gIH1cbiAgaWYgKGFjdGl2ZVNsaWRlKSB7XG4gICAgaWYgKCFncmlkRW5hYmxlZCkge1xuICAgICAgLy8gTmV4dCBTbGlkZVxuICAgICAgbmV4dFNsaWRlID0gZWxlbWVudE5leHRBbGwoYWN0aXZlU2xpZGUsIGAuJHtwYXJhbXMuc2xpZGVDbGFzc30sIHN3aXBlci1zbGlkZWApWzBdO1xuICAgICAgaWYgKHBhcmFtcy5sb29wICYmICFuZXh0U2xpZGUpIHtcbiAgICAgICAgbmV4dFNsaWRlID0gc2xpZGVzWzBdO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmV2IFNsaWRlXG4gICAgICBwcmV2U2xpZGUgPSBlbGVtZW50UHJldkFsbChhY3RpdmVTbGlkZSwgYC4ke3BhcmFtcy5zbGlkZUNsYXNzfSwgc3dpcGVyLXNsaWRlYClbMF07XG4gICAgICBpZiAocGFyYW1zLmxvb3AgJiYgIXByZXZTbGlkZSA9PT0gMCkge1xuICAgICAgICBwcmV2U2xpZGUgPSBzbGlkZXNbc2xpZGVzLmxlbmd0aCAtIDFdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzbGlkZXMuZm9yRWFjaChzbGlkZUVsID0+IHtcbiAgICB0b2dnbGVTbGlkZUNsYXNzZXMoc2xpZGVFbCwgc2xpZGVFbCA9PT0gYWN0aXZlU2xpZGUsIHBhcmFtcy5zbGlkZUFjdGl2ZUNsYXNzKTtcbiAgICB0b2dnbGVTbGlkZUNsYXNzZXMoc2xpZGVFbCwgc2xpZGVFbCA9PT0gbmV4dFNsaWRlLCBwYXJhbXMuc2xpZGVOZXh0Q2xhc3MpO1xuICAgIHRvZ2dsZVNsaWRlQ2xhc3NlcyhzbGlkZUVsLCBzbGlkZUVsID09PSBwcmV2U2xpZGUsIHBhcmFtcy5zbGlkZVByZXZDbGFzcyk7XG4gIH0pO1xuICBzd2lwZXIuZW1pdFNsaWRlc0NsYXNzZXMoKTtcbn1cblxuY29uc3QgcHJvY2Vzc0xhenlQcmVsb2FkZXIgPSAoc3dpcGVyLCBpbWFnZUVsKSA9PiB7XG4gIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci5wYXJhbXMpIHJldHVybjtcbiAgY29uc3Qgc2xpZGVTZWxlY3RvciA9ICgpID0+IHN3aXBlci5pc0VsZW1lbnQgPyBgc3dpcGVyLXNsaWRlYCA6IGAuJHtzd2lwZXIucGFyYW1zLnNsaWRlQ2xhc3N9YDtcbiAgY29uc3Qgc2xpZGVFbCA9IGltYWdlRWwuY2xvc2VzdChzbGlkZVNlbGVjdG9yKCkpO1xuICBpZiAoc2xpZGVFbCkge1xuICAgIGxldCBsYXp5RWwgPSBzbGlkZUVsLnF1ZXJ5U2VsZWN0b3IoYC4ke3N3aXBlci5wYXJhbXMubGF6eVByZWxvYWRlckNsYXNzfWApO1xuICAgIGlmICghbGF6eUVsICYmIHN3aXBlci5pc0VsZW1lbnQpIHtcbiAgICAgIGlmIChzbGlkZUVsLnNoYWRvd1Jvb3QpIHtcbiAgICAgICAgbGF6eUVsID0gc2xpZGVFbC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYC4ke3N3aXBlci5wYXJhbXMubGF6eVByZWxvYWRlckNsYXNzfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaW5pdCBsYXRlclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgIGlmIChzbGlkZUVsLnNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAgIGxhenlFbCA9IHNsaWRlRWwuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGAuJHtzd2lwZXIucGFyYW1zLmxhenlQcmVsb2FkZXJDbGFzc31gKTtcbiAgICAgICAgICAgIGlmIChsYXp5RWwpIGxhenlFbC5yZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgI
5196H0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGF6eUVsKSBsYXp5RWwucmVtb3ZlKCk7XG4gIH1cbn07XG5jb25zdCB1bmxhenkgPSAoc3dpcGVyLCBpbmRleCkgPT4ge1xuICBpZiAoIXN3aXBlci5zbGlkZXNbaW5kZXhdKSByZXR1cm47XG4gIGNvbnN0IGltYWdlRWwgPSBzd2lwZXIuc2xpZGVzW2luZGV4XS5xdWVyeVNlbGVjdG9yKCdbbG9hZGluZz1cImxhenlcIl0nKTtcbiAgaWYgKGltYWdlRWwpIGltYWdlRWwucmVtb3ZlQXR0cmlidXRlKCdsb2FkaW5nJyk7XG59O1xuY29uc3QgcHJlbG9hZCA9IHN3aXBlciA9PiB7XG4gIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci5wYXJhbXMpIHJldHVybjtcbiAgbGV0IGFtb3VudCA9IHN3aXBlci5wYXJhbXMubGF6eVByZWxvYWRQcmV2TmV4dDtcbiAgY29uc3QgbGVuID0gc3dpcGVyLnNsaWRlcy5sZW5ndGg7XG4gIGlmICghbGVuIHx8ICFhbW91bnQgfHwgYW1vdW50IDwgMCkgcmV0dXJuO1xuICBhbW91bnQgPSBNYXRoLm1pbihhbW91bnQsIGxlbik7XG4gIGNvbnN0IHNsaWRlc1BlclZpZXcgPSBzd2lwZXIucGFyYW1zLnNsaWRlc1BlclZpZXcgPT09ICdhdXRvJyA/IHN3aXBlci5zbGlkZXNQZXJWaWV3RHluYW1pYygpIDogTWF0aC5jZWlsKHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyVmlldyk7XG4gIGNvbnN0IGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICBpZiAoc3dpcGVyLnBhcmFtcy5ncmlkICYmIHN3aXBlci5wYXJhbXMuZ3JpZC5yb3dzID4gMSkge1xuICAgIGNvbnN0IGFjdGl2ZUNvbHVtbiA9IGFjdGl2ZUluZGV4O1xuICAgIGNvbnN0IHByZWxvYWRDb2x1bW5zID0gW2FjdGl2ZUNvbHVtbiAtIGFtb3VudF07XG4gICAgcHJlbG9hZENvbHVtbnMucHVzaCguLi5BcnJheS5mcm9tKHtcbiAgICAgIGxlbmd0aDogYW1vdW50XG4gICAgfSkubWFwKChfLCBpKSA9PiB7XG4gICAgICByZXR1cm4gYWN0aXZlQ29sdW1uICsgc2xpZGVzUGVyVmlldyArIGk7XG4gICAgfSkpO1xuICAgIHN3aXBlci5zbGlkZXMuZm9yRWFjaCgoc2xpZGVFbCwgaSkgPT4ge1xuICAgICAgaWYgKHByZWxvYWRDb2x1bW5zLmluY2x1ZGVzKHNsaWRlRWwuY29sdW1uKSkgdW5sYXp5KHN3aXBlciwgaSk7XG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHNsaWRlSW5kZXhMYXN0SW5WaWV3ID0gYWN0aXZlSW5kZXggKyBzbGlkZXNQZXJWaWV3IC0gMTtcbiAgaWYgKHN3aXBlci5wYXJhbXMucmV3aW5kIHx8IHN3aXBlci5wYXJhbXMubG9vcCkge1xuICAgIGZvciAobGV0IGkgPSBhY3RpdmVJbmRleCAtIGFtb3VudDsgaSA8PSBzbGlkZUluZGV4TGFzdEluVmlldyArIGFtb3VudDsgaSArPSAxKSB7XG4gICAgICBjb25zdCByZWFsSW5kZXggPSAoaSAlIGxlbiArIGxlbikgJSBsZW47XG4gICAgICBpZiAocmVhbEluZGV4IDwgYWN0aXZlSW5kZXggfHwgcmVhbEluZGV4ID4gc2xpZGVJbmRleExhc3RJblZpZXcpIHVubGF6eShzd2lwZXIsIHJlYWxJbmRleCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGkgPSBNYXRoLm1heChhY3RpdmVJbmRleCAtIGFtb3VudCwgMCk7IGkgPD0gTWF0aC5taW4oc2xpZGVJbmRleExhc3RJblZpZXcgKyBhbW91bnQsIGxlbiAtIDEpOyBpICs9IDEpIHtcbiAgICAgIGlmIChpICE9PSBhY3RpdmVJbmRleCAmJiAoaSA+IHNsaWRlSW5kZXhMYXN0SW5WaWV3IHx8IGkgPCBhY3RpdmVJbmRleCkpIHtcbiAgICAgICAgdW5sYXp5KHN3aXBlciwgaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBnZXRBY3RpdmVJbmRleEJ5VHJhbnNsYXRlKHN3aXBlcikge1xuICBjb25zdCB7XG4gICAgc2xpZGVzR3JpZCxcbiAgICBwYXJhbXNcbiAgfSA9IHN3aXBlcjtcbiAgY29uc3QgdHJhbnNsYXRlID0gc3dpcGVyLnJ0bFRyYW5zbGF0ZSA/IHN3aXBlci50cmFuc2xhdGUgOiAtc3dpcGVyLnRyYW5zbGF0ZTtcbiAgbGV0IGFjdGl2ZUluZGV4O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNsaWRlc0dyaWQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAodHlwZW9mIHNsaWRlc0dyaWRbaSArIDFdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHRyYW5zbGF0ZSA+PSBzbGlkZXNHcmlkW2ldICYmIHRyYW5zbGF0ZSA8IHNsaWRlc0dyaWRbaSArIDFdIC0gKHNsaWRlc0dyaWRbaSArIDFdIC0gc2xpZGVzR3JpZFtpXSkgLyAyKSB7XG4gICAgICAgIGFjdGl2ZUluZGV4ID0gaTtcbiAgICAgIH0gZWxzZSBpZiAodHJhbnNsYXRlID49IHNsaWRlc0dyaWRbaV0gJiYgdHJhbnNsYXRlIDwgc2xpZGVzR3JpZFtpICsgMV0pIHtcbiAgICAgICAgYWN0aXZlSW5kZXggPSBpICsgMTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRyYW5zbGF0ZSA+PSBzbGlkZXNHcmlkW2ldKSB7XG4gICAgICBhY3RpdmVJbmRleCA9IGk7XG4gICAgfVxuICB9XG4gIC8vIE5vcm1hbGl6ZSBzbGlkZUluZGV4XG4gIGlmIChwYXJhbXMubm9ybWFsaXplU2xpZGVJbmRleCkge1xuICAgIGlmIChhY3RpdmVJbmRleCA8IDAgfHwgdHlwZW9mIGFjdGl2ZUluZGV4ID09PSAndW5kZWZpbmVkJykgYWN0aXZlSW5kZXggPSAwO1xuICB9XG4gIHJldHVybiBhY3RpdmVJbmRleDtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUFjdGl2ZUluZGV4KG5ld0FjdGl2ZUluZGV4KSB7XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IHRyYW5zbGF0ZSA9IHN3aXBlci5ydGxUcmFuc2xhdGUgPyBzd2lwZXIudHJhbnNsYXRlIDogLXN3aXBlci50cmFuc2xhdGU7XG4gIGNvbnN0IHtcbiAgICBzbmFwR3JpZCxcbiAgICBwYXJhbXMsXG4gICAgYWN0aXZlSW5kZXg6IHByZXZpb3VzSW5kZXgsXG4gICAgcmVhbEluZGV4OiBwcmV2aW91c1JlYWxJbmRleCxcbiAgICBzbmFwSW5kZXg6IHByZXZpb3VzU25hcEluZGV4XG4gIH0gPSBzd2lwZXI7XG4gIGxldCBhY3RpdmVJbmRleCA9IG5ld0FjdGl2ZUluZGV4O1xuICBsZXQgc25hcEluZGV4O1xuICBjb25zdCBnZXRWaXJ0dWFsUmVhbEluZGV4ID0gYUluZGV4ID0+IHtcbiAgICBsZXQgcmVhbEluZGV4ID0gYUluZGV4IC0gc3dpcGVyLnZpcnR1YWwuc2xpZGVzQmVmb3JlO1xuICAgIGlmIChyZWFsSW5kZXggPCAwKSB7XG4gICAgICByZWFsSW5kZXggPSBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoICsgcmVhbEluZGV4O1xuICAgIH1cbiAgICBpZiAocmVhbEluZGV4ID49IHN3aXBlci52aXJ0dWFsLnNsaWRlcy5sZW5ndGgpIHtcbiAgICAgIHJlYWxJbmRleCAtPSBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gcmVhbEluZGV4O1xuICB9O1xuICBpZiAodHlwZW9mIGFjdGl2ZUluZGV4ID09PSAndW5kZWZpbmVkJykge1xuICAgIGFjdGl2ZUluZGV4ID0gZ2V0QWN0aXZlSW5kZXhCeVRyYW5zbGF0ZShzd2lwZXIpO1xuICB9XG4gIGlmIChzbmFwR3JpZC5pbmRleE9mKHRyYW5zbGF0ZSkgPj0gMCkge1xuICAgIHNuYXBJbmRleCA9IHNuYXBHcmlkLmluZGV4T2YodHJhbnNsYXRlKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBza2lwID0gTWF0aC5taW4ocGFyYW1zLnNsaWRlc1Blckdyb3VwU2tpcCwgYWN0aXZlSW5kZXgpO1xuICAgIHNuYXBJbmRleCA9IHNraXAgKyBNYXRoLmZsb29yKChhY3RpdmVJbmRleCAtIHNraXApIC8gcGFyYW1zLnNsaWRlc1Blckdyb3VwKTtcbiAgfVxuICBpZiAoc25hcEluZGV4ID49IHNuYXBHcmlkLmxlbmd0aCkgc25hcEluZGV4ID0gc25hcEdyaWQubGVuZ3RoIC0gMTtcbiAgaWYgKGFjdGl2ZUluZGV4ID09PSBwcmV2aW91c0luZGV4ICYmICFzd2lwZXIucGFyYW1zLmxvb3ApIHtcbiAgICBpZiAoc25hcEluZGV4ICE9PSBwcmV2aW91c1NuYXBJbmRleCkge1xuICAgICAgc3dpcGVyLnNuYXBJbmRleCA9IHNuYXBJbmRleDtcbiAgICAgIHN3aXBlci5lbWl0KCdzbmFwSW5kZXhDaGFuZ2UnKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChhY3RpdmVJbmRleCA9PT0gcHJldmlvdXNJbmRleCAmJiBzd2lwZXIucGFyYW1zLmxvb3AgJiYgc3dpcGVyLnZpcnR1YWwgJiYgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLmVuYWJsZWQpIHtcbiAgICBzd2lwZXIucmVhbEluZGV4ID0gZ2V0VmlydHVhbFJlYWxJbmRleChhY3RpdmVJbmRleCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGdyaWRFbmFibGVkID0gc3dpcGVyLmdyaWQgJiYgcGFyYW1zLmdyaWQgJiYgcGFyYW1zLmdyaWQucm93cyA+IDE7XG5cbiAgLy8gR2V0IHJlYWwgaW5kZXhcbiAgbGV0IHJlYWxJbmRleDtcbiAgaWYgKHN3aXBlci52aXJ0dWFsICYmIHBhcmFtcy52aXJ0dWFsLmVuYWJsZWQgJiYgcGFyYW1zLmxvb3ApIHtcbiAgICByZWFsSW5kZXggPSBnZXRWaXJ0dWFsUmVhbEluZGV4KGFjdGl2ZUluZGV4KTtcbiAgfSBlbHNlIGlmIChncmlkRW5hYmxlZCkge1xuICAgIGNvbnN0IGZpcnN0U2xpZGVJbkNvbHVtbiA9IHN3aXBlci5zbGlkZXMuZmlsdGVyKHNsaWRlRWwgPT4gc2xpZGVFbC5jb2x1bW4gPT09IGFjdGl2ZUluZGV4KVswXTtcbiAgICBsZXQgYWN0aXZlU2xpZGVJbmRleCA9IHBhcnNlSW50KGZpcnN0U2xpZGVJbkNvbHVtbi5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JyksIDEwKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKGFjdGl2ZVNsaWRlSW5kZXgpKSB7XG4gICAgICBhY3RpdmVTbGlkZUluZGV4ID0gTWF0aC5tYXgoc3dpcGVyLnNsaWRlcy5pbmRleE9mKGZpcnN0U2xpZGVJbkNvbHVtbiksIDApO1xuICAgIH1cbiAgICByZWFsSW5kZXggPSBNYXRoLmZsb29yKGFjdGl2ZVNsaWRlSW5kZXggLyBwYXJhbXMuZ3JpZC5yb3dzKTtcbiAgfSBlbHNlIGlmIChzd2lwZXIuc2xpZGVzW2FjdGl2ZUluZGV4XSkge1xuICAgIGNvbnN0IHNsaWRlSW5kZXggPSBzd2lwZXIuc2xpZGVzW2FjdGl2ZUluZGV4XS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4Jyk7XG4gICAgaWYgKHNsaWRlSW5kZXgpIHtcbiAgICAgIHJlYWxJbmRleCA9IHBhcnNlSW50KHNsaWRlSW5kZXgsIDEwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVhbEluZGV4ID0gYWN0aXZlSW5kZXg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlYWxJbmRleCA9IGFjdGl2ZUluZGV4O1xuICB9XG4gIE9iamVjdC5hc3NpZ24oc3dpcGVyLCB7XG4gICAgcHJldmlvdXNTbmFwSW5kZXgsXG4gICAgc25hcEluZGV4LFxuICAgIHByZXZpb3VzUmVhbEluZGV4LFxuICAgIHJlYWxJbmRleCxcbiAgICBwcmV2aW91c0luZGV4LFxuICAgIGFjdGl2ZUluZGV4XG4gIH0pO1xuICBpZiAoc3dpcGVyLmluaXRpYWxpemVkKSB7XG4gICAgcHJlbG9hZChzd2lwZXIpO1xuICB9XG4gI
5196HN3aXBlci5lbWl0KCdhY3RpdmVJbmRleENoYW5nZScpO1xuICBzd2lwZXIuZW1pdCgnc25hcEluZGV4Q2hhbmdlJyk7XG4gIGlmIChzd2lwZXIuaW5pdGlhbGl6ZWQgfHwgc3dpcGVyLnBhcmFtcy5ydW5DYWxsYmFja3NPbkluaXQpIHtcbiAgICBpZiAocHJldmlvdXNSZWFsSW5kZXggIT09IHJlYWxJbmRleCkge1xuICAgICAgc3dpcGVyLmVtaXQoJ3JlYWxJbmRleENoYW5nZScpO1xuICAgIH1cbiAgICBzd2lwZXIuZW1pdCgnc2xpZGVDaGFuZ2UnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVDbGlja2VkU2xpZGUoZWwsIHBhdGgpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3QgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgbGV0IHNsaWRlID0gZWwuY2xvc2VzdChgLiR7cGFyYW1zLnNsaWRlQ2xhc3N9LCBzd2lwZXItc2xpZGVgKTtcbiAgaWYgKCFzbGlkZSAmJiBzd2lwZXIuaXNFbGVtZW50ICYmIHBhdGggJiYgcGF0aC5sZW5ndGggPiAxICYmIHBhdGguaW5jbHVkZXMoZWwpKSB7XG4gICAgWy4uLnBhdGguc2xpY2UocGF0aC5pbmRleE9mKGVsKSArIDEsIHBhdGgubGVuZ3RoKV0uZm9yRWFjaChwYXRoRWwgPT4ge1xuICAgICAgaWYgKCFzbGlkZSAmJiBwYXRoRWwubWF0Y2hlcyAmJiBwYXRoRWwubWF0Y2hlcyhgLiR7cGFyYW1zLnNsaWRlQ2xhc3N9LCBzd2lwZXItc2xpZGVgKSkge1xuICAgICAgICBzbGlkZSA9IHBhdGhFbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBsZXQgc2xpZGVGb3VuZCA9IGZhbHNlO1xuICBsZXQgc2xpZGVJbmRleDtcbiAgaWYgKHNsaWRlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzd2lwZXIuc2xpZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAoc3dpcGVyLnNsaWRlc1tpXSA9PT0gc2xpZGUpIHtcbiAgICAgICAgc2xpZGVGb3VuZCA9IHRydWU7XG4gICAgICAgIHNsaWRlSW5kZXggPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHNsaWRlICYmIHNsaWRlRm91bmQpIHtcbiAgICBzd2lwZXIuY2xpY2tlZFNsaWRlID0gc2xpZGU7XG4gICAgaWYgKHN3aXBlci52aXJ0dWFsICYmIHN3aXBlci5wYXJhbXMudmlydHVhbC5lbmFibGVkKSB7XG4gICAgICBzd2lwZXIuY2xpY2tlZEluZGV4ID0gcGFyc2VJbnQoc2xpZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcpLCAxMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXBlci5jbGlja2VkSW5kZXggPSBzbGlkZUluZGV4O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzd2lwZXIuY2xpY2tlZFNsaWRlID0gdW5kZWZpbmVkO1xuICAgIHN3aXBlci5jbGlja2VkSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwYXJhbXMuc2xpZGVUb0NsaWNrZWRTbGlkZSAmJiBzd2lwZXIuY2xpY2tlZEluZGV4ICE9PSB1bmRlZmluZWQgJiYgc3dpcGVyLmNsaWNrZWRJbmRleCAhPT0gc3dpcGVyLmFjdGl2ZUluZGV4KSB7XG4gICAgc3dpcGVyLnNsaWRlVG9DbGlja2VkU2xpZGUoKTtcbiAgfVxufVxuXG52YXIgdXBkYXRlID0ge1xuICB1cGRhdGVTaXplLFxuICB1cGRhdGVTbGlkZXMsXG4gIHVwZGF0ZUF1dG9IZWlnaHQsXG4gIHVwZGF0ZVNsaWRlc09mZnNldCxcbiAgdXBkYXRlU2xpZGVzUHJvZ3Jlc3MsXG4gIHVwZGF0ZVByb2dyZXNzLFxuICB1cGRhdGVTbGlkZXNDbGFzc2VzLFxuICB1cGRhdGVBY3RpdmVJbmRleCxcbiAgdXBkYXRlQ2xpY2tlZFNsaWRlXG59O1xuXG5mdW5jdGlvbiBnZXRTd2lwZXJUcmFuc2xhdGUoYXhpcykge1xuICBpZiAoYXhpcyA9PT0gdm9pZCAwKSB7XG4gICAgYXhpcyA9IHRoaXMuaXNIb3Jpem9udGFsKCkgPyAneCcgOiAneSc7XG4gIH1cbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3Qge1xuICAgIHBhcmFtcyxcbiAgICBydGxUcmFuc2xhdGU6IHJ0bCxcbiAgICB0cmFuc2xhdGUsXG4gICAgd3JhcHBlckVsXG4gIH0gPSBzd2lwZXI7XG4gIGlmIChwYXJhbXMudmlydHVhbFRyYW5zbGF0ZSkge1xuICAgIHJldHVybiBydGwgPyAtdHJhbnNsYXRlIDogdHJhbnNsYXRlO1xuICB9XG4gIGlmIChwYXJhbXMuY3NzTW9kZSkge1xuICAgIHJldHVybiB0cmFuc2xhdGU7XG4gIH1cbiAgbGV0IGN1cnJlbnRUcmFuc2xhdGUgPSBnZXRUcmFuc2xhdGUod3JhcHBlckVsLCBheGlzKTtcbiAgY3VycmVudFRyYW5zbGF0ZSArPSBzd2lwZXIuY3NzT3ZlcmZsb3dBZGp1c3RtZW50KCk7XG4gIGlmIChydGwpIGN1cnJlbnRUcmFuc2xhdGUgPSAtY3VycmVudFRyYW5zbGF0ZTtcbiAgcmV0dXJuIGN1cnJlbnRUcmFuc2xhdGUgfHwgMDtcbn1cblxuZnVuY3Rpb24gc2V0VHJhbnNsYXRlKHRyYW5zbGF0ZSwgYnlDb250cm9sbGVyKSB7XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IHtcbiAgICBydGxUcmFuc2xhdGU6IHJ0bCxcbiAgICBwYXJhbXMsXG4gICAgd3JhcHBlckVsLFxuICAgIHByb2dyZXNzXG4gIH0gPSBzd2lwZXI7XG4gIGxldCB4ID0gMDtcbiAgbGV0IHkgPSAwO1xuICBjb25zdCB6ID0gMDtcbiAgaWYgKHN3aXBlci5pc0hvcml6b250YWwoKSkge1xuICAgIHggPSBydGwgPyAtdHJhbnNsYXRlIDogdHJhbnNsYXRlO1xuICB9IGVsc2Uge1xuICAgIHkgPSB0cmFuc2xhdGU7XG4gIH1cbiAgaWYgKHBhcmFtcy5yb3VuZExlbmd0aHMpIHtcbiAgICB4ID0gTWF0aC5mbG9vcih4KTtcbiAgICB5ID0gTWF0aC5mbG9vcih5KTtcbiAgfVxuICBzd2lwZXIucHJldmlvdXNUcmFuc2xhdGUgPSBzd2lwZXIudHJhbnNsYXRlO1xuICBzd2lwZXIudHJhbnNsYXRlID0gc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8geCA6IHk7XG4gIGlmIChwYXJhbXMuY3NzTW9kZSkge1xuICAgIHdyYXBwZXJFbFtzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAnc2Nyb2xsTGVmdCcgOiAnc2Nyb2xsVG9wJ10gPSBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAteCA6IC15O1xuICB9IGVsc2UgaWYgKCFwYXJhbXMudmlydHVhbFRyYW5zbGF0ZSkge1xuICAgIGlmIChzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgIHggLT0gc3dpcGVyLmNzc092ZXJmbG93QWRqdXN0bWVudCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB5IC09IHN3aXBlci5jc3NPdmVyZmxvd0FkanVzdG1lbnQoKTtcbiAgICB9XG4gICAgd3JhcHBlckVsLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke3h9cHgsICR7eX1weCwgJHt6fXB4KWA7XG4gIH1cblxuICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSBwcm9ncmVzc1xuICBsZXQgbm
5196V3UHJvZ3Jlc3M7XG4gIGNvbnN0IHRyYW5zbGF0ZXNEaWZmID0gc3dpcGVyLm1heFRyYW5zbGF0ZSgpIC0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpO1xuICBpZiAodHJhbnNsYXRlc0RpZmYgPT09IDApIHtcbiAgICBuZXdQcm9ncmVzcyA9IDA7XG4gIH0gZWxzZSB7XG4gICAgbmV3UHJvZ3Jlc3MgPSAodHJhbnNsYXRlIC0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpKSAvIHRyYW5zbGF0ZXNEaWZmO1xuICB9XG4gIGlmIChuZXdQcm9ncmVzcyAhPT0gcHJvZ3Jlc3MpIHtcbiAgICBzd2lwZXIudXBkYXRlUHJvZ3Jlc3ModHJhbnNsYXRlKTtcbiAgfVxuICBzd2lwZXIuZW1pdCgnc2V0VHJhbnNsYXRlJywgc3dpcGVyLnRyYW5zbGF0ZSwgYnlDb250cm9sbGVyKTtcbn1cblxuZnVuY3Rpb24gbWluVHJhbnNsYXRlKCkge1xuICByZXR1cm4gLXRoaXMuc25hcEdyaWRbMF07XG59XG5cbmZ1bmN0aW9uIG1heFRyYW5zbGF0ZSgpIHtcbiAgcmV0dXJuIC10aGlzLnNuYXBHcmlkW3RoaXMuc25hcEdyaWQubGVuZ3RoIC0gMV07XG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZVRvKHRyYW5zbGF0ZSwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgdHJhbnNsYXRlQm91bmRzLCBpbnRlcm5hbCkge1xuICBpZiAodHJhbnNsYXRlID09PSB2b2lkIDApIHtcbiAgICB0cmFuc2xhdGUgPSAwO1xuICB9XG4gIGlmIChzcGVlZCA9PT0gdm9pZCAwKSB7XG4gICAgc3BlZWQgPSB0aGlzLnBhcmFtcy5zcGVlZDtcbiAgfVxuICBpZiAocnVuQ2FsbGJhY2tzID09PSB2b2lkIDApIHtcbiAgICBydW5DYWxsYmFja3MgPSB0cnVlO1xuICB9XG4gIGlmICh0cmFuc2xhdGVCb3VuZHMgPT09IHZvaWQgMCkge1xuICAgIHRyYW5zbGF0ZUJvdW5kcyA9IHRydWU7XG4gIH1cbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3Qge1xuICAgIHBhcmFtcyxcbiAgICB3cmFwcGVyRWxcbiAgfSA9IHN3aXBlcjtcbiAgaWYgKHN3aXBlci5hbmltYXRpbmcgJiYgcGFyYW1zLnByZXZlbnRJbnRlcmFjdGlvbk9uVHJhbnNpdGlvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBtaW5UcmFuc2xhdGUgPSBzd2lwZXIubWluVHJhbnNsYXRlKCk7XG4gIGNvbnN0IG1heFRyYW5zbGF0ZSA9IHN3aXBlci5tYXhUcmFuc2xhdGUoKTtcbiAgbGV0IG5ld1RyYW5zbGF0ZTtcbiAgaWYgKHRyYW5zbGF0ZUJvdW5kcyAmJiB0cmFuc2xhdGUgPiBtaW5UcmFuc2xhdGUpIG5ld1RyYW5zbGF0ZSA9IG1pblRyYW5zbGF0ZTtlbHNlIGlmICh0cmFuc2xhdGVCb3VuZHMgJiYgdHJhbnNsYXRlIDwgbWF4VHJhbnNsYXRlKSBuZXdUcmFuc2xhdGUgPSBtYXhUcmFuc2xhdGU7ZWxzZSBuZXdUcmFuc2xhdGUgPSB0cmFuc2xhdGU7XG5cbiAgLy8gVXBkYXRlIHByb2dyZXNzXG4gIHN3aXBlci51cGRhdGVQcm9ncmVzcyhuZXdUcmFuc2xhdGUpO1xuICBpZiAocGFyYW1zLmNzc01vZGUpIHtcbiAgICBjb25zdCBpc0ggPSBzd2lwZXIuaXNIb3Jpem9udGFsKCk7XG4gICAgaWYgKHNwZWVkID09PSAwKSB7XG4gICAgICB3cmFwcGVyRWxbaXNIID8gJ3Njcm9sbExlZnQnIDogJ3Njcm9sbFRvcCddID0gLW5ld1RyYW5zbGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFzd2lwZXIuc3VwcG9ydC5zbW9vdGhTY3JvbGwpIHtcbiAgICAgICAgYW5pbWF0ZUNTU01vZGVTY3JvbGwoe1xuICAgICAgICAgIHN3aXBlcixcbiAgICAgICAgICB0YXJnZXRQb3NpdGlvbjogLW5ld1RyYW5zbGF0ZSxcbiAgICAgICAgICBzaWRlOiBpc0ggPyAnbGVmdCcgOiAndG9wJ1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICB3cmFwcGVyRWwuc2Nyb2xsVG8oe1xuICAgICAgICBbaXNIID8gJ2xlZnQnIDogJ3RvcCddOiAtbmV3VHJhbnNsYXRlLFxuICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCdcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoc3BlZWQgPT09IDApIHtcbiAgICBzd2lwZXIuc2V0VHJhbnNpdGlvbigwKTtcbiAgICBzd2lwZXIuc2V0VHJhbnNsYXRlKG5ld1RyYW5zbGF0ZSk7XG4gICAgaWYgKHJ1bkNhbGxiYWNrcykge1xuICAgICAgc3dpcGVyLmVtaXQoJ2JlZm9yZVRyYW5zaXRpb25TdGFydCcsIHNwZWVkLCBpbnRlcm5hbCk7XG4gICAgICBzd2lwZXIuZW1pdCgndHJhbnNpdGlvbkVuZCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzd2lwZXIuc2V0VHJhbnNpdGlvbihzcGVlZCk7XG4gICAgc3dpcGVyLnNldFRyYW5zbGF0ZShuZXdUcmFuc2xhdGUpO1xuICAgIGlmIChydW5DYWxsYmFja3MpIHtcbiAgICAgIHN3aXBlci5lbWl0KCdiZWZvcmVUcmFuc2l0aW9uU3RhcnQnLCBzcGVlZCwgaW50ZXJuYWwpO1xuICAgICAgc3dpcGVyLmVtaXQoJ3RyYW5zaXRpb25TdGFydCcpO1xuICAgIH1cbiAgICBpZiAoIXN3aXBlci5hbmltYXRpbmcpIHtcbiAgICAgIHN3aXBlci5hbmltYXRpbmcgPSB0cnVlO1xuICAgICAgaWYgKCFzd2lwZXIub25UcmFuc2xhdGVUb1dyYXBwZXJUcmFuc2l0aW9uRW5kKSB7XG4gICAgICAgIHN3aXBlci5vblRyYW5zbGF0ZVRvV3JhcHBlclRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiB0cmFuc2l0aW9uRW5kKGUpIHtcbiAgICAgICAgICBpZiAoIXN3aXBlciB8fCBzd2lwZXIuZGVzdHJveWVkKSByZXR1cm47XG4gICAgICAgICAgaWYgKGUudGFyZ2V0ICE9PSB0aGlzKSByZXR1cm47XG4gICAgICAgICAgc3dpcGVyLndyYXBwZXJFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgc3dpcGVyLm9uVHJhbnNsYXRlVG9XcmFwcGVyVHJhbnNpdGlvbkVuZCk7XG4gICAgICAgICAgc3dpcGVyLm9uVHJhbnNsYXRlVG9XcmFwcGVyVHJhbnNpdGlvbkVuZCA9IG51bGw7XG4gICAgICAgICAgZGVsZXRlIHN3aXBlci5vblRyYW5zbGF0ZVRvV3JhcHBlclRyYW5zaXRpb25FbmQ7XG4gICAgICAgICAgc3dpcGVyLmFuaW1hdGluZyA9IGZhbHNlO1xuICAgICAgICAgIGlmIChydW5DYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCd0cmFuc2l0aW9uRW5kJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgc3dpcGVyLndyYXBwZXJFbC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgc3dpcGVyLm9uVHJhbnNsYXRlVG9XcmFwcGVyVHJhbnNpdGlvbkVuZCk7XG4gICAgfVxuICB9XG4gI
5196HJldHVybiB0cnVlO1xufVxuXG52YXIgdHJhbnNsYXRlID0ge1xuICBnZXRUcmFuc2xhdGU6IGdldFN3aXBlclRyYW5zbGF0ZSxcbiAgc2V0VHJhbnNsYXRlLFxuICBtaW5UcmFuc2xhdGUsXG4gIG1heFRyYW5zbGF0ZSxcbiAgdHJhbnNsYXRlVG9cbn07XG5cbmZ1bmN0aW9uIHNldFRyYW5zaXRpb24oZHVyYXRpb24sIGJ5Q29udHJvbGxlcikge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBpZiAoIXN3aXBlci5wYXJhbXMuY3NzTW9kZSkge1xuICAgIHN3aXBlci53cmFwcGVyRWwuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gYCR7ZHVyYXRpb259bXNgO1xuICAgIHN3aXBlci53cmFwcGVyRWwuc3R5bGUudHJhbnNpdGlvbkRlbGF5ID0gZHVyYXRpb24gPT09IDAgPyBgMG1zYCA6ICcnO1xuICB9XG4gIHN3aXBlci5lbWl0KCdzZXRUcmFuc2l0aW9uJywgZHVyYXRpb24sIGJ5Q29udHJvbGxlcik7XG59XG5cbmZ1bmN0aW9uIHRyYW5zaXRpb25FbWl0KF9yZWYpIHtcbiAgbGV0IHtcbiAgICBzd2lwZXIsXG4gICAgcnVuQ2FsbGJhY2tzLFxuICAgIGRpcmVjdGlvbixcbiAgICBzdGVwXG4gIH0gPSBfcmVmO1xuICBjb25zdCB7XG4gICAgYWN0aXZlSW5kZXgsXG4gICAgcHJldmlvdXNJbmRleFxuICB9ID0gc3dpcGVyO1xuICBsZXQgZGlyID0gZGlyZWN0aW9uO1xuICBpZiAoIWRpcikge1xuICAgIGlmIChhY3RpdmVJbmRleCA+IHByZXZpb3VzSW5kZXgpIGRpciA9ICduZXh0JztlbHNlIGlmIChhY3RpdmVJbmRleCA8IHByZXZpb3VzSW5kZXgpIGRpciA9ICdwcmV2JztlbHNlIGRpciA9ICdyZXNldCc7XG4gIH1cbiAgc3dpcGVyLmVtaXQoYHRyYW5zaXRpb24ke3N0ZXB9YCk7XG4gIGlmIChydW5DYWxsYmFja3MgJiYgYWN0aXZlSW5kZXggIT09IHByZXZpb3VzSW5kZXgpIHtcbiAgICBpZiAoZGlyID09PSAncmVzZXQnKSB7XG4gICAgICBzd2lwZXIuZW1pdChgc2xpZGVSZXNldFRyYW5zaXRpb24ke3N0ZXB9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXBlci5lbWl0KGBzbGlkZUNoYW5nZVRyYW5zaXRpb24ke3N0ZXB9YCk7XG4gICAgaWYgKGRpciA9PT0gJ25leHQnKSB7XG4gICAgICBzd2lwZXIuZW1pdChgc2xpZGVOZXh0VHJhbnNpdGlvbiR7c3RlcH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpcGVyLmVtaXQoYHNsaWRlUHJldlRyYW5zaXRpb24ke3N0ZXB9YCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRyYW5zaXRpb25TdGFydChydW5DYWxsYmFja3MsIGRpcmVjdGlvbikge1xuICBpZiAocnVuQ2FsbGJhY2tzID09PSB2b2lkIDApIHtcbiAgICBydW5DYWxsYmFja3MgPSB0cnVlO1xuICB9XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXNcbiAgfSA9IHN3aXBlcjtcbiAgaWYgKHBhcmFtcy5jc3NNb2RlKSByZXR1cm47XG4gIGlmIChwYXJhbXMuYXV0b0hlaWdodCkge1xuICAgIHN3aXBlci51cGRhdGVBdXRvSGVpZ2h0KCk7XG4gIH1cbiAgdHJhbnNpdGlvbkVtaXQoe1xuICAgIHN3aXBlcixcbiAgICBydW5DYWxsYmFja3MsXG4gICAgZGlyZWN0aW9uLFxuICAgIHN0ZXA6ICdTdGFydCdcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRyYW5zaXRpb25FbmQocnVuQ2FsbGJhY2tzLCBkaXJlY3Rpb24pIHtcbiAgaWYgKHJ1bkNhbGxiYWNrcyA9PT0gdm9pZCAwKSB7XG4gICAgcnVuQ2FsbGJhY2tzID0gdHJ1ZTtcbiAgfVxuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBjb25zdCB7XG4gICAgcGFyYW1zXG4gIH0gPSBzd2lwZXI7XG4gIHN3aXBlci5hbmltYXRpbmcgPSBmYWxzZTtcbiAgaWYgKHBhcmFtcy5jc3NNb2RlKSByZXR1cm47XG4gIHN3aXBlci5zZXRUcmFuc2l0aW9uKDApO1xuICB0cmFuc2l0aW9uRW1pdCh7XG4gICAgc3dpcGVyLFxuICAgIHJ1bkNhbGxiYWNrcyxcbiAgICBkaXJlY3Rpb24sXG4gICAgc3RlcDogJ0VuZCdcbiAgfSk7XG59XG5cbnZhciB0cmFuc2l0aW9uID0ge1xuICBzZXRUcmFuc2l0aW9uLFxuICB0cmFuc2l0aW9uU3RhcnQsXG4gIHRyYW5zaXRpb25FbmRcbn07XG5cbmZ1bmN0aW9uIHNsaWRlVG8oaW5kZXgsIHNwZWVkLCBydW5DYWxsYmFja3MsIGludGVybmFsLCBpbml0aWFsKSB7XG4gIGlmIChpbmRleCA9PT0gdm9pZCAwKSB7XG4gICAgaW5kZXggPSAwO1xuICB9XG4gIGlmIChydW5DYWxsYmFja3MgPT09IHZvaWQgMCkge1xuICAgIHJ1bkNhbGxiYWNrcyA9IHRydWU7XG4gIH1cbiAgaWYgKHR5cGVvZiBpbmRleCA9PT0gJ3N0cmluZycpIHtcbiAgICBpbmRleCA9IHBhcnNlSW50KGluZGV4LCAxMCk7XG4gIH1cbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgbGV0IHNsaWRlSW5kZXggPSBpbmRleDtcbiAgaWYgKHNsaWRlSW5kZXggPCAwKSBzbGlkZUluZGV4ID0gMDtcbiAgY29uc3Qge1xuICAgIHBhcmFtcyxcbiAgICBzbmFwR3JpZCxcbiAgICBzbGlkZXNHcmlkLFxuICAgIHByZXZpb3VzSW5kZXgsXG4gICAgYWN0aXZlSW5kZXgsXG4gICAgcnRsVHJhbnNsYXRlOiBydGwsXG4gICAgd3JhcHBlckVsLFxuICAgIGVuYWJsZWRcbiAgfSA9IHN3aXBlcjtcbiAgaWYgKCFlbmFibGVkICYmICFpbnRlcm5hbCAmJiAhaW5pdGlhbCB8fCBzd2lwZXIuZGVzdHJveWVkIHx8IHN3aXBlci5hbmltYXRpbmcgJiYgcGFyYW1zLnByZXZlbnRJbnRlcmFjdGlvbk9uVHJhbnNpdGlvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIHNwZWVkID09PSAndW5kZWZpbmVkJykge1xuICAgIHNwZWVkID0gc3dpcGVyLnBhcmFtcy5zcGVlZDtcbiAgfVxuICBjb25zdCBza2lwID0gTWF0aC5taW4oc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJHcm91cFNraXAsIHNsaWRlSW5kZXgpO1xuICBsZXQgc25hcEluZGV4ID0gc2tpcCArIE1hdGguZmxvb3IoKHNsaWRlSW5kZXggLSBza2lwKSAvIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyR3JvdXApO1xuICBpZiAoc25hcEluZGV4ID49IHNuYXBHcmlkLmxlbmd0aCkgc25hcEluZGV4ID0gc25hcEdyaWQubGVuZ3RoIC0gMTtcbiAgY29uc3QgdHJhbnNsYXRlID0gLXNuYXBHcmlkW3NuYXBJbmRleF07XG4gIC8vIE5vcm1hbGl6ZSBzbGlkZUluZGV4XG4gIGlmIChwYXJhbXMubm9ybWFsaXplU2xpZGVJbmRleCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xpZGVzR3JpZC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFRyYW5zbGF0ZSA9IC1NYXRoLmZsb29yKHRyYW5zbGF0ZSAqIDEwMCk7XG4gICAgICBjb25zdCBub3JtYWxpem
5196VkR3JpZCA9IE1hdGguZmxvb3Ioc2xpZGVzR3JpZFtpXSAqIDEwMCk7XG4gICAgICBjb25zdCBub3JtYWxpemVkR3JpZE5leHQgPSBNYXRoLmZsb29yKHNsaWRlc0dyaWRbaSArIDFdICogMTAwKTtcbiAgICAgIGlmICh0eXBlb2Ygc2xpZGVzR3JpZFtpICsgMV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmIChub3JtYWxpemVkVHJhbnNsYXRlID49IG5vcm1hbGl6ZWRHcmlkICYmIG5vcm1hbGl6ZWRUcmFuc2xhdGUgPCBub3JtYWxpemVkR3JpZE5leHQgLSAobm9ybWFsaXplZEdyaWROZXh0IC0gbm9ybWFsaXplZEdyaWQpIC8gMikge1xuICAgICAgICAgIHNsaWRlSW5kZXggPSBpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRUcmFuc2xhdGUgPj0gbm9ybWFsaXplZEdyaWQgJiYgbm9ybWFsaXplZFRyYW5zbGF0ZSA8IG5vcm1hbGl6ZWRHcmlkTmV4dCkge1xuICAgICAgICAgIHNsaWRlSW5kZXggPSBpICsgMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkVHJhbnNsYXRlID49IG5vcm1hbGl6ZWRHcmlkKSB7XG4gICAgICAgIHNsaWRlSW5kZXggPSBpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBEaXJlY3Rpb25zIGxvY2tzXG4gIGlmIChzd2lwZXIuaW5pdGlhbGl6ZWQgJiYgc2xpZGVJbmRleCAhPT0gYWN0aXZlSW5kZXgpIHtcbiAgICBpZiAoIXN3aXBlci5hbGxvd1NsaWRlTmV4dCAmJiAocnRsID8gdHJhbnNsYXRlID4gc3dpcGVyLnRyYW5zbGF0ZSAmJiB0cmFuc2xhdGUgPiBzd2lwZXIubWluVHJhbnNsYXRlKCkgOiB0cmFuc2xhdGUgPCBzd2lwZXIudHJhbnNsYXRlICYmIHRyYW5zbGF0ZSA8IHN3aXBlci5taW5UcmFuc2xhdGUoKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFzd2lwZXIuYWxsb3dTbGlkZVByZXYgJiYgdHJhbnNsYXRlID4gc3dpcGVyLnRyYW5zbGF0ZSAmJiB0cmFuc2xhdGUgPiBzd2lwZXIubWF4VHJhbnNsYXRlKCkpIHtcbiAgICAgIGlmICgoYWN0aXZlSW5kZXggfHwgMCkgIT09IHNsaWRlSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoc2xpZGVJbmRleCAhPT0gKHByZXZpb3VzSW5kZXggfHwgMCkgJiYgcnVuQ2FsbGJhY2tzKSB7XG4gICAgc3dpcGVyLmVtaXQoJ2JlZm9yZVNsaWRlQ2hhbmdlU3RhcnQnKTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBwcm9ncmVzc1xuICBzd2lwZXIudXBkYXRlUHJvZ3Jlc3ModHJhbnNsYXRlKTtcbiAgbGV0IGRpcmVjdGlvbjtcbiAgaWYgKHNsaWRlSW5kZXggPiBhY3RpdmVJbmRleCkgZGlyZWN0aW9uID0gJ25leHQnO2Vsc2UgaWYgKHNsaWRlSW5kZXggPCBhY3RpdmVJbmRleCkgZGlyZWN0aW9uID0gJ3ByZXYnO2Vsc2UgZGlyZWN0aW9uID0gJ3Jlc2V0JztcblxuICAvLyBVcGRhdGUgSW5kZXhcbiAgaWYgKHJ0bCAmJiAtdHJhbnNsYXRlID09PSBzd2lwZXIudHJhbnNsYXRlIHx8ICFydGwgJiYgdHJhbnNsYXRlID09PSBzd2lwZXIudHJhbnNsYXRlKSB7XG4gICAgc3dpcGVyLnVwZGF0ZUFjdGl2ZUluZGV4KHNsaWRlSW5kZXgpO1xuICAgIC8vIFVwZGF0ZSBIZWlnaHRcbiAgICBpZiAocGFyYW1zLmF1dG9IZWlnaHQpIHtcbiAgICAgIHN3aXBlci51cGRhdGVBdXRvSGVpZ2h0KCk7XG4gICAgfVxuICAgIHN3aXBlci51cGRhdGVTbGlkZXNDbGFzc2VzKCk7XG4gICAgaWYgKHBhcmFtcy5lZmZlY3QgIT09ICdzbGlkZScpIHtcbiAgICAgIHN3aXBlci5zZXRUcmFuc2xhdGUodHJhbnNsYXRlKTtcbiAgICB9XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ3Jlc2V0Jykge1xuICAgICAgc3dpcGVyLnRyYW5zaXRpb25TdGFydChydW5DYWxsYmFja3MsIGRpcmVjdGlvbik7XG4gICAgICBzd2lwZXIudHJhbnNpdGlvbkVuZChydW5DYWxsYmFja3MsIGRpcmVjdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAocGFyYW1zLmNzc01vZGUpIHtcbiAgICBjb25zdCBpc0ggPSBzd2lwZXIuaXNIb3Jpem9udGFsKCk7XG4gICAgY29uc3QgdCA9IHJ0bCA/IHRyYW5zbGF0ZSA6IC10cmFuc2xhdGU7XG4gICAgaWYgKHNwZWVkID09PSAwKSB7XG4gICAgICBjb25zdCBpc1ZpcnR1YWwgPSBzd2lwZXIudmlydHVhbCAmJiBzd2lwZXIucGFyYW1zLnZpcnR1YWwuZW5hYmxlZDtcbiAgICAgIGlmIChpc1ZpcnR1YWwpIHtcbiAgICAgICAgc3dpcGVyLndyYXBwZXJFbC5zdHlsZS5zY3JvbGxTbmFwVHlwZSA9ICdub25lJztcbiAgICAgICAgc3dpcGVyLl9pbW1lZGlhdGVWaXJ0dWFsID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1ZpcnR1YWwgJiYgIXN3aXBlci5fY3NzTW9kZVZpcnR1YWxJbml0aWFsU2V0ICYmIHN3aXBlci5wYXJhbXMuaW5pdGlhbFNsaWRlID4gMCkge1xuICAgICAgICBzd2lwZXIuX2Nzc01vZGVWaXJ0dWFsSW5pdGlhbFNldCA9IHRydWU7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgd3JhcHBlckVsW2lzSCA/ICdzY3JvbGxMZWZ0JyA6ICdzY3JvbGxUb3AnXSA9IHQ7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd3JhcHBlckVsW2lzSCA/ICdzY3JvbGxMZWZ0JyA6ICdzY3JvbGxUb3AnXSA9IHQ7XG4gICAgICB9XG4gICAgICBpZiAoaXNWaXJ0dWFsKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgc3dpcGVyLndyYXBwZXJFbC5zdHlsZS5zY3JvbGxTbmFwVHlwZSA9ICcnO1xuICAgICAgICAgIHN3aXBlci5faW1tZWRpYXRlVmlydHVhbCA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFzd2lwZXIuc3VwcG9ydC5zbW9vdGhTY3JvbGwpIHtcbiAgICAgICAgYW5pbWF0ZUNTU01vZGVTY3JvbGwoe1xuICAgICAgICAgIHN3aXBlcixcbiAgICAgICAgICB0YXJnZXRQb3NpdGlvbjogdCxcbiAgICAgICAgICBzaWRlOiBpc0ggPyAnbGVmdCcgOiAndG9wJ1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICB3cmFwcGVyRWwuc2Nyb2xsVG8oe1xuICAgICAgICBbaXNIID8gJ2xlZnQnIDogJ3RvcCddOiB0LFxuICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCdcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBzd2lwZXIuc2V0VHJhbnNpdGlvbihzcGVlZCk7XG4gIHN3aXBlci5zZXRUcmFuc2xhdGUodHJhbnNsYXRlKTtcbiAgc3dpcGVyLnVwZGF0ZUFjdGl2ZUluZGV4KHNsaWRlSW5kZXgpO1xuICBzd2lwZXIudXBkYXRlU2xpZGVzQ2xhc3NlcygpO1xuICBzd2lwZXIuZW1pdCgnYmVmb3JlVHJhbnNpdGlvblN0YXJ0Jywgc3BlZWQsIGludGVybmFsKTtcbiAgc3dpcGVyLnRyYW5zaXRpb25TdGFydChydW5DYWxsYmFja3MsIGRpcmVjdGlvbik7XG4gIGlmIChzcGVlZCA9PT0gMCkge1xuICAgIHN3aXBlci50cmFuc2l0aW9uRW5kKHJ1bkNhbGxiYWNrcywgZGlyZWN0aW9uKTtcbiAgfSBlbHNlIGlmICghc3dpcGVyLmFuaW1hdGluZykge1xuICAgIHN3aXBlci5hbmltYXRpbmcgPSB0cnVlO1xuICAgIGlmICghc3dpcGVyLm9uU2xpZGVUb1dyYXBwZXJUcmFuc2l0aW9uRW5kKSB7XG4gICAgICBzd2lwZXIub25TbGlkZVRvV3JhcHBlclRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiB0cmFuc2l0aW9uRW5kKGUpIHtcbiAgICAgICAgaWYgKCFzd2lwZXIgfHwgc3dpcGVyLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgICBpZiAoZS50YXJnZXQgIT09IHRoaXMpIHJldHVybjtcbiAgICAgICAgc3dpcGVyLndyYXBwZXJFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgc3dpcGVyLm9uU2xpZGVUb1dyYXBwZXJUcmFuc2l0aW9uRW5kKTtcbiAgICAgICAgc3dpcGVyLm9uU2xpZGVUb1dyYXBwZXJUcmFuc2l0aW9uRW5kID0gbnVsbDtcbiAgICAgICAgZGVsZXRlIHN3aXBlci5vblNsaWRlVG9XcmFwcGVyVHJhbnNpdGlvbkVuZDtcbiAgICAgICAgc3dpcGVyLnRyYW5zaXRpb25FbmQocnVuQ2FsbGJhY2tzLCBkaXJlY3Rpb24pO1xuICAgICAgfTtcbiAgICB9XG4gICAgc3dpcGVyLndyYXBwZXJFbC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgc3dpcGVyLm9uU2xpZGVUb1dyYXBwZXJUcmFuc2l0aW9uRW5kKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gc2xpZGVUb0xvb3AoaW5kZXgsIHNwZWVkLCBydW5DYWxsYmFja3MsIGludGVybmFsKSB7XG4gIGlmIChpbmRleCA9PT0gdm9pZCAwKSB7XG4gICAgaW5kZXggPSAwO1xuICB9XG4gIGlmIChydW5DYWxsYmFja3MgPT09IHZvaWQgMCkge1xuICAgIHJ1bkNhbGxiYWNrcyA9IHRydWU7XG4gIH1cbiAgaWYgKHR5cGVvZiBpbmRleCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBpbmRleEFzTnVtYmVyID0gcGFyc2VJbnQoaW5kZXgsIDEwKTtcbiAgICBpbmRleCA9IGluZGV4QXNOdW1iZXI7XG4gIH1cbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgaWYgKHN3aXBlci5kZXN0cm95ZWQpIHJldHVybjtcbiAgaWYgKHR5cGVvZiBzcGVlZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzcGVlZCA9IHN3aXBlci5wYXJhbXMuc3BlZWQ7XG4gIH1cbiAgY29uc3QgZ3JpZEVuYWJsZWQgPSBzd2lwZXIuZ3JpZCAmJiBzd2lwZXIucGFyYW1zLmdyaWQgJiYgc3dpcGVyLnBhcmFtcy5ncmlkLnJvd3MgPiAxO1xuICBsZXQgbm
5196V3SW5kZXggPSBpbmRleDtcbiAgaWYgKHN3aXBlci5wYXJhbXMubG9vcCkge1xuICAgIGlmIChzd2lwZXIudmlydHVhbCAmJiBzd2lwZXIucGFyYW1zLnZpcnR1YWwuZW5hYmxlZCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICBuZXdJbmRleCA9IG5ld0luZGV4ICsgc3dpcGVyLnZpcnR1YWwuc2xpZGVzQmVmb3JlO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdGFyZ2V0U2xpZGVJbmRleDtcbiAgICAgIGlmIChncmlkRW5hYmxlZCkge1xuICAgICAgICBjb25zdCBzbGlkZUluZGV4ID0gbmV3SW5kZXggKiBzd2lwZXIucGFyYW1zLmdyaWQucm93cztcbiAgICAgICAgdGFyZ2V0U2xpZGVJbmRleCA9IHN3aXBlci5zbGlkZXMuZmlsdGVyKHNsaWRlRWwgPT4gc2xpZGVFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JykgKiAxID09PSBzbGlkZUluZGV4KVswXS5jb2x1bW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRTbGlkZUluZGV4ID0gc3dpcGVyLmdldFNsaWRlSW5kZXhCeURhdGEobmV3SW5kZXgpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29scyA9IGdyaWRFbmFibGVkID8gTWF0aC5jZWlsKHN3aXBlci5zbGlkZXMubGVuZ3RoIC8gc3dpcGVyLnBhcmFtcy5ncmlkLnJvd3MpIDogc3dpcGVyLnNsaWRlcy5sZW5ndGg7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNlbnRlcmVkU2xpZGVzXG4gICAgICB9ID0gc3dpcGVyLnBhcmFtcztcbiAgICAgIGxldCBzbGlkZXNQZXJWaWV3ID0gc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJWaWV3O1xuICAgICAgaWYgKHNsaWRlc1BlclZpZXcgPT09ICdhdXRvJykge1xuICAgICAgICBzbGlkZXNQZXJWaWV3ID0gc3dpcGVyLnNsaWRlc1BlclZpZXdEeW5hbWljKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbGlkZXNQZXJWaWV3ID0gTWF0aC5jZWlsKHBhcnNlRmxvYXQoc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJWaWV3LCAxMCkpO1xuICAgICAgICBpZiAoY2VudGVyZWRTbGlkZXMgJiYgc2xpZGVzUGVyVmlldyAlIDIgPT09IDApIHtcbiAgICAgICAgICBzbGlkZXNQZXJWaWV3ID0gc2xpZGVzUGVyVmlldyArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCBuZWVkTG9vcEZpeCA9IGNvbHMgLSB0YXJnZXRTbGlkZUluZGV4IDwgc2xpZGVzUGVyVmlldztcbiAgICAgIGlmIChjZW50ZXJlZFNsaWRlcykge1xuICAgICAgICBuZWVkTG9vcEZpeCA9IG5lZWRMb29wRml4IHx8IHRhcmdldFNsaWRlSW5kZXggPCBNYXRoLmNlaWwoc2xpZGVzUGVyVmlldyAvIDIpO1xuICAgICAgfVxuICAgICAgaWYgKGludGVybmFsICYmIGNlbnRlcmVkU2xpZGVzICYmIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyVmlldyAhPT0gJ2F1dG8nICYmICFncmlkRW5hYmxlZCkge1xuICAgICAgICBuZWVkTG9vcEZpeCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKG5lZWRMb29wRml4KSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGNlbnRlcmVkU2xpZGVzID8gdGFyZ2V0U2xpZGVJbmRleCA8IHN3aXBlci5hY3RpdmVJbmRleCA/ICdwcmV2JyA6ICduZXh0JyA6IHRhcmdldFNsaWRlSW5kZXggLSBzd2lwZXIuYWN0aXZlSW5kZXggLSAxIDwgc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJWaWV3ID8gJ25leHQnIDogJ3ByZXYnO1xuICAgICAgICBzd2lwZXIubG9vcEZpeCh7XG4gICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgIHNsaWRlVG86IHRydWUsXG4gICAgICAgICAgYWN0aXZlU2xpZGVJbmRleDogZGlyZWN0aW9uID09PSAnbmV4dCcgPyB0YXJnZXRTbGlkZUluZGV4ICsgMSA6IHRhcmdldFNsaWRlSW5kZXggLSBjb2xzICsgMSxcbiAgICAgICAgICBzbGlkZVJlYWxJbmRleDogZGlyZWN0aW9uID09PSAnbmV4dCcgPyBzd2lwZXIucmVhbEluZGV4IDogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGdyaWRFbmFibGVkKSB7XG4gICAgICAgIGNvbnN0IHNsaWRlSW5kZXggPSBuZXdJbmRleCAqIHN3aXBlci5wYXJhbXMuZ3JpZC5yb3dzO1xuICAgICAgICBuZXdJbmRleCA9IHN3aXBlci5zbGlkZXMuZmlsdGVyKHNsaWRlRWwgPT4gc2xpZGVFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JykgKiAxID09PSBzbGlkZUluZGV4KVswXS5jb2x1bW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdJbmRleCA9IHN3aXBlci5nZXRTbGlkZUluZGV4QnlEYXRhKG5ld0luZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICBzd2lwZXIuc2xpZGVUbyhuZXdJbmRleCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xuICB9KTtcbiAgcmV0dXJuIHN3aXBlcjtcbn1cblxuLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBcIm9mZlwiICovXG5mdW5jdGlvbiBzbGlkZU5leHQoc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpIHtcbiAgaWYgKHJ1bkNhbGxiYWNrcyA9PT0gdm9pZCAwKSB7XG4gICAgcnVuQ2FsbGJhY2tzID0gdHJ1ZTtcbiAgfVxuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBjb25zdCB7XG4gICAgZW5hYmxlZCxcbiAgICBwYXJhbXMsXG4gICAgYW5pbWF0aW5nXG4gIH0gPSBzd2lwZXI7XG4gIGlmICghZW5hYmxlZCB8fCBzd2lwZXIuZGVzdHJveWVkKSByZXR1cm4gc3dpcGVyO1xuICBpZiAodHlwZW9mIHNwZWVkID09PSAndW5kZWZpbmVkJykge1xuICAgIHNwZWVkID0gc3dpcGVyLnBhcmFtcy5zcGVlZDtcbiAgfVxuICBsZXQgcGVyR3JvdXAgPSBwYXJhbXMuc2xpZGVzUGVyR3JvdXA7XG4gIGlmIChwYXJhbXMuc2xpZGVzUGVyVmlldyA9PT0gJ2F1dG8nICYmIHBhcmFtcy5zbGlkZXNQZXJHcm91cCA9PT0gMSAmJiBwYXJhbXMuc2xpZGVzUGVyR3JvdXBBdXRvKSB7XG4gICAgcGVyR3JvdXAgPSBNYXRoLm1heChzd2lwZXIuc2xpZGVzUGVyVmlld0R5bmFtaWMoJ2N1cnJlbnQnLCB0cnVlKSwgMSk7XG4gIH1cbiAgY29uc3QgaW5jcmVtZW50ID0gc3dpcGVyLmFjdGl2ZUluZGV4IDwgcGFyYW1zLnNsaWRlc1Blckdyb3VwU2tpcCA/IDEgOiBwZXJHcm91cDtcbiAgY29uc3QgaXNWaXJ0dWFsID0gc3dpcGVyLnZpcnR1YWwgJiYgcGFyYW1zLnZpcnR1YWwuZW5hYmxlZDtcbiAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgaWYgKGFuaW1hdGluZyAmJiAhaXNWaXJ0dWFsICYmIHBhcmFtcy5sb29wUHJldmVudHNTbGlkaW5nKSByZXR1cm4gZmFsc2U7XG4gICAgc3dpcGVyLmxvb3BGaXgoe1xuICAgICAgZGlyZWN0aW9uOiAnbmV4dCdcbiAgICB9KTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBzd2lwZXIuX2NsaWVudExlZnQgPSBzd2lwZXIud3JhcHBlckVsLmNsaWVudExlZnQ7XG4gICAgaWYgKHN3aXBlci5hY3RpdmVJbmRleCA9PT0gc3dpcGVyLnNsaWRlcy5sZW5ndGggLSAxICYmIHBhcmFtcy5jc3NNb2RlKSB7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIuYWN0aXZlSW5kZXggKyBpbmNyZW1lbnQsIHNwZWVkLCBydW5DYWxsYmFja3MsIGludGVybmFsKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIGlmIChwYXJhbXMucmV3aW5kICYmIHN3aXBlci5pc0VuZCkge1xuICAgIHJldHVybi
5196Bzd2lwZXIuc2xpZGVUbygwLCBzcGVlZCwgcnVuQ2FsbGJhY2tzLCBpbnRlcm5hbCk7XG4gIH1cbiAgcmV0dXJuIHN3aXBlci5zbGlkZVRvKHN3aXBlci5hY3RpdmVJbmRleCArIGluY3JlbWVudCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xufVxuXG4vKiBlc2xpbnQgbm8tdW51c2VkLXZhcnM6IFwib2ZmXCIgKi9cbmZ1bmN0aW9uIHNsaWRlUHJldihzcGVlZCwgcnVuQ2FsbGJhY2tzLCBpbnRlcm5hbCkge1xuICBpZiAocnVuQ2FsbGJhY2tzID09PSB2b2lkIDApIHtcbiAgICBydW5DYWxsYmFja3MgPSB0cnVlO1xuICB9XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXMsXG4gICAgc25hcEdyaWQsXG4gICAgc2xpZGVzR3JpZCxcbiAgICBydGxUcmFuc2xhdGUsXG4gICAgZW5hYmxlZCxcbiAgICBhbmltYXRpbmdcbiAgfSA9IHN3aXBlcjtcbiAgaWYgKCFlbmFibGVkIHx8IHN3aXBlci5kZXN0cm95ZWQpIHJldHVybiBzd2lwZXI7XG4gIGlmICh0eXBlb2Ygc3BlZWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgc3BlZWQgPSBzd2lwZXIucGFyYW1zLnNwZWVkO1xuICB9XG4gIGNvbnN0IGlzVmlydHVhbCA9IHN3aXBlci52aXJ0dWFsICYmIHBhcmFtcy52aXJ0dWFsLmVuYWJsZWQ7XG4gIGlmIChwYXJhbXMubG9vcCkge1xuICAgIGlmIChhbmltYXRpbmcgJiYgIWlzVmlydHVhbCAmJiBwYXJhbXMubG9vcFByZXZlbnRzU2xpZGluZykgcmV0dXJuIGZhbHNlO1xuICAgIHN3aXBlci5sb29wRml4KHtcbiAgICAgIGRpcmVjdGlvbjogJ3ByZXYnXG4gICAgfSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgc3dpcGVyLl9jbGllbnRMZWZ0ID0gc3dpcGVyLndyYXBwZXJFbC5jbGllbnRMZWZ0O1xuICB9XG4gIGNvbnN0IHRyYW5zbGF0ZSA9IHJ0bFRyYW5zbGF0ZSA/IHN3aXBlci50cmFuc2xhdGUgOiAtc3dpcGVyLnRyYW5zbGF0ZTtcbiAgZnVuY3Rpb24gbm9ybWFsaXplKHZhbCkge1xuICAgIGlmICh2YWwgPCAwKSByZXR1cm4gLU1hdGguZmxvb3IoTWF0aC5hYnModmFsKSk7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IodmFsKTtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkVHJhbnNsYXRlID0gbm9ybWFsaXplKHRyYW5zbGF0ZSk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTbmFwR3JpZCA9IHNuYXBHcmlkLm1hcCh2YWwgPT4gbm9ybWFsaXplKHZhbCkpO1xuICBsZXQgcHJldlNuYXAgPSBzbmFwR3JpZFtub3JtYWxpemVkU25hcEdyaWQuaW5kZXhPZihub3JtYWxpemVkVHJhbnNsYXRlKSAtIDFdO1xuICBpZiAodHlwZW9mIHByZXZTbmFwID09PSAndW5kZWZpbmVkJyAmJiBwYXJhbXMuY3NzTW9kZSkge1xuICAgIGxldCBwcmV2U25hcEluZGV4O1xuICAgIHNuYXBHcmlkLmZvckVhY2goKHNuYXAsIHNuYXBJbmRleCkgPT4ge1xuICAgICAgaWYgKG5vcm1hbGl6ZWRUcmFuc2xhdGUgPj0gc25hcCkge1xuICAgICAgICAvLyBwcmV2U25hcCA9IHNuYXA7XG4gICAgICAgIHByZXZTbmFwSW5kZXggPSBzbmFwSW5kZXg7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHR5cGVvZiBwcmV2U25hcEluZGV4ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcHJldlNuYXAgPSBzbmFwR3JpZFtwcmV2U25hcEluZGV4ID4gMCA/IHByZXZTbmFwSW5kZXggLSAxIDogcHJldlNuYXBJbmRleF07XG4gICAgfVxuICB9XG4gIGxldCBwcmV2SW5kZXggPSAwO1xuICBpZiAodHlwZW9mIHByZXZTbmFwICE9PSAndW5kZWZpbmVkJykge1xuICAgIHByZXZJbmRleCA9IHNsaWRlc0dyaWQuaW5kZXhPZihwcmV2U25hcCk7XG4gICAgaWYgKHByZXZJbmRleCA8IDApIHByZXZJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleCAtIDE7XG4gICAgaWYgKHBhcmFtcy5zbGlkZXNQZXJWaWV3ID09PSAnYXV0bycgJiYgcGFyYW1zLnNsaWRlc1Blckdyb3VwID09PSAxICYmIHBhcmFtcy5zbGlkZXNQZXJHcm91cEF1dG8pIHtcbiAgICAgIHByZXZJbmRleCA9IHByZXZJbmRleCAtIHN3aXBlci5zbGlkZXNQZXJWaWV3RHluYW1pYygncHJldmlvdXMnLCB0cnVlKSArIDE7XG4gICAgICBwcmV2SW5kZXggPSBNYXRoLm1heChwcmV2SW5kZXgsIDApO1xuICAgIH1cbiAgfVxuICBpZiAocGFyYW1zLnJld2luZCAmJiBzd2lwZXIuaXNCZWdpbm5pbmcpIHtcbiAgICBjb25zdCBsYXN0SW5kZXggPSBzd2lwZXIucGFyYW1zLnZpcnR1YWwgJiYgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLmVuYWJsZWQgJiYgc3dpcGVyLnZpcnR1YWwgPyBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoIC0gMSA6IHN3aXBlci5zbGlkZXMubGVuZ3RoIC0gMTtcbiAgICByZXR1cm4gc3dpcGVyLnNsaWRlVG8obGFzdEluZGV4LCBzcGVlZCwgcnVuQ2FsbGJhY2tzLCBpbnRlcm5hbCk7XG4gIH0gZWxzZSBpZiAocGFyYW1zLmxvb3AgJiYgc3dpcGVyLmFjdGl2ZUluZGV4ID09PSAwICYmIHBhcmFtcy5jc3NNb2RlKSB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHN3aXBlci5zbGlkZVRvKHByZXZJbmRleCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBzd2lwZXIuc2xpZGVUbyhwcmV2SW5kZXgsIHNwZWVkLCBydW5DYWxsYmFja3MsIGludGVybmFsKTtcbn1cblxuLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBcIm9mZlwiICovXG5mdW5jdGlvbiBzbGlkZVJlc2V0KHNwZWVkLCBydW5DYWxsYmFja3MsIGludGVybmFsKSB7XG4gIGlmIChydW5DYWxsYmFja3MgPT09IHZvaWQgMCkge1xuICAgIHJ1bkNhbGxiYWNrcyA9IHRydWU7XG4gIH1cbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgaWYgKHN3aXBlci5kZXN0cm95ZWQpIHJldHVybjtcbiAgaWYgKHR5cGVvZiBzcGVlZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzcGVlZCA9IHN3aXBlci5wYXJhbXMuc3BlZWQ7XG4gIH1cbiAgcmV0dXJuIHN3aXBlci5zbGlkZVRvKHN3aXBlci5hY3RpdmVJbmRleCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xufVxuXG4vKiBlc2xpbnQgbm8tdW51c2VkLXZhcnM6IFwib2ZmXCIgKi9cbmZ1bmN0aW9uIHNsaWRlVG9DbG9zZXN0KHNwZWVkLCBydW5DYWxsYmFja3MsIGludGVybmFsLCB0aHJlc2hvbGQpIHtcbiAgaWYgKHJ1bkNhbGxiYWNrcyA9PT0gdm9pZCAwKSB7XG4gICAgcnVuQ2FsbGJhY2tzID0gdHJ1ZTtcbiAgfVxuICBpZiAodGhyZXNob2xkID09PSB2b2lkIDApIHtcbiAgICB0aHJlc2hvbGQgPSAwLjU7XG4gIH1cbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgaWYgKHN3aXBlci5kZXN0cm95ZWQpIHJldHVybjtcbiAgaWYgKHR5cGVvZiBzcGVlZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzcGVlZCA9IHN3aXBlci5wYXJhbXMuc3BlZWQ7XG4gIH1cbiAgbGV0IGluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICBjb25zdCBza2lwID0gTWF0aC5taW4oc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJHcm91cFNraXAsIGluZGV4KTtcbiAgY29uc3Qgc25hcEluZGV4ID0gc2tpcCArIE1hdGguZmxvb3IoKGluZGV4IC0gc2tpcCkgLyBzd2lwZXIucGFyYW1zLnNsaWRlc1Blckdyb3VwKTtcbiAgY29uc3QgdHJhbnNsYXRlID0gc3dpcGVyLnJ0bFRyYW5zbGF0ZSA/IHN3aXBlci50cmFuc2xhdGUgOiAtc3dpcGVyLnRyYW5zbGF0ZTtcbiAgaWYgKHRyYW5zbGF0ZSA+PSBzd2lwZXIuc25hcEdyaWRbc25hcEluZGV4XSkge1xuICAgIC8vIFRoZSBjdXJyZW50IHRyYW5zbGF0ZSBpcyBvbiBvciBhZnRlciB0aGUgY3VycmVudCBzbmFwIGluZGV4LCBzbyB0aGUgY2hvaWNlXG4gICAgLy8gaXMgYmV0d2VlbiB0aGUgY3VycmVudCBpbmRleCBhbmQgdGhlIG9uZSBhZnRlciBpdC5cbiAgICBjb25zdCBjdXJyZW50U25hcCA9IHN3aXBlci5zbmFwR3JpZFtzbmFwSW5kZXhdO1xuICAgIGNvbnN0IG5leHRTbmFwID0gc3dpcGVyLnNuYXBHcmlkW3NuYXBJbmRleCArIDFdO1xuICAgIGlmICh0cmFuc2xhdGUgLSBjdXJyZW50U25hcCA+IChuZXh0U25hcCAtIGN1cnJlbnRTbmFwKSAqIHRocmVzaG9sZCkge1xuICAgICAgaW5kZXggKz0gc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJHcm91cDtcbiAgICB9XG4gI
5196H0gZWxzZSB7XG4gICAgLy8gVGhlIGN1cnJlbnQgdHJhbnNsYXRlIGlzIGJlZm9yZSB0aGUgY3VycmVudCBzbmFwIGluZGV4LCBzbyB0aGUgY2hvaWNlXG4gICAgLy8gaXMgYmV0d2VlbiB0aGUgY3VycmVudCBpbmRleCBhbmQgdGhlIG9uZSBiZWZvcmUgaXQuXG4gICAgY29uc3QgcHJldlNuYXAgPSBzd2lwZXIuc25hcEdyaWRbc25hcEluZGV4IC0gMV07XG4gICAgY29uc3QgY3VycmVudFNuYXAgPSBzd2lwZXIuc25hcEdyaWRbc25hcEluZGV4XTtcbiAgICBpZiAodHJhbnNsYXRlIC0gcHJldlNuYXAgPD0gKGN1cnJlbnRTbmFwIC0gcHJldlNuYXApICogdGhyZXNob2xkKSB7XG4gICAgICBpbmRleCAtPSBzd2lwZXIucGFyYW1zLnNsaWRlc1Blckdyb3VwO1xuICAgIH1cbiAgfVxuICBpbmRleCA9IE1hdGgubWF4KGluZGV4LCAwKTtcbiAgaW5kZXggPSBNYXRoLm1pbihpbmRleCwgc3dpcGVyLnNsaWRlc0dyaWQubGVuZ3RoIC0gMSk7XG4gIHJldHVybiBzd2lwZXIuc2xpZGVUbyhpbmRleCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xufVxuXG5mdW5jdGlvbiBzbGlkZVRvQ2xpY2tlZFNsaWRlKCkge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBpZiAoc3dpcGVyLmRlc3Ryb3llZCkgcmV0dXJuO1xuICBjb25zdCB7XG4gICAgcGFyYW1zLFxuICAgIHNsaWRlc0VsXG4gIH0gPSBzd2lwZXI7XG4gIGNvbnN0IHNsaWRlc1BlclZpZXcgPSBwYXJhbXMuc2xpZGVzUGVyVmlldyA9PT0gJ2F1dG8nID8gc3dpcGVyLnNsaWRlc1BlclZpZXdEeW5hbWljKCkgOiBwYXJhbXMuc2xpZGVzUGVyVmlldztcbiAgbGV0IHNsaWRlVG9JbmRleCA9IHN3aXBlci5jbGlja2VkSW5kZXg7XG4gIGxldCByZWFsSW5kZXg7XG4gIGNvbnN0IHNsaWRlU2VsZWN0b3IgPSBzd2lwZXIuaXNFbGVtZW50ID8gYHN3aXBlci1zbGlkZWAgOiBgLiR7cGFyYW1zLnNsaWRlQ2xhc3N9YDtcbiAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgaWYgKHN3aXBlci5hbmltYXRpbmcpIHJldHVybjtcbiAgICByZWFsSW5kZXggPSBwYXJzZUludChzd2lwZXIuY2xpY2tlZFNsaWRlLmdldEF0dHJpYnV0ZSgnZGF0YS1zd2lwZXItc2xpZGUtaW5kZXgnKSwgMTApO1xuICAgIGlmIChwYXJhbXMuY2VudGVyZWRTbGlkZXMpIHtcbiAgICAgIGlmIChzbGlkZVRvSW5kZXggPCBzd2lwZXIubG9vcGVkU2xpZGVzIC0gc2xpZGVzUGVyVmlldyAvIDIgfHwgc2xpZGVUb0luZGV4ID4gc3dpcGVyLnNsaWRlcy5sZW5ndGggLSBzd2lwZXIubG9vcGVkU2xpZGVzICsgc2xpZGVzUGVyVmlldyAvIDIpIHtcbiAgICAgICAgc3dpcGVyLmxvb3BGaXgoKTtcbiAgICAgICAgc2xpZGVUb0luZGV4ID0gc3dpcGVyLmdldFNsaWRlSW5kZXgoZWxlbWVudENoaWxkcmVuKHNsaWRlc0VsLCBgJHtzbGlkZVNlbGVjdG9yfVtkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cIiR7cmVhbEluZGV4fVwiXWApWzBdKTtcbiAgICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHN3aXBlci5zbGlkZVRvKHNsaWRlVG9JbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oc2xpZGVUb0luZGV4KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNsaWRlVG9JbmRleCA+IHN3aXBlci5zbGlkZXMubGVuZ3RoIC0gc2xpZGVzUGVyVmlldykge1xuICAgICAgc3dpcGVyLmxvb3BGaXgoKTtcbiAgICAgIHNsaWRlVG9JbmRleCA9IHN3aXBlci5nZXRTbGlkZUluZGV4KGVsZW1lbnRDaGlsZHJlbihzbGlkZXNFbCwgYCR7c2xpZGVTZWxlY3Rvcn1bZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XCIke3JlYWxJbmRleH1cIl1gKVswXSk7XG4gICAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHN3aXBlci5zbGlkZVRvKHNsaWRlVG9JbmRleCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpcGVyLnNsaWRlVG8oc2xpZGVUb0luZGV4KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3dpcGVyLnNsaWRlVG8oc2xpZGVUb0luZGV4KTtcbiAgfVxufVxuXG52YXIgc2xpZGUgPSB7XG4gIHNsaWRlVG8sXG4gIHNsaWRlVG9Mb29wLFxuICBzbGlkZU5leHQsXG4gIHNsaWRlUHJldixcbiAgc2xpZGVSZXNldCxcbiAgc2xpZGVUb0Nsb3Nlc3QsXG4gIHNsaWRlVG9DbGlja2VkU2xpZGVcbn07XG5cbmZ1bmN0aW9uIGxvb3BDcmVhdGUoc2xpZGVSZWFsSW5kZXgpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3Qge1xuICAgIHBhcmFtcyxcbiAgICBzbGlkZXNFbFxuICB9ID0gc3dpcGVyO1xuICBpZiAoIXBhcmFtcy5sb29wIHx8IHN3aXBlci52aXJ0dWFsICYmIHN3aXBlci5wYXJhbXMudmlydHVhbC5lbmFibGVkKSByZXR1cm47XG4gIGNvbnN0IGluaXRTbGlkZXMgPSAoKSA9PiB7XG4gICAgY29uc3Qgc2xpZGVzID0gZWxlbWVudENoaWxkcmVuKHNsaWRlc0VsLCBgLiR7cGFyYW1zLnNsaWRlQ2xhc3N9LCBzd2lwZXItc2xpZGVgKTtcbiAgICBzbGlkZXMuZm9yRWFjaCgoZWwsIGluZGV4KSA9PiB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JywgaW5kZXgpO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBncmlkRW5hYmxlZCA9IHN3aXBlci5ncmlkICYmIHBhcmFtcy5ncmlkICYmIHBhcmFtcy5ncmlkLnJvd3MgPiAxO1xuICBjb25zdCBzbGlkZXNQZXJHcm91cCA9IHBhcmFtcy5zbGlkZXNQZXJHcm91cCAqIChncmlkRW5hYmxlZCA/IHBhcmFtcy5ncmlkLnJvd3MgOiAxKTtcbiAgY29uc3Qgc2hvdWxkRmlsbEdyb3VwID0gc3dpcGVyLnNsaWRlcy5sZW5ndGggJSBzbGlkZXNQZXJHcm91cCAhPT0gMDtcbiAgY29uc3Qgc2hvdWxkRmlsbEdyaWQgPSBncmlkRW5hYmxlZCAmJiBzd2lwZXIuc2xpZGVzLmxlbmd0aCAlIHBhcmFtcy5ncmlkLnJvd3MgIT09IDA7XG4gIGNvbnN0IGFkZEJsYW5rU2xpZGVzID0gYW1vdW50T2ZTbGlkZXMgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYW1vdW50T2ZTbGlkZXM7IGkgKz0gMSkge1xuICAgICAgY29uc3Qgc2xpZGVFbCA9IHN3aXBlci5pc0VsZW1lbnQgPyBjcmVhdGVFbGVtZW50KCdzd2lwZXItc2xpZGUnLCBbcGFyYW1zLnNsaWRlQmxhbmtDbGFzc10pIDogY3JlYXRlRWxlbWVudCgnZGl2JywgW3BhcmFtcy5zbGlkZUNsYXNzLCBwYXJhbXMuc2xpZGVCbGFua0NsYXNzXSk7XG4gICAgICBzd2lwZXIuc2xpZGVzRWwuYXBwZW5kKHNsaWRlRWwpO1xuICAgIH1cbiAgfTtcbiAgaWYgKHNob3VsZEZpbGxHcm91cCkge1xuICAgIGlmIChwYXJhbXMubG9vcEFkZEJsYW5rU2xpZGVzKSB7XG4gICAgICBjb25zdCBzbGlkZXNUb0FkZCA9IHNsaWRlc1Blckdyb3VwIC0gc3dpcGVyLnNsaWRlcy5sZW5ndGggJSBzbGlkZXNQZXJHcm91cDtcbiAgICAgIGFkZEJsYW5rU2xpZGVzKHNsaWRlc1RvQWRkKTtcbiAgICAgIHN3aXBlci5yZWNhbGNTbGlkZXMoKTtcbiAgICAgIHN3aXBlci51cGRhdGVTbGlkZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd1dhcm5pbmcoJ1N3aXBlciBMb29wIFdhcm5pbmc6IFRoZSBudW1iZXIgb2Ygc2xpZGVzIGlzIG5vdCBldmVuIHRvIHNsaWRlc1Blckdyb3VwLCBsb29wIG1vZGUgbWF5IG5vdCBmdW5jdGlvbiBwcm9wZXJseS4gWW91IG5lZWQgdG8gYWRkIG1vcmUgc2xpZGVzIChvciBtYWtlIGR1cGxpY2F0ZXMsIG9yIGVt
5196cHR5IHNsaWRlcyknKTtcbiAgICB9XG4gICAgaW5pdFNsaWRlcygpO1xuICB9IGVsc2UgaWYgKHNob3VsZEZpbGxHcmlkKSB7XG4gICAgaWYgKHBhcmFtcy5sb29wQWRkQmxhbmtTbGlkZXMpIHtcbiAgICAgIGNvbnN0IHNsaWRlc1RvQWRkID0gcGFyYW1zLmdyaWQucm93cyAtIHN3aXBlci5zbGlkZXMubGVuZ3RoICUgcGFyYW1zLmdyaWQucm93cztcbiAgICAgIGFkZEJsYW5rU2xpZGVzKHNsaWRlc1RvQWRkKTtcbiAgICAgIHN3aXBlci5yZWNhbGNTbGlkZXMoKTtcbiAgICAgIHN3aXBlci51cGRhdGVTbGlkZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd1dhcm5pbmcoJ1N3aXBlciBMb29wIFdhcm5pbmc6IFRoZSBudW1iZXIgb2Ygc2xpZGVzIGlzIG5vdCBldmVuIHRvIGdyaWQucm93cywgbG9vcCBtb2RlIG1heSBub3QgZnVuY3Rpb24gcHJvcGVybHkuIFlvdSBuZWVkIHRvIGFkZCBtb3JlIHNsaWRlcyAob3IgbWFrZSBkdXBsaWNhdGVzLCBvciBlbXB0eSBzbGlkZXMpJyk7XG4gICAgfVxuICAgIGluaXRTbGlkZXMoKTtcbiAgfSBlbHNlIHtcbiAgICBpbml0U2xpZGVzKCk7XG4gIH1cbiAgc3dpcGVyLmxvb3BGaXgoe1xuICAgIHNsaWRlUmVhbEluZGV4LFxuICAgIGRpcmVjdGlvbjogcGFyYW1zLmNlbnRlcmVkU2xpZGVzID8gdW5kZWZpbmVkIDogJ25leHQnXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBsb29wRml4KF90ZW1wKSB7XG4gIGxldCB7XG4gICAgc2xpZGVSZWFsSW5kZXgsXG4gICAgc2xpZGVUbyA9IHRydWUsXG4gICAgZGlyZWN0aW9uLFxuICAgIHNldFRyYW5zbGF0ZSxcbiAgICBhY3RpdmVTbGlkZUluZGV4LFxuICAgIGJ5Q29udHJvbGxlcixcbiAgICBieU1vdXNld2hlZWxcbiAgfSA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wO1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBpZiAoIXN3aXBlci5wYXJhbXMubG9vcCkgcmV0dXJuO1xuICBzd2lwZXIuZW1pdCgnYmVmb3JlTG9vcEZpeCcpO1xuICBjb25zdCB7XG4gICAgc2xpZGVzLFxuICAgIGFsbG93U2xpZGVQcmV2LFxuICAgIGFsbG93U2xpZGVOZXh0LFxuICAgIHNsaWRlc0VsLFxuICAgIHBhcmFtc1xuICB9ID0gc3dpcGVyO1xuICBjb25zdCB7XG4gICAgY2VudGVyZWRTbGlkZXNcbiAgfSA9IHBhcmFtcztcbiAgc3dpcGVyLmFsbG93U2xpZGVQcmV2ID0gdHJ1ZTtcbiAgc3dpcGVyLmFsbG93U2xpZGVOZXh0ID0gdHJ1ZTtcbiAgaWYgKHN3aXBlci52aXJ0dWFsICYmIHBhcmFtcy52aXJ0dWFsLmVuYWJsZWQpIHtcbiAgICBpZiAoc2xpZGVUbykge1xuICAgICAgaWYgKCFwYXJhbXMuY2VudGVyZWRTbGlkZXMgJiYgc3dpcGVyLnNuYXBJbmRleCA9PT0gMCkge1xuICAgICAgICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoLCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHBhcmFtcy5jZW50ZXJlZFNsaWRlcyAmJiBzd2lwZXIuc25hcEluZGV4IDwgcGFyYW1zLnNsaWRlc1BlclZpZXcpIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oc3dpcGVyLnZpcnR1YWwuc2xpZGVzLmxlbmd0aCArIHN3aXBlci5zbmFwSW5kZXgsIDAsIGZhbHNlLCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc3dpcGVyLnNuYXBJbmRleCA9PT0gc3dpcGVyLnNuYXBHcmlkLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oc3dpcGVyLnZpcnR1YWwuc2xpZGVzQmVmb3JlLCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9IGFsbG93U2xpZGVQcmV2O1xuICAgIHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9IGFsbG93U2xpZGVOZXh0O1xuICAgIHN3aXBlci5lbWl0KCdsb29wRml4Jyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBzbGlkZXNQZXJWaWV3ID0gcGFyYW1zLnNsaWRlc1BlclZpZXc7XG4gIGlmIChzbGlkZXNQZXJWaWV3ID09PSAnYXV0bycpIHtcbiAgICBzbGlkZXNQZXJWaWV3ID0gc3dpcGVyLnNsaWRlc1BlclZpZXdEeW5hbWljKCk7XG4gIH0gZWxzZSB7XG4gICAgc2xpZGVzUGVyVmlldyA9IE1hdGguY2VpbChwYXJzZUZsb2F0KHBhcmFtcy5zbGlkZXNQZXJWaWV3LCAxMCkpO1xuICAgIGlmIChjZW50ZXJlZFNsaWRlcyAmJiBzbGlkZXNQZXJWaWV3ICUgMiA9PT0gMCkge1xuICAgICAgc2xpZGVzUGVyVmlldyA9IHNsaWRlc1BlclZpZXcgKyAxO1xuICAgIH1cbiAgfVxuICBjb25zdCBzbGlkZXNQZXJHcm91cCA9IHBhcmFtcy5zbGlkZXNQZXJHcm91cEF1dG8gPyBzbGlkZXNQZXJWaWV3IDogcGFyYW1zLnNsaWRlc1Blckdyb3VwO1xuICBsZXQgbG9vcGVkU2xpZGVzID0gc2xpZGVzUGVyR3JvdXA7XG4gIGlmIChsb29wZWRTbGlkZXMgJSBzbGlkZXNQZXJHcm91cCAhPT0gMCkge1xuICAgIGxvb3BlZFNsaWRlcyArPSBzbGlkZXNQZXJHcm91cCAtIGxvb3BlZFNsaWRlcyAlIHNsaWRlc1Blckdyb3VwO1xuICB9XG4gIGxvb3BlZFNsaWRlcyArPSBwYXJhbXMubG9vcEFkZGl0aW9uYWxTbGlkZXM7XG4gIHN3aXBlci5sb29wZWRTbGlkZXMgPSBsb29wZWRTbGlkZXM7XG4gIGNvbnN0IGdyaWRFbmFibGVkID0gc3dpcGVyLmdyaWQgJiYgcGFyYW1zLmdyaWQgJiYgcGFyYW1zLmdyaWQucm93cyA+IDE7XG4gIGlmIChzbGlkZXMubGVuZ3RoIDwgc2xpZGVzUGVyVmlldyArIGxvb3BlZFNsaWRlcykge1xuICAgIHNob3dXYXJuaW5nKCdTd2lwZXIgTG9vcCBXYXJuaW5nOiBUaGUgbnVtYmVyIG9mIHNsaWRlcyBpcyBub3QgZW5vdWdoIGZvciBsb29wIG1vZGUsIGl0IHdpbGwgYmUgZGlzYWJsZWQgYW5kIG5vdCBmdW5jdGlvbiBwcm9wZXJseS4gWW91IG5lZWQgdG8gYWRkIG1vcmUgc2xpZGVzIChvciBtYWtlIGR1cGxpY2F0ZXMpIG9yIGxvd2VyIHRoZSB2YWx1ZXMgb2Ygc2xpZGVzUGVyVmlldyBhbmQgc2xpZGVzUGVyR3JvdXAgcGFyYW1ldGVycycpO1xuICB9IGVsc2UgaWYgKGdyaWRFbmFibGVkICYmIHBhcmFtcy5ncmlkLmZpbGwgPT09ICdyb3cnKSB7XG4gICAgc2hvd1dhcm5pbmcoJ1N3aXBlciBMb29wIFdhcm5pbmc6IExvb3AgbW9kZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGdyaWQuZmlsbCA9IGByb3dgJyk7XG4gIH1cbiAgY29uc3QgcHJlcGVuZFNsaWRlc0luZGV4ZXMgPSBbXTtcbiAgY29uc3QgYXBwZW5kU2xpZGVzSW5kZX
5196hlcyA9IFtdO1xuICBsZXQgYWN0aXZlSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gIGlmICh0eXBlb2YgYWN0aXZlU2xpZGVJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBhY3RpdmVTbGlkZUluZGV4ID0gc3dpcGVyLmdldFNsaWRlSW5kZXgoc2xpZGVzLmZpbHRlcihlbCA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMocGFyYW1zLnNsaWRlQWN0aXZlQ2xhc3MpKVswXSk7XG4gIH0gZWxzZSB7XG4gICAgYWN0aXZlSW5kZXggPSBhY3RpdmVTbGlkZUluZGV4O1xuICB9XG4gIGNvbnN0IGlzTmV4dCA9IGRpcmVjdGlvbiA9PT0gJ25leHQnIHx8ICFkaXJlY3Rpb247XG4gIGNvbnN0IGlzUHJldiA9IGRpcmVjdGlvbiA9PT0gJ3ByZXYnIHx8ICFkaXJlY3Rpb247XG4gIGxldCBzbGlkZXNQcmVwZW5kZWQgPSAwO1xuICBsZXQgc2xpZGVzQXBwZW5kZWQgPSAwO1xuICBjb25zdCBjb2xzID0gZ3JpZEVuYWJsZWQgPyBNYXRoLmNlaWwoc2xpZGVzLmxlbmd0aCAvIHBhcmFtcy5ncmlkLnJvd3MpIDogc2xpZGVzLmxlbmd0aDtcbiAgY29uc3QgYWN0aXZlQ29sSW5kZXggPSBncmlkRW5hYmxlZCA/IHNsaWRlc1thY3RpdmVTbGlkZUluZGV4XS5jb2x1bW4gOiBhY3RpdmVTbGlkZUluZGV4O1xuICBjb25zdCBhY3RpdmVDb2xJbmRleFdpdGhTaGlmdCA9IGFjdGl2ZUNvbEluZGV4ICsgKGNlbnRlcmVkU2xpZGVzICYmIHR5cGVvZiBzZXRUcmFuc2xhdGUgPT09ICd1bmRlZmluZWQnID8gLXNsaWRlc1BlclZpZXcgLyAyICsgMC41IDogMCk7XG4gIC8vIHByZXBlbmQgbGFzdCBzbGlkZXMgYmVmb3JlIHN0YXJ0XG4gIGlmIChhY3RpdmVDb2xJbmRleFdpdGhTaGlmdCA8IGxvb3BlZFNsaWRlcykge1xuICAgIHNsaWRlc1ByZXBlbmRlZCA9IE1hdGgubWF4KGxvb3BlZFNsaWRlcyAtIGFjdGl2ZUNvbEluZGV4V2l0aFNoaWZ0LCBzbGlkZXNQZXJHcm91cCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29wZWRTbGlkZXMgLSBhY3RpdmVDb2xJbmRleFdpdGhTaGlmdDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGkgLSBNYXRoLmZsb29yKGkgLyBjb2xzKSAqIGNvbHM7XG4gICAgICBpZiAoZ3JpZEVuYWJsZWQpIHtcbiAgICAgICAgY29uc3QgY29sSW5kZXhUb1ByZXBlbmQgPSBjb2xzIC0gaW5kZXggLSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gc2xpZGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICAgICAgaWYgKHNsaWRlc1tpXS5jb2x1bW4gPT09IGNvbEluZGV4VG9QcmVwZW5kKSBwcmVwZW5kU2xpZGVzSW5kZXhlcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNsaWRlcy5mb3JFYWNoKChzbGlkZSwgc2xpZGVJbmRleCkgPT4ge1xuICAgICAgICAvLyAgIGlmIChzbGlkZS5jb2x1bW4gPT09IGNvbEluZGV4VG9QcmVwZW5kKSBwcmVwZW5kU2xpZGVzSW5kZXhlcy5wdXNoKHNsaWRlSW5kZXgpO1xuICAgICAgICAvLyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByZXBlbmRTbGlkZXNJbmRleGVzLnB1c2goY29scyAtIGluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGFjdGl2ZUNvbEluZGV4V2l0aFNoaWZ0ICsgc2xpZGVzUGVyVmlldyA+IGNvbHMgLSBsb29wZWRTbGlkZXMpIHtcbiAgICBzbGlkZXNBcHBlbmRlZCA9IE1hdGgubWF4KGFjdGl2ZUNvbEluZGV4V2l0aFNoaWZ0IC0gKGNvbHMgLSBsb29wZWRTbGlkZXMgKiAyKSwgc2xpZGVzUGVyR3JvdXApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xpZGVzQXBwZW5kZWQ7IGkgKz0gMSkge1xuICAgICAgY29uc3QgaW5kZXggPSBpIC0gTWF0aC5mbG9vcihpIC8gY29scykgKiBjb2xzO1xuICAgICAgaWYgKGdyaWRFbmFibGVkKSB7XG4gICAgICAgIHNsaWRlcy5mb3JFYWNoKChzbGlkZSwgc2xpZGVJbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChzbGlkZS5jb2x1bW4gPT09IGluZGV4KSBhcHBlbmRTbGlkZXNJbmRleGVzLnB1c2goc2xpZGVJbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwZW5kU2xpZGVzSW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc3dpcGVyLl9fcHJldmVudE9ic2VydmVyX18gPSB0cnVlO1xuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgIHN3aXBlci5fX3ByZXZlbnRPYnNlcnZlcl9fID0gZmFsc2U7XG4gIH0pO1xuICBpZiAoaXNQcmV2KSB7XG4gICAgcHJlcGVuZFNsaWRlc0luZGV4ZXMuZm9yRWFjaChpbmRleCA9PiB7XG4gICAgICBzbGlkZXNbaW5kZXhdLnN3aXBlckxvb3BNb3ZlRE9NID0gdHJ1ZTtcbiAgICAgIHNsaWRlc0VsLnByZXBlbmQoc2xpZGVzW2luZGV4XSk7XG4gICAgICBzbGlkZXNbaW5kZXhdLnN3aXBlckxvb3BNb3ZlRE9NID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cbiAgaWYgKGlzTmV4dCkge1xuICAgIGFwcGVuZFNsaWRlc0luZGV4ZXMuZm9yRWFjaChpbmRleCA9PiB7XG4gICAgICBzbGlkZXNbaW5kZXhdLnN3aXBlckxvb3BNb3ZlRE9NID0gdHJ1ZTtcbiAgICAgIHNsaWRlc0VsLmFwcGVuZChzbGlkZXNbaW5kZXhdKTtcbiAgICAgIHNsaWRlc1tpbmRleF0uc3dpcGVyTG9vcE1vdmVET00gPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuICBzd2lwZXIucmVjYWxjU2xpZGVzKCk7XG4gIGlmIChwYXJhbXMuc2xpZGVzUGVyVmlldyA9PT0gJ2F1dG8nKSB7XG4gICAgc3dpcGVyLnVwZGF0ZVNsaWRlcygpO1xuICB9IGVsc2UgaWYgKGdyaWRFbmFibGVkICYmIChwcmVwZW5kU2xpZGVzSW5kZXhlcy5sZW5ndGggPiAwICYmIGlzUHJldiB8fCBhcHBlbmRTbGlkZXNJbmRleGVzLmxlbmd0aCA+IDAgJiYgaXNOZXh0KSkge1xuICAgIHN3aXBlci5zbGlkZXMuZm9yRWFjaCgoc2xpZGUsIHNsaWRlSW5kZXgpID0+IHtcbiAgICAgIHN3aXBlci5ncmlkLnVwZGF0ZVNsaWRlKHNsaWRlSW5kZXgsIHNsaWRlLCBzd2lwZXIuc2xpZGVzKTtcbiAgICB9KTtcbiAgfVxuICBpZiAocGFyYW1zLndhdGNoU2xpZGVzUHJvZ3Jlc3MpIHtcbiAgICBzd2lwZXIudXBkYXRlU2xpZGVzT2Zmc2V0KCk7XG4gIH1cbiAgaWYgKHNsaWRlVG8pIHtcbiAgICBpZiAocHJlcGVuZFNsaWRlc0luZGV4ZXMubGVuZ3RoID4gMCAmJiBpc1ByZXYpIHtcbiAgICAgIGlmICh0eXBlb2Ygc2xpZGVSZWFsSW5kZXggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTbGlkZVRyYW5zbGF0ZSA9IHN3aXBlci5zbGlkZXNHcmlkW2FjdGl2ZUluZGV4XTtcbiAgICAgICAgY29uc3QgbmV3U2xpZGVUcmFuc2xhdGUgPSBzd2lwZXIuc2xpZGVzR3JpZFthY3RpdmVJbmRleCArIHNsaWRlc1ByZXBlbmRlZF07XG4gICAgICAgIGNvbnN0IGRpZmYgPSBuZXdTbGlkZVRyYW5zbGF0ZSAtIGN1cnJlbnRTbGlkZVRyYW5zbGF0ZTtcbiAgICAgICAgaWYgKGJ5TW91c2V3aGVlbCkge1xuICAgICAgICAgI
5196HN3aXBlci5zZXRUcmFuc2xhdGUoc3dpcGVyLnRyYW5zbGF0ZSAtIGRpZmYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXBlci5zbGlkZVRvKGFjdGl2ZUluZGV4ICsgTWF0aC5jZWlsKHNsaWRlc1ByZXBlbmRlZCksIDAsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICBpZiAoc2V0VHJhbnNsYXRlKSB7XG4gICAgICAgICAgICBzd2lwZXIudG91Y2hFdmVudHNEYXRhLnN0YXJ0VHJhbnNsYXRlID0gc3dpcGVyLnRvdWNoRXZlbnRzRGF0YS5zdGFydFRyYW5zbGF0ZSAtIGRpZmY7XG4gICAgICAgICAgICBzd2lwZXIudG91Y2hFdmVudHNEYXRhLmN1cnJlbnRUcmFuc2xhdGUgPSBzd2lwZXIudG91Y2hFdmVudHNEYXRhLmN1cnJlbnRUcmFuc2xhdGUgLSBkaWZmO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNldFRyYW5zbGF0ZSkge1xuICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gZ3JpZEVuYWJsZWQgPyBwcmVwZW5kU2xpZGVzSW5kZXhlcy5sZW5ndGggLyBwYXJhbXMuZ3JpZC5yb3dzIDogcHJlcGVuZFNsaWRlc0luZGV4ZXMubGVuZ3RoO1xuICAgICAgICAgIHN3aXBlci5zbGlkZVRvKHN3aXBlci5hY3RpdmVJbmRleCArIHNoaWZ0LCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgc3dpcGVyLnRvdWNoRXZlbnRzRGF0YS5jdXJyZW50VHJhbnNsYXRlID0gc3dpcGVyLnRyYW5zbGF0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXBwZW5kU2xpZGVzSW5kZXhlcy5sZW5ndGggPiAwICYmIGlzTmV4dCkge1xuICAgICAgaWYgKHR5cGVvZiBzbGlkZVJlYWxJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFNsaWRlVHJhbnNsYXRlID0gc3dpcGVyLnNsaWRlc0dyaWRbYWN0aXZlSW5kZXhdO1xuICAgICAgICBjb25zdCBuZXdTbGlkZVRyYW5zbGF0ZSA9IHN3aXBlci5zbGlkZXNHcmlkW2FjdGl2ZUluZGV4IC0gc2xpZGVzQXBwZW5kZWRdO1xuICAgICAgICBjb25zdCBkaWZmID0gbmV3U2xpZGVUcmFuc2xhdGUgLSBjdXJyZW50U2xpZGVUcmFuc2xhdGU7XG4gICAgICAgIGlmIChieU1vdXNld2hlZWwpIHtcbiAgICAgICAgICBzd2lwZXIuc2V0VHJhbnNsYXRlKHN3aXBlci50cmFuc2xhdGUgLSBkaWZmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2lwZXIuc2xpZGVUbyhhY3RpdmVJbmRleCAtIHNsaWRlc0FwcGVuZGVkLCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgaWYgKHNldFRyYW5zbGF0ZSkge1xuICAgICAgICAgICAgc3dpcGVyLnRvdWNoRXZlbnRzRGF0YS5zdGFydFRyYW5zbGF0ZSA9IHN3aXBlci50b3VjaEV2ZW50c0RhdGEuc3RhcnRUcmFuc2xhdGUgLSBkaWZmO1xuICAgICAgICAgICAgc3dpcGVyLnRvdWNoRXZlbnRzRGF0YS5jdXJyZW50VHJhbnNsYXRlID0gc3dpcGVyLnRvdWNoRXZlbnRzRGF0YS5jdXJyZW50VHJhbnNsYXRlIC0gZGlmZjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNoaWZ0ID0gZ3JpZEVuYWJsZWQgPyBhcHBlbmRTbGlkZXNJbmRleGVzLmxlbmd0aCAvIHBhcmFtcy5ncmlkLnJvd3MgOiBhcHBlbmRTbGlkZXNJbmRleGVzLmxlbmd0aDtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oc3dpcGVyLmFjdGl2ZUluZGV4IC0gc2hpZnQsIDAsIGZhbHNlLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc3dpcGVyLmFsbG93U2xpZGVQcmV2ID0gYWxsb3dTbGlkZVByZXY7XG4gIHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9IGFsbG93U2xpZGVOZXh0O1xuICBpZiAoc3dpcGVyLmNvbnRyb2xsZXIgJiYgc3dpcGVyLmNvbnRyb2xsZXIuY29udHJvbCAmJiAhYnlDb250cm9sbGVyKSB7XG4gICAgY29uc3QgbG9vcFBhcmFtcyA9IHtcbiAgICAgIHNsaWRlUmVhbEluZGV4LFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgc2V0VHJhbnNsYXRlLFxuICAgICAgYWN0aXZlU2xpZGVJbmRleCxcbiAgICAgIGJ5Q29udHJvbGxlcjogdHJ1ZVxuICAgIH07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3dpcGVyLmNvbnRyb2xsZXIuY29udHJvbCkpIHtcbiAgICAgIHN3aXBlci5jb250cm9sbGVyLmNvbnRyb2wuZm9yRWFjaChjID0+IHtcbiAgICAgICAgaWYgKCFjLmRlc3Ryb3llZCAmJiBjLnBhcmFtcy5sb29wKSBjLmxvb3BGaXgoe1xuICAgICAgICAgIC4uLmxvb3BQYXJhbXMsXG4gICAgICAgICAgc2xpZGVUbzogYy5wYXJhbXMuc2xpZGVzUGVyVmlldyA9PT0gcGFyYW1zLnNsaWRlc1BlclZpZXcgPyBzbGlkZVRvIDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHN3aXBlci5jb250cm9sbGVyLmNvbnRyb2wgaW5zdGFuY2VvZiBzd2lwZXIuY29uc3RydWN0b3IgJiYgc3dpcGVyLmNvbnRyb2xsZXIuY29udHJvbC5wYXJhbXMubG9vcCkge1xuICAgICAgc3dpcGVyLmNvbnRyb2xsZXIuY29udHJvbC5sb29wRml4KHtcbiAgICAgICAgLi4ubG9vcFBhcmFtcyxcbiAgICAgICAgc2xpZGVUbzogc3dpcGVyLmNvbnRyb2xsZXIuY29udHJvbC5wYXJhbXMuc2xpZGVzUGVyVmlldyA9PT0gcGFyYW1zLnNsaWRlc1BlclZpZXcgPyBzbGlkZVRvIDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBzd2lwZXIuZW1pdCgnbG9vcEZpeCcpO1xufVxuXG5mdW5jdGlvbiBsb29wRGVzdHJveSgpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3Qge1xuICAgIHBhcmFtcyxcbiAgICBzbGlkZXNFbFxuICB9ID0gc3dpcGVyO1xuICBpZiAoIXBhcmFtcy5sb29wIHx8IHN3aXBlci52aXJ0dWFsICYmIHN3aXBlci5wYXJhbXMudmlydHVhbC5lbmFibGVkKSByZXR1cm47XG4gIHN3aXBlci5yZWNhbGNTbGlkZXMoKTtcbiAgY29uc3QgbmV3U2xpZGVzT3JkZXIgPSBbXTtcbiAgc3dpcGVyLnNsaWRlcy5mb3JFYWNoKHNsaWRlRWwgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gdHlwZW9mIHNsaWRlRWwuc3dpcGVyU2xpZGVJbmRleCA9PT0gJ3VuZGVmaW5lZCcgPyBzbGlkZUVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zd2lwZXItc2xpZGUtaW5kZXgnKSAqIDEgOiBzbGlkZUVsLnN3aXBlclNsaWRlSW5kZXg7XG4gICAgbmV3
5196U2xpZGVzT3JkZXJbaW5kZXhdID0gc2xpZGVFbDtcbiAgfSk7XG4gIHN3aXBlci5zbGlkZXMuZm9yRWFjaChzbGlkZUVsID0+IHtcbiAgICBzbGlkZUVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1zd2lwZXItc2xpZGUtaW5kZXgnKTtcbiAgfSk7XG4gIG5ld1NsaWRlc09yZGVyLmZvckVhY2goc2xpZGVFbCA9PiB7XG4gICAgc2xpZGVzRWwuYXBwZW5kKHNsaWRlRWwpO1xuICB9KTtcbiAgc3dpcGVyLnJlY2FsY1NsaWRlcygpO1xuICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIucmVhbEluZGV4LCAwKTtcbn1cblxudmFyIGxvb3AgPSB7XG4gIGxvb3BDcmVhdGUsXG4gIGxvb3BGaXgsXG4gIGxvb3BEZXN0cm95XG59O1xuXG5mdW5jdGlvbiBzZXRHcmFiQ3Vyc29yKG1vdmluZykge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBpZiAoIXN3aXBlci5wYXJhbXMuc2ltdWxhdGVUb3VjaCB8fCBzd2lwZXIucGFyYW1zLndhdGNoT3ZlcmZsb3cgJiYgc3dpcGVyLmlzTG9ja2VkIHx8IHN3aXBlci5wYXJhbXMuY3NzTW9kZSkgcmV0dXJuO1xuICBjb25zdCBlbCA9IHN3aXBlci5wYXJhbXMudG91Y2hFdmVudHNUYXJnZXQgPT09ICdjb250YWluZXInID8gc3dpcGVyLmVsIDogc3dpcGVyLndyYXBwZXJFbDtcbiAgaWYgKHN3aXBlci5pc0VsZW1lbnQpIHtcbiAgICBzd2lwZXIuX19wcmV2ZW50T2JzZXJ2ZXJfXyA9IHRydWU7XG4gIH1cbiAgZWwuc3R5bGUuY3Vyc29yID0gJ21vdmUnO1xuICBlbC5zdHlsZS5jdXJzb3IgPSBtb3ZpbmcgPyAnZ3JhYmJpbmcnIDogJ2dyYWInO1xuICBpZiAoc3dpcGVyLmlzRWxlbWVudCkge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBzd2lwZXIuX19wcmV2ZW50T2JzZXJ2ZXJfXyA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc2V0R3JhYkN1cnNvcigpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgaWYgKHN3aXBlci5wYXJhbXMud2F0Y2hPdmVyZmxvdyAmJiBzd2lwZXIuaXNMb2NrZWQgfHwgc3dpcGVyLnBhcmFtcy5jc3NNb2RlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChzd2lwZXIuaXNFbGVtZW50KSB7XG4gICAgc3dpcGVyLl9fcHJldmVudE9ic2VydmVyX18gPSB0cnVlO1xuICB9XG4gIHN3aXBlcltzd2lwZXIucGFyYW1zLnRvdWNoRXZlbnRzVGFyZ2V0ID09PSAnY29udGFpbmVyJyA/ICdlbCcgOiAnd3JhcHBlckVsJ10uc3R5bGUuY3Vyc29yID0gJyc7XG4gIGlmIChzd2lwZXIuaXNFbGVtZW50KSB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHN3aXBlci5fX3ByZXZlbnRPYnNlcnZlcl9fID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIGdyYWJDdXJzb3IgPSB7XG4gIHNldEdyYWJDdXJzb3IsXG4gIHVuc2V0R3JhYkN1cnNvclxufTtcblxuLy8gTW9kaWZpZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81NDUyMDU1NC9jdXN0b20tZWxlbWVudC1nZXRyb290bm9kZS1jbG9zZXN0LWZ1bmN0aW9uLWNyb3NzaW5nLW11bHRpcGxlLXBhcmVudC1zaGFkb3dkXG5mdW5jdGlvbiBjbG9zZXN0RWxlbWVudChzZWxlY3RvciwgYmFzZSkge1xuICBpZiAoYmFzZSA9PT0gdm9pZCAwKSB7XG4gICAgYmFzZSA9IHRoaXM7XG4gIH1cbiAgZnVuY3Rpb24gX19jbG9zZXN0RnJvbShlbCkge1xuICAgIGlmICghZWwgfHwgZWwgPT09IGdldERvY3VtZW50KCkgfHwgZWwgPT09IGdldFdpbmRvdygpKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoZWwuYXNzaWduZWRTbG90KSBlbCA9IGVsLmFzc2lnbmVkU2xvdDtcbiAgICBjb25zdCBmb3VuZCA9IGVsLmNsb3Nlc3Qoc2VsZWN0b3IpO1xuICAgIGlmICghZm91bmQgJiYgIWVsLmdldFJvb3ROb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kIHx8IF9fY2xvc2VzdEZyb20oZWwuZ2V0Um9vdE5vZGUoKS5ob3N0KTtcbiAgfVxuICByZXR1cm4gX19jbG9zZXN0RnJvbShiYXNlKTtcbn1cbmZ1bmN0aW9uIHByZXZlbnRFZGdlU3dpcGUoc3dpcGVyLCBldmVudCwgc3RhcnRYKSB7XG4gIGNvbnN0IHdpbmRvdyA9IGdldFdpbmRvdygpO1xuICBjb25zdCB7XG4gICAgcGFyYW1zXG4gIH0gPSBzd2lwZXI7XG4gIGNvbnN0IGVkZ2VTd2lwZURldGVjdGlvbiA9IHBhcmFtcy5lZGdlU3dpcGVEZXRlY3Rpb247XG4gIGNvbnN0IGVkZ2VTd2lwZVRocmVzaG9sZCA9IHBhcmFtcy5lZGdlU3dpcGVUaHJlc2hvbGQ7XG4gIGlmIChlZGdlU3dpcGVEZXRlY3Rpb24gJiYgKHN0YXJ0WCA8PSBlZGdlU3dpcGVUaHJlc2hvbGQgfHwgc3RhcnRYID49IHdpbmRvdy5pbm5lcldpZHRoIC0gZWRnZVN3aXBlVGhyZXNob2xkKSkge1xuICAgIGlmIChlZGdlU3dpcGVEZXRlY3Rpb24gPT09ICdwcmV2ZW50Jykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBvblRvdWNoU3RhcnQoZXZlbnQpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuICBsZXQgZSA9IGV2ZW50O1xuICBpZiAoZS5vcmlnaW5hbEV2ZW50KSBlID0gZS5vcmlnaW5hbEV2ZW50O1xuICBjb25zdCBkYXRhID0gc3dpcGVyLnRvdWNoRXZlbnRzRGF0YTtcbiAgaWYgKGUudHlwZSA9PT0gJ3BvaW50ZXJkb3duJykge1xuICAgIGlmIChkYXRhLnBvaW50ZXJJZCAhPT0gbnVsbCAmJiBkYXRhLnBvaW50ZXJJZCAhPT0gZS5wb2ludGVySWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGF0YS5wb2ludGVySWQgPSBlLnBvaW50ZXJJZDtcbiAgfSBlbHNlIGlmIChlLnR5cGUgPT09ICd0b3VjaHN0YXJ0JyAmJiBlLnRhcmdldFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgZGF0YS50b3VjaElkID0gZS50YXJnZXRUb3VjaGVzWzBdLmlkZW50aWZpZXI7XG4gIH1cbiAgaWYgKGUudHlwZSA9PT0gJ3RvdWNoc3RhcnQnKSB7XG4gICAgLy8gZG9uJ3QgcHJvY2VlZCB0b3VjaCBldmVudFxuICAgIHByZXZlbnRFZGdlU3dpcGUoc3dpcGVyLCBlLCBlLnRhcmdldFRvdWNoZXNbMF0ucGFnZVgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB7XG4gICAgcGFyYW1zLFxuICAgIHRvdWNoZXMsXG4gICAgZW5hYmxlZFxuICB9ID0gc3dpcGVyO1xuICBpZiAoIWVuYWJsZWQpIHJldHVybjtcbiAgaWYgKCFwYXJhbXMuc2ltdWxhdGVUb3VjaCAmJi
5196BlLnBvaW50ZXJUeXBlID09PSAnbW91c2UnKSByZXR1cm47XG4gIGlmIChzd2lwZXIuYW5pbWF0aW5nICYmIHBhcmFtcy5wcmV2ZW50SW50ZXJhY3Rpb25PblRyYW5zaXRpb24pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFzd2lwZXIuYW5pbWF0aW5nICYmIHBhcmFtcy5jc3NNb2RlICYmIHBhcmFtcy5sb29wKSB7XG4gICAgc3dpcGVyLmxvb3BGaXgoKTtcbiAgfVxuICBsZXQgdGFyZ2V0RWwgPSBlLnRhcmdldDtcbiAgaWYgKHBhcmFtcy50b3VjaEV2ZW50c1RhcmdldCA9PT0gJ3dyYXBwZXInKSB7XG4gICAgaWYgKCFzd2lwZXIud3JhcHBlckVsLmNvbnRhaW5zKHRhcmdldEVsKSkgcmV0dXJuO1xuICB9XG4gIGlmICgnd2hpY2gnIGluIGUgJiYgZS53aGljaCA9PT0gMykgcmV0dXJuO1xuICBpZiAoJ2J1dHRvbicgaW4gZSAmJiBlLmJ1dHRvbiA+IDApIHJldHVybjtcbiAgaWYgKGRhdGEuaXNUb3VjaGVkICYmIGRhdGEuaXNNb3ZlZCkgcmV0dXJuO1xuXG4gIC8vIGNoYW5nZSB0YXJnZXQgZWwgZm9yIHNoYWRvdyByb290IGNvbXBvbmVudFxuICBjb25zdCBzd2lwaW5nQ2xhc3NIYXNWYWx1ZSA9ICEhcGFyYW1zLm5vU3dpcGluZ0NsYXNzICYmIHBhcmFtcy5ub1N3aXBpbmdDbGFzcyAhPT0gJyc7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBjb25zdCBldmVudFBhdGggPSBlLmNvbXBvc2VkUGF0aCA/IGUuY29tcG9zZWRQYXRoKCkgOiBlLnBhdGg7XG4gIGlmIChzd2lwaW5nQ2xhc3NIYXNWYWx1ZSAmJiBlLnRhcmdldCAmJiBlLnRhcmdldC5zaGFkb3dSb290ICYmIGV2ZW50UGF0aCkge1xuICAgIHRhcmdldEVsID0gZXZlbnRQYXRoWzBdO1xuICB9XG4gIGNvbnN0IG5vU3dpcGluZ1NlbGVjdG9yID0gcGFyYW1zLm5vU3dpcGluZ1NlbGVjdG9yID8gcGFyYW1zLm5vU3dpcGluZ1NlbGVjdG9yIDogYC4ke3BhcmFtcy5ub1N3aXBpbmdDbGFzc31gO1xuICBjb25zdCBpc1RhcmdldFNoYWRvdyA9ICEhKGUudGFyZ2V0ICYmIGUudGFyZ2V0LnNoYWRvd1Jvb3QpO1xuXG4gIC8vIHVzZSBjbG9zZXN0RWxlbWVudCBmb3Igc2hhZG93IHJvb3QgZWxlbWVudCB0byBnZXQgdGhlIGFjdHVhbCBjbG9zZXN0IGZvciBuZXN0ZWQgc2hhZG93IHJvb3QgZWxlbWVudFxuICBpZiAocGFyYW1zLm5vU3dpcGluZyAmJiAoaXNUYXJnZXRTaGFkb3cgPyBjbG9zZXN0RWxlbWVudChub1N3aXBpbmdTZWxlY3RvciwgdGFyZ2V0RWwpIDogdGFyZ2V0RWwuY2xvc2VzdChub1N3aXBpbmdTZWxlY3RvcikpKSB7XG4gICAgc3dpcGVyLmFsbG93Q2xpY2sgPSB0cnVlO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocGFyYW1zLnN3aXBlSGFuZGxlcikge1xuICAgIGlmICghdGFyZ2V0RWwuY2xvc2VzdChwYXJhbXMuc3dpcGVIYW5kbGVyKSkgcmV0dXJuO1xuICB9XG4gIHRvdWNoZXMuY3VycmVudFggPSBlLnBhZ2VYO1xuICB0b3VjaGVzLmN1cnJlbnRZID0gZS5wYWdlWTtcbiAgY29uc3Qgc3RhcnRYID0gdG91Y2hlcy5jdXJyZW50WDtcbiAgY29uc3Qgc3RhcnRZID0gdG91Y2hlcy5jdXJyZW50WTtcblxuICAvLyBEbyBOT1Qgc3RhcnQgaWYgaU9TIGVkZ2Ugc3dpcGUgaXMgZGV0ZWN0ZWQuIE90aGVyd2lzZSBpT1MgYXBwIGNhbm5vdCBzd2lwZS10by1nby1iYWNrIGFueW1vcmVcblxuICBpZiAoIXByZXZlbnRFZGdlU3dpcGUoc3dpcGVyLCBlLCBzdGFydFgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIE9iamVjdC5hc3NpZ24oZGF0YSwge1xuICAgIGlzVG91Y2hlZDogdHJ1ZSxcbiAgICBpc01vdmVkOiBmYWxzZSxcbiAgICBhbGxvd1RvdWNoQ2FsbGJhY2tzOiB0cnVlLFxuICAgIGlzU2Nyb2xsaW5nOiB1bmRlZmluZWQsXG4gICAgc3RhcnRNb3Zpbmc6IHVuZGVmaW5lZFxuICB9KTtcbiAgdG91Y2hlcy5zdGFydFggPSBzdGFydFg7XG4gIHRvdWNoZXMuc3RhcnRZID0gc3RhcnRZO1xuICBkYXRhLnRvdWNoU3RhcnRUaW1lID0gbm93KCk7XG4gIHN3aXBlci5hbGxvd0NsaWNrID0gdHJ1ZTtcbiAgc3dpcGVyLnVwZGF0ZVNpemUoKTtcbiAgc3dpcGVyLnN3aXBlRGlyZWN0aW9uID0gdW5kZWZpbmVkO1xuICBpZiAocGFyYW1zLnRocmVzaG9sZCA+IDApIGRhdGEuYWxsb3dUaHJlc2hvbGRNb3ZlID0gZmFsc2U7XG4gIGxldCBwcmV2ZW50RGVmYXVsdCA9IHRydWU7XG4gIGlmICh0YXJnZXRFbC5tYXRjaGVzKGRhdGEuZm9jdXNhYmxlRWxlbWVudHMpKSB7XG4gICAgcHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICBpZiAodGFyZ2V0RWwubm9kZU5hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICBkYXRhLmlzVG91Y2hlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50Lm1hdGNoZXMoZGF0YS5mb2N1c2FibGVFbGVtZW50cykgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gdGFyZ2V0RWwpIHtcbiAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKTtcbiAgfVxuICBjb25zdCBzaG91bGRQcmV2ZW50RGVmYXVsdCA9IHByZXZlbnREZWZhdWx0ICYmIHN3aXBlci5hbGxvd1RvdWNoTW92ZSAmJiBwYXJhbXMudG91Y2hTdGFydFByZXZlbnREZWZhdWx0O1xuICBpZiAoKHBhcmFtcy50b3VjaFN0YXJ0Rm9yY2VQcmV2ZW50RGVmYXVsdCB8fCBzaG91bGRQcmV2ZW50RGVmYXVsdCkgJiYgIXRhcmdldEVsLmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIGlmIChwYXJhbXMuZnJlZU1vZGUgJiYgcGFyYW1zLmZyZWVNb2RlLmVuYWJsZWQgJiYgc3dpcGVyLmZyZWVNb2RlICYmIHN3aXBlci5hbmltYXRpbmcgJiYgIXBhcmFtcy5jc3NNb2RlKSB7XG4gICAgc3dpcGVyLmZyZWVNb2RlLm9uVG91Y2hTdGFydCgpO1xuICB9XG4gIHN3aXBlci5lbWl0KCd0b3VjaFN0YXJ0JywgZSk7XG59XG5cbmZ1bmN0aW9uIG9uVG91Y2hNb3ZlKGV2ZW50KSB7XG4gIGNvbnN0IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3QgZGF0YSA9IHN3aXBlci50b3VjaEV2ZW50c0RhdGE7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXMsXG4gICAgdG91Y2hlcyxcbiAgICBydGxUcmFuc2xhdGU6IHJ0bCxcbiAgICBlbmFibGVkXG4gIH0gPSBzd2lwZXI7XG4gIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICBpZiAoIXBhcmFtcy5zaW11bGF0ZVRvdWNoICYmIGV2ZW50LnBvaW50ZXJUeXBlID09PSAnbW91c2UnKSByZXR1cm47XG4gIGxldCBlID0gZXZlbnQ7XG4gIGlmIChlLm9yaWdpbmFsRXZlbnQpIGUgPSBlLm9yaWdpbmFsRXZlbnQ7XG4gIGlmIChlLnR5cGUgPT09ICdwb2ludGVybW92ZScpIHtcbiAgICBpZiAoZGF0YS50b3VjaElkICE9PSBudWxsKSByZXR1cm47IC8vIHJldHVybi
5196Bmcm9tIHBvaW50ZXIgaWYgd2UgdXNlIHRvdWNoXG4gICAgY29uc3QgaWQgPSBlLnBvaW50ZXJJZDtcbiAgICBpZiAoaWQgIT09IGRhdGEucG9pbnRlcklkKSByZXR1cm47XG4gIH1cbiAgbGV0IHRhcmdldFRvdWNoO1xuICBpZiAoZS50eXBlID09PSAndG91Y2htb3ZlJykge1xuICAgIHRhcmdldFRvdWNoID0gWy4uLmUuY2hhbmdlZFRvdWNoZXNdLmZpbHRlcih0ID0+IHQuaWRlbnRpZmllciA9PT0gZGF0YS50b3VjaElkKVswXTtcbiAgICBpZiAoIXRhcmdldFRvdWNoIHx8IHRhcmdldFRvdWNoLmlkZW50aWZpZXIgIT09IGRhdGEudG91Y2hJZCkgcmV0dXJuO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldFRvdWNoID0gZTtcbiAgfVxuICBpZiAoIWRhdGEuaXNUb3VjaGVkKSB7XG4gICAgaWYgKGRhdGEuc3RhcnRNb3ZpbmcgJiYgZGF0YS5pc1Njcm9sbGluZykge1xuICAgICAgc3dpcGVyLmVtaXQoJ3RvdWNoTW92ZU9wcG9zaXRlJywgZSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwYWdlWCA9IHRhcmdldFRvdWNoLnBhZ2VYO1xuICBjb25zdCBwYWdlWSA9IHRhcmdldFRvdWNoLnBhZ2VZO1xuICBpZiAoZS5wcmV2ZW50ZWRCeU5lc3RlZFN3aXBlcikge1xuICAgIHRvdWNoZXMuc3RhcnRYID0gcGFnZVg7XG4gICAgdG91Y2hlcy5zdGFydFkgPSBwYWdlWTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFzd2lwZXIuYWxsb3dUb3VjaE1vdmUpIHtcbiAgICBpZiAoIWUudGFyZ2V0Lm1hdGNoZXMoZGF0YS5mb2N1c2FibGVFbGVtZW50cykpIHtcbiAgICAgIHN3aXBlci5hbGxvd0NsaWNrID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChkYXRhLmlzVG91Y2hlZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbih0b3VjaGVzLCB7XG4gICAgICAgIHN0YXJ0WDogcGFnZVgsXG4gICAgICAgIHN0YXJ0WTogcGFnZVksXG4gICAgICAgIGN1cnJlbnRYOiBwYWdlWCxcbiAgICAgICAgY3VycmVudFk6IHBhZ2VZXG4gICAgICB9KTtcbiAgICAgIGRhdGEudG91Y2hTdGFydFRpbWUgPSBub3coKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwYXJhbXMudG91Y2hSZWxlYXNlT25FZGdlcyAmJiAhcGFyYW1zLmxvb3ApIHtcbiAgICBpZiAoc3dpcGVyLmlzVmVydGljYWwoKSkge1xuICAgICAgLy8gVmVydGljYWxcbiAgICAgIGlmIChwYWdlWSA8IHRvdWNoZXMuc3RhcnRZICYmIHN3aXBlci50cmFuc2xhdGUgPD0gc3dpcGVyLm1heFRyYW5zbGF0ZSgpIHx8IHBhZ2VZID4gdG91Y2hlcy5zdGFydFkgJiYgc3dpcGVyLnRyYW5zbGF0ZSA+PSBzd2lwZXIubWluVHJhbnNsYXRlKCkpIHtcbiAgICAgICAgZGF0YS5pc1RvdWNoZWQgPSBmYWxzZTtcbiAgICAgICAgZGF0YS5pc01vdmVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBhZ2VYIDwgdG91Y2hlcy5zdGFydFggJiYgc3dpcGVyLnRyYW5zbGF0ZSA8PSBzd2lwZXIubWF4VHJhbnNsYXRlKCkgfHwgcGFnZVggPiB0b3VjaGVzLnN0YXJ0WCAmJiBzd2lwZXIudHJhbnNsYXRlID49IHN3aXBlci5taW5UcmFuc2xhdGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xuICAgIGlmIChlLnRhcmdldCA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBlLnRhcmdldC5tYXRjaGVzKGRhdGEuZm9jdXNhYmxlRWxlbWVudHMpKSB7XG4gICAgICBkYXRhLmlzTW92ZWQgPSB0cnVlO1xuICAgICAgc3dpcGVyLmFsbG93Q2xpY2sgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgaWYgKGRhdGEuYWxsb3dUb3VjaENhbGxiYWNrcykge1xuICAgIHN3aXBlci5lbWl0KCd0b3VjaE1vdmUnLCBlKTtcbiAgfVxuICB0b3VjaGVzLnByZXZpb3VzWCA9IHRvdWNoZXMuY3VycmVudFg7XG4gIHRvdWNoZXMucHJldmlvdXNZID0gdG91Y2hlcy5jdXJyZW50WTtcbiAgdG91Y2hlcy5jdXJyZW50WCA9IHBhZ2VYO1xuICB0b3VjaGVzLmN1cnJlbnRZID0gcGFnZVk7XG4gIGNvbnN0IGRpZmZYID0gdG91Y2hlcy5jdXJyZW50WCAtIHRvdWNoZXMuc3RhcnRYO1xuICBjb25zdCBkaWZmWSA9IHRvdWNoZXMuY3VycmVudFkgLSB0b3VjaGVzLnN0YXJ0WTtcbiAgaWYgKHN3aXBlci5wYXJhbXMudGhyZXNob2xkICYmIE1hdGguc3FydChkaWZmWCAqKiAyICsgZGlmZlkgKiogMikgPCBzd2lwZXIucGFyYW1zLnRocmVzaG9sZCkgcmV0dXJuO1xuICBpZiAodHlwZW9mIGRhdGEuaXNTY3JvbGxpbmcgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgbGV0IHRvdWNoQW5nbGU7XG4gICAgaWYgKHN3aXBlci5pc0hvcml6b250YWwoKSAmJiB0b3VjaGVzLmN1cnJlbnRZID09PSB0b3VjaGVzLnN0YXJ0WSB8fCBzd2lwZXIuaXNWZXJ0aWNhbCgpICYmIHRvdWNoZXMuY3VycmVudFggPT09IHRvdWNoZXMuc3RhcnRYKSB7XG4gICAgICBkYXRhLmlzU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgaWYgKGRpZmZYICogZGlmZlggKyBkaWZmWSAqIGRpZmZZID49IDI1KSB7XG4gICAgICAgIHRvdWNoQW5nbGUgPSBNYXRoLmF0YW4yKE1hdGguYWJzKGRpZmZZKSwgTWF0aC5hYnMoZGlmZlgpKSAqIDE4MCAvIE1hdGguUEk7XG4gICAgICAgIGRhdGEuaXNTY3JvbGxpbmcgPSBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyB0b3VjaEFuZ2xlID4gcGFyYW1zLnRvdWNoQW5nbGUgOiA5MCAtIHRvdWNoQW5nbGUgPiBwYXJhbXMudG91Y2hBbmdsZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGRhdGEuaXNTY3JvbGxpbmcpIHtcbiAgICBzd2lwZXIuZW1pdCgndG91Y2hNb3ZlT3Bwb3NpdGUnLCBlKTtcbiAgfVxuICBpZiAodHlwZW9mIGRhdGEuc3RhcnRNb3ZpbmcgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHRvdWNoZXMuY3VycmVudFggIT09IHRvdWNoZXMuc3RhcnRYIHx8IHRvdWNoZXMuY3VycmVudFkgIT09IHRvdWNoZXMuc3RhcnRZKSB7XG4gICAgICBkYXRhLnN0YXJ0TW92aW5nID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKGRhdGEuaXNTY3JvbGxpbmcgfHwgZS50eXBlID09PSAndG91Y2htb3ZlJyAmJiBkYXRhLnByZXZlbn
5196RUb3VjaE1vdmVGcm9tUG9pbnRlck1vdmUpIHtcbiAgICBkYXRhLmlzVG91Y2hlZCA9IGZhbHNlO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWRhdGEuc3RhcnRNb3ZpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgc3dpcGVyLmFsbG93Q2xpY2sgPSBmYWxzZTtcbiAgaWYgKCFwYXJhbXMuY3NzTW9kZSAmJiBlLmNhbmNlbGFibGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbiAgaWYgKHBhcmFtcy50b3VjaE1vdmVTdG9wUHJvcGFnYXRpb24gJiYgIXBhcmFtcy5uZXN0ZWQpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG4gIGxldCBkaWZmID0gc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gZGlmZlggOiBkaWZmWTtcbiAgbGV0IHRvdWNoZXNEaWZmID0gc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gdG91Y2hlcy5jdXJyZW50WCAtIHRvdWNoZXMucHJldmlvdXNYIDogdG91Y2hlcy5jdXJyZW50WSAtIHRvdWNoZXMucHJldmlvdXNZO1xuICBpZiAocGFyYW1zLm9uZVdheU1vdmVtZW50KSB7XG4gICAgZGlmZiA9IE1hdGguYWJzKGRpZmYpICogKHJ0bCA/IDEgOiAtMSk7XG4gICAgdG91Y2hlc0RpZmYgPSBNYXRoLmFicyh0b3VjaGVzRGlmZikgKiAocnRsID8gMSA6IC0xKTtcbiAgfVxuICB0b3VjaGVzLmRpZmYgPSBkaWZmO1xuICBkaWZmICo9IHBhcmFtcy50b3VjaFJhdGlvO1xuICBpZiAocnRsKSB7XG4gICAgZGlmZiA9IC1kaWZmO1xuICAgIHRvdWNoZXNEaWZmID0gLXRvdWNoZXNEaWZmO1xuICB9XG4gIGNvbnN0IHByZXZUb3VjaGVzRGlyZWN0aW9uID0gc3dpcGVyLnRvdWNoZXNEaXJlY3Rpb247XG4gIHN3aXBlci5zd2lwZURpcmVjdGlvbiA9IGRpZmYgPiAwID8gJ3ByZXYnIDogJ25leHQnO1xuICBzd2lwZXIudG91Y2hlc0RpcmVjdGlvbiA9IHRvdWNoZXNEaWZmID4gMCA/ICdwcmV2JyA6ICduZXh0JztcbiAgY29uc3QgaXNMb29wID0gc3dpcGVyLnBhcmFtcy5sb29wICYmICFwYXJhbXMuY3NzTW9kZTtcbiAgY29uc3QgYWxsb3dMb29wRml4ID0gc3dpcGVyLnRvdWNoZXNEaXJlY3Rpb24gPT09ICduZXh0JyAmJiBzd2lwZXIuYWxsb3dTbGlkZU5leHQgfHwgc3dpcGVyLnRvdWNoZXNEaXJlY3Rpb24gPT09ICdwcmV2JyAmJiBzd2lwZXIuYWxsb3dTbGlkZVByZXY7XG4gIGlmICghZGF0YS5pc01vdmVkKSB7XG4gICAgaWYgKGlzTG9vcCAmJiBhbGxvd0xvb3BGaXgpIHtcbiAgICAgIHN3aXBlci5sb29wRml4KHtcbiAgICAgICAgZGlyZWN0aW9uOiBzd2lwZXIuc3dpcGVEaXJlY3Rpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgICBkYXRhLnN0YXJ0VHJhbnNsYXRlID0gc3dpcGVyLmdldFRyYW5zbGF0ZSgpO1xuICAgIHN3aXBlci5zZXRUcmFuc2l0aW9uKDApO1xuICAgIGlmIChzd2lwZXIuYW5pbWF0aW5nKSB7XG4gICAgICBjb25zdCBldnQgPSBuZXcgd2luZG93LkN1c3RvbUV2ZW50KCd0cmFuc2l0aW9uZW5kJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHN3aXBlci53cmFwcGVyRWwuZGlzcGF0Y2hFdmVudChldnQpO1xuICAgIH1cbiAgICBkYXRhLmFsbG93TW9tZW50dW1Cb3VuY2UgPSBmYWxzZTtcbiAgICAvLyBHcmFiIEN1cnNvclxuICAgIGlmIChwYXJhbXMuZ3JhYkN1cnNvciAmJiAoc3dpcGVyLmFsbG93U2xpZGVOZXh0ID09PSB0cnVlIHx8IHN3aXBlci5hbGxvd1NsaWRlUHJldiA9PT0gdHJ1ZSkpIHtcbiAgICAgIHN3aXBlci5zZXRHcmFiQ3Vyc29yKHRydWUpO1xuICAgIH1cbiAgICBzd2lwZXIuZW1pdCgnc2xpZGVyRmlyc3RNb3ZlJywgZSk7XG4gIH1cbiAgbGV0IGxvb3BGaXhlZDtcbiAgbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIGlmIChkYXRhLmlzTW92ZWQgJiYgZGF0YS5hbGxvd1RocmVzaG9sZE1vdmUgJiYgcHJldlRvdWNoZXNEaXJlY3Rpb24gIT09IHN3aXBlci50b3VjaGVzRGlyZWN0aW9uICYmIGlzTG9vcCAmJiBhbGxvd0xvb3BGaXggJiYgTWF0aC5hYnMoZGlmZikgPj0gMSkge1xuICAgIE9iamVjdC5hc3NpZ24odG91Y2hlcywge1xuICAgICAgc3RhcnRYOiBwYWdlWCxcbiAgICAgIHN0YXJ0WTogcGFnZVksXG4gICAgICBjdXJyZW50WDogcGFnZVgsXG4gICAgICBjdXJyZW50WTogcGFnZVksXG4gICAgICBzdGFydFRyYW5zbGF0ZTogZGF0YS5jdXJyZW50VHJhbnNsYXRlXG4gICAgfSk7XG4gICAgZGF0YS5sb29wU3dhcFJlc2V0ID0gdHJ1ZTtcbiAgICBkYXRhLnN0YXJ0VHJhbnNsYXRlID0gZGF0YS5jdXJyZW50VHJhbnNsYXRlO1xuICAgIHJldHVybjtcbiAgfVxuICBzd2lwZXIuZW1pdCgnc2xpZGVyTW92ZScsIGUpO1xuICBkYXRhLmlzTW92ZWQgPSB0cnVlO1xuICBkYXRhLmN1cnJlbnRUcmFuc2xhdGUgPSBkaWZmICsgZGF0YS5zdGFydFRyYW5zbGF0ZTtcbiAgbGV0IGRpc2FibGVQYXJlbnRTd2lwZXIgPSB0cnVlO1xuICBsZXQgcmVzaXN0YW5jZVJhdGlvID0gcGFyYW1zLnJlc2lzdGFuY2VSYXRpbztcbiAgaWYgKHBhcmFtcy50b3VjaFJlbGVhc2VPbkVkZ2VzKSB7XG4gICAgcmVzaXN0YW5jZVJhdGlvID0gMDtcbiAgfVxuICBpZiAoZGlmZiA+IDApIHtcbiAgICBpZiAoaXNMb29wICYmIGFsbG93TG9vcEZpeCAmJiAhbG9vcEZpeGVkICYmIGRhdGEuYWxsb3dUaHJlc2hvbGRNb3ZlICYmIGRhdGEuY3VycmVudFRyYW5zbGF0ZSA+IChwYXJhbXMuY2VudGVyZWRTbGlkZXMgPyBzd2lwZXIubWluVHJhbnNsYXRlKCkgLSBzd2lwZXIuc2xpZGVzU2l6ZXNHcmlkW3N3aXBlci5hY3RpdmVJbmRleCArIDFdIDogc3dpcGVyLm1pblRyYW5zbGF0ZSgpKSkge1xuICAgICAgc3dpcGVyLmxvb3BGaXgoe1xuICAgICAgICBkaXJlY3Rpb246ICdwcmV2JyxcbiAgICAgICAgc2V0VHJhbnNsYXRlOiB0cnVlLFxuICAgICAgICBhY3RpdmVTbGlkZUluZGV4OiAwXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGRhdGEuY3VycmVudFRyYW5zbGF0ZSA+IHN3aXBlci5taW5UcmFuc2xhdGUoKSkge1xuICAgICAgZGlzYWJsZVBhcmVudFN3aXBlciA9IGZhbHNlO1xuICAgICAgaWYgKHBhcmFtcy5yZXNpc3RhbmNlKSB7XG4gICAgICAgIGRhdGEuY3VycmVudFRyYW5zbGF0ZSA9IHN3aXBlci5taW5UcmFuc2xhdGUoKSAtIDEgKyAoLXN3aXBlci5taW5UcmFuc2xhdGUoKSArIGRhdGEuc3RhcnRUcmFuc2xhdGUgKyBkaWZmKSAqKiByZXNpc3RhbmNlUmF0aW87XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGRpZmYgPCAwKSB7XG4gICAgaWYgKGlzTG9vcCAmJiBhbGxvd0xvb3BGaXggJiYgIWxvb3BGaXhlZCAmJiBkYXRhLmFsbG93VGhyZXNob2xkTW92ZSAmJi
5196BkYXRhLmN1cnJlbnRUcmFuc2xhdGUgPCAocGFyYW1zLmNlbnRlcmVkU2xpZGVzID8gc3dpcGVyLm1heFRyYW5zbGF0ZSgpICsgc3dpcGVyLnNsaWRlc1NpemVzR3JpZFtzd2lwZXIuc2xpZGVzU2l6ZXNHcmlkLmxlbmd0aCAtIDFdIDogc3dpcGVyLm1heFRyYW5zbGF0ZSgpKSkge1xuICAgICAgc3dpcGVyLmxvb3BGaXgoe1xuICAgICAgICBkaXJlY3Rpb246ICduZXh0JyxcbiAgICAgICAgc2V0VHJhbnNsYXRlOiB0cnVlLFxuICAgICAgICBhY3RpdmVTbGlkZUluZGV4OiBzd2lwZXIuc2xpZGVzLmxlbmd0aCAtIChwYXJhbXMuc2xpZGVzUGVyVmlldyA9PT0gJ2F1dG8nID8gc3dpcGVyLnNsaWRlc1BlclZpZXdEeW5hbWljKCkgOiBNYXRoLmNlaWwocGFyc2VGbG9hdChwYXJhbXMuc2xpZGVzUGVyVmlldywgMTApKSlcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZGF0YS5jdXJyZW50VHJhbnNsYXRlIDwgc3dpcGVyLm1heFRyYW5zbGF0ZSgpKSB7XG4gICAgICBkaXNhYmxlUGFyZW50U3dpcGVyID0gZmFsc2U7XG4gICAgICBpZiAocGFyYW1zLnJlc2lzdGFuY2UpIHtcbiAgICAgICAgZGF0YS5jdXJyZW50VHJhbnNsYXRlID0gc3dpcGVyLm1heFRyYW5zbGF0ZSgpICsgMSAtIChzd2lwZXIubWF4VHJhbnNsYXRlKCkgLSBkYXRhLnN0YXJ0VHJhbnNsYXRlIC0gZGlmZikgKiogcmVzaXN0YW5jZVJhdGlvO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoZGlzYWJsZVBhcmVudFN3aXBlcikge1xuICAgIGUucHJldmVudGVkQnlOZXN0ZWRTd2lwZXIgPSB0cnVlO1xuICB9XG5cbiAgLy8gRGlyZWN0aW9ucyBsb2Nrc1xuICBpZiAoIXN3aXBlci5hbGxvd1NsaWRlTmV4dCAmJiBzd2lwZXIuc3dpcGVEaXJlY3Rpb24gPT09ICduZXh0JyAmJiBkYXRhLmN1cnJlbnRUcmFuc2xhdGUgPCBkYXRhLnN0YXJ0VHJhbnNsYXRlKSB7XG4gICAgZGF0YS5jdXJyZW50VHJhbnNsYXRlID0gZGF0YS5zdGFydFRyYW5zbGF0ZTtcbiAgfVxuICBpZiAoIXN3aXBlci5hbGxvd1NsaWRlUHJldiAmJiBzd2lwZXIuc3dpcGVEaXJlY3Rpb24gPT09ICdwcmV2JyAmJiBkYXRhLmN1cnJlbnRUcmFuc2xhdGUgPiBkYXRhLnN0YXJ0VHJhbnNsYXRlKSB7XG4gICAgZGF0YS5jdXJyZW50VHJhbnNsYXRlID0gZGF0YS5zdGFydFRyYW5zbGF0ZTtcbiAgfVxuICBpZiAoIXN3aXBlci5hbGxvd1NsaWRlUHJldiAmJiAhc3dpcGVyLmFsbG93U2xpZGVOZXh0KSB7XG4gICAgZGF0YS5jdXJyZW50VHJhbnNsYXRlID0gZGF0YS5zdGFydFRyYW5zbGF0ZTtcbiAgfVxuXG4gIC8vIFRocmVzaG9sZFxuICBpZiAocGFyYW1zLnRocmVzaG9sZCA+IDApIHtcbiAgICBpZiAoTWF0aC5hYnMoZGlmZikgPiBwYXJhbXMudGhyZXNob2xkIHx8IGRhdGEuYWxsb3dUaHJlc2hvbGRNb3ZlKSB7XG4gICAgICBpZiAoIWRhdGEuYWxsb3dUaHJlc2hvbGRNb3ZlKSB7XG4gICAgICAgIGRhdGEuYWxsb3dUaHJlc2hvbGRNb3ZlID0gdHJ1ZTtcbiAgICAgICAgdG91Y2hlcy5zdGFydFggPSB0b3VjaGVzLmN1cnJlbnRYO1xuICAgICAgICB0b3VjaGVzLnN0YXJ0WSA9IHRvdWNoZXMuY3VycmVudFk7XG4gICAgICAgIGRhdGEuY3VycmVudFRyYW5zbGF0ZSA9IGRhdGEuc3RhcnRUcmFuc2xhdGU7XG4gICAgICAgIHRvdWNoZXMuZGlmZiA9IHN3aXBlci5pc0hvcml6b250YWwoKSA/IHRvdWNoZXMuY3VycmVudFggLSB0b3VjaGVzLnN0YXJ0WCA6IHRvdWNoZXMuY3VycmVudFkgLSB0b3VjaGVzLnN0YXJ0WTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhLmN1cnJlbnRUcmFuc2xhdGUgPSBkYXRhLnN0YXJ0VHJhbnNsYXRlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBpZiAoIXBhcmFtcy5mb2xsb3dGaW5nZXIgfHwgcGFyYW1zLmNzc01vZGUpIHJldHVybjtcblxuICAvLyBVcGRhdGUgYWN0aXZlIGluZGV4IGluIGZyZWUgbW9kZVxuICBpZiAocGFyYW1zLmZyZWVNb2RlICYmIHBhcmFtcy5mcmVlTW9kZS5lbmFibGVkICYmIHN3aXBlci5mcmVlTW9kZSB8fCBwYXJhbXMud2F0Y2hTbGlkZXNQcm9ncmVzcykge1xuICAgIHN3aXBlci51cGRhdGVBY3RpdmVJbmRleCgpO1xuICAgIHN3aXBlci51cGRhdGVTbGlkZXNDbGFzc2VzKCk7XG4gIH1cbiAgaWYgKHBhcmFtcy5mcmVlTW9kZSAmJiBwYXJhbXMuZnJlZU1vZGUuZW5hYmxlZCAmJiBzd2lwZXIuZnJlZU1vZGUpIHtcbiAgICBzd2lwZXIuZnJlZU1vZGUub25Ub3VjaE1vdmUoKTtcbiAgfVxuICAvLyBVcGRhdGUgcHJvZ3Jlc3NcbiAgc3dpcGVyLnVwZGF0ZVByb2dyZXNzKGRhdGEuY3VycmVudFRyYW5zbGF0ZSk7XG4gIC8vIFVwZGF0ZSB0cmFuc2xhdGVcbiAgc3dpcGVyLnNldFRyYW5zbGF0ZShkYXRhLmN1cnJlbnRUcmFuc2xhdGUpO1xufVxuXG5mdW5jdGlvbiBvblRvdWNoRW5kKGV2ZW50KSB7XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IGRhdGEgPSBzd2lwZXIudG91Y2hFdmVudHNEYXRhO1xuICBsZXQgZSA9IGV2ZW50O1xuICBpZiAoZS5vcmlnaW5hbEV2ZW50KSBlID0gZS5vcmlnaW5hbEV2ZW50O1xuICBsZXQgdGFyZ2V0VG91Y2g7XG4gIGNvbnN0IGlzVG91Y2hFdmVudCA9IGUudHlwZSA9PT0gJ3RvdWNoZW5kJyB8fCBlLnR5cGUgPT09ICd0b3VjaGNhbmNlbCc7XG4gIGlmICghaXNUb3VjaEV2ZW50KSB7XG4gICAgaWYgKGRhdGEudG91Y2hJZCAhPT0gbnVsbCkgcmV0dXJuOyAvLyByZXR1cm4gZnJvbSBwb2ludGVyIGlmIHdlIHVzZSB0b3VjaFxuICAgIGlmIChlLnBvaW50ZXJJZCAhPT0gZGF0YS5wb2ludGVySWQpIHJldHVybjtcbiAgICB0YXJnZXRUb3VjaCA9IGU7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0VG91Y2ggPSBbLi4uZS5jaGFuZ2VkVG91Y2hlc10uZmlsdGVyKHQgPT4gdC5pZGVudGlmaWVyID09PSBkYXRhLnRvdWNoSWQpWzBdO1xuICAgIGlmICghdGFyZ2V0VG91Y2ggfHwgdGFyZ2V0VG91Y2guaWRlbnRpZmllciAhPT0gZGF0YS50b3VjaElkKSByZXR1cm47XG4gIH1cbiAgaWYgKFsncG9pbnRlcmNhbmNlbCcsICdwb2ludGVyb3V0JywgJ3BvaW50ZXJsZWF2ZScsICdjb250ZXh0bWVudSddLmluY2x1ZGVzKGUudHlwZSkpIHtcbiAgICBjb25zdCBwcm9jZWVkID0gWydwb2ludGVyY2FuY2VsJywgJ2NvbnRleHRtZW51J10uaW5jbHVkZXMoZS50eXBlKSAmJiAoc3dpcGVyLmJyb3dzZXIuaXNTYWZhcmkgfHwgc3dpcGVyLmJyb3dzZXIuaXNXZWJWaWV3KTtcbiAgICBpZiAoIXByb2NlZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gI
5196H1cbiAgZGF0YS5wb2ludGVySWQgPSBudWxsO1xuICBkYXRhLnRvdWNoSWQgPSBudWxsO1xuICBjb25zdCB7XG4gICAgcGFyYW1zLFxuICAgIHRvdWNoZXMsXG4gICAgcnRsVHJhbnNsYXRlOiBydGwsXG4gICAgc2xpZGVzR3JpZCxcbiAgICBlbmFibGVkXG4gIH0gPSBzd2lwZXI7XG4gIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICBpZiAoIXBhcmFtcy5zaW11bGF0ZVRvdWNoICYmIGUucG9pbnRlclR5cGUgPT09ICdtb3VzZScpIHJldHVybjtcbiAgaWYgKGRhdGEuYWxsb3dUb3VjaENhbGxiYWNrcykge1xuICAgIHN3aXBlci5lbWl0KCd0b3VjaEVuZCcsIGUpO1xuICB9XG4gIGRhdGEuYWxsb3dUb3VjaENhbGxiYWNrcyA9IGZhbHNlO1xuICBpZiAoIWRhdGEuaXNUb3VjaGVkKSB7XG4gICAgaWYgKGRhdGEuaXNNb3ZlZCAmJiBwYXJhbXMuZ3JhYkN1cnNvcikge1xuICAgICAgc3dpcGVyLnNldEdyYWJDdXJzb3IoZmFsc2UpO1xuICAgIH1cbiAgICBkYXRhLmlzTW92ZWQgPSBmYWxzZTtcbiAgICBkYXRhLnN0YXJ0TW92aW5nID0gZmFsc2U7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUmV0dXJuIEdyYWIgQ3Vyc29yXG4gIGlmIChwYXJhbXMuZ3JhYkN1cnNvciAmJiBkYXRhLmlzTW92ZWQgJiYgZGF0YS5pc1RvdWNoZWQgJiYgKHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9PT0gdHJ1ZSB8fCBzd2lwZXIuYWxsb3dTbGlkZVByZXYgPT09IHRydWUpKSB7XG4gICAgc3dpcGVyLnNldEdyYWJDdXJzb3IoZmFsc2UpO1xuICB9XG5cbiAgLy8gVGltZSBkaWZmXG4gIGNvbnN0IHRvdWNoRW5kVGltZSA9IG5vdygpO1xuICBjb25zdCB0aW1lRGlmZiA9IHRvdWNoRW5kVGltZSAtIGRhdGEudG91Y2hTdGFydFRpbWU7XG5cbiAgLy8gVGFwLCBkb3VibGVUYXAsIENsaWNrXG4gIGlmIChzd2lwZXIuYWxsb3dDbGljaykge1xuICAgIGNvbnN0IHBhdGhUcmVlID0gZS5wYXRoIHx8IGUuY29tcG9zZWRQYXRoICYmIGUuY29tcG9zZWRQYXRoKCk7XG4gICAgc3dpcGVyLnVwZGF0ZUNsaWNrZWRTbGlkZShwYXRoVHJlZSAmJiBwYXRoVHJlZVswXSB8fCBlLnRhcmdldCwgcGF0aFRyZWUpO1xuICAgIHN3aXBlci5lbWl0KCd0YXAgY2xpY2snLCBlKTtcbiAgICBpZiAodGltZURpZmYgPCAzMDAgJiYgdG91Y2hFbmRUaW1lIC0gZGF0YS5sYXN0Q2xpY2tUaW1lIDwgMzAwKSB7XG4gICAgICBzd2lwZXIuZW1pdCgnZG91YmxlVGFwIGRvdWJsZUNsaWNrJywgZSk7XG4gICAgfVxuICB9XG4gIGRhdGEubGFzdENsaWNrVGltZSA9IG5vdygpO1xuICBuZXh0VGljaygoKSA9PiB7XG4gICAgaWYgKCFzd2lwZXIuZGVzdHJveWVkKSBzd2lwZXIuYWxsb3dDbGljayA9IHRydWU7XG4gIH0pO1xuICBpZiAoIWRhdGEuaXNUb3VjaGVkIHx8ICFkYXRhLmlzTW92ZWQgfHwgIXN3aXBlci5zd2lwZURpcmVjdGlvbiB8fCB0b3VjaGVzLmRpZmYgPT09IDAgJiYgIWRhdGEubG9vcFN3YXBSZXNldCB8fCBkYXRhLmN1cnJlbnRUcmFuc2xhdGUgPT09IGRhdGEuc3RhcnRUcmFuc2xhdGUgJiYgIWRhdGEubG9vcFN3YXBSZXNldCkge1xuICAgIGRhdGEuaXNUb3VjaGVkID0gZmFsc2U7XG4gICAgZGF0YS5pc01vdmVkID0gZmFsc2U7XG4gICAgZGF0YS5zdGFydE1vdmluZyA9IGZhbHNlO1xuICAgIHJldHVybjtcbiAgfVxuICBkYXRhLmlzVG91Y2hlZCA9IGZhbHNlO1xuICBkYXRhLmlzTW92ZWQgPSBmYWxzZTtcbiAgZGF0YS5zdGFydE1vdmluZyA9IGZhbHNlO1xuICBsZXQgY3VycmVudFBvcztcbiAgaWYgKHBhcmFtcy5mb2xsb3dGaW5nZXIpIHtcbiAgICBjdXJyZW50UG9zID0gcnRsID8gc3dpcGVyLnRyYW5zbGF0ZSA6IC1zd2lwZXIudHJhbnNsYXRlO1xuICB9IGVsc2Uge1xuICAgIGN1cnJlbnRQb3MgPSAtZGF0YS5jdXJyZW50VHJhbnNsYXRlO1xuICB9XG4gIGlmIChwYXJhbXMuY3NzTW9kZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocGFyYW1zLmZyZWVNb2RlICYmIHBhcmFtcy5mcmVlTW9kZS5lbmFibGVkKSB7XG4gICAgc3dpcGVyLmZyZWVNb2RlLm9uVG91Y2hFbmQoe1xuICAgICAgY3VycmVudFBvc1xuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEZpbmQgY3VycmVudCBzbGlkZVxuICBjb25zdCBzd2lwZVRvTGFzdCA9IGN1cnJlbnRQb3MgPj0gLXN3aXBlci5tYXhUcmFuc2xhdGUoKSAmJiAhc3dpcGVyLnBhcmFtcy5sb29wO1xuICBsZXQgc3RvcEluZGV4ID0gMDtcbiAgbGV0IGdyb3VwU2l6ZSA9IHN3aXBlci5zbGlkZXNTaXplc0dyaWRbMF07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2xpZGVzR3JpZC5sZW5ndGg7IGkgKz0gaSA8IHBhcmFtcy5zbGlkZXNQZXJHcm91cFNraXAgPyAxIDogcGFyYW1zLnNsaWRlc1Blckdyb3VwKSB7XG4gICAgY29uc3QgaW5jcmVtZW50ID0gaSA8IHBhcmFtcy5zbGlkZXNQZXJHcm91cFNraXAgLSAxID8gMSA6IHBhcmFtcy5zbGlkZXNQZXJHcm91cDtcbiAgICBpZiAodHlwZW9mIHNsaWRlc0dyaWRbaSArIGluY3JlbWVudF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoc3dpcGVUb0xhc3QgfHwgY3VycmVudFBvcyA+PSBzbGlkZXNHcmlkW2ldICYmIGN1cnJlbnRQb3MgPCBzbGlkZXNHcmlkW2kgKyBpbmNyZW1lbnRdKSB7XG4gICAgICAgIHN0b3BJbmRleCA9IGk7XG4gICAgICAgIGdyb3VwU2l6ZSA9IHNsaWRlc0dyaWRbaSArIGluY3JlbWVudF0gLSBzbGlkZXNHcmlkW2ldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3dpcGVUb0xhc3QgfHwgY3VycmVudFBvcyA+PSBzbGlkZXNHcmlkW2ldKSB7XG4gICAgICBzdG9wSW5kZXggPSBpO1xuICAgICAgZ3JvdXBTaXplID0gc2xpZGVzR3JpZFtzbGlkZXNHcmlkLmxlbmd0aCAtIDFdIC0gc2xpZGVzR3JpZFtzbGlkZXNHcmlkLmxlbmd0aCAtIDJdO1xuICAgIH1cbiAgfVxuICBsZXQgcmV3aW5kRmlyc3RJbmRleCA9IG51bGw7XG4gIGxldCByZXdpbmRMYXN0SW5kZXggPSBudWxsO1xuICBpZiAocGFyYW1zLnJld2luZCkge1xuICAgIGlmIChzd2lwZXIuaXNCZWdpbm5pbmcpIHtcbiAgICAgIHJld2luZExhc3RJbmRleCA9IHBhcmFtcy52aXJ0dWFsICYmIHBhcmFtcy52aXJ0dWFsLmVuYWJsZWQgJiYgc3dpcGVyLnZpcnR1YWwgPyBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoIC0gMSA6IHN3aXBlci5zbGlkZXMubGVuZ3RoIC0gMTtcbiAgICB9IGVsc2UgaWYgKHN3aXBlci5pc0VuZCkge1xuICAgICAgcmV3aW5kRmlyc3RJbmRleCA9IDA7XG4gICAgfVxuICB9XG4gIC8vIEZpbmQgY3VycmVudCBzbGlkZSBzaXplXG4gIGNvbnN0IHJhdGlvID0gKGN1cnJlbnRQb3MgLSBzbGlkZXNHcmlkW3N0b3BJbmRleF0pIC8gZ3JvdXBTaXplO1xuICBjb25zdCBpbmNyZW1lbnQgPSBzdG9wSW5kZXggPCBwYXJhbXMuc2xpZGVzUGVyR3JvdXBTa2lwIC0gMSA/IDEgOiBwYXJhbXMuc2xpZGVzUGVyR3JvdXA7XG4gIGlmICh0aW1lRGlmZiA+IHBhcmFtcy5sb25nU3dpcGVzTXMpIHtcbiAgICAvLyBMb25nIHRvdWNoZXNcbiAgICBpZiAoIXBhcmFtcy5sb25nU3dpcGVzKSB7XG4gICAgICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIuYWN0aXZlSW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc3dpcGVyLnN3aXBlRGlyZWN0aW9uID09PSAnbmV4dCcpIHtcbiAgICAgIGlmIChyYXRpbyA+PSBwYXJhbXMubG9uZ1N3aXBlc1JhdGlvKSBzd2lwZXIuc2xpZGVUbyhwYXJhbXMucmV3aW5kICYmIHN3aXBlci5pc0VuZCA/IHJld2luZEZpcnN0SW5kZXggOiBzdG9wSW5kZXggKyBpbmNyZW1lbnQpO2Vsc2Ug
5196c3dpcGVyLnNsaWRlVG8oc3RvcEluZGV4KTtcbiAgICB9XG4gICAgaWYgKHN3aXBlci5zd2lwZURpcmVjdGlvbiA9PT0gJ3ByZXYnKSB7XG4gICAgICBpZiAocmF0aW8gPiAxIC0gcGFyYW1zLmxvbmdTd2lwZXNSYXRpbykge1xuICAgICAgICBzd2lwZXIuc2xpZGVUbyhzdG9wSW5kZXggKyBpbmNyZW1lbnQpO1xuICAgICAgfSBlbHNlIGlmIChyZXdpbmRMYXN0SW5kZXggIT09IG51bGwgJiYgcmF0aW8gPCAwICYmIE1hdGguYWJzKHJhdGlvKSA+IHBhcmFtcy5sb25nU3dpcGVzUmF0aW8pIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8ocmV3aW5kTGFzdEluZGV4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXBlci5zbGlkZVRvKHN0b3BJbmRleCk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFNob3J0IHN3aXBlc1xuICAgIGlmICghcGFyYW1zLnNob3J0U3dpcGVzKSB7XG4gICAgICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIuYWN0aXZlSW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc05hdkJ1dHRvblRhcmdldCA9IHN3aXBlci5uYXZpZ2F0aW9uICYmIChlLnRhcmdldCA9PT0gc3dpcGVyLm5hdmlnYXRpb24ubmV4dEVsIHx8IGUudGFyZ2V0ID09PSBzd2lwZXIubmF2aWdhdGlvbi5wcmV2RWwpO1xuICAgIGlmICghaXNOYXZCdXR0b25UYXJnZXQpIHtcbiAgICAgIGlmIChzd2lwZXIuc3dpcGVEaXJlY3Rpb24gPT09ICduZXh0Jykge1xuICAgICAgICBzd2lwZXIuc2xpZGVUbyhyZXdpbmRGaXJzdEluZGV4ICE9PSBudWxsID8gcmV3aW5kRmlyc3RJbmRleCA6IHN0b3BJbmRleCArIGluY3JlbWVudCk7XG4gICAgICB9XG4gICAgICBpZiAoc3dpcGVyLnN3aXBlRGlyZWN0aW9uID09PSAncHJldicpIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8ocmV3aW5kTGFzdEluZGV4ICE9PSBudWxsID8gcmV3aW5kTGFzdEluZGV4IDogc3RvcEluZGV4KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGUudGFyZ2V0ID09PSBzd2lwZXIubmF2aWdhdGlvbi5uZXh0RWwpIHtcbiAgICAgIHN3aXBlci5zbGlkZVRvKHN0b3BJbmRleCArIGluY3JlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXBlci5zbGlkZVRvKHN0b3BJbmRleCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uUmVzaXplKCkge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBjb25zdCB7XG4gICAgcGFyYW1zLFxuICAgIGVsXG4gIH0gPSBzd2lwZXI7XG4gIGlmIChlbCAmJiBlbC5vZmZzZXRXaWR0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIC8vIEJyZWFrcG9pbnRzXG4gIGlmIChwYXJhbXMuYnJlYWtwb2ludHMpIHtcbiAgICBzd2lwZXIuc2V0QnJlYWtwb2ludCgpO1xuICB9XG5cbiAgLy8gU2F2ZSBsb2Nrc1xuICBjb25zdCB7XG4gICAgYWxsb3dTbGlkZU5leHQsXG4gICAgYWxsb3dTbGlkZVByZXYsXG4gICAgc25hcEdyaWRcbiAgfSA9IHN3aXBlcjtcbiAgY29uc3QgaXNWaXJ0dWFsID0gc3dpcGVyLnZpcnR1YWwgJiYgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLmVuYWJsZWQ7XG5cbiAgLy8gRGlzYWJsZSBsb2NrcyBvbiByZXNpemVcbiAgc3dpcGVyLmFsbG93U2xpZGVOZXh0ID0gdHJ1ZTtcbiAgc3dpcGVyLmFsbG93U2xpZGVQcmV2ID0gdHJ1ZTtcbiAgc3dpcGVyLnVwZGF0ZVNpemUoKTtcbiAgc3dpcGVyLnVwZGF0ZVNsaWRlcygpO1xuICBzd2lwZXIudXBkYXRlU2xpZGVzQ2xhc3NlcygpO1xuICBjb25zdCBpc1ZpcnR1YWxMb29wID0gaXNWaXJ0dWFsICYmIHBhcmFtcy5sb29wO1xuICBpZiAoKHBhcmFtcy5zbGlkZXNQZXJWaWV3ID09PSAnYXV0bycgfHwgcGFyYW1zLnNsaWRlc1BlclZpZXcgPiAxKSAmJiBzd2lwZXIuaXNFbmQgJiYgIXN3aXBlci5pc0JlZ2lubmluZyAmJiAhc3dpcGVyLnBhcmFtcy5jZW50ZXJlZFNsaWRlcyAmJiAhaXNWaXJ0dWFsTG9vcCkge1xuICAgIHN3aXBlci5zbGlkZVRvKHN3aXBlci5zbGlkZXMubGVuZ3RoIC0gMSwgMCwgZmFsc2UsIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3AgJiYgIWlzVmlydHVhbCkge1xuICAgICAgc3dpcGVyLnNsaWRlVG9Mb29wKHN3aXBlci5yZWFsSW5kZXgsIDAsIGZhbHNlLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpcGVyLnNsaWRlVG8oc3dpcGVyLmFjdGl2ZUluZGV4LCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuICB9XG4gIGlmIChzd2lwZXIuYXV0b3BsYXkgJiYgc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcgJiYgc3dpcGVyLmF1dG9wbGF5LnBhdXNlZCkge1xuICAgIGNsZWFyVGltZW91dChzd2lwZXIuYXV0b3BsYXkucmVzaXplVGltZW91dCk7XG4gICAgc3dpcGVyLmF1dG9wbGF5LnJlc2l6ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChzd2lwZXIuYXV0b3BsYXkgJiYgc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcgJiYgc3dpcGVyLmF1dG9wbGF5LnBhdXNlZCkge1xuICAgICAgICBzd2lwZXIuYXV0b3BsYXkucmVzdW1lKCk7XG4gICAgICB9XG4gICAgfSwgNTAwKTtcbiAgfVxuICAvLyBSZXR1cm4gbG9ja3MgYWZ0ZXIgcmVzaXplXG4gIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9IGFsbG93U2xpZGVQcmV2O1xuICBzd2lwZXIuYWxsb3dTbGlkZU5leHQgPSBhbGxvd1NsaWRlTmV4dDtcbiAgaWYgKHN3aXBlci5wYXJhbXMud2F0Y2hPdmVyZmxvdyAmJiBzbmFwR3JpZCAhPT0gc3dpcGVyLnNuYXBHcmlkKSB7XG4gICAgc3dpcGVyLmNoZWNrT3ZlcmZsb3coKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgaWYgKCFzd2lwZXIuZW5hYmxlZCkgcmV0dXJuO1xuICBpZiAoIXN3aXBlci5hbGxvd0NsaWNrKSB7XG4gICAgaWYgKHN3aXBlci5wYXJhbXMucHJldmVudENsaWNrcykgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChzd2lwZXIucGFyYW1zLnByZXZlbnRDbGlja3NQcm9wYWdhdGlvbiAmJiBzd2lwZXIuYW5pbWF0aW5nKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gb25TY3JvbGwoKSB7XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IHtcbiAgICB3cmFwcGVyRWwsXG4gICAgcnRsVHJhbnNsYXRlLFxuICAgIGVuYWJsZWRcbiAgfSA9IHN3aXBlcjtcbiAgaWYgKCFlbmFibGVkKSByZXR1cm47XG4gIHN3aXBlci5wcmV2aW91c1RyYW5zbGF0ZSA9IHN3aXBlci50cmFuc2xhdGU7XG4gIGlmIChzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHtcbiAgICBzd2lwZXIudHJhbnNsYXRlID0gLXdyYXBwZXJFbC5zY3JvbGxMZWZ0O1xuICB9IGVsc2Uge1xuICAgIHN3aXBlci50cmFuc2xhdGUgPSAtd3JhcHBlckVsLnNjcm9sbFRvcDtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgaWYgKHN3aXBlci50cmFuc2xhdGUgPT09IDApIHN3aXBlci50cmFuc2xhdGUgPSAwO1xuICBzd2lwZXIudXBkYXRlQWN0aXZlSW5kZXgoKTtcbiAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgbGV0IG5ld1Byb2dyZXNzO1xuICBjb25zdCB0cmFuc2xhdGVzRGlmZiA9IHN3aXBlci5tYXhUcmFuc2xhdGUoKSAtIHN3aXBlci5taW5UcmFuc2xhdGUoKTtcbiAgaWYgKHRyYW5zbGF0ZXNEaWZmID09PSAwKSB7XG4gICAgbmV3
5196UHJvZ3Jlc3MgPSAwO1xuICB9IGVsc2Uge1xuICAgIG5ld1Byb2dyZXNzID0gKHN3aXBlci50cmFuc2xhdGUgLSBzd2lwZXIubWluVHJhbnNsYXRlKCkpIC8gdHJhbnNsYXRlc0RpZmY7XG4gIH1cbiAgaWYgKG5ld1Byb2dyZXNzICE9PSBzd2lwZXIucHJvZ3Jlc3MpIHtcbiAgICBzd2lwZXIudXBkYXRlUHJvZ3Jlc3MocnRsVHJhbnNsYXRlID8gLXN3aXBlci50cmFuc2xhdGUgOiBzd2lwZXIudHJhbnNsYXRlKTtcbiAgfVxuICBzd2lwZXIuZW1pdCgnc2V0VHJhbnNsYXRlJywgc3dpcGVyLnRyYW5zbGF0ZSwgZmFsc2UpO1xufVxuXG5mdW5jdGlvbiBvbkxvYWQoZSkge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBwcm9jZXNzTGF6eVByZWxvYWRlcihzd2lwZXIsIGUudGFyZ2V0KTtcbiAgaWYgKHN3aXBlci5wYXJhbXMuY3NzTW9kZSB8fCBzd2lwZXIucGFyYW1zLnNsaWRlc1BlclZpZXcgIT09ICdhdXRvJyAmJiAhc3dpcGVyLnBhcmFtcy5hdXRvSGVpZ2h0KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHN3aXBlci51cGRhdGUoKTtcbn1cblxuZnVuY3Rpb24gb25Eb2N1bWVudFRvdWNoU3RhcnQoKSB7XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGlmIChzd2lwZXIuZG9jdW1lbnRUb3VjaEhhbmRsZXJQcm9jZWVkZWQpIHJldHVybjtcbiAgc3dpcGVyLmRvY3VtZW50VG91Y2hIYW5kbGVyUHJvY2VlZGVkID0gdHJ1ZTtcbiAgaWYgKHN3aXBlci5wYXJhbXMudG91Y2hSZWxlYXNlT25FZGdlcykge1xuICAgIHN3aXBlci5lbC5zdHlsZS50b3VjaEFjdGlvbiA9ICdhdXRvJztcbiAgfVxufVxuXG5jb25zdCBldmVudHMgPSAoc3dpcGVyLCBtZXRob2QpID0+IHtcbiAgY29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuICBjb25zdCB7XG4gICAgcGFyYW1zLFxuICAgIGVsLFxuICAgIHdyYXBwZXJFbCxcbiAgICBkZXZpY2VcbiAgfSA9IHN3aXBlcjtcbiAgY29uc3QgY2FwdHVyZSA9ICEhcGFyYW1zLm5lc3RlZDtcbiAgY29uc3QgZG9tTWV0aG9kID0gbWV0aG9kID09PSAnb24nID8gJ2FkZEV2ZW50TGlzdGVuZXInIDogJ3JlbW92ZUV2ZW50TGlzdGVuZXInO1xuICBjb25zdCBzd2lwZXJNZXRob2QgPSBtZXRob2Q7XG5cbiAgLy8gVG91Y2ggRXZlbnRzXG4gIGRvY3VtZW50W2RvbU1ldGhvZF0oJ3RvdWNoc3RhcnQnLCBzd2lwZXIub25Eb2N1bWVudFRvdWNoU3RhcnQsIHtcbiAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICBjYXB0dXJlXG4gIH0pO1xuICBlbFtkb21NZXRob2RdKCd0b3VjaHN0YXJ0Jywgc3dpcGVyLm9uVG91Y2hTdGFydCwge1xuICAgIHBhc3NpdmU6IGZhbHNlXG4gIH0pO1xuICBlbFtkb21NZXRob2RdKCdwb2ludGVyZG93bicsIHN3aXBlci5vblRvdWNoU3RhcnQsIHtcbiAgICBwYXNzaXZlOiBmYWxzZVxuICB9KTtcbiAgZG9jdW1lbnRbZG9tTWV0aG9kXSgndG91Y2htb3ZlJywgc3dpcGVyLm9uVG91Y2hNb3ZlLCB7XG4gICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgY2FwdHVyZVxuICB9KTtcbiAgZG9jdW1lbnRbZG9tTWV0aG9kXSgncG9pbnRlcm1vdmUnLCBzd2lwZXIub25Ub3VjaE1vdmUsIHtcbiAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICBjYXB0dXJlXG4gIH0pO1xuICBkb2N1bWVudFtkb21NZXRob2RdKCd0b3VjaGVuZCcsIHN3aXBlci5vblRvdWNoRW5kLCB7XG4gICAgcGFzc2l2ZTogdHJ1ZVxuICB9KTtcbiAgZG9jdW1lbnRbZG9tTWV0aG9kXSgncG9pbnRlcnVwJywgc3dpcGVyLm9uVG91Y2hFbmQsIHtcbiAgICBwYXNzaXZlOiB0cnVlXG4gIH0pO1xuICBkb2N1bWVudFtkb21NZXRob2RdKCdwb2ludGVyY2FuY2VsJywgc3dpcGVyLm9uVG91Y2hFbmQsIHtcbiAgICBwYXNzaXZlOiB0cnVlXG4gIH0pO1xuICBkb2N1bWVudFtkb21NZXRob2RdKCd0b3VjaGNhbmNlbCcsIHN3aXBlci5vblRvdWNoRW5kLCB7XG4gICAgcGFzc2l2ZTogdHJ1ZVxuICB9KTtcbiAgZG9jdW1lbnRbZG9tTWV0aG9kXSgncG9pbnRlcm91dCcsIHN3aXBlci5vblRvdWNoRW5kLCB7XG4gICAgcGFzc2l2ZTogdHJ1ZVxuICB9KTtcbiAgZG9jdW1lbnRbZG9tTWV0aG9kXSgncG9pbnRlcmxlYXZlJywgc3dpcGVyLm9uVG91Y2hFbmQsIHtcbiAgICBwYXNzaXZlOiB0cnVlXG4gIH0pO1xuICBkb2N1bWVudFtkb21NZXRob2RdKCdjb250ZXh0bWVudScsIHN3aXBlci5vblRvdWNoRW5kLCB7XG4gICAgcGFzc2l2ZTogdHJ1ZVxuICB9KTtcblxuICAvLyBQcmV2ZW50IExpbmtzIENsaWNrc1xuICBpZiAocGFyYW1zLnByZXZlbnRDbGlja3MgfHwgcGFyYW1zLnByZXZlbnRDbGlja3NQcm9wYWdhdGlvbikge1xuICAgIGVsW2RvbU1ldGhvZF0oJ2NsaWNrJywgc3dpcGVyLm9uQ2xpY2ssIHRydWUpO1xuICB9XG4gIGlmIChwYXJhbXMuY3NzTW9kZSkge1xuICAgIHdyYXBwZXJFbFtkb21NZXRob2RdKCdzY3JvbGwnLCBzd2lwZXIub25TY3JvbGwpO1xuICB9XG5cbiAgLy8gUmVzaXplIGhhbmRsZXJcbiAgaWYgKHBhcmFtcy51cGRhdGVPbldpbmRvd1Jlc2l6ZSkge1xuICAgIHN3aXBlcltzd2lwZXJNZXRob2RdKGRldmljZS5pb3MgfHwgZGV2aWNlLmFuZHJvaWQgPyAncmVzaXplIG9yaWVudGF0aW9uY2hhbmdlIG9ic2VydmVyVXBkYXRlJyA6ICdyZXNpemUgb2JzZXJ2ZXJVcGRhdGUnLCBvblJlc2l6ZSwgdHJ1ZSk7XG4gIH0gZWxzZSB7XG4gICAgc3dpcGVyW3N3aXBlck1ldGhvZF0oJ29ic2VydmVyVXBkYXRlJywgb25SZXNpemUsIHRydWUpO1xuICB9XG5cbiAgLy8gSW1hZ2VzIGxvYWRlclxuICBlbFtkb21NZXRob2RdKCdsb2FkJywgc3dpcGVyLm9uTG9hZCwge1xuICAgIGNhcHR1cmU6IHRydWVcbiAgfSk7XG59O1xuZnVuY3Rpb24gYXR0YWNoRXZlbnRzKCkge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBjb25zdCB7XG4gICAgcGFyYW1zXG4gIH0gPSBzd2lwZXI7XG4gIHN3aXBlci5vblRvdWNoU3RhcnQgPSBvblRvdWNoU3RhcnQuYmluZChzd2lwZXIpO1xuICBzd2lwZXIub25Ub3VjaE1vdmUgPSBvblRvdWNoTW92ZS5iaW5kKHN3aXBlcik7XG4gIHN3aXBlci5vblRvdWNoRW5kID0gb25Ub3VjaEVuZC5iaW5kKHN3aXBlcik7XG4gIHN3aXBlci5vbkRvY3VtZW50VG91Y2hTdGFydCA9IG9uRG9jdW1lbnRUb3VjaFN0YXJ0LmJpbmQoc3dpcGVyKTtcbiAgaWYgKHBhcmFtcy5jc3NNb2RlKSB7XG4gICAgc3dpcGVyLm9uU2Nyb2xsID0gb25TY3JvbGwuYmluZChzd2lwZXIpO1xuICB9XG4gI
5196HN3aXBlci5vbkNsaWNrID0gb25DbGljay5iaW5kKHN3aXBlcik7XG4gIHN3aXBlci5vbkxvYWQgPSBvbkxvYWQuYmluZChzd2lwZXIpO1xuICBldmVudHMoc3dpcGVyLCAnb24nKTtcbn1cbmZ1bmN0aW9uIGRldGFjaEV2ZW50cygpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgZXZlbnRzKHN3aXBlciwgJ29mZicpO1xufVxudmFyIGV2ZW50cyQxID0ge1xuICBhdHRhY2hFdmVudHMsXG4gIGRldGFjaEV2ZW50c1xufTtcblxuY29uc3QgaXNHcmlkRW5hYmxlZCA9IChzd2lwZXIsIHBhcmFtcykgPT4ge1xuICByZXR1cm4gc3dpcGVyLmdyaWQgJiYgcGFyYW1zLmdyaWQgJiYgcGFyYW1zLmdyaWQucm93cyA+IDE7XG59O1xuZnVuY3Rpb24gc2V0QnJlYWtwb2ludCgpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3Qge1xuICAgIHJlYWxJbmRleCxcbiAgICBpbml0aWFsaXplZCxcbiAgICBwYXJhbXMsXG4gICAgZWxcbiAgfSA9IHN3aXBlcjtcbiAgY29uc3QgYnJlYWtwb2ludHMgPSBwYXJhbXMuYnJlYWtwb2ludHM7XG4gIGlmICghYnJlYWtwb2ludHMgfHwgYnJlYWtwb2ludHMgJiYgT2JqZWN0LmtleXMoYnJlYWtwb2ludHMpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIC8vIEdldCBicmVha3BvaW50IGZvciB3aW5kb3cgd2lkdGggYW5kIHVwZGF0ZSBwYXJhbWV0ZXJzXG4gIGNvbnN0IGJyZWFrcG9pbnQgPSBzd2lwZXIuZ2V0QnJlYWtwb2ludChicmVha3BvaW50cywgc3dpcGVyLnBhcmFtcy5icmVha3BvaW50c0Jhc2UsIHN3aXBlci5lbCk7XG4gIGlmICghYnJlYWtwb2ludCB8fCBzd2lwZXIuY3VycmVudEJyZWFrcG9pbnQgPT09IGJyZWFrcG9pbnQpIHJldHVybjtcbiAgY29uc3QgYnJlYWtwb2ludE9ubHlQYXJhbXMgPSBicmVha3BvaW50IGluIGJyZWFrcG9pbnRzID8gYnJlYWtwb2ludHNbYnJlYWtwb2ludF0gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGJyZWFrcG9pbnRQYXJhbXMgPSBicmVha3BvaW50T25seVBhcmFtcyB8fCBzd2lwZXIub3JpZ2luYWxQYXJhbXM7XG4gIGNvbnN0IHdhc011bHRpUm93ID0gaXNHcmlkRW5hYmxlZChzd2lwZXIsIHBhcmFtcyk7XG4gIGNvbnN0IGlzTXVsdGlSb3cgPSBpc0dyaWRFbmFibGVkKHN3aXBlciwgYnJlYWtwb2ludFBhcmFtcyk7XG4gIGNvbnN0IHdhc0dyYWJDdXJzb3IgPSBzd2lwZXIucGFyYW1zLmdyYWJDdXJzb3I7XG4gIGNvbnN0IGlzR3JhYkN1cnNvciA9IGJyZWFrcG9pbnRQYXJhbXMuZ3JhYkN1cnNvcjtcbiAgY29uc3Qgd2FzRW5hYmxlZCA9IHBhcmFtcy5lbmFibGVkO1xuICBpZiAod2FzTXVsdGlSb3cgJiYgIWlzTXVsdGlSb3cpIHtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKGAke3BhcmFtcy5jb250YWluZXJNb2RpZmllckNsYXNzfWdyaWRgLCBgJHtwYXJhbXMuY29udGFpbmVyTW9kaWZpZXJDbGFzc31ncmlkLWNvbHVtbmApO1xuICAgIHN3aXBlci5lbWl0Q29udGFpbmVyQ2xhc3NlcygpO1xuICB9IGVsc2UgaWYgKCF3YXNNdWx0aVJvdyAmJiBpc011bHRpUm93KSB7XG4gICAgZWwuY2xhc3NMaXN0LmFkZChgJHtwYXJhbXMuY29udGFpbmVyTW9kaWZpZXJDbGFzc31ncmlkYCk7XG4gICAgaWYgKGJyZWFrcG9pbnRQYXJhbXMuZ3JpZC5maWxsICYmIGJyZWFrcG9pbnRQYXJhbXMuZ3JpZC5maWxsID09PSAnY29sdW1uJyB8fCAhYnJlYWtwb2ludFBhcmFtcy5ncmlkLmZpbGwgJiYgcGFyYW1zLmdyaWQuZmlsbCA9PT0gJ2NvbHVtbicpIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoYCR7cGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3N9Z3JpZC1jb2x1bW5gKTtcbiAgICB9XG4gICAgc3dpcGVyLmVtaXRDb250YWluZXJDbGFzc2VzKCk7XG4gIH1cbiAgaWYgKHdhc0dyYWJDdXJzb3IgJiYgIWlzR3JhYkN1cnNvcikge1xuICAgIHN3aXBlci51bnNldEdyYWJDdXJzb3IoKTtcbiAgfSBlbHNlIGlmICghd2FzR3JhYkN1cnNvciAmJiBpc0dyYWJDdXJzb3IpIHtcbiAgICBzd2lwZXIuc2V0R3JhYkN1cnNvcigpO1xuICB9XG5cbiAgLy8gVG9nZ2xlIG5hdmlnYXRpb24sIHBhZ2luYXRpb24sIHNjcm9sbGJhclxuICBbJ25hdmlnYXRpb24nLCAncGFnaW5hdGlvbicsICdzY3JvbGxiYXInXS5mb3JFYWNoKHByb3AgPT4ge1xuICAgIGlmICh0eXBlb2YgYnJlYWtwb2ludFBhcmFtc1twcm9wXSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICBjb25zdCB3YXNNb2R1bGVFbmFibGVkID0gcGFyYW1zW3Byb3BdICYmIHBhcmFtc1twcm9wXS5lbmFibGVkO1xuICAgIGNvbnN0IGlzTW9kdWxlRW5hYmxlZCA9IGJyZWFrcG9pbnRQYXJhbXNbcHJvcF0gJiYgYnJlYWtwb2ludFBhcmFtc1twcm9wXS5lbmFibGVkO1xuICAgIGlmICh3YXNNb2R1bGVFbmFibGVkICYmICFpc01vZHVsZUVuYWJsZWQpIHtcbiAgICAgIHN3aXBlcltwcm9wXS5kaXNhYmxlKCk7XG4gICAgfVxuICAgIGlmICghd2FzTW9kdWxlRW5hYmxlZCAmJiBpc01vZHVsZUVuYWJsZWQpIHtcbiAgICAgIHN3aXBlcltwcm9wXS5lbmFibGUoKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBkaXJlY3Rpb25DaGFuZ2VkID0gYnJlYWtwb2ludFBhcmFtcy5kaXJlY3Rpb24gJiYgYnJlYWtwb2ludFBhcmFtcy5kaXJlY3Rpb24gIT09IHBhcmFtcy5kaXJlY3Rpb247XG4gIGNvbnN0IG5lZWRzUmVMb29wID0gcGFyYW1zLmxvb3AgJiYgKGJyZWFrcG9pbnRQYXJhbXMuc2xpZGVzUGVyVmlldyAhPT0gcGFyYW1zLnNsaWRlc1BlclZpZXcgfHwgZGlyZWN0aW9uQ2hhbmdlZCk7XG4gIGNvbnN0IHdhc0xvb3AgPSBwYXJhbXMubG9vcDtcbiAgaWYgKGRpcmVjdGlvbkNoYW5nZWQgJiYgaW5pdGlhbGl6ZWQpIHtcbiAgICBzd2lwZXIuY2hhbmdlRGlyZWN0aW9uKCk7XG4gIH1cbiAgZXh0ZW5kKHN3aXBlci5wYXJhbXMsIGJyZWFrcG9pbnRQYXJhbXMpO1xuICBjb25zdCBpc0VuYWJsZWQgPSBzd2lwZXIucGFyYW1zLmVuYWJsZWQ7XG4gIGNvbnN0IGhhc0xvb3AgPSBzd2lwZXIucGFyYW1zLmxvb3A7XG4gIE9iamVjdC5hc3NpZ24oc3dpcGVyLCB7XG4gICAgYWxsb3dUb3VjaE1vdmU6IHN3aXBlci5wYXJhbXMuYWxsb3dUb3VjaE1vdmUsXG4gICAgYWxsb3dTbGlkZU5leHQ6IHN3aXBlci5wYXJhbXMuYWxsb3dTbGlkZU5leHQsXG4gICAgYWxsb3dTbGlkZVByZXY6IHN3aXBlci5wYXJhbXMuYWxsb3dTbGlkZVByZXZcbiAgfSk7XG4gIGlmICh3YXNFbmFibGVkICYmICFpc0VuYWJsZWQpIHtcbiAgICBzd2lwZXIuZGlzYWJsZSgpO1xuICB9IGVsc2UgaWYgKCF3YXNFbmFibGVkICYmIGlzRW5hYmxlZCkge1xuICAgIHN3aXBlci5lbmFibGUoKTtcbiAgfVxuICBzd2lwZXIuY3VycmVudEJyZWFrcG9pbnQgPSBicmVha3BvaW50O1xuICBzd2lwZXIuZW1pdCgnX2JlZm9yZUJyZWFrcG9pbnQnLCBicmVha3BvaW50UGFyYW1zKTtcbiAgaWYgKGluaXRpYWxpemVkKSB7XG4gICAgaWYgKG5lZWRzUmVMb29wKSB7XG4gICAgICBzd2lwZXIubG9vcERlc3Ryb3koKTtcbiAgICAgIHN3aXBlci5sb29wQ3JlYXRlKHJlYWxJbmRleCk7XG4gICAgICBzd2lwZXIudXBkYXRlU2xpZGVzKCk7XG4gICAgfSBlbHNlIGlmICghd2FzTG9vcCAmJiBoYXNMb29wKSB7XG4gICAgICBzd2lwZXIubG9vcENyZWF0ZShyZWFsSW5kZXgpO1xuICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlcygpO1xuICAgIH0gZWxzZSBpZiAod2FzTG9vcCAmJiAhaGFzTG9vcCkge1xuICAgICAgc3dpcGVyLmxvb3BEZXN0cm95KCk7XG4gICAgfVxuICB9XG4gI
5196HN3aXBlci5lbWl0KCdicmVha3BvaW50JywgYnJlYWtwb2ludFBhcmFtcyk7XG59XG5cbmZ1bmN0aW9uIGdldEJyZWFrcG9pbnQoYnJlYWtwb2ludHMsIGJhc2UsIGNvbnRhaW5lckVsKSB7XG4gIGlmIChiYXNlID09PSB2b2lkIDApIHtcbiAgICBiYXNlID0gJ3dpbmRvdyc7XG4gIH1cbiAgaWYgKCFicmVha3BvaW50cyB8fCBiYXNlID09PSAnY29udGFpbmVyJyAmJiAhY29udGFpbmVyRWwpIHJldHVybiB1bmRlZmluZWQ7XG4gIGxldCBicmVha3BvaW50ID0gZmFsc2U7XG4gIGNvbnN0IHdpbmRvdyA9IGdldFdpbmRvdygpO1xuICBjb25zdCBjdXJyZW50SGVpZ2h0ID0gYmFzZSA9PT0gJ3dpbmRvdycgPyB3aW5kb3cuaW5uZXJIZWlnaHQgOiBjb250YWluZXJFbC5jbGllbnRIZWlnaHQ7XG4gIGNvbnN0IHBvaW50cyA9IE9iamVjdC5rZXlzKGJyZWFrcG9pbnRzKS5tYXAocG9pbnQgPT4ge1xuICAgIGlmICh0eXBlb2YgcG9pbnQgPT09ICdzdHJpbmcnICYmIHBvaW50LmluZGV4T2YoJ0AnKSA9PT0gMCkge1xuICAgICAgY29uc3QgbWluUmF0aW8gPSBwYXJzZUZsb2F0KHBvaW50LnN1YnN0cigxKSk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGN1cnJlbnRIZWlnaHQgKiBtaW5SYXRpbztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBwb2ludFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBwb2ludCxcbiAgICAgIHBvaW50XG4gICAgfTtcbiAgfSk7XG4gIHBvaW50cy5zb3J0KChhLCBiKSA9PiBwYXJzZUludChhLnZhbHVlLCAxMCkgLSBwYXJzZUludChiLnZhbHVlLCAxMCkpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHBvaW50LFxuICAgICAgdmFsdWVcbiAgICB9ID0gcG9pbnRzW2ldO1xuICAgIGlmIChiYXNlID09PSAnd2luZG93Jykge1xuICAgICAgaWYgKHdpbmRvdy5tYXRjaE1lZGlhKGAobWluLXdpZHRoOiAke3ZhbHVlfXB4KWApLm1hdGNoZXMpIHtcbiAgICAgICAgYnJlYWtwb2ludCA9IHBvaW50O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgPD0gY29udGFpbmVyRWwuY2xpZW50V2lkdGgpIHtcbiAgICAgIGJyZWFrcG9pbnQgPSBwb2ludDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJyZWFrcG9pbnQgfHwgJ21heCc7XG59XG5cbnZhciBicmVha3BvaW50cyA9IHtcbiAgc2V0QnJlYWtwb2ludCxcbiAgZ2V0QnJlYWtwb2ludFxufTtcblxuZnVuY3Rpb24gcHJlcGFyZUNsYXNzZXMoZW50cmllcywgcHJlZml4KSB7XG4gIGNvbnN0IHJlc3VsdENsYXNzZXMgPSBbXTtcbiAgZW50cmllcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIE9iamVjdC5rZXlzKGl0ZW0pLmZvckVhY2goY2xhc3NOYW1lcyA9PiB7XG4gICAgICAgIGlmIChpdGVtW2NsYXNzTmFtZXNdKSB7XG4gICAgICAgICAgcmVzdWx0Q2xhc3Nlcy5wdXNoKHByZWZpeCArIGNsYXNzTmFtZXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgcmVzdWx0Q2xhc3Nlcy5wdXNoKHByZWZpeCArIGl0ZW0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHRDbGFzc2VzO1xufVxuZnVuY3Rpb24gYWRkQ2xhc3NlcygpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3Qge1xuICAgIGNsYXNzTmFtZXMsXG4gICAgcGFyYW1zLFxuICAgIHJ0bCxcbiAgICBlbCxcbiAgICBkZXZpY2VcbiAgfSA9IHN3aXBlcjtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIGNvbnN0IHN1ZmZpeGVzID0gcHJlcGFyZUNsYXNzZXMoWydpbml0aWFsaXplZCcsIHBhcmFtcy5kaXJlY3Rpb24sIHtcbiAgICAnZnJlZS1tb2RlJzogc3dpcGVyLnBhcmFtcy5mcmVlTW9kZSAmJiBwYXJhbXMuZnJlZU1vZGUuZW5hYmxlZFxuICB9LCB7XG4gICAgJ2F1dG9oZWlnaHQnOiBwYXJhbXMuYXV0b0hlaWdodFxuICB9LCB7XG4gICAgJ3J0bCc6IHJ0bFxuICB9LCB7XG4gICAgJ2dyaWQnOiBwYXJhbXMuZ3JpZCAmJiBwYXJhbXMuZ3JpZC5yb3dzID4gMVxuICB9LCB7XG4gICAgJ2dyaWQtY29sdW1uJzogcGFyYW1zLmdyaWQgJiYgcGFyYW1zLmdyaWQucm93cyA+IDEgJiYgcGFyYW1zLmdyaWQuZmlsbCA9PT0gJ2NvbHVtbidcbiAgfSwge1xuICAgICdhbmRyb2lkJzogZGV2aWNlLmFuZHJvaWRcbiAgfSwge1xuICAgICdpb3MnOiBkZXZpY2UuaW9zXG4gIH0sIHtcbiAgICAnY3NzLW1vZGUnOiBwYXJhbXMuY3NzTW9kZVxuICB9LCB7XG4gICAgJ2NlbnRlcmVkJzogcGFyYW1zLmNzc01vZGUgJiYgcGFyYW1zLmNlbnRlcmVkU2xpZGVzXG4gIH0sIHtcbiAgICAnd2F0Y2gtcHJvZ3Jlc3MnOiBwYXJhbXMud2F0Y2hTbGlkZXNQcm9ncmVzc1xuICB9XSwgcGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3MpO1xuICBjbGFzc05hbWVzLnB1c2goLi4uc3VmZml4ZXMpO1xuICBlbC5jbGFzc0xpc3QuYWRkKC4uLmNsYXNzTmFtZXMpO1xuICBzd2lwZXIuZW1pdENvbnRhaW5lckNsYXNzZXMoKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2xhc3NlcygpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3Qge1xuICAgIGVsLFxuICAgIGNsYXNzTmFtZXNcbiAgfSA9IHN3aXBlcjtcbiAgZWwuY2xhc3NMaXN0LnJlbW92ZSguLi5jbGFzc05hbWVzKTtcbiAgc3dpcGVyLmVtaXRDb250YWluZXJDbGFzc2VzKCk7XG59XG5cbnZhciBjbGFzc2VzID0ge1xuICBhZGRDbGFzc2VzLFxuICByZW1vdmVDbGFzc2VzXG59O1xuXG5mdW5jdGlvbiBjaGVja092ZXJmbG93KCkge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBjb25zdCB7XG4gICAgaXNMb2NrZWQ6IHdhc0xvY2tlZCxcbiAgICBwYXJhbXNcbiAgfSA9IHN3aXBlcjtcbiAgY29uc3Qge1xuICAgIHNsaWRlc09mZnNldEJlZm9yZVxuICB9ID0gcGFyYW1zO1xuICBpZiAoc2xpZGVzT2Zmc2V0QmVmb3JlKSB7XG4gICAgY29uc3QgbGFzdFNsaWRlSW5kZXggPSBzd2lwZXIuc2xpZGVzLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgbGFzdFNsaWRlUmlnaHRFZGdlID0gc3dpcGVyLnNsaWRlc0dyaWRbbGFzdFNsaWRlSW5kZXhdICsgc3dpcGVyLnNsaWRlc1NpemVzR3JpZFtsYXN0U2xpZGVJbmRleF0gKyBzbGlkZXNPZmZzZXRCZWZvcmUgKiAyO1xuICAgIHN3aXBlci5pc0xvY2tlZCA9IHN3aXBlci5zaXplID4gbGFzdFNsaWRlUmlnaHRFZGdlO1xuICB9IGVsc2Uge1xuICAgIHN3aXBlci5pc0xvY2tlZCA9IHN3aXBlci5zbmFwR3JpZC5sZW5ndGggPT09IDE7XG4gIH1cbiAgaWYgKHBhcmFtcy5hbGxvd1NsaWRlTmV4dCA9PT0gdHJ1ZSkge1xuICAgIHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9ICFzd2lwZXIuaXNMb2NrZWQ7XG4gIH1cbiAgaWYgKHBhcmFtcy5hbGxvd1NsaWRlUHJldiA9PT0gdHJ1ZSkge1xuICAgIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9ICFzd2lwZXIuaXNMb2NrZWQ7XG4gIH1cbiAgaWYgKHdhc0xvY2tlZCAmJiB3YXNMb2NrZWQgIT09I
5196HN3aXBlci5pc0xvY2tlZCkge1xuICAgIHN3aXBlci5pc0VuZCA9IGZhbHNlO1xuICB9XG4gIGlmICh3YXNMb2NrZWQgIT09IHN3aXBlci5pc0xvY2tlZCkge1xuICAgIHN3aXBlci5lbWl0KHN3aXBlci5pc0xvY2tlZCA/ICdsb2NrJyA6ICd1bmxvY2snKTtcbiAgfVxufVxudmFyIGNoZWNrT3ZlcmZsb3ckMSA9IHtcbiAgY2hlY2tPdmVyZmxvd1xufTtcblxudmFyIGRlZmF1bHRzID0ge1xuICBpbml0OiB0cnVlLFxuICBkaXJlY3Rpb246ICdob3Jpem9udGFsJyxcbiAgb25lV2F5TW92ZW1lbnQ6IGZhbHNlLFxuICBzd2lwZXJFbGVtZW50Tm9kZU5hbWU6ICdTV0lQRVItQ09OVEFJTkVSJyxcbiAgdG91Y2hFdmVudHNUYXJnZXQ6ICd3cmFwcGVyJyxcbiAgaW5pdGlhbFNsaWRlOiAwLFxuICBzcGVlZDogMzAwLFxuICBjc3NNb2RlOiBmYWxzZSxcbiAgdXBkYXRlT25XaW5kb3dSZXNpemU6IHRydWUsXG4gIHJlc2l6ZU9ic2VydmVyOiB0cnVlLFxuICBuZXN0ZWQ6IGZhbHNlLFxuICBjcmVhdGVFbGVtZW50czogZmFsc2UsXG4gIGV2ZW50c1ByZWZpeDogJ3N3aXBlcicsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIGZvY3VzYWJsZUVsZW1lbnRzOiAnaW5wdXQsIHNlbGVjdCwgb3B0aW9uLCB0ZXh0YXJlYSwgYnV0dG9uLCB2aWRlbywgbGFiZWwnLFxuICAvLyBPdmVycmlkZXNcbiAgd2lkdGg6IG51bGwsXG4gIGhlaWdodDogbnVsbCxcbiAgLy9cbiAgcHJldmVudEludGVyYWN0aW9uT25UcmFuc2l0aW9uOiBmYWxzZSxcbiAgLy8gc3NyXG4gIHVzZXJBZ2VudDogbnVsbCxcbiAgdXJsOiBudWxsLFxuICAvLyBUbyBzdXBwb3J0IGlPUydzIHN3aXBlLXRvLWdvLWJhY2sgZ2VzdHVyZSAod2hlbiBiZWluZyB1c2VkIGluLWFwcCkuXG4gIGVkZ2VTd2lwZURldGVjdGlvbjogZmFsc2UsXG4gIGVkZ2VTd2lwZVRocmVzaG9sZDogMjAsXG4gIC8vIEF1dG9oZWlnaHRcbiAgYXV0b0hlaWdodDogZmFsc2UsXG4gIC8vIFNldCB3cmFwcGVyIHdpZHRoXG4gIHNldFdyYXBwZXJTaXplOiBmYWxzZSxcbiAgLy8gVmlydHVhbCBUcmFuc2xhdGVcbiAgdmlydHVhbFRyYW5zbGF0ZTogZmFsc2UsXG4gIC8vIEVmZmVjdHNcbiAgZWZmZWN0OiAnc2xpZGUnLFxuICAvLyAnc2xpZGUnIG9yICdmYWRlJyBvciAnY3ViZScgb3IgJ2NvdmVyZmxvdycgb3IgJ2ZsaXAnXG5cbiAgLy8gQnJlYWtwb2ludHNcbiAgYnJlYWtwb2ludHM6IHVuZGVmaW5lZCxcbiAgYnJlYWtwb2ludHNCYXNlOiAnd2luZG93JyxcbiAgLy8gU2xpZGVzIGdyaWRcbiAgc3BhY2VCZXR3ZWVuOiAwLFxuICBzbGlkZXNQZXJWaWV3OiAxLFxuICBzbGlkZXNQZXJHcm91cDogMSxcbiAgc2xpZGVzUGVyR3JvdXBTa2lwOiAwLFxuICBzbGlkZXNQZXJHcm91cEF1dG86IGZhbHNlLFxuICBjZW50ZXJlZFNsaWRlczogZmFsc2UsXG4gIGNlbnRlcmVkU2xpZGVzQm91bmRzOiBmYWxzZSxcbiAgc2xpZGVzT2Zmc2V0QmVmb3JlOiAwLFxuICAvLyBpbiBweFxuICBzbGlkZXNPZmZzZXRBZnRlcjogMCxcbiAgLy8gaW4gcHhcbiAgbm9ybWFsaXplU2xpZGVJbmRleDogdHJ1ZSxcbiAgY2VudGVySW5zdWZmaWNpZW50U2xpZGVzOiBmYWxzZSxcbiAgLy8gRGlzYWJsZSBzd2lwZXIgYW5kIGhpZGUgbmF2aWdhdGlvbiB3aGVuIGNvbnRhaW5lciBub3Qgb3ZlcmZsb3dcbiAgd2F0Y2hPdmVyZmxvdzogdHJ1ZSxcbiAgLy8gUm91bmQgbGVuZ3RoXG4gIHJvdW5kTGVuZ3RoczogZmFsc2UsXG4gIC8vIFRvdWNoZXNcbiAgdG91Y2hSYXRpbzogMSxcbiAgdG91Y2hBbmdsZTogNDUsXG4gIHNpbXVsYXRlVG91Y2g6IHRydWUsXG4gIHNob3J0U3dpcGVzOiB0cnVlLFxuICBsb25nU3dpcGVzOiB0cnVlLFxuICBsb25nU3dpcGVzUmF0aW86IDAuNSxcbiAgbG9uZ1N3aXBlc01zOiAzMDAsXG4gIGZvbGxvd0ZpbmdlcjogdHJ1ZSxcbiAgYWxsb3dUb3VjaE1vdmU6IHRydWUsXG4gIHRocmVzaG9sZDogNSxcbiAgdG91Y2hNb3ZlU3RvcFByb3BhZ2F0aW9uOiBmYWxzZSxcbiAgdG91Y2hTdGFydFByZXZlbnREZWZhdWx0OiB0cnVlLFxuICB0b3VjaFN0YXJ0Rm9yY2VQcmV2ZW50RGVmYXVsdDogZmFsc2UsXG4gIHRvdWNoUmVsZWFzZU9uRWRnZXM6IGZhbHNlLFxuICAvLyBVbmlxdWUgTmF2aWdhdGlvbiBFbGVtZW50c1xuICB1bmlxdWVOYXZFbGVtZW50czogdHJ1ZSxcbiAgLy8gUmVzaXN0YW5jZVxuICByZXNpc3RhbmNlOiB0cnVlLFxuICByZXNpc3RhbmNlUmF0aW86IDAuODUsXG4gIC8vIFByb2dyZXNzXG4gIHdhdGNoU2xpZGVzUHJvZ3Jlc3M6IGZhbHNlLFxuICAvLyBDdXJzb3JcbiAgZ3JhYkN1cnNvcjogZmFsc2UsXG4gIC8vIENsaWNrc1xuICBwcmV2ZW50Q2xpY2tzOiB0cnVlLFxuICBwcmV2ZW50Q2xpY2tzUHJvcGFnYXRpb246IHRydWUsXG4gIHNsaWRlVG9DbGlja2VkU2xpZGU6IGZhbHNlLFxuICAvLyBsb29wXG4gIGxvb3A6IGZhbHNlLFxuICBsb29wQWRkQmxhbmtTbGlkZXM6IHRydWUsXG4gIGxvb3BBZGRpdGlvbmFsU2xpZGVzOiAwLFxuICBsb29wUHJldmVudHNTbGlkaW5nOiB0cnVlLFxuICAvLyByZXdpbmRcbiAgcmV3aW5kOiBmYWxzZSxcbiAgLy8gU3dpcGluZy9ubyBzd2lwaW5nXG4gIGFsbG93U2xpZGVQcmV2OiB0cnVlLFxuICBhbGxvd1NsaWRlTmV4dDogdHJ1ZSxcbiAgc3dpcGVIYW5kbGVyOiBudWxsLFxuICAvLyAnLnN3aXBlLWhhbmRsZXInLFxuICBub1N3aXBpbmc6IHRydWUsXG4gIG5vU3dpcGluZ0NsYXNzOiAnc3dpcGVyLW5vLXN3aXBpbmcnLFxuICBub1N3aXBpbmdTZWxlY3RvcjogbnVsbCxcbiAgLy8gUGFzc2l2ZSBMaXN0ZW5lcnNcbiAgcGFzc2l2ZUxpc3RlbmVyczogdHJ1ZSxcbiAgbWF4QmFja2ZhY2VIaWRkZW5TbGlkZXM6IDEwLFxuICAvLyBOU1xuICBjb250YWluZXJNb2RpZmllckNsYXNzOiAnc3dpcGVyLScsXG4gIC8vIE5FV1xuICBzbGlkZUNsYXNzOiAnc3dpcGVyLXNsaWRlJyxcbiAgc2xpZGVCbGFua0NsYXNzOiAnc3dpcGVyLXNsaWRlLWJsYW5rJyxcbiAgc2xpZGVBY3RpdmVDbGFzczogJ3N3aXBlci1zbGlkZS1hY3RpdmUnLFxuICBzbGlkZVZpc2libGVDbGFzczogJ3N3aXBlci1zbGlkZS12aXNpYmxlJyxcbiAgc2xpZGVGdWxseVZpc2libGVDbGFzczogJ3N3aXBlci1zbGlkZS1mdWxseS12aXNpYmxlJyxcbiAgc2xpZGVOZXh0Q2xhc3M6ICdzd2lwZXItc2xpZGUtbmV4dCcsXG4gIHNsaWRlUHJldkNsYXNzOiAnc3dpcGVyLXNsaWRlLXByZXYnLFxuICB3cmFwcGVyQ2xhc3M6ICdzd2lwZXItd3JhcHBlcicsXG4gIGxhenlQcmVsb2FkZXJDbGFzczogJ3N3aXBlci1sYXp5LXByZWxvYWRlcicsXG4gIGxhenlQcmVsb2FkUHJldk5leHQ6IDAsXG4gIC8vIENhbGxiYWNrc1xuICBydW5DYWxsYmFja3NPbkluaXQ6IHRydWUsXG4gIC8vIEludGVybmFsc1xuICBfZW1pdENsYXNzZXM6IGZhbHNlXG59O1xuXG5mdW5jdGlvbiBtb2R1bGVFeHRlbmRQYXJhbXMocGFyYW1zLCBhbGxNb2R1bGVzUGFyYW1zKSB7XG4gIHJldHVybi
5196BmdW5jdGlvbiBleHRlbmRQYXJhbXMob2JqKSB7XG4gICAgaWYgKG9iaiA9PT0gdm9pZCAwKSB7XG4gICAgICBvYmogPSB7fTtcbiAgICB9XG4gICAgY29uc3QgbW9kdWxlUGFyYW1OYW1lID0gT2JqZWN0LmtleXMob2JqKVswXTtcbiAgICBjb25zdCBtb2R1bGVQYXJhbXMgPSBvYmpbbW9kdWxlUGFyYW1OYW1lXTtcbiAgICBpZiAodHlwZW9mIG1vZHVsZVBhcmFtcyAhPT0gJ29iamVjdCcgfHwgbW9kdWxlUGFyYW1zID09PSBudWxsKSB7XG4gICAgICBleHRlbmQoYWxsTW9kdWxlc1BhcmFtcywgb2JqKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdID09PSB0cnVlKSB7XG4gICAgICBwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXSA9IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG1vZHVsZVBhcmFtTmFtZSA9PT0gJ25hdmlnYXRpb24nICYmIHBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdICYmIHBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdLmVuYWJsZWQgJiYgIXBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdLnByZXZFbCAmJiAhcGFyYW1zW21vZHVsZVBhcmFtTmFtZV0ubmV4dEVsKSB7XG4gICAgICBwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXS5hdXRvID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFsncGFnaW5hdGlvbicsICdzY3JvbGxiYXInXS5pbmRleE9mKG1vZHVsZVBhcmFtTmFtZSkgPj0gMCAmJiBwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXSAmJiBwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXS5lbmFibGVkICYmICFwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXS5lbCkge1xuICAgICAgcGFyYW1zW21vZHVsZVBhcmFtTmFtZV0uYXV0byA9IHRydWU7XG4gICAgfVxuICAgIGlmICghKG1vZHVsZVBhcmFtTmFtZSBpbiBwYXJhbXMgJiYgJ2VuYWJsZWQnIGluIG1vZHVsZVBhcmFtcykpIHtcbiAgICAgIGV4dGVuZChhbGxNb2R1bGVzUGFyYW1zLCBvYmopO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdID09PSAnb2JqZWN0JyAmJiAhKCdlbmFibGVkJyBpbiBwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXSkpIHtcbiAgICAgIHBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdLmVuYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdKSBwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXSA9IHtcbiAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgfTtcbiAgICBleHRlbmQoYWxsTW9kdWxlc1BhcmFtcywgb2JqKTtcbiAgfTtcbn1cblxuLyogZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOiBcIm9mZlwiICovXG5jb25zdCBwcm90b3R5cGVzID0ge1xuICBldmVudHNFbWl0dGVyLFxuICB1cGRhdGUsXG4gIHRyYW5zbGF0ZSxcbiAgdHJhbnNpdGlvbixcbiAgc2xpZGUsXG4gIGxvb3AsXG4gIGdyYWJDdXJzb3IsXG4gIGV2ZW50czogZXZlbnRzJDEsXG4gIGJyZWFrcG9pbnRzLFxuICBjaGVja092ZXJmbG93OiBjaGVja092ZXJmbG93JDEsXG4gIGNsYXNzZXNcbn07XG5jb25zdCBleHRlbmRlZERlZmF1bHRzID0ge307XG5jbGFzcyBTd2lwZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBsZXQgZWw7XG4gICAgbGV0IHBhcmFtcztcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiBhcmdzWzBdLmNvbnN0cnVjdG9yICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmdzWzBdKS5zbGljZSg4LCAtMSkgPT09ICdPYmplY3QnKSB7XG4gICAgICBwYXJhbXMgPSBhcmdzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBbZWwsIHBhcmFtc10gPSBhcmdzO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcykgcGFyYW1zID0ge307XG4gICAgcGFyYW1zID0gZXh0ZW5kKHt9LCBwYXJhbXMpO1xuICAgIGlmIChlbCAmJiAhcGFyYW1zLmVsKSBwYXJhbXMuZWwgPSBlbDtcbiAgICBjb25zdCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7XG4gICAgaWYgKHBhcmFtcy5lbCAmJiB0eXBlb2YgcGFyYW1zLmVsID09PSAnc3RyaW5nJyAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHBhcmFtcy5lbCkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3Qgc3dpcGVycyA9IFtdO1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwYXJhbXMuZWwpLmZvckVhY2goY29udGFpbmVyRWwgPT4ge1xuICAgICAgICBjb25zdCBuZXdQYXJhbXMgPSBleHRlbmQoe30sIHBhcmFtcywge1xuICAgICAgICAgIGVsOiBjb250YWluZXJFbFxuICAgICAgICB9KTtcbiAgICAgICAgc3dpcGVycy5wdXNoKG5ldyBTd2lwZXIobmV3UGFyYW1zKSk7XG4gICAgICB9KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdHJ1Y3Rvci1yZXR1cm5cbiAgICAgIHJldHVybiBzd2lwZXJzO1xuICAgIH1cblxuICAgIC8vIFN3aXBlciBJbnN0YW5jZVxuICAgIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gICAgc3dpcGVyLl9fc3dpcGVyX18gPSB0cnVlO1xuICAgIHN3aXBlci5zdXBwb3J0ID0gZ2V0U3VwcG9ydCgpO1xuICAgIHN3aXBlci5kZXZpY2UgPSBnZXREZXZpY2Uoe1xuICAgICAgdXNlckFnZW50OiBwYXJhbXMudXNlckFnZW50XG4gICAgfSk7XG4gICAgc3dpcGVyLmJyb3dzZXIgPSBnZXRCcm93c2VyKCk7XG4gICAgc3dpcGVyLmV2ZW50c0xpc3RlbmVycyA9IHt9O1xuICAgIHN3aXBlci5ldmVudHNBbnlMaXN0ZW5lcnMgPSBbXTtcbiAgICBzd2lwZXIubW9kdWxlcyA9IFsuLi5zd2lwZXIuX19tb2R1bGVzX19dO1xuICAgIGlmIChwYXJhbXMubW9kdWxlcyAmJiBBcnJheS5pc0FycmF5KHBhcmFtcy5tb2R1bGVzKSkge1xuICAgICAgc3dpcGVyLm1vZHVsZXMucHVzaCguLi5wYXJhbXMubW9kdWxlcyk7XG4gICAgfVxuICAgIGNvbnN0IGFsbE1vZHVsZXNQYXJhbXMgPSB7fTtcbiAgICBzd2lwZXIubW9kdWxlcy5mb3JFYWNoKG1vZCA9PiB7XG4gICAgICBtb2Qoe1xuICAgICAgICBwYXJhbXMsXG4gICAgICAgI
5196HN3aXBlcixcbiAgICAgICAgZXh0ZW5kUGFyYW1zOiBtb2R1bGVFeHRlbmRQYXJhbXMocGFyYW1zLCBhbGxNb2R1bGVzUGFyYW1zKSxcbiAgICAgICAgb246IHN3aXBlci5vbi5iaW5kKHN3aXBlciksXG4gICAgICAgIG9uY2U6IHN3aXBlci5vbmNlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgb2ZmOiBzd2lwZXIub2ZmLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgZW1pdDogc3dpcGVyLmVtaXQuYmluZChzd2lwZXIpXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEV4dGVuZCBkZWZhdWx0cyB3aXRoIG1vZHVsZXMgcGFyYW1zXG4gICAgY29uc3Qgc3dpcGVyUGFyYW1zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgYWxsTW9kdWxlc1BhcmFtcyk7XG5cbiAgICAvLyBFeHRlbmQgZGVmYXVsdHMgd2l0aCBwYXNzZWQgcGFyYW1zXG4gICAgc3dpcGVyLnBhcmFtcyA9IGV4dGVuZCh7fSwgc3dpcGVyUGFyYW1zLCBleHRlbmRlZERlZmF1bHRzLCBwYXJhbXMpO1xuICAgIHN3aXBlci5vcmlnaW5hbFBhcmFtcyA9IGV4dGVuZCh7fSwgc3dpcGVyLnBhcmFtcyk7XG4gICAgc3dpcGVyLnBhc3NlZFBhcmFtcyA9IGV4dGVuZCh7fSwgcGFyYW1zKTtcblxuICAgIC8vIGFkZCBldmVudCBsaXN0ZW5lcnNcbiAgICBpZiAoc3dpcGVyLnBhcmFtcyAmJiBzd2lwZXIucGFyYW1zLm9uKSB7XG4gICAgICBPYmplY3Qua2V5cyhzd2lwZXIucGFyYW1zLm9uKS5mb3JFYWNoKGV2ZW50TmFtZSA9PiB7XG4gICAgICAgIHN3aXBlci5vbihldmVudE5hbWUsIHN3aXBlci5wYXJhbXMub25bZXZlbnROYW1lXSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHN3aXBlci5wYXJhbXMgJiYgc3dpcGVyLnBhcmFtcy5vbkFueSkge1xuICAgICAgc3dpcGVyLm9uQW55KHN3aXBlci5wYXJhbXMub25BbnkpO1xuICAgIH1cblxuICAgIC8vIEV4dGVuZCBTd2lwZXJcbiAgICBPYmplY3QuYXNzaWduKHN3aXBlciwge1xuICAgICAgZW5hYmxlZDogc3dpcGVyLnBhcmFtcy5lbmFibGVkLFxuICAgICAgZWwsXG4gICAgICAvLyBDbGFzc2VzXG4gICAgICBjbGFzc05hbWVzOiBbXSxcbiAgICAgIC8vIFNsaWRlc1xuICAgICAgc2xpZGVzOiBbXSxcbiAgICAgIHNsaWRlc0dyaWQ6IFtdLFxuICAgICAgc25hcEdyaWQ6IFtdLFxuICAgICAgc2xpZGVzU2l6ZXNHcmlkOiBbXSxcbiAgICAgIC8vIGlzRGlyZWN0aW9uXG4gICAgICBpc0hvcml6b250YWwoKSB7XG4gICAgICAgIHJldHVybiBzd2lwZXIucGFyYW1zLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnO1xuICAgICAgfSxcbiAgICAgIGlzVmVydGljYWwoKSB7XG4gICAgICAgIHJldHVybiBzd2lwZXIucGFyYW1zLmRpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJztcbiAgICAgIH0sXG4gICAgICAvLyBJbmRleGVzXG4gICAgICBhY3RpdmVJbmRleDogMCxcbiAgICAgIHJlYWxJbmRleDogMCxcbiAgICAgIC8vXG4gICAgICBpc0JlZ2lubmluZzogdHJ1ZSxcbiAgICAgIGlzRW5kOiBmYWxzZSxcbiAgICAgIC8vIFByb3BzXG4gICAgICB0cmFuc2xhdGU6IDAsXG4gICAgICBwcmV2aW91c1RyYW5zbGF0ZTogMCxcbiAgICAgIHByb2dyZXNzOiAwLFxuICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICBhbmltYXRpbmc6IGZhbHNlLFxuICAgICAgY3NzT3ZlcmZsb3dBZGp1c3RtZW50KCkge1xuICAgICAgICAvLyBSZXR1cm5zIDAgdW5sZXNzIGB0cmFuc2xhdGVgIGlzID4gMioqMjNcbiAgICAgICAgLy8gU2hvdWxkIGJlIHN1YnRyYWN0ZWQgZnJvbSBjc3MgdmFsdWVzIHRvIHByZXZlbnQgb3ZlcmZsb3dcbiAgICAgICAgcmV0dXJuIE1hdGgudHJ1bmModGhpcy50cmFuc2xhdGUgLyAyICoqIDIzKSAqIDIgKiogMjM7XG4gICAgICB9LFxuICAgICAgLy8gTG9ja3NcbiAgICAgIGFsbG93U2xpZGVOZXh0OiBzd2lwZXIucGFyYW1zLmFsbG93U2xpZGVOZXh0LFxuICAgICAgYWxsb3dTbGlkZVByZXY6IHN3aXBlci5wYXJhbXMuYWxsb3dTbGlkZVByZXYsXG4gICAgICAvLyBUb3VjaCBFdmVudHNcbiAgICAgIHRvdWNoRXZlbnRzRGF0YToge1xuICAgICAgICBpc1RvdWNoZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgaXNNb3ZlZDogdW5kZWZpbmVkLFxuICAgICAgICBhbGxvd1RvdWNoQ2FsbGJhY2tzOiB1bmRlZmluZWQsXG4gICAgICAgIHRvdWNoU3RhcnRUaW1lOiB1bmRlZmluZWQsXG4gICAgICAgIGlzU2Nyb2xsaW5nOiB1bmRlZmluZWQsXG4gICAgICAgIGN1cnJlbnRUcmFuc2xhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhcnRUcmFuc2xhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgYWxsb3dUaHJlc2hvbGRNb3ZlOiB1bmRlZmluZWQsXG4gICAgICAgIC8vIEZvcm0gZWxlbWVudHMgdG8gbWF0Y2hcbiAgICAgICAgZm9jdXNhYmxlRWxlbWVudHM6IHN3aXBlci5wYXJhbXMuZm9jdXNhYmxlRWxlbWVudHMsXG4gICAgICAgIC8vIExhc3QgY2xpY2sgdGltZVxuICAgICAgICBsYXN0Q2xpY2tUaW1lOiAwLFxuICAgICAgICBjbGlja1RpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgLy8gVmVsb2NpdGllc1xuICAgICAgICB2ZWxvY2l0aWVzOiBbXSxcbiAgICAgICAgYWxsb3dNb21lbnR1bUJvdW5jZTogdW5kZWZpbmVkLFxuICAgICAgICBzdGFydE1vdmluZzogdW5kZWZpbmVkLFxuICAgICAgICBwb2ludGVySWQ6IG51bGwsXG4gICAgICAgIHRvdWNoSWQ6IG51bGxcbiAgICAgIH0sXG4gICAgICAvLyBDbGlja3NcbiAgICAgIGFsbG93Q2xpY2s6IHRydWUsXG4gICAgICAvLyBUb3VjaGVzXG4gICAgICBhbGxvd1RvdWNoTW92ZTogc3dpcGVyLnBhcmFtcy5hbGxvd1RvdWNoTW92ZSxcbiAgICAgIHRvdWNoZXM6IHtcbiAgICAgICAgc3RhcnRYOiAwLFxuICAgICAgICBzdGFydFk6IDAsXG4gICAgICAgIGN1cnJlbnRYOiAwLFxuICAgICAgICBjdXJyZW50WTogMCxcbiAgICAgICAgZGlmZjogMFxuICAgICAgfSxcbiAgICAgIC8vIEltYWdlc1xuICAgICAgaW1hZ2VzVG9Mb2FkOiBbXSxcbiAgICAgIGltYWdlc0xvYWRlZDogMFxuICAgIH0pO1xuICAgIHN3aXBlci5lbWl0KCdfc3dpcGVyJyk7XG5cbiAgICAvLyBJbml0XG4gICAgaWYgKHN3aXBlci5wYXJhbXMuaW5pdCkge1xuICAgICAgc3dpcGVyLmluaXQoKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYXBwIGluc3RhbmNlXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0cnVjdG9yLXJldHVyblxuICAgI
5196HJldHVybiBzd2lwZXI7XG4gIH1cbiAgZ2V0RGlyZWN0aW9uTGFiZWwocHJvcGVydHkpIHtcbiAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgcmV0dXJuIHByb3BlcnR5O1xuICAgIH1cbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICByZXR1cm4ge1xuICAgICAgJ3dpZHRoJzogJ2hlaWdodCcsXG4gICAgICAnbWFyZ2luLXRvcCc6ICdtYXJnaW4tbGVmdCcsXG4gICAgICAnbWFyZ2luLWJvdHRvbSAnOiAnbWFyZ2luLXJpZ2h0JyxcbiAgICAgICdtYXJnaW4tbGVmdCc6ICdtYXJnaW4tdG9wJyxcbiAgICAgICdtYXJnaW4tcmlnaHQnOiAnbWFyZ2luLWJvdHRvbScsXG4gICAgICAncGFkZGluZy1sZWZ0JzogJ3BhZGRpbmctdG9wJyxcbiAgICAgICdwYWRkaW5nLXJpZ2h0JzogJ3BhZGRpbmctYm90dG9tJyxcbiAgICAgICdtYXJnaW5SaWdodCc6ICdtYXJnaW5Cb3R0b20nXG4gICAgfVtwcm9wZXJ0eV07XG4gIH1cbiAgZ2V0U2xpZGVJbmRleChzbGlkZUVsKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2xpZGVzRWwsXG4gICAgICBwYXJhbXNcbiAgICB9ID0gdGhpcztcbiAgICBjb25zdCBzbGlkZXMgPSBlbGVtZW50Q2hpbGRyZW4oc2xpZGVzRWwsIGAuJHtwYXJhbXMuc2xpZGVDbGFzc30sIHN3aXBlci1zbGlkZWApO1xuICAgIGNvbnN0IGZpcnN0U2xpZGVJbmRleCA9IGVsZW1lbnRJbmRleChzbGlkZXNbMF0pO1xuICAgIHJldHVybiBlbGVtZW50SW5kZXgoc2xpZGVFbCkgLSBmaXJzdFNsaWRlSW5kZXg7XG4gIH1cbiAgZ2V0U2xpZGVJbmRleEJ5RGF0YShpbmRleCkge1xuICAgIHJldHVybiB0aGlzLmdldFNsaWRlSW5kZXgodGhpcy5zbGlkZXMuZmlsdGVyKHNsaWRlRWwgPT4gc2xpZGVFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JykgKiAxID09PSBpbmRleClbMF0pO1xuICB9XG4gIHJlY2FsY1NsaWRlcygpIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICAgIGNvbnN0IHtcbiAgICAgIHNsaWRlc0VsLFxuICAgICAgcGFyYW1zXG4gICAgfSA9IHN3aXBlcjtcbiAgICBzd2lwZXIuc2xpZGVzID0gZWxlbWVudENoaWxkcmVuKHNsaWRlc0VsLCBgLiR7cGFyYW1zLnNsaWRlQ2xhc3N9LCBzd2lwZXItc2xpZGVgKTtcbiAgfVxuICBlbmFibGUoKSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgICBpZiAoc3dpcGVyLmVuYWJsZWQpIHJldHVybjtcbiAgICBzd2lwZXIuZW5hYmxlZCA9IHRydWU7XG4gICAgaWYgKHN3aXBlci5wYXJhbXMuZ3JhYkN1cnNvcikge1xuICAgICAgc3dpcGVyLnNldEdyYWJDdXJzb3IoKTtcbiAgICB9XG4gICAgc3dpcGVyLmVtaXQoJ2VuYWJsZScpO1xuICB9XG4gIGRpc2FibGUoKSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgICBpZiAoIXN3aXBlci5lbmFibGVkKSByZXR1cm47XG4gICAgc3dpcGVyLmVuYWJsZWQgPSBmYWxzZTtcbiAgICBpZiAoc3dpcGVyLnBhcmFtcy5ncmFiQ3Vyc29yKSB7XG4gICAgICBzd2lwZXIudW5zZXRHcmFiQ3Vyc29yKCk7XG4gICAgfVxuICAgIHN3aXBlci5lbWl0KCdkaXNhYmxlJyk7XG4gIH1cbiAgc2V0UHJvZ3Jlc3MocHJvZ3Jlc3MsIHNwZWVkKSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgICBwcm9ncmVzcyA9IE1hdGgubWluKE1hdGgubWF4KHByb2dyZXNzLCAwKSwgMSk7XG4gICAgY29uc3QgbWluID0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpO1xuICAgIGNvbnN0IG1heCA9IHN3aXBlci5tYXhUcmFuc2xhdGUoKTtcbiAgICBjb25zdCBjdXJyZW50ID0gKG1heCAtIG1pbikgKiBwcm9ncmVzcyArIG1pbjtcbiAgICBzd2lwZXIudHJhbnNsYXRlVG8oY3VycmVudCwgdHlwZW9mIHNwZWVkID09PSAndW5kZWZpbmVkJyA/IDAgOiBzcGVlZCk7XG4gICAgc3dpcGVyLnVwZGF0ZUFjdGl2ZUluZGV4KCk7XG4gICAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgfVxuICBlbWl0Q29udGFpbmVyQ2xhc3NlcygpIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICAgIGlmICghc3dpcGVyLnBhcmFtcy5fZW1pdENsYXNzZXMgfHwgIXN3aXBlci5lbCkgcmV0dXJuO1xuICAgIGNvbnN0IGNscyA9IHN3aXBlci5lbC5jbGFzc05hbWUuc3BsaXQoJyAnKS5maWx0ZXIoY2xhc3NOYW1lID0+IHtcbiAgICAgIHJldHVybiBjbGFzc05hbWUuaW5kZXhPZignc3dpcGVyJykgPT09IDAgfHwgY2xhc3NOYW1lLmluZGV4T2Yoc3dpcGVyLnBhcmFtcy5jb250YWluZXJNb2RpZmllckNsYXNzKSA9PT0gMDtcbiAgICB9KTtcbiAgICBzd2lwZXIuZW1pdCgnX2NvbnRhaW5lckNsYXNzZXMnLCBjbHMuam9pbignICcpKTtcbiAgfVxuICBnZXRTbGlkZUNsYXNzZXMoc2xpZGVFbCkge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gICAgaWYgKHN3aXBlci5kZXN0cm95ZWQpIHJldHVybiAnJztcbiAgICByZXR1cm4gc2xpZGVFbC5jbGFzc05hbWUuc3BsaXQoJyAnKS5maWx0ZXIoY2xhc3NOYW1lID0+IHtcbiAgICAgIHJldHVybiBjbGFzc05hbWUuaW5kZXhPZignc3dpcGVyLXNsaWRlJykgPT09IDAgfHwgY2xhc3NOYW1lLmluZGV4T2Yoc3dpcGVyLnBhcmFtcy5zbGlkZUNsYXNzKSA9PT0gMDtcbiAgICB9KS5qb2luKCcgJyk7XG4gIH1cbiAgZW1pdFNsaWRlc0NsYXNzZXMoKSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgICBpZiAoIXN3aXBlci5wYXJhbXMuX2VtaXRDbGFzc2VzIHx8ICFzd2lwZXIuZWwpIHJldHVybjtcbiAgICBjb25zdCB1cGRhdGVzID0gW107XG4gICAgc3dpcGVyLnNsaWRlcy5mb3JFYWNoKHNsaWRlRWwgPT4ge1xuICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IHN3aXBlci5nZXRTbGlkZUNsYXNzZXMoc2xpZGVFbCk7XG4gICAgICB1cGRhdGVzLnB1c2goe1xuICAgICAgICBzbGlkZUVsLFxuICAgICAgICBjbGFzc05hbWVzXG4gICAgICB9KTtcbiAgICAgIHN3aXBlci5lbWl0KCdfc2xpZGVDbGFzcycsIHNsaWRlRWwsIGNsYXNzTmFtZXMpO1xuICAgIH0pO1xuICAgIHN3aXBlci5lbWl0KCdfc2xpZGVDbGFzc2VzJywgdXBkYXRlcyk7XG4gIH1cbiAgc2xpZGVzUGVyVmlld0R5bmFtaWModmlldywgZXhhY3QpIHtcbiAgICBpZiAodmlldyA9PT0gdm9pZCAwKSB7XG4gICAgICB2aWV3ID0gJ2N1cnJlbnQnO1xuICAgIH1cbiAgICBpZiAoZXhhY3QgPT09IHZvaWQgMCkge1xuICAgICAgZXhhY3QgPSBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgICBjb25zdCB7XG4gICAgICBwYXJhbXMsXG4gICAgICBzbGlkZXMsXG4gICAgICBzbGlkZXNHcmlkLFxuICAgICAgc2xpZGVzU2l6ZXNHcmlkLFxuICAgICAgc2l6ZTogc3dpcGVyU2l6ZSxcbiAgICAgIGFjdGl2ZUluZGV4XG4gICAgfSA9IHN3aXBlcjtcbiAgICBsZXQgc3B2ID0gMTtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5zbGlkZXNQZXJWaWV3ID09PSAnbnVtYmVyJykgcmV0dXJuIHBhcmFtcy5zbGlkZXNQZXJWaWV3O1xuICAgIGlmIChwYXJhbXMuY2VudGVyZWRTbGlkZXMpIHtcbiAgICAgIGxldCBzbGlkZVNpemUgPSBzbGlkZXNbYWN0aXZlSW5kZXhdID8gTWF0aC5jZWlsKHNsaWRlc1thY3RpdmVJbmRleF0uc3dpcGVyU2xpZGVTaXplKSA6IDA7XG4gICAgICBsZXQgYnJlYWtMb29wO1xuICAgICAgZm9yIChsZXQgaSA9IGFjdGl2ZUluZGV4ICsgMTsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAoc2xpZGVzW2ldICYmICFicmVha0xvb3ApIHtcbiAgICAgICAgICBzbGlkZVNpemUgKz0gTWF0aC5jZWlsKHNsaWRlc1tpXS5zd2lwZXJTbGlkZVNpemUpO1xuICAgICAgICAgI
5196HNwdiArPSAxO1xuICAgICAgICAgIGlmIChzbGlkZVNpemUgPiBzd2lwZXJTaXplKSBicmVha0xvb3AgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gYWN0aXZlSW5kZXggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICBpZiAoc2xpZGVzW2ldICYmICFicmVha0xvb3ApIHtcbiAgICAgICAgICBzbGlkZVNpemUgKz0gc2xpZGVzW2ldLnN3aXBlclNsaWRlU2l6ZTtcbiAgICAgICAgICBzcHYgKz0gMTtcbiAgICAgICAgICBpZiAoc2xpZGVTaXplID4gc3dpcGVyU2l6ZSkgYnJlYWtMb29wID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgIGlmICh2aWV3ID09PSAnY3VycmVudCcpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFjdGl2ZUluZGV4ICsgMTsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIGNvbnN0IHNsaWRlSW5WaWV3ID0gZXhhY3QgPyBzbGlkZXNHcmlkW2ldICsgc2xpZGVzU2l6ZXNHcmlkW2ldIC0gc2xpZGVzR3JpZFthY3RpdmVJbmRleF0gPCBzd2lwZXJTaXplIDogc2xpZGVzR3JpZFtpXSAtIHNsaWRlc0dyaWRbYWN0aXZlSW5kZXhdIDwgc3dpcGVyU2l6ZTtcbiAgICAgICAgICBpZiAoc2xpZGVJblZpZXcpIHtcbiAgICAgICAgICAgIHNwdiArPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcHJldmlvdXNcbiAgICAgICAgZm9yIChsZXQgaSA9IGFjdGl2ZUluZGV4IC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgICAgICBjb25zdCBzbGlkZUluVmlldyA9IHNsaWRlc0dyaWRbYWN0aXZlSW5kZXhdIC0gc2xpZGVzR3JpZFtpXSA8IHN3aXBlclNpemU7XG4gICAgICAgICAgaWYgKHNsaWRlSW5WaWV3KSB7XG4gICAgICAgICAgICBzcHYgKz0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNwdjtcbiAgfVxuICB1cGRhdGUoKSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgICBpZiAoIXN3aXBlciB8fCBzd2lwZXIuZGVzdHJveWVkKSByZXR1cm47XG4gICAgY29uc3Qge1xuICAgICAgc25hcEdyaWQsXG4gICAgICBwYXJhbXNcbiAgICB9ID0gc3dpcGVyO1xuICAgIC8vIEJyZWFrcG9pbnRzXG4gICAgaWYgKHBhcmFtcy5icmVha3BvaW50cykge1xuICAgICAgc3dpcGVyLnNldEJyZWFrcG9pbnQoKTtcbiAgICB9XG4gICAgWy4uLnN3aXBlci5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbbG9hZGluZz1cImxhenlcIl0nKV0uZm9yRWFjaChpbWFnZUVsID0+IHtcbiAgICAgIGlmIChpbWFnZUVsLmNvbXBsZXRlKSB7XG4gICAgICAgIHByb2Nlc3NMYXp5UHJlbG9hZGVyKHN3aXBlciwgaW1hZ2VFbCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc3dpcGVyLnVwZGF0ZVNpemUoKTtcbiAgICBzd2lwZXIudXBkYXRlU2xpZGVzKCk7XG4gICAgc3dpcGVyLnVwZGF0ZVByb2dyZXNzKCk7XG4gICAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgICBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGVWYWx1ZSA9IHN3aXBlci5ydGxUcmFuc2xhdGUgPyBzd2lwZXIudHJhbnNsYXRlICogLTEgOiBzd2lwZXIudHJhbnNsYXRlO1xuICAgICAgY29uc3QgbmV3VHJhbnNsYXRlID0gTWF0aC5taW4oTWF0aC5tYXgodHJhbnNsYXRlVmFsdWUsIHN3aXBlci5tYXhUcmFuc2xhdGUoKSksIHN3aXBlci5taW5UcmFuc2xhdGUoKSk7XG4gICAgICBzd2lwZXIuc2V0VHJhbnNsYXRlKG5ld1RyYW5zbGF0ZSk7XG4gICAgICBzd2lwZXIudXBkYXRlQWN0aXZlSW5kZXgoKTtcbiAgICAgIHN3aXBlci51cGRhdGVTbGlkZXNDbGFzc2VzKCk7XG4gICAgfVxuICAgIGxldCB0cmFuc2xhdGVkO1xuICAgIGlmIChwYXJhbXMuZnJlZU1vZGUgJiYgcGFyYW1zLmZyZWVNb2RlLmVuYWJsZWQgJiYgIXBhcmFtcy5jc3NNb2RlKSB7XG4gICAgICBzZXRUcmFuc2xhdGUoKTtcbiAgICAgIGlmIChwYXJhbXMuYXV0b0hlaWdodCkge1xuICAgICAgICBzd2lwZXIudXBkYXRlQXV0b0hlaWdodCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoKHBhcmFtcy5zbGlkZXNQZXJWaWV3ID09PSAnYXV0bycgfHwgcGFyYW1zLnNsaWRlc1BlclZpZXcgPiAxKSAmJiBzd2lwZXIuaXNFbmQgJiYgIXBhcmFtcy5jZW50ZXJlZFNsaWRlcykge1xuICAgICAgICBjb25zdCBzbGlkZXMgPSBzd2lwZXIudmlydHVhbCAmJiBwYXJhbXMudmlydHVhbC5lbmFibGVkID8gc3dpcGVyLnZpcnR1YWwuc2xpZGVzIDogc3dpcGVyLnNsaWRlcztcbiAgICAgICAgdHJhbnNsYXRlZCA9IHN3aXBlci5zbGlkZVRvKHNsaWRlcy5sZW5ndGggLSAxLCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFuc2xhdGVkID0gc3dpcGVyLnNsaWRlVG8oc3dpcGVyLmFjdGl2ZUluZGV4LCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRyYW5zbGF0ZWQpIHtcbiAgICAgICAgc2V0VHJhbnNsYXRlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwYXJhbXMud2F0Y2hPdmVyZmxvdyAmJiBzbmFwR3JpZCAhPT0gc3dpcGVyLnNuYXBHcmlkKSB7XG4gICAgICBzd2lwZXIuY2hlY2tPdmVyZmxvdygpO1xuICAgIH1cbiAgICBzd2lwZXIuZW1pdCgndXBkYXRlJyk7XG4gIH1cbiAgY2hhbmdlRGlyZWN0aW9uKG5ld0RpcmVjdGlvbiwgbmVlZFVwZGF0ZSkge1xuICAgIGlmIChuZWVkVXBkYXRlID09PSB2b2lkIDApIHtcbiAgICAgIG5lZWRVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICAgIGNvbnN0IGN1cnJlbnREaXJlY3Rpb24gPSBzd2lwZXIucGFyYW1zLmRpcmVjdGlvbjtcbiAgICBpZiAoIW5ld0RpcmVjdGlvbikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICBuZXdEaXJlY3Rpb24gPSBjdXJyZW50RGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICAgIH1cbiAgICBpZiAobmV3RGlyZWN0aW9uID09PSBjdXJyZW50RGlyZWN0aW9uIHx8IG5ld0RpcmVjdGlvbiAhPT0gJ2hvcml6b250YWwnICYmIG5ld0RpcmVjdGlvbiAhPT0gJ3ZlcnRpY2FsJykge1xuICAgICAgcmV0dXJuIHN3aXBlcjtcbiAgICB9XG4gICAgc3dpcGVyLmVsLmNsYXNzTGlzdC5yZW1vdmUoYCR7c3d
5196pcGVyLnBhcmFtcy5jb250YWluZXJNb2RpZmllckNsYXNzfSR7Y3VycmVudERpcmVjdGlvbn1gKTtcbiAgICBzd2lwZXIuZWwuY2xhc3NMaXN0LmFkZChgJHtzd2lwZXIucGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3N9JHtuZXdEaXJlY3Rpb259YCk7XG4gICAgc3dpcGVyLmVtaXRDb250YWluZXJDbGFzc2VzKCk7XG4gICAgc3dpcGVyLnBhcmFtcy5kaXJlY3Rpb24gPSBuZXdEaXJlY3Rpb247XG4gICAgc3dpcGVyLnNsaWRlcy5mb3JFYWNoKHNsaWRlRWwgPT4ge1xuICAgICAgaWYgKG5ld0RpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgICBzbGlkZUVsLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbGlkZUVsLnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHN3aXBlci5lbWl0KCdjaGFuZ2VEaXJlY3Rpb24nKTtcbiAgICBpZiAobmVlZFVwZGF0ZSkgc3dpcGVyLnVwZGF0ZSgpO1xuICAgIHJldHVybiBzd2lwZXI7XG4gIH1cbiAgY2hhbmdlTGFuZ3VhZ2VEaXJlY3Rpb24oZGlyZWN0aW9uKSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgICBpZiAoc3dpcGVyLnJ0bCAmJiBkaXJlY3Rpb24gPT09ICdydGwnIHx8ICFzd2lwZXIucnRsICYmIGRpcmVjdGlvbiA9PT0gJ2x0cicpIHJldHVybjtcbiAgICBzd2lwZXIucnRsID0gZGlyZWN0aW9uID09PSAncnRsJztcbiAgICBzd2lwZXIucnRsVHJhbnNsYXRlID0gc3dpcGVyLnBhcmFtcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyAmJiBzd2lwZXIucnRsO1xuICAgIGlmIChzd2lwZXIucnRsKSB7XG4gICAgICBzd2lwZXIuZWwuY2xhc3NMaXN0LmFkZChgJHtzd2lwZXIucGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3N9cnRsYCk7XG4gICAgICBzd2lwZXIuZWwuZGlyID0gJ3J0bCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXBlci5lbC5jbGFzc0xpc3QucmVtb3ZlKGAke3N3aXBlci5wYXJhbXMuY29udGFpbmVyTW9kaWZpZXJDbGFzc31ydGxgKTtcbiAgICAgIHN3aXBlci5lbC5kaXIgPSAnbHRyJztcbiAgICB9XG4gICAgc3dpcGVyLnVwZGF0ZSgpO1xuICB9XG4gIG1vdW50KGVsZW1lbnQpIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICAgIGlmIChzd2lwZXIubW91bnRlZCkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBGaW5kIGVsXG4gICAgbGV0IGVsID0gZWxlbWVudCB8fCBzd2lwZXIucGFyYW1zLmVsO1xuICAgIGlmICh0eXBlb2YgZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWwpO1xuICAgIH1cbiAgICBpZiAoIWVsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGVsLnN3aXBlciA9IHN3aXBlcjtcbiAgICBpZiAoZWwucGFyZW50Tm9kZSAmJiBlbC5wYXJlbnROb2RlLmhvc3QgJiYgZWwucGFyZW50Tm9kZS5ob3N0Lm5vZGVOYW1lID09PSBzd2lwZXIucGFyYW1zLnN3aXBlckVsZW1lbnROb2RlTmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICBzd2lwZXIuaXNFbGVtZW50ID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgZ2V0V3JhcHBlclNlbGVjdG9yID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIGAuJHsoc3dpcGVyLnBhcmFtcy53cmFwcGVyQ2xhc3MgfHwgJycpLnRyaW0oKS5zcGxpdCgnICcpLmpvaW4oJy4nKX1gO1xuICAgIH07XG4gICAgY29uc3QgZ2V0V3JhcHBlciA9ICgpID0+IHtcbiAgICAgIGlmIChlbCAmJiBlbC5zaGFkb3dSb290ICYmIGVsLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcikge1xuICAgICAgICBjb25zdCByZXMgPSBlbC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoZ2V0V3JhcHBlclNlbGVjdG9yKCkpO1xuICAgICAgICAvLyBDaGlsZHJlbiBuZWVkcyB0byByZXR1cm4gc2xvdCBpdGVtc1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZW1lbnRDaGlsZHJlbihlbCwgZ2V0V3JhcHBlclNlbGVjdG9yKCkpWzBdO1xuICAgIH07XG4gICAgLy8gRmluZCBXcmFwcGVyXG4gICAgbGV0IHdyYXBwZXJFbCA9IGdldFdyYXBwZXIoKTtcbiAgICBpZiAoIXdyYXBwZXJFbCAmJiBzd2lwZXIucGFyYW1zLmNyZWF0ZUVsZW1lbnRzKSB7XG4gICAgICB3cmFwcGVyRWwgPSBjcmVhdGVFbGVtZW50KCdkaXYnLCBzd2lwZXIucGFyYW1zLndyYXBwZXJDbGFzcyk7XG4gICAgICBlbC5hcHBlbmQod3JhcHBlckVsKTtcbiAgICAgIGVsZW1lbnRDaGlsZHJlbihlbCwgYC4ke3N3aXBlci5wYXJhbXMuc2xpZGVDbGFzc31gKS5mb3JFYWNoKHNsaWRlRWwgPT4ge1xuICAgICAgICB3cmFwcGVyRWwuYXBwZW5kKHNsaWRlRWwpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIE9iamVjdC5hc3NpZ24oc3dpcGVyLCB7XG4gICAgICBlbCxcbiAgICAgIHdyYXBwZXJFbCxcbiAgICAgIHNsaWRlc0VsOiBzd2lwZXIuaXNFbGVtZW50ICYmICFlbC5wYXJlbnROb2RlLmhvc3Quc2xpZGVTbG90cyA/IGVsLnBhcmVudE5vZGUuaG9zdCA6IHdyYXBwZXJFbCxcbiAgICAgIGhvc3RFbDogc3dpcGVyLmlzRWxlbWVudCA/IGVsLnBhcmVudE5vZGUuaG9zdCA6IGVsLFxuICAgICAgbW91bnRlZDogdHJ1ZSxcbiAgICAgIC8vIFJUTFxuICAgICAgcnRsOiBlbC5kaXIudG9Mb3dlckNhc2UoKSA9PT0gJ3J0bCcgfHwgZWxlbWVudFN0eWxlKGVsLCAnZGlyZWN0aW9uJykgPT09ICdydGwnLFxuICAgICAgcnRsVHJhbnNsYXRlOiBzd2lwZXIucGFyYW1zLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnICYmIChlbC5kaXIudG9Mb3dlckNhc2UoKSA9PT0gJ3J0bCcgfHwgZWxlbWVudFN0eWxlKGVsLCAnZGlyZWN0aW9uJykgPT09ICdydGwnKSxcbiAgICAgIHdyb25nUlRMOiBlbGVtZW50U3R5bGUod3JhcHBlckVsLCAnZGlzcGxheScpID09PSAnLXdlYmtpdC1ib3gnXG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaW5pdChlbCkge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gICAgaWYgKHN3aXBlci5pbml0aWFsaXplZCkgcmV0dXJuIHN3aXBlcjtcbiAgICBjb25zdCBtb3VudGVkID0gc3dpcGVyLm1vdW50KGVsKTtcbiAgICBpZiAobW91bnRlZCA9PT0gZmFsc2UpIHJldHVybi
5196Bzd2lwZXI7XG4gICAgc3dpcGVyLmVtaXQoJ2JlZm9yZUluaXQnKTtcblxuICAgIC8vIFNldCBicmVha3BvaW50XG4gICAgaWYgKHN3aXBlci5wYXJhbXMuYnJlYWtwb2ludHMpIHtcbiAgICAgIHN3aXBlci5zZXRCcmVha3BvaW50KCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIENsYXNzZXNcbiAgICBzd2lwZXIuYWRkQ2xhc3NlcygpO1xuXG4gICAgLy8gVXBkYXRlIHNpemVcbiAgICBzd2lwZXIudXBkYXRlU2l6ZSgpO1xuXG4gICAgLy8gVXBkYXRlIHNsaWRlc1xuICAgIHN3aXBlci51cGRhdGVTbGlkZXMoKTtcbiAgICBpZiAoc3dpcGVyLnBhcmFtcy53YXRjaE92ZXJmbG93KSB7XG4gICAgICBzd2lwZXIuY2hlY2tPdmVyZmxvdygpO1xuICAgIH1cblxuICAgIC8vIFNldCBHcmFiIEN1cnNvclxuICAgIGlmIChzd2lwZXIucGFyYW1zLmdyYWJDdXJzb3IgJiYgc3dpcGVyLmVuYWJsZWQpIHtcbiAgICAgIHN3aXBlci5zZXRHcmFiQ3Vyc29yKCk7XG4gICAgfVxuXG4gICAgLy8gU2xpZGUgVG8gSW5pdGlhbCBTbGlkZVxuICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3AgJiYgc3dpcGVyLnZpcnR1YWwgJiYgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLmVuYWJsZWQpIHtcbiAgICAgIHN3aXBlci5zbGlkZVRvKHN3aXBlci5wYXJhbXMuaW5pdGlhbFNsaWRlICsgc3dpcGVyLnZpcnR1YWwuc2xpZGVzQmVmb3JlLCAwLCBzd2lwZXIucGFyYW1zLnJ1bkNhbGxiYWNrc09uSW5pdCwgZmFsc2UsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIucGFyYW1zLmluaXRpYWxTbGlkZSwgMCwgc3dpcGVyLnBhcmFtcy5ydW5DYWxsYmFja3NPbkluaXQsIGZhbHNlLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbG9vcFxuICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3ApIHtcbiAgICAgIHN3aXBlci5sb29wQ3JlYXRlKCk7XG4gICAgfVxuXG4gICAgLy8gQXR0YWNoIGV2ZW50c1xuICAgIHN3aXBlci5hdHRhY2hFdmVudHMoKTtcbiAgICBjb25zdCBsYXp5RWxlbWVudHMgPSBbLi4uc3dpcGVyLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tsb2FkaW5nPVwibGF6eVwiXScpXTtcbiAgICBpZiAoc3dpcGVyLmlzRWxlbWVudCkge1xuICAgICAgbGF6eUVsZW1lbnRzLnB1c2goLi4uc3dpcGVyLmhvc3RFbC5xdWVyeVNlbGVjdG9yQWxsKCdbbG9hZGluZz1cImxhenlcIl0nKSk7XG4gICAgfVxuICAgIGxhenlFbGVtZW50cy5mb3JFYWNoKGltYWdlRWwgPT4ge1xuICAgICAgaWYgKGltYWdlRWwuY29tcGxldGUpIHtcbiAgICAgICAgcHJvY2Vzc0xhenlQcmVsb2FkZXIoc3dpcGVyLCBpbWFnZUVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGltYWdlRWwuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGUgPT4ge1xuICAgICAgICAgIHByb2Nlc3NMYXp5UHJlbG9hZGVyKHN3aXBlciwgZS50YXJnZXQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcmVsb2FkKHN3aXBlcik7XG5cbiAgICAvLyBJbml0IEZsYWdcbiAgICBzd2lwZXIuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHByZWxvYWQoc3dpcGVyKTtcblxuICAgIC8vIEVtaXRcbiAgICBzd2lwZXIuZW1pdCgnaW5pdCcpO1xuICAgIHN3aXBlci5lbWl0KCdhZnRlckluaXQnKTtcbiAgICByZXR1cm4gc3dpcGVyO1xuICB9XG4gIGRlc3Ryb3koZGVsZXRlSW5zdGFuY2UsIGNsZWFuU3R5bGVzKSB7XG4gICAgaWYgKGRlbGV0ZUluc3RhbmNlID09PSB2b2lkIDApIHtcbiAgICAgIGRlbGV0ZUluc3RhbmNlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNsZWFuU3R5bGVzID09PSB2b2lkIDApIHtcbiAgICAgIGNsZWFuU3R5bGVzID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgICBjb25zdCB7XG4gICAgICBwYXJhbXMsXG4gICAgICBlbCxcbiAgICAgIHdyYXBwZXJFbCxcbiAgICAgIHNsaWRlc1xuICAgIH0gPSBzd2lwZXI7XG4gICAgaWYgKHR5cGVvZiBzd2lwZXIucGFyYW1zID09PSAndW5kZWZpbmVkJyB8fCBzd2lwZXIuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc3dpcGVyLmVtaXQoJ2JlZm9yZURlc3Ryb3knKTtcblxuICAgIC8vIEluaXQgRmxhZ1xuICAgIHN3aXBlci5pbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgLy8gRGV0YWNoIGV2ZW50c1xuICAgIHN3aXBlci5kZXRhY2hFdmVudHMoKTtcblxuICAgIC8vIERlc3Ryb3kgbG9vcFxuICAgIGlmIChwYXJhbXMubG9vcCkge1xuICAgICAgc3dpcGVyLmxvb3BEZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW51cCBzdHlsZXNcbiAgICBpZiAoY2xlYW5TdHlsZXMpIHtcbiAgICAgIHN3aXBlci5yZW1vdmVDbGFzc2VzKCk7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICB3cmFwcGVyRWwucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgaWYgKHNsaWRlcyAmJiBzbGlkZXMubGVuZ3RoKSB7XG4gICAgICAgIHNsaWRlcy5mb3JFYWNoKHNsaWRlRWwgPT4ge1xuICAgICAgICAgIHNsaWRlRWwuY2xhc3NMaXN0LnJlbW92ZShwYXJhbXMuc2xpZGVWaXNpYmxlQ2xhc3MsIHBhcmFtcy5zbGlkZUZ1bGx5VmlzaWJsZUNsYXNzLCBwYXJhbXMuc2xpZGVBY3RpdmVDbGFzcywgcGFyYW1zLnNsaWRlTmV4dENsYXNzLCBwYXJhbXMuc2xpZGVQcmV2Q2xhc3MpO1xuICAgICAgICAgIHNsaWRlRWwucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgICAgIHNsaWRlRWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3dpcGVyLmVtaXQoJ2Rlc3Ryb3knKTtcblxuICAgIC8vIERldGFjaCBlbWl0dGVyIGV2ZW50c1xuICAgIE9iamVjdC5rZXlzKHN3aXBlci5ldmVudHNMaXN0ZW5lcnMpLmZvckVhY2goZXZlbnROYW1lID0+IHtcbiAgICAgIHN3aXBlci5vZmYoZXZlbnROYW1lKTtcbiAgICB9KTtcbiAgICBpZiAoZGVsZXRlSW5zdGFuY2UgIT09IGZhbHNlKSB7XG4gICAgICBzd2lwZXIuZWwuc3dpcGVyID0gbnVsbDtcbiAgICAgIGRlbGV0ZVByb3BzKHN3aXBlcik7XG4gICAgfVxuICAgIHN3aXBlci5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIHJldHVybi
5196BudWxsO1xuICB9XG4gIHN0YXRpYyBleHRlbmREZWZhdWx0cyhuZXdEZWZhdWx0cykge1xuICAgIGV4dGVuZChleHRlbmRlZERlZmF1bHRzLCBuZXdEZWZhdWx0cyk7XG4gIH1cbiAgc3RhdGljIGdldCBleHRlbmRlZERlZmF1bHRzKCkge1xuICAgIHJldHVybiBleHRlbmRlZERlZmF1bHRzO1xuICB9XG4gIHN0YXRpYyBnZXQgZGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRzO1xuICB9XG4gIHN0YXRpYyBpbnN0YWxsTW9kdWxlKG1vZCkge1xuICAgIGlmICghU3dpcGVyLnByb3RvdHlwZS5fX21vZHVsZXNfXykgU3dpcGVyLnByb3RvdHlwZS5fX21vZHVsZXNfXyA9IFtdO1xuICAgIGNvbnN0IG1vZHVsZXMgPSBTd2lwZXIucHJvdG90eXBlLl9fbW9kdWxlc19fO1xuICAgIGlmICh0eXBlb2YgbW9kID09PSAnZnVuY3Rpb24nICYmIG1vZHVsZXMuaW5kZXhPZihtb2QpIDwgMCkge1xuICAgICAgbW9kdWxlcy5wdXNoKG1vZCk7XG4gICAgfVxuICB9XG4gIHN0YXRpYyB1c2UobW9kdWxlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobW9kdWxlKSkge1xuICAgICAgbW9kdWxlLmZvckVhY2gobSA9PiBTd2lwZXIuaW5zdGFsbE1vZHVsZShtKSk7XG4gICAgICByZXR1cm4gU3dpcGVyO1xuICAgIH1cbiAgICBTd2lwZXIuaW5zdGFsbE1vZHVsZShtb2R1bGUpO1xuICAgIHJldHVybiBTd2lwZXI7XG4gIH1cbn1cbk9iamVjdC5rZXlzKHByb3RvdHlwZXMpLmZvckVhY2gocHJvdG90eXBlR3JvdXAgPT4ge1xuICBPYmplY3Qua2V5cyhwcm90b3R5cGVzW3Byb3RvdHlwZUdyb3VwXSkuZm9yRWFjaChwcm90b01ldGhvZCA9PiB7XG4gICAgU3dpcGVyLnByb3RvdHlwZVtwcm90b01ldGhvZF0gPSBwcm90b3R5cGVzW3Byb3RvdHlwZUdyb3VwXVtwcm90b01ldGhvZF07XG4gIH0pO1xufSk7XG5Td2lwZXIudXNlKFtSZXNpemUsIE9ic2VydmVyXSk7XG5cbmV4cG9ydCB7IFN3aXBlciBhcyBTLCBkZWZhdWx0cyBhcyBkIH07XG4iLCJpbXBvcnQgeyBlIGFzIGVsZW1lbnRDaGlsZHJlbiwgYyBhcyBjcmVhdGVFbGVtZW50IH0gZnJvbSAnLi91dGlscy5tanMnO1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50SWZOb3REZWZpbmVkKHN3aXBlciwgb3JpZ2luYWxQYXJhbXMsIHBhcmFtcywgY2hlY2tQcm9wcykge1xuICBpZiAoc3dpcGVyLnBhcmFtcy5jcmVhdGVFbGVtZW50cykge1xuICAgIE9iamVjdC5rZXlzKGNoZWNrUHJvcHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmICghcGFyYW1zW2tleV0gJiYgcGFyYW1zLmF1dG8gPT09IHRydWUpIHtcbiAgICAgICAgbGV0IGVsZW1lbnQgPSBlbGVtZW50Q2hpbGRyZW4oc3dpcGVyLmVsLCBgLiR7Y2hlY2tQcm9wc1trZXldfWApWzBdO1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICBlbGVtZW50ID0gY3JlYXRlRWxlbWVudCgnZGl2JywgY2hlY2tQcm9wc1trZXldKTtcbiAgICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IGNoZWNrUHJvcHNba2V5XTtcbiAgICAgICAgICBzd2lwZXIuZWwuYXBwZW5kKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHBhcmFtc1trZXldID0gZWxlbWVudDtcbiAgICAgICAgb3JpZ2luYWxQYXJhbXNba2V5XSA9IGVsZW1lbnQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcmFtcztcbn1cblxuZXhwb3J0IHsgY3JlYXRlRWxlbWVudElmTm90RGVmaW5lZCBhcyBjIH07XG4iLCJpbXBvcnQgeyBjIGFzIGNyZWF0ZUVsZW1lbnRJZk5vdERlZmluZWQgfSBmcm9tICcuLi9zaGFyZWQvY3JlYXRlLWVsZW1lbnQtaWYtbm90LWRlZmluZWQubWpzJztcbmltcG9ydCB7IG0gYXMgbWFrZUVsZW1lbnRzQXJyYXkgfSBmcm9tICcuLi9zaGFyZWQvdXRpbHMubWpzJztcblxuZnVuY3Rpb24gTmF2aWdhdGlvbihfcmVmKSB7XG4gIGxldCB7XG4gICAgc3dpcGVyLFxuICAgIGV4dGVuZFBhcmFtcyxcbiAgICBvbixcbiAgICBlbWl0XG4gIH0gPSBfcmVmO1xuICBleHRlbmRQYXJhbXMoe1xuICAgIG5hdmlnYXRpb246IHtcbiAgICAgIG5leHRFbDogbnVsbCxcbiAgICAgIHByZXZFbDogbnVsbCxcbiAgICAgIGhpZGVPbkNsaWNrOiBmYWxzZSxcbiAgICAgIGRpc2FibGVkQ2xhc3M6ICdzd2lwZXItYnV0dG9uLWRpc2FibGVkJyxcbiAgICAgIGhpZGRlbkNsYXNzOiAnc3dpcGVyLWJ1dHRvbi1oaWRkZW4nLFxuICAgICAgbG9ja0NsYXNzOiAnc3dpcGVyLWJ1dHRvbi1sb2NrJyxcbiAgICAgIG5hdmlnYXRpb25EaXNhYmxlZENsYXNzOiAnc3dpcGVyLW5hdmlnYXRpb24tZGlzYWJsZWQnXG4gICAgfVxuICB9KTtcbiAgc3dpcGVyLm5hdmlnYXRpb24gPSB7XG4gICAgbmV4dEVsOiBudWxsLFxuICAgIHByZXZFbDogbnVsbFxuICB9O1xuICBmdW5jdGlvbiBnZXRFbChlbCkge1xuICAgIGxldCByZXM7XG4gICAgaWYgKGVsICYmIHR5cGVvZiBlbCA9PT0gJ3N0cmluZycgJiYgc3dpcGVyLmlzRWxlbWVudCkge1xuICAgICAgcmVzID0gc3dpcGVyLmVsLnF1ZXJ5U2VsZWN0b3IoZWwpO1xuICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKGVsKSB7XG4gICAgICBpZiAodHlwZW9mIGVsID09PSAnc3RyaW5nJykgcmVzID0gWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZWwpXTtcbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLnVuaXF1ZU5hdkVsZW1lbnRzICYmIHR5cGVvZiBlbCA9PT0gJ3N0cmluZycgJiYgcmVzICYmIHJlcy5sZW5ndGggPiAxICYmIHN3aXBlci5lbC5xdWVyeVNlbGVjdG9yQWxsKGVsKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmVzID0gc3dpcGVyLmVsLnF1ZXJ5U2VsZWN0b3IoZWwpO1xuICAgICAgfSBlbHNlIGlmIChyZXMgJiYgcmVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXMgPSByZXNbMF07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbCAmJiAhcmVzKSByZXR1cm4gZWw7XG4gICAgLy8gaWYgKEFycmF5LmlzQXJyYXkocmVzKSAmJiByZXMubGVuZ3RoID09PSAxKSByZXMgPSByZXNbMF07XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBmdW5jdGlvbiB0b2dnbGVFbChlbCwgZGlzYWJsZWQpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLm5hdmlnYXRpb247XG4gICAgZWwgPSBtYWtlRWxlbWVudHNBcnJheShlbCk7XG4gICAgZWwuZm9yRWFjaChzdWJFbCA9PiB7XG4gICAgICBpZiAoc3ViRWwpIHtcbiAgICAgICAgc3ViRWwuY2xhc3NMaXN0W2Rpc2FibGVkID8gJ2FkZCcgOiAncmVtb3ZlJ10oLi4ucGFyYW1zLmRpc2FibGVkQ2xhc3Muc3BsaXQoJyAnKSk7XG4gICAgICAgIGlmIChzdWJFbC50YWdOYW1lID09PSAnQlVUVE9OJykgc3ViRWwuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMud2F0Y2hPdmVyZmxvdyAmJiBzd2lwZXIuZW5hYmxlZCkge1xuICAgICAgICAgI
5196HN1YkVsLmNsYXNzTGlzdFtzd2lwZXIuaXNMb2NrZWQgPyAnYWRkJyA6ICdyZW1vdmUnXShwYXJhbXMubG9ja0NsYXNzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAvLyBVcGRhdGUgTmF2aWdhdGlvbiBCdXR0b25zXG4gICAgY29uc3Qge1xuICAgICAgbmV4dEVsLFxuICAgICAgcHJldkVsXG4gICAgfSA9IHN3aXBlci5uYXZpZ2F0aW9uO1xuICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3ApIHtcbiAgICAgIHRvZ2dsZUVsKHByZXZFbCwgZmFsc2UpO1xuICAgICAgdG9nZ2xlRWwobmV4dEVsLCBmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRvZ2dsZUVsKHByZXZFbCwgc3dpcGVyLmlzQmVnaW5uaW5nICYmICFzd2lwZXIucGFyYW1zLnJld2luZCk7XG4gICAgdG9nZ2xlRWwobmV4dEVsLCBzd2lwZXIuaXNFbmQgJiYgIXN3aXBlci5wYXJhbXMucmV3aW5kKTtcbiAgfVxuICBmdW5jdGlvbiBvblByZXZDbGljayhlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChzd2lwZXIuaXNCZWdpbm5pbmcgJiYgIXN3aXBlci5wYXJhbXMubG9vcCAmJiAhc3dpcGVyLnBhcmFtcy5yZXdpbmQpIHJldHVybjtcbiAgICBzd2lwZXIuc2xpZGVQcmV2KCk7XG4gICAgZW1pdCgnbmF2aWdhdGlvblByZXYnKTtcbiAgfVxuICBmdW5jdGlvbiBvbk5leHRDbGljayhlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChzd2lwZXIuaXNFbmQgJiYgIXN3aXBlci5wYXJhbXMubG9vcCAmJiAhc3dpcGVyLnBhcmFtcy5yZXdpbmQpIHJldHVybjtcbiAgICBzd2lwZXIuc2xpZGVOZXh0KCk7XG4gICAgZW1pdCgnbmF2aWdhdGlvbk5leHQnKTtcbiAgfVxuICBmdW5jdGlvbiBpbml0KCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHN3aXBlci5wYXJhbXMubmF2aWdhdGlvbjtcbiAgICBzd2lwZXIucGFyYW1zLm5hdmlnYXRpb24gPSBjcmVhdGVFbGVtZW50SWZOb3REZWZpbmVkKHN3aXBlciwgc3dpcGVyLm9yaWdpbmFsUGFyYW1zLm5hdmlnYXRpb24sIHN3aXBlci5wYXJhbXMubmF2aWdhdGlvbiwge1xuICAgICAgbmV4dEVsOiAnc3dpcGVyLWJ1dHRvbi1uZXh0JyxcbiAgICAgIHByZXZFbDogJ3N3aXBlci1idXR0b24tcHJldidcbiAgICB9KTtcbiAgICBpZiAoIShwYXJhbXMubmV4dEVsIHx8IHBhcmFtcy5wcmV2RWwpKSByZXR1cm47XG4gICAgbGV0IG5leHRFbCA9IGdldEVsKHBhcmFtcy5uZXh0RWwpO1xuICAgIGxldCBwcmV2RWwgPSBnZXRFbChwYXJhbXMucHJldkVsKTtcbiAgICBPYmplY3QuYXNzaWduKHN3aXBlci5uYXZpZ2F0aW9uLCB7XG4gICAgICBuZXh0RWwsXG4gICAgICBwcmV2RWxcbiAgICB9KTtcbiAgICBuZXh0RWwgPSBtYWtlRWxlbWVudHNBcnJheShuZXh0RWwpO1xuICAgIHByZXZFbCA9IG1ha2VFbGVtZW50c0FycmF5KHByZXZFbCk7XG4gICAgY29uc3QgaW5pdEJ1dHRvbiA9IChlbCwgZGlyKSA9PiB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBkaXIgPT09ICduZXh0JyA/IG9uTmV4dENsaWNrIDogb25QcmV2Q2xpY2spO1xuICAgICAgfVxuICAgICAgaWYgKCFzd2lwZXIuZW5hYmxlZCAmJiBlbCkge1xuICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKC4uLnBhcmFtcy5sb2NrQ2xhc3Muc3BsaXQoJyAnKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBuZXh0RWwuZm9yRWFjaChlbCA9PiBpbml0QnV0dG9uKGVsLCAnbmV4dCcpKTtcbiAgICBwcmV2RWwuZm9yRWFjaChlbCA9PiBpbml0QnV0dG9uKGVsLCAncHJldicpKTtcbiAgfVxuICBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIGxldCB7XG4gICAgICBuZXh0RWwsXG4gICAgICBwcmV2RWxcbiAgICB9ID0gc3dpcGVyLm5hdmlnYXRpb247XG4gICAgbmV4dEVsID0gbWFrZUVsZW1lbnRzQXJyYXkobmV4dEVsKTtcbiAgICBwcmV2RWwgPSBtYWtlRWxlbWVudHNBcnJheShwcmV2RWwpO1xuICAgIGNvbnN0IGRlc3Ryb3lCdXR0b24gPSAoZWwsIGRpcikgPT4ge1xuICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBkaXIgPT09ICduZXh0JyA/IG9uTmV4dENsaWNrIDogb25QcmV2Q2xpY2spO1xuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSguLi5zd2lwZXIucGFyYW1zLm5hdmlnYXRpb24uZGlzYWJsZWRDbGFzcy5zcGxpdCgnICcpKTtcbiAgICB9O1xuICAgIG5leHRFbC5mb3JFYWNoKGVsID0+IGRlc3Ryb3lCdXR0b24oZWwsICduZXh0JykpO1xuICAgIHByZXZFbC5mb3JFYWNoKGVsID0+IGRlc3Ryb3lCdXR0b24oZWwsICdwcmV2JykpO1xuICB9XG4gIG9uKCdpbml0JywgKCkgPT4ge1xuICAgIGlmIChzd2lwZXIucGFyYW1zLm5hdmlnYXRpb24uZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgZGlzYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbml0KCk7XG4gICAgICB1cGRhdGUoKTtcbiAgICB9XG4gIH0pO1xuICBvbigndG9FZGdlIGZyb21FZGdlIGxvY2sgdW5sb2NrJywgKCkgPT4ge1xuICAgIHVwZGF0ZSgpO1xuICB9KTtcbiAgb24oJ2Rlc3Ryb3knLCAoKSA9PiB7XG4gICAgZGVzdHJveSgpO1xuICB9KTtcbiAgb24oJ2VuYWJsZSBkaXNhYmxlJywgKCkgPT4ge1xuICAgIGxldCB7XG4gICAgICBuZXh0RWwsXG4gICAgICBwcmV2RWxcbiAgICB9ID0gc3dpcGVyLm5hdmlnYXRpb247XG4gICAgbmV4dEVsID0gbWFrZUVsZW1lbnRzQXJyYXkobmV4dEVsKTtcbiAgICBwcmV2RWwgPSBtYWtlRWxlbWVudHNBcnJheShwcmV2RWwpO1xuICAgIGlmIChzd2lwZXIuZW5hYmxlZCkge1xuICAgICAgdXBkYXRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFsuLi5uZXh0RWwsIC4uLnByZXZFbF0uZmlsdGVyKGVsID0+ICEhZWwpLmZvckVhY2goZWwgPT4gZWwuY2xhc3NMaXN0LmFkZChzd2lwZXIucGFyYW1zLm5hdmlnYXRpb24ubG9ja0NsYXNzKSk7XG4gIH0pO1xuICBvbignY2xpY2snLCAoX3MsIGUpID0+IHtcbiAgICBsZXQge1xuICAgICAgbmV4dEVsLFxuICAgICAgcHJldkVsXG4gICAgfSA9IHN3aXBlci5uYXZpZ2F0aW9uO1xuICAgIG5leHRFbCA9IG1ha2VFbGVtZW50c0FycmF5KG5leHRFbCk7XG4gICAgcHJldkVsID0gbWFrZUVsZW1lbnRzQXJyYXkocHJldkVsKTtcbiAgICBjb25zdCB0YXJnZXRFbCA9IGUudGFyZ2V0O1xuICAgIGlmIChzd2lwZXIucGFyYW1zLm5hdmlnYXRpb24uaGlkZU9uQ2xpY2sgJiYgIXByZXZFbC5pbmNsdWRlcyh0YXJnZXRFbCkgJiYgIW5leHRFbC5pbmNsdWRlcyh0YXJnZXRFbCkpIHtcbiAgICAgIGlmIChzd2lwZXIucGFnaW5hdGlvbiAmJiBzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24gJiYgc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLm
5196NsaWNrYWJsZSAmJiAoc3dpcGVyLnBhZ2luYXRpb24uZWwgPT09IHRhcmdldEVsIHx8IHN3aXBlci5wYWdpbmF0aW9uLmVsLmNvbnRhaW5zKHRhcmdldEVsKSkpIHJldHVybjtcbiAgICAgIGxldCBpc0hpZGRlbjtcbiAgICAgIGlmIChuZXh0RWwubGVuZ3RoKSB7XG4gICAgICAgIGlzSGlkZGVuID0gbmV4dEVsWzBdLmNsYXNzTGlzdC5jb250YWlucyhzd2lwZXIucGFyYW1zLm5hdmlnYXRpb24uaGlkZGVuQ2xhc3MpO1xuICAgICAgfSBlbHNlIGlmIChwcmV2RWwubGVuZ3RoKSB7XG4gICAgICAgIGlzSGlkZGVuID0gcHJldkVsWzBdLmNsYXNzTGlzdC5jb250YWlucyhzd2lwZXIucGFyYW1zLm5hdmlnYXRpb24uaGlkZGVuQ2xhc3MpO1xuICAgICAgfVxuICAgICAgaWYgKGlzSGlkZGVuID09PSB0cnVlKSB7XG4gICAgICAgIGVtaXQoJ25hdmlnYXRpb25TaG93Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbWl0KCduYXZpZ2F0aW9uSGlkZScpO1xuICAgICAgfVxuICAgICAgWy4uLm5leHRFbCwgLi4ucHJldkVsXS5maWx0ZXIoZWwgPT4gISFlbCkuZm9yRWFjaChlbCA9PiBlbC5jbGFzc0xpc3QudG9nZ2xlKHN3aXBlci5wYXJhbXMubmF2aWdhdGlvbi5oaWRkZW5DbGFzcykpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGVuYWJsZSA9ICgpID0+IHtcbiAgICBzd2lwZXIuZWwuY2xhc3NMaXN0LnJlbW92ZSguLi5zd2lwZXIucGFyYW1zLm5hdmlnYXRpb24ubmF2aWdhdGlvbkRpc2FibGVkQ2xhc3Muc3BsaXQoJyAnKSk7XG4gICAgaW5pdCgpO1xuICAgIHVwZGF0ZSgpO1xuICB9O1xuICBjb25zdCBkaXNhYmxlID0gKCkgPT4ge1xuICAgIHN3aXBlci5lbC5jbGFzc0xpc3QuYWRkKC4uLnN3aXBlci5wYXJhbXMubmF2aWdhdGlvbi5uYXZpZ2F0aW9uRGlzYWJsZWRDbGFzcy5zcGxpdCgnICcpKTtcbiAgICBkZXN0cm95KCk7XG4gIH07XG4gIE9iamVjdC5hc3NpZ24oc3dpcGVyLm5hdmlnYXRpb24sIHtcbiAgICBlbmFibGUsXG4gICAgZGlzYWJsZSxcbiAgICB1cGRhdGUsXG4gICAgaW5pdCxcbiAgICBkZXN0cm95XG4gIH0pO1xufVxuXG5leHBvcnQgeyBOYXZpZ2F0aW9uIGFzIGRlZmF1bHQgfTtcbiIsImZ1bmN0aW9uIGNsYXNzZXNUb1NlbGVjdG9yKGNsYXNzZXMpIHtcbiAgaWYgKGNsYXNzZXMgPT09IHZvaWQgMCkge1xuICAgIGNsYXNzZXMgPSAnJztcbiAgfVxuICByZXR1cm4gYC4ke2NsYXNzZXMudHJpbSgpLnJlcGxhY2UoLyhbXFwuOiErXFwvXSkvZywgJ1xcXFwkMScpIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgLnJlcGxhY2UoLyAvZywgJy4nKX1gO1xufVxuXG5leHBvcnQgeyBjbGFzc2VzVG9TZWxlY3RvciBhcyBjIH07XG4iLCJpbXBvcnQgeyBjIGFzIGNsYXNzZXNUb1NlbGVjdG9yIH0gZnJvbSAnLi4vc2hhcmVkL2NsYXNzZXMtdG8tc2VsZWN0b3IubWpzJztcbmltcG9ydCB7IGMgYXMgY3JlYXRlRWxlbWVudElmTm90RGVmaW5lZCB9IGZyb20gJy4uL3NoYXJlZC9jcmVhdGUtZWxlbWVudC1pZi1ub3QtZGVmaW5lZC5tanMnO1xuaW1wb3J0IHsgbSBhcyBtYWtlRWxlbWVudHNBcnJheSwgZiBhcyBlbGVtZW50T3V0ZXJTaXplLCBoIGFzIGVsZW1lbnRJbmRleCwgYSBhcyBlbGVtZW50UGFyZW50cyB9IGZyb20gJy4uL3NoYXJlZC91dGlscy5tanMnO1xuXG5mdW5jdGlvbiBQYWdpbmF0aW9uKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBzd2lwZXIsXG4gICAgZXh0ZW5kUGFyYW1zLFxuICAgIG9uLFxuICAgIGVtaXRcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHBmeCA9ICdzd2lwZXItcGFnaW5hdGlvbic7XG4gIGV4dGVuZFBhcmFtcyh7XG4gICAgcGFnaW5hdGlvbjoge1xuICAgICAgZWw6IG51bGwsXG4gICAgICBidWxsZXRFbGVtZW50OiAnc3BhbicsXG4gICAgICBjbGlja2FibGU6IGZhbHNlLFxuICAgICAgaGlkZU9uQ2xpY2s6IGZhbHNlLFxuICAgICAgcmVuZGVyQnVsbGV0OiBudWxsLFxuICAgICAgcmVuZGVyUHJvZ3Jlc3NiYXI6IG51bGwsXG4gICAgICByZW5kZXJGcmFjdGlvbjogbnVsbCxcbiAgICAgIHJlbmRlckN1c3RvbTogbnVsbCxcbiAgICAgIHByb2dyZXNzYmFyT3Bwb3NpdGU6IGZhbHNlLFxuICAgICAgdHlwZTogJ2J1bGxldHMnLFxuICAgICAgLy8gJ2J1bGxldHMnIG9yICdwcm9ncmVzc2Jhcicgb3IgJ2ZyYWN0aW9uJyBvciAnY3VzdG9tJ1xuICAgICAgZHluYW1pY0J1bGxldHM6IGZhbHNlLFxuICAgICAgZHluYW1pY01haW5CdWxsZXRzOiAxLFxuICAgICAgZm9ybWF0RnJhY3Rpb25DdXJyZW50OiBudW1iZXIgPT4gbnVtYmVyLFxuICAgICAgZm9ybWF0RnJhY3Rpb25Ub3RhbDogbnVtYmVyID0+IG51bWJlcixcbiAgICAgIGJ1bGxldENsYXNzOiBgJHtwZnh9LWJ1bGxldGAsXG4gICAgICBidWxsZXRBY3RpdmVDbGFzczogYCR7cGZ4fS1idWxsZXQtYWN0aXZlYCxcbiAgICAgIG1vZGlmaWVyQ2xhc3M6IGAke3BmeH0tYCxcbiAgICAgIGN1cnJlbnRDbGFzczogYCR7cGZ4fS1jdXJyZW50YCxcbiAgICAgIHRvdGFsQ2xhc3M6IGAke3BmeH0tdG90YWxgLFxuICAgICAgaGlkZGVuQ2xhc3M6IGAke3BmeH0taGlkZGVuYCxcbiAgICAgIHByb2dyZXNzYmFyRmlsbENsYXNzOiBgJHtwZnh9LXByb2dyZXNzYmFyLWZpbGxgLFxuICAgICAgcHJvZ3Jlc3NiYXJPcHBvc2l0ZUNsYXNzOiBgJHtwZnh9LXByb2dyZXNzYmFyLW9wcG9zaXRlYCxcbiAgICAgIGNsaWNrYWJsZUNsYXNzOiBgJHtwZnh9LWNsaWNrYWJsZWAsXG4gICAgICBsb2NrQ2xhc3M6IGAke3BmeH0tbG9ja2AsXG4gICAgICBob3Jpem9udGFsQ2xhc3M6IGAke3BmeH0taG9yaXpvbnRhbGAsXG4gICAgICB2ZXJ0aWNhbENsYXNzOiBgJHtwZnh9LXZlcnRpY2FsYCxcbiAgICAgIHBhZ2luYXRpb25EaXNhYmxlZENsYXNzOiBgJHtwZnh9LWRpc2FibGVkYFxuICAgIH1cbiAgfSk7XG4gIHN3aXBlci5wYWdpbmF0aW9uID0ge1xuICAgIGVsOiBudWxsLFxuICAgIGJ1bGxldHM6IFtdXG4gIH07XG4gIGxldCBidWxsZXRTaXplO1xuICBsZXQgZHluYW1pY0J1bGxldEluZGV4ID0gMDtcbiAgZnVuY3Rpb24gaXNQYWdpbmF0aW9uRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuICFzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24uZWwgfHwgIXN3aXBlci5wYWdpbmF0aW9uLmVsIHx8IEFycmF5LmlzQXJyYXkoc3dpcGVyLnBhZ2luYXRpb24uZWwpICYmIHN3aXBlci5wYWdpbmF0aW9uLmVsLmxlbmd0aCA9PT0gMDtcbiAgfVxuICBmdW5jdGlvbiBzZXRTaWRlQnVsbGV0cyhidWxsZXRFbCwgcG9zaXRpb24pIHtcbiAgICBjb25zdCB7XG4gICAgICBidWxsZXRBY3RpdmVDbGFzc1xuICAgIH0gPSBzd2lwZXIucGFyYW1zLnBhZ2luYXRpb247XG4gICAgaWYgKCFidWxsZXRFbCkgcmV0dXJuO1xuICAgIGJ1bGxldEVsID0gYnVsbGV0RWxbYCR7cG9zaXRpb24gPT09ICdwcmV2JyA/ICdwcmV2aW91cycgOiAnbmV4dCd9RWxlbWVudFNpYmxpbmdgXTtcbiAgICBpZiAoYnVsbGV0RWwpIHtcbiAgICAgIGJ1bGxldEVsLmNsYXNzTGlzdC5hZGQoYCR7Y
5196nVsbGV0QWN0aXZlQ2xhc3N9LSR7cG9zaXRpb259YCk7XG4gICAgICBidWxsZXRFbCA9IGJ1bGxldEVsW2Ake3Bvc2l0aW9uID09PSAncHJldicgPyAncHJldmlvdXMnIDogJ25leHQnfUVsZW1lbnRTaWJsaW5nYF07XG4gICAgICBpZiAoYnVsbGV0RWwpIHtcbiAgICAgICAgYnVsbGV0RWwuY2xhc3NMaXN0LmFkZChgJHtidWxsZXRBY3RpdmVDbGFzc30tJHtwb3NpdGlvbn0tJHtwb3NpdGlvbn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gb25CdWxsZXRDbGljayhlKSB7XG4gICAgY29uc3QgYnVsbGV0RWwgPSBlLnRhcmdldC5jbG9zZXN0KGNsYXNzZXNUb1NlbGVjdG9yKHN3aXBlci5wYXJhbXMucGFnaW5hdGlvbi5idWxsZXRDbGFzcykpO1xuICAgIGlmICghYnVsbGV0RWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGluZGV4ID0gZWxlbWVudEluZGV4KGJ1bGxldEVsKSAqIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyR3JvdXA7XG4gICAgaWYgKHN3aXBlci5wYXJhbXMubG9vcCkge1xuICAgICAgaWYgKHN3aXBlci5yZWFsSW5kZXggPT09IGluZGV4KSByZXR1cm47XG4gICAgICBzd2lwZXIuc2xpZGVUb0xvb3AoaW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2lwZXIuc2xpZGVUbyhpbmRleCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAvLyBSZW5kZXIgfHwgVXBkYXRlIFBhZ2luYXRpb24gYnVsbGV0cy9pdGVtc1xuICAgIGNvbnN0IHJ0bCA9IHN3aXBlci5ydGw7XG4gICAgY29uc3QgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uO1xuICAgIGlmIChpc1BhZ2luYXRpb25EaXNhYmxlZCgpKSByZXR1cm47XG4gICAgbGV0IGVsID0gc3dpcGVyLnBhZ2luYXRpb24uZWw7XG4gICAgZWwgPSBtYWtlRWxlbWVudHNBcnJheShlbCk7XG4gICAgLy8gQ3VycmVudC9Ub3RhbFxuICAgIGxldCBjdXJyZW50O1xuICAgIGxldCBwcmV2aW91c0luZGV4O1xuICAgIGNvbnN0IHNsaWRlc0xlbmd0aCA9IHN3aXBlci52aXJ0dWFsICYmIHN3aXBlci5wYXJhbXMudmlydHVhbC5lbmFibGVkID8gc3dpcGVyLnZpcnR1YWwuc2xpZGVzLmxlbmd0aCA6IHN3aXBlci5zbGlkZXMubGVuZ3RoO1xuICAgIGNvbnN0IHRvdGFsID0gc3dpcGVyLnBhcmFtcy5sb29wID8gTWF0aC5jZWlsKHNsaWRlc0xlbmd0aCAvIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyR3JvdXApIDogc3dpcGVyLnNuYXBHcmlkLmxlbmd0aDtcbiAgICBpZiAoc3dpcGVyLnBhcmFtcy5sb29wKSB7XG4gICAgICBwcmV2aW91c0luZGV4ID0gc3dpcGVyLnByZXZpb3VzUmVhbEluZGV4IHx8IDA7XG4gICAgICBjdXJyZW50ID0gc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJHcm91cCA+IDEgPyBNYXRoLmZsb29yKHN3aXBlci5yZWFsSW5kZXggLyBzd2lwZXIucGFyYW1zLnNsaWRlc1Blckdyb3VwKSA6IHN3aXBlci5yZWFsSW5kZXg7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc3dpcGVyLnNuYXBJbmRleCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGN1cnJlbnQgPSBzd2lwZXIuc25hcEluZGV4O1xuICAgICAgcHJldmlvdXNJbmRleCA9IHN3aXBlci5wcmV2aW91c1NuYXBJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJldmlvdXNJbmRleCA9IHN3aXBlci5wcmV2aW91c0luZGV4IHx8IDA7XG4gICAgICBjdXJyZW50ID0gc3dpcGVyLmFjdGl2ZUluZGV4IHx8IDA7XG4gICAgfVxuICAgIC8vIFR5cGVzXG4gICAgaWYgKHBhcmFtcy50eXBlID09PSAnYnVsbGV0cycgJiYgc3dpcGVyLnBhZ2luYXRpb24uYnVsbGV0cyAmJiBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGJ1bGxldHMgPSBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRzO1xuICAgICAgbGV0IGZpcnN0SW5kZXg7XG4gICAgICBsZXQgbGFzdEluZGV4O1xuICAgICAgbGV0IG1pZEluZGV4O1xuICAgICAgaWYgKHBhcmFtcy5keW5hbWljQnVsbGV0cykge1xuICAgICAgICBidWxsZXRTaXplID0gZWxlbWVudE91dGVyU2l6ZShidWxsZXRzWzBdLCBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAnd2lkdGgnIDogJ2hlaWdodCcsIHRydWUpO1xuICAgICAgICBlbC5mb3JFYWNoKHN1YkVsID0+IHtcbiAgICAgICAgICBzdWJFbC5zdHlsZVtzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAnd2lkdGgnIDogJ2hlaWdodCddID0gYCR7YnVsbGV0U2l6ZSAqIChwYXJhbXMuZHluYW1pY01haW5CdWxsZXRzICsgNCl9cHhgO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHBhcmFtcy5keW5hbWljTWFpbkJ1bGxldHMgPiAxICYmIHByZXZpb3VzSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGR5bmFtaWNCdWxsZXRJbmRleCArPSBjdXJyZW50IC0gKHByZXZpb3VzSW5kZXggfHwgMCk7XG4gICAgICAgICAgaWYgKGR5bmFtaWNCdWxsZXRJbmRleCA+IHBhcmFtcy5keW5hbWljTWFpbkJ1bGxldHMgLSAxKSB7XG4gICAgICAgICAgICBkeW5hbWljQnVsbGV0SW5kZXggPSBwYXJhbXMuZHluYW1pY01haW5CdWxsZXRzIC0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGR5bmFtaWNCdWxsZXRJbmRleCA8IDApIHtcbiAgICAgICAgICAgIGR5bmFtaWNCdWxsZXRJbmRleCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpcnN0SW5kZXggPSBNYXRoLm1heChjdXJyZW50IC0gZHluYW1pY0J1bGxldEluZGV4LCAwKTtcbiAgICAgICAgbGFzdEluZGV4ID0gZmlyc3RJbmRleCArIChNYXRoLm1pbihidWxsZXRzLmxlbmd0aCwgcGFyYW1zLmR5bmFtaWNNYWluQnVsbGV0cykgLSAxKTtcbiAgICAgICAgbWlkSW5kZXggPSAobGFzdEluZGV4ICsgZmlyc3RJbmRleCkgLyAyO1xuICAgICAgfVxuICAgICAgYnVsbGV0cy5mb3JFYWNoKGJ1bGxldEVsID0+IHtcbiAgICAgICAgY29uc3QgY2xhc3Nlc1RvUmVtb3ZlID0gWy4uLlsnJywgJy1uZXh0JywgJy1uZXh0LW5leHQnLCAnLXByZXYnLCAnLXByZXYtcHJldicsICctbWFpbiddLm1hcChzdWZmaXggPT4gYCR7cGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzfSR7c3VmZml4fWApXS5tYXAocyA9PiB0eXBlb2YgcyA9PT0gJ3N0cmluZycgJiYgcy5pbmNsdWRlcygnICcpID8gcy5zcGxpdCgnICcpIDogcykuZmxh
5196dCgpO1xuICAgICAgICBidWxsZXRFbC5jbGFzc0xpc3QucmVtb3ZlKC4uLmNsYXNzZXNUb1JlbW92ZSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChlbC5sZW5ndGggPiAxKSB7XG4gICAgICAgIGJ1bGxldHMuZm9yRWFjaChidWxsZXQgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ1bGxldEluZGV4ID0gZWxlbWVudEluZGV4KGJ1bGxldCk7XG4gICAgICAgICAgaWYgKGJ1bGxldEluZGV4ID09PSBjdXJyZW50KSB7XG4gICAgICAgICAgICBidWxsZXQuY2xhc3NMaXN0LmFkZCguLi5wYXJhbXMuYnVsbGV0QWN0aXZlQ2xhc3Muc3BsaXQoJyAnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzd2lwZXIuaXNFbGVtZW50KSB7XG4gICAgICAgICAgICBidWxsZXQuc2V0QXR0cmlidXRlKCdwYXJ0JywgJ2J1bGxldCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocGFyYW1zLmR5bmFtaWNCdWxsZXRzKSB7XG4gICAgICAgICAgICBpZiAoYnVsbGV0SW5kZXggPj0gZmlyc3RJbmRleCAmJiBidWxsZXRJbmRleCA8PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgYnVsbGV0LmNsYXNzTGlzdC5hZGQoLi4uYCR7cGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzfS1tYWluYC5zcGxpdCgnICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChidWxsZXRJbmRleCA9PT0gZmlyc3RJbmRleCkge1xuICAgICAgICAgICAgICBzZXRTaWRlQnVsbGV0cyhidWxsZXQsICdwcmV2Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYnVsbGV0SW5kZXggPT09IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgICBzZXRTaWRlQnVsbGV0cyhidWxsZXQsICduZXh0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGJ1bGxldCA9IGJ1bGxldHNbY3VycmVudF07XG4gICAgICAgIGlmIChidWxsZXQpIHtcbiAgICAgICAgICBidWxsZXQuY2xhc3NMaXN0LmFkZCguLi5wYXJhbXMuYnVsbGV0QWN0aXZlQ2xhc3Muc3BsaXQoJyAnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3aXBlci5pc0VsZW1lbnQpIHtcbiAgICAgICAgICBidWxsZXRzLmZvckVhY2goKGJ1bGxldEVsLCBidWxsZXRJbmRleCkgPT4ge1xuICAgICAgICAgICAgYnVsbGV0RWwuc2V0QXR0cmlidXRlKCdwYXJ0JywgYnVsbGV0SW5kZXggPT09IGN1cnJlbnQgPyAnYnVsbGV0LWFjdGl2ZScgOiAnYnVsbGV0Jyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtcy5keW5hbWljQnVsbGV0cykge1xuICAgICAgICAgIGNvbnN0IGZpcnN0RGlzcGxheWVkQnVsbGV0ID0gYnVsbGV0c1tmaXJzdEluZGV4XTtcbiAgICAgICAgICBjb25zdCBsYXN0RGlzcGxheWVkQnVsbGV0ID0gYnVsbGV0c1tsYXN0SW5kZXhdO1xuICAgICAgICAgIGZvciAobGV0IGkgPSBmaXJzdEluZGV4OyBpIDw9IGxhc3RJbmRleDsgaSArPSAxKSB7XG4gICAgICAgICAgICBpZiAoYnVsbGV0c1tpXSkge1xuICAgICAgICAgICAgICBidWxsZXRzW2ldLmNsYXNzTGlzdC5hZGQoLi4uYCR7cGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzfS1tYWluYC5zcGxpdCgnICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0U2lkZUJ1bGxldHMoZmlyc3REaXNwbGF5ZWRCdWxsZXQsICdwcmV2Jyk7XG4gICAgICAgICAgc2V0U2lkZUJ1bGxldHMobGFzdERpc3BsYXllZEJ1bGxldCwgJ25leHQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5keW5hbWljQnVsbGV0cykge1xuICAgICAgICBjb25zdCBkeW5hbWljQnVsbGV0c0xlbmd0aCA9IE1hdGgubWluKGJ1bGxldHMubGVuZ3RoLCBwYXJhbXMuZHluYW1pY01haW5CdWxsZXRzICsgNCk7XG4gICAgICAgIGNvbnN0IGJ1bGxldHNPZmZzZXQgPSAoYnVsbGV0U2l6ZSAqIGR5bmFtaWNCdWxsZXRzTGVuZ3RoIC0gYnVsbGV0U2l6ZSkgLyAyIC0gbWlkSW5kZXggKiBidWxsZXRTaXplO1xuICAgICAgICBjb25zdCBvZmZzZXRQcm9wID0gcnRsID8gJ3JpZ2h0JyA6ICdsZWZ0JztcbiAgICAgICAgYnVsbGV0cy5mb3JFYWNoKGJ1bGxldCA9PiB7XG4gICAgICAgICAgYnVsbGV0LnN0eWxlW3N3aXBlci5pc0hvcml6b250YWwoKSA/IG9mZnNldFByb3AgOiAndG9wJ10gPSBgJHtidWxsZXRzT2Zmc2V0fXB4YDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsLmZvckVhY2goKHN1YkVsLCBzdWJFbEluZGV4KSA9PiB7XG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdmcmFjdGlvbicpIHtcbiAgICAgICAgc3ViRWwucXVlcnlTZWxlY3RvckFsbChjbGFzc2VzVG9TZWxlY3RvcihwYXJhbXMuY3VycmVudENsYXNzKSkuZm9yRWFjaChmcmFjdGlvbkVsID0+IHtcbiAgICAgICAgICBmcmFjdGlvbkVsLnRleHRDb250ZW50ID0gcGFyYW1zLmZvcm1hdEZyYWN0aW9uQ3VycmVudChjdXJyZW50ICsgMSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzdWJFbC5xdWVyeVNlbGVjdG9yQWxsKGNsYXNzZXNUb1NlbGVjdG9yKHBhcmFtcy50b3RhbENsYXNzKSkuZm9yRWFjaCh0b3RhbEVsID0+IHtcbiAgICAgICAgICB0b3RhbEVsLnRleHRDb250ZW50ID0gcGFyYW1zLmZvcm1hdEZyYWN0aW9uVG90YWwodG90YWwpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ3Byb2dyZXNzYmFyJykge1xuICAgICAgICBsZXQgcHJvZ3Jlc3NiYXJEaXJlY3Rpb247XG4gICAgICAgIGlmIChwYXJhbXMucHJvZ3Jlc3NiYXJPcHBvc2l0ZSkge1xuICAgICAgICAgIHByb2dyZXNzYmFyRGlyZWN0aW9uID0gc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9ncmVzc2JhckRpcmVjdGlvbiA9IHN3aXBlci5pc0hvcml6b250YWwoKSA/ICdob3Jpem9udGFsJyA6ICd2ZXJ0aWNhbCc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2NhbGUgPSAoY3VycmVudCArIDEpIC8gdG90YWw7XG4gICAgICAgIGxldCBzY2FsZVggPSAxO1xuICAgICAgICBsZXQgc2NhbGVZID0gMTtcbiAgICAgICAgaWYgKHByb2dyZXNzYmFyRGlyZWN0aW9uID09PSAnaG9yaXpvbn
5196RhbCcpIHtcbiAgICAgICAgICBzY2FsZVggPSBzY2FsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzY2FsZVkgPSBzY2FsZTtcbiAgICAgICAgfVxuICAgICAgICBzdWJFbC5xdWVyeVNlbGVjdG9yQWxsKGNsYXNzZXNUb1NlbGVjdG9yKHBhcmFtcy5wcm9ncmVzc2JhckZpbGxDbGFzcykpLmZvckVhY2gocHJvZ3Jlc3NFbCA9PiB7XG4gICAgICAgICAgcHJvZ3Jlc3NFbC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoMCwwLDApIHNjYWxlWCgke3NjYWxlWH0pIHNjYWxlWSgke3NjYWxlWX0pYDtcbiAgICAgICAgICBwcm9ncmVzc0VsLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IGAke3N3aXBlci5wYXJhbXMuc3BlZWR9bXNgO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ2N1c3RvbScgJiYgcGFyYW1zLnJlbmRlckN1c3RvbSkge1xuICAgICAgICBzdWJFbC5pbm5lckhUTUwgPSBwYXJhbXMucmVuZGVyQ3VzdG9tKHN3aXBlciwgY3VycmVudCArIDEsIHRvdGFsKTtcbiAgICAgICAgaWYgKHN1YkVsSW5kZXggPT09IDApIGVtaXQoJ3BhZ2luYXRpb25SZW5kZXInLCBzdWJFbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3ViRWxJbmRleCA9PT0gMCkgZW1pdCgncGFnaW5hdGlvblJlbmRlcicsIHN1YkVsKTtcbiAgICAgICAgZW1pdCgncGFnaW5hdGlvblVwZGF0ZScsIHN1YkVsKTtcbiAgICAgIH1cbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLndhdGNoT3ZlcmZsb3cgJiYgc3dpcGVyLmVuYWJsZWQpIHtcbiAgICAgICAgc3ViRWwuY2xhc3NMaXN0W3N3aXBlci5pc0xvY2tlZCA/ICdhZGQnIDogJ3JlbW92ZSddKHBhcmFtcy5sb2NrQ2xhc3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAvLyBSZW5kZXIgQ29udGFpbmVyXG4gICAgY29uc3QgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uO1xuICAgIGlmIChpc1BhZ2luYXRpb25EaXNhYmxlZCgpKSByZXR1cm47XG4gICAgY29uc3Qgc2xpZGVzTGVuZ3RoID0gc3dpcGVyLnZpcnR1YWwgJiYgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLmVuYWJsZWQgPyBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoIDogc3dpcGVyLmdyaWQgJiYgc3dpcGVyLnBhcmFtcy5ncmlkLnJvd3MgPiAxID8gc3dpcGVyLnNsaWRlcy5sZW5ndGggLyBNYXRoLmNlaWwoc3dpcGVyLnBhcmFtcy5ncmlkLnJvd3MpIDogc3dpcGVyLnNsaWRlcy5sZW5ndGg7XG4gICAgbGV0IGVsID0gc3dpcGVyLnBhZ2luYXRpb24uZWw7XG4gICAgZWwgPSBtYWtlRWxlbWVudHNBcnJheShlbCk7XG4gICAgbGV0IHBhZ2luYXRpb25IVE1MID0gJyc7XG4gICAgaWYgKHBhcmFtcy50eXBlID09PSAnYnVsbGV0cycpIHtcbiAgICAgIGxldCBudW1iZXJPZkJ1bGxldHMgPSBzd2lwZXIucGFyYW1zLmxvb3AgPyBNYXRoLmNlaWwoc2xpZGVzTGVuZ3RoIC8gc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJHcm91cCkgOiBzd2lwZXIuc25hcEdyaWQubGVuZ3RoO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuZnJlZU1vZGUgJiYgc3dpcGVyLnBhcmFtcy5mcmVlTW9kZS5lbmFibGVkICYmIG51bWJlck9mQnVsbGV0cyA+IHNsaWRlc0xlbmd0aCkge1xuICAgICAgICBudW1iZXJPZkJ1bGxldHMgPSBzbGlkZXNMZW5ndGg7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mQnVsbGV0czsgaSArPSAxKSB7XG4gICAgICAgIGlmIChwYXJhbXMucmVuZGVyQnVsbGV0KSB7XG4gICAgICAgICAgcGFnaW5hdGlvbkhUTUwgKz0gcGFyYW1zLnJlbmRlckJ1bGxldC5jYWxsKHN3aXBlciwgaSwgcGFyYW1zLmJ1bGxldENsYXNzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgICBwYWdpbmF0aW9uSFRNTCArPSBgPCR7cGFyYW1zLmJ1bGxldEVsZW1lbnR9ICR7c3dpcGVyLmlzRWxlbWVudCA/ICdwYXJ0PVwiYnVsbGV0XCInIDogJyd9IGNsYXNzPVwiJHtwYXJhbXMuYnVsbGV0Q2xhc3N9XCI+PC8ke3BhcmFtcy5idWxsZXRFbGVtZW50fT5gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ2ZyYWN0aW9uJykge1xuICAgICAgaWYgKHBhcmFtcy5yZW5kZXJGcmFjdGlvbikge1xuICAgICAgICBwYWdpbmF0aW9uSFRNTCA9IHBhcmFtcy5yZW5kZXJGcmFjdGlvbi5jYWxsKHN3aXBlciwgcGFyYW1zLmN1cnJlbnRDbGFzcywgcGFyYW1zLnRvdGFsQ2xhc3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFnaW5hdGlvbkhUTUwgPSBgPHNwYW4gY2xhc3M9XCIke3BhcmFtcy5jdXJyZW50Q2xhc3N9XCI+PC9zcGFuPmAgKyAnIC8gJyArIGA8c3BhbiBjbGFzcz1cIiR7cGFyYW1zLnRvdGFsQ2xhc3N9XCI+PC9zcGFuPmA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ3Byb2dyZXNzYmFyJykge1xuICAgICAgaWYgKHBhcmFtcy5yZW5kZXJQcm9ncmVzc2Jhcikge1xuICAgICAgICBwYWdpbmF0aW9uSFRNTCA9IHBhcmFtcy5yZW5kZXJQcm9ncmVzc2Jhci5jYWxsKHN3aXBlciwgcGFyYW1zLnByb2dyZXNzYmFyRmlsbENsYXNzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhZ2luYXRpb25IVE1MID0gYDxzcGFuIGNsYXNzPVwiJHtwYXJhbXMucHJvZ3Jlc3NiYXJGaWxsQ2xhc3N9XCI+PC9zcGFuPmA7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXBlci5wYWdpbmF0aW9uLmJ1bGxldHMgPSBbXTtcbiAgICBlbC5mb3JFYWNoKHN1YkVsID0+IHtcbiAgICAgIGlmIChwYXJhbXMudHlwZSAhPT0gJ2N1c3RvbScpIHtcbiAgICAgICAgc3ViRWwuaW5uZXJIVE1MID0gcGFnaW5hdGlvbkhUTUwgfHwgJyc7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdidWxsZXRzJykge1xuICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRzLnB1c2goLi4uc3ViRWwucXVlcnlTZWxlY3RvckFsbChjbGFzc2VzVG9TZWxlY3RvcihwYXJhbXMuYnVsbGV0Q2xhc3MpKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHBhcmFtcy50eXBlICE9PSAnY3VzdG9tJykge1xuICAgICAgZW1pdCgncGFnaW5hdGlvblJlbmRlcicsIGVsWzBdKTtcbiAgICB9XG4gI
5196H1cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24gPSBjcmVhdGVFbGVtZW50SWZOb3REZWZpbmVkKHN3aXBlciwgc3dpcGVyLm9yaWdpbmFsUGFyYW1zLnBhZ2luYXRpb24sIHN3aXBlci5wYXJhbXMucGFnaW5hdGlvbiwge1xuICAgICAgZWw6ICdzd2lwZXItcGFnaW5hdGlvbidcbiAgICB9KTtcbiAgICBjb25zdCBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLnBhZ2luYXRpb247XG4gICAgaWYgKCFwYXJhbXMuZWwpIHJldHVybjtcbiAgICBsZXQgZWw7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMuZWwgPT09ICdzdHJpbmcnICYmIHN3aXBlci5pc0VsZW1lbnQpIHtcbiAgICAgIGVsID0gc3dpcGVyLmVsLnF1ZXJ5U2VsZWN0b3IocGFyYW1zLmVsKTtcbiAgICB9XG4gICAgaWYgKCFlbCAmJiB0eXBlb2YgcGFyYW1zLmVsID09PSAnc3RyaW5nJykge1xuICAgICAgZWwgPSBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwYXJhbXMuZWwpXTtcbiAgICB9XG4gICAgaWYgKCFlbCkge1xuICAgICAgZWwgPSBwYXJhbXMuZWw7XG4gICAgfVxuICAgIGlmICghZWwgfHwgZWwubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgaWYgKHN3aXBlci5wYXJhbXMudW5pcXVlTmF2RWxlbWVudHMgJiYgdHlwZW9mIHBhcmFtcy5lbCA9PT0gJ3N0cmluZycgJiYgQXJyYXkuaXNBcnJheShlbCkgJiYgZWwubGVuZ3RoID4gMSkge1xuICAgICAgZWwgPSBbLi4uc3dpcGVyLmVsLnF1ZXJ5U2VsZWN0b3JBbGwocGFyYW1zLmVsKV07XG4gICAgICAvLyBjaGVjayBpZiBpdCBiZWxvbmdzIHRvIGFub3RoZXIgbmVzdGVkIFN3aXBlclxuICAgICAgaWYgKGVsLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZWwgPSBlbC5maWx0ZXIoc3ViRWwgPT4ge1xuICAgICAgICAgIGlmIChlbGVtZW50UGFyZW50cyhzdWJFbCwgJy5zd2lwZXInKVswXSAhPT0gc3dpcGVyLmVsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pWzBdO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbCkgJiYgZWwubGVuZ3RoID09PSAxKSBlbCA9IGVsWzBdO1xuICAgIE9iamVjdC5hc3NpZ24oc3dpcGVyLnBhZ2luYXRpb24sIHtcbiAgICAgIGVsXG4gICAgfSk7XG4gICAgZWwgPSBtYWtlRWxlbWVudHNBcnJheShlbCk7XG4gICAgZWwuZm9yRWFjaChzdWJFbCA9PiB7XG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdidWxsZXRzJyAmJiBwYXJhbXMuY2xpY2thYmxlKSB7XG4gICAgICAgIHN1YkVsLmNsYXNzTGlzdC5hZGQoLi4uKHBhcmFtcy5jbGlja2FibGVDbGFzcyB8fCAnJykuc3BsaXQoJyAnKSk7XG4gICAgICB9XG4gICAgICBzdWJFbC5jbGFzc0xpc3QuYWRkKHBhcmFtcy5tb2RpZmllckNsYXNzICsgcGFyYW1zLnR5cGUpO1xuICAgICAgc3ViRWwuY2xhc3NMaXN0LmFkZChzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyBwYXJhbXMuaG9yaXpvbn
5196RhbENsYXNzIDogcGFyYW1zLnZlcnRpY2FsQ2xhc3MpO1xuICAgICAgaWYgKHBhcmFtcy50eXBlID09PSAnYnVsbGV0cycgJiYgcGFyYW1zLmR5bmFtaWNCdWxsZXRzKSB7XG4gICAgICAgIHN1YkVsLmNsYXNzTGlzdC5hZGQoYCR7cGFyYW1zLm1vZGlmaWVyQ2xhc3N9JHtwYXJhbXMudHlwZX0tZHluYW1pY2ApO1xuICAgICAgICBkeW5hbWljQnVsbGV0SW5kZXggPSAwO1xuICAgICAgICBpZiAocGFyYW1zLmR5bmFtaWNNYWluQnVsbGV0cyA8IDEpIHtcbiAgICAgICAgICBwYXJhbXMuZHluYW1pY01haW5CdWxsZXRzID0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy50eXBlID09PSAncHJvZ3Jlc3NiYXInICYmIHBhcmFtcy5wcm9ncmVzc2Jhck9wcG9zaXRlKSB7XG4gICAgICAgIHN1YkVsLmNsYXNzTGlzdC5hZGQocGFyYW1zLnByb2dyZXNzYmFyT3Bwb3NpdGVDbGFzcyk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmNsaWNrYWJsZSkge1xuICAgICAgICBzdWJFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQnVsbGV0Q2xpY2spO1xuICAgICAgfVxuICAgICAgaWYgKCFzd2lwZXIuZW5hYmxlZCkge1xuICAgICAgICBzdWJFbC5jbGFzc0xpc3QuYWRkKHBhcmFtcy5sb2NrQ2xhc3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgY29uc3QgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uO1xuICAgIGlmIChpc1BhZ2luYXRpb25EaXNhYmxlZCgpKSByZXR1cm47XG4gICAgbGV0IGVsID0gc3dpcGVyLnBhZ2luYXRpb24uZWw7XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbCA9IG1ha2VFbGVtZW50c0FycmF5KGVsKTtcbiAgICAgIGVsLmZvckVhY2goc3ViRWwgPT4ge1xuICAgICAgICBzdWJFbC5jbGFzc0xpc3QucmVtb3ZlKHBhcmFtcy5oaWRkZW5DbGFzcyk7XG4gICAgICAgIHN1YkVsLmNsYXNzTGlzdC5yZW1vdmUocGFyYW1zLm1vZGlmaWVyQ2xhc3MgKyBwYXJhbXMudHlwZSk7XG4gICAgICAgIHN1YkVsLmNsYXNzTGlzdC5yZW1vdmUoc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gcGFyYW1zLmhvcml6b250YWxDbGFzcyA6IHBhcmFtcy52ZXJ0aWNhbENsYXNzKTtcbiAgICAgICAgaWYgKHBhcmFtcy5jbGlja2FibGUpIHtcbiAgICAgICAgICBzdWJFbC5jbGFzc0xpc3QucmVtb3ZlKC4uLihwYXJhbXMuY2xpY2thYmxlQ2xhc3MgfHwgJycpLnNwbGl0KCcgJykpO1xuICAgICAgICAgIHN1YkVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25CdWxsZXRDbGljayk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3dpcGVyLnBhZ2luYXRpb24uYnVsbGV0cykgc3dpcGVyLnBhZ2luYXRpb24uYnVsbGV0cy5mb3JFYWNoKHN1YkVsID0+IHN1YkVsLmNsYXNzTGlzdC5yZW1vdmUoLi4ucGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzLnNwbGl0KCcgJykpKTtcbiAgfVxuICBvbignY2hhbmdlRGlyZWN0aW9uJywgKCkgPT4ge1xuICAgIGlmICghc3dpcGVyLnBhZ2luYXRpb24gfHwgIXN3aXBlci5wYWdpbmF0aW9uLmVsKSByZXR1cm47XG4gICAgY29uc3QgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uO1xuICAgIGxldCB7XG4gICAgICBlbFxuICAgIH0gPSBzd2lwZXIucGFnaW5hdGlvbjtcbiAgICBlbCA9IG1ha2VFbGVtZW50c0FycmF5KGVsKTtcbiAgICBlbC5mb3JFYWNoKHN1YkVsID0+IHtcbiAgICAgIHN1YkVsLmNsYXNzTGlzdC5yZW1vdmUocGFyYW1zLmhvcml6b250YWxDbGFzcywgcGFyYW1zLnZlcnRpY2FsQ2xhc3MpO1xuICAgICAgc3ViRWwuY2xhc3NMaXN0LmFkZChzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyBwYXJhbXMuaG9yaXpvbn
5196RhbENsYXNzIDogcGFyYW1zLnZlcnRpY2FsQ2xhc3MpO1xuICAgIH0pO1xuICB9KTtcbiAgb24oJ2luaXQnLCAoKSA9PiB7XG4gICAgaWYgKHN3aXBlci5wYXJhbXMucGFnaW5hdGlvbi5lbmFibGVkID09PSBmYWxzZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICBkaXNhYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluaXQoKTtcbiAgICAgIHJlbmRlcigpO1xuICAgICAgdXBkYXRlKCk7XG4gICAgfVxuICB9KTtcbiAgb24oJ2FjdGl2ZUluZGV4Q2hhbmdlJywgKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygc3dpcGVyLnNuYXBJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHVwZGF0ZSgpO1xuICAgIH1cbiAgfSk7XG4gIG9uKCdzbmFwSW5kZXhDaGFuZ2UnLCAoKSA9PiB7XG4gICAgdXBkYXRlKCk7XG4gIH0pO1xuICBvbignc25hcEdyaWRMZW5ndGhDaGFuZ2UnLCAoKSA9PiB7XG4gICAgcmVuZGVyKCk7XG4gICAgdXBkYXRlKCk7XG4gIH0pO1xuICBvbignZGVzdHJveScsICgpID0+IHtcbiAgICBkZXN0cm95KCk7XG4gIH0pO1xuICBvbignZW5hYmxlIGRpc2FibGUnLCAoKSA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGVsXG4gICAgfSA9IHN3aXBlci5wYWdpbmF0aW9uO1xuICAgIGlmIChlbCkge1xuICAgICAgZWwgPSBtYWtlRWxlbWVudHNBcnJheShlbCk7XG4gICAgICBlbC5mb3JFYWNoKHN1YkVsID0+IHN1YkVsLmNsYXNzTGlzdFtzd2lwZXIuZW5hYmxlZCA/ICdyZW1vdmUnIDogJ2FkZCddKHN3aXBlci5wYXJhbXMucGFnaW5hdGlvbi5sb2NrQ2xhc3MpKTtcbiAgICB9XG4gIH0pO1xuICBvbignbG9jayB1bmxvY2snLCAoKSA9PiB7XG4gICAgdXBkYXRlKCk7XG4gIH0pO1xuICBvbignY2xpY2snLCAoX3MsIGUpID0+IHtcbiAgICBjb25zdCB0YXJnZXRFbCA9IGUudGFyZ2V0O1xuICAgIGNvbnN0IGVsID0gbWFrZUVsZW1lbnRzQXJyYXkoc3dpcGVyLnBhZ2luYXRpb24uZWwpO1xuICAgIGlmIChzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24uZWwgJiYgc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLmhpZGVPbkNsaWNrICYmIGVsICYmIGVsLmxlbmd0aCA+IDAgJiYgIXRhcmdldEVsLmNsYXNzTGlzdC5jb250YWlucyhzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24uYnVsbGV0Q2xhc3MpKSB7XG4gICAgICBpZiAoc3dpcGVyLm5hdmlnYXRpb24gJiYgKHN3aXBlci5uYXZpZ2F0aW9uLm5leHRFbCAmJiB0YXJnZXRFbCA9PT0gc3dpcGVyLm5hdmlnYXRpb24ubmV4dEVsIHx8IHN3aXBlci5uYXZpZ2F0aW9uLnByZXZFbCAmJiB0YXJnZXRFbCA9PT0gc3dpcGVyLm5hdmlnYXRpb24ucHJldkVsKSkgcmV0dXJuO1xuICAgICAgY29uc3QgaXNIaWRkZW4gPSBlbFswXS5jbGFzc0xpc3QuY29udGFpbnMoc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLmhpZGRlbkNsYXNzKTtcbiAgICAgIGlmIChpc0hpZGRlbiA9PT0gdHJ1ZSkge1xuICAgICAgICBlbWl0KCdwYWdpbmF0aW9uU2hvdycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW1pdCgncGFnaW5hdGlvbkhpZGUnKTtcbiAgICAgIH1cbiAgICAgIGVsLmZvckVhY2goc3ViRWwgPT4gc3ViRWwuY2xhc3NMaXN0LnRvZ2dsZShzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24uaGlkZGVuQ2xhc3MpKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBlbmFibGUgPSAoKSA9PiB7XG4gICAgc3dpcGVyLmVsLmNsYXNzTGlzdC5yZW1vdmUoc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLnBhZ2luYXRpb25EaXNhYmxlZENsYXNzKTtcbiAgICBsZXQge1xuICAgICAgZWxcbiAgICB9ID0gc3dpcGVyLnBhZ2luYXRpb247XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbCA9IG1ha2VFbGVtZW50c0FycmF5KGVsKTtcbiAgICAgIGVsLmZvckVhY2goc3ViRWwgPT4gc3ViRWwuY2xhc3NMaXN0LnJlbW92ZShzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24ucGFnaW5hdGlvbkRpc2FibGVkQ2xhc3MpKTtcbiAgICB9XG4gICAgaW5pdCgpO1xuICAgIHJlbmRlcigpO1xuICAgIHVwZGF0ZSgpO1xuICB9O1xuICBjb25zdCBkaXNhYmxlID0gKCkgPT4ge1xuICAgIHN3aXBlci5lbC5jbGFzc0xpc3QuYWRkKHN3aXBlci5wYXJhbXMucGFnaW5hdGlvbi5wYWdpbmF0aW9uRGlzYWJsZWRDbGFzcyk7XG4gICAgbGV0IHtcbiAgICAgIGVsXG4gICAgfSA9IHN3aXBlci5wYWdpbmF0aW9uO1xuICAgIGlmIChlbCkge1xuICAgICAgZWwgPSBtYWtlRWxlbWVudHNBcnJheShlbCk7XG4gICAgICBlbC5mb3JFYWNoKHN1YkVsID0+IHN1YkVsLmNsYXNzTGlzdC5hZGQoc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLnBhZ2luYXRpb25EaXNhYmxlZENsYXNzKSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKTtcbiAgfTtcbiAgT2JqZWN0LmFzc2lnbihzd2lwZXIucGFnaW5hdGlvbiwge1xuICAgIGVuYWJsZSxcbiAgICBkaXNhYmxlLFxuICAgIHJlbmRlcixcbiAgICB1cGRhdGUsXG4gICAgaW5pdCxcbiAgICBkZXN0cm95XG4gIH0pO1xufVxuXG5leHBvcnQgeyBQYWdpbmF0aW9uIGFzIGRlZmF1bHQgfTtcbiIsImltcG9ydCB7IGcgYXMgZ2V0RG9jdW1lbnQgfSBmcm9tICcuLi9zaGFyZWQvc3NyLXdpbmRvdy5lc20ubWpzJztcblxuLyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiBcIm9mZlwiICovXG4vKiBlc2xpbnQgbm8tdXNlLWJlZm9yZS1kZWZpbmU6IFwib2ZmXCIgKi9cbmZ1bmN0aW9uIEF1dG9wbGF5KF9yZWYpIHtcbiAgbGV0IHtcbiAgICBzd2lwZXIsXG4gICAgZXh0ZW5kUGFyYW1zLFxuICAgIG9uLFxuICAgIGVtaXQsXG4gICAgcGFyYW1zXG4gIH0gPSBfcmVmO1xuICBzd2lwZXIuYXV0b3BsYXkgPSB7XG4gICAgcnVubmluZzogZmFsc2UsXG4gICAgcGF1c2VkOiBmYWxzZSxcbiAgICB0aW1lTGVmdDogMFxuICB9O1xuICBleHRlbmRQYXJhbXMoe1xuICAgIGF1dG9wbGF5OiB7XG4gICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgIGRlbGF5OiAzMDAwLFxuICAgICAgd2FpdEZvclRyYW5zaXRpb246IHRydWUsXG4gICAgICBkaXNhYmxlT25JbnRlcmFjdGlvbjogZmFsc2UsXG4gICAgICBzdG9wT25MYXN0U2xpZGU6IGZhbHNlLFxuICAgICAgcmV2ZXJzZURpcmVjdGlvbjogZmFsc2UsXG4gICAgICBwYXVzZU9uTW91c2VFbnRlcjogZmFsc2VcbiAgICB9XG4gI
5196H0pO1xuICBsZXQgdGltZW91dDtcbiAgbGV0IHJhZjtcbiAgbGV0IGF1dG9wbGF5RGVsYXlUb3RhbCA9IHBhcmFtcyAmJiBwYXJhbXMuYXV0b3BsYXkgPyBwYXJhbXMuYXV0b3BsYXkuZGVsYXkgOiAzMDAwO1xuICBsZXQgYXV0b3BsYXlEZWxheUN1cnJlbnQgPSBwYXJhbXMgJiYgcGFyYW1zLmF1dG9wbGF5ID8gcGFyYW1zLmF1dG9wbGF5LmRlbGF5IDogMzAwMDtcbiAgbGV0IGF1dG9wbGF5VGltZUxlZnQ7XG4gIGxldCBhdXRvcGxheVN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICBsZXQgd2FzUGF1c2VkO1xuICBsZXQgaXNUb3VjaGVkO1xuICBsZXQgcGF1c2VkQnlUb3VjaDtcbiAgbGV0IHRvdWNoU3RhcnRUaW1lb3V0O1xuICBsZXQgc2xpZGVDaGFuZ2VkO1xuICBsZXQgcGF1c2VkQnlJbnRlcmFjdGlvbjtcbiAgbGV0IHBhdXNlZEJ5UG9pbnRlckVudGVyO1xuICBmdW5jdGlvbiBvblRyYW5zaXRpb25FbmQoZSkge1xuICAgIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci53cmFwcGVyRWwpIHJldHVybjtcbiAgICBpZiAoZS50YXJnZXQgIT09IHN3aXBlci53cmFwcGVyRWwpIHJldHVybjtcbiAgICBzd2lwZXIud3JhcHBlckVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBvblRyYW5zaXRpb25FbmQpO1xuICAgIGlmIChwYXVzZWRCeVBvaW50ZXJFbnRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXN1bWUoKTtcbiAgfVxuICBjb25zdCBjYWxjVGltZUxlZnQgPSAoKSA9PiB7XG4gICAgaWYgKHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci5hdXRvcGxheS5ydW5uaW5nKSByZXR1cm47XG4gICAgaWYgKHN3aXBlci5hdXRvcGxheS5wYXVzZWQpIHtcbiAgICAgIHdhc1BhdXNlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh3YXNQYXVzZWQpIHtcbiAgICAgIGF1dG9wbGF5RGVsYXlDdXJyZW50ID0gYXV0b3BsYXlUaW1lTGVmdDtcbiAgICAgIHdhc1BhdXNlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0aW1lTGVmdCA9IHN3aXBlci5hdXRvcGxheS5wYXVzZWQgPyBhdXRvcGxheVRpbWVMZWZ0IDogYXV0b3BsYXlTdGFydFRpbWUgKyBhdXRvcGxheURlbGF5Q3VycmVudCAtIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIHN3aXBlci5hdXRvcGxheS50aW1lTGVmdCA9IHRpbWVMZWZ0O1xuICAgIGVtaXQoJ2F1dG9wbGF5VGltZUxlZnQnLCB0aW1lTGVmdCwgdGltZUxlZnQgLyBhdXRvcGxheURlbGF5VG90YWwpO1xuICAgIHJhZiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBjYWxjVGltZUxlZnQoKTtcbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgZ2V0U2xpZGVEZWxheSA9ICgpID0+IHtcbiAgICBsZXQgYWN0aXZlU2xpZGVFbDtcbiAgICBpZiAoc3dpcGVyLnZpcnR1YWwgJiYgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLmVuYWJsZWQpIHtcbiAgICAgIGFjdGl2ZVNsaWRlRWwgPSBzd2lwZXIuc2xpZGVzLmZpbHRlcihzbGlkZUVsID0+IHNsaWRlRWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzd2lwZXItc2xpZGUtYWN0aXZlJykpWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY3RpdmVTbGlkZUVsID0gc3dpcGVyLnNsaWRlc1tzd2lwZXIuYWN0aXZlSW5kZXhdO1xuICAgIH1cbiAgICBpZiAoIWFjdGl2ZVNsaWRlRWwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3VycmVudFNsaWRlRGVsYXkgPSBwYXJzZUludChhY3RpdmVTbGlkZUVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zd2lwZXItYXV0b3BsYXknKSwgMTApO1xuICAgIHJldHVybiBjdXJyZW50U2xpZGVEZWxheTtcbiAgfTtcbiAgY29uc3QgcnVuID0gZGVsYXlGb3JjZSA9PiB7XG4gICAgaWYgKHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci5hdXRvcGxheS5ydW5uaW5nKSByZXR1cm47XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKTtcbiAgICBjYWxjVGltZUxlZnQoKTtcbiAgICBsZXQgZGVsYXkgPSB0eXBlb2YgZGVsYXlGb3JjZSA9PT0gJ3VuZGVmaW5lZCcgPyBzd2lwZXIucGFyYW1zLmF1dG9wbGF5LmRlbGF5IDogZGVsYXlGb3JjZTtcbiAgICBhdXRvcGxheURlbGF5VG90YWwgPSBzd2lwZXIucGFyYW1zLmF1dG9wbGF5LmRlbGF5O1xuICAgIGF1dG9wbGF5RGVsYXlDdXJyZW50ID0gc3dpcGVyLnBhcmFtcy5hdXRvcGxheS5kZWxheTtcbiAgICBjb25zdCBjdXJyZW50U2xpZGVEZWxheSA9IGdldFNsaWRlRGVsYXkoKTtcbiAgICBpZiAoIU51bWJlci5pc05hTihjdXJyZW50U2xpZGVEZWxheSkgJiYgY3VycmVudFNsaWRlRGVsYXkgPiAwICYmIHR5cGVvZiBkZWxheUZvcmNlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgZGVsYXkgPSBjdXJyZW50U2xpZGVEZWxheTtcbiAgICAgIGF1dG9wbGF5RGVsYXlUb3RhbCA9IGN1cnJlbnRTbGlkZURlbGF5O1xuICAgICAgYXV0b3BsYXlEZWxheUN1cnJlbnQgPSBjdXJyZW50U2xpZGVEZWxheTtcbiAgICB9XG4gICAgYXV0b3BsYXlUaW1lTGVmdCA9IGRlbGF5O1xuICAgIGNvbnN0IHNwZWVkID0gc3dpcGVyLnBhcmFtcy5zcGVlZDtcbiAgICBjb25zdCBwcm9jZWVkID0gKCkgPT4ge1xuICAgICAgaWYgKCFzd2lwZXIgfHwgc3dpcGVyLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuYXV0b3BsYXkucmV2ZXJzZURpcmVjdGlvbikge1xuICAgICAgICBpZiAoIXN3aXBlci5pc0JlZ2lubmluZyB8fCBzd2lwZXIucGFyYW1zLmxvb3AgfHwgc3dpcGVyLnBhcmFtcy5yZXdpbmQpIHtcbiAgICAgICAgICBzd2lwZXIuc2xpZGVQcmV2KHNwZWVkLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICBlbWl0KCdhdXRvcGxheScpO1xuICAgICAgICB9IGVsc2UgaWYgKCFzd2lwZXIucGFyYW1zLmF1dG9wbGF5LnN0b3BPbkxhc3RTbGlkZSkge1xuICAgICAgICAgIHN3aXBlci5zbGlkZVRvKHN3aXBlci5zbGlkZXMubGVuZ3RoIC0gMSwgc3BlZWQsIHRydWUsIHRydWUpO1xuICAgICAgICAgIGVtaXQoJ2F1dG9wbGF5Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghc3dpcGVyLmlzRW5kIHx8IHN3aXBlci5wYXJhbXMubG9vcCB8fCBzd2lwZXIucGFyYW1zLnJld2luZCkge1xuICAgICAgICAgI
5196HN3aXBlci5zbGlkZU5leHQoc3BlZWQsIHRydWUsIHRydWUpO1xuICAgICAgICAgIGVtaXQoJ2F1dG9wbGF5Jyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXN3aXBlci5wYXJhbXMuYXV0b3BsYXkuc3RvcE9uTGFzdFNsaWRlKSB7XG4gICAgICAgICAgc3dpcGVyLnNsaWRlVG8oMCwgc3BlZWQsIHRydWUsIHRydWUpO1xuICAgICAgICAgIGVtaXQoJ2F1dG9wbGF5Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmNzc01vZGUpIHtcbiAgICAgICAgYXV0b3BsYXlTdGFydFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBydW4oKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHByb2NlZWQoKTtcbiAgICAgIH0sIGRlbGF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgcHJvY2VlZCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgcmV0dXJuIGRlbGF5O1xuICB9O1xuICBjb25zdCBzdGFydCA9ICgpID0+IHtcbiAgICBhdXRvcGxheVN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIHN3aXBlci5hdXRvcGxheS5ydW5uaW5nID0gdHJ1ZTtcbiAgICBydW4oKTtcbiAgICBlbWl0KCdhdXRvcGxheVN0YXJ0Jyk7XG4gIH07XG4gIGNvbnN0IHN0b3AgPSAoKSA9PiB7XG4gICAgc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcgPSBmYWxzZTtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKTtcbiAgICBlbWl0KCdhdXRvcGxheVN0b3AnKTtcbiAgfTtcbiAgY29uc3QgcGF1c2UgPSAoaW50ZXJuYWwsIHJlc2V0KSA9PiB7XG4gICAgaWYgKHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci5hdXRvcGxheS5ydW5uaW5nKSByZXR1cm47XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIGlmICghaW50ZXJuYWwpIHtcbiAgICAgIHBhdXNlZEJ5SW50ZXJhY3Rpb24gPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwcm9jZWVkID0gKCkgPT4ge1xuICAgICAgZW1pdCgnYXV0b3BsYXlQYXVzZScpO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuYXV0b3BsYXkud2FpdEZvclRyYW5zaXRpb24pIHtcbiAgICAgICAgc3dpcGVyLndyYXBwZXJFbC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgb25UcmFuc2l0aW9uRW5kKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VtZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgc3dpcGVyLmF1dG9wbGF5LnBhdXNlZCA9IHRydWU7XG4gICAgaWYgKHJlc2V0KSB7XG4gICAgICBpZiAoc2xpZGVDaGFuZ2VkKSB7XG4gICAgICAgIGF1dG9wbGF5VGltZUxlZnQgPSBzd2lwZXIucGFyYW1zLmF1dG9wbGF5LmRlbGF5O1xuICAgICAgfVxuICAgICAgc2xpZGVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICBwcm9jZWVkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRlbGF5ID0gYXV0b3BsYXlUaW1lTGVmdCB8fCBzd2lwZXIucGFyYW1zLmF1dG9wbGF5LmRlbGF5O1xuICAgIGF1dG9wbGF5VGltZUxlZnQgPSBkZWxheSAtIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGF1dG9wbGF5U3RhcnRUaW1lKTtcbiAgICBpZiAoc3dpcGVyLmlzRW5kICYmIGF1dG9wbGF5VGltZUxlZnQgPCAwICYmICFzd2lwZXIucGFyYW1zLmxvb3ApIHJldHVybjtcbiAgICBpZiAoYXV0b3BsYXlUaW1lTGVmdCA8IDApIGF1dG9wbGF5VGltZUxlZnQgPSAwO1xuICAgIHByb2NlZWQoKTtcbiAgfTtcbiAgY29uc3QgcmVzdW1lID0gKCkgPT4ge1xuICAgIGlmIChzd2lwZXIuaXNFbmQgJiYgYXV0b3BsYXlUaW1lTGVmdCA8IDAgJiYgIXN3aXBlci5wYXJhbXMubG9vcCB8fCBzd2lwZXIuZGVzdHJveWVkIHx8ICFzd2lwZXIuYXV0b3BsYXkucnVubmluZykgcmV0dXJuO1xuICAgIGF1dG9wbGF5U3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgaWYgKHBhdXNlZEJ5SW50ZXJhY3Rpb24pIHtcbiAgICAgIHBhdXNlZEJ5SW50ZXJhY3Rpb24gPSBmYWxzZTtcbiAgICAgIHJ1bihhdXRvcGxheVRpbWVMZWZ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcnVuKCk7XG4gICAgfVxuICAgIHN3aXBlci5hdXRvcGxheS5wYXVzZWQgPSBmYWxzZTtcbiAgICBlbWl0KCdhdXRvcGxheVJlc3VtZScpO1xuICB9O1xuICBjb25zdCBvblZpc2liaWxpdHlDaGFuZ2UgPSAoKSA9PiB7XG4gICAgaWYgKHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci5hdXRvcGxheS5ydW5uaW5nKSByZXR1cm47XG4gICAgY29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICdoaWRkZW4nKSB7XG4gICAgICBwYXVzZWRCeUludGVyYWN0aW9uID0gdHJ1ZTtcbiAgICAgIHBhdXNlKHRydWUpO1xuICAgIH1cbiAgICBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZScpIHtcbiAgICAgIHJlc3VtZSgpO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgb25Qb2ludGVyRW50ZXIgPSBlID0+IHtcbiAgICBpZiAoZS5wb2ludGVyVHlwZSAhPT0gJ21vdXNlJykgcmV0dXJuO1xuICAgIHBhdXNlZEJ5SW50ZXJhY3Rpb24gPSB0cnVlO1xuICAgIHBhdXNlZEJ5UG9pbnRlckVudGVyID0gdHJ1ZTtcbiAgICBpZiAoc3dpcGVyLmFuaW1hdGluZyB8fCBzd2lwZXIuYXV0b3BsYXkucGF1c2VkKSByZXR1cm47XG4gICAgcGF1c2UodHJ1ZSk7XG4gIH07XG4gIGNvbnN0IG9uUG9pbnRlckxlYXZlID0gZSA9PiB7XG4gICAgaWYgKGUucG9pbnRlclR5cGUgIT09ICdtb3VzZScpIHJldHVybjtcbiAgICBwYXVzZWRCeVBvaW50ZXJFbnRlciA9IGZhbHNlO1xuICAgIGlmIChzd2lwZXIuYXV0b3BsYXkucGF1c2VkKSB7XG4gICAgICByZXN1bWUoKTtcbiAgICB9XG4gI
5196H07XG4gIGNvbnN0IGF0dGFjaE1vdXNlRXZlbnRzID0gKCkgPT4ge1xuICAgIGlmIChzd2lwZXIucGFyYW1zLmF1dG9wbGF5LnBhdXNlT25Nb3VzZUVudGVyKSB7XG4gICAgICBzd2lwZXIuZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmVudGVyJywgb25Qb2ludGVyRW50ZXIpO1xuICAgICAgc3dpcGVyLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsZWF2ZScsIG9uUG9pbnRlckxlYXZlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGRldGFjaE1vdXNlRXZlbnRzID0gKCkgPT4ge1xuICAgIHN3aXBlci5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZW50ZXInLCBvblBvaW50ZXJFbnRlcik7XG4gICAgc3dpcGVyLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsZWF2ZScsIG9uUG9pbnRlckxlYXZlKTtcbiAgfTtcbiAgY29uc3QgYXR0YWNoRG9jdW1lbnRFdmVudHMgPSAoKSA9PiB7XG4gICAgY29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBvblZpc2liaWxpdHlDaGFuZ2UpO1xuICB9O1xuICBjb25zdCBkZXRhY2hEb2N1bWVudEV2ZW50cyA9ICgpID0+IHtcbiAgICBjb25zdCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIG9uVmlzaWJpbGl0eUNoYW5nZSk7XG4gIH07XG4gIG9uKCdpbml0JywgKCkgPT4ge1xuICAgIGlmIChzd2lwZXIucGFyYW1zLmF1dG9wbGF5LmVuYWJsZWQpIHtcbiAgICAgIGF0dGFjaE1vdXNlRXZlbnRzKCk7XG4gICAgICBhdHRhY2hEb2N1bWVudEV2ZW50cygpO1xuICAgICAgc3RhcnQoKTtcbiAgICB9XG4gIH0pO1xuICBvbignZGVzdHJveScsICgpID0+IHtcbiAgICBkZXRhY2hNb3VzZUV2ZW50cygpO1xuICAgIGRldGFjaERvY3VtZW50RXZlbnRzKCk7XG4gICAgaWYgKHN3aXBlci5hdXRvcGxheS5ydW5uaW5nKSB7XG4gICAgICBzdG9wKCk7XG4gICAgfVxuICB9KTtcbiAgb24oJ19mcmVlTW9kZVN0YXRpY1JlbGVhc2UnLCAoKSA9PiB7XG4gICAgaWYgKHBhdXNlZEJ5VG91Y2ggfHwgcGF1c2VkQnlJbnRlcmFjdGlvbikge1xuICAgICAgcmVzdW1lKCk7XG4gICAgfVxuICB9KTtcbiAgb24oJ19mcmVlTW9kZU5vTW9tZW50dW1SZWxlYXNlJywgKCkgPT4ge1xuICAgIGlmICghc3dpcGVyLnBhcmFtcy5hdXRvcGxheS5kaXNhYmxlT25JbnRlcmFjdGlvbikge1xuICAgICAgcGF1c2UodHJ1ZSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3AoKTtcbiAgICB9XG4gIH0pO1xuICBvbignYmVmb3JlVHJhbnNpdGlvblN0YXJ0JywgKF9zLCBzcGVlZCwgaW50ZXJuYWwpID0+IHtcbiAgICBpZiAoc3dpcGVyLmRlc3Ryb3llZCB8fCAhc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcpIHJldHVybjtcbiAgICBpZiAoaW50ZXJuYWwgfHwgIXN3aXBlci5wYXJhbXMuYXV0b3BsYXkuZGlzYWJsZU9uSW50ZXJhY3Rpb24pIHtcbiAgICAgIHBhdXNlKHRydWUsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9wKCk7XG4gICAgfVxuICB9KTtcbiAgb24oJ3NsaWRlckZpcnN0TW92ZScsICgpID0+IHtcbiAgICBpZiAoc3dpcGVyLmRlc3Ryb3llZCB8fCAhc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcpIHJldHVybjtcbiAgICBpZiAoc3dpcGVyLnBhcmFtcy5hdXRvcGxheS5kaXNhYmxlT25JbnRlcmFjdGlvbikge1xuICAgICAgc3RvcCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpc1RvdWNoZWQgPSB0cnVlO1xuICAgIHBhdXNlZEJ5VG91Y2ggPSBmYWxzZTtcbiAgICBwYXVzZWRCeUludGVyYWN0aW9uID0gZmFsc2U7XG4gICAgdG91Y2hTdGFydFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHBhdXNlZEJ5SW50ZXJhY3Rpb24gPSB0cnVlO1xuICAgICAgcGF1c2VkQnlUb3VjaCA9IHRydWU7XG4gICAgICBwYXVzZSh0cnVlKTtcbiAgICB9LCAyMDApO1xuICB9KTtcbiAgb24oJ3RvdWNoRW5kJywgKCkgPT4ge1xuICAgIGlmIChzd2lwZXIuZGVzdHJveWVkIHx8ICFzd2lwZXIuYXV0b3BsYXkucnVubmluZyB8fCAhaXNUb3VjaGVkKSByZXR1cm47XG4gICAgY2xlYXJUaW1lb3V0KHRvdWNoU3RhcnRUaW1lb3V0KTtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgaWYgKHN3aXBlci5wYXJhbXMuYXV0b3BsYXkuZGlzYWJsZU9uSW50ZXJhY3Rpb24pIHtcbiAgICAgIHBhdXNlZEJ5VG91Y2ggPSBmYWxzZTtcbiAgICAgIGlzVG91Y2hlZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocGF1c2VkQnlUb3VjaCAmJiBzd2lwZXIucGFyYW1zLmNzc01vZGUpIHJlc3VtZSgpO1xuICAgIHBhdXNlZEJ5VG91Y2ggPSBmYWxzZTtcbiAgICBpc1RvdWNoZWQgPSBmYWxzZTtcbiAgfSk7XG4gIG9uKCdzbGlkZUNoYW5nZScsICgpID0+IHtcbiAgICBpZiAoc3dpcGVyLmRlc3Ryb3llZCB8fCAhc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcpIHJldHVybjtcbiAgICBzbGlkZUNoYW5nZWQgPSB0cnVlO1xuICB9KTtcbiAgT2JqZWN0LmFzc2lnbihzd2lwZXIuYXV0b3BsYXksIHtcbiAgICBzdGFydCxcbiAgICBzdG9wLFxuICAgIHBhdXNlLFxuICAgIHJlc3VtZVxuICB9KTtcbn1cblxuZXhwb3J0IHsgQXV0b3BsYXkgYXMgZGVmYXVsdCB9O1xuIl0sIm5hbWVzIjpbImlzT2JqZWN0IiwiZXh0ZW5kIiwiY2xhc3NlcyIsImdldENvbXB1dGVkU3R5bGUiLCJ3aW5kb3ciLCJkb2N1bWVudCIsInN1cHBvcnQiLCJvYnNlcnZlclVwZGF0ZSIsImV2ZW50cyIsInNsaWRlIiwidHJhbnNsYXRlIiwicmVhbEluZGV4IiwibWluVHJhbnNsYXRlIiwibWF4VHJhbnNsYXRlIiwidHJhbnNpdGlvbkVuZCIsInNsaWRlVG8iLCJzZXRUcmFuc2xhdGUiLCJpIiwiaW5jcmVtZW50IiwiYnJlYWtwb2ludHMiLCJ1cGRhdGUiXSwibWFwcGluZ3MiOiJBQVlBLFNBQVNBLFdBQVMsS0FBSztBQUNyQixTQUFPLFFBQVEsUUFBUSxPQUFPLFFBQVEsWUFBWSxpQkFBaUIsT0FBTyxJQUFJLGdCQUFnQjtBQUNoRztBQUNBLFNBQVNDLFNBQU8sUUFBUSxLQUFLO0FBQzNCLE1BQUksV0FBVyxRQUFRO0FBQ3JCLGFBQVMsQ0FBQTtBQUFBLEVBQ1Y7QUFDRCxNQUFJLFFBQVEsUUFBUTtBQUNsQixVQUFNLENBQUE7QUFBQSxFQUNQO0FBQ0QsU0FBT
5196yxLQUFLLEdBQUcsRUFBRSxRQUFRLFNBQU87QUFDOUIsUUFBSSxPQUFPLE9BQU8sR0FBRyxNQUFNO0FBQWEsYUFBTyxHQUFHLElBQUksSUFBSSxHQUFHO0FBQUEsYUFBV0QsV0FBUyxJQUFJLEdBQUcsQ0FBQyxLQUFLQSxXQUFTLE9BQU8sR0FBRyxDQUFDLEtBQUssT0FBTyxLQUFLLElBQUksR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHO0FBQ3ZKQyxlQUFPLE9BQU8sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQUEsSUFDN0I7QUFBQSxFQUNMLENBQUc7QUFDSDtBQUNBLE1BQU0sY0FBYztBQUFBLEVBQ2xCLE1BQU0sQ0FBRTtBQUFBLEVBQ1IsbUJBQW1CO0FBQUEsRUFBRTtBQUFBLEVBQ3JCLHNCQUFzQjtBQUFBLEVBQUU7QUFBQSxFQUN4QixlQUFlO0FBQUEsSUFDYixPQUFPO0FBQUEsSUFBRTtBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1g7QUFBQSxFQUNELGdCQUFnQjtBQUNkLFdBQU87QUFBQSxFQUNSO0FBQUEsRUFDRCxtQkFBbUI7QUFDakIsV0FBTztFQUNSO0FBQUEsRUFDRCxpQkFBaUI7QUFDZixXQUFPO0FBQUEsRUFDUjtBQUFBLEVBQ0QsY0FBYztBQUNaLFdBQU87QUFBQSxNQUNMLFlBQVk7QUFBQSxNQUFFO0FBQUEsSUFDcEI7QUFBQSxFQUNHO0FBQUEsRUFDRCxnQkFBZ0I7QUFDZCxXQUFPO0FBQUEsTUFDTCxVQUFVLENBQUU7QUFBQSxNQUNaLFlBQVksQ0FBRTtBQUFBLE1BQ2QsT0FBTyxDQUFFO0FBQUEsTUFDVCxlQUFlO0FBQUEsTUFBRTtBQUFBLE1BQ2pCLHVCQUF1QjtBQUNyQixlQUFPO01BQ1I7QUFBQSxJQUNQO0FBQUEsRUFDRztBQUFBLEVBQ0Qsa0JBQWtCO0FBQ2hCLFdBQU87RUFDUjtBQUFBLEVBQ0QsYUFBYTtBQUNYLFdBQU87QUFBQSxFQUNSO0FBQUEsRUFDRCxVQUFVO0FBQUEsSUFDUixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsSUFDTixVQUFVO0FBQUEsS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xPQUFPLE9BQU8sU0FBUyxzQkFBc0I7QUFDL0M7QUFDQTtBQUFBLElBQ0Q7QUFDRCxnQkFBWTtBQUNaLG9CQUFnQjtBQUNoQiwwQkFBc0I7QUFDdEIsd0JBQW9CLFdBQVcsTUFBTTtBQUNuQyw0QkFBc0I7QUFDdEIsc0JBQWdCO0FBQ2hCLFlBQU0sSUFBSTtBQUFBLElBQ1gsR0FBRSxHQU
5196FHO0FBQUEsRUFDVixDQUFHO0FBQ0QsS0FBRyxZQUFZLE1BQU07QUFDbkIsUUFBSSxPQUFPLGFBQWEsQ0FBQyxPQUFPLFNBQVMsV0FBVyxDQUFDO0FBQVc7QUFDaEUsaUJBQWEsaUJBQWlCO0FBQzlCLGlCQUFhLE9BQU87QUFDcEIsUUFBSSxPQUFPLE9BQU8sU0FBUyxzQkFBc0I7QUFDL0Msc0JBQWdCO0FBQ2hCLGtCQUFZO0FBQ1o7QUFBQSxJQUNEO0FBQ0QsUUFBSSxpQkFBaUIsT0FBTyxPQUFPO0FBQVMsYUFBTTtBQUNsRCxvQkFBZ0I7QUFDaEIsZ0JBQVk7QUFBQSxFQUNoQixDQUFHO0FBQ0QsS0FBRyxlQUFlLE1BQU07QUFDdEIsUUFBSSxPQUFPLGFBQWEsQ0FBQyxPQUFPLFNBQVM7QUFBUztBQUNsRCxtQkFBZTtBQUFBLEVBQ25CLENBQUc7QUFDRCxTQUFPLE9BQU8sT0FBTyxVQUFVO0FBQUEsSUFDN0I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNKLENBQUc7QUFDSDsiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsMyw0LDUsNiw3XX0=
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.