UNPKG

react-background-animation

Version:
446 lines (377 loc) 53.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.sketchFactory = exports.getSketch = void 0; function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } /* Copyright (C) 2013 Justin Windle, http://soulwire.co.uk */ /* eslint-disable */ var getSketch = function getSketch(root, factory) { if ((typeof exports === "undefined" ? "undefined" : _typeof(exports)) === 'object') { // CommonJS like module.exports = factory(root, root.document); } else if (typeof define === 'function' && define.amd) { // AMD define(function () { return factory(root, root.document); }); } else { // Browser global root.Sketch = factory(root, root.document); } }; exports.getSketch = getSketch; var sketchFactory = function sketchFactory(window, document) { "use strict"; /* ---------------------------------------------------------------------- Config ---------------------------------------------------------------------- */ var MATH_PROPS = 'E LN10 LN2 LOG2E LOG10E PI SQRT1_2 SQRT2 abs acos asin atan ceil cos exp floor log round sin sqrt tan atan2 pow max min'.split(' '); var HAS_SKETCH = '__hasSketch'; var M = Math; var CANVAS = 'canvas'; var WEBGL = 'webgl'; var DOM = 'dom'; var doc = document; var win = window; var instances = []; var defaults = { fullscreen: true, autostart: true, autoclear: true, autopause: true, container: doc.body, interval: 1, globals: true, retina: false, type: CANVAS }; var keyMap = { 8: 'BACKSPACE', 9: 'TAB', 13: 'ENTER', 16: 'SHIFT', 27: 'ESCAPE', 32: 'SPACE', 37: 'LEFT', 38: 'UP', 39: 'RIGHT', 40: 'DOWN' }; /* ---------------------------------------------------------------------- Utilities ---------------------------------------------------------------------- */ function isArray(object) { return Object.prototype.toString.call(object) == '[object Array]'; } function isFunction(object) { return typeof object == 'function'; } function isNumber(object) { return typeof object == 'number'; } function isString(object) { return typeof object == 'string'; } function keyName(code) { return keyMap[code] || String.fromCharCode(code); } function extend(target, source, overwrite) { for (var key in source) { if (overwrite || !(key in target)) target[key] = source[key]; } return target; } function proxy(method, context) { return function () { method.apply(context, arguments); }; } function clone(target) { var object = {}; for (var key in target) { if (key === 'webkitMovementX' || key === 'webkitMovementY') continue; if (isFunction(target[key])) object[key] = proxy(target[key], target);else object[key] = target[key]; } return object; } /* ---------------------------------------------------------------------- Constructor ---------------------------------------------------------------------- */ function constructor(context) { var request, handler, target, parent, bounds, index, suffix, clock, node, copy, type, key, val, min, max, w, h; var counter = 0; var touches = []; var resized = false; var setup = false; var ratio = win.devicePixelRatio || 1; var isDiv = context.type == DOM; var is2D = context.type == CANVAS; var mouse = { x: 0.0, y: 0.0, ox: 0.0, oy: 0.0, dx: 0.0, dy: 0.0 }; var eventMap = [context.eventTarget || context.element, pointer, 'mousedown', 'touchstart', pointer, 'mousemove', 'touchmove', pointer, 'mouseup', 'touchend', pointer, 'click', pointer, 'mouseout', pointer, 'mouseover', doc, keypress, 'keydown', 'keyup', win, active, 'focus', 'blur', resize, 'resize']; var keys = {}; for (key in keyMap) { keys[keyMap[key]] = false; } function trigger(method) { if (isFunction(method)) method.apply(context, [].splice.call(arguments, 1)); } function bind(on) { for (index = 0; index < eventMap.length; index++) { node = eventMap[index]; if (isString(node)) target[(on ? 'add' : 'remove') + 'EventListener'].call(target, node, handler, false);else if (isFunction(node)) handler = node;else target = node; } } function update() { cAF(request); request = rAF(update); if (!setup) { trigger(context.setup); setup = isFunction(context.setup); } if (!resized) { trigger(context.resize); resized = isFunction(context.resize); } if (context.running && !counter) { context.dt = (clock = +new Date()) - context.now; context.millis += context.dt; context.now = clock; trigger(context.update); // Pre draw if (is2D) { if (context.retina) { context.save(); if (context.autoclear) { context.scale(ratio, ratio); } } if (context.autoclear) context.clear(); } // Draw trigger(context.draw); // Post draw if (is2D && context.retina) context.restore(); } counter = ++counter % context.interval; } function resize() { target = isDiv ? context.style : context.canvas; suffix = isDiv ? 'px' : ''; w = context.width; h = context.height; if (context.fullscreen) { h = context.height = win.innerHeight; w = context.width = win.innerWidth; } if (context.retina && is2D && ratio) { target.style.height = h + 'px'; target.style.width = w + 'px'; w *= ratio; h *= ratio; } if (target.height !== h) target.height = h + suffix; if (target.width !== w) target.width = w + suffix; if (is2D && !context.autoclear && context.retina) context.scale(ratio, ratio); if (setup) trigger(context.resize); } function align(touch, target) { bounds = target.getBoundingClientRect(); touch.x = touch.pageX - bounds.left - (win.scrollX || win.pageXOffset); touch.y = touch.pageY - bounds.top - (win.scrollY || win.pageYOffset); return touch; } function augment(touch, target) { align(touch, context.element); target = target || {}; target.ox = target.x || touch.x; target.oy = target.y || touch.y; target.x = touch.x; target.y = touch.y; target.dx = target.x - target.ox; target.dy = target.y - target.oy; return target; } function process(event) { event.preventDefault(); copy = clone(event); copy.originalEvent = event; if (copy.touches) { touches.length = copy.touches.length; for (index = 0; index < copy.touches.length; index++) { touches[index] = augment(copy.touches[index], touches[index]); } } else { touches.length = 0; touches[0] = augment(copy, mouse); } extend(mouse, touches[0], true); return copy; } function pointer(event) { event = process(event); min = (max = eventMap.indexOf(type = event.type)) - 1; context.dragging = /down|start/.test(type) ? true : /up|end/.test(type) ? false : context.dragging; while (min) { isString(eventMap[min]) ? trigger(context[eventMap[min--]], event) : isString(eventMap[max]) ? trigger(context[eventMap[max++]], event) : min = 0; } } function keypress(event) { key = event.keyCode; val = event.type == 'keyup'; keys[key] = keys[keyName(key)] = !val; trigger(context[event.type], event); } function active(event) { if (context.autopause) (event.type == 'blur' ? stop : start)(); trigger(context[event.type], event); } // Public API function start() { context.now = +new Date(); context.running = true; } function stop() { context.running = false; } function toggle() { (context.running ? stop : start)(); } function clear() { if (is2D) context.clearRect(0, 0, context.width * ratio, context.height * ratio); } function destroy() { parent = context.element.parentNode; index = instances.indexOf(context); if (parent) parent.removeChild(context.element); if (~index) instances.splice(index, 1); bind(false); stop(); } extend(context, { touches: touches, mouse: mouse, keys: keys, dragging: false, running: false, millis: 0, now: NaN, dt: NaN, destroy: destroy, toggle: toggle, clear: clear, start: start, stop: stop }); instances.push(context); return context.autostart && start(), bind(true), resize(), update(), context; } /* ---------------------------------------------------------------------- Global API ---------------------------------------------------------------------- */ var element, context, Sketch = { CANVAS: CANVAS, WEB_GL: WEBGL, WEBGL: WEBGL, DOM: DOM, instances: instances, install: function install(context) { if (!context[HAS_SKETCH]) { for (var i = 0; i < MATH_PROPS.length; i++) { context[MATH_PROPS[i]] = M[MATH_PROPS[i]]; } extend(context, { TWO_PI: M.PI * 2, HALF_PI: M.PI / 2, QUARTER_PI: M.PI / 4, random: function random(min, max) { if (isArray(min)) return min[~~(M.random() * min.length)]; if (!isNumber(max)) max = min || 1, min = 0; return min + M.random() * (max - min); }, lerp: function lerp(min, max, amount) { return min + amount * (max - min); }, map: function map(num, minA, maxA, minB, maxB) { return (num - minA) / (maxA - minA) * (maxB - minB) + minB; } }); context[HAS_SKETCH] = true; } }, create: function create(options) { options = extend(options || {}, defaults); if (options.globals) Sketch.install(self); element = options.element = options.element || doc.createElement(options.type === DOM ? 'div' : 'canvas'); context = options.context = options.context || function () { switch (options.type) { case CANVAS: return element.getContext('2d', options); case WEBGL: return element.getContext('webgl', options) || element.getContext('experimental-webgl', options); case DOM: return element.canvas = element; } }(); (options.container || doc.body).appendChild(element); return Sketch.augment(context, options); }, augment: function augment(context, options) { options = extend(options || {}, defaults); options.element = context.canvas || context; options.element.className += ' sketch'; extend(context, options, true); return constructor(context); } }; /* ---------------------------------------------------------------------- Shims ---------------------------------------------------------------------- */ var vendors = ['ms', 'moz', 'webkit', 'o']; var scope = self; var then = 0; var a = 'AnimationFrame'; var b = 'request' + a; var c = 'cancel' + a; var rAF = scope[b]; var cAF = scope[c]; for (var i = 0; i < vendors.length && !rAF; i++) { rAF = scope[vendors[i] + 'Request' + a]; cAF = scope[vendors[i] + 'Cancel' + a]; } scope[b] = rAF = rAF || function (callback) { var now = +new Date(); var dt = M.max(0, 16 - (now - then)); var id = setTimeout(function () { callback(now + dt); }, dt); then = now + dt; return id; }; scope[c] = cAF = cAF || function (id) { clearTimeout(id); }; /* ---------------------------------------------------------------------- Output ---------------------------------------------------------------------- */ return Sketch; }; exports.sketchFactory = sketchFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jc3NFZmZlY3RzL2Nyb3NzQnVpbGRpbmcvc2tldGNoLmpzIl0sIm5hbWVzIjpbImdldFNrZXRjaCIsInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRvY3VtZW50IiwiZGVmaW5lIiwiYW1kIiwiU2tldGNoIiwic2tldGNoRmFjdG9yeSIsIndpbmRvdyIsIk1BVEhfUFJPUFMiLCJzcGxpdCIsIkhBU19TS0VUQ0giLCJNIiwiTWF0aCIsIkNBTlZBUyIsIldFQkdMIiwiRE9NIiwiZG9jIiwid2luIiwiaW5zdGFuY2VzIiwiZGVmYXVsdHMiLCJmdWxsc2NyZWVuIiwiYXV0b3N0YXJ0IiwiYXV0b2NsZWFyIiwiYXV0b3BhdXNlIiwiY29udGFpbmVyIiwiYm9keSIsImludGVydmFsIiwiZ2xvYmFscyIsInJldGluYSIsInR5cGUiLCJrZXlNYXAiLCJpc0FycmF5Iiwib2JqZWN0IiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwiaXNGdW5jdGlvbiIsImlzTnVtYmVyIiwiaXNTdHJpbmciLCJrZXlOYW1lIiwiY29kZSIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsImV4dGVuZCIsInRhcmdldCIsInNvdXJjZSIsIm92ZXJ3cml0ZSIsImtleSIsInByb3h5IiwibWV0aG9kIiwiY29udGV4dCIsImFwcGx5IiwiYXJndW1lbnRzIiwiY2xvbmUiLCJjb25zdHJ1Y3RvciIsInJlcXVlc3QiLCJoYW5kbGVyIiwicGFyZW50IiwiYm91bmRzIiwiaW5kZXgiLCJzdWZmaXgiLCJjbG9jayIsIm5vZGUiLCJjb3B5IiwidmFsIiwibWluIiwibWF4IiwidyIsImgiLCJjb3VudGVyIiwidG91Y2hlcyIsInJlc2l6ZWQiLCJzZXR1cCIsInJhdGlvIiwiZGV2aWNlUGl4ZWxSYXRpbyIsImlzRGl2IiwiaXMyRCIsIm1vdXNlIiwieCIsInkiLCJveCIsIm95IiwiZHgiLCJkeSIsImV2ZW50TWFwIiwiZXZlbnRUYXJnZXQiLCJlbGVtZW50IiwicG9pbnRlciIsImtleXByZXNzIiwiYWN0aXZlIiwicmVzaXplIiwia2V5cyIsInRyaWdnZXIiLCJzcGxpY2UiLCJiaW5kIiwib24iLCJsZW5ndGgiLCJ1cGRhdGUiLCJjQUYiLCJyQUYiLCJydW5uaW5nIiwiZHQiLCJEYXRlIiwibm93IiwibWlsbGlzIiwic2F2ZSIsInNjYWxlIiwiY2xlYXIiLCJkcmF3IiwicmVzdG9yZSIsInN0eWxlIiwiY2FudmFzIiwid2lkdGgiLCJoZWlnaHQiLCJpbm5lckhlaWdodCIsImlubmVyV2lkdGgiLCJhbGlnbiIsInRvdWNoIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwicGFnZVgiLCJsZWZ0Iiwic2Nyb2xsWCIsInBhZ2VYT2Zmc2V0IiwicGFnZVkiLCJ0b3AiLCJzY3JvbGxZIiwicGFnZVlPZmZzZXQiLCJhdWdtZW50IiwicHJvY2VzcyIsImV2ZW50IiwicHJldmVudERlZmF1bHQiLCJvcmlnaW5hbEV2ZW50IiwiaW5kZXhPZiIsImRyYWdnaW5nIiwidGVzdCIsImtleUNvZGUiLCJzdG9wIiwic3RhcnQiLCJ0b2dnbGUiLCJjbGVhclJlY3QiLCJkZXN0cm95IiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwiTmFOIiwicHVzaCIsIldFQl9HTCIsImluc3RhbGwiLCJpIiwiVFdPX1BJIiwiUEkiLCJIQUxGX1BJIiwiUVVBUlRFUl9QSSIsInJhbmRvbSIsImxlcnAiLCJhbW91bnQiLCJtYXAiLCJudW0iLCJtaW5BIiwibWF4QSIsIm1pbkIiLCJtYXhCIiwiY3JlYXRlIiwib3B0aW9ucyIsInNlbGYiLCJjcmVhdGVFbGVtZW50IiwiZ2V0Q29udGV4dCIsImFwcGVuZENoaWxkIiwiY2xhc3NOYW1lIiwidmVuZG9ycyIsInNjb3BlIiwidGhlbiIsImEiLCJiIiwiYyIsImNhbGxiYWNrIiwiaWQiLCJzZXRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFDQTs7QUFDQTtBQUNPLElBQU1BLFNBQVMsR0FBRyxT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QUVoQkEsRUFGZ0IsQ0FBbkI7QUFJQXFFLElBQUFBLElBQUksR0FBR25FLEdBQUcsR0FBR0YsRUFBYjtBQUNBLFdBQU8wRSxFQUFQO0FBQ0QsR0FWRDs7QUFZQU4sRUFBQUEsS0FBSyxDQUFFSSxDQUFGLENBQUwsR0FBYTNFLEdBQUcsR0FBR0EsR0FBRyxJQUFJLFVBQVU2RSxFQUFWLEVBQWU7QUFDdkNFLElBQUFBLFlBQVksQ0FBRUYsRUFBRixDQUFaO0FBQ0QsR0FGRDtBQUlBOzs7Ozs7O0FBT0EsU0FBTzNLLE1BQVA7QUFFRCxDQWhtQk0iLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyogQ29weXJpZ2h0IChDKSAyMDEzIEp1c3RpbiBXaW5kbGUsIGh0dHA6Ly9zb3Vsd2lyZS5jby51ayAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xyXG5leHBvcnQgY29uc3QgZ2V0U2tldGNoID0gKCByb290LCBmYWN0b3J5ICkgPT4ge1xyXG5cclxuICBpZiAoIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyApIHtcclxuXHJcbiAgICAvLyBDb21tb25KUyBsaWtlXHJcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3Rvcnkocm9vdCwgcm9vdC5kb2N1bWVudCk7XHJcblxyXG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcclxuXHJcbiAgICAvLyBBTURcclxuICAgIGRlZmluZSggZnVuY3Rpb24oKSB7IHJldHVybiBmYWN0b3J5KCByb290LCByb290LmRvY3VtZW50ICk7IH0pO1xyXG5cclxuICB9IGVsc2Uge1xyXG5cclxuICAgIC8vIEJyb3dzZXIgZ2xvYmFsXHJcbiAgICByb290LlNrZXRjaCA9IGZhY3RvcnkoIHJvb3QsIHJvb3QuZG9jdW1lbnQgKTtcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2tldGNoRmFjdG9yeSA9IGZ1bmN0aW9uICggd2luZG93LCBkb2N1bWVudCApIHtcclxuXHJcblxyXG4gIFwidXNlIHN0cmljdFwiO1xyXG5cclxuICAvKlxyXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICBDb25maWdcclxuXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICovXHJcblxyXG4gIHZhciBNQVRIX1BST1BTID0gJ0UgTE4xMCBMTjIgTE9HMkUgTE9HMTBFIFBJIFNRUlQxXzIgU1FSVDIgYWJzIGFjb3MgYXNpbiBhdGFuIGNlaWwgY29zIGV4cCBmbG9vciBsb2cgcm91bmQgc2luIHNxcnQgdGFuIGF0YW4yIHBvdyBtYXggbWluJy5zcGxpdCggJyAnICk7XHJcbiAgdmFyIEhBU19TS0VUQ0ggPSAnX19oYXNTa2V0Y2gnO1xyXG4gIHZhciBNID0gTWF0aDtcclxuXHJcbiAgdmFyIENBTlZBUyA9ICdjYW52YXMnO1xyXG4gIHZhciBXRUJHTCA9ICd3ZWJnbCc7XHJcbiAgdmFyIERPTSA9ICdkb20nO1xyXG5cclxuICB2YXIgZG9jID0gZG9jdW1lbnQ7XHJcbiAgdmFyIHdpbiA9IHdpbmRvdztcclxuXHJcbiAgdmFyIGluc3RhbmNlcyA9IFtdO1xyXG5cclxuICB2YXIgZGVmYXVsdHMgPSB7XHJcblxyXG4gICAgZnVsbHNjcmVlbjogdHJ1ZSxcclxuICAgIGF1dG9zdGFydDogdHJ1ZSxcclxuICAgIGF1dG9jbGVhcjogdHJ1ZSxcclxuICAgIGF1dG9wYXVzZTogdHJ1ZSxcclxuICAgIGNvbnRhaW5lcjogZG9jLmJvZHksXHJcbiAgICBpbnRlcnZhbDogMSxcclxuICAgIGdsb2JhbHM6IHRydWUsXHJcbiAgICByZXRpbmE6IGZhbHNlLFxyXG4gICAgdHlwZTogQ0FOVkFTXHJcbiAgfTtcclxuXHJcbiAgdmFyIGtleU1hcCA9IHtcclxuXHJcbiAgICAgODogJ0JBQ0tTUEFDRScsXHJcbiAgICAgOTogJ1RBQicsXHJcbiAgICAxMzogJ0VOVEVSJyxcclxuICAgIDE2OiAnU0hJRlQnLFxyXG4gICAgMjc6ICdFU0NBUEUnLFxyXG4gICAgMzI6ICdTUEFDRScsXHJcbiAgICAzNzogJ0xFRlQnLFxyXG4gICAgMzg6ICdVUCcsXHJcbiAgICAzOTogJ1JJR0hUJyxcclxuICAgIDQwOiAnRE9XTidcclxuICB9O1xyXG5cclxuICAvKlxyXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICBVdGlsaXRpZXNcclxuXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICovXHJcblxyXG4gIGZ1bmN0aW9uIGlzQXJyYXkoIG9iamVjdCApIHtcclxuXHJcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKCBvYmplY3QgKSA9PSAnW29iamVjdCBBcnJheV0nO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gaXNGdW5jdGlvbiggb2JqZWN0ICkge1xyXG5cclxuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09ICdmdW5jdGlvbic7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBpc051bWJlciggb2JqZWN0ICkge1xyXG5cclxuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09ICdudW1iZXInO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gaXNTdHJpbmcoIG9iamVjdCApIHtcclxuXHJcbiAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PSAnc3RyaW5nJztcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGtleU5hbWUoIGNvZGUgKSB7XHJcblxyXG4gICAgcmV0dXJuIGtleU1hcFsgY29kZSBdIHx8IFN0cmluZy5mcm9tQ2hhckNvZGUoIGNvZGUgKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGV4dGVuZCggdGFyZ2V0LCBzb3VyY2UsIG92ZXJ3cml0ZSApIHtcclxuXHJcbiAgICBmb3IgKCB2YXIga2V5IGluIHNvdXJjZSApXHJcblxyXG4gICAgICBpZiAoIG92ZXJ3cml0ZSB8fCAhKCBrZXkgaW4gdGFyZ2V0ICkgKVxyXG5cclxuICAgICAgICB0YXJnZXRbIGtleSBdID0gc291cmNlWyBrZXkgXTtcclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcHJveHkoIG1ldGhvZCwgY29udGV4dCApIHtcclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICBtZXRob2QuYXBwbHkoIGNvbnRleHQsIGFyZ3VtZW50cyApO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGNsb25lKCB0YXJnZXQgKSB7XHJcblxyXG4gICAgdmFyIG9iamVjdCA9IHt9O1xyXG5cclxuICAgIGZvciAoIHZhciBrZXkgaW4gdGFyZ2V0ICkge1xyXG4gICAgICBcclxuICAgICAgaWYgKCBrZXkgPT09ICd3ZWJraXRNb3ZlbWVudFgnIHx8IGtleSA9PT0gJ3dlYmtpdE1vdmVtZW50WScgKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWYgKCBpc0Z1bmN0aW9uKCB0YXJnZXRbIGtleSBdICkgKVxyXG5cclxuICAgICAgICBvYmplY3RbIGtleSBdID0gcHJveHkoIHRhcmdldFsga2V5IF0sIHRhcmdldCApO1xyXG5cclxuICAgICAgZWxzZVxyXG5cclxuICAgICAgICBvYmplY3RbIGtleSBdID0gdGFyZ2V0WyBrZXkgXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgQ29uc3RydWN0b3JcclxuXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICovXHJcblxyXG4gIGZ1bmN0aW9uIGNvbnN0cnVjdG9yKCBjb250ZXh0ICkge1xyXG5cclxuICAgIHZhciByZXF1ZXN0LCBoYW5kbGVyLCB0YXJnZXQsIHBhcmVudCwgYm91bmRzLCBpbmRleCwgc3VmZml4LCBjbG9jaywgbm9kZSwgY29weSwgdHlwZSwga2V5LCB2YWwsIG1pbiwgbWF4LCB3LCBoO1xyXG5cclxuICAgIHZhciBjb3VudGVyID0gMDtcclxuICAgIHZhciB0b3VjaGVzID0gW107XHJcbiAgICB2YXIgcmVzaXplZCA9IGZhbHNlO1xyXG4gICAgdmFyIHNldHVwID0gZmFsc2U7XHJcbiAgICB2YXIgcmF0aW8gPSB3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xyXG4gICAgdmFyIGlzRGl2ID0gY29udGV4dC50eXBlID09IERPTTtcclxuICAgIHZhciBpczJEID0gY29udGV4dC50eXBlID09IENBTlZBUztcclxuXHJcbiAgICB2YXIgbW91c2UgPSB7XHJcbiAgICAgIHg6ICAwLjAsIHk6ICAwLjAsXHJcbiAgICAgIG94OiAwLjAsIG95OiAwLjAsXHJcbiAgICAgIGR4OiAwLjAsIGR5OiAwLjBcclxuICAgIH07XHJcblxyXG4gICAgdmFyIGV2ZW50TWFwID0gW1xyXG5cclxuICAgICAgY29udGV4dC5ldmVudFRhcmdldCB8fCBjb250ZXh0LmVsZW1lbnQsXHJcblxyXG4gICAgICAgIHBvaW50ZXIsICdtb3VzZWRvd24nLCAndG91Y2hzdGFydCcsXHJcbiAgICAgICAgcG9pbnRlciwgJ21vdXNlbW92ZScsICd0b3VjaG1vdmUnLFxyXG4gICAgICAgIHBvaW50ZXIsICdtb3VzZXVwJywgJ3RvdWNoZW5kJyxcclxuICAgICAgICBwb2ludGVyLCAnY2xpY2snLFxyXG4gICAgICAgIHBvaW50ZXIsICdtb3VzZW91dCcsXHJcbiAgICAgICAgcG9pbnRlciwgJ21vdXNlb3ZlcicsXHJcblxyXG4gICAgICBkb2MsXHJcblxyXG4gICAgICAgIGtleXByZXNzLCAna2V5ZG93bicsICdrZXl1cCcsXHJcblxyXG4gICAgICB3aW4sXHJcblxyXG4gICAgICAgIGFjdGl2ZSwgJ2ZvY3VzJywgJ2JsdXInLFxyXG4gICAgICAgIHJlc2l6ZSwgJ3Jlc2l6ZSdcclxuICAgIF07XHJcblxyXG4gICAgdmFyIGtleXMgPSB7fTsgZm9yICgga2V5IGluIGtleU1hcCApIGtleXNbIGtleU1hcFsga2V5IF0gXSA9IGZhbHNlO1xyXG5cclxuICAgIGZ1bmN0aW9uIHRyaWdnZXIoIG1ldGhvZCApIHtcclxuXHJcbiAgICAgIGlmICggaXNGdW5jdGlvbiggbWV0aG9kICkgKVxyXG5cclxuICAgICAgICBtZXRob2QuYXBwbHkoIGNvbnRleHQsIFtdLnNwbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSApO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGJpbmQoIG9uICkge1xyXG5cclxuICAgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGV2ZW50TWFwLmxlbmd0aDsgaW5kZXgrKyApIHtcclxuXHJcbiAgICAgICAgbm9kZSA9IGV2ZW50TWFwWyBpbmRleCBdO1xyXG5cclxuICAgICAgICBpZiAoIGlzU3RyaW5nKCBub2RlICkgKVxyXG5cclxuICAgICAgICAgIHRhcmdldFsgKCBvbiA/ICdhZGQnIDogJ3JlbW92ZScgKSArICdFdmVudExpc3RlbmVyJyBdLmNhbGwoIHRhcmdldCwgbm9kZSwgaGFuZGxlciwgZmFsc2UgKTtcclxuXHJcbiAgICAgICAgZWxzZSBpZiAoIGlzRnVuY3Rpb24oIG5vZGUgKSApXHJcblxyXG4gICAgICAgICAgaGFuZGxlciA9IG5vZGU7XHJcblxyXG4gICAgICAgIGVsc2UgdGFyZ2V0ID0gbm9kZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcclxuXHJcbiAgICAgIGNBRiggcmVxdWVzdCApO1xyXG4gICAgICByZXF1ZXN0ID0gckFGKCB1cGRhdGUgKTtcclxuXHJcbiAgICAgIGlmICggIXNldHVwICkge1xyXG5cclxuICAgICAgICB0cmlnZ2VyKCBjb250ZXh0LnNldHVwICk7XHJcbiAgICAgICAgc2V0dXAgPSBpc0Z1bmN0aW9uKCBjb250ZXh0LnNldHVwICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICggIXJlc2l6ZWQgKSB7XHJcbiAgICAgICAgdHJpZ2dlciggY29udGV4dC5yZXNpemUgKTtcclxuICAgICAgICByZXNpemVkID0gaXNGdW5jdGlvbiggY29udGV4dC5yZXNpemUgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCBjb250ZXh0LnJ1bm5pbmcgJiYgIWNvdW50ZXIgKSB7XHJcblxyXG4gICAgICAgIGNvbnRleHQuZHQgPSAoIGNsb2NrID0gK25ldyBEYXRlKCkgKSAtIGNvbnRleHQubm93O1xyXG4gICAgICAgIGNvbnRleHQubWlsbGlzICs9IGNvbnRleHQuZHQ7XHJcbiAgICAgICAgY29udGV4dC5ub3cgPSBjbG9jaztcclxuXHJcbiAgICAgICAgdHJpZ2dlciggY29udGV4dC51cGRhdGUgKTtcclxuXHJcbiAgICAgICAgLy8gUHJlIGRyYXdcclxuXHJcbiAgICAgICAgaWYgKCBpczJEICkge1xyXG5cclxuICAgICAgICAgIGlmICggY29udGV4dC5yZXRpbmEgKSB7XHJcblxyXG4gICAgICAgICAgICBjb250ZXh0LnNhdmUoKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmF1dG9jbGVhcikge1xyXG4gICAgICAgICAgICAgIGNvbnRleHQuc2NhbGUoIHJhdGlvLCByYXRpbyApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKCBjb250ZXh0LmF1dG9jbGVhciApXHJcblxyXG4gICAgICAgICAgICBjb250ZXh0LmNsZWFyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBEcmF3XHJcblxyXG4gICAgICAgIHRyaWdnZXIoIGNvbnRleHQuZHJhdyApO1xyXG5cclxuICAgICAgICAvLyBQb3N0IGRyYXdcclxuXHJcbiAgICAgICAgaWYgKCBpczJEICYmIGNvbnRleHQucmV0aW5hIClcclxuXHJcbiAgICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY291bnRlciA9ICsrY291bnRlciAlIGNvbnRleHQuaW50ZXJ2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmVzaXplKCkge1xyXG5cclxuICAgICAgdGFyZ2V0ID0gaXNEaXYgPyBjb250ZXh0LnN0eWxlIDogY29udGV4dC5jYW52YXM7XHJcbiAgICAgIHN1ZmZpeCA9IGlzRGl2ID8gJ3B4JyA6ICcnO1xyXG5cclxuICAgICAgdyA9IGNvbnRleHQud2lkdGg7XHJcbiAgICAgIGggPSBjb250ZXh0LmhlaWdodDtcclxuXHJcbiAgICAgIGlmICggY29udGV4dC5mdWxsc2NyZWVuICkge1xyXG5cclxuICAgICAgICBoID0gY29udGV4dC5oZWlnaHQgPSB3aW4uaW5uZXJIZWlnaHQ7XHJcbiAgICAgICAgdyA9IGNvbnRleHQud2lkdGggPSB3aW4uaW5uZXJXaWR0aDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCBjb250ZXh0LnJldGluYSAmJiBpczJEICYmIHJhdGlvICkge1xyXG5cclxuICAgICAgICB0YXJnZXQuc3R5bGUuaGVpZ2h0ID0gaCArICdweCc7XHJcbiAgICAgICAgdGFyZ2V0LnN0eWxlLndpZHRoID0gdyArICdweCc7XHJcblxyXG4gICAgICAgIHcgKj0gcmF0aW87XHJcbiAgICAgICAgaCAqPSByYXRpbztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCB0YXJnZXQuaGVpZ2h0ICE9PSBoIClcclxuXHJcbiAgICAgICAgdGFyZ2V0LmhlaWdodCA9IGggKyBzdWZmaXg7XHJcblxyXG4gICAgICBpZiAoIHRhcmdldC53aWR0aCAhPT0gdyApXHJcblxyXG4gICAgICAgIHRhcmdldC53aWR0aCA9IHcgKyBzdWZmaXg7XHJcblxyXG4gICAgICBpZiAoIGlzMkQgJiYgIWNvbnRleHQuYXV0b2NsZWFyICYmIGNvbnRleHQucmV0aW5hIClcclxuXHJcbiAgICAgICAgY29udGV4dC5zY2FsZSggcmF0aW8sIHJhdGlvICk7XHJcblxyXG4gICAgICBpZiAoIHNldHVwICkgdHJpZ2dlciggY29udGV4dC5yZXNpemUgKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBhbGlnbiggdG91Y2gsIHRhcmdldCApIHtcclxuXHJcbiAgICAgIGJvdW5kcyA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgIHRvdWNoLnggPSB0b3VjaC5wYWdlWCAtIGJvdW5kcy5sZWZ0IC0gKHdpbi5zY3JvbGxYIHx8IHdpbi5wYWdlWE9mZnNldCk7XHJcbiAgICAgIHRvdWNoLnkgPSB0b3VjaC5wYWdlWSAtIGJvdW5kcy50b3AgLSAod2luLnNjcm9sbFkgfHwgd2luLnBhZ2VZT2Zmc2V0KTtcclxuXHJcbiAgICAgIHJldHVybiB0b3VjaDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBhdWdtZW50KCB0b3VjaCwgdGFyZ2V0ICkge1xyXG5cclxuICAgICAgYWxpZ24oIHRvdWNoLCBjb250ZXh0LmVsZW1lbnQgKTtcclxuXHJcbiAgICAgIHRhcmdldCA9IHRhcmdldCB8fCB7fTtcclxuXHJcbiAgICAgIHRhcmdldC5veCA9IHRhcmdldC54IHx8IHRvdWNoLng7XHJcbiAgICAgIHRhcmdldC5veSA9IHRhcmdldC55IHx8IHRvdWNoLnk7XHJcblxyXG4gICAgICB0YXJnZXQueCA9IHRvdWNoLng7XHJcbiAgICAgIHRhcmdldC55ID0gdG91Y2gueTtcclxuXHJcbiAgICAgIHRhcmdldC5keCA9IHRhcmdldC54IC0gdGFyZ2V0Lm94O1xyXG4gICAgICB0YXJnZXQuZHkgPSB0YXJnZXQueSAtIHRhcmdldC5veTtcclxuXHJcbiAgICAgIHJldHVybiB0YXJnZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcHJvY2VzcyggZXZlbnQgKSB7XHJcblxyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgY29weSA9IGNsb25lKCBldmVudCApO1xyXG4gICAgICBjb3B5Lm9yaWdpbmFsRXZlbnQgPSBldmVudDtcclxuXHJcbiAgICAgIGlmICggY29weS50b3VjaGVzICkge1xyXG5cclxuICAgICAgICB0b3VjaGVzLmxlbmd0aCA9IGNvcHkudG91Y2hlcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBjb3B5LnRvdWNoZXMubGVuZ3RoOyBpbmRleCsrIClcclxuXHJcbiAgICAgICAgICB0b3VjaGVzWyBpbmRleCBdID0gYXVnbWVudCggY29weS50b3VjaGVzWyBpbmRleCBdLCB0b3VjaGVzWyBpbmRleCBdICk7XHJcblxyXG4gICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICB0b3VjaGVzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdG91Y2hlc1swXSA9IGF1Z21lbnQoIGNvcHksIG1vdXNlICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGV4dGVuZCggbW91c2UsIHRvdWNoZXNbMF0sIHRydWUgKTtcclxuXHJcbiAgICAgIHJldHVybiBjb3B5O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHBvaW50ZXIoIGV2ZW50ICkge1xyXG5cclxuICAgICAgZXZlbnQgPSBwcm9jZXNzKCBldmVudCApO1xyXG5cclxuICAgICAgbWluID0gKCBtYXggPSBldmVudE1hcC5pbmRleE9mKCB0eXBlID0gZXZlbnQudHlwZSApICkgLSAxO1xyXG5cclxuICAgICAgY29udGV4dC5kcmFnZ2luZyA9XHJcblxyXG4gICAgICAgIC9kb3dufHN0YXJ0Ly50ZXN0KCB0eXBlICkgPyB0cnVlIDpcclxuXHJcbiAgICAgICAgL3VwfGVuZC8udGVzdCggdHlwZSApID8gZmFsc2UgOlxyXG5cclxuICAgICAgICBjb250ZXh0LmRyYWdnaW5nO1xyXG5cclxuICAgICAgd2hpbGUoIG1pbiApXHJcblxyXG4gICAgICAgIGlzU3RyaW5nKCBldmVudE1hcFsgbWluIF0gKSA/XHJcblxyXG4gICAgICAgICAgdHJpZ2dlciggY29udGV4dFsgZXZlbnRNYXBbIG1pbi0tIF0gXSwgZXZlbnQgKSA6XHJcblxyXG4gICAgICAgIGlzU3RyaW5nKCBldmVudE1hcFsgbWF4IF0gKSA/XHJcblxyXG4gICAgICAgICAgdHJpZ2dlciggY29udGV4dFsgZXZlbnRNYXBbIG1heCsrIF0gXSwgZXZlbnQgKSA6XHJcblxyXG4gICAgICAgIG1pbiA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24ga2V5cHJlc3MoIGV2ZW50ICkge1xyXG5cclxuICAgICAga2V5ID0gZXZlbnQua2V5Q29kZTtcclxuICAgICAgdmFsID0gZXZlbnQudHlwZSA9PSAna2V5dXAnO1xyXG4gICAgICBrZXlzWyBrZXkgXSA9IGtleXNbIGtleU5hbWUoIGtleSApIF0gPSAhdmFsO1xyXG5cclxuICAgICAgdHJpZ2dlciggY29udGV4dFsgZXZlbnQudHlwZSBdLCBldmVudCApO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGFjdGl2ZSggZXZlbnQgKSB7XHJcblxyXG4gICAgICBpZiAoIGNvbnRleHQuYXV0b3BhdXNlIClcclxuXHJcbiAgICAgICAgKCBldmVudC50eXBlID09ICdibHVyJyA/IHN0b3AgOiBzdGFydCApKCk7XHJcblxyXG4gICAgICB0cmlnZ2VyKCBjb250ZXh0WyBldmVudC50eXBlIF0sIGV2ZW50ICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHVibGljIEFQSVxyXG5cclxuICAgIGZ1bmN0aW9uIHN0YXJ0KCkge1xyXG5cclxuICAgICAgY29udGV4dC5ub3cgPSArbmV3IERhdGUoKTtcclxuICAgICAgY29udGV4dC5ydW5uaW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzdG9wKCkge1xyXG5cclxuICAgICAgY29udGV4dC5ydW5uaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdG9nZ2xlKCkge1xyXG5cclxuICAgICAgKCBjb250ZXh0LnJ1bm5pbmcgPyBzdG9wIDogc3RhcnQgKSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyKCkge1xyXG5cclxuICAgICAgaWYgKCBpczJEIClcclxuXHJcbiAgICAgICAgY29udGV4dC5jbGVhclJlY3QoIDAsIDAsIGNvbnRleHQud2lkdGggKiByYXRpbywgY29udGV4dC5oZWlnaHQgKiByYXRpbyApO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRlc3Ryb3koKSB7XHJcblxyXG4gICAgICBwYXJlbnQgPSBjb250ZXh0LmVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgaW5kZXggPSBpbnN0YW5jZXMuaW5kZXhPZiggY29udGV4dCApO1xyXG5cclxuICAgICAgaWYgKCBwYXJlbnQgKSBwYXJlbnQucmVtb3ZlQ2hpbGQoIGNvbnRleHQuZWxlbWVudCApO1xyXG4gICAgICBpZiAoIH5pbmRleCApIGluc3RhbmNlcy5zcGxpY2UoIGluZGV4LCAxICk7XHJcblxyXG4gICAgICBiaW5kKCBmYWxzZSApO1xyXG4gICAgICBzdG9wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZXh0ZW5kKCBjb250ZXh0LCB7XHJcblxyXG4gICAgICB0b3VjaGVzOiB0b3VjaGVzLFxyXG4gICAgICBtb3VzZTogbW91c2UsXHJcbiAgICAgIGtleXM6IGtleXMsXHJcblxyXG4gICAgICBkcmFnZ2luZzogZmFsc2UsXHJcbiAgICAgIHJ1bm5pbmc6IGZhbHNlLFxyXG4gICAgICBtaWxsaXM6IDAsXHJcbiAgICAgIG5vdzogTmFOLFxyXG4gICAgICBkdDogTmFOLFxyXG5cclxuICAgICAgZGVzdHJveTogZGVzdHJveSxcclxuICAgICAgdG9nZ2xlOiB0b2dnbGUsXHJcbiAgICAgIGNsZWFyOiBjbGVhcixcclxuICAgICAgc3RhcnQ6IHN0YXJ0LFxyXG4gICAgICBzdG9wOiBzdG9wXHJcbiAgICB9KTtcclxuXHJcbiAgICBpbnN0YW5jZXMucHVzaCggY29udGV4dCApO1xyXG5cclxuICAgIHJldHVybiAoIGNvbnRleHQuYXV0b3N0YXJ0ICYmIHN0YXJ0KCksIGJpbmQoIHRydWUgKSwgcmVzaXplKCksIHVwZGF0ZSgpLCBjb250ZXh0ICk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICBHbG9iYWwgQVBJXHJcblxyXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAqL1xyXG5cclxuICB2YXIgZWxlbWVudCwgY29udGV4dCwgU2tldGNoID0ge1xyXG5cclxuICAgIENBTlZBUzogQ0FOVkFTLFxyXG4gICAgV0VCX0dMOiBXRUJHTCxcclxuICAgIFdFQkdMOiBXRUJHTCxcclxuICAgIERPTTogRE9NLFxyXG5cclxuICAgIGluc3RhbmNlczogaW5zdGFuY2VzLFxyXG5cclxuICAgIGluc3RhbGw6IGZ1bmN0aW9uKCBjb250ZXh0ICkge1xyXG5cclxuICAgICAgaWYgKCAhY29udGV4dFsgSEFTX1NLRVRDSCBdICkge1xyXG5cclxuICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBNQVRIX1BST1BTLmxlbmd0aDsgaSsrIClcclxuXHJcbiAgICAgICAgICBjb250ZXh0WyBNQVRIX1BST1BTW2ldIF0gPSBNWyBNQVRIX1BST1BTW2ldIF07XHJcblxyXG4gICAgICAgIGV4dGVuZCggY29udGV4dCwge1xyXG5cclxuICAgICAgICAgIFRXT19QSTogTS5QSSAqIDIsXHJcbiAgICAgICAgICBIQUxGX1BJOiBNLlBJIC8gMixcclxuICAgICAgICAgIFFVQVJURVJfUEk6IE0uUEkgLyA0LFxyXG5cclxuICAgICAgICAgIHJhbmRvbTogZnVuY3Rpb24oIG1pbiwgbWF4ICkge1xyXG5cclxuICAgICAgICAgICAgaWYgKCBpc0FycmF5KCBtaW4gKSApXHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiBtaW5bIH5+KCBNLnJhbmRvbSgpICogbWluLmxlbmd0aCApIF07XHJcblxyXG4gICAgICAgICAgICBpZiAoICFpc051bWJlciggbWF4ICkgKVxyXG5cclxuICAgICAgICAgICAgICBtYXggP