svgomg-ui/js/page.js.map

1 line
260 KiB
Plaintext

{"version":3,"file":"page.js","sources":["../../src/js/page/utils.js","../../src/js/page/ui/pan-zoom.js","../../src/js/page/ui/results.js","../../node_modules/rollup-plugin-node-builtins/src/es6/events.js","../../src/js/utils/storage.js","../../src/js/page/worker-messenger.js","../../src/js/page/gzip.js","../../src/js/page/svg-file.js","../../src/js/page/ui/svg-output.js","../../src/js/page/ui/code-output.js","../../src/js/page/prism.js","../../src/js/page/ui/output.js","../../src/js/page/ui/ripple.js","../../src/js/page/ui/spinner.js","../../src/js/page/ui/floating-action-button.js","../../src/js/page/ui/download-button.js","../../src/js/page/ui/copy-button.js","../../src/js/page/ui/bg-fill-button.js","../../src/js/page/ui/material-slider.js","../../src/js/page/ui/settings.js","../../src/js/page/ui/main-menu.js","../../src/js/page/ui/toasts.js","../../src/js/page/ui/file-drop.js","../../src/js/page/ui/preloader.js","../../src/js/page/ui/changelog.js","../../src/js/page/ui/results-container.js","../../src/js/page/ui/view-toggler.js","../../src/js/page/results-cache.js","../../src/js/page/ui/main-ui.js","../../src/js/page/main-controller.js","../../src/js/page/svgo.js","../../src/js/page/index.js"],"sourcesContent":["\"use strict\";\n\nexport const domReady = new Promise(resolve => {\n function checkState() {\n if (document.readyState != 'loading') resolve();\n }\n document.addEventListener('readystatechange', checkState);\n checkState();\n});\n\nconst range = document.createRange();\nrange.selectNode(document.documentElement);\n\nexport function strToEl(str) {\n const frag = range.createContextualFragment(str);\n return frag.children[0];\n}\n\nconst entityMap = {\n \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': '&quot;',\n \"'\": '&#39;',\n \"/\": '&#x2F;'\n};\n\nexport function escapeHTML(str) {\n return String(str).replace(/[&<>\"'\\/]/g, s => entityMap[s]);\n}\n\nexport function escapeHtmlTag(strings, ...values) {\n values = values.map(s => escapeHTML(s));\n return strings.reduce((str, val, i) => str += val + (values[i] || ''), '');\n};\n\nexport function readFileAsText(file) {\n return new Response(file).text();\n};\n\nfunction transitionClassFunc({removeClass = false}={}) {\n return function(el, className = 'active', transitionClass = 'transition') {\n if (removeClass) {\n if (!el.classList.contains(className)) return Promise.resolve();\n }\n else {\n if (el.classList.contains(className)) return Promise.resolve();\n }\n\n return new Promise(resolve => {\n const listener = event => {\n if (event.target != el) return;\n el.removeEventListener('webkitTransitionEnd', listener);\n el.removeEventListener('transitionend', listener);\n el.classList.remove(transitionClass);\n resolve();\n };\n\n el.classList.add(transitionClass);\n\n requestAnimationFrame(() => {\n el.addEventListener('webkitTransitionEnd', listener);\n el.addEventListener('transitionend', listener);\n el.classList[removeClass ? 'remove' : 'add'](className);\n });\n });\n }\n}\n\nexport const transitionToClass = transitionClassFunc();\nexport const transitionFromClass = transitionClassFunc({removeClass: true});\n\nexport function loadCss(url) {\n return new Promise((resolve, reject) => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = url;\n\n link.addEventListener('load', () => resolve());\n link.addEventListener('error', () => reject());\n\n document.head.appendChild(link);\n });\n};\n\nexport function trackFocusMethod() {\n var focusMethod = 'mouse';\n\n document.body.addEventListener('focus', event => {\n event.target.classList.add(focusMethod == 'key' ? 'key-focused' : 'mouse-focused');\n }, true);\n\n document.body.addEventListener('blur', event => {\n event.target.classList.remove('key-focused');\n event.target.classList.remove('mouse-focused');\n }, true);\n\n document.body.addEventListener('keydown', () => {\n focusMethod = 'key';\n }, true);\n\n document.body.addEventListener('mousedown', () => {\n focusMethod = 'mouse';\n }, true);\n};\n","function getXY(obj) {\n return {\n x: obj.pageX,\n y: obj.pageY\n };\n}\n\nfunction touchDistance(touch1, touch2) {\n const dx = Math.abs(touch2.x - touch1.x);\n const dy = Math.abs(touch2.y - touch1.y);\n return Math.sqrt(dx*dx + dy*dy);\n}\n\nfunction getMidpoint(point1, point2) {\n return {\n x: (point1.x + point2.x) / 2,\n y: (point1.y + point2.y) / 2\n };\n}\n\nfunction getPoints(event) {\n if (event.touches) {\n return Array.from(event.touches).map(t => getXY(t));\n }\n else {\n return [getXY(event)];\n }\n}\n\nexport default class PanZoom {\n constructor(target, {\n eventArea = target,\n shouldCaptureFunc = () => true\n }={}) {\n this._target = target;\n this._shouldCaptureFunc = shouldCaptureFunc;\n this._dx = 0;\n this._dy = 0;\n this._scale = 1;\n this._active = 0;\n this._lastPoints = [];\n\n // bind\n [\n '_onPointerDown',\n '_onPointerMove',\n '_onPointerUp'\n ].forEach(funcName => {\n this[funcName] = this[funcName].bind(this);\n })\n\n // bound events\n eventArea.addEventListener('mousedown', this._onPointerDown);\n eventArea.addEventListener('touchstart', this._onPointerDown);\n\n // unbonud\n eventArea.addEventListener('wheel', e => this._onWheel(e));\n }\n\n reset() {\n this._dx = 0;\n this._dy = 0;\n this._scale = 1;\n this._update();\n }\n\n _onWheel(event) {\n if (!this._shouldCaptureFunc(event.target)) return;\n event.preventDefault();\n\n const boundingRect = this._target.getBoundingClientRect();\n let delta = event.deltaY;\n\n if (event.deltaMode === 1) { // 1 is \"lines\", 0 is \"pixels\"\n // Firefox uses \"lines\" when mouse is connected\n delta *= 15;\n }\n\n // stop mouse wheel producing huge values\n delta = Math.max(Math.min(delta, 60), -60);\n\n const scaleDiff = (delta / 300) + 1;\n\n // avoid to-small values\n if (this._scale * scaleDiff < 0.05) return;\n\n this._scale *= scaleDiff;\n this._dx -= (event.pageX - boundingRect.left) * (scaleDiff - 1);\n this._dy -= (event.pageY - boundingRect.top) * (scaleDiff - 1);\n this._update();\n }\n\n _onFirstPointerDown(event) {\n document.addEventListener('mousemove', this._onPointerMove);\n document.addEventListener('mouseup', this._onPointerUp);\n document.addEventListener('touchmove', this._onPointerMove);\n document.addEventListener('touchend', this._onPointerUp);\n }\n\n _onPointerDown(event) {\n if (event.type == 'mousedown' && event.which != 1) return;\n if (!this._shouldCaptureFunc(event.target)) return;\n event.preventDefault();\n\n this._lastPoints = getPoints(event);\n this._active++;\n\n if (this._active === 1) {\n this._onFirstPointerDown(event);\n }\n }\n\n _onPointerMove(event) {\n event.preventDefault();\n const points = getPoints(event);\n const averagePoint = points.reduce(getMidpoint);\n const averageLastPoint = this._lastPoints.reduce(getMidpoint);\n const boundingRect = this._target.getBoundingClientRect();\n\n this._dx += averagePoint.x - averageLastPoint.x;\n this._dy += averagePoint.y - averageLastPoint.y;\n\n if (points[1]) {\n const scaleDiff = touchDistance(points[0], points[1]) / touchDistance(this._lastPoints[0], this._lastPoints[1]);\n this._scale *= scaleDiff;\n this._dx -= (averagePoint.x - boundingRect.left) * (scaleDiff - 1);\n this._dy -= (averagePoint.y - boundingRect.top) * (scaleDiff - 1);\n }\n\n this._update();\n this._lastPoints = points;\n }\n\n _update() {\n this._target.style.WebkitTransform = this._target.style.transform\n = `translate3d(${this._dx}px, ${this._dy}px, 0) scale(${this._scale})`;\n }\n\n _onPointerUp(event) {\n event.preventDefault();\n this._active--;\n this._lastPoints.pop();\n\n if (this._active) {\n this._lastPoints = getPoints(event);\n return;\n }\n\n document.removeEventListener('mousemove', this._onPointerMove);\n document.removeEventListener('mouseup', this._onPointerUp);\n document.removeEventListener('touchmove', this._onPointerMove);\n document.removeEventListener('touchend', this._onPointerUp);\n }\n}\n","import { strToEl } from '../utils';\n\nfunction round(num, places) {\n const mult = Math.pow(10, places);\n return Math.floor(Math.round(num * mult)) / mult;\n}\n\nfunction humanSize(bytes) {\n if (bytes < 1024) {\n return bytes + ' bytes';\n }\n else {\n return round(bytes / 1024, 2) + 'k';\n }\n}\n\nexport default class Results {\n constructor() {\n this.container = strToEl(\n '<div class=\"results\">' +\n '<span class=\"size\"></span> ' +\n '<span class=\"diff\"></span>' +\n '</div>' +\n '');\n\n this._sizeEl = this.container.querySelector('.size');\n this._newSizeEl = this.container.querySelector('.newSize');\n this._diffEl = this.container.querySelector('.diff');\n }\n\n update({ size, comparisonSize }) {\n if (comparisonSize) {\n this._sizeEl.textContent = humanSize(comparisonSize) + ' → ' + humanSize(size);\n } else {\n this._sizeEl.textContent = humanSize(size);\n }\n\n this._diffEl.classList.remove('decrease', 'increase');\n\n // just displaying a single size?\n if (!comparisonSize) {\n this._diffEl.textContent = '';\n return;\n }\n else if (size === comparisonSize) {\n this._diffEl.textContent = '100%';\n }\n else {\n this._diffEl.textContent = round(size / comparisonSize * 100, 2) + '%';\n this._diffEl.classList.add(size > comparisonSize ? 'increase' : 'decrease');\n }\n }\n}\n","'use strict';\n\nvar domain;\n\n// This constructor is used to store event handlers. Instantiating this is\n// faster than explicitly calling `Object.create(null)` to get a \"clean\" empty\n// object (tested with v8 v4.9).\nfunction EventHandlers() {}\nEventHandlers.prototype = Object.create(null);\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nexport default EventEmitter;\nexport {EventEmitter};\n\n// nodejs oddity\n// require('events') === require('events').EventEmitter\nEventEmitter.EventEmitter = EventEmitter\n\nEventEmitter.usingDomains = false;\n\nEventEmitter.prototype.domain = undefined;\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\nEventEmitter.init = function() {\n this.domain = null;\n if (EventEmitter.usingDomains) {\n // if there is an active domain, then attach to it.\n if (domain.active && !(this instanceof domain.Domain)) {\n this.domain = domain.active;\n }\n }\n\n if (!this._events || this._events === Object.getPrototypeOf(this)._events) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || isNaN(n))\n throw new TypeError('\"n\" argument must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nfunction $getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return $getMaxListeners(this);\n};\n\n// These standalone emit* functions are used to optimize calling of event\n// handlers for fast cases because emit() itself often has a variable number of\n// arguments and can be deoptimized because of that. These functions always have\n// the same number of arguments and thus do not get deoptimized, so the code\n// inside them can execute faster.\nfunction emitNone(handler, isFn, self) {\n if (isFn)\n handler.call(self);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self);\n }\n}\nfunction emitOne(handler, isFn, self, arg1) {\n if (isFn)\n handler.call(self, arg1);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1);\n }\n}\nfunction emitTwo(handler, isFn, self, arg1, arg2) {\n if (isFn)\n handler.call(self, arg1, arg2);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2);\n }\n}\nfunction emitThree(handler, isFn, self, arg1, arg2, arg3) {\n if (isFn)\n handler.call(self, arg1, arg2, arg3);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2, arg3);\n }\n}\n\nfunction emitMany(handler, isFn, self, args) {\n if (isFn)\n handler.apply(self, args);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].apply(self, args);\n }\n}\n\nEventEmitter.prototype.emit = function emit(type) {\n var er, handler, len, args, i, events, domain;\n var needDomainExit = false;\n var doError = (type === 'error');\n\n events = this._events;\n if (events)\n doError = (doError && events.error == null);\n else if (!doError)\n return false;\n\n domain = this.domain;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n er = arguments[1];\n if (domain) {\n if (!er)\n er = new Error('Uncaught, unspecified \"error\" event');\n er.domainEmitter = this;\n er.domain = domain;\n er.domainThrown = false;\n domain.emit('error', er);\n } else if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n return false;\n }\n\n handler = events[type];\n\n if (!handler)\n return false;\n\n var isFn = typeof handler === 'function';\n len = arguments.length;\n switch (len) {\n // fast cases\n case 1:\n emitNone(handler, isFn, this);\n break;\n case 2:\n emitOne(handler, isFn, this, arguments[1]);\n break;\n case 3:\n emitTwo(handler, isFn, this, arguments[1], arguments[2]);\n break;\n case 4:\n emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);\n break;\n // slower\n default:\n args = new Array(len - 1);\n for (i = 1; i < len; i++)\n args[i - 1] = arguments[i];\n emitMany(handler, isFn, this, args);\n }\n\n if (needDomainExit)\n domain.exit();\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = target._events;\n if (!events) {\n events = target._events = new EventHandlers();\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (!existing) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] = prepend ? [listener, existing] :\n [existing, listener];\n } else {\n // If we've already got an array, just append.\n if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n }\n\n // Check for listener leak\n if (!existing.warned) {\n m = $getMaxListeners(target);\n if (m && m > 0 && existing.length > m) {\n existing.warned = true;\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + type + ' listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n emitWarning(w);\n }\n }\n }\n\n return target;\n}\nfunction emitWarning(e) {\n typeof console.warn === 'function' ? console.warn(e) : console.log(e);\n}\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction _onceWrap(target, type, listener) {\n var fired = false;\n function g() {\n target.removeListener(type, g);\n if (!fired) {\n fired = true;\n listener.apply(target, arguments);\n }\n }\n g.listener = listener;\n return g;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = this._events;\n if (!events)\n return this;\n\n list = events[type];\n if (!list)\n return this;\n\n if (list === listener || (list.listener && list.listener === listener)) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list[0] = undefined;\n if (--this._eventsCount === 0) {\n this._events = new EventHandlers();\n return this;\n } else {\n delete events[type];\n }\n } else {\n spliceOne(list, position);\n }\n\n if (events.removeListener)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events;\n\n events = this._events;\n if (!events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!events.removeListener) {\n if (arguments.length === 0) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n } else if (events[type]) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n for (var i = 0, key; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = new EventHandlers();\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n do {\n this.removeListener(type, listeners[listeners.length - 1]);\n } while (listeners[0]);\n }\n\n return this;\n };\n\nEventEmitter.prototype.listeners = function listeners(type) {\n var evlistener;\n var ret;\n var events = this._events;\n\n if (!events)\n ret = [];\n else {\n evlistener = events[type];\n if (!evlistener)\n ret = [];\n else if (typeof evlistener === 'function')\n ret = [evlistener.listener || evlistener];\n else\n ret = unwrapListeners(evlistener);\n }\n\n return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];\n};\n\n// About 1.5x faster than the two-arg version of Array#splice().\nfunction spliceOne(list, index) {\n for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)\n list[i] = list[k];\n list.pop();\n}\n\nfunction arrayClone(arr, i) {\n var copy = new Array(i);\n while (i--)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n","export let idbKeyval = (() => {\n let db;\n\n function getDB() {\n if (!db) {\n db = new Promise((resolve, reject) => {\n const openreq = indexedDB.open('svgo-keyval', 1);\n\n openreq.onerror = () => {\n reject(openreq.error);\n };\n\n openreq.onupgradeneeded = () => {\n // First time setup: create an empty object store\n openreq.result.createObjectStore('keyval');\n };\n\n openreq.onsuccess = () => {\n resolve(openreq.result);\n };\n });\n }\n return db;\n }\n\n async function withStore(type, callback) {\n const db = await getDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction('keyval', type);\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error);\n callback(transaction.objectStore('keyval'));\n });\n }\n\n return {\n async get(key) {\n let req;\n await withStore('readonly', store => {\n req = store.get(key);\n });\n return req.result;\n },\n set(key, value) {\n return withStore('readwrite', store => {\n store.put(value, key);\n });\n },\n delete(key) {\n return withStore('readwrite', store => {\n store.delete(key);\n });\n }\n };\n})();\n\n// iOS add-to-homescreen is missing IDB, or at least it used to.\n// I haven't tested this in a while.\nif (!self.indexedDB) {\n idbKeyval = {\n get: key => Promise.resolve(localStorage.getItem(key)),\n set: (key, val) => Promise.resolve(localStorage.setItem(key, val)),\n delete: key => Promise.resolve(localStorage.removeItem(key))\n };\n}\n","\"use strict\";\n\nexport default class WorkerMessenger {\n constructor(url) {\n this._requestId = 0;\n // worker jobs awaiting response { [requestId]: [ resolve, reject ] }\n this._pending = {};\n this._url = url;\n this._worker = new Worker(this._url);\n this._worker.onmessage = event => this._onMessage(event);\n }\n\n async release() {\n if (this._worker) {\n this._worker.terminate();\n this._worker = null;\n }\n for (const key of Object.keys(this._pending)) {\n this._fulfillPending(id, null, new Error(\"Worker terminated: \" + this._url));\n }\n }\n\n _postMessage(message) {\n this._worker.postMessage(message);\n }\n\n _onMessage(event) {\n if (!event.data.id) {\n console.log(\"Unexpected message\", event);\n return;\n }\n\n this._fulfillPending(event.data.id, event.data.result, event.data.error);\n }\n\n _fulfillPending(id, result, error) {\n const resolver = this._pending[id];\n\n if (!resolver) {\n console.log(\"No resolver for\", { id, result, error });\n return;\n }\n\n delete this._pending[id];\n\n if (error) {\n resolver[1](new Error(error));\n return;\n }\n\n resolver[0](result);\n }\n\n _requestResponse(message) {\n return new Promise((resolve, reject) => {\n message.id = ++this._requestId;\n this._pending[message.id] = [resolve, reject];\n this._postMessage(message);\n });\n }\n}\n","import WorkerMessenger from './worker-messenger';\n\nclass Gzip extends WorkerMessenger {\n constructor() {\n super('js/gzip-worker.js');\n }\n\n compress(svgData) {\n return this._requestResponse({\n data: svgData\n });\n }\n}\n\nexport const gzip = new Gzip();\n","import { gzip } from './gzip';\n\nexport default class SvgFile {\n constructor(text, width, height) {\n this.text = text;\n this._compressedSize = null;\n this._url = '';\n this._blob = null;\n this.width = width;\n this.height = height;\n }\n\n async size({ compress }) {\n if (!compress) {\n return this.text.length;\n }\n\n if (!this._compressedSize) {\n this._compressedSize = gzip.compress(this.text).then(r => r.byteLength);\n }\n\n return this._compressedSize;\n }\n\n _create() {\n // IE GCs blobs once they're out of reference, even if they\n // have an object url, so we have to keep in in reference.\n this._blob = new Blob([this.text], {type: \"image/svg+xml\"});\n this._url = URL.createObjectURL(this._blob);\n }\n\n get blob() {\n if (!this._blob) this._create();\n return this._blob;\n }\n\n get url() {\n if (!this._url) this._create();\n return this._url;\n }\n\n release() {\n if (!this._url) return;\n\n this._blob = null;\n URL.revokeObjectURL(this._url);\n }\n}\n","import { domReady, strToEl } from '../utils';\nimport PanZoom from './pan-zoom';\n\nexport default class SvgOutput {\n constructor() {\n this.container = strToEl(\n '<div class=\"svg-output\">' +\n '<div class=\"svg-container\">' +\n '<iframe class=\"svg-frame\" sandbox=\"allow-scripts\"></iframe>' +\n '</div>' +\n // Stop touches going into the iframe.\n // pointer-events + touch + iframe doesn't work in Chrome :(\n '<div class=\"svg-clickjacker\"></div>' +\n '</div>' +\n '');\n\n\n this._svgFrame = this.container.querySelector('.svg-frame');\n this._svgFrame.scrolling = 'no';\n\n this._svgContainer = this.container.querySelector('.svg-container');\n\n domReady.then(() => {\n this._panZoom = new PanZoom(this._svgContainer, {\n eventArea: this.container\n });\n });\n }\n\n setSvg(svgFile) {\n // I would rather use blob urls, but they don't work in Firefox\n // All the internal refs break.\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1125667\n const nextLoad = this._nextLoadPromise();\n this._svgFrame.src = \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(svgFile.text);\n this._svgFrame.width = svgFile.width;\n this._svgFrame.height = svgFile.height;\n return nextLoad;\n }\n\n reset() {\n this._svgFrame.src = \"about:blank\";\n this._panZoom.reset();\n }\n\n _nextLoadPromise() {\n return new Promise(resolve => {\n const onload = () => {\n this._svgFrame.removeEventListener('load', onload);\n resolve();\n }\n this._svgFrame.addEventListener('load', onload);\n });\n }\n}\n","import { strToEl } from '../utils';\nimport Prism from '../prism';\nconst prism = new Prism();\n\nexport default class CodeOutput {\n constructor() {\n this.container = strToEl(\n '<div class=\"code-output\">' +\n '<pre><code></code></pre>' +\n '</div>' +\n '');\n this._codeEl = this.container.querySelector('code');\n }\n\n async setSvg(svgFile) {\n this._codeEl.innerHTML = await prism.highlight(svgFile.text);\n }\n\n reset() {\n this._codeEl.innerHTML = '';\n }\n}\n","import WorkerMessenger from './worker-messenger';\n\nexport default class Prism extends WorkerMessenger {\n constructor() {\n super('js/prism-worker.js');\n }\n\n highlight(svgData) {\n return this._requestResponse({\n data: svgData\n });\n }\n}\n","import { strToEl, transitionToClass, transitionFromClass } from '../utils';\nimport SvgOutput from './svg-output';\nimport CodeOutput from './code-output';\n\nexport default class Output {\n constructor() {\n this.container = strToEl(\n '<div class=\"output-switcher\"></div>' +\n '');\n\n this._types = {\n image: new SvgOutput(),\n code: new CodeOutput()\n };\n\n this._svgFile = null;\n this._switchQueue = Promise.resolve();\n this.set('image', {noAnimate: true});\n }\n\n update(svgFile) {\n this._svgFile = svgFile;\n return this._types[this._activeType].setSvg(svgFile);\n }\n\n reset() {\n this._types[this._activeType].reset();\n }\n\n set(type, {\n noAnimate = false\n }={}) {\n return this._switchQueue = this._switchQueue.then(async () => {\n const toRemove = this._activeType && this._types[this._activeType].container;\n\n this._activeType = type;\n const toAdd = this._types[this._activeType].container;\n this.container.appendChild(toAdd);\n\n if (this._svgFile) await this.update(this._svgFile);\n\n if (noAnimate) {\n toAdd.classList.add('active');\n if (toRemove) toRemove.classList.remove('active');\n }\n else {\n const transitions = [\n transitionToClass(toAdd)\n ];\n\n if (toRemove) transitions.push(transitionFromClass(toRemove));\n\n await Promise.all(transitions);\n }\n\n if (toRemove) this.container.removeChild(toRemove);\n })\n }\n}\n","import { strToEl } from '../utils';\n\nexport default class Ripple {\n constructor() {\n this.container = strToEl('<div class=\"ripple\"></div>');\n }\n\n animate() {\n this.container.classList.remove('animate');\n this.container.offsetLeft;\n this.container.classList.add('animate');\n }\n}\n","import { strToEl } from '../utils';\n\nexport default class Spinner {\n constructor() {\n this.container = strToEl(\n '<div class=\"spinner\">' +\n '<div class=\"spinner-container\">' +\n '<div class=\"spinner-layer\">' +\n '<div class=\"circle-clipper left\">' +\n '<div class=\"circle\"></div>' +\n '</div>' +\n '<div class=\"gap-patch\">' +\n '<div class=\"circle\"></div>' +\n '</div>' +\n '<div class=\"circle-clipper right\">' +\n '<div class=\"circle\"></div>' +\n '</div>' +\n '</div>' +\n '</div>' +\n '</div>' +\n '');\n\n this._showTimeout = null;\n this.container.style.display = 'none';\n\n const animEndListener = event => {\n if (event.target == this.container) {\n this.container.style.display = 'none';\n }\n };\n\n this.container.addEventListener('webkitAnimationEnd', animEndListener);\n this.container.addEventListener('animationend', animEndListener);\n }\n\n show(delay = 300) {\n clearTimeout(this._showTimeout);\n this.container.style.display = 'none';\n this.container.classList.remove('cooldown');\n this._showTimeout = setTimeout(() => {\n this.container.style.display = '';\n }, delay);\n }\n\n hide() {\n clearTimeout(this._showTimeout);\n this.container.classList.add('cooldown');\n }\n}\n","import { strToEl } from '../utils';\nimport Ripple from './ripple';\nimport Spinner from './spinner';\n\nexport default class FloatingActionButton {\n constructor({ title, href, iconSvg, classList, minor }) {\n this.container = strToEl(\n (href ? '<a>' : '<div role=\"button\" tabindex=\"0\">') +\n iconSvg +\n (href ? '</a>' : '</div>') +\n '');\n\n if (href) {\n this.container.href = href;\n }\n if (title) {\n this.container.setAttribute('title', title);\n }\n this.container.classList.add(minor ? 'minor-floating-action-button' : 'floating-action-button');\n if (classList) {\n classList.forEach((className) => { this.container.classList.add(className); });\n }\n\n this._ripple = new Ripple();\n this.container.appendChild(this._ripple.container);\n\n this._spinner = new Spinner();\n this.container.appendChild(this._spinner.container);\n\n this.container.addEventListener('click', event => this._onClick(event));\n }\n\n _onClick(event) {\n this._ripple.animate();\n }\n\n working() {\n this._spinner.show(500);\n }\n\n done() {\n this._spinner.hide();\n }\n}\n","import FloatingActionButton from './floating-action-button';\n\nexport default class DownloadButton extends FloatingActionButton {\n constructor() {\n const title = 'Download';\n\n super({\n title,\n href: './',\n iconSvg: (\n '<svg viewBox=\"0 0 24 24\" class=\"icon\">' +\n `<title>${title}</title>` +\n '<path d=\"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z\"/>' +\n '</svg>'\n )\n });\n\n this._svgFile = null;\n }\n\n _onClick(event) {\n super._onClick(event);\n\n // IE compat\n if ('msSaveBlob' in navigator) {\n event.preventDefault();\n navigator.msSaveBlob(this._svgFile.blob, this._svgFile.filename);\n }\n }\n\n setDownload(filename, svgFile) {\n this.container.download = filename;\n this.container.href = svgFile.url;\n\n // for IE compat\n this._svgFile = svgFile;\n }\n}\n","import FloatingActionButton from './floating-action-button';\n\nexport const copySupported = (document.queryCommandSupported && document.queryCommandSupported('copy'));\n\nexport default class CopyButton extends FloatingActionButton {\n constructor() {\n const title = 'Copy as text';\n\n super({\n title,\n iconSvg: (\n '<svg viewBox=\"0 0 24 24\" class=\"icon\">' +\n `<title>${title}</title>` +\n '<path d=\"M16 1H4C3 1 2 2 2 3v14h2V3h12V1zm3 4H8C7 5 6 6 6 7v14c0 1 1 2 2 2h11c1 0 2-1 2-2V7c0-1-1-2-2-2zm0 16H8V7h11v14z\"/>' +\n '</svg>'\n ),\n minor: true\n });\n\n this._text = null;\n this._pre = document.createElement('pre');\n }\n\n _onClick(event) {\n super._onClick(event);\n this._pre.textContent = this._text;\n document.body.appendChild(this._pre);\n getSelection().removeAllRanges();\n\n const range = document.createRange();\n range.selectNode(this._pre);\n\n window.getSelection().addRange(range);\n\n document.execCommand('copy');\n getSelection().removeAllRanges();\n document.body.removeChild(this._pre);\n }\n\n setCopyText(text, filename) {\n this._text = text;\n }\n}\n","import FloatingActionButton from './floating-action-button';\n\nexport default class BgFillButton extends FloatingActionButton {\n constructor() {\n const title = 'Preview on vivid background';\n\n super({\n title,\n iconSvg: (\n '<svg viewBox=\"0 0 24 24\" class=\"icon\">' +\n `<title>${title}</title>` +\n '<path d=\"M21.143 9.667c-.733-1.392-1.914-3.05-3.617-4.753-2.977-2.978-5.478-3.914-6.785-3.914-.414 0-.708.094-.86.246l-1.361 1.36c-1.899-.236-3.42.106-4.294.983-.876.875-1.164 2.159-.792 3.523.492 1.806 2.305 4.049 5.905 5.375.038.323.157.638.405.885.588.588 1.535.586 2.121 0s.588-1.533.002-2.119c-.588-.587-1.537-.588-2.123-.001l-.17.256c-2.031-.765-3.395-1.828-4.232-2.9l3.879-3.875c.496 2.73 6.432 8.676 9.178 9.178l-7.115 7.107c-.234.153-2.798-.316-6.156-3.675-3.393-3.393-3.175-5.271-3.027-5.498l1.859-1.856c-.439-.359-.925-1.103-1.141-1.689l-2.134 2.131c-.445.446-.685 1.064-.685 1.82 0 1.634 1.121 3.915 3.713 6.506 2.764 2.764 5.58 4.243 7.432 4.243.648 0 1.18-.195 1.547-.562l8.086-8.078c.91.874-.778 3.538-.778 4.648 0 1.104.896 1.999 2 1.999 1.105 0 2-.896 2-2 0-3.184-1.425-6.81-2.857-9.34zm-16.209-5.371c.527-.53 1.471-.791 2.656-.761l-3.209 3.206c-.236-.978-.049-1.845.553-2.445zm9.292 4.079l-.03-.029c-1.292-1.292-3.803-4.356-3.096-5.063.715-.715 3.488 1.521 5.062 3.096.862.862 2.088 2.247 2.937 3.458-1.717-1.074-3.491-1.469-4.873-1.462z\"/>' +\n '</svg>'\n ),\n classList: [ 'fillAB' ],\n minor: true\n });\n }\n\n _onClick(event) {\n super._onClick(event);\n // event adds a background color\n if (this.container.classList.contains('active')) {\n this.container.classList.remove('active');\n this.setColor('transparent');\n }\n else {\n this.container.classList.add('active');\n this.setColor('rgba(0, 0, 0, 0.7)');\n }\n }\n\n setColor(color) {\n document.documentElement.style.backgroundColor = color;\n }\n}\n","import { strToEl } from '../utils';\n\nexport default class MaterialSlider {\n constructor(rangeEl) {\n this.container = strToEl(`\n <div class=\"material-slider\">\n <div class=\"track\">\n <div class=\"track-on\"></div>\n <div class=\"handle\">\n <div class=\"arrow\"></div>\n <div class=\"val\"></div>\n </div>\n </div>\n </div>\n `);\n\n this.range = rangeEl;\n this._handle = this.container.querySelector('.handle');\n this._trackOn = this.container.querySelector('.track-on');\n this._val = this.container.querySelector('.val');\n\n rangeEl.parentNode.insertBefore(this.container, rangeEl);\n this.container.insertBefore(rangeEl, this.container.firstChild);\n\n rangeEl.addEventListener('input', () => this._onInputChange());\n this.range.addEventListener('mousedown', () => this._onRangeMouseDown());\n this.range.addEventListener('touchstart', () => this._onRangeTouchStart());\n this.range.addEventListener('touchend', () => this._onRangeTouchEnd());\n\n this._setPosition();\n }\n\n _onRangeTouchStart() {\n this.range.focus();\n }\n\n _onRangeTouchEnd() {\n this.range.blur();\n }\n\n _onRangeMouseDown() {\n this.range.classList.add('active');\n\n const upListener = e => {\n // IE requires me to do this. Pah.\n requestAnimationFrame(_ => {\n this.range.blur();\n })\n this.range.classList.remove('active');\n document.removeEventListener('mouseup', upListener);\n }\n document.addEventListener('mouseup', upListener);\n }\n\n set value(newVal) {\n this.range.value = newVal;\n this._update();\n }\n\n _onInputChange() {\n this._update();\n }\n\n _update() {\n requestAnimationFrame(() => this._setPosition());\n }\n\n _setPosition() {\n const { min, max, value } = this.range;\n const percent = (Number(value) - min) / (max - min);\n\n this._trackOn.style.width =\n this._handle.style.left = percent * 100 + \"%\";\n\n this._val.textContent = value;\n }\n}\n","import { EventEmitter } from 'events';\n\nimport { domReady } from '../utils';\nimport MaterialSlider from './material-slider';\nimport Ripple from './ripple';\n\nexport default class Settings extends EventEmitter {\n constructor() {\n super();\n\n this._throttleTimeout = null;\n\n domReady.then(() => {\n this._pluginInputs = Array.from(\n document.querySelectorAll('.settings .plugins input')\n );\n this._globalInputs = Array.from(\n document.querySelectorAll('.settings .global input')\n );\n\n this._resetRipple = new Ripple();\n this._resetBtn = document.querySelector('.setting-reset');\n this._resetBtn.appendChild(this._resetRipple.container);\n\n // map real range elements to Slider instances\n this._sliderMap = new WeakMap();\n\n // enhance ranges\n Array.from(\n document.querySelectorAll('.settings input[type=range]')\n ).forEach(el => this._sliderMap.set(el, new MaterialSlider(el)));\n\n this.container = document.querySelector('.settings');\n this._scroller = document.querySelector('.settings-scroller');\n\n this.container.addEventListener('change', e => this._onChange(e));\n this.container.addEventListener('input', e => this._onChange(e));\n this._scroller.addEventListener('wheel', e => this._onMouseWheel(e));\n this._resetBtn.addEventListener('click', e => this._onReset(e));\n\n // Stop double-tap text selection.\n // This stops all text selection which is kinda sad.\n // I think this code will bite me.\n this._scroller.addEventListener('mousedown', e => {\n if (e.target.closest('input[type=range]')) return;\n e.preventDefault();\n });\n });\n }\n\n _onMouseWheel(event) {\n // Prevents bounce effect on desktop.\n // Firefox uses DELTA_LINE on a mouse wheel, ignore it\n if (!event.deltaMode) { // 0 is \"pixels\"\n event.preventDefault();\n event.currentTarget.scrollTop += event.deltaY;\n }\n }\n\n _onChange(event) {\n clearTimeout(this._throttleTimeout);\n\n // throttle range\n if (event.target.type == 'range') {\n this._throttleTimeout = setTimeout(() => this.emit('change'), 150);\n }\n else {\n this.emit('change');\n }\n }\n\n _onReset() {\n this._resetRipple.animate();\n const oldSettings = this.getSettings();\n // Set all inputs according to their initial attributes\n for (const inputEl of this._globalInputs) {\n if (inputEl.type == 'checkbox') {\n inputEl.checked = inputEl.hasAttribute('checked');\n }\n else if (inputEl.type == 'range') {\n this._sliderMap.get(inputEl).value = inputEl.getAttribute('value');\n }\n }\n\n for (const inputEl of this._pluginInputs) {\n inputEl.checked = inputEl.hasAttribute('checked');\n }\n\n this.emit('reset', oldSettings);\n this.emit('change');\n }\n\n setSettings(settings) {\n for (const inputEl of this._globalInputs) {\n if (!(inputEl.name in settings)) continue;\n\n if (inputEl.type == 'checkbox') {\n inputEl.checked = settings[inputEl.name];\n }\n else if (inputEl.type == 'range') {\n this._sliderMap.get(inputEl).value = settings[inputEl.name];\n }\n }\n\n for (const inputEl of this._pluginInputs) {\n if (!(inputEl.name in settings.plugins)) continue;\n inputEl.checked = settings.plugins[inputEl.name];\n }\n }\n\n getSettings() {\n // fingerprint is used for cache lookups\n const fingerprint = [];\n\n const output = {\n plugins: {}\n };\n\n this._globalInputs.forEach(inputEl => {\n if (inputEl.name != 'gzip' && inputEl.name != 'original') {\n if (inputEl.type == 'checkbox') {\n fingerprint.push(Number(inputEl.checked));\n }\n else {\n fingerprint.push('|' + inputEl.value + '|');\n }\n }\n\n if (inputEl.type == 'checkbox') {\n output[inputEl.name] = inputEl.checked;\n }\n else {\n output[inputEl.name] = inputEl.value;\n }\n });\n\n this._pluginInputs.forEach(inputEl => {\n fingerprint.push(Number(inputEl.checked));\n output.plugins[inputEl.name] = inputEl.checked;\n });\n\n output.fingerprint = fingerprint.join();\n\n return output;\n }\n}\n","import {\n domReady,\n transitionFromClass,\n transitionToClass,\n readFileAsText\n} from '../utils';\nimport Spinner from './spinner';\nimport { EventEmitter } from 'events';\n\nexport default class MainMenu extends EventEmitter {\n constructor() {\n super();\n\n this.allowHide = false;\n this._spinner = new Spinner();\n\n domReady.then(() => {\n this.container = document.querySelector('.main-menu');\n this._loadFileInput = document.querySelector('.load-file-input');\n this._pasteInput = document.querySelector('.paste-input');\n this._loadDemoBtn = document.querySelector('.load-demo');\n this._loadFileBtn = document.querySelector('.load-file');\n this._pasteLabel = document.querySelector('.menu-input');\n this._overlay = this.container.querySelector('.overlay');\n this._menu = this.container.querySelector('.menu');\n\n document.querySelector('.menu-btn')\n .addEventListener('click', e => this._onMenuButtonClick(e));\n\n this._overlay.addEventListener('click', e => this._onOverlayClick(e));\n\n this._loadFileBtn.addEventListener('click', e => this._onLoadFileClick(e));\n this._loadDemoBtn.addEventListener('click', e => this._onLoadDemoClick(e));\n this._loadFileInput.addEventListener('change', e => this._onFileInputChange(e));\n this._pasteInput.addEventListener('input', e => this._onTextInputChange(e));\n });\n }\n\n show() {\n this.container.classList.remove('hidden');\n transitionFromClass(this._overlay, 'hidden');\n transitionFromClass(this._menu, 'hidden');\n }\n\n hide() {\n if (!this.allowHide) return;\n this.stopSpinner();\n this.container.classList.add('hidden');\n transitionToClass(this._overlay, 'hidden');\n transitionToClass(this._menu, 'hidden');\n }\n\n stopSpinner() {\n this._spinner.hide();\n }\n\n showFilePicker() {\n this._loadFileInput.click();\n }\n\n _onOverlayClick(event) {\n event.preventDefault();\n this.hide();\n }\n\n _onMenuButtonClick(event) {\n event.preventDefault();\n this.show();\n }\n\n _onTextInputChange(event) {\n const val = this._pasteInput.value.trim();\n\n if (val.includes('</svg>')) {\n this._pasteInput.value = '';\n this._pasteInput.blur();\n\n this._pasteLabel.appendChild(this._spinner.container);\n this._spinner.show();\n\n this.emit('svgDataLoad', {\n data: val,\n filename: 'image.svg'\n });\n }\n }\n\n _onLoadFileClick(event) {\n event.preventDefault();\n event.target.blur();\n this.showFilePicker();\n }\n\n async _onFileInputChange(event) {\n const file = this._loadFileInput.files[0];\n\n if (!file) return;\n\n this._loadFileBtn.appendChild(this._spinner.container);\n this._spinner.show();\n\n this.emit('svgDataLoad', {\n data: await readFileAsText(file),\n filename: file.name\n });\n }\n\n async _onLoadDemoClick(event) {\n event.preventDefault();\n event.target.blur();\n this._loadDemoBtn.appendChild(this._spinner.container);\n this._spinner.show();\n\n try {\n this.emit('svgDataLoad', {\n data: await fetch('test-svgs/car-lite.svg').then(r => r.text()),\n filename: 'car-lite.svg'\n });\n }\n catch (err) {\n // This extra scope is working around a babel-minify bug.\n // It's fixed in Babel 7.\n {\n this.stopSpinner();\n\n let error;\n\n if ('serviceWorker' in navigator && navigator.serviceWorker.controller) {\n error = Error(\"Demo not available offline\");\n }\n else {\n error = Error(\"Couldn't fetch demo SVG\");\n }\n\n this.emit('error', { error });\n }\n }\n }\n}\n","import { strToEl, transitionToClass } from '../utils';\n\nclass Toast {\n constructor(message, duration, buttons) {\n this.container = strToEl(\n '<div class=\"toast\"><div class=\"toast-content\"></div></div>' +\n '');\n\n this._content = this.container.querySelector('.toast-content');\n this._content.textContent = message;\n this._answerResolve;\n this._hideTimeout;\n\n this.answer = new Promise(r => this._answerResolve = r);\n\n buttons.forEach(button => {\n var buttonEl = document.createElement('button');\n buttonEl.className = 'unbutton';\n buttonEl.textContent = button;\n buttonEl.addEventListener('click', () => {\n this._answerResolve(button);\n });\n this.container.appendChild(buttonEl);\n });\n\n if (duration) {\n this._hideTimeout = setTimeout(() => this.hide(), duration);\n }\n }\n\n hide() {\n clearTimeout(this._hideTimeout);\n this._answerResolve();\n return transitionToClass(this.container, 'hide');\n }\n}\n\nexport default class Toasts {\n constructor() {\n this.container = strToEl(\"<div class='toasts'></div>\");\n }\n\n show(message, {\n duration = 0,\n buttons = ['dismiss']\n }={}) {\n const toast = new Toast(message, duration, buttons);\n this.container.appendChild(toast.container);\n\n toast.answer.then(() => toast.hide()).then(() => {\n this.container.removeChild(toast.container);\n });\n\n return toast;\n }\n}\n","import {\n strToEl,\n domReady,\n transitionToClass,\n transitionFromClass,\n readFileAsText\n} from '../utils';\nimport { EventEmitter } from 'events';\n\nexport default class FileDrop extends EventEmitter {\n constructor() {\n super();\n this.container = strToEl(\n '<div class=\"drop-overlay\">Drop it!</div>' +\n '');\n\n // drag events are horrid\n this._activeEnters = 0;\n this._currentEnteredElement = null;\n\n domReady.then(_ => {\n document.addEventListener('dragover', event => event.preventDefault());\n document.addEventListener('dragenter', event => this._onDragEnter(event));\n document.addEventListener('dragleave', event => this._onDragLeave(event));\n document.addEventListener('drop', event => this._onDrop(event));\n });\n }\n\n _onDragEnter(event) {\n // firefox double-fires on window enter, this works around it\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1124645\n if (this._currentEnteredElement == event.target) return;\n this._currentEnteredElement = event.target;\n\n if (!this._activeEnters++) {\n transitionToClass(this.container);\n }\n }\n\n _onDragLeave(event) {\n this._currentEnteredElement = null;\n\n if (!--this._activeEnters) {\n transitionFromClass(this.container);\n }\n }\n\n async _onDrop(event) {\n event.preventDefault();\n\n this._activeEnters = 0;\n transitionFromClass(this.container);\n\n const file = event.dataTransfer.files[0];\n if (!file) return;\n\n this.emit('svgDataLoad', {\n data: await readFileAsText(file),\n filename: file.name\n });\n }\n}\n","import { domReady, transitionFromClass } from '../utils';\n\nexport default class Preloader {\n constructor() {\n domReady.then(_ => {\n this.container = document.querySelector('.preloader');\n this.activated = this.container.classList.contains('active');\n this.hide();\n });\n }\n\n async hide() {\n await transitionFromClass(this.container, 'active');\n this.container.style.display = 'none';\n }\n}\n","import { strToEl, escapeHtmlTag, transitionToClass, domReady } from '../utils';\n\nexport default class Changelog {\n constructor(loadedVersion) {\n this.container = strToEl('<section class=\"changelog\"></section>');\n this._loadedVersion = loadedVersion;\n }\n\n async showLogFrom(lastLoadedVersion) {\n if (lastLoadedVersion == this._loadedVersion) return;\n const changelog = await fetch('changelog.json').then(r => r.json());\n let startIndex = 0;\n let endIndex = 0;\n\n for (var i = 0; i < changelog.length; i++) {\n const entry = changelog[i];\n\n if (entry.version === this._loadedVersion) {\n startIndex = i;\n }\n else if (entry.version === lastLoadedVersion) {\n break;\n }\n endIndex = i + 1;\n }\n\n const changeLis = changelog.slice(startIndex, endIndex)\n .reduce((arr, entry) => arr.concat(entry.changes), [])\n .map(change => escapeHtmlTag`<li>${change}</li>`);\n\n this.container.appendChild(strToEl('<h1>Updated!</h1>'));\n this.container.appendChild(strToEl(\n '<ul>' +\n changeLis.join('') +\n '</ul>' +\n ''));\n\n await domReady;\n transitionToClass(this.container);\n }\n}\n","import { domReady } from '../utils';\n\nexport default class ResultsContainer {\n constructor(results) {\n this._results = results;\n\n domReady.then(_ => {\n this._mobileContainer = document.querySelector('.results-container-mobile');\n this._container = document.querySelector('.results-container');\n this._query = matchMedia('(min-width: 640px)');\n\n this._query.addListener(() => this._positionResults());\n this._positionResults();\n });\n }\n\n _positionResults() {\n if (this._query.matches) {\n this._container.appendChild(this._results.container);\n }\n else {\n this._mobileContainer.appendChild(this._results.container);\n }\n }\n}\n","import { EventEmitter } from 'events';\nimport { domReady } from '../utils';\n\nexport default class ViewToggler extends EventEmitter {\n constructor() {\n super();\n this.container = null;\n\n domReady.then(() => {\n this.container = document.querySelector('.view-toggler');\n\n // stop browsers remembering previous form state\n this.container.output[0].checked = true;\n\n this.container.addEventListener('change', e => this._onChange(e));\n });\n }\n\n _onChange(event) {\n let value = this.container.output.value;\n\n if (!value) { // some browsers don't support the nice shortcut above (eg Safari)\n value = Array.from(this.container.output).reduce((value, input) => {\n return value || (input.checked ? input.value : '');\n }, '');\n }\n\n this.emit(\"change\", { value });\n }\n}\n","export default class ResultsCache {\n constructor(size) {\n this._size = size;\n this.purge();\n }\n\n purge() {\n this._fingerprints = [];\n this._items = [];\n this._index = 0;\n }\n\n add(fingerprint, svgFile) {\n const oldItem = this._items[this._index];\n\n if (oldItem) {\n // gc blob url\n oldItem.release();\n }\n\n this._fingerprints[this._index] = fingerprint;\n this._items[this._index] = svgFile;\n\n this._index = (this._index + 1) % this._size;\n }\n\n match(fingerprint) {\n return this._items[this._fingerprints.indexOf(fingerprint)];\n }\n}\n","import { transitionToClass } from '../utils';\n\nexport default class MainUi {\n constructor(...elements) {\n this._activated = false;\n this._toActivate = elements;\n }\n\n activate() {\n if (this._activated) return;\n this._activated = true;\n\n return Promise.all(\n this._toActivate.map(el => transitionToClass(el))\n );\n }\n}\n","import { idbKeyval as storage } from '../utils/storage';\nimport Svgo from './svgo';\nimport { domReady } from './utils';\nimport Output from './ui/output';\nimport DownloadButton from './ui/download-button';\nimport CopyButton from './ui/copy-button';\nimport { copySupported } from './ui/copy-button';\nimport BgFillButton from './ui/bg-fill-button';\nimport Results from './ui/results';\nimport Settings from './ui/settings';\nimport MainMenu from './ui/main-menu';\nimport Toasts from './ui/toasts';\nimport FileDrop from './ui/file-drop';\nimport Preloader from './ui/preloader';\nimport Changelog from './ui/changelog';\nimport ResultsContainer from './ui/results-container';\nimport ViewToggler from './ui/view-toggler';\nimport ResultsCache from './results-cache';\nimport MainUi from './ui/main-ui';\n\nconst svgo = new Svgo();\n\nexport default class MainController {\n constructor() {\n this._container = null;\n\n // ui components\n this._mainUi = null;\n this._outputUi = new Output();\n this._downloadButtonUi = new DownloadButton();\n this._copyButtonUi = new CopyButton();\n this._bgFillUi = new BgFillButton();\n this._resultsUi = new Results();\n this._settingsUi = new Settings();\n this._mainMenuUi = new MainMenu();\n this._toastsUi = new Toasts();\n this._dropUi = new FileDrop();\n this._preloaderUi = new Preloader();\n this._changelogUi = new Changelog(self.version);\n this._resultsContainerUi = new ResultsContainer(this._resultsUi);\n this._viewTogglerUi = new ViewToggler();\n\n // ui events\n this._settingsUi.on('change', () => this._onSettingsChange());\n this._settingsUi.on('reset', oldSettings => this._onSettingsReset(oldSettings));\n this._mainMenuUi.on('svgDataLoad', e => this._onInputChange(e));\n this._dropUi.on('svgDataLoad', e => this._onInputChange(e));\n this._mainMenuUi.on('error', ({error}) => this._handleError(error));\n this._viewTogglerUi.on('change', e => this._onViewSelectionChange(e));\n window.addEventListener('keydown', e => this._onGlobalKeyDown(e));\n\n // state\n this._inputItem = null;\n this._cache = new ResultsCache(10);\n this._latestCompressJobId = 0;\n this._userHasInteracted = false;\n this._reloading = false;\n\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.register('sw.js', {\n scope: './'\n }).then(registration => {\n registration.addEventListener('updatefound', () => this._onUpdateFound(registration));\n });\n }\n\n // tell the user about the latest update\n storage.get('last-seen-version').then(lastSeenVersion => {\n if (lastSeenVersion) {\n this._changelogUi.showLogFrom(lastSeenVersion);\n }\n storage.set('last-seen-version', self.version);\n });\n\n domReady.then(() => {\n this._container = document.querySelector('.app-output');\n\n // elements for intro anim\n this._mainUi = new MainUi(\n document.querySelector('.toolbar'),\n document.querySelector('.action-button-container'),\n this._outputUi.container,\n this._settingsUi.container\n );\n\n const actionContainer = document.querySelector('.action-button-container');\n const minorActionContainer = document.querySelector('.minor-action-container');\n\n minorActionContainer.appendChild(this._bgFillUi.container);\n\n if (copySupported) {\n minorActionContainer.appendChild(this._copyButtonUi.container);\n }\n\n actionContainer.appendChild(this._downloadButtonUi.container);\n\n document.querySelector('.output').appendChild(this._outputUi.container);\n this._container.appendChild(this._toastsUi.container);\n this._container.appendChild(this._dropUi.container);\n document.querySelector('.menu-extra').appendChild(this._changelogUi.container);\n\n // load previous settings\n this._loadSettings();\n\n // someone managed to hit the preloader, aww\n if (this._preloaderUi.activated) {\n this._toastsUi.show(\"Ready now!\", {\n duration: 3000\n });\n }\n\n // for testing\n if (false) {\n (async () => {\n this._onInputChange({\n data: await fetch('test-svgs/car-lite.svg').then(r => r.text()),\n filename: 'car-lite.svg'\n });\n })();\n }\n });\n }\n\n _onGlobalKeyDown(event) {\n if (event.key === 'o' && (event.ctrlKey || event.metaKey)) {\n event.preventDefault();\n this._mainMenuUi.showFilePicker();\n }\n }\n\n _onViewSelectionChange(event) {\n this._outputUi.set(event.value);\n }\n\n _onUpdateFound(registration) {\n const newWorker = registration.installing;\n\n registration.installing.addEventListener('statechange', async () => {\n if (this._reloading) return;\n\n // the very first activation!\n // tell the user stuff works offline\n if (newWorker.state == 'activated' && !navigator.serviceWorker.controller) {\n this._toastsUi.show(\"Ready to work offline\", {\n duration: 5000\n });\n return;\n }\n\n if (newWorker.state == 'activated' && navigator.serviceWorker.controller) {\n // if the user hasn't interacted yet, do a sneaky reload\n if (!this._userHasInteracted) {\n this._reloading = true;\n location.reload();\n return;\n }\n\n // otherwise, show the user an alert\n const toast = this._toastsUi.show(\"Update available\", {\n buttons: ['reload', 'dismiss']\n });\n\n const answer = await toast.answer;\n\n if (answer == 'reload') {\n this._reloading = true;\n location.reload();\n }\n }\n });\n }\n\n _onSettingsChange() {\n const settings = this._settingsUi.getSettings();\n this._saveSettings(settings);\n this._compressSvg(settings);\n }\n\n async _onSettingsReset(oldSettings) {\n const toast = this._toastsUi.show(\"Settings reset\", {\n buttons: ['undo', 'dismiss'],\n duration: 5000\n });\n\n if ((await toast.answer) === 'undo') {\n this._settingsUi.setSettings(oldSettings);\n this._onSettingsChange();\n }\n }\n\n async _onInputChange(event) {\n const settings = this._settingsUi.getSettings();\n this._userHasInteracted = true;\n\n try {\n this._inputItem = await svgo.load(event.data);\n this._inputFilename = event.filename;\n }\n catch(e) {\n // This extra scope is working around a babel-minify bug.\n // It's fixed in Babel 7.\n {\n const error = new Error(\"Load failed: \" + e.message);\n this._mainMenuUi.stopSpinner();\n this._handleError(error);\n return;\n }\n }\n\n this._cache.purge();\n\n let firstIteration = true;\n\n const compressed = () => {\n if (firstIteration) {\n this._outputUi.reset();\n this._mainUi.activate();\n this._mainMenuUi.allowHide = true;\n this._mainMenuUi.hide();\n firstIteration = false;\n }\n }\n\n this._compressSvg(settings, () => compressed());\n\n if (firstIteration) {\n compressed();\n }\n }\n\n _handleError(e) {\n this._toastsUi.show(e.message);\n console.error(e);\n }\n\n async _loadSettings() {\n const settings = await storage.get('settings');\n if (settings) this._settingsUi.setSettings(settings);\n }\n\n _saveSettings(settings) {\n const copy = Object.assign({}, settings);\n // doesn't make sense to retain the \"show original\" option\n delete copy.original;\n storage.set('settings', copy);\n }\n\n async _compressSvg(settings, iterationCallback = function(){}) {\n const thisJobId = this._latestCompressJobId = Math.random();\n\n await svgo.abortCurrent();\n\n if (thisJobId != this._latestCompressJobId) {\n // while we've been waiting, there's been a newer call\n // to _compressSvg, we don't need to do anything\n return;\n }\n\n if (settings.original) {\n this._updateForFile(this._inputItem, {\n compress: settings.gzip\n });\n return;\n }\n\n const cacheMatch = this._cache.match(settings.fingerprint);\n\n if (cacheMatch) {\n this._updateForFile(cacheMatch, {\n compareToFile: this._inputItem,\n compress: settings.gzip\n });\n return;\n }\n\n this._downloadButtonUi.working();\n\n try {\n const finalResultFile = await svgo.process(settings, resultFile => {\n iterationCallback(resultFile);\n this._updateForFile(resultFile, {\n compareToFile: this._inputItem,\n compress: settings.gzip\n });\n });\n\n this._cache.add(settings.fingerprint, finalResultFile);\n }\n catch(e) {\n if (e.message == \"abort\") return;\n e.message = \"Minifying error: \" + e.message;\n this._handleError(e);\n }\n finally {\n this._downloadButtonUi.done();\n }\n }\n\n async _updateForFile(svgFile, { compareToFile, compress }) {\n this._outputUi.update(svgFile);\n this._downloadButtonUi.setDownload(this._inputFilename, svgFile);\n this._copyButtonUi.setCopyText(svgFile.text);\n\n this._resultsUi.update({\n comparisonSize: compareToFile && (await compareToFile.size({ compress })),\n size: await svgFile.size({ compress })\n });\n }\n}\n\n","import WorkerMessenger from './worker-messenger';\nimport SvgFile from './svg-file';\n\nexport default class Svgo extends WorkerMessenger {\n constructor() {\n super('js/svgo-worker.js');\n this._abortOnNextIteration = false;\n this._currentJob = Promise.resolve();\n }\n\n async load(svgText) {\n const {width, height} = await this._requestResponse({\n action: 'load',\n data: svgText\n });\n\n return new SvgFile(svgText, width, height);\n }\n\n process(settings, iterationCallback) {\n return this._currentJob = this.abortCurrent().then(async () => {\n this._abortOnNextIteration = false;\n\n let result = await this._requestResponse({\n action: 'process',\n settings\n });\n\n var resultFile = new SvgFile(result.data, result.dimensions.width, result.dimensions.height);\n\n iterationCallback(resultFile);\n\n if (settings.multipass) {\n while (result = await this.nextPass()) {\n if (this._abortOnNextIteration) {\n throw Error('abort');\n }\n resultFile = new SvgFile(result.data, result.dimensions.width, result.dimensions.height);\n iterationCallback(resultFile);\n }\n }\n\n // return final result\n return resultFile;\n });\n }\n\n nextPass() {\n return this._requestResponse({\n action: 'nextPass'\n });\n }\n\n async abortCurrent() {\n this._abortOnNextIteration = true;\n await this._currentJob;\n }\n\n async release() {\n await this.abortCurrent();\n super.release();\n }\n}\n","import { trackFocusMethod } from './utils';\nimport MainController from './main-controller';\n\ntrackFocusMethod();\nnew MainController();\n"],"names":["createContextualFragment","children","replace","map","reduce","Response","text","removeClass","classList","contains","Promise","resolve","target","removeEventListener","remove","add","requestAnimationFrame","addEventListener","x","pageX","y","pageY","Math","abs","sqrt","touches","Array","from","pow","floor","round","init","call","_maxListeners","defaultMaxListeners","length","apply","TypeError","_events","newListener","emit","listener","_eventsCount","unshift","push","warned","Error","name","emitter","type","count","console","warn","log","removeListener","arguments","pop","readyState","document","createRange","selectNode","documentElement","indexedDB","open","onerror","error","onupgradeneeded","result","createObjectStore","onsuccess","transaction","oncomplete","objectStore","get","set","put","delete","self","localStorage","getItem","setItem","removeItem","constructor","_requestId","_pending","_url","_worker","Worker","onmessage","_onMessage","release","terminate","Object","keys","_fulfillPending","id","_postMessage","postMessage","data","_requestResponse","compress","_compressedSize","_blob","width","height","size","then","byteLength","_create","Blob","URL","createObjectURL","blob","url","revokeObjectURL","eventArea","shouldCaptureFunc","_target","_shouldCaptureFunc","_dx","_dy","_scale","_active","_lastPoints","forEach","bind","_onPointerDown","_onWheel","reset","_update","preventDefault","getBoundingClientRect","deltaY","deltaMode","max","min","left","top","_onFirstPointerDown","_onPointerMove","_onPointerUp","which","style","WebkitTransform","transform","container","_svgFrame","querySelector","scrolling","_svgContainer","_panZoom","setSvg","_nextLoadPromise","src","encodeURIComponent","highlight","_codeEl","innerHTML","_types","image","code","_svgFile","_switchQueue","noAnimate","update","_activeType","appendChild","all","removeChild","animate","offsetLeft","_showTimeout","display","show","clearTimeout","setTimeout","hide","title","href","iconSvg","minor","setAttribute","_ripple","_spinner","_onClick","working","done","navigator","msSaveBlob","filename","setDownload","download","queryCommandSupported","_text","_pre","createElement","textContent","body","getSelection","removeAllRanges","window","addRange","execCommand","setCopyText","setColor","backgroundColor","_sizeEl","_newSizeEl","_diffEl","comparisonSize","prototype","create","EventEmitter","usingDomains","domain","active","Domain","getPrototypeOf","setMaxListeners","isNaN","getMaxListeners","domainEmitter","domainThrown","context","addListener","on","prependListener","once","prependOnceListener","removeAllListeners","listeners","listenerCount","eventNames","Reflect","ownKeys","range","_handle","_trackOn","_val","parentNode","insertBefore","firstChild","_onInputChange","_onRangeMouseDown","_onRangeTouchStart","_onRangeTouchEnd","_setPosition","focus","blur","value","_throttleTimeout","_pluginInputs","querySelectorAll","_globalInputs","_resetRipple","_resetBtn","_sliderMap","WeakMap","_scroller","_onChange","_onMouseWheel","_onReset","closest","currentTarget","scrollTop","getSettings","checked","hasAttribute","getAttribute","setSettings","plugins","fingerprint","join","allowHide","_loadFileInput","_pasteInput","_loadDemoBtn","_loadFileBtn","_pasteLabel","_overlay","_menu","_onMenuButtonClick","_onOverlayClick","_onLoadFileClick","_onLoadDemoClick","_onFileInputChange","_onTextInputChange","stopSpinner","showFilePicker","click","trim","includes","files","fetch","serviceWorker","controller","_content","_answerResolve","_hideTimeout","answer","className","duration","buttons","_activeEnters","_currentEnteredElement","_onDragEnter","_onDragLeave","_onDrop","dataTransfer","activated","_loadedVersion","showLogFrom","json","version","slice","concat","changes","_results","_mobileContainer","_container","_query","matchMedia","_positionResults","matches","output","_size","purge","_fingerprints","_items","_index","match","indexOf","_activated","_toActivate","activate","_abortOnNextIteration","_currentJob","load","action","process","abortCurrent","settings","dimensions","multipass","nextPass","_mainUi","_outputUi","_downloadButtonUi","_copyButtonUi","_bgFillUi","_resultsUi","_settingsUi","_mainMenuUi","_toastsUi","_dropUi","_preloaderUi","_changelogUi","_resultsContainerUi","_viewTogglerUi","_onSettingsChange","_onSettingsReset","_handleError","_onViewSelectionChange","_onGlobalKeyDown","_inputItem","_cache","_latestCompressJobId","_userHasInteracted","_reloading","register","scope","_onUpdateFound","storage","_loadSettings","key","ctrlKey","metaKey","installing","state","location","reload","_saveSettings","_compressSvg","_inputFilename","message","assign","original","random","_updateForFile","gzip","compareToFile"],"mappings":"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","preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9zcmMvanMvcGFnZS91dGlscy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9zcmMvanMvcGFnZS91aS9wYW4tem9vbS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9zcmMvanMvcGFnZS91aS9yZXN1bHRzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9yb2xsdXAtcGx1Z2luLW5vZGUtYnVpbHRpbnMvc3JjL2VzNi9ldmVudHMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvc3JjL2pzL3V0aWxzL3N0b3JhZ2UuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvc3JjL2pzL3BhZ2Uvd29ya2VyLW1lc3Nlbmdlci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9zcmMvanMvcGFnZS9nemlwLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL3NyYy9qcy9wYWdlL3N2Zy1maWxlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL3NyYy9qcy9wYWdlL3VpL3N2Zy1vdXRwdXQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvc3JjL2pzL3BhZ2UvdWkvY29kZS1vdXRwdXQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvc3JjL2pzL3BhZ2UvcHJpc20uanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvc3JjL2pzL3BhZ2UvdWkvb3V0cHV0LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL3NyYy9qcy9wYWdlL3VpL3JpcHBsZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9zcmMvanMvcGFnZS91aS9zcGlubmVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL3NyYy9qcy9wYWdlL3VpL2Zsb2F0aW5nLWFjdGlvbi1idXR0b24uanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvc3JjL2pzL3BhZ2UvdWkvZG93bmxvYWQtYnV0dG9uLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL3NyYy9qcy9wYWdlL3VpL2NvcHktYnV0dG9uLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL3NyYy9qcy9wYWdlL3VpL2JnLWZpbGwtYnV0dG9uLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL3NyYy9qcy9wYWdlL3VpL21hdGVyaWFsLXNsaWRlci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9zcmMvanMvcGFnZS91aS9zZXR0aW5ncy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9zcmMvanMvcGFnZS91aS9tYWluLW1lbnUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvc3JjL2pzL3BhZ2UvdWkvdG9hc3RzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL3NyYy9qcy9wYWdlL3VpL2ZpbGUtZHJvcC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9zcmMvanMvcGFnZS91aS9wcmVsb2FkZXIuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvc3JjL2pzL3BhZ2UvdWkvY2hhbmdlbG9nLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL3NyYy9qcy9wYWdlL3VpL3Jlc3VsdHMtY29udGFpbmVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL3NyYy9qcy9wYWdlL3VpL3ZpZXctdG9nZ2xlci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9zcmMvanMvcGFnZS9yZXN1bHRzLWNhY2hlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL3NyYy9qcy9wYWdlL3VpL21haW4tdWkuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvc3JjL2pzL3BhZ2UvbWFpbi1jb250cm9sbGVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL3NyYy9qcy9wYWdlL3N2Z28uanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvc3JjL2pzL3BhZ2UvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydCBjb25zdCBkb21SZWFkeSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICBmdW5jdGlvbiBjaGVja1N0YXRlKCkge1xuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlICE9ICdsb2FkaW5nJykgcmVzb2x2ZSgpO1xuICB9XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3JlYWR5c3RhdGVjaGFuZ2UnLCBjaGVja1N0YXRlKTtcbiAgY2hlY2tTdGF0ZSgpO1xufSk7XG5cbmNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbnJhbmdlLnNlbGVjdE5vZGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0clRvRWwoc3RyKSB7XG4gIGNvbnN0IGZyYWcgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoc3RyKTtcbiAgcmV0dXJuIGZyYWcuY2hpbGRyZW5bMF07XG59XG5cbmNvbnN0IGVudGl0eU1hcCA9IHtcbiAgXCImXCI6IFwiJmFtcDtcIixcbiAgXCI8XCI6IFwiJmx0O1wiLFxuICBcIj5cIjogXCImZ3Q7XCIsXG4gICdcIic6ICcmcXVvdDsnLFxuICBcIidcIjogJyYjMzk7JyxcbiAgXCIvXCI6ICcmI3gyRjsnXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlSFRNTChzdHIpIHtcbiAgcmV0dXJuIFN0cmluZyhzdHIpLnJlcGxhY2UoL1smPD5cIidcXC9dL2csIHMgPT4gZW50aXR5TWFwW3NdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUh0bWxUYWcoc3RyaW5ncywgLi4udmFsdWVzKSB7XG4gIHZhbHVlcyA9IHZhbHVlcy5tYXAocyA9PiBlc2NhcGVIVE1MKHMpKTtcbiAgcmV0dXJuIHN0cmluZ3MucmVkdWNlKChzdHIsIHZhbCwgaSkgPT4gc3RyICs9IHZhbCArICh2YWx1ZXNbaV0gfHwgJycpLCAnJyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZpbGVBc1RleHQoZmlsZSkge1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKGZpbGUpLnRleHQoKTtcbn07XG5cbmZ1bmN0aW9uIHRyYW5zaXRpb25DbGFzc0Z1bmMoe3JlbW92ZUNsYXNzID0gZmFsc2V9PXt9KSB7XG4gIHJldHVybiBmdW5jdGlvbihlbCwgY2xhc3NOYW1lID0gJ2FjdGl2ZScsIHRyYW5zaXRpb25DbGFzcyA9ICd0cmFuc2l0aW9uJykge1xuICAgIGlmIChyZW1vdmVDbGFzcykge1xuICAgICAgaWYgKCFlbC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gZXZlbnQgPT4ge1xuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ICE9IGVsKSByZXR1cm47XG4gICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dlYmtpdFRyYW5zaXRpb25FbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUodHJhbnNpdGlvbkNsYXNzKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCh0cmFuc2l0aW9uQ2xhc3MpO1xuXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRUcmFuc2l0aW9uRW5kJywgbGlzdGVuZXIpO1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgbGlzdGVuZXIpO1xuICAgICAgICBlbC5jbGFzc0xpc3RbcmVtb3ZlQ2xhc3MgPyAncmVtb3ZlJyA6ICdhZGQnXShjbGFzc05hbWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHRyYW5zaXRpb25Ub0NsYXNzID0gdHJhbnNpdGlvbkNsYXNzRnVuYygpO1xuZXhwb3J0IGNvbnN0IHRyYW5zaXRpb25Gcm9tQ2xhc3MgPSB0cmFuc2l0aW9uQ2xhc3NGdW5jKHtyZW1vdmVDbGFzczogdHJ1ZX0pO1xuXG5leHBvcnQgZnVuY3Rpb24gbG9hZENzcyh1cmwpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgIGxpbmsuaHJlZiA9IHVybDtcblxuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHJlc29sdmUoKSk7XG4gICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHJlamVjdCgpKTtcblxuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRyYWNrRm9jdXNNZXRob2QoKSB7XG4gIHZhciBmb2N1c01ldGhvZCA9ICdtb3VzZSc7XG5cbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGV2ZW50ID0+IHtcbiAgICBldmVudC50YXJnZXQuY2xhc3NMaXN0LmFkZChmb2N1c01ldGhvZCA9PSAna2V5JyA/ICdrZXktZm9jdXNlZCcgOiAnbW91c2UtZm9jdXNlZCcpO1xuICB9LCB0cnVlKTtcblxuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBldmVudCA9PiB7XG4gICAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ2tleS1mb2N1c2VkJyk7XG4gICAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ21vdXNlLWZvY3VzZWQnKTtcbiAgfSwgdHJ1ZSk7XG5cbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKCkgPT4ge1xuICAgIGZvY3VzTWV0aG9kID0gJ2tleSc7XG4gIH0sIHRydWUpO1xuXG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKCkgPT4ge1xuICAgIGZvY3VzTWV0aG9kID0gJ21vdXNlJztcbiAgfSwgdHJ1ZSk7XG59O1xuIiwiZnVuY3Rpb24gZ2V0WFkob2JqKSB7XG4gIHJldHVybiB7XG4gICAgeDogb2JqLnBhZ2VYLFxuICAgIHk6IG9iai5wYWdlWVxuICB9O1xufVxuXG5mdW5jdGlvbiB0b3VjaERpc3RhbmNlKHRvdWNoMSwgdG91Y2gyKSB7XG4gIGNvbnN0IGR4ID0gTWF0aC5hYnModG91Y2gyLnggLSB0b3VjaDEueCk7XG4gIGNvbnN0IGR5ID0gTWF0aC5hYnModG91Y2gyLnkgLSB0b3VjaDEueSk7XG4gIHJldHVybiBNYXRoLnNxcnQoZHgqZHggKyBkeSpkeSk7XG59XG5cbmZ1bmN0aW9uIGdldE1pZHBvaW50KHBvaW50MSwgcG9pbnQyKSB7XG4gIHJldHVybiB7XG4gICAgeDogKHBvaW50MS54ICsgcG9pbnQyLngpIC8gMixcbiAgICB5OiAocG9pbnQxLnkgKyBwb2ludDIueSkgLyAyXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFBvaW50cyhldmVudCkge1xuICBpZiAoZXZlbnQudG91Y2hlcykge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGV2ZW50LnRvdWNoZXMpLm1hcCh0ID0+IGdldFhZKHQpKTtcbiAgfVxuICBlbHNlIHtcbiAgICByZXR1cm4gW2dldFhZKGV2ZW50KV07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFuWm9vbSB7XG4gIGNvbnN0cnVjdG9yKHRhcmdldCwge1xuICAgIGV2ZW50QXJlYSA9IHRhcmdldCxcbiAgICBzaG91bGRDYXB0dXJlRnVuYyA9ICgpID0+IHRydWVcbiAgfT17fSkge1xuICAgIHRoaXMuX3RhcmdldCA9IHRhcmdldDtcbiAgICB0aGlzLl9zaG91bGRDYXB0dXJlRnVuYyA9IHNob3VsZENhcHR1cmVGdW5jO1xuICAgIHRoaXMuX2R4ID0gMDtcbiAgICB0aGlzLl9keSA9IDA7XG4gICAgdGhpcy5fc2NhbGUgPSAxO1xuICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgdGhpcy5fbGFzdFBvaW50cyA9IFtdO1xuXG4gICAgLy8gYmluZFxuICAgIFtcbiAgICAgICdfb25Qb2ludGVyRG93bicsXG4gICAgICAnX29uUG9pbnRlck1vdmUnLFxuICAgICAgJ19vblBvaW50ZXJVcCdcbiAgICBdLmZvckVhY2goZnVuY05hbWUgPT4ge1xuICAgICAgdGhpc1tmdW5jTmFtZV0gPSB0aGlzW2Z1bmNOYW1lXS5iaW5kKHRoaXMpO1xuICAgIH0pXG5cbiAgICAvLyBib3VuZCBldmVudHNcbiAgICBldmVudEFyZWEuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fb25Qb2ludGVyRG93bik7XG4gICAgZXZlbnRBcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9vblBvaW50ZXJEb3duKTtcblxuICAgIC8vIHVuYm9udWRcbiAgICBldmVudEFyZWEuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBlID0+IHRoaXMuX29uV2hlZWwoZSkpO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5fZHggPSAwO1xuICAgIHRoaXMuX2R5ID0gMDtcbiAgICB0aGlzLl9zY2FsZSA9IDE7XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gIH1cblxuICBfb25XaGVlbChldmVudCkge1xuICAgIGlmICghdGhpcy5fc2hvdWxkQ2FwdHVyZUZ1bmMoZXZlbnQudGFyZ2V0KSkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBjb25zdCBib3VuZGluZ1JlY3QgPSB0aGlzLl90YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IGRlbHRhID0gZXZlbnQuZGVsdGFZO1xuXG4gICAgaWYgKGV2ZW50LmRlbHRhTW9kZSA9PT0gMSkgeyAvLyAxIGlzIFwibGluZXNcIiwgMCBpcyBcInBpeGVsc1wiXG4gICAgICAvLyBGaXJlZm94IHVzZXMgXCJsaW5lc1wiIHdoZW4gbW91c2UgaXMgY29ubmVjdGVkXG4gICAgICBkZWx0YSAqPSAxNTtcbiAgICB9XG5cbiAgICAvLyBzdG9wIG1vdXNlIHdoZWVsIHByb2R1Y2luZyBodWdlIHZhbHVlc1xuICAgIGRlbHRhID0gTWF0aC5tYXgoTWF0aC5taW4oZGVsdGEsIDYwKSwgLTYwKTtcblxuICAgIGNvbnN0IHNjYWxlRGlmZiA9IChkZWx0YSAvIDMwMCkgKyAxO1xuXG4gICAgLy8gYXZvaWQgdG8tc21hbGwgdmFsdWVzXG4gICAgaWYgKHRoaXMuX3NjYWxlICogc2NhbGVEaWZmIDwgMC4wNSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fc2NhbGUgKj0gc2NhbGVEaWZmO1xuICAgIHRoaXMuX2R4IC09IChldmVudC5wYWdlWCAtIGJvdW5kaW5nUmVjdC5sZWZ0KSAqIChzY2FsZURpZmYgLSAxKTtcbiAgICB0aGlzLl9keSAtPSAoZXZlbnQucGFnZVkgLSBib3VuZGluZ1JlY3QudG9wKSAqIChzY2FsZURpZmYgLSAxKTtcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgfVxuXG4gIF9vbkZpcnN0UG9pbnRlckRvd24oZXZlbnQpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vblBvaW50ZXJNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Qb2ludGVyVXApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX29uUG9pbnRlck1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5fb25Qb2ludGVyVXApO1xuICB9XG5cbiAgX29uUG9pbnRlckRvd24oZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudHlwZSA9PSAnbW91c2Vkb3duJyAmJiBldmVudC53aGljaCAhPSAxKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLl9zaG91bGRDYXB0dXJlRnVuYyhldmVudC50YXJnZXQpKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMuX2xhc3RQb2ludHMgPSBnZXRQb2ludHMoZXZlbnQpO1xuICAgIHRoaXMuX2FjdGl2ZSsrO1xuXG4gICAgaWYgKHRoaXMuX2FjdGl2ZSA9PT0gMSkge1xuICAgICAgdGhpcy5fb25GaXJzdFBvaW50ZXJEb3duKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBfb25Qb2ludGVyTW92ZShldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgcG9pbnRzID0gZ2V0UG9pbnRzKGV2ZW50KTtcbiAgICBjb25zdCBhdmVyYWdlUG9pbnQgPSBwb2ludHMucmVkdWNlKGdldE1pZHBvaW50KTtcbiAgICBjb25zdCBhdmVyYWdlTGFzdFBvaW50ID0gdGhpcy5fbGFzdFBvaW50cy5yZWR1Y2UoZ2V0TWlkcG9pbnQpO1xuICAgIGNvbnN0IGJvdW5kaW5nUmVjdCA9IHRoaXMuX3RhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIHRoaXMuX2R4ICs9IGF2ZXJhZ2VQb2ludC54IC0gYXZlcmFnZUxhc3RQb2ludC54O1xuICAgIHRoaXMuX2R5ICs9IGF2ZXJhZ2VQb2ludC55IC0gYXZlcmFnZUxhc3RQb2ludC55O1xuXG4gICAgaWYgKHBvaW50c1sxXSkge1xuICAgICAgY29uc3Qgc2NhbGVEaWZmID0gdG91Y2hEaXN0YW5jZShwb2ludHNbMF0sIHBvaW50c1sxXSkgLyB0b3VjaERpc3RhbmNlKHRoaXMuX2xhc3RQb2ludHNbMF0sIHRoaXMuX2xhc3RQb2ludHNbMV0pO1xuICAgICAgdGhpcy5fc2NhbGUgKj0gc2NhbGVEaWZmO1xuICAgICAgdGhpcy5fZHggLT0gKGF2ZXJhZ2VQb2ludC54IC0gYm91bmRpbmdSZWN0LmxlZnQpICogKHNjYWxlRGlmZiAtIDEpO1xuICAgICAgdGhpcy5fZHkgLT0gKGF2ZXJhZ2VQb2ludC55IC0gYm91bmRpbmdSZWN0LnRvcCkgKiAoc2NhbGVEaWZmIC0gMSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgdGhpcy5fbGFzdFBvaW50cyA9IHBvaW50cztcbiAgfVxuXG4gIF91cGRhdGUoKSB7XG4gICAgdGhpcy5fdGFyZ2V0LnN0eWxlLldlYmtpdFRyYW5zZm9ybSA9IHRoaXMuX3RhcmdldC5zdHlsZS50cmFuc2Zvcm1cbiAgICAgID0gYHRyYW5zbGF0ZTNkKCR7dGhpcy5fZHh9cHgsICR7dGhpcy5fZHl9cHgsIDApIHNjYWxlKCR7dGhpcy5fc2NhbGV9KWA7XG4gIH1cblxuICBfb25Qb2ludGVyVXAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuX2FjdGl2ZS0tO1xuICAgIHRoaXMuX2xhc3RQb2ludHMucG9wKCk7XG5cbiAgICBpZiAodGhpcy5fYWN0aXZlKSB7XG4gICAgICB0aGlzLl9sYXN0UG9pbnRzID0gZ2V0UG9pbnRzKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vblBvaW50ZXJNb3ZlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Qb2ludGVyVXApO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX29uUG9pbnRlck1vdmUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5fb25Qb2ludGVyVXApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBzdHJUb0VsIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5mdW5jdGlvbiByb3VuZChudW0sIHBsYWNlcykge1xuICBjb25zdCBtdWx0ID0gTWF0aC5wb3coMTAsIHBsYWNlcyk7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucm91bmQobnVtICogbXVsdCkpIC8gbXVsdDtcbn1cblxuZnVuY3Rpb24gaHVtYW5TaXplKGJ5dGVzKSB7XG4gIGlmIChieXRlcyA8IDEwMjQpIHtcbiAgICByZXR1cm4gYnl0ZXMgKyAnIGJ5dGVzJztcbiAgfVxuICBlbHNlIHtcbiAgICByZXR1cm4gcm91bmQoYnl0ZXMgLyAxMDI0LCAyKSArICdrJztcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXN1bHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb250YWluZXIgPSBzdHJUb0VsKFxuICAgICAgJzxkaXYgY2xhc3M9XCJyZXN1bHRzXCI+JyArXG4gICAgICAgICc8c3BhbiBjbGFzcz1cInNpemVcIj48L3NwYW4+ICcgK1xuICAgICAgICAnPHNwYW4gY2xhc3M9XCJkaWZmXCI+PC9zcGFuPicgK1xuICAgICAgJzwvZGl2PicgK1xuICAgICcnKTtcblxuICAgIHRoaXMuX3NpemVFbCA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5zaXplJyk7XG4gICAgdGhpcy5fbmV3U2l6ZUVsID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcignLm5ld1NpemUnKTtcbiAgICB0aGlzLl9kaWZmRWwgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuZGlmZicpO1xuICB9XG5cbiAgdXBkYXRlKHsgc2l6ZSwgY29tcGFyaXNvblNpemUgfSkge1xuICAgIGlmIChjb21wYXJpc29uU2l6ZSkge1xuICAgICAgdGhpcy5fc2l6ZUVsLnRleHRDb250ZW50ID0gaHVtYW5TaXplKGNvbXBhcmlzb25TaXplKSArICcg4oaSICcgKyBodW1hblNpemUoc2l6ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NpemVFbC50ZXh0Q29udGVudCA9IGh1bWFuU2l6ZShzaXplKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kaWZmRWwuY2xhc3NMaXN0LnJlbW92ZSgnZGVjcmVhc2UnLCAnaW5jcmVhc2UnKTtcblxuICAgIC8vIGp1c3QgZGlzcGxheWluZyBhIHNpbmdsZSBzaXplP1xuICAgIGlmICghY29tcGFyaXNvblNpemUpIHtcbiAgICAgIHRoaXMuX2RpZmZFbC50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIGlmIChzaXplID09PSBjb21wYXJpc29uU2l6ZSkge1xuICAgICAgdGhpcy5fZGlmZkVsLnRleHRDb250ZW50ID0gJzEwMCUnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuX2RpZmZFbC50ZXh0Q29udGVudCA9IHJvdW5kKHNpemUgLyBjb21wYXJpc29uU2l6ZSAqIDEwMCwgMikgKyAnJSc7XG4gICAgICB0aGlzLl9kaWZmRWwuY2xhc3NMaXN0LmFkZChzaXplID4gY29tcGFyaXNvblNpemUgPyAnaW5jcmVhc2UnIDogJ2RlY3JlYXNlJyk7XG4gICAgfVxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBkb21haW47XG5cbi8vIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byBzdG9yZSBldmVudCBoYW5kbGVycy4gSW5zdGFudGlhdGluZyB0aGlzIGlzXG4vLyBmYXN0ZXIgdGhhbiBleHBsaWNpdGx5IGNhbGxpbmcgYE9iamVjdC5jcmVhdGUobnVsbClgIHRvIGdldCBhIFwiY2xlYW5cIiBlbXB0eVxuLy8gb2JqZWN0ICh0ZXN0ZWQgd2l0aCB2OCB2NC45KS5cbmZ1bmN0aW9uIEV2ZW50SGFuZGxlcnMoKSB7fVxuRXZlbnRIYW5kbGVycy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIEV2ZW50RW1pdHRlci5pbml0LmNhbGwodGhpcyk7XG59XG5leHBvcnQgZGVmYXVsdCBFdmVudEVtaXR0ZXI7XG5leHBvcnQge0V2ZW50RW1pdHRlcn07XG5cbi8vIG5vZGVqcyBvZGRpdHlcbi8vIHJlcXVpcmUoJ2V2ZW50cycpID09PSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXJcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXJcblxuRXZlbnRFbWl0dGVyLnVzaW5nRG9tYWlucyA9IGZhbHNlO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmRvbWFpbiA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuRXZlbnRFbWl0dGVyLmluaXQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5kb21haW4gPSBudWxsO1xuICBpZiAoRXZlbnRFbWl0dGVyLnVzaW5nRG9tYWlucykge1xuICAgIC8vIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBkb21haW4sIHRoZW4gYXR0YWNoIHRvIGl0LlxuICAgIGlmIChkb21haW4uYWN0aXZlICYmICEodGhpcyBpbnN0YW5jZW9mIGRvbWFpbi5Eb21haW4pKSB7XG4gICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbi5hY3RpdmU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgdGhpcy5fZXZlbnRzID09PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykge1xuICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn07XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldE1heExpc3RlbmVycyhuKSB7XG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA8IDAgfHwgaXNOYU4obikpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJuXCIgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uICRnZXRNYXhMaXN0ZW5lcnModGhhdCkge1xuICBpZiAodGhhdC5fbWF4TGlzdGVuZXJzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICByZXR1cm4gdGhhdC5fbWF4TGlzdGVuZXJzO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIGdldE1heExpc3RlbmVycygpIHtcbiAgcmV0dXJuICRnZXRNYXhMaXN0ZW5lcnModGhpcyk7XG59O1xuXG4vLyBUaGVzZSBzdGFuZGFsb25lIGVtaXQqIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBvcHRpbWl6ZSBjYWxsaW5nIG9mIGV2ZW50XG4vLyBoYW5kbGVycyBmb3IgZmFzdCBjYXNlcyBiZWNhdXNlIGVtaXQoKSBpdHNlbGYgb2Z0ZW4gaGFzIGEgdmFyaWFibGUgbnVtYmVyIG9mXG4vLyBhcmd1bWVudHMgYW5kIGNhbiBiZSBkZW9wdGltaXplZCBiZWNhdXNlIG9mIHRoYXQuIFRoZXNlIGZ1bmN0aW9ucyBhbHdheXMgaGF2ZVxuLy8gdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cyBhbmQgdGh1cyBkbyBub3QgZ2V0IGRlb3B0aW1pemVkLCBzbyB0aGUgY29kZVxuLy8gaW5zaWRlIHRoZW0gY2FuIGV4ZWN1dGUgZmFzdGVyLlxuZnVuY3Rpb24gZW1pdE5vbmUoaGFuZGxlciwgaXNGbiwgc2VsZikge1xuICBpZiAoaXNGbilcbiAgICBoYW5kbGVyLmNhbGwoc2VsZik7XG4gIGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBsaXN0ZW5lcnNbaV0uY2FsbChzZWxmKTtcbiAgfVxufVxuZnVuY3Rpb24gZW1pdE9uZShoYW5kbGVyLCBpc0ZuLCBzZWxmLCBhcmcxKSB7XG4gIGlmIChpc0ZuKVxuICAgIGhhbmRsZXIuY2FsbChzZWxmLCBhcmcxKTtcbiAgZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHNlbGYsIGFyZzEpO1xuICB9XG59XG5mdW5jdGlvbiBlbWl0VHdvKGhhbmRsZXIsIGlzRm4sIHNlbGYsIGFyZzEsIGFyZzIpIHtcbiAgaWYgKGlzRm4pXG4gICAgaGFuZGxlci5jYWxsKHNlbGYsIGFyZzEsIGFyZzIpO1xuICBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgbGlzdGVuZXJzW2ldLmNhbGwoc2VsZiwgYXJnMSwgYXJnMik7XG4gIH1cbn1cbmZ1bmN0aW9uIGVtaXRUaHJlZShoYW5kbGVyLCBpc0ZuLCBzZWxmLCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gIGlmIChpc0ZuKVxuICAgIGhhbmRsZXIuY2FsbChzZWxmLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHNlbGYsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRNYW55KGhhbmRsZXIsIGlzRm4sIHNlbGYsIGFyZ3MpIHtcbiAgaWYgKGlzRm4pXG4gICAgaGFuZGxlci5hcHBseShzZWxmLCBhcmdzKTtcbiAgZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIGxpc3RlbmVyc1tpXS5hcHBseShzZWxmLCBhcmdzKTtcbiAgfVxufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHtcbiAgdmFyIGVyLCBoYW5kbGVyLCBsZW4sIGFyZ3MsIGksIGV2ZW50cywgZG9tYWluO1xuICB2YXIgbmVlZERvbWFpbkV4aXQgPSBmYWxzZTtcbiAgdmFyIGRvRXJyb3IgPSAodHlwZSA9PT0gJ2Vycm9yJyk7XG5cbiAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoZXZlbnRzKVxuICAgIGRvRXJyb3IgPSAoZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT0gbnVsbCk7XG4gIGVsc2UgaWYgKCFkb0Vycm9yKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBkb21haW4gPSB0aGlzLmRvbWFpbjtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmIChkb0Vycm9yKSB7XG4gICAgZXIgPSBhcmd1bWVudHNbMV07XG4gICAgaWYgKGRvbWFpbikge1xuICAgICAgaWYgKCFlcilcbiAgICAgICAgZXIgPSBuZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQnKTtcbiAgICAgIGVyLmRvbWFpbkVtaXR0ZXIgPSB0aGlzO1xuICAgICAgZXIuZG9tYWluID0gZG9tYWluO1xuICAgICAgZXIuZG9tYWluVGhyb3duID0gZmFsc2U7XG4gICAgICBkb21haW4uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgfSBlbHNlIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudC4gKCcgKyBlciArICcpJyk7XG4gICAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBoYW5kbGVyID0gZXZlbnRzW3R5cGVdO1xuXG4gIGlmICghaGFuZGxlcilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGlzRm4gPSB0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJztcbiAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgc3dpdGNoIChsZW4pIHtcbiAgICAvLyBmYXN0IGNhc2VzXG4gICAgY2FzZSAxOlxuICAgICAgZW1pdE5vbmUoaGFuZGxlciwgaXNGbiwgdGhpcyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI6XG4gICAgICBlbWl0T25lKGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3VtZW50c1sxXSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICBlbWl0VHdvKGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDpcbiAgICAgIGVtaXRUaHJlZShoYW5kbGVyLCBpc0ZuLCB0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSwgYXJndW1lbnRzWzNdKTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIHNsb3dlclxuICAgIGRlZmF1bHQ6XG4gICAgICBhcmdzID0gbmV3IEFycmF5KGxlbiAtIDEpO1xuICAgICAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKVxuICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGVtaXRNYW55KGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgaWYgKG5lZWREb21haW5FeGl0KVxuICAgIGRvbWFpbi5leGl0KCk7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICB2YXIgbTtcbiAgdmFyIGV2ZW50cztcbiAgdmFyIGV4aXN0aW5nO1xuXG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICBpZiAoIWV2ZW50cykge1xuICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAgIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgICBpZiAoZXZlbnRzLm5ld0xpc3RlbmVyKSB7XG4gICAgICB0YXJnZXQuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgPyBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZVxuICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdFxuICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgfVxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgaWYgKCFleGlzdGluZykge1xuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50O1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V4aXN0aW5nLCBsaXN0ZW5lcl07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICAgIGlmIChwcmVwZW5kKSB7XG4gICAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgICBpZiAoIWV4aXN0aW5nLndhcm5lZCkge1xuICAgICAgbSA9ICRnZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICAgIGlmIChtICYmIG0gPiAwICYmIGV4aXN0aW5nLmxlbmd0aCA+IG0pIHtcbiAgICAgICAgZXhpc3Rpbmcud2FybmVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcubGVuZ3RoICsgJyAnICsgdHlwZSArICcgbGlzdGVuZXJzIGFkZGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgICAgdy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyc7XG4gICAgICAgIHcuZW1pdHRlciA9IHRhcmdldDtcbiAgICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgICAgdy5jb3VudCA9IGV4aXN0aW5nLmxlbmd0aDtcbiAgICAgICAgZW1pdFdhcm5pbmcodyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIGVtaXRXYXJuaW5nKGUpIHtcbiAgdHlwZW9mIGNvbnNvbGUud2FybiA9PT0gJ2Z1bmN0aW9uJyA/IGNvbnNvbGUud2FybihlKSA6IGNvbnNvbGUubG9nKGUpO1xufVxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgZmlyZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZygpIHtcbiAgICB0YXJnZXQucmVtb3ZlTGlzdGVuZXIodHlwZSwgZyk7XG4gICAgaWYgKCFmaXJlZCkge1xuICAgICAgZmlyZWQgPSB0cnVlO1xuICAgICAgbGlzdGVuZXIuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuICBnLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHJldHVybiBnO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4vLyBlbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWZmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZFxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmICghZXZlbnRzKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmICghbGlzdClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCAobGlzdC5saXN0ZW5lciAmJiBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8XG4gICAgICAgICAgICAgIChsaXN0W2ldLmxpc3RlbmVyICYmIGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGxpc3RbMF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKHR5cGUpIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMsIGV2ZW50cztcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKCFldmVudHMpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gICAgICBpZiAoIWV2ZW50cy5yZW1vdmVMaXN0ZW5lcikge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50c1t0eXBlXSkge1xuICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGtleTsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAgICAgLy8gTElGTyBvcmRlclxuICAgICAgICBkbyB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbbGlzdGVuZXJzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfSB3aGlsZSAobGlzdGVuZXJzWzBdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnModHlwZSkge1xuICB2YXIgZXZsaXN0ZW5lcjtcbiAgdmFyIHJldDtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoIWV2ZW50cylcbiAgICByZXQgPSBbXTtcbiAgZWxzZSB7XG4gICAgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcbiAgICBpZiAoIWV2bGlzdGVuZXIpXG4gICAgICByZXQgPSBbXTtcbiAgICBlbHNlIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIHJldCA9IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdO1xuICAgIGVsc2VcbiAgICAgIHJldCA9IHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG5cbiAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdC5vd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07XG5cbi8vIEFib3V0IDEuNXggZmFzdGVyIHRoYW4gdGhlIHR3by1hcmcgdmVyc2lvbiBvZiBBcnJheSNzcGxpY2UoKS5cbmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKHZhciBpID0gaW5kZXgsIGsgPSBpICsgMSwgbiA9IGxpc3QubGVuZ3RoOyBrIDwgbjsgaSArPSAxLCBrICs9IDEpXG4gICAgbGlzdFtpXSA9IGxpc3Rba107XG4gIGxpc3QucG9wKCk7XG59XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBpKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KGkpO1xuICB3aGlsZSAoaS0tKVxuICAgIGNvcHlbaV0gPSBhcnJbaV07XG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7XG4gICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIiwiZXhwb3J0IGxldCBpZGJLZXl2YWwgPSAoKCkgPT4ge1xuICBsZXQgZGI7XG5cbiAgZnVuY3Rpb24gZ2V0REIoKSB7XG4gICAgaWYgKCFkYikge1xuICAgICAgZGIgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IG9wZW5yZXEgPSBpbmRleGVkREIub3Blbignc3Znby1rZXl2YWwnLCAxKTtcblxuICAgICAgICBvcGVucmVxLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KG9wZW5yZXEuZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG9wZW5yZXEub251cGdyYWRlbmVlZGVkID0gKCkgPT4ge1xuICAgICAgICAgIC8vIEZpcnN0IHRpbWUgc2V0dXA6IGNyZWF0ZSBhbiBlbXB0eSBvYmplY3Qgc3RvcmVcbiAgICAgICAgICBvcGVucmVxLnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSgna2V5dmFsJyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgb3BlbnJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShvcGVucmVxLnJlc3VsdCk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRiO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd2l0aFN0b3JlKHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgZGIgPSBhd2FpdCBnZXREQigpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKCdrZXl2YWwnLCB0eXBlKTtcbiAgICAgIHRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICB0cmFuc2FjdGlvbi5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHRyYW5zYWN0aW9uLmVycm9yKTtcbiAgICAgIGNhbGxiYWNrKHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKCdrZXl2YWwnKSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGdldChrZXkpIHtcbiAgICAgIGxldCByZXE7XG4gICAgICBhd2FpdCB3aXRoU3RvcmUoJ3JlYWRvbmx5Jywgc3RvcmUgPT4ge1xuICAgICAgICByZXEgPSBzdG9yZS5nZXQoa2V5KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlcS5yZXN1bHQ7XG4gICAgfSxcbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHdpdGhTdG9yZSgncmVhZHdyaXRlJywgc3RvcmUgPT4ge1xuICAgICAgICBzdG9yZS5wdXQodmFsdWUsIGtleSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgIHJldHVybiB3aXRoU3RvcmUoJ3JlYWR3cml0ZScsIHN0b3JlID0+IHtcbiAgICAgICAgc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59KSgpO1xuXG4vLyBpT1MgYWRkLXRvLWhvbWVzY3JlZW4gaXMgbWlzc2luZyBJREIsIG9yIGF0IGxlYXN0IGl0IHVzZWQgdG8uXG4vLyBJIGhhdmVuJ3QgdGVzdGVkIHRoaXMgaW4gYSB3aGlsZS5cbmlmICghc2VsZi5pbmRleGVkREIpIHtcbiAgaWRiS2V5dmFsID0ge1xuICAgIGdldDoga2V5ID0+IFByb21pc2UucmVzb2x2ZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpKSxcbiAgICBzZXQ6IChrZXksIHZhbCkgPT4gUHJvbWlzZS5yZXNvbHZlKGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsKSksXG4gICAgZGVsZXRlOiBrZXkgPT4gUHJvbWlzZS5yZXNvbHZlKGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSkpXG4gIH07XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV29ya2VyTWVzc2VuZ2VyIHtcbiAgY29uc3RydWN0b3IodXJsKSB7XG4gICAgdGhpcy5fcmVxdWVzdElkID0gMDtcbiAgICAvLyB3b3JrZXIgam9icyBhd2FpdGluZyByZXNwb25zZSB7IFtyZXF1ZXN0SWRdOiBbIHJlc29sdmUsIHJlamVjdCBdIH1cbiAgICB0aGlzLl9wZW5kaW5nID0ge307XG4gICAgdGhpcy5fdXJsID0gdXJsO1xuICAgIHRoaXMuX3dvcmtlciA9IG5ldyBXb3JrZXIodGhpcy5fdXJsKTtcbiAgICB0aGlzLl93b3JrZXIub25tZXNzYWdlID0gZXZlbnQgPT4gdGhpcy5fb25NZXNzYWdlKGV2ZW50KTtcbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2UoKSB7XG4gICAgaWYgKHRoaXMuX3dvcmtlcikge1xuICAgICAgdGhpcy5fd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5fcGVuZGluZykpIHtcbiAgICAgIHRoaXMuX2Z1bGZpbGxQZW5kaW5nKGlkLCBudWxsLCBuZXcgRXJyb3IoXCJXb3JrZXIgdGVybWluYXRlZDogXCIgKyB0aGlzLl91cmwpKTtcbiAgICB9XG4gIH1cblxuICBfcG9zdE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHRoaXMuX3dvcmtlci5wb3N0TWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIF9vbk1lc3NhZ2UoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50LmRhdGEuaWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiVW5leHBlY3RlZCBtZXNzYWdlXCIsIGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9mdWxmaWxsUGVuZGluZyhldmVudC5kYXRhLmlkLCBldmVudC5kYXRhLnJlc3VsdCwgZXZlbnQuZGF0YS5lcnJvcik7XG4gIH1cblxuICBfZnVsZmlsbFBlbmRpbmcoaWQsIHJlc3VsdCwgZXJyb3IpIHtcbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuX3BlbmRpbmdbaWRdO1xuXG4gICAgaWYgKCFyZXNvbHZlcikge1xuICAgICAgY29uc29sZS5sb2coXCJObyByZXNvbHZlciBmb3JcIiwgeyBpZCwgcmVzdWx0LCBlcnJvciB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkZWxldGUgdGhpcy5fcGVuZGluZ1tpZF07XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHJlc29sdmVyWzFdKG5ldyBFcnJvcihlcnJvcikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJlc29sdmVyWzBdKHJlc3VsdCk7XG4gIH1cblxuICBfcmVxdWVzdFJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbWVzc2FnZS5pZCA9ICsrdGhpcy5fcmVxdWVzdElkO1xuICAgICAgdGhpcy5fcGVuZGluZ1ttZXNzYWdlLmlkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgICAgdGhpcy5fcG9zdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCBXb3JrZXJNZXNzZW5nZXIgZnJvbSAnLi93b3JrZXItbWVzc2VuZ2VyJztcblxuY2xhc3MgR3ppcCBleHRlbmRzIFdvcmtlck1lc3NlbmdlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdqcy9nemlwLXdvcmtlci5qcycpO1xuICB9XG5cbiAgY29tcHJlc3Moc3ZnRGF0YSkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0UmVzcG9uc2Uoe1xuICAgICAgZGF0YTogc3ZnRGF0YVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnemlwID0gbmV3IEd6aXAoKTtcbiIsImltcG9ydCB7IGd6aXAgfSBmcm9tICcuL2d6aXAnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdmdGaWxlIHtcbiAgY29uc3RydWN0b3IodGV4dCwgd2lkdGgsIGhlaWdodCkge1xuICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgdGhpcy5fY29tcHJlc3NlZFNpemUgPSBudWxsO1xuICAgIHRoaXMuX3VybCA9ICcnO1xuICAgIHRoaXMuX2Jsb2IgPSBudWxsO1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgfVxuXG4gIGFzeW5jIHNpemUoeyBjb21wcmVzcyB9KSB7XG4gICAgaWYgKCFjb21wcmVzcykge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dC5sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9jb21wcmVzc2VkU2l6ZSkge1xuICAgICAgdGhpcy5fY29tcHJlc3NlZFNpemUgPSBnemlwLmNvbXByZXNzKHRoaXMudGV4dCkudGhlbihyID0+IHIuYnl0ZUxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2NvbXByZXNzZWRTaXplO1xuICB9XG5cbiAgX2NyZWF0ZSgpIHtcbiAgICAvLyBJRSBHQ3MgYmxvYnMgb25jZSB0aGV5J3JlIG91dCBvZiByZWZlcmVuY2UsIGV2ZW4gaWYgdGhleVxuICAgIC8vIGhhdmUgYW4gb2JqZWN0IHVybCwgc28gd2UgaGF2ZSB0byBrZWVwIGluIGluIHJlZmVyZW5jZS5cbiAgICB0aGlzLl9ibG9iID0gbmV3IEJsb2IoW3RoaXMudGV4dF0sIHt0eXBlOiBcImltYWdlL3N2Zyt4bWxcIn0pO1xuICAgIHRoaXMuX3VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwodGhpcy5fYmxvYik7XG4gIH1cblxuICBnZXQgYmxvYigpIHtcbiAgICBpZiAoIXRoaXMuX2Jsb2IpIHRoaXMuX2NyZWF0ZSgpO1xuICAgIHJldHVybiB0aGlzLl9ibG9iO1xuICB9XG5cbiAgZ2V0IHVybCgpIHtcbiAgICBpZiAoIXRoaXMuX3VybCkgdGhpcy5fY3JlYXRlKCk7XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuXG4gIHJlbGVhc2UoKSB7XG4gICAgaWYgKCF0aGlzLl91cmwpIHJldHVybjtcblxuICAgIHRoaXMuX2Jsb2IgPSBudWxsO1xuICAgIFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy5fdXJsKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgZG9tUmVhZHksIHN0clRvRWwgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgUGFuWm9vbSBmcm9tICcuL3Bhbi16b29tJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3ZnT3V0cHV0IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb250YWluZXIgPSBzdHJUb0VsKFxuICAgICAgJzxkaXYgY2xhc3M9XCJzdmctb3V0cHV0XCI+JyArXG4gICAgICAgICc8ZGl2IGNsYXNzPVwic3ZnLWNvbnRhaW5lclwiPicgK1xuICAgICAgICAgICc8aWZyYW1lIGNsYXNzPVwic3ZnLWZyYW1lXCIgc2FuZGJveD1cImFsbG93LXNjcmlwdHNcIj48L2lmcmFtZT4nICtcbiAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAvLyBTdG9wIHRvdWNoZXMgZ29pbmcgaW50byB0aGUgaWZyYW1lLlxuICAgICAgICAvLyBwb2ludGVyLWV2ZW50cyArIHRvdWNoICsgaWZyYW1lIGRvZXNuJ3Qgd29yayBpbiBDaHJvbWUgOihcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJzdmctY2xpY2tqYWNrZXJcIj48L2Rpdj4nICtcbiAgICAgICc8L2Rpdj4nICtcbiAgICAnJyk7XG5cblxuICAgIHRoaXMuX3N2Z0ZyYW1lID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcignLnN2Zy1mcmFtZScpO1xuICAgIHRoaXMuX3N2Z0ZyYW1lLnNjcm9sbGluZyA9ICdubyc7XG5cbiAgICB0aGlzLl9zdmdDb250YWluZXIgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuc3ZnLWNvbnRhaW5lcicpO1xuXG4gICAgZG9tUmVhZHkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLl9wYW5ab29tID0gbmV3IFBhblpvb20odGhpcy5fc3ZnQ29udGFpbmVyLCB7XG4gICAgICAgIGV2ZW50QXJlYTogdGhpcy5jb250YWluZXJcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0U3ZnKHN2Z0ZpbGUpIHtcbiAgICAvLyBJIHdvdWxkIHJhdGhlciB1c2UgYmxvYiB1cmxzLCBidXQgdGhleSBkb24ndCB3b3JrIGluIEZpcmVmb3hcbiAgICAvLyBBbGwgdGhlIGludGVybmFsIHJlZnMgYnJlYWsuXG4gICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTEyNTY2N1xuICAgIGNvbnN0IG5leHRMb2FkID0gdGhpcy5fbmV4dExvYWRQcm9taXNlKCk7XG4gICAgdGhpcy5fc3ZnRnJhbWUuc3JjID0gXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCxcIiArIGVuY29kZVVSSUNvbXBvbmVudChzdmdGaWxlLnRleHQpO1xuICAgIHRoaXMuX3N2Z0ZyYW1lLndpZHRoID0gc3ZnRmlsZS53aWR0aDtcbiAgICB0aGlzLl9zdmdGcmFtZS5oZWlnaHQgPSBzdmdGaWxlLmhlaWdodDtcbiAgICByZXR1cm4gbmV4dExvYWQ7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLl9zdmdGcmFtZS5zcmMgPSBcImFib3V0OmJsYW5rXCI7XG4gICAgdGhpcy5fcGFuWm9vbS5yZXNldCgpO1xuICB9XG5cbiAgX25leHRMb2FkUHJvbWlzZSgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBjb25zdCBvbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX3N2Z0ZyYW1lLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbmxvYWQpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdmdGcmFtZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgb25sb2FkKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgc3RyVG9FbCB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCBQcmlzbSBmcm9tICcuLi9wcmlzbSc7XG5jb25zdCBwcmlzbSA9IG5ldyBQcmlzbSgpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2RlT3V0cHV0IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb250YWluZXIgPSBzdHJUb0VsKFxuICAgICAgJzxkaXYgY2xhc3M9XCJjb2RlLW91dHB1dFwiPicgK1xuICAgICAgICAnPHByZT48Y29kZT48L2NvZGU+PC9wcmU+JyArXG4gICAgICAnPC9kaXY+JyArXG4gICAgJycpO1xuICAgIHRoaXMuX2NvZGVFbCA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2NvZGUnKTtcbiAgfVxuXG4gIGFzeW5jIHNldFN2ZyhzdmdGaWxlKSB7XG4gICAgdGhpcy5fY29kZUVsLmlubmVySFRNTCA9IGF3YWl0IHByaXNtLmhpZ2hsaWdodChzdmdGaWxlLnRleHQpO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5fY29kZUVsLmlubmVySFRNTCA9ICcnO1xuICB9XG59XG4iLCJpbXBvcnQgV29ya2VyTWVzc2VuZ2VyIGZyb20gJy4vd29ya2VyLW1lc3Nlbmdlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByaXNtIGV4dGVuZHMgV29ya2VyTWVzc2VuZ2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ2pzL3ByaXNtLXdvcmtlci5qcycpO1xuICB9XG5cbiAgaGlnaGxpZ2h0KHN2Z0RhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgIGRhdGE6IHN2Z0RhdGFcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgc3RyVG9FbCwgdHJhbnNpdGlvblRvQ2xhc3MsIHRyYW5zaXRpb25Gcm9tQ2xhc3MgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgU3ZnT3V0cHV0IGZyb20gJy4vc3ZnLW91dHB1dCc7XG5pbXBvcnQgQ29kZU91dHB1dCBmcm9tICcuL2NvZGUtb3V0cHV0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT3V0cHV0IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb250YWluZXIgPSBzdHJUb0VsKFxuICAgICAgJzxkaXYgY2xhc3M9XCJvdXRwdXQtc3dpdGNoZXJcIj48L2Rpdj4nICtcbiAgICAnJyk7XG5cbiAgICB0aGlzLl90eXBlcyA9IHtcbiAgICAgIGltYWdlOiBuZXcgU3ZnT3V0cHV0KCksXG4gICAgICBjb2RlOiBuZXcgQ29kZU91dHB1dCgpXG4gICAgfTtcblxuICAgIHRoaXMuX3N2Z0ZpbGUgPSBudWxsO1xuICAgIHRoaXMuX3N3aXRjaFF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgdGhpcy5zZXQoJ2ltYWdlJywge25vQW5pbWF0ZTogdHJ1ZX0pO1xuICB9XG5cbiAgdXBkYXRlKHN2Z0ZpbGUpIHtcbiAgICB0aGlzLl9zdmdGaWxlID0gc3ZnRmlsZTtcbiAgICByZXR1cm4gdGhpcy5fdHlwZXNbdGhpcy5fYWN0aXZlVHlwZV0uc2V0U3ZnKHN2Z0ZpbGUpO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5fdHlwZXNbdGhpcy5fYWN0aXZlVHlwZV0ucmVzZXQoKTtcbiAgfVxuXG4gIHNldCh0eXBlLCB7XG4gICAgbm9BbmltYXRlID0gZmFsc2VcbiAgfT17fSkge1xuICAgIHJldHVybiB0aGlzLl9zd2l0Y2hRdWV1ZSA9IHRoaXMuX3N3aXRjaFF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdG9SZW1vdmUgPSB0aGlzLl9hY3RpdmVUeXBlICYmIHRoaXMuX3R5cGVzW3RoaXMuX2FjdGl2ZVR5cGVdLmNvbnRhaW5lcjtcblxuICAgICAgdGhpcy5fYWN0aXZlVHlwZSA9IHR5cGU7XG4gICAgICBjb25zdCB0b0FkZCA9IHRoaXMuX3R5cGVzW3RoaXMuX2FjdGl2ZVR5cGVdLmNvbnRhaW5lcjtcbiAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRvQWRkKTtcblxuICAgICAgaWYgKHRoaXMuX3N2Z0ZpbGUpIGF3YWl0IHRoaXMudXBkYXRlKHRoaXMuX3N2Z0ZpbGUpO1xuXG4gICAgICBpZiAobm9BbmltYXRlKSB7XG4gICAgICAgIHRvQWRkLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgICBpZiAodG9SZW1vdmUpIHRvUmVtb3ZlLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHRyYW5zaXRpb25zID0gW1xuICAgICAgICAgIHRyYW5zaXRpb25Ub0NsYXNzKHRvQWRkKVxuICAgICAgICBdO1xuXG4gICAgICAgIGlmICh0b1JlbW92ZSkgdHJhbnNpdGlvbnMucHVzaCh0cmFuc2l0aW9uRnJvbUNsYXNzKHRvUmVtb3ZlKSk7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodHJhbnNpdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9SZW1vdmUpIHRoaXMuY29udGFpbmVyLnJlbW92ZUNoaWxkKHRvUmVtb3ZlKTtcbiAgICB9KVxuICB9XG59XG4iLCJpbXBvcnQgeyBzdHJUb0VsIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSaXBwbGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lciA9IHN0clRvRWwoJzxkaXYgY2xhc3M9XCJyaXBwbGVcIj48L2Rpdj4nKTtcbiAgfVxuXG4gIGFuaW1hdGUoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnYW5pbWF0ZScpO1xuICAgIHRoaXMuY29udGFpbmVyLm9mZnNldExlZnQ7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCgnYW5pbWF0ZScpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBzdHJUb0VsIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTcGlubmVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb250YWluZXIgPSBzdHJUb0VsKFxuICAgICAgJzxkaXYgY2xhc3M9XCJzcGlubmVyXCI+JyArXG4gICAgICAgICc8ZGl2IGNsYXNzPVwic3Bpbm5lci1jb250YWluZXJcIj4nICtcbiAgICAgICAgICAnPGRpdiBjbGFzcz1cInNwaW5uZXItbGF5ZXJcIj4nICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwiY2lyY2xlLWNsaXBwZXIgbGVmdFwiPicgK1xuICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cImNpcmNsZVwiPjwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJnYXAtcGF0Y2hcIj4nICtcbiAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJjaXJjbGVcIj48L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwiY2lyY2xlLWNsaXBwZXIgcmlnaHRcIj4nICtcbiAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJjaXJjbGVcIj48L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICc8L2Rpdj4nICtcbiAgICAgICc8L2Rpdj4nICtcbiAgICAnJyk7XG5cbiAgICB0aGlzLl9zaG93VGltZW91dCA9IG51bGw7XG4gICAgdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIGNvbnN0IGFuaW1FbmRMaXN0ZW5lciA9IGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudC50YXJnZXQgPT0gdGhpcy5jb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignd2Via2l0QW5pbWF0aW9uRW5kJywgYW5pbUVuZExpc3RlbmVyKTtcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdhbmltYXRpb25lbmQnLCBhbmltRW5kTGlzdGVuZXIpO1xuICB9XG5cbiAgc2hvdyhkZWxheSA9IDMwMCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9zaG93VGltZW91dCk7XG4gICAgdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdjb29sZG93bicpO1xuICAgIHRoaXMuX3Nob3dUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgfSwgZGVsYXkpO1xuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fc2hvd1RpbWVvdXQpO1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2Nvb2xkb3duJyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHN0clRvRWwgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgUmlwcGxlIGZyb20gJy4vcmlwcGxlJztcbmltcG9ydCBTcGlubmVyIGZyb20gJy4vc3Bpbm5lcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZsb2F0aW5nQWN0aW9uQnV0dG9uIHtcbiAgY29uc3RydWN0b3IoeyB0aXRsZSwgaHJlZiwgaWNvblN2ZywgY2xhc3NMaXN0LCBtaW5vciB9KSB7XG4gICAgdGhpcy5jb250YWluZXIgPSBzdHJUb0VsKFxuICAgICAgKGhyZWYgPyAnPGE+JyA6ICc8ZGl2IHJvbGU9XCJidXR0b25cIiB0YWJpbmRleD1cIjBcIj4nKSArXG4gICAgICAgIGljb25TdmcgK1xuICAgICAgKGhyZWYgPyAnPC9hPicgOiAnPC9kaXY+JykgK1xuICAgICcnKTtcblxuICAgIGlmIChocmVmKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5ocmVmID0gaHJlZjtcbiAgICB9XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGl0bGUpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKG1pbm9yID8gJ21pbm9yLWZsb2F0aW5nLWFjdGlvbi1idXR0b24nIDogJ2Zsb2F0aW5nLWFjdGlvbi1idXR0b24nKTtcbiAgICBpZiAoY2xhc3NMaXN0KSB7XG4gICAgICBjbGFzc0xpc3QuZm9yRWFjaCgoY2xhc3NOYW1lKSA9PiB7IHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTsgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmlwcGxlID0gbmV3IFJpcHBsZSgpO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX3JpcHBsZS5jb250YWluZXIpO1xuXG4gICAgdGhpcy5fc3Bpbm5lciA9IG5ldyBTcGlubmVyKCk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fc3Bpbm5lci5jb250YWluZXIpO1xuXG4gICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB0aGlzLl9vbkNsaWNrKGV2ZW50KSk7XG4gIH1cblxuICBfb25DbGljayhldmVudCkge1xuICAgIHRoaXMuX3JpcHBsZS5hbmltYXRlKCk7XG4gIH1cblxuICB3b3JraW5nKCkge1xuICAgIHRoaXMuX3NwaW5uZXIuc2hvdyg1MDApO1xuICB9XG5cbiAgZG9uZSgpIHtcbiAgICB0aGlzLl9zcGlubmVyLmhpZGUoKTtcbiAgfVxufVxuIiwiaW1wb3J0IEZsb2F0aW5nQWN0aW9uQnV0dG9uIGZyb20gJy4vZmxvYXRpbmctYWN0aW9uLWJ1dHRvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvd25sb2FkQnV0dG9uIGV4dGVuZHMgRmxvYXRpbmdBY3Rpb25CdXR0b24ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCB0aXRsZSA9ICdEb3dubG9hZCc7XG5cbiAgICBzdXBlcih7XG4gICAgICB0aXRsZSxcbiAgICAgIGhyZWY6ICcuLycsXG4gICAgICBpY29uU3ZnOiAoXG4gICAgICAgICc8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBjbGFzcz1cImljb25cIj4nICtcbiAgICAgICAgICBgPHRpdGxlPiR7dGl0bGV9PC90aXRsZT5gICtcbiAgICAgICAgICAnPHBhdGggZD1cIk0xOSA5aC00VjNIOXY2SDVsNyA3IDctN3pNNSAxOHYyaDE0di0ySDV6XCIvPicgK1xuICAgICAgICAnPC9zdmc+J1xuICAgICAgKVxuICAgIH0pO1xuXG4gICAgdGhpcy5fc3ZnRmlsZSA9IG51bGw7XG4gIH1cblxuICBfb25DbGljayhldmVudCkge1xuICAgIHN1cGVyLl9vbkNsaWNrKGV2ZW50KTtcblxuICAgIC8vIElFIGNvbXBhdFxuICAgIGlmICgnbXNTYXZlQmxvYicgaW4gbmF2aWdhdG9yKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgbmF2aWdhdG9yLm1zU2F2ZUJsb2IodGhpcy5fc3ZnRmlsZS5ibG9iLCB0aGlzLl9zdmdGaWxlLmZpbGVuYW1lKTtcbiAgICB9XG4gIH1cblxuICBzZXREb3dubG9hZChmaWxlbmFtZSwgc3ZnRmlsZSkge1xuICAgIHRoaXMuY29udGFpbmVyLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgdGhpcy5jb250YWluZXIuaHJlZiA9IHN2Z0ZpbGUudXJsO1xuXG4gICAgLy8gZm9yIElFIGNvbXBhdFxuICAgIHRoaXMuX3N2Z0ZpbGUgPSBzdmdGaWxlO1xuICB9XG59XG4iLCJpbXBvcnQgRmxvYXRpbmdBY3Rpb25CdXR0b24gZnJvbSAnLi9mbG9hdGluZy1hY3Rpb24tYnV0dG9uJztcblxuZXhwb3J0IGNvbnN0IGNvcHlTdXBwb3J0ZWQgPSAoZG9jdW1lbnQucXVlcnlDb21tYW5kU3VwcG9ydGVkICYmIGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZCgnY29weScpKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29weUJ1dHRvbiBleHRlbmRzIEZsb2F0aW5nQWN0aW9uQnV0dG9uIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3QgdGl0bGUgPSAnQ29weSBhcyB0ZXh0JztcblxuICAgIHN1cGVyKHtcbiAgICAgIHRpdGxlLFxuICAgICAgaWNvblN2ZzogKFxuICAgICAgICAnPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgY2xhc3M9XCJpY29uXCI+JyArXG4gICAgICAgICAgYDx0aXRsZT4ke3RpdGxlfTwvdGl0bGU+YCArXG4gICAgICAgICAgJzxwYXRoIGQ9XCJNMTYgMUg0QzMgMSAyIDIgMiAzdjE0aDJWM2gxMlYxem0zIDRIOEM3IDUgNiA2IDYgN3YxNGMwIDEgMSAyIDIgMmgxMWMxIDAgMi0xIDItMlY3YzAtMS0xLTItMi0yem0wIDE2SDhWN2gxMXYxNHpcIi8+JyArXG4gICAgICAgICc8L3N2Zz4nXG4gICAgICApLFxuICAgICAgbWlub3I6IHRydWVcbiAgICB9KTtcblxuICAgIHRoaXMuX3RleHQgPSBudWxsO1xuICAgIHRoaXMuX3ByZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ByZScpO1xuICB9XG5cbiAgX29uQ2xpY2soZXZlbnQpIHtcbiAgICBzdXBlci5fb25DbGljayhldmVudCk7XG4gICAgdGhpcy5fcHJlLnRleHRDb250ZW50ID0gdGhpcy5fdGV4dDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX3ByZSk7XG4gICAgZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XG5cbiAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2VsZWN0Tm9kZSh0aGlzLl9wcmUpO1xuXG4gICAgd2luZG93LmdldFNlbGVjdGlvbigpLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG4gICAgZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLl9wcmUpO1xuICB9XG5cbiAgc2V0Q29weVRleHQodGV4dCwgZmlsZW5hbWUpIHtcbiAgICB0aGlzLl90ZXh0ID0gdGV4dDtcbiAgfVxufVxuIiwiaW1wb3J0IEZsb2F0aW5nQWN0aW9uQnV0dG9uIGZyb20gJy4vZmxvYXRpbmctYWN0aW9uLWJ1dHRvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJnRmlsbEJ1dHRvbiBleHRlbmRzIEZsb2F0aW5nQWN0aW9uQnV0dG9uIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3QgdGl0bGUgPSAnUHJldmlldyBvbiB2aXZpZCBiYWNrZ3JvdW5kJztcblxuICAgIHN1cGVyKHtcbiAgICAgIHRpdGxlLFxuICAgICAgaWNvblN2ZzogKFxuICAgICAgICAnPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgY2xhc3M9XCJpY29uXCI+JyArXG4gICAgICAgICAgYDx0aXRsZT4ke3RpdGxlfTwvdGl0bGU+YCArXG4gICAgICAgICAgJzxwYXRoIGQ9XCJNMjEuMTQzIDkuNjY3Yy0uNzMzLTEuMzkyLTEuOTE0LTMuMDUtMy42MTctNC43NTMtMi45NzctMi45NzgtNS40NzgtMy45MTQtNi43ODUtMy45MTQtLjQxNCAwLS43MDguMDk0LS44Ni4yNDZsLTEuMzYxIDEuMzZjLTEuODk5LS4yMzYtMy40Mi4xMDYtNC4yOTQuOTgzLS44NzYuODc1LTEuMTY0IDIuMTU5LS43OTIgMy41MjMuNDkyIDEuODA2IDIuMzA1IDQuMDQ5IDUuOTA1IDUuMzc1LjAzOC4zMjMuMTU3LjYzOC40MDUuODg1LjU4OC41ODggMS41MzUuNTg2IDIuMTIxIDBzLjU4OC0xLjUzMy4wMDItMi4xMTljLS41ODgtLjU4Ny0xLjUzNy0uNTg4LTIuMTIzLS4wMDFsLS4xNy4yNTZjLTIuMDMxLS43NjUtMy4zOTUtMS44MjgtNC4yMzItMi45bDMuODc5LTMuODc1Yy40OTYgMi43MyA2LjQzMiA4LjY3NiA5LjE3OCA5LjE3OGwtNy4xMTUgNy4xMDdjLS4yMzQuMTUzLTIuNzk4LS4zMTYtNi4xNTYtMy42NzUtMy4zOTMtMy4zOTMtMy4xNzUtNS4yNzEtMy4wMjctNS40OThsMS44NTktMS44NTZjLS40MzktLjM1OS0uOTI1LTEuMTAzLTEuMTQxLTEuNjg5bC0yLjEzNCAyLjEzMWMtLjQ0NS40NDYtLjY4NSAxLjA2NC0uNjg1IDEuODIgMCAxLjYzNCAxLjEyMSAzLjkxNSAzLjcxMyA2LjUwNiAyLjc2NCAyLjc2NCA1LjU4IDQuMjQzIDcuNDMyIDQuMjQzLjY0OCAwIDEuMTgtLjE5NSAxLjU0Ny0uNTYybDguMDg2LTguMDc4Yy45MS44NzQtLjc3OCAzLjUzOC0uNzc4IDQuNjQ4IDAgMS4xMDQuODk2IDEuOTk5IDIgMS45OTkgMS4xMDUgMCAyLS44OTYgMi0yIDAtMy4xODQtMS40MjUtNi44MS0yLjg1Ny05LjM0em0tMTYuMjA5LTUuMzcxYy41MjctLjUzIDEuNDcxLS43OTEgMi42NTYtLjc2MWwtMy4yMDkgMy4yMDZjLS4yMzYtLjk3OC0uMDQ5LTEuODQ1LjU1My0yLjQ0NXptOS4yOTIgNC4wNzlsLS4wMy0uMDI5Yy0xLjI5Mi0xLjI5Mi0zLjgwMy00LjM1Ni0zLjA5Ni01LjA2My43MTUtLjcxNSAzLjQ4OCAxLjUyMSA1LjA2MiAzLjA5Ni44NjIuODYyIDIuMDg4IDIuMjQ3IDIuOTM3IDMuNDU4LTEuNzE3LTEuMDc0LTMuNDkxLTEuNDY5LTQuODczLTEuNDYyelwiLz4nICtcbiAgICAgICAgJzwvc3ZnPidcbiAgICAgICksXG4gICAgICBjbGFzc0xpc3Q6IFsgJ2ZpbGxBQicgXSxcbiAgICAgIG1pbm9yOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBfb25DbGljayhldmVudCkge1xuICAgIHN1cGVyLl9vbkNsaWNrKGV2ZW50KTtcbiAgICAvLyBldmVudCBhZGRzIGEgYmFja2dyb3VuZCBjb2xvclxuICAgIGlmICh0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIHRoaXMuc2V0Q29sb3IoJ3RyYW5zcGFyZW50Jyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICB0aGlzLnNldENvbG9yKCdyZ2JhKDAsIDAsIDAsIDAuNyknKTtcbiAgICB9XG4gIH1cblxuICBzZXRDb2xvcihjb2xvcikge1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgc3RyVG9FbCB9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWF0ZXJpYWxTbGlkZXIge1xuICBjb25zdHJ1Y3RvcihyYW5nZUVsKSB7XG4gICAgdGhpcy5jb250YWluZXIgPSBzdHJUb0VsKGBcbiAgICAgIDxkaXYgY2xhc3M9XCJtYXRlcmlhbC1zbGlkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRyYWNrXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRyYWNrLW9uXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhhbmRsZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYCk7XG5cbiAgICB0aGlzLnJhbmdlID0gcmFuZ2VFbDtcbiAgICB0aGlzLl9oYW5kbGUgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuaGFuZGxlJyk7XG4gICAgdGhpcy5fdHJhY2tPbiA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy50cmFjay1vbicpO1xuICAgIHRoaXMuX3ZhbCA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy52YWwnKTtcblxuICAgIHJhbmdlRWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5jb250YWluZXIsIHJhbmdlRWwpO1xuICAgIHRoaXMuY29udGFpbmVyLmluc2VydEJlZm9yZShyYW5nZUVsLCB0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKTtcblxuICAgIHJhbmdlRWwuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB0aGlzLl9vbklucHV0Q2hhbmdlKCkpO1xuICAgIHRoaXMucmFuZ2UuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKCkgPT4gdGhpcy5fb25SYW5nZU1vdXNlRG93bigpKTtcbiAgICB0aGlzLnJhbmdlLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCAoKSA9PiB0aGlzLl9vblJhbmdlVG91Y2hTdGFydCgpKTtcbiAgICB0aGlzLnJhbmdlLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgKCkgPT4gdGhpcy5fb25SYW5nZVRvdWNoRW5kKCkpO1xuXG4gICAgdGhpcy5fc2V0UG9zaXRpb24oKTtcbiAgfVxuXG4gIF9vblJhbmdlVG91Y2hTdGFydCgpIHtcbiAgICB0aGlzLnJhbmdlLmZvY3VzKCk7XG4gIH1cblxuICBfb25SYW5nZVRvdWNoRW5kKCkge1xuICAgIHRoaXMucmFuZ2UuYmx1cigpO1xuICB9XG5cbiAgX29uUmFuZ2VNb3VzZURvd24oKSB7XG4gICAgdGhpcy5yYW5nZS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcblxuICAgIGNvbnN0IHVwTGlzdGVuZXIgPSBlID0+IHtcbiAgICAgIC8vIElFIHJlcXVpcmVzIG1lIHRvIGRvIHRoaXMuIFBhaC5cbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShfID0+IHtcbiAgICAgICAgdGhpcy5yYW5nZS5ibHVyKCk7XG4gICAgICB9KVxuICAgICAgdGhpcy5yYW5nZS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB1cExpc3RlbmVyKTtcbiAgICB9XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHVwTGlzdGVuZXIpO1xuICB9XG5cbiAgc2V0IHZhbHVlKG5ld1ZhbCkge1xuICAgIHRoaXMucmFuZ2UudmFsdWUgPSBuZXdWYWw7XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gIH1cblxuICBfb25JbnB1dENoYW5nZSgpIHtcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgfVxuXG4gIF91cGRhdGUoKSB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuX3NldFBvc2l0aW9uKCkpO1xuICB9XG5cbiAgX3NldFBvc2l0aW9uKCkge1xuICAgIGNvbnN0IHsgbWluLCBtYXgsIHZhbHVlIH0gPSB0aGlzLnJhbmdlO1xuICAgIGNvbnN0IHBlcmNlbnQgPSAoTnVtYmVyKHZhbHVlKSAtIG1pbikgLyAobWF4IC0gbWluKTtcblxuICAgIHRoaXMuX3RyYWNrT24uc3R5bGUud2lkdGggPVxuICAgICAgdGhpcy5faGFuZGxlLnN0eWxlLmxlZnQgPSBwZXJjZW50ICogMTAwICsgXCIlXCI7XG5cbiAgICB0aGlzLl92YWwudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcblxuaW1wb3J0IHsgZG9tUmVhZHkgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgTWF0ZXJpYWxTbGlkZXIgZnJvbSAnLi9tYXRlcmlhbC1zbGlkZXInO1xuaW1wb3J0IFJpcHBsZSBmcm9tICcuL3JpcHBsZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNldHRpbmdzIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX3Rocm90dGxlVGltZW91dCA9IG51bGw7XG5cbiAgICBkb21SZWFkeS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuX3BsdWdpbklucHV0cyA9IEFycmF5LmZyb20oXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZXR0aW5ncyAucGx1Z2lucyBpbnB1dCcpXG4gICAgICApO1xuICAgICAgdGhpcy5fZ2xvYmFsSW5wdXRzID0gQXJyYXkuZnJvbShcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNldHRpbmdzIC5nbG9iYWwgaW5wdXQnKVxuICAgICAgKTtcblxuICAgICAgdGhpcy5fcmVzZXRSaXBwbGUgPSBuZXcgUmlwcGxlKCk7XG4gICAgICB0aGlzLl9yZXNldEJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZXR0aW5nLXJlc2V0Jyk7XG4gICAgICB0aGlzLl9yZXNldEJ0bi5hcHBlbmRDaGlsZCh0aGlzLl9yZXNldFJpcHBsZS5jb250YWluZXIpO1xuXG4gICAgICAvLyBtYXAgcmVhbCByYW5nZSBlbGVtZW50cyB0byBTbGlkZXIgaW5zdGFuY2VzXG4gICAgICB0aGlzLl9zbGlkZXJNYXAgPSBuZXcgV2Vha01hcCgpO1xuXG4gICAgICAvLyBlbmhhbmNlIHJhbmdlc1xuICAgICAgQXJyYXkuZnJvbShcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNldHRpbmdzIGlucHV0W3R5cGU9cmFuZ2VdJylcbiAgICAgICkuZm9yRWFjaChlbCA9PiB0aGlzLl9zbGlkZXJNYXAuc2V0KGVsLCBuZXcgTWF0ZXJpYWxTbGlkZXIoZWwpKSk7XG5cbiAgICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNldHRpbmdzJyk7XG4gICAgICB0aGlzLl9zY3JvbGxlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZXR0aW5ncy1zY3JvbGxlcicpO1xuXG4gICAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBlID0+IHRoaXMuX29uQ2hhbmdlKGUpKTtcbiAgICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZSA9PiB0aGlzLl9vbkNoYW5nZShlKSk7XG4gICAgICB0aGlzLl9zY3JvbGxlci5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIGUgPT4gdGhpcy5fb25Nb3VzZVdoZWVsKGUpKTtcbiAgICAgIHRoaXMuX3Jlc2V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB0aGlzLl9vblJlc2V0KGUpKTtcblxuICAgICAgLy8gU3RvcCBkb3VibGUtdGFwIHRleHQgc2VsZWN0aW9uLlxuICAgICAgLy8gVGhpcyBzdG9wcyBhbGwgdGV4dCBzZWxlY3Rpb24gd2hpY2ggaXMga2luZGEgc2FkLlxuICAgICAgLy8gSSB0aGluayB0aGlzIGNvZGUgd2lsbCBiaXRlIG1lLlxuICAgICAgdGhpcy5fc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZSA9PiB7XG4gICAgICAgIGlmIChlLnRhcmdldC5jbG9zZXN0KCdpbnB1dFt0eXBlPXJhbmdlXScpKSByZXR1cm47XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgX29uTW91c2VXaGVlbChldmVudCkge1xuICAgIC8vIFByZXZlbnRzIGJvdW5jZSBlZmZlY3Qgb24gZGVza3RvcC5cbiAgICAvLyBGaXJlZm94IHVzZXMgREVMVEFfTElORSBvbiBhIG1vdXNlIHdoZWVsLCBpZ25vcmUgaXRcbiAgICBpZiAoIWV2ZW50LmRlbHRhTW9kZSkgeyAvLyAwIGlzIFwicGl4ZWxzXCJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5jdXJyZW50VGFyZ2V0LnNjcm9sbFRvcCArPSBldmVudC5kZWx0YVk7XG4gICAgfVxuICB9XG5cbiAgX29uQ2hhbmdlKGV2ZW50KSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Rocm90dGxlVGltZW91dCk7XG5cbiAgICAvLyB0aHJvdHRsZSByYW5nZVxuICAgIGlmIChldmVudC50YXJnZXQudHlwZSA9PSAncmFuZ2UnKSB7XG4gICAgICB0aGlzLl90aHJvdHRsZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZW1pdCgnY2hhbmdlJyksIDE1MCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnKTtcbiAgICB9XG4gIH1cblxuICBfb25SZXNldCgpIHtcbiAgICB0aGlzLl9yZXNldFJpcHBsZS5hbmltYXRlKCk7XG4gICAgY29uc3Qgb2xkU2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKCk7XG4gICAgLy8gU2V0IGFsbCBpbnB1dHMgYWNjb3JkaW5nIHRvIHRoZWlyIGluaXRpYWwgYXR0cmlidXRlc1xuICAgIGZvciAoY29uc3QgaW5wdXRFbCBvZiB0aGlzLl9nbG9iYWxJbnB1dHMpIHtcbiAgICAgIGlmIChpbnB1dEVsLnR5cGUgPT0gJ2NoZWNrYm94Jykge1xuICAgICAgICBpbnB1dEVsLmNoZWNrZWQgPSBpbnB1dEVsLmhhc0F0dHJpYnV0ZSgnY2hlY2tlZCcpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaW5wdXRFbC50eXBlID09ICdyYW5nZScpIHtcbiAgICAgICAgdGhpcy5fc2xpZGVyTWFwLmdldChpbnB1dEVsKS52YWx1ZSA9IGlucHV0RWwuZ2V0QXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgaW5wdXRFbCBvZiB0aGlzLl9wbHVnaW5JbnB1dHMpIHtcbiAgICAgIGlucHV0RWwuY2hlY2tlZCA9IGlucHV0RWwuaGFzQXR0cmlidXRlKCdjaGVja2VkJyk7XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0KCdyZXNldCcsIG9sZFNldHRpbmdzKTtcbiAgICB0aGlzLmVtaXQoJ2NoYW5nZScpO1xuICB9XG5cbiAgc2V0U2V0dGluZ3Moc2V0dGluZ3MpIHtcbiAgICBmb3IgKGNvbnN0IGlucHV0RWwgb2YgdGhpcy5fZ2xvYmFsSW5wdXRzKSB7XG4gICAgICBpZiAoIShpbnB1dEVsLm5hbWUgaW4gc2V0dGluZ3MpKSBjb250aW51ZTtcblxuICAgICAgaWYgKGlucHV0RWwudHlwZSA9PSAnY2hlY2tib3gnKSB7XG4gICAgICAgIGlucHV0RWwuY2hlY2tlZCA9IHNldHRpbmdzW2lucHV0RWwubmFtZV07XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChpbnB1dEVsLnR5cGUgPT0gJ3JhbmdlJykge1xuICAgICAgICB0aGlzLl9zbGlkZXJNYXAuZ2V0KGlucHV0RWwpLnZhbHVlID0gc2V0dGluZ3NbaW5wdXRFbC5uYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGlucHV0RWwgb2YgdGhpcy5fcGx1Z2luSW5wdXRzKSB7XG4gICAgICBpZiAoIShpbnB1dEVsLm5hbWUgaW4gc2V0dGluZ3MucGx1Z2lucykpIGNvbnRpbnVlO1xuICAgICAgaW5wdXRFbC5jaGVja2VkID0gc2V0dGluZ3MucGx1Z2luc1tpbnB1dEVsLm5hbWVdO1xuICAgIH1cbiAgfVxuXG4gIGdldFNldHRpbmdzKCkge1xuICAgIC8vIGZpbmdlcnByaW50IGlzIHVzZWQgZm9yIGNhY2hlIGxvb2t1cHNcbiAgICBjb25zdCBmaW5nZXJwcmludCA9IFtdO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgcGx1Z2luczoge31cbiAgICB9O1xuXG4gICAgdGhpcy5fZ2xvYmFsSW5wdXRzLmZvckVhY2goaW5wdXRFbCA9PiB7XG4gICAgICBpZiAoaW5wdXRFbC5uYW1lICE9ICdnemlwJyAmJiBpbnB1dEVsLm5hbWUgIT0gJ29yaWdpbmFsJykge1xuICAgICAgICBpZiAoaW5wdXRFbC50eXBlID09ICdjaGVja2JveCcpIHtcbiAgICAgICAgICBmaW5nZXJwcmludC5wdXNoKE51bWJlcihpbnB1dEVsLmNoZWNrZWQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBmaW5nZXJwcmludC5wdXNoKCd8JyArIGlucHV0RWwudmFsdWUgKyAnfCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnB1dEVsLnR5cGUgPT0gJ2NoZWNrYm94Jykge1xuICAgICAgICBvdXRwdXRbaW5wdXRFbC5uYW1lXSA9IGlucHV0RWwuY2hlY2tlZDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBvdXRwdXRbaW5wdXRFbC5uYW1lXSA9IGlucHV0RWwudmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9wbHVnaW5JbnB1dHMuZm9yRWFjaChpbnB1dEVsID0+IHtcbiAgICAgIGZpbmdlcnByaW50LnB1c2goTnVtYmVyKGlucHV0RWwuY2hlY2tlZCkpO1xuICAgICAgb3V0cHV0LnBsdWdpbnNbaW5wdXRFbC5uYW1lXSA9IGlucHV0RWwuY2hlY2tlZDtcbiAgICB9KTtcblxuICAgIG91dHB1dC5maW5nZXJwcmludCA9IGZpbmdlcnByaW50LmpvaW4oKTtcblxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIGRvbVJlYWR5LFxuICB0cmFuc2l0aW9uRnJvbUNsYXNzLFxuICB0cmFuc2l0aW9uVG9DbGFzcyxcbiAgcmVhZEZpbGVBc1RleHRcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IFNwaW5uZXIgZnJvbSAnLi9zcGlubmVyJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1haW5NZW51IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuYWxsb3dIaWRlID0gZmFsc2U7XG4gICAgdGhpcy5fc3Bpbm5lciA9IG5ldyBTcGlubmVyKCk7XG5cbiAgICBkb21SZWFkeS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1haW4tbWVudScpO1xuICAgICAgdGhpcy5fbG9hZEZpbGVJbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5sb2FkLWZpbGUtaW5wdXQnKTtcbiAgICAgIHRoaXMuX3Bhc3RlSW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGFzdGUtaW5wdXQnKTtcbiAgICAgIHRoaXMuX2xvYWREZW1vQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxvYWQtZGVtbycpO1xuICAgICAgdGhpcy5fbG9hZEZpbGVCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubG9hZC1maWxlJyk7XG4gICAgICB0aGlzLl9wYXN0ZUxhYmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lbnUtaW5wdXQnKTtcbiAgICAgIHRoaXMuX292ZXJsYXkgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcub3ZlcmxheScpO1xuICAgICAgdGhpcy5fbWVudSA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5tZW51Jyk7XG5cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZW51LWJ0bicpXG4gICAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4gdGhpcy5fb25NZW51QnV0dG9uQ2xpY2soZSkpO1xuXG4gICAgICB0aGlzLl9vdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB0aGlzLl9vbk92ZXJsYXlDbGljayhlKSk7XG5cbiAgICAgIHRoaXMuX2xvYWRGaWxlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB0aGlzLl9vbkxvYWRGaWxlQ2xpY2soZSkpO1xuICAgICAgdGhpcy5fbG9hZERlbW9CdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHRoaXMuX29uTG9hZERlbW9DbGljayhlKSk7XG4gICAgICB0aGlzLl9sb2FkRmlsZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGUgPT4gdGhpcy5fb25GaWxlSW5wdXRDaGFuZ2UoZSkpO1xuICAgICAgdGhpcy5fcGFzdGVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGUgPT4gdGhpcy5fb25UZXh0SW5wdXRDaGFuZ2UoZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgc2hvdygpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICB0cmFuc2l0aW9uRnJvbUNsYXNzKHRoaXMuX292ZXJsYXksICdoaWRkZW4nKTtcbiAgICB0cmFuc2l0aW9uRnJvbUNsYXNzKHRoaXMuX21lbnUsICdoaWRkZW4nKTtcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLmFsbG93SGlkZSkgcmV0dXJuO1xuICAgIHRoaXMuc3RvcFNwaW5uZXIoKTtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICB0cmFuc2l0aW9uVG9DbGFzcyh0aGlzLl9vdmVybGF5LCAnaGlkZGVuJyk7XG4gICAgdHJhbnNpdGlvblRvQ2xhc3ModGhpcy5fbWVudSwgJ2hpZGRlbicpO1xuICB9XG5cbiAgc3RvcFNwaW5uZXIoKSB7XG4gICAgdGhpcy5fc3Bpbm5lci5oaWRlKCk7XG4gIH1cblxuICBzaG93RmlsZVBpY2tlcigpIHtcbiAgICB0aGlzLl9sb2FkRmlsZUlucHV0LmNsaWNrKCk7XG4gIH1cblxuICBfb25PdmVybGF5Q2xpY2soZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuaGlkZSgpO1xuICB9XG5cbiAgX29uTWVudUJ1dHRvbkNsaWNrKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnNob3coKTtcbiAgfVxuXG4gIF9vblRleHRJbnB1dENoYW5nZShldmVudCkge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuX3Bhc3RlSW5wdXQudmFsdWUudHJpbSgpO1xuXG4gICAgaWYgKHZhbC5pbmNsdWRlcygnPC9zdmc+JykpIHtcbiAgICAgIHRoaXMuX3Bhc3RlSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHRoaXMuX3Bhc3RlSW5wdXQuYmx1cigpO1xuXG4gICAgICB0aGlzLl9wYXN0ZUxhYmVsLmFwcGVuZENoaWxkKHRoaXMuX3NwaW5uZXIuY29udGFpbmVyKTtcbiAgICAgIHRoaXMuX3NwaW5uZXIuc2hvdygpO1xuXG4gICAgICB0aGlzLmVtaXQoJ3N2Z0RhdGFMb2FkJywge1xuICAgICAgICBkYXRhOiB2YWwsXG4gICAgICAgIGZpbGVuYW1lOiAnaW1hZ2Uuc3ZnJ1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgX29uTG9hZEZpbGVDbGljayhldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQudGFyZ2V0LmJsdXIoKTtcbiAgICB0aGlzLnNob3dGaWxlUGlja2VyKCk7XG4gIH1cblxuICBhc3luYyBfb25GaWxlSW5wdXRDaGFuZ2UoZXZlbnQpIHtcbiAgICBjb25zdCBmaWxlID0gdGhpcy5fbG9hZEZpbGVJbnB1dC5maWxlc1swXTtcblxuICAgIGlmICghZmlsZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fbG9hZEZpbGVCdG4uYXBwZW5kQ2hpbGQodGhpcy5fc3Bpbm5lci5jb250YWluZXIpO1xuICAgIHRoaXMuX3NwaW5uZXIuc2hvdygpO1xuXG4gICAgdGhpcy5lbWl0KCdzdmdEYXRhTG9hZCcsIHtcbiAgICAgIGRhdGE6IGF3YWl0IHJlYWRGaWxlQXNUZXh0KGZpbGUpLFxuICAgICAgZmlsZW5hbWU6IGZpbGUubmFtZVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgX29uTG9hZERlbW9DbGljayhldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQudGFyZ2V0LmJsdXIoKTtcbiAgICB0aGlzLl9sb2FkRGVtb0J0bi5hcHBlbmRDaGlsZCh0aGlzLl9zcGlubmVyLmNvbnRhaW5lcik7XG4gICAgdGhpcy5fc3Bpbm5lci5zaG93KCk7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5lbWl0KCdzdmdEYXRhTG9hZCcsIHtcbiAgICAgICAgZGF0YTogYXdhaXQgZmV0Y2goJ3Rlc3Qtc3Zncy9jYXItbGl0ZS5zdmcnKS50aGVuKHIgPT4gci50ZXh0KCkpLFxuICAgICAgICBmaWxlbmFtZTogJ2Nhci1saXRlLnN2ZydcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhIHNjb3BlIGlzIHdvcmtpbmcgYXJvdW5kIGEgYmFiZWwtbWluaWZ5IGJ1Zy5cbiAgICAgIC8vIEl0J3MgZml4ZWQgaW4gQmFiZWwgNy5cbiAgICAgIHtcbiAgICAgICAgdGhpcy5zdG9wU3Bpbm5lcigpO1xuXG4gICAgICAgIGxldCBlcnJvcjtcblxuICAgICAgICBpZiAoJ3NlcnZpY2VXb3JrZXInIGluIG5hdmlnYXRvciAmJiBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5jb250cm9sbGVyKSB7XG4gICAgICAgICAgZXJyb3IgPSBFcnJvcihcIkRlbW8gbm90IGF2YWlsYWJsZSBvZmZsaW5lXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGVycm9yID0gRXJyb3IoXCJDb3VsZG4ndCBmZXRjaCBkZW1vIFNWR1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCB7IGVycm9yIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgc3RyVG9FbCwgdHJhbnNpdGlvblRvQ2xhc3MgfSBmcm9tICcuLi91dGlscyc7XG5cbmNsYXNzIFRvYXN0IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSwgZHVyYXRpb24sIGJ1dHRvbnMpIHtcbiAgICB0aGlzLmNvbnRhaW5lciA9IHN0clRvRWwoXG4gICAgICAnPGRpdiBjbGFzcz1cInRvYXN0XCI+PGRpdiBjbGFzcz1cInRvYXN0LWNvbnRlbnRcIj48L2Rpdj48L2Rpdj4nICtcbiAgICAnJyk7XG5cbiAgICB0aGlzLl9jb250ZW50ID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcignLnRvYXN0LWNvbnRlbnQnKTtcbiAgICB0aGlzLl9jb250ZW50LnRleHRDb250ZW50ID0gbWVzc2FnZTtcbiAgICB0aGlzLl9hbnN3ZXJSZXNvbHZlO1xuICAgIHRoaXMuX2hpZGVUaW1lb3V0O1xuXG4gICAgdGhpcy5hbnN3ZXIgPSBuZXcgUHJvbWlzZShyID0+IHRoaXMuX2Fuc3dlclJlc29sdmUgPSByKTtcblxuICAgIGJ1dHRvbnMuZm9yRWFjaChidXR0b24gPT4ge1xuICAgICAgdmFyIGJ1dHRvbkVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICBidXR0b25FbC5jbGFzc05hbWUgPSAndW5idXR0b24nO1xuICAgICAgYnV0dG9uRWwudGV4dENvbnRlbnQgPSBidXR0b247XG4gICAgICBidXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgdGhpcy5fYW5zd2VyUmVzb2x2ZShidXR0b24pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChidXR0b25FbCk7XG4gICAgfSk7XG5cbiAgICBpZiAoZHVyYXRpb24pIHtcbiAgICAgIHRoaXMuX2hpZGVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmhpZGUoKSwgZHVyYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2hpZGVUaW1lb3V0KTtcbiAgICB0aGlzLl9hbnN3ZXJSZXNvbHZlKCk7XG4gICAgcmV0dXJuIHRyYW5zaXRpb25Ub0NsYXNzKHRoaXMuY29udGFpbmVyLCAnaGlkZScpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvYXN0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY29udGFpbmVyID0gc3RyVG9FbChcIjxkaXYgY2xhc3M9J3RvYXN0cyc+PC9kaXY+XCIpO1xuICB9XG5cbiAgc2hvdyhtZXNzYWdlLCB7XG4gICAgZHVyYXRpb24gPSAwLFxuICAgIGJ1dHRvbnMgPSBbJ2Rpc21pc3MnXVxuICB9PXt9KSB7XG4gICAgY29uc3QgdG9hc3QgPSBuZXcgVG9hc3QobWVzc2FnZSwgZHVyYXRpb24sIGJ1dHRvbnMpO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRvYXN0LmNvbnRhaW5lcik7XG5cbiAgICB0b2FzdC5hbnN3ZXIudGhlbigoKSA9PiB0b2FzdC5oaWRlKCkpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2hpbGQodG9hc3QuY29udGFpbmVyKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0b2FzdDtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgc3RyVG9FbCxcbiAgZG9tUmVhZHksXG4gIHRyYW5zaXRpb25Ub0NsYXNzLFxuICB0cmFuc2l0aW9uRnJvbUNsYXNzLFxuICByZWFkRmlsZUFzVGV4dFxufSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlRHJvcCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb250YWluZXIgPSBzdHJUb0VsKFxuICAgICAgJzxkaXYgY2xhc3M9XCJkcm9wLW92ZXJsYXlcIj5Ecm9wIGl0ITwvZGl2PicgK1xuICAgICcnKTtcblxuICAgIC8vIGRyYWcgZXZlbnRzIGFyZSBob3JyaWRcbiAgICB0aGlzLl9hY3RpdmVFbnRlcnMgPSAwO1xuICAgIHRoaXMuX2N1cnJlbnRFbnRlcmVkRWxlbWVudCA9IG51bGw7XG5cbiAgICBkb21SZWFkeS50aGVuKF8gPT4ge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCBldmVudCA9PiBldmVudC5wcmV2ZW50RGVmYXVsdCgpKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIGV2ZW50ID0+IHRoaXMuX29uRHJhZ0VudGVyKGV2ZW50KSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCBldmVudCA9PiB0aGlzLl9vbkRyYWdMZWF2ZShldmVudCkpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIGV2ZW50ID0+IHRoaXMuX29uRHJvcChldmVudCkpO1xuICAgIH0pO1xuICB9XG5cbiAgX29uRHJhZ0VudGVyKGV2ZW50KSB7XG4gICAgLy8gZmlyZWZveCBkb3VibGUtZmlyZXMgb24gd2luZG93IGVudGVyLCB0aGlzIHdvcmtzIGFyb3VuZCBpdFxuICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTExMjQ2NDVcbiAgICBpZiAodGhpcy5fY3VycmVudEVudGVyZWRFbGVtZW50ID09IGV2ZW50LnRhcmdldCkgcmV0dXJuO1xuICAgIHRoaXMuX2N1cnJlbnRFbnRlcmVkRWxlbWVudCA9IGV2ZW50LnRhcmdldDtcblxuICAgIGlmICghdGhpcy5fYWN0aXZlRW50ZXJzKyspIHtcbiAgICAgIHRyYW5zaXRpb25Ub0NsYXNzKHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG4gIH1cblxuICBfb25EcmFnTGVhdmUoZXZlbnQpIHtcbiAgICB0aGlzLl9jdXJyZW50RW50ZXJlZEVsZW1lbnQgPSBudWxsO1xuXG4gICAgaWYgKCEtLXRoaXMuX2FjdGl2ZUVudGVycykge1xuICAgICAgdHJhbnNpdGlvbkZyb21DbGFzcyh0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX29uRHJvcChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICB0aGlzLl9hY3RpdmVFbnRlcnMgPSAwO1xuICAgIHRyYW5zaXRpb25Gcm9tQ2xhc3ModGhpcy5jb250YWluZXIpO1xuXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlc1swXTtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcblxuICAgIHRoaXMuZW1pdCgnc3ZnRGF0YUxvYWQnLCB7XG4gICAgICBkYXRhOiBhd2FpdCByZWFkRmlsZUFzVGV4dChmaWxlKSxcbiAgICAgIGZpbGVuYW1lOiBmaWxlLm5hbWVcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgZG9tUmVhZHksIHRyYW5zaXRpb25Gcm9tQ2xhc3MgfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByZWxvYWRlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGRvbVJlYWR5LnRoZW4oXyA9PiB7XG4gICAgICB0aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wcmVsb2FkZXInKTtcbiAgICAgIHRoaXMuYWN0aXZhdGVkID0gdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKTtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgaGlkZSgpIHtcbiAgICBhd2FpdCB0cmFuc2l0aW9uRnJvbUNsYXNzKHRoaXMuY29udGFpbmVyLCAnYWN0aXZlJyk7XG4gICAgdGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxufVxuIiwiaW1wb3J0IHsgc3RyVG9FbCwgZXNjYXBlSHRtbFRhZywgdHJhbnNpdGlvblRvQ2xhc3MsIGRvbVJlYWR5IH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaGFuZ2Vsb2cge1xuICBjb25zdHJ1Y3Rvcihsb2FkZWRWZXJzaW9uKSB7XG4gICAgdGhpcy5jb250YWluZXIgPSBzdHJUb0VsKCc8c2VjdGlvbiBjbGFzcz1cImNoYW5nZWxvZ1wiPjwvc2VjdGlvbj4nKTtcbiAgICB0aGlzLl9sb2FkZWRWZXJzaW9uID0gbG9hZGVkVmVyc2lvbjtcbiAgfVxuXG4gIGFzeW5jIHNob3dMb2dGcm9tKGxhc3RMb2FkZWRWZXJzaW9uKSB7XG4gICAgaWYgKGxhc3RMb2FkZWRWZXJzaW9uID09IHRoaXMuX2xvYWRlZFZlcnNpb24pIHJldHVybjtcbiAgICBjb25zdCBjaGFuZ2Vsb2cgPSBhd2FpdCBmZXRjaCgnY2hhbmdlbG9nLmpzb24nKS50aGVuKHIgPT4gci5qc29uKCkpO1xuICAgIGxldCBzdGFydEluZGV4ID0gMDtcbiAgICBsZXQgZW5kSW5kZXggPSAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2Vsb2cubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gY2hhbmdlbG9nW2ldO1xuXG4gICAgICBpZiAoZW50cnkudmVyc2lvbiA9PT0gdGhpcy5fbG9hZGVkVmVyc2lvbikge1xuICAgICAgICBzdGFydEluZGV4ID0gaTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGVudHJ5LnZlcnNpb24gPT09IGxhc3RMb2FkZWRWZXJzaW9uKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZW5kSW5kZXggPSBpICsgMTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGFuZ2VMaXMgPSBjaGFuZ2Vsb2cuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpXG4gICAgICAucmVkdWNlKChhcnIsIGVudHJ5KSA9PiBhcnIuY29uY2F0KGVudHJ5LmNoYW5nZXMpLCBbXSlcbiAgICAgIC5tYXAoY2hhbmdlID0+IGVzY2FwZUh0bWxUYWdgPGxpPiR7Y2hhbmdlfTwvbGk+YCk7XG5cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChzdHJUb0VsKCc8aDE+VXBkYXRlZCE8L2gxPicpKTtcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChzdHJUb0VsKFxuICAgICAgJzx1bD4nICtcbiAgICAgICAgY2hhbmdlTGlzLmpvaW4oJycpICtcbiAgICAgICc8L3VsPicgK1xuICAgICcnKSk7XG5cbiAgICBhd2FpdCBkb21SZWFkeTtcbiAgICB0cmFuc2l0aW9uVG9DbGFzcyh0aGlzLmNvbnRhaW5lcik7XG4gIH1cbn1cbiIsImltcG9ydCB7IGRvbVJlYWR5IH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXN1bHRzQ29udGFpbmVyIHtcbiAgY29uc3RydWN0b3IocmVzdWx0cykge1xuICAgIHRoaXMuX3Jlc3VsdHMgPSByZXN1bHRzO1xuXG4gICAgZG9tUmVhZHkudGhlbihfID0+IHtcbiAgICAgIHRoaXMuX21vYmlsZUNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5yZXN1bHRzLWNvbnRhaW5lci1tb2JpbGUnKTtcbiAgICAgIHRoaXMuX2NvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5yZXN1bHRzLWNvbnRhaW5lcicpO1xuICAgICAgdGhpcy5fcXVlcnkgPSBtYXRjaE1lZGlhKCcobWluLXdpZHRoOiA2NDBweCknKTtcblxuICAgICAgdGhpcy5fcXVlcnkuYWRkTGlzdGVuZXIoKCkgPT4gdGhpcy5fcG9zaXRpb25SZXN1bHRzKCkpO1xuICAgICAgdGhpcy5fcG9zaXRpb25SZXN1bHRzKCk7XG4gICAgfSk7XG4gIH1cblxuICBfcG9zaXRpb25SZXN1bHRzKCkge1xuICAgIGlmICh0aGlzLl9xdWVyeS5tYXRjaGVzKSB7XG4gICAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fcmVzdWx0cy5jb250YWluZXIpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuX21vYmlsZUNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9yZXN1bHRzLmNvbnRhaW5lcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IHsgZG9tUmVhZHkgfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXdUb2dnbGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG5cbiAgICBkb21SZWFkeS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZXctdG9nZ2xlcicpO1xuXG4gICAgICAvLyBzdG9wIGJyb3dzZXJzIHJlbWVtYmVyaW5nIHByZXZpb3VzIGZvcm0gc3RhdGVcbiAgICAgIHRoaXMuY29udGFpbmVyLm91dHB1dFswXS5jaGVja2VkID0gdHJ1ZTtcblxuICAgICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZSA9PiB0aGlzLl9vbkNoYW5nZShlKSk7XG4gICAgfSk7XG4gIH1cblxuICBfb25DaGFuZ2UoZXZlbnQpIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmNvbnRhaW5lci5vdXRwdXQudmFsdWU7XG5cbiAgICBpZiAoIXZhbHVlKSB7IC8vIHNvbWUgYnJvd3NlcnMgZG9uJ3Qgc3VwcG9ydCB0aGUgbmljZSBzaG9ydGN1dCBhYm92ZSAoZWcgU2FmYXJpKVxuICAgICAgdmFsdWUgPSBBcnJheS5mcm9tKHRoaXMuY29udGFpbmVyLm91dHB1dCkucmVkdWNlKCh2YWx1ZSwgaW5wdXQpID0+IHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIHx8IChpbnB1dC5jaGVja2VkID8gaW5wdXQudmFsdWUgOiAnJyk7XG4gICAgICB9LCAnJyk7XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHsgdmFsdWUgfSk7XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlc3VsdHNDYWNoZSB7XG4gIGNvbnN0cnVjdG9yKHNpemUpIHtcbiAgICB0aGlzLl9zaXplID0gc2l6ZTtcbiAgICB0aGlzLnB1cmdlKCk7XG4gIH1cblxuICBwdXJnZSgpIHtcbiAgICB0aGlzLl9maW5nZXJwcmludHMgPSBbXTtcbiAgICB0aGlzLl9pdGVtcyA9IFtdO1xuICAgIHRoaXMuX2luZGV4ID0gMDtcbiAgfVxuXG4gIGFkZChmaW5nZXJwcmludCwgc3ZnRmlsZSkge1xuICAgIGNvbnN0IG9sZEl0ZW0gPSB0aGlzLl9pdGVtc1t0aGlzLl9pbmRleF07XG5cbiAgICBpZiAob2xkSXRlbSkge1xuICAgICAgLy8gZ2MgYmxvYiB1cmxcbiAgICAgIG9sZEl0ZW0ucmVsZWFzZSgpO1xuICAgIH1cblxuICAgIHRoaXMuX2ZpbmdlcnByaW50c1t0aGlzLl9pbmRleF0gPSBmaW5nZXJwcmludDtcbiAgICB0aGlzLl9pdGVtc1t0aGlzLl9pbmRleF0gPSBzdmdGaWxlO1xuXG4gICAgdGhpcy5faW5kZXggPSAodGhpcy5faW5kZXggKyAxKSAlIHRoaXMuX3NpemU7XG4gIH1cblxuICBtYXRjaChmaW5nZXJwcmludCkge1xuICAgIHJldHVybiB0aGlzLl9pdGVtc1t0aGlzLl9maW5nZXJwcmludHMuaW5kZXhPZihmaW5nZXJwcmludCldO1xuICB9XG59XG4iLCJpbXBvcnQgeyB0cmFuc2l0aW9uVG9DbGFzcyB9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFpblVpIHtcbiAgY29uc3RydWN0b3IoLi4uZWxlbWVudHMpIHtcbiAgICB0aGlzLl9hY3RpdmF0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl90b0FjdGl2YXRlID0gZWxlbWVudHM7XG4gIH1cblxuICBhY3RpdmF0ZSgpIHtcbiAgICBpZiAodGhpcy5fYWN0aXZhdGVkKSByZXR1cm47XG4gICAgdGhpcy5fYWN0aXZhdGVkID0gdHJ1ZTtcblxuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMuX3RvQWN0aXZhdGUubWFwKGVsID0+IHRyYW5zaXRpb25Ub0NsYXNzKGVsKSlcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpZGJLZXl2YWwgYXMgc3RvcmFnZSB9IGZyb20gJy4uL3V0aWxzL3N0b3JhZ2UnO1xuaW1wb3J0IFN2Z28gZnJvbSAnLi9zdmdvJztcbmltcG9ydCB7IGRvbVJlYWR5IH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgT3V0cHV0IGZyb20gJy4vdWkvb3V0cHV0JztcbmltcG9ydCBEb3dubG9hZEJ1dHRvbiBmcm9tICcuL3VpL2Rvd25sb2FkLWJ1dHRvbic7XG5pbXBvcnQgQ29weUJ1dHRvbiBmcm9tICcuL3VpL2NvcHktYnV0dG9uJztcbmltcG9ydCB7IGNvcHlTdXBwb3J0ZWQgfSBmcm9tICcuL3VpL2NvcHktYnV0dG9uJztcbmltcG9ydCBCZ0ZpbGxCdXR0b24gZnJvbSAnLi91aS9iZy1maWxsLWJ1dHRvbic7XG5pbXBvcnQgUmVzdWx0cyBmcm9tICcuL3VpL3Jlc3VsdHMnO1xuaW1wb3J0IFNldHRpbmdzIGZyb20gJy4vdWkvc2V0dGluZ3MnO1xuaW1wb3J0IE1haW5NZW51IGZyb20gJy4vdWkvbWFpbi1tZW51JztcbmltcG9ydCBUb2FzdHMgZnJvbSAnLi91aS90b2FzdHMnO1xuaW1wb3J0IEZpbGVEcm9wIGZyb20gJy4vdWkvZmlsZS1kcm9wJztcbmltcG9ydCBQcmVsb2FkZXIgZnJvbSAnLi91aS9wcmVsb2FkZXInO1xuaW1wb3J0IENoYW5nZWxvZyBmcm9tICcuL3VpL2NoYW5nZWxvZyc7XG5pbXBvcnQgUmVzdWx0c0NvbnRhaW5lciBmcm9tICcuL3VpL3Jlc3VsdHMtY29udGFpbmVyJztcbmltcG9ydCBWaWV3VG9nZ2xlciBmcm9tICcuL3VpL3ZpZXctdG9nZ2xlcic7XG5pbXBvcnQgUmVzdWx0c0NhY2hlIGZyb20gJy4vcmVzdWx0cy1jYWNoZSc7XG5pbXBvcnQgTWFpblVpIGZyb20gJy4vdWkvbWFpbi11aSc7XG5cbmNvbnN0IHN2Z28gPSBuZXcgU3ZnbygpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYWluQ29udHJvbGxlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2NvbnRhaW5lciA9IG51bGw7XG5cbiAgICAvLyB1aSBjb21wb25lbnRzXG4gICAgdGhpcy5fbWFpblVpID0gbnVsbDtcbiAgICB0aGlzLl9vdXRwdXRVaSA9IG5ldyBPdXRwdXQoKTtcbiAgICB0aGlzLl9kb3dubG9hZEJ1dHRvblVpID0gbmV3IERvd25sb2FkQnV0dG9uKCk7XG4gICAgdGhpcy5fY29weUJ1dHRvblVpID0gbmV3IENvcHlCdXR0b24oKTtcbiAgICB0aGlzLl9iZ0ZpbGxVaSA9IG5ldyBCZ0ZpbGxCdXR0b24oKTtcbiAgICB0aGlzLl9yZXN1bHRzVWkgPSBuZXcgUmVzdWx0cygpO1xuICAgIHRoaXMuX3NldHRpbmdzVWkgPSBuZXcgU2V0dGluZ3MoKTtcbiAgICB0aGlzLl9tYWluTWVudVVpID0gbmV3IE1haW5NZW51KCk7XG4gICAgdGhpcy5fdG9hc3RzVWkgPSBuZXcgVG9hc3RzKCk7XG4gICAgdGhpcy5fZHJvcFVpID0gbmV3IEZpbGVEcm9wKCk7XG4gICAgdGhpcy5fcHJlbG9hZGVyVWkgPSBuZXcgUHJlbG9hZGVyKCk7XG4gICAgdGhpcy5fY2hhbmdlbG9nVWkgPSBuZXcgQ2hhbmdlbG9nKHNlbGYudmVyc2lvbik7XG4gICAgdGhpcy5fcmVzdWx0c0NvbnRhaW5lclVpID0gbmV3IFJlc3VsdHNDb250YWluZXIodGhpcy5fcmVzdWx0c1VpKTtcbiAgICB0aGlzLl92aWV3VG9nZ2xlclVpID0gbmV3IFZpZXdUb2dnbGVyKCk7XG5cbiAgICAvLyB1aSBldmVudHNcbiAgICB0aGlzLl9zZXR0aW5nc1VpLm9uKCdjaGFuZ2UnLCAoKSA9PiB0aGlzLl9vblNldHRpbmdzQ2hhbmdlKCkpO1xuICAgIHRoaXMuX3NldHRpbmdzVWkub24oJ3Jlc2V0Jywgb2xkU2V0dGluZ3MgPT4gdGhpcy5fb25TZXR0aW5nc1Jlc2V0KG9sZFNldHRpbmdzKSk7XG4gICAgdGhpcy5fbWFpbk1lbnVVaS5vbignc3ZnRGF0YUxvYWQnLCBlID0+IHRoaXMuX29uSW5wdXRDaGFuZ2UoZSkpO1xuICAgIHRoaXMuX2Ryb3BVaS5vbignc3ZnRGF0YUxvYWQnLCBlID0+IHRoaXMuX29uSW5wdXRDaGFuZ2UoZSkpO1xuICAgIHRoaXMuX21haW5NZW51VWkub24oJ2Vycm9yJywgKHtlcnJvcn0pID0+IHRoaXMuX2hhbmRsZUVycm9yKGVycm9yKSk7XG4gICAgdGhpcy5fdmlld1RvZ2dsZXJVaS5vbignY2hhbmdlJywgZSA9PiB0aGlzLl9vblZpZXdTZWxlY3Rpb25DaGFuZ2UoZSkpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZSA9PiB0aGlzLl9vbkdsb2JhbEtleURvd24oZSkpO1xuXG4gICAgLy8gc3RhdGVcbiAgICB0aGlzLl9pbnB1dEl0ZW0gPSBudWxsO1xuICAgIHRoaXMuX2NhY2hlID0gbmV3IFJlc3VsdHNDYWNoZSgxMCk7XG4gICAgdGhpcy5fbGF0ZXN0Q29tcHJlc3NKb2JJZCA9IDA7XG4gICAgdGhpcy5fdXNlckhhc0ludGVyYWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWxvYWRpbmcgPSBmYWxzZTtcblxuICAgIGlmICgnc2VydmljZVdvcmtlcicgaW4gbmF2aWdhdG9yKSB7XG4gICAgICBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5yZWdpc3Rlcignc3cuanMnLCB7XG4gICAgICAgIHNjb3BlOiAnLi8nXG4gICAgICB9KS50aGVuKHJlZ2lzdHJhdGlvbiA9PiB7XG4gICAgICAgIHJlZ2lzdHJhdGlvbi5hZGRFdmVudExpc3RlbmVyKCd1cGRhdGVmb3VuZCcsICgpID0+IHRoaXMuX29uVXBkYXRlRm91bmQocmVnaXN0cmF0aW9uKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB0ZWxsIHRoZSB1c2VyIGFib3V0IHRoZSBsYXRlc3QgdXBkYXRlXG4gICAgc3RvcmFnZS5nZXQoJ2xhc3Qtc2Vlbi12ZXJzaW9uJykudGhlbihsYXN0U2VlblZlcnNpb24gPT4ge1xuICAgICAgaWYgKGxhc3RTZWVuVmVyc2lvbikge1xuICAgICAgICB0aGlzLl9jaGFuZ2Vsb2dVaS5zaG93TG9nRnJvbShsYXN0U2VlblZlcnNpb24pO1xuICAgICAgfVxuICAgICAgc3RvcmFnZS5zZXQoJ2xhc3Qtc2Vlbi12ZXJzaW9uJywgc2VsZi52ZXJzaW9uKTtcbiAgICB9KTtcblxuICAgIGRvbVJlYWR5LnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5fY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFwcC1vdXRwdXQnKTtcblxuICAgICAgLy8gZWxlbWVudHMgZm9yIGludHJvIGFuaW1cbiAgICAgIHRoaXMuX21haW5VaSA9IG5ldyBNYWluVWkoXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b29sYmFyJyksXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3Rpb24tYnV0dG9uLWNvbnRhaW5lcicpLFxuICAgICAgICB0aGlzLl9vdXRwdXRVaS5jb250YWluZXIsXG4gICAgICAgIHRoaXMuX3NldHRpbmdzVWkuY29udGFpbmVyXG4gICAgICApO1xuXG4gICAgICBjb25zdCBhY3Rpb25Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYWN0aW9uLWJ1dHRvbi1jb250YWluZXInKTtcbiAgICAgIGNvbnN0IG1pbm9yQWN0aW9uQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1pbm9yLWFjdGlvbi1jb250YWluZXInKTtcblxuICAgICAgbWlub3JBY3Rpb25Db250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fYmdGaWxsVWkuY29udGFpbmVyKTtcblxuICAgICAgaWYgKGNvcHlTdXBwb3J0ZWQpIHtcbiAgICAgICAgbWlub3JBY3Rpb25Db250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fY29weUJ1dHRvblVpLmNvbnRhaW5lcik7XG4gICAgICB9XG5cbiAgICAgIGFjdGlvbkNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9kb3dubG9hZEJ1dHRvblVpLmNvbnRhaW5lcik7XG5cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5vdXRwdXQnKS5hcHBlbmRDaGlsZCh0aGlzLl9vdXRwdXRVaS5jb250YWluZXIpO1xuICAgICAgdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX3RvYXN0c1VpLmNvbnRhaW5lcik7XG4gICAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fZHJvcFVpLmNvbnRhaW5lcik7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWVudS1leHRyYScpLmFwcGVuZENoaWxkKHRoaXMuX2NoYW5nZWxvZ1VpLmNvbnRhaW5lcik7XG5cbiAgICAgIC8vIGxvYWQgcHJldmlvdXMgc2V0dGluZ3NcbiAgICAgIHRoaXMuX2xvYWRTZXR0aW5ncygpO1xuXG4gICAgICAvLyBzb21lb25lIG1hbmFnZWQgdG8gaGl0IHRoZSBwcmVsb2FkZXIsIGF3d1xuICAgICAgaWYgKHRoaXMuX3ByZWxvYWRlclVpLmFjdGl2YXRlZCkge1xuICAgICAgICB0aGlzLl90b2FzdHNVaS5zaG93KFwiUmVhZHkgbm93IVwiLCB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMDBcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGZvciB0ZXN0aW5nXG4gICAgICBpZiAoZmFsc2UpIHtcbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0aGlzLl9vbklucHV0Q2hhbmdlKHtcbiAgICAgICAgICAgIGRhdGE6IGF3YWl0IGZldGNoKCd0ZXN0LXN2Z3MvY2FyLWxpdGUuc3ZnJykudGhlbihyID0+IHIudGV4dCgpKSxcbiAgICAgICAgICAgIGZpbGVuYW1lOiAnY2FyLWxpdGUuc3ZnJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX29uR2xvYmFsS2V5RG93bihldmVudCkge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdvJyAmJiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuX21haW5NZW51VWkuc2hvd0ZpbGVQaWNrZXIoKTtcbiAgICB9XG4gIH1cblxuICBfb25WaWV3U2VsZWN0aW9uQ2hhbmdlKGV2ZW50KSB7XG4gICAgdGhpcy5fb3V0cHV0VWkuc2V0KGV2ZW50LnZhbHVlKTtcbiAgfVxuXG4gIF9vblVwZGF0ZUZvdW5kKHJlZ2lzdHJhdGlvbikge1xuICAgIGNvbnN0IG5ld1dvcmtlciA9IHJlZ2lzdHJhdGlvbi5pbnN0YWxsaW5nO1xuXG4gICAgcmVnaXN0cmF0aW9uLmluc3RhbGxpbmcuYWRkRXZlbnRMaXN0ZW5lcignc3RhdGVjaGFuZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fcmVsb2FkaW5nKSByZXR1cm47XG5cbiAgICAgIC8vIHRoZSB2ZXJ5IGZpcnN0IGFjdGl2YXRpb24hXG4gICAgICAvLyB0ZWxsIHRoZSB1c2VyIHN0dWZmIHdvcmtzIG9mZmxpbmVcbiAgICAgIGlmIChuZXdXb3JrZXIuc3RhdGUgPT0gJ2FjdGl2YXRlZCcgJiYgIW5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgdGhpcy5fdG9hc3RzVWkuc2hvdyhcIlJlYWR5IHRvIHdvcmsgb2ZmbGluZVwiLCB7XG4gICAgICAgICAgZHVyYXRpb246IDUwMDBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld1dvcmtlci5zdGF0ZSA9PSAnYWN0aXZhdGVkJyAmJiBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5jb250cm9sbGVyKSB7XG4gICAgICAgIC8vIGlmIHRoZSB1c2VyIGhhc24ndCBpbnRlcmFjdGVkIHlldCwgZG8gYSBzbmVha3kgcmVsb2FkXG4gICAgICAgIGlmICghdGhpcy5fdXNlckhhc0ludGVyYWN0ZWQpIHtcbiAgICAgICAgICB0aGlzLl9yZWxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG90aGVyd2lzZSwgc2hvdyB0aGUgdXNlciBhbiBhbGVydFxuICAgICAgICBjb25zdCB0b2FzdCA9IHRoaXMuX3RvYXN0c1VpLnNob3coXCJVcGRhdGUgYXZhaWxhYmxlXCIsIHtcbiAgICAgICAgICBidXR0b25zOiBbJ3JlbG9hZCcsICdkaXNtaXNzJ11cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgdG9hc3QuYW5zd2VyO1xuXG4gICAgICAgIGlmIChhbnN3ZXIgPT0gJ3JlbG9hZCcpIHtcbiAgICAgICAgICB0aGlzLl9yZWxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfb25TZXR0aW5nc0NoYW5nZSgpIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuX3NldHRpbmdzVWkuZ2V0U2V0dGluZ3MoKTtcbiAgICB0aGlzLl9zYXZlU2V0dGluZ3Moc2V0dGluZ3MpO1xuICAgIHRoaXMuX2NvbXByZXNzU3ZnKHNldHRpbmdzKTtcbiAgfVxuXG4gIGFzeW5jIF9vblNldHRpbmdzUmVzZXQob2xkU2V0dGluZ3MpIHtcbiAgICBjb25zdCB0b2FzdCA9IHRoaXMuX3RvYXN0c1VpLnNob3coXCJTZXR0aW5ncyByZXNldFwiLCB7XG4gICAgICBidXR0b25zOiBbJ3VuZG8nLCAnZGlzbWlzcyddLFxuICAgICAgZHVyYXRpb246IDUwMDBcbiAgICB9KTtcblxuICAgIGlmICgoYXdhaXQgdG9hc3QuYW5zd2VyKSA9PT0gJ3VuZG8nKSB7XG4gICAgICB0aGlzLl9zZXR0aW5nc1VpLnNldFNldHRpbmdzKG9sZFNldHRpbmdzKTtcbiAgICAgIHRoaXMuX29uU2V0dGluZ3NDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBfb25JbnB1dENoYW5nZShldmVudCkge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5fc2V0dGluZ3NVaS5nZXRTZXR0aW5ncygpO1xuICAgIHRoaXMuX3VzZXJIYXNJbnRlcmFjdGVkID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLl9pbnB1dEl0ZW0gPSBhd2FpdCBzdmdvLmxvYWQoZXZlbnQuZGF0YSk7XG4gICAgICB0aGlzLl9pbnB1dEZpbGVuYW1lID0gZXZlbnQuZmlsZW5hbWU7XG4gICAgfVxuICAgIGNhdGNoKGUpIHtcbiAgICAgIC8vIFRoaXMgZXh0cmEgc2NvcGUgaXMgd29ya2luZyBhcm91bmQgYSBiYWJlbC1taW5pZnkgYnVnLlxuICAgICAgLy8gSXQncyBmaXhlZCBpbiBCYWJlbCA3LlxuICAgICAge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihcIkxvYWQgZmFpbGVkOiBcIiArIGUubWVzc2FnZSk7XG4gICAgICAgIHRoaXMuX21haW5NZW51VWkuc3RvcFNwaW5uZXIoKTtcbiAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fY2FjaGUucHVyZ2UoKTtcblxuICAgIGxldCBmaXJzdEl0ZXJhdGlvbiA9IHRydWU7XG5cbiAgICBjb25zdCBjb21wcmVzc2VkID0gKCkgPT4ge1xuICAgICAgaWYgKGZpcnN0SXRlcmF0aW9uKSB7XG4gICAgICAgIHRoaXMuX291dHB1dFVpLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuX21haW5VaS5hY3RpdmF0ZSgpO1xuICAgICAgICB0aGlzLl9tYWluTWVudVVpLmFsbG93SGlkZSA9IHRydWU7XG4gICAgICAgIHRoaXMuX21haW5NZW51VWkuaGlkZSgpO1xuICAgICAgICBmaXJzdEl0ZXJhdGlvbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2NvbXByZXNzU3ZnKHNldHRpbmdzLCAoKSA9PiBjb21wcmVzc2VkKCkpO1xuXG4gICAgaWYgKGZpcnN0SXRlcmF0aW9uKSB7XG4gICAgICBjb21wcmVzc2VkKCk7XG4gICAgfVxuICB9XG5cbiAgX2hhbmRsZUVycm9yKGUpIHtcbiAgICB0aGlzLl90b2FzdHNVaS5zaG93KGUubWVzc2FnZSk7XG4gICAgY29uc29sZS5lcnJvcihlKTtcbiAgfVxuXG4gIGFzeW5jIF9sb2FkU2V0dGluZ3MoKSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBhd2FpdCBzdG9yYWdlLmdldCgnc2V0dGluZ3MnKTtcbiAgICBpZiAoc2V0dGluZ3MpIHRoaXMuX3NldHRpbmdzVWkuc2V0U2V0dGluZ3Moc2V0dGluZ3MpO1xuICB9XG5cbiAgX3NhdmVTZXR0aW5ncyhzZXR0aW5ncykge1xuICAgIGNvbnN0IGNvcHkgPSBPYmplY3QuYXNzaWduKHt9LCBzZXR0aW5ncyk7XG4gICAgLy8gZG9lc24ndCBtYWtlIHNlbnNlIHRvIHJldGFpbiB0aGUgXCJzaG93IG9yaWdpbmFsXCIgb3B0aW9uXG4gICAgZGVsZXRlIGNvcHkub3JpZ2luYWw7XG4gICAgc3RvcmFnZS5zZXQoJ3NldHRpbmdzJywgY29weSk7XG4gIH1cblxuICBhc3luYyBfY29tcHJlc3NTdmcoc2V0dGluZ3MsIGl0ZXJhdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24oKXt9KSB7XG4gICAgY29uc3QgdGhpc0pvYklkID0gdGhpcy5fbGF0ZXN0Q29tcHJlc3NKb2JJZCA9IE1hdGgucmFuZG9tKCk7XG5cbiAgICBhd2FpdCBzdmdvLmFib3J0Q3VycmVudCgpO1xuXG4gICAgaWYgKHRoaXNKb2JJZCAhPSB0aGlzLl9sYXRlc3RDb21wcmVzc0pvYklkKSB7XG4gICAgICAvLyB3aGlsZSB3ZSd2ZSBiZWVuIHdhaXRpbmcsIHRoZXJlJ3MgYmVlbiBhIG5ld2VyIGNhbGxcbiAgICAgIC8vIHRvIF9jb21wcmVzc1N2Zywgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5vcmlnaW5hbCkge1xuICAgICAgdGhpcy5fdXBkYXRlRm9yRmlsZSh0aGlzLl9pbnB1dEl0ZW0sIHtcbiAgICAgICAgY29tcHJlc3M6IHNldHRpbmdzLmd6aXBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNhY2hlTWF0Y2ggPSB0aGlzLl9jYWNoZS5tYXRjaChzZXR0aW5ncy5maW5nZXJwcmludCk7XG5cbiAgICBpZiAoY2FjaGVNYXRjaCkge1xuICAgICAgdGhpcy5fdXBkYXRlRm9yRmlsZShjYWNoZU1hdGNoLCB7XG4gICAgICAgIGNvbXBhcmVUb0ZpbGU6IHRoaXMuX2lucHV0SXRlbSxcbiAgICAgICAgY29tcHJlc3M6IHNldHRpbmdzLmd6aXBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2Rvd25sb2FkQnV0dG9uVWkud29ya2luZygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbmFsUmVzdWx0RmlsZSA9IGF3YWl0IHN2Z28ucHJvY2VzcyhzZXR0aW5ncywgcmVzdWx0RmlsZSA9PiB7XG4gICAgICAgIGl0ZXJhdGlvbkNhbGxiYWNrKHJlc3VsdEZpbGUpO1xuICAgICAgICB0aGlzLl91cGRhdGVGb3JGaWxlKHJlc3VsdEZpbGUsIHtcbiAgICAgICAgICBjb21wYXJlVG9GaWxlOiB0aGlzLl9pbnB1dEl0ZW0sXG4gICAgICAgICAgY29tcHJlc3M6IHNldHRpbmdzLmd6aXBcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fY2FjaGUuYWRkKHNldHRpbmdzLmZpbmdlcnByaW50LCBmaW5hbFJlc3VsdEZpbGUpO1xuICAgIH1cbiAgICBjYXRjaChlKSB7XG4gICAgICBpZiAoZS5tZXNzYWdlID09IFwiYWJvcnRcIikgcmV0dXJuO1xuICAgICAgZS5tZXNzYWdlID0gXCJNaW5pZnlpbmcgZXJyb3I6IFwiICsgZS5tZXNzYWdlO1xuICAgICAgdGhpcy5faGFuZGxlRXJyb3IoZSk7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgdGhpcy5fZG93bmxvYWRCdXR0b25VaS5kb25lKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3VwZGF0ZUZvckZpbGUoc3ZnRmlsZSwgeyBjb21wYXJlVG9GaWxlLCBjb21wcmVzcyB9KSB7XG4gICAgdGhpcy5fb3V0cHV0VWkudXBkYXRlKHN2Z0ZpbGUpO1xuICAgIHRoaXMuX2Rvd25sb2FkQnV0dG9uVWkuc2V0RG93bmxvYWQodGhpcy5faW5wdXRGaWxlbmFtZSwgc3ZnRmlsZSk7XG4gICAgdGhpcy5fY29weUJ1dHRvblVpLnNldENvcHlUZXh0KHN2Z0ZpbGUudGV4dCk7XG5cbiAgICB0aGlzLl9yZXN1bHRzVWkudXBkYXRlKHtcbiAgICAgIGNvbXBhcmlzb25TaXplOiBjb21wYXJlVG9GaWxlICYmIChhd2FpdCBjb21wYXJlVG9GaWxlLnNpemUoeyBjb21wcmVzcyB9KSksXG4gICAgICBzaXplOiBhd2FpdCBzdmdGaWxlLnNpemUoeyBjb21wcmVzcyB9KVxuICAgIH0pO1xuICB9XG59XG5cbiIsImltcG9ydCBXb3JrZXJNZXNzZW5nZXIgZnJvbSAnLi93b3JrZXItbWVzc2VuZ2VyJztcbmltcG9ydCBTdmdGaWxlIGZyb20gJy4vc3ZnLWZpbGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdmdvIGV4dGVuZHMgV29ya2VyTWVzc2VuZ2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ2pzL3N2Z28td29ya2VyLmpzJyk7XG4gICAgdGhpcy5fYWJvcnRPbk5leHRJdGVyYXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9jdXJyZW50Sm9iID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBhc3luYyBsb2FkKHN2Z1RleHQpIHtcbiAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBhd2FpdCB0aGlzLl9yZXF1ZXN0UmVzcG9uc2Uoe1xuICAgICAgYWN0aW9uOiAnbG9hZCcsXG4gICAgICBkYXRhOiBzdmdUZXh0XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFN2Z0ZpbGUoc3ZnVGV4dCwgd2lkdGgsIGhlaWdodCk7XG4gIH1cblxuICBwcm9jZXNzKHNldHRpbmdzLCBpdGVyYXRpb25DYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50Sm9iID0gdGhpcy5hYm9ydEN1cnJlbnQoKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuX2Fib3J0T25OZXh0SXRlcmF0aW9uID0gZmFsc2U7XG5cbiAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLl9yZXF1ZXN0UmVzcG9uc2Uoe1xuICAgICAgICBhY3Rpb246ICdwcm9jZXNzJyxcbiAgICAgICAgc2V0dGluZ3NcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgcmVzdWx0RmlsZSA9IG5ldyBTdmdGaWxlKHJlc3VsdC5kYXRhLCByZXN1bHQuZGltZW5zaW9ucy53aWR0aCwgcmVzdWx0LmRpbWVuc2lvbnMuaGVpZ2h0KTtcblxuICAgICAgaXRlcmF0aW9uQ2FsbGJhY2socmVzdWx0RmlsZSk7XG5cbiAgICAgIGlmIChzZXR0aW5ncy5tdWx0aXBhc3MpIHtcbiAgICAgICAgd2hpbGUgKHJlc3VsdCA9IGF3YWl0IHRoaXMubmV4dFBhc3MoKSkge1xuICAgICAgICAgIGlmICh0aGlzLl9hYm9ydE9uTmV4dEl0ZXJhdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2Fib3J0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdEZpbGUgPSBuZXcgU3ZnRmlsZShyZXN1bHQuZGF0YSwgcmVzdWx0LmRpbWVuc2lvbnMud2lkdGgsIHJlc3VsdC5kaW1lbnNpb25zLmhlaWdodCk7XG4gICAgICAgICAgaXRlcmF0aW9uQ2FsbGJhY2socmVzdWx0RmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gcmV0dXJuIGZpbmFsIHJlc3VsdFxuICAgICAgcmV0dXJuIHJlc3VsdEZpbGU7XG4gICAgfSk7XG4gIH1cblxuICBuZXh0UGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgIGFjdGlvbjogJ25leHRQYXNzJ1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgYWJvcnRDdXJyZW50KCkge1xuICAgIHRoaXMuX2Fib3J0T25OZXh0SXRlcmF0aW9uID0gdHJ1ZTtcbiAgICBhd2FpdCB0aGlzLl9jdXJyZW50Sm9iO1xuICB9XG5cbiAgYXN5bmMgcmVsZWFzZSgpIHtcbiAgICBhd2FpdCB0aGlzLmFib3J0Q3VycmVudCgpO1xuICAgIHN1cGVyLnJlbGVhc2UoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHJhY2tGb2N1c01ldGhvZCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IE1haW5Db250cm9sbGVyIGZyb20gJy4vbWFpbi1jb250cm9sbGVyJztcblxudHJhY2tGb2N1c01ldGhvZCgpO1xubmV3IE1haW5Db250cm9sbGVyKCk7XG4iXSwibmFtZXMiOlsiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiwiY2hpbGRyZW4iLCJyZXBsYWNlIiwibWFwIiwicmVkdWNlIiwiUmVzcG9uc2UiLCJ0ZXh0IiwicmVtb3ZlQ2xhc3MiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsIlByb21pc2UiLCJyZXNvbHZlIiwidGFyZ2V0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInJlbW92ZSIsImFkZCIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJ4IiwicGFnZVgiLCJ5IiwicGFnZVkiLCJNYXRoIiwiYWJzIiwic3FydCIsInRvdWNoZXMiLCJBcnJheSIsImZyb20iLCJwb3ciLCJmbG9vciIsInJvdW5kIiwiaW5pdCIsImNhbGwiLCJfbWF4TGlzdGVuZXJzIiwiZGVmYXVsdE1heExpc3RlbmVycyIsImxlbmd0aCIsImFwcGx5IiwiVHlwZUVycm9yIiwiX2V2ZW50cyIsIm5ld0xpc3RlbmVyIiwiZW1pdCIsImxpc3RlbmVyIiwiX2V2ZW50c0NvdW50IiwidW5zaGlmdCIsInB1c2giLCJ3YXJuZWQiLCJFcnJvciIsIm5hbWUiLCJlbWl0dGVyIiwidHlwZSIsImNvdW50IiwiY29uc29sZSIsIndhcm4iLCJsb2ciLCJyZW1vdmVMaXN0ZW5lciIsImFyZ3VtZW50cyIsInBvcCIsInJlYWR5U3RhdGUiLCJkb2N1bWVudCIsImNyZWF0ZVJhbmdlIiwic2VsZWN0Tm9kZSIsImRvY3VtZW50RWxlbWVudCIsImluZGV4ZWREQiIsIm9wZW4iLCJvbmVycm9yIiwiZXJyb3IiLCJvbnVwZ3JhZGVuZWVkZWQiLCJyZXN1bHQiLCJjcmVhdGVPYmplY3RTdG9yZSIsIm9uc3VjY2VzcyIsInRyYW5zYWN0aW9uIiwib25jb21wbGV0ZSIsIm9iamVjdFN0b3JlIiwiZ2V0Iiwic2V0IiwicHV0IiwiZGVsZXRlIiwic2VsZiIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJzZXRJdGVtIiwicmVtb3ZlSXRlbSIsImNvbnN0cnVjdG9yIiwiX3JlcXVlc3RJZCIsIl9wZW5kaW5nIiwiX3VybCIsIl93b3JrZXIiLCJXb3JrZXIiLCJvbm1lc3NhZ2UiLCJfb25NZXNzYWdlIiwicmVsZWFzZSIsInRlcm1pbmF0ZSIsIk9iamVjdCIsImtleXMiLCJfZnVsZmlsbFBlbmRpbmciLCJpZCIsIl9wb3N0TWVzc2FnZSIsInBvc3RNZXNzYWdlIiwiZGF0YSIsIl9yZXF1ZXN0UmVzcG9uc2UiLCJjb21wcmVzcyIsIl9jb21wcmVzc2VkU2l6ZSIsIl9ibG9iIiwid2lkdGgiLCJoZWlnaHQiLCJzaXplIiwidGhlbiIsImJ5dGVMZW5ndGgiLCJfY3JlYXRlIiwiQmxvYiIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsImJsb2IiLCJ1cmwiLCJyZXZva2VPYmplY3RVUkwiLCJldmVudEFyZWEiLCJzaG91bGRDYXB0dXJlRnVuYyIsIl90YXJnZXQiLCJfc2hvdWxkQ2FwdHVyZUZ1bmMiLCJfZHgiLCJfZHkiLCJfc2NhbGUiLCJfYWN0aXZlIiwiX2xhc3RQb2ludHMiLCJmb3JFYWNoIiwiYmluZCIsIl9vblBvaW50ZXJEb3duIiwiX29uV2hlZWwiLCJyZXNldCIsIl91cGRhdGUiLCJwcmV2ZW50RGVmYXVsdCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImRlbHRhWSIsImRlbHRhTW9kZSIsIm1heCIsIm1pbiIsImxlZnQiLCJ0b3AiLCJfb25GaXJzdFBvaW50ZXJEb3duIiwiX29uUG9pbnRlck1vdmUiLCJfb25Qb2ludGVyVXAiLCJ3aGljaCIsInN0eWxlIiwiV2Via2l0VHJhbnNmb3JtIiwidHJhbnNmb3JtIiwiY29udGFpbmVyIiwiX3N2Z0ZyYW1lIiwicXVlcnlTZWxlY3RvciIsInNjcm9sbGluZyIsIl9zdmdDb250YWluZXIiLCJfcGFuWm9vbSIsInNldFN2ZyIsIl9uZXh0TG9hZFByb21pc2UiLCJzcmMiLCJlbmNvZGVVUklDb21wb25lbnQiLCJoaWdobGlnaHQiLCJfY29kZUVsIiwiaW5uZXJIVE1MIiwiX3R5cGVzIiwiaW1hZ2UiLCJjb2RlIiwiX3N2Z0ZpbGUiLCJfc3dpdGNoUXVldWUiLCJub0FuaW1hdGUiLCJ1cGRhdGUiLCJfYWN0aXZlVHlwZSIsImFwcGVuZENoaWxkIiwiYWxsIiwicmVtb3ZlQ2hpbGQiLCJhbmltYXRlIiwib2Zmc2V0TGVmdCIsIl9zaG93VGltZW91dCIsImRpc3BsYXkiLCJzaG93IiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsImhpZGUiLCJ0aXRsZSIsImhyZWYiLCJpY29uU3ZnIiwibWlub3IiLCJzZXRBdHRyaWJ1dGUiLCJfcmlwcGxlIiwiX3NwaW5uZXIiLCJfb25DbGljayIsIndvcmtpbmciLCJkb25lIiwibmF2aWdhdG9yIiwibXNTYXZlQmxvYiIsImZpbGVuYW1lIiwic2V0RG93bmxvYWQiLCJkb3dubG9hZCIsInF1ZXJ5Q29tbWFuZFN1cHBvcnRlZCIsIl90ZXh0IiwiX3ByZSIsImNyZWF0ZUVsZW1lbnQiLCJ0ZXh0Q29udGVudCIsImJvZHkiLCJnZXRTZWxlY3Rpb24iLCJyZW1vdmVBbGxSYW5nZXMiLCJ3aW5kb3ciLCJhZGRSYW5nZSIsImV4ZWNDb21tYW5kIiwic2V0Q29weVRleHQiLCJzZXRDb2xvciIsImJhY2tncm91bmRDb2xvciIsIl9zaXplRWwiLCJfbmV3U2l6ZUVsIiwiX2RpZmZFbCIsImNvbXBhcmlzb25TaXplIiwicHJvdG90eXBlIiwiY3JlYXRlIiwiRXZlbnRFbWl0dGVyIiwidXNpbmdEb21haW5zIiwiZG9tYWluIiwiYWN0aXZlIiwiRG9tYWluIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRNYXhMaXN0ZW5lcnMiLCJpc05hTiIsImdldE1heExpc3RlbmVycyIsImRvbWFpbkVtaXR0ZXIiLCJkb21haW5UaHJvd24iLCJjb250ZXh0IiwiYWRkTGlzdGVuZXIiLCJvbiIsInByZXBlbmRMaXN0ZW5lciIsIm9uY2UiLCJwcmVwZW5kT25jZUxpc3RlbmVyIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwibGlzdGVuZXJzIiwibGlzdGVuZXJDb3VudCIsImV2ZW50TmFtZXMiLCJSZWZsZWN0Iiwib3duS2V5cyIsInJhbmdlIiwiX2hhbmRsZSIsIl90cmFja09uIiwiX3ZhbCIsInBhcmVudE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJmaXJzdENoaWxkIiwiX29uSW5wdXRDaGFuZ2UiLCJfb25SYW5nZU1vdXNlRG93biIsIl9vblJhbmdlVG91Y2hTdGFydCIsIl9vblJhbmdlVG91Y2hFbmQiLCJfc2V0UG9zaXRpb24iLCJmb2N1cyIsImJsdXIiLCJ2YWx1ZSIsIl90aHJvdHRsZVRpbWVvdXQiLCJfcGx1Z2luSW5wdXRzIiwicXVlcnlTZWxlY3RvckFsbCIsIl9nbG9iYWxJbnB1dHMiLCJfcmVzZXRSaXBwbGUiLCJfcmVzZXRCdG4iLCJfc2xpZGVyTWFwIiwiV2Vha01hcCIsIl9zY3JvbGxlciIsIl9vbkNoYW5nZSIsIl9vbk1vdXNlV2hlZWwiLCJfb25SZXNldCIsImNsb3Nlc3QiLCJjdXJyZW50VGFyZ2V0Iiwic2Nyb2xsVG9wIiwiZ2V0U2V0dGluZ3MiLCJjaGVja2VkIiwiaGFzQXR0cmlidXRlIiwiZ2V0QXR0cmlidXRlIiwic2V0U2V0dGluZ3MiLCJwbHVnaW5zIiwiZmluZ2VycHJpbnQiLCJqb2luIiwiYWxsb3dIaWRlIiwiX2xvYWRGaWxlSW5wdXQiLCJfcGFzdGVJbnB1dCIsIl9sb2FkRGVtb0J0biIsIl9sb2FkRmlsZUJ0biIsIl9wYXN0ZUxhYmVsIiwiX292ZXJsYXkiLCJfbWVudSIsIl9vbk1lbnVCdXR0b25DbGljayIsIl9vbk92ZXJsYXlDbGljayIsIl9vbkxvYWRGaWxlQ2xpY2siLCJfb25Mb2FkRGVtb0NsaWNrIiwiX29uRmlsZUlucHV0Q2hhbmdlIiwiX29uVGV4dElucHV0Q2hhbmdlIiwic3RvcFNwaW5uZXIiLCJzaG93RmlsZVBpY2tlciIsImNsaWNrIiwidHJpbSIsImluY2x1ZGVzIiwiZmlsZXMiLCJmZXRjaCIsInNlcnZpY2VXb3JrZXIiLCJjb250cm9sbGVyIiwiX2NvbnRlbnQiLCJfYW5zd2VyUmVzb2x2ZSIsIl9oaWRlVGltZW91dCIsImFuc3dlciIsImNsYXNzTmFtZSIsImR1cmF0aW9uIiwiYnV0dG9ucyIsIl9hY3RpdmVFbnRlcnMiLCJfY3VycmVudEVudGVyZWRFbGVtZW50IiwiX29uRHJhZ0VudGVyIiwiX29uRHJhZ0xlYXZlIiwiX29uRHJvcCIsImRhdGFUcmFuc2ZlciIsImFjdGl2YXRlZCIsIl9sb2FkZWRWZXJzaW9uIiwic2hvd0xvZ0Zyb20iLCJqc29uIiwidmVyc2lvbiIsInNsaWNlIiwiY29uY2F0IiwiY2hhbmdlcyIsIl9yZXN1bHRzIiwiX21vYmlsZUNvbnRhaW5lciIsIl9jb250YWluZXIiLCJfcXVlcnkiLCJtYXRjaE1lZGlhIiwiX3Bvc2l0aW9uUmVzdWx0cyIsIm1hdGNoZXMiLCJvdXRwdXQiLCJfc2l6ZSIsInB1cmdlIiwiX2ZpbmdlcnByaW50cyIsIl9pdGVtcyIsIl9pbmRleCIsIm1hdGNoIiwiaW5kZXhPZiIsIl9hY3RpdmF0ZWQiLCJfdG9BY3RpdmF0ZSIsImFjdGl2YXRlIiwiX2Fib3J0T25OZXh0SXRlcmF0aW9uIiwiX2N1cnJlbnRKb2IiLCJsb2FkIiwiYWN0aW9uIiwicHJvY2VzcyIsImFib3J0Q3VycmVudCIsInNldHRpbmdzIiwiZGltZW5zaW9ucyIsIm11bHRpcGFzcyIsIm5leHRQYXNzIiwiX21haW5VaSIsIl9vdXRwdXRVaSIsIl9kb3dubG9hZEJ1dHRvblVpIiwiX2NvcHlCdXR0b25VaSIsIl9iZ0ZpbGxVaSIsIl9yZXN1bHRzVWkiLCJfc2V0dGluZ3NVaSIsIl9tYWluTWVudVVpIiwiX3RvYXN0c1VpIiwiX2Ryb3BVaSIsIl9wcmVsb2FkZXJVaSIsIl9jaGFuZ2Vsb2dVaSIsIl9yZXN1bHRzQ29udGFpbmVyVWkiLCJfdmlld1RvZ2dsZXJVaSIsIl9vblNldHRpbmdzQ2hhbmdlIiwiX29uU2V0dGluZ3NSZXNldCIsIl9oYW5kbGVFcnJvciIsIl9vblZpZXdTZWxlY3Rpb25DaGFuZ2UiLCJfb25HbG9iYWxLZXlEb3duIiwiX2lucHV0SXRlbSIsIl9jYWNoZSIsIl9sYXRlc3RDb21wcmVzc0pvYklkIiwiX3VzZXJIYXNJbnRlcmFjdGVkIiwiX3JlbG9hZGluZyIsInJlZ2lzdGVyIiwic2NvcGUiLCJfb25VcGRhdGVGb3VuZCIsInN0b3JhZ2UiLCJfbG9hZFNldHRpbmdzIiwia2V5IiwiY3RybEtleSIsIm1ldGFLZXkiLCJpbnN0YWxsaW5nIiwic3RhdGUiLCJsb2NhdGlvbiIsInJlbG9hZCIsIl9zYXZlU2V0dGluZ3MiLCJfY29tcHJlc3NTdmciLCJfaW5wdXRGaWxlbmFtZSIsIm1lc3NhZ2UiLCJhc3NpZ24iLCJvcmlnaW5hbCIsInJhbmRvbSIsIl91cGRhdGVGb3JGaWxlIiwiZ3ppcCIsImNvbXBhcmVUb0ZpbGUiXSwibWFwcGluZ3MiOiJ5QkFhQSxhQUE2QixDQUMzQixLQUFNLEdBQU8sRUFBTUEsd0JBQU4sR0FBYixDQUNBLE1BQU8sR0FBS0MsUUFBTCxDQUFjLENBQWQsQ0FDUixDQVdELGFBQWdDLENBQzlCLE1BQU8sT0FBWUMsT0FBWixDQUFvQixZQUFwQixDQUFrQyxLQUFLLElBQXZDLENBQ1IsQ0FFRCxhQUF1QyxJQUF2QyxDQUFrRCxDQUVoRCxNQURBLEdBQVMsRUFBT0MsR0FBUCxDQUFXLEtBQUssSUFBaEIsQ0FDVCxDQUFPLEVBQVFDLE1BQVIsQ0FBZSxTQUFpQixHQUFPLEdBQU8s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"}