ctrlpanel/public/js/app.js
2022-11-02 16:53:52 +00:00

588 lines
2.6 MiB
Vendored
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
/******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./node_modules/axios/index.js":
/*!*************************************!*\
!*** ./node_modules/axios/index.js ***!
\*************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("module.exports = __webpack_require__(/*! ./lib/axios */ \"./node_modules/axios/lib/axios.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvaW5kZXguanMuanMiLCJtYXBwaW5ncyI6IkFBQUEsNEZBQXVDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2luZGV4LmpzPzUzZTkiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9heGlvcycpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/index.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/adapters/xhr.js":
/*!************************************************!*\
!*** ./node_modules/axios/lib/adapters/xhr.js ***!
\************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\nvar settle = __webpack_require__(/*! ./../core/settle */ \"./node_modules/axios/lib/core/settle.js\");\nvar cookies = __webpack_require__(/*! ./../helpers/cookies */ \"./node_modules/axios/lib/helpers/cookies.js\");\nvar buildURL = __webpack_require__(/*! ./../helpers/buildURL */ \"./node_modules/axios/lib/helpers/buildURL.js\");\nvar buildFullPath = __webpack_require__(/*! ../core/buildFullPath */ \"./node_modules/axios/lib/core/buildFullPath.js\");\nvar parseHeaders = __webpack_require__(/*! ./../helpers/parseHeaders */ \"./node_modules/axios/lib/helpers/parseHeaders.js\");\nvar isURLSameOrigin = __webpack_require__(/*! ./../helpers/isURLSameOrigin */ \"./node_modules/axios/lib/helpers/isURLSameOrigin.js\");\nvar createError = __webpack_require__(/*! ../core/createError */ \"./node_modules/axios/lib/core/createError.js\");\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n var responseType = config.responseType;\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n var fullPath = buildFullPath(config.baseURL, config.url);\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n var response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(resolve, reject, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(createError('Request aborted', config, 'ECONNABORTED', request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config, null, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded';\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(createError(\n timeoutErrorMessage,\n config,\n config.transitional && config.transitional.clarifyTimeoutError ? 'ETIMEDOUT' : 'ECONNABORTED',\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken) {\n // Handle cancellation\n config.cancelToken.promise.then(function onCanceled(cancel) {\n if (!request) {\n return;\n }\n\n request.abort();\n reject(cancel);\n // Clean up request\n request = null;\n });\n }\n\n if (!requestData) {\n requestData = null;\n }\n\n // Send the request\n request.send(requestData);\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixZQUFZLG1CQUFPLENBQUMscURBQVk7QUFDaEMsYUFBYSxtQkFBTyxDQUFDLGlFQUFrQjtBQUN2QyxjQUFjLG1CQUFPLENBQUMseUVBQXNCO0FBQzVDLGVBQWUsbUJBQU8sQ0FBQywyRUFBdUI7QUFDOUMsb0JBQW9CLG1CQUFPLENBQUMsNkVBQXVCO0FBQ25ELG1CQUFtQixtQkFBTyxDQUFDLG1GQUEyQjtBQUN0RCxzQkFBc0IsbUJBQU8sQ0FBQyx5RkFBOEI7QUFDNUQsa0JBQWtCLG1CQUFPLENBQUMseUVBQXFCOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDO0FBQzdDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9hZGFwdGVycy94aHIuanM/MWE1YyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcbnZhciBzZXR0bGUgPSByZXF1aXJlKCcuLy4uL2NvcmUvc2V0dGxlJyk7XG52YXIgY29va2llcyA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9jb29raWVzJyk7XG52YXIgYnVpbGRVUkwgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvYnVpbGRVUkwnKTtcbnZhciBidWlsZEZ1bGxQYXRoID0gcmVxdWlyZSgnLi4vY29yZS9idWlsZEZ1bGxQYXRoJyk7XG52YXIgcGFyc2VIZWFkZXJzID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL3BhcnNlSGVhZGVycycpO1xudmFyIGlzVVJMU2FtZU9yaWdpbiA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9pc1VSTFNhbWVPcmlnaW4nKTtcbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJy4uL2NvcmUvY3JlYXRlRXJyb3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB4aHJBZGFwdGVyKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciByZXF1ZXN0RGF0YSA9IGNvbmZpZy5kYXRhO1xuICAgIHZhciByZXF1ZXN0SGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzO1xuICAgIHZhciByZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlO1xuXG4gICAgaWYgKHV0aWxzLmlzRm9ybURhdGEocmVxdWVzdERhdGEpKSB7XG4gICAgICBkZWxldGUgcmVxdWVzdEhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddOyAvLyBMZXQgdGhlIGJyb3dzZXIgc2V0IGl0XG4gICAgfVxuXG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgIC8vIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb25cbiAgICBpZiAoY29uZmlnLmF1dGgpIHtcbiAgICAgIHZhciB1c2VybmFtZSA9IGNvbmZpZy5hdXRoLnVzZXJuYW1lIHx8ICcnO1xuICAgICAgdmFyIHBhc3N3b3JkID0gY29uZmlnLmF1dGgucGFzc3dvcmQgPyB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoY29uZmlnLmF1dGgucGFzc3dvcmQpKSA6ICcnO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuQXV0aG9yaXphdGlvbiA9ICdCYXNpYyAnICsgYnRvYSh1c2VybmFtZSArICc6JyArIHBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICB2YXIgZnVsbFBhdGggPSBidWlsZEZ1bGxQYXRoKGNvbmZpZy5iYXNlVVJMLCBjb25maWcudXJsKTtcbiAgICByZXF1ZXN0Lm9wZW4oY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCBidWlsZFVSTChmdWxsUGF0aCwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpLCB0cnVlKTtcblxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IGluIE1TXG4gICAgcmVxdWVzdC50aW1lb3V0ID0gY29uZmlnLnRpbWVvdXQ7XG5cbiAgICBmdW5jdGlvbiBvbmxvYWRlbmQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2VcbiAgICAgIHZhciByZXNwb25zZUhlYWRlcnMgPSAnZ2V0QWxsUmVzcG9uc2VIZWFkZXJzJyBpbiByZXF1ZXN0ID8gcGFyc2VIZWFkZXJzKHJlcXVlc3QuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpIDogbnVsbDtcbiAgICAgIHZhciByZXNwb25zZURhdGEgPSAhcmVzcG9uc2VUeXBlIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnIHx8ICByZXNwb25zZVR5cGUgPT09ICdqc29uJyA/XG4gICAgICAgIHJlcXVlc3QucmVzcG9uc2VUZXh0IDogcmVxdWVzdC5yZXNwb25zZTtcbiAgICAgIHZhciByZXNwb25zZSA9IHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXF1ZXN0LnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RcbiAgICAgIH07XG5cbiAgICAgIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCdvbmxvYWRlbmQnIGluIHJlcXVlc3QpIHtcbiAgICAgIC8vIFVzZSBvbmxvYWRlbmQgaWYgYXZhaWxhYmxlXG4gICAgICByZXF1ZXN0Lm9ubG9hZGVuZCA9IG9ubG9hZGVuZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGlzdGVuIGZvciByZWFkeSBzdGF0ZSB0byBlbXVsYXRlIG9ubG9hZGVuZFxuICAgICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVMb2FkKCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QgfHwgcmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHJlcXVlc3QgZXJyb3JlZCBvdXQgYW5kIHdlIGRpZG4ndCBnZXQgYSByZXNwb25zZSwgdGhpcyB3aWxsIGJlXG4gICAgICAgIC8vIGhhbmRsZWQgYnkgb25lcnJvciBpbnN0ZWFkXG4gICAgICAgIC8vIFdpdGggb25lIGV4Y2VwdGlvbjogcmVxdWVzdCB0aGF0IHVzaW5nIGZpbGU6IHByb3RvY29sLCBtb3N0IGJyb3dzZXJzXG4gICAgICAgIC8vIHdpbGwgcmV0dXJuIHN0YXR1cyBhcyAwIGV2ZW4gdGhvdWdoIGl0J3MgYSBzdWNjZXNzZnVsIHJlcXVlc3RcbiAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAwICYmICEocmVxdWVzdC5yZXNwb25zZVVSTCAmJiByZXF1ZXN0LnJlc3BvbnNlVVJMLmluZGV4T2YoJ2ZpbGU6JykgPT09IDApKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlYWR5c3RhdGUgaGFuZGxlciBpcyBjYWxsaW5nIGJlZm9yZSBvbmVycm9yIG9yIG9udGltZW91dCBoYW5kbGVycyxcbiAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGNhbGwgb25sb2FkZW5kIG9uIHRoZSBuZXh0ICd0aWNrJ1xuICAgICAgICBzZXRUaW1lb3V0KG9ubG9hZGVuZCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBicm93c2VyIHJlcXVlc3QgY2FuY2VsbGF0aW9uIChhcyBvcHBvc2VkIHRvIGEgbWFudWFsIGNhbmNlbGxhdGlvbilcbiAgICByZXF1ZXN0Lm9uYWJvcnQgPSBmdW5jdGlvbiBoYW5kbGVBYm9ydCgpIHtcbiAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlamVjdChjcmVhdGVFcnJvcignUmVxdWVzdCBhYm9ydGVkJywgY29uZmlnLCAnRUNPTk5BQk9SVEVEJywgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIGxvdyBsZXZlbCBuZXR3b3JrIGVycm9yc1xuICAgIHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIGhhbmRsZUVycm9yKCkge1xuICAgICAgLy8gUmVhbCBlcnJvcnMgYXJlIGhpZGRlbiBmcm9tIHVzIGJ5IHRoZSBicm93c2VyXG4gICAgICAvLyBvbmVycm9yIHNob3VsZCBvbmx5IGZpcmUgaWYgaXQncyBhIG5ldHdvcmsgZXJyb3JcbiAgICAgIHJlamVjdChjcmVhdGVFcnJvcignTmV0d29yayBFcnJvcicsIGNvbmZpZywgbnVsbCwgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIHRpbWVvdXRcbiAgICByZXF1ZXN0Lm9udGltZW91dCA9IGZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoKSB7XG4gICAgICB2YXIgdGltZW91dEVycm9yTWVzc2FnZSA9ICd0aW1lb3V0IG9mICcgKyBjb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCc7XG4gICAgICBpZiAoY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IGNvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmVqZWN0KGNyZWF0ZUVycm9yKFxuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGNvbmZpZy50cmFuc2l0aW9uYWwgJiYgY29uZmlnLnRyYW5zaXRpb25hbC5jbGFyaWZ5VGltZW91dEVycm9yID8gJ0VUSU1FRE9VVCcgOiAnRUNPTk5BQk9SVEVEJyxcbiAgICAgICAgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgLy8gVGhpcyBpcyBvbmx5IGRvbmUgaWYgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gICAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cbiAgICBpZiAodXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSkge1xuICAgICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgICB2YXIgeHNyZlZhbHVlID0gKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgfHwgaXNVUkxTYW1lT3JpZ2luKGZ1bGxQYXRoKSkgJiYgY29uZmlnLnhzcmZDb29raWVOYW1lID9cbiAgICAgICAgY29va2llcy5yZWFkKGNvbmZpZy54c3JmQ29va2llTmFtZSkgOlxuICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh4c3JmVmFsdWUpIHtcbiAgICAgICAgcmVxdWVzdEhlYWRlcnNbY29uZmlnLnhzcmZIZWFkZXJOYW1lXSA9IHhzcmZWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgaGVhZGVycyB0byB0aGUgcmVxdWVzdFxuICAgIGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4gcmVxdWVzdCkge1xuICAgICAgdXRpbHMuZm9yRWFjaChyZXF1ZXN0SGVhZGVycywgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3REYXRhID09PSAndW5kZWZpbmVkJyAmJiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtdHlwZScpIHtcbiAgICAgICAgICAvLyBSZW1vdmUgQ29udGVudC1UeXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gICAgICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIGFkZCBoZWFkZXIgdG8gdGhlIHJlcXVlc3RcbiAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aENyZWRlbnRpYWxzIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChjb25maWcud2l0aENyZWRlbnRpYWxzKSkge1xuICAgICAgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSAhIWNvbmZpZy53aXRoQ3JlZGVudGlhbHM7XG4gICAgfVxuXG4gICAgLy8gQWRkIHJlc3BvbnNlVHlwZSB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmIChyZXNwb25zZVR5cGUgJiYgcmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcHJvZ3Jlc3MgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBjb25maWcub25Eb3dubG9hZFByb2dyZXNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgY29uZmlnLm9uRG93bmxvYWRQcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgLy8gTm90IGFsbCBicm93c2VycyBzdXBwb3J0IHVwbG9hZCBldmVudHNcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5vblVwbG9hZFByb2dyZXNzID09PSAnZnVuY3Rpb24nICYmIHJlcXVlc3QudXBsb2FkKSB7XG4gICAgICByZXF1ZXN0LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGNvbmZpZy5vblVwbG9hZFByb2dyZXNzKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgICAvLyBIYW5kbGUgY2FuY2VsbGF0aW9uXG4gICAgICBjb25maWcuY2FuY2VsVG9rZW4ucHJvbWlzZS50aGVuKGZ1bmN0aW9uIG9uQ2FuY2VsZWQoY2FuY2VsKSB7XG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcXVlc3QuYWJvcnQoKTtcbiAgICAgICAgcmVqZWN0KGNhbmNlbCk7XG4gICAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXJlcXVlc3REYXRhKSB7XG4gICAgICByZXF1ZXN0RGF0YSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gU2VuZCB0aGUgcmVxdWVzdFxuICAgIHJlcXVlc3Quc2VuZChyZXF1ZXN0RGF0YSk7XG4gIH0pO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/adapters/xhr.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/axios.js":
/*!*****************************************!*\
!*** ./node_modules/axios/lib/axios.js ***!
\*****************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./utils */ \"./node_modules/axios/lib/utils.js\");\nvar bind = __webpack_require__(/*! ./helpers/bind */ \"./node_modules/axios/lib/helpers/bind.js\");\nvar Axios = __webpack_require__(/*! ./core/Axios */ \"./node_modules/axios/lib/core/Axios.js\");\nvar mergeConfig = __webpack_require__(/*! ./core/mergeConfig */ \"./node_modules/axios/lib/core/mergeConfig.js\");\nvar defaults = __webpack_require__(/*! ./defaults */ \"./node_modules/axios/lib/defaults.js\");\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Factory for creating new instances\naxios.create = function create(instanceConfig) {\n return createInstance(mergeConfig(axios.defaults, instanceConfig));\n};\n\n// Expose Cancel & CancelToken\naxios.Cancel = __webpack_require__(/*! ./cancel/Cancel */ \"./node_modules/axios/lib/cancel/Cancel.js\");\naxios.CancelToken = __webpack_require__(/*! ./cancel/CancelToken */ \"./node_modules/axios/lib/cancel/CancelToken.js\");\naxios.isCancel = __webpack_require__(/*! ./cancel/isCancel */ \"./node_modules/axios/lib/cancel/isCancel.js\");\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = __webpack_require__(/*! ./helpers/spread */ \"./node_modules/axios/lib/helpers/spread.js\");\n\n// Expose isAxiosError\naxios.isAxiosError = __webpack_require__(/*! ./helpers/isAxiosError */ \"./node_modules/axios/lib/helpers/isAxiosError.js\");\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports[\"default\"] = axios;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2F4aW9zLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxrREFBUztBQUM3QixXQUFXLG1CQUFPLENBQUMsZ0VBQWdCO0FBQ25DLFlBQVksbUJBQU8sQ0FBQyw0REFBYztBQUNsQyxrQkFBa0IsbUJBQU8sQ0FBQyx3RUFBb0I7QUFDOUMsZUFBZSxtQkFBTyxDQUFDLHdEQUFZOztBQUVuQztBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsbUJBQU8sQ0FBQyxrRUFBaUI7QUFDeEMsb0JBQW9CLG1CQUFPLENBQUMsNEVBQXNCO0FBQ2xELGlCQUFpQixtQkFBTyxDQUFDLHNFQUFtQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG1CQUFPLENBQUMsb0VBQWtCOztBQUV6QztBQUNBLHFCQUFxQixtQkFBTyxDQUFDLGdGQUF3Qjs7QUFFckQ7O0FBRUE7QUFDQSx5QkFBc0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2F4aW9zLmpzP2ZhZDYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4vaGVscGVycy9iaW5kJyk7XG52YXIgQXhpb3MgPSByZXF1aXJlKCcuL2NvcmUvQXhpb3MnKTtcbnZhciBtZXJnZUNvbmZpZyA9IHJlcXVpcmUoJy4vY29yZS9tZXJnZUNvbmZpZycpO1xudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0Q29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdENvbmZpZykge1xuICB2YXIgY29udGV4dCA9IG5ldyBBeGlvcyhkZWZhdWx0Q29uZmlnKTtcbiAgdmFyIGluc3RhbmNlID0gYmluZChBeGlvcy5wcm90b3R5cGUucmVxdWVzdCwgY29udGV4dCk7XG5cbiAgLy8gQ29weSBheGlvcy5wcm90b3R5cGUgdG8gaW5zdGFuY2VcbiAgdXRpbHMuZXh0ZW5kKGluc3RhbmNlLCBBeGlvcy5wcm90b3R5cGUsIGNvbnRleHQpO1xuXG4gIC8vIENvcHkgY29udGV4dCB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIGNvbnRleHQpO1xuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuLy8gQ3JlYXRlIHRoZSBkZWZhdWx0IGluc3RhbmNlIHRvIGJlIGV4cG9ydGVkXG52YXIgYXhpb3MgPSBjcmVhdGVJbnN0YW5jZShkZWZhdWx0cyk7XG5cbi8vIEV4cG9zZSBBeGlvcyBjbGFzcyB0byBhbGxvdyBjbGFzcyBpbmhlcml0YW5jZVxuYXhpb3MuQXhpb3MgPSBBeGlvcztcblxuLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlc1xuYXhpb3MuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGluc3RhbmNlQ29uZmlnKSB7XG4gIHJldHVybiBjcmVhdGVJbnN0YW5jZShtZXJnZUNvbmZpZyhheGlvcy5kZWZhdWx0cywgaW5zdGFuY2VDb25maWcpKTtcbn07XG5cbi8vIEV4cG9zZSBDYW5jZWwgJiBDYW5jZWxUb2tlblxuYXhpb3MuQ2FuY2VsID0gcmVxdWlyZSgnLi9jYW5jZWwvQ2FuY2VsJyk7XG5heGlvcy5DYW5jZWxUb2tlbiA9IHJlcXVpcmUoJy4vY2FuY2VsL0NhbmNlbFRva2VuJyk7XG5heGlvcy5pc0NhbmNlbCA9IHJlcXVpcmUoJy4vY2FuY2VsL2lzQ2FuY2VsJyk7XG5cbi8vIEV4cG9zZSBhbGwvc3ByZWFkXG5heGlvcy5hbGwgPSBmdW5jdGlvbiBhbGwocHJvbWlzZXMpIHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn07XG5heGlvcy5zcHJlYWQgPSByZXF1aXJlKCcuL2hlbHBlcnMvc3ByZWFkJyk7XG5cbi8vIEV4cG9zZSBpc0F4aW9zRXJyb3JcbmF4aW9zLmlzQXhpb3NFcnJvciA9IHJlcXVpcmUoJy4vaGVscGVycy9pc0F4aW9zRXJyb3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBheGlvcztcblxuLy8gQWxsb3cgdXNlIG9mIGRlZmF1bHQgaW1wb3J0IHN5bnRheCBpbiBUeXBlU2NyaXB0XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gYXhpb3M7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/axios.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/cancel/Cancel.js":
/*!*************************************************!*\
!*** ./node_modules/axios/lib/cancel/Cancel.js ***!
\*************************************************/
/***/ ((module) => {
"use strict";
eval("\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWwuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvQ2FuY2VsLmpzP2QyYTIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEEgYENhbmNlbGAgaXMgYW4gb2JqZWN0IHRoYXQgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIGNhbmNlbGVkLlxuICpcbiAqIEBjbGFzc1xuICogQHBhcmFtIHtzdHJpbmc9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBDYW5jZWwobWVzc2FnZSkge1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xufVxuXG5DYW5jZWwucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiAnQ2FuY2VsJyArICh0aGlzLm1lc3NhZ2UgPyAnOiAnICsgdGhpcy5tZXNzYWdlIDogJycpO1xufTtcblxuQ2FuY2VsLnByb3RvdHlwZS5fX0NBTkNFTF9fID0gdHJ1ZTtcblxubW9kdWxlLmV4cG9ydHMgPSBDYW5jZWw7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/cancel/Cancel.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/cancel/CancelToken.js":
/*!******************************************************!*\
!*** ./node_modules/axios/lib/cancel/CancelToken.js ***!
\******************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar Cancel = __webpack_require__(/*! ./Cancel */ \"./node_modules/axios/lib/cancel/Cancel.js\");\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixhQUFhLG1CQUFPLENBQUMsMkRBQVU7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL0NhbmNlbFRva2VuLmpzPzcyYzgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2FuY2VsID0gcmVxdWlyZSgnLi9DYW5jZWwnKTtcblxuLyoqXG4gKiBBIGBDYW5jZWxUb2tlbmAgaXMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgYW4gb3BlcmF0aW9uLlxuICpcbiAqIEBjbGFzc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZXhlY3V0b3IgVGhlIGV4ZWN1dG9yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBDYW5jZWxUb2tlbihleGVjdXRvcikge1xuICBpZiAodHlwZW9mIGV4ZWN1dG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgdmFyIHJlc29sdmVQcm9taXNlO1xuICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiBwcm9taXNlRXhlY3V0b3IocmVzb2x2ZSkge1xuICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgfSk7XG5cbiAgdmFyIHRva2VuID0gdGhpcztcbiAgZXhlY3V0b3IoZnVuY3Rpb24gY2FuY2VsKG1lc3NhZ2UpIHtcbiAgICBpZiAodG9rZW4ucmVhc29uKSB7XG4gICAgICAvLyBDYW5jZWxsYXRpb24gaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0b2tlbi5yZWFzb24gPSBuZXcgQ2FuY2VsKG1lc3NhZ2UpO1xuICAgIHJlc29sdmVQcm9taXNlKHRva2VuLnJlYXNvbik7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKi9cbkNhbmNlbFRva2VuLnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkID0gZnVuY3Rpb24gdGhyb3dJZlJlcXVlc3RlZCgpIHtcbiAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgdGhyb3cgdGhpcy5yZWFzb247XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG5ldyBgQ2FuY2VsVG9rZW5gIGFuZCBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLFxuICogY2FuY2VscyB0aGUgYENhbmNlbFRva2VuYC5cbiAqL1xuQ2FuY2VsVG9rZW4uc291cmNlID0gZnVuY3Rpb24gc291cmNlKCkge1xuICB2YXIgY2FuY2VsO1xuICB2YXIgdG9rZW4gPSBuZXcgQ2FuY2VsVG9rZW4oZnVuY3Rpb24gZXhlY3V0b3IoYykge1xuICAgIGNhbmNlbCA9IGM7XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIHRva2VuOiB0b2tlbixcbiAgICBjYW5jZWw6IGNhbmNlbFxuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDYW5jZWxUb2tlbjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/cancel/CancelToken.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/cancel/isCancel.js":
/*!***************************************************!*\
!*** ./node_modules/axios/lib/cancel/isCancel.js ***!
\***************************************************/
/***/ ((module) => {
"use strict";
eval("\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcz9jMTdhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0NhbmNlbCh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/cancel/isCancel.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/core/Axios.js":
/*!**********************************************!*\
!*** ./node_modules/axios/lib/core/Axios.js ***!
\**********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\nvar buildURL = __webpack_require__(/*! ../helpers/buildURL */ \"./node_modules/axios/lib/helpers/buildURL.js\");\nvar InterceptorManager = __webpack_require__(/*! ./InterceptorManager */ \"./node_modules/axios/lib/core/InterceptorManager.js\");\nvar dispatchRequest = __webpack_require__(/*! ./dispatchRequest */ \"./node_modules/axios/lib/core/dispatchRequest.js\");\nvar mergeConfig = __webpack_require__(/*! ./mergeConfig */ \"./node_modules/axios/lib/core/mergeConfig.js\");\nvar validator = __webpack_require__(/*! ../helpers/validator */ \"./node_modules/axios/lib/helpers/validator.js\");\n\nvar validators = validator.validators;\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof config === 'string') {\n config = arguments[1] || {};\n config.url = arguments[0];\n } else {\n config = config || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n // Set config.method\n if (config.method) {\n config.method = config.method.toLowerCase();\n } else if (this.defaults.method) {\n config.method = this.defaults.method.toLowerCase();\n } else {\n config.method = 'get';\n }\n\n var transitional = config.transitional;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean, '1.0.0'),\n forcedJSONParsing: validators.transitional(validators.boolean, '1.0.0'),\n clarifyTimeoutError: validators.transitional(validators.boolean, '1.0.0')\n }, false);\n }\n\n // filter out skipped interceptors\n var requestInterceptorChain = [];\n var synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n var responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n var promise;\n\n if (!synchronousRequestInterceptors) {\n var chain = [dispatchRequest, undefined];\n\n Array.prototype.unshift.apply(chain, requestInterceptorChain);\n chain = chain.concat(responseInterceptorChain);\n\n promise = Promise.resolve(config);\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n }\n\n\n var newConfig = config;\n while (requestInterceptorChain.length) {\n var onFulfilled = requestInterceptorChain.shift();\n var onRejected = requestInterceptorChain.shift();\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected(error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest(newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n while (responseInterceptorChain.length) {\n promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());\n }\n\n return promise;\n};\n\nAxios.prototype.getUri = function getUri(config) {\n config = mergeConfig(this.defaults, config);\n return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\\?/, '');\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n url: url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\n\nmodule.exports = Axios;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3MuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsWUFBWSxtQkFBTyxDQUFDLHFEQUFZO0FBQ2hDLGVBQWUsbUJBQU8sQ0FBQyx5RUFBcUI7QUFDNUMseUJBQXlCLG1CQUFPLENBQUMsaUZBQXNCO0FBQ3ZELHNCQUFzQixtQkFBTyxDQUFDLDJFQUFtQjtBQUNqRCxrQkFBa0IsbUJBQU8sQ0FBQyxtRUFBZTtBQUN6QyxnQkFBZ0IsbUJBQU8sQ0FBQywyRUFBc0I7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLEtBQUs7QUFDTDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7O0FBRUQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3MuanM/MjlmYiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcbnZhciBidWlsZFVSTCA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvYnVpbGRVUkwnKTtcbnZhciBJbnRlcmNlcHRvck1hbmFnZXIgPSByZXF1aXJlKCcuL0ludGVyY2VwdG9yTWFuYWdlcicpO1xudmFyIGRpc3BhdGNoUmVxdWVzdCA9IHJlcXVpcmUoJy4vZGlzcGF0Y2hSZXF1ZXN0Jyk7XG52YXIgbWVyZ2VDb25maWcgPSByZXF1aXJlKCcuL21lcmdlQ29uZmlnJyk7XG52YXIgdmFsaWRhdG9yID0gcmVxdWlyZSgnLi4vaGVscGVycy92YWxpZGF0b3InKTtcblxudmFyIHZhbGlkYXRvcnMgPSB2YWxpZGF0b3IudmFsaWRhdG9ycztcbi8qKlxuICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlQ29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIEF4aW9zKGluc3RhbmNlQ29uZmlnKSB7XG4gIHRoaXMuZGVmYXVsdHMgPSBpbnN0YW5jZUNvbmZpZztcbiAgdGhpcy5pbnRlcmNlcHRvcnMgPSB7XG4gICAgcmVxdWVzdDogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpLFxuICAgIHJlc3BvbnNlOiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKClcbiAgfTtcbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcgc3BlY2lmaWMgZm9yIHRoaXMgcmVxdWVzdCAobWVyZ2VkIHdpdGggdGhpcy5kZWZhdWx0cylcbiAqL1xuQXhpb3MucHJvdG90eXBlLnJlcXVlc3QgPSBmdW5jdGlvbiByZXF1ZXN0KGNvbmZpZykge1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgLy8gQWxsb3cgZm9yIGF4aW9zKCdleGFtcGxlL3VybCdbLCBjb25maWddKSBhIGxhIGZldGNoIEFQSVxuICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25maWcgPSBhcmd1bWVudHNbMV0gfHwge307XG4gICAgY29uZmlnLnVybCA9IGFyZ3VtZW50c1swXTtcbiAgfSBlbHNlIHtcbiAgICBjb25maWcgPSBjb25maWcgfHwge307XG4gIH1cblxuICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuXG4gIC8vIFNldCBjb25maWcubWV0aG9kXG4gIGlmIChjb25maWcubWV0aG9kKSB7XG4gICAgY29uZmlnLm1ldGhvZCA9IGNvbmZpZy5tZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgfSBlbHNlIGlmICh0aGlzLmRlZmF1bHRzLm1ldGhvZCkge1xuICAgIGNvbmZpZy5tZXRob2QgPSB0aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICB9IGVsc2Uge1xuICAgIGNvbmZpZy5tZXRob2QgPSAnZ2V0JztcbiAgfVxuXG4gIHZhciB0cmFuc2l0aW9uYWwgPSBjb25maWcudHJhbnNpdGlvbmFsO1xuXG4gIGlmICh0cmFuc2l0aW9uYWwgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKHRyYW5zaXRpb25hbCwge1xuICAgICAgc2lsZW50SlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiwgJzEuMC4wJyksXG4gICAgICBmb3JjZWRKU09OUGFyc2luZzogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuLCAnMS4wLjAnKSxcbiAgICAgIGNsYXJpZnlUaW1lb3V0RXJyb3I6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiwgJzEuMC4wJylcbiAgICB9LCBmYWxzZSk7XG4gIH1cblxuICAvLyBmaWx0ZXIgb3V0IHNraXBwZWQgaW50ZXJjZXB0b3JzXG4gIHZhciByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbiA9IFtdO1xuICB2YXIgc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzID0gdHJ1ZTtcbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBpbnRlcmNlcHRvci5ydW5XaGVuID09PSAnZnVuY3Rpb24nICYmIGludGVyY2VwdG9yLnJ1bldoZW4oY29uZmlnKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgPSBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3Iuc3luY2hyb25vdXM7XG5cbiAgICByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi51bnNoaWZ0KGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICB9KTtcblxuICB2YXIgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluID0gW107XG4gIHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24gcHVzaFJlc3BvbnNlSW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLnB1c2goaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gIH0pO1xuXG4gIHZhciBwcm9taXNlO1xuXG4gIGlmICghc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzKSB7XG4gICAgdmFyIGNoYWluID0gW2Rpc3BhdGNoUmVxdWVzdCwgdW5kZWZpbmVkXTtcblxuICAgIEFycmF5LnByb3RvdHlwZS51bnNoaWZ0LmFwcGx5KGNoYWluLCByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbik7XG4gICAgY2hhaW4gPSBjaGFpbi5jb25jYXQocmVzcG9uc2VJbnRlcmNlcHRvckNoYWluKTtcblxuICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoY29uZmlnKTtcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoKSB7XG4gICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGNoYWluLnNoaWZ0KCksIGNoYWluLnNoaWZ0KCkpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cblxuICB2YXIgbmV3Q29uZmlnID0gY29uZmlnO1xuICB3aGlsZSAocmVxdWVzdEludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoKSB7XG4gICAgdmFyIG9uRnVsZmlsbGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4uc2hpZnQoKTtcbiAgICB2YXIgb25SZWplY3RlZCA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLnNoaWZ0KCk7XG4gICAgdHJ5IHtcbiAgICAgIG5ld0NvbmZpZyA9IG9uRnVsZmlsbGVkKG5ld0NvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIG9uUmVqZWN0ZWQoZXJyb3IpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBwcm9taXNlID0gZGlzcGF0Y2hSZXF1ZXN0KG5ld0NvbmZpZyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgfVxuXG4gIHdoaWxlIChyZXNwb25zZUludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoKSB7XG4gICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihyZXNwb25zZUludGVyY2VwdG9yQ2hhaW4uc2hpZnQoKSwgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLnNoaWZ0KCkpO1xuICB9XG5cbiAgcmV0dXJuIHByb21pc2U7XG59O1xuXG5BeGlvcy5wcm90b3R5cGUuZ2V0VXJpID0gZnVuY3Rpb24gZ2V0VXJpKGNvbmZpZykge1xuICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuICByZXR1cm4gYnVpbGRVUkwoY29uZmlnLnVybCwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cXD8vLCAnJyk7XG59O1xuXG4vLyBQcm92aWRlIGFsaWFzZXMgZm9yIHN1cHBvcnRlZCByZXF1ZXN0IG1ldGhvZHNcbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucyddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kTm9EYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKHVybCwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgdXJsOiB1cmwsXG4gICAgICBkYXRhOiAoY29uZmlnIHx8IHt9KS5kYXRhXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24odXJsLCBkYXRhLCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG1lcmdlQ29uZmlnKGNvbmZpZyB8fCB7fSwge1xuICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICB1cmw6IHVybCxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KSk7XG4gIH07XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBeGlvcztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/Axios.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/core/InterceptorManager.js":
/*!***********************************************************!*\
!*** ./node_modules/axios/lib/core/InterceptorManager.js ***!
\***********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvSW50ZXJjZXB0b3JNYW5hZ2VyLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxxREFBWTs7QUFFaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFVBQVU7QUFDckI7QUFDQSxZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvSW50ZXJjZXB0b3JNYW5hZ2VyLmpzP2M3OTIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIEludGVyY2VwdG9yTWFuYWdlcigpIHtcbiAgdGhpcy5oYW5kbGVycyA9IFtdO1xufVxuXG4vKipcbiAqIEFkZCBhIG5ldyBpbnRlcmNlcHRvciB0byB0aGUgc3RhY2tcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdWxmaWxsZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgdGhlbmAgZm9yIGEgYFByb21pc2VgXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3RlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGByZWplY3RgIGZvciBhIGBQcm9taXNlYFxuICpcbiAqIEByZXR1cm4ge051bWJlcn0gQW4gSUQgdXNlZCB0byByZW1vdmUgaW50ZXJjZXB0b3IgbGF0ZXJcbiAqL1xuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbiB1c2UoZnVsZmlsbGVkLCByZWplY3RlZCwgb3B0aW9ucykge1xuICB0aGlzLmhhbmRsZXJzLnB1c2goe1xuICAgIGZ1bGZpbGxlZDogZnVsZmlsbGVkLFxuICAgIHJlamVjdGVkOiByZWplY3RlZCxcbiAgICBzeW5jaHJvbm91czogb3B0aW9ucyA/IG9wdGlvbnMuc3luY2hyb25vdXMgOiBmYWxzZSxcbiAgICBydW5XaGVuOiBvcHRpb25zID8gb3B0aW9ucy5ydW5XaGVuIDogbnVsbFxuICB9KTtcbiAgcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoIC0gMTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFuIGludGVyY2VwdG9yIGZyb20gdGhlIHN0YWNrXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGlkIFRoZSBJRCB0aGF0IHdhcyByZXR1cm5lZCBieSBgdXNlYFxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLmVqZWN0ID0gZnVuY3Rpb24gZWplY3QoaWQpIHtcbiAgaWYgKHRoaXMuaGFuZGxlcnNbaWRdKSB7XG4gICAgdGhpcy5oYW5kbGVyc1tpZF0gPSBudWxsO1xuICB9XG59O1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzXG4gKlxuICogVGhpcyBtZXRob2QgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3Igc2tpcHBpbmcgb3ZlciBhbnlcbiAqIGludGVyY2VwdG9ycyB0aGF0IG1heSBoYXZlIGJlY29tZSBgbnVsbGAgY2FsbGluZyBgZWplY3RgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGludGVyY2VwdG9yXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIGZvckVhY2goZm4pIHtcbiAgdXRpbHMuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLCBmdW5jdGlvbiBmb3JFYWNoSGFuZGxlcihoKSB7XG4gICAgaWYgKGggIT09IG51bGwpIHtcbiAgICAgIGZuKGgpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEludGVyY2VwdG9yTWFuYWdlcjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/InterceptorManager.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/core/buildFullPath.js":
/*!******************************************************!*\
!*** ./node_modules/axios/lib/core/buildFullPath.js ***!
\******************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar isAbsoluteURL = __webpack_require__(/*! ../helpers/isAbsoluteURL */ \"./node_modules/axios/lib/helpers/isAbsoluteURL.js\");\nvar combineURLs = __webpack_require__(/*! ../helpers/combineURLs */ \"./node_modules/axios/lib/helpers/combineURLs.js\");\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n * @returns {string} The combined full path\n */\nmodule.exports = function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvYnVpbGRGdWxsUGF0aC5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixvQkFBb0IsbUJBQU8sQ0FBQyxtRkFBMEI7QUFDdEQsa0JBQWtCLG1CQUFPLENBQUMsK0VBQXdCOztBQUVsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvYnVpbGRGdWxsUGF0aC5qcz9mMDJkIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGlzQWJzb2x1dGVVUkwgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwnKTtcbnZhciBjb21iaW5lVVJMcyA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvY29tYmluZVVSTHMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFVSTCBieSBjb21iaW5pbmcgdGhlIGJhc2VVUkwgd2l0aCB0aGUgcmVxdWVzdGVkVVJMLFxuICogb25seSB3aGVuIHRoZSByZXF1ZXN0ZWRVUkwgaXMgbm90IGFscmVhZHkgYW4gYWJzb2x1dGUgVVJMLlxuICogSWYgdGhlIHJlcXVlc3RVUkwgaXMgYWJzb2x1dGUsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVxdWVzdGVkVVJMIHVudG91Y2hlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZXF1ZXN0ZWRVUkwgQWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGNvbWJpbmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBmdWxsIHBhdGhcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBidWlsZEZ1bGxQYXRoKGJhc2VVUkwsIHJlcXVlc3RlZFVSTCkge1xuICBpZiAoYmFzZVVSTCAmJiAhaXNBYnNvbHV0ZVVSTChyZXF1ZXN0ZWRVUkwpKSB7XG4gICAgcmV0dXJuIGNvbWJpbmVVUkxzKGJhc2VVUkwsIHJlcXVlc3RlZFVSTCk7XG4gIH1cbiAgcmV0dXJuIHJlcXVlc3RlZFVSTDtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/buildFullPath.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/core/createError.js":
/*!****************************************************!*\
!*** ./node_modules/axios/lib/core/createError.js ***!
\****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar enhanceError = __webpack_require__(/*! ./enhanceError */ \"./node_modules/axios/lib/core/enhanceError.js\");\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, request, response);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvY3JlYXRlRXJyb3IuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsbUJBQW1CLG1CQUFPLENBQUMscUVBQWdCOztBQUUzQztBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2NyZWF0ZUVycm9yLmpzPzc3MGMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW5oYW5jZUVycm9yID0gcmVxdWlyZSgnLi9lbmhhbmNlRXJyb3InKTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIGNvbmZpZywgZXJyb3IgY29kZSwgcmVxdWVzdCBhbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlRXJyb3IobWVzc2FnZSwgY29uZmlnLCBjb2RlLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBlbmhhbmNlRXJyb3IoZXJyb3IsIGNvbmZpZywgY29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/createError.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/core/dispatchRequest.js":
/*!********************************************************!*\
!*** ./node_modules/axios/lib/core/dispatchRequest.js ***!
\********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\nvar transformData = __webpack_require__(/*! ./transformData */ \"./node_modules/axios/lib/core/transformData.js\");\nvar isCancel = __webpack_require__(/*! ../cancel/isCancel */ \"./node_modules/axios/lib/cancel/isCancel.js\");\nvar defaults = __webpack_require__(/*! ../defaults */ \"./node_modules/axios/lib/defaults.js\");\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZGlzcGF0Y2hSZXF1ZXN0LmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxxREFBWTtBQUNoQyxvQkFBb0IsbUJBQU8sQ0FBQyx1RUFBaUI7QUFDN0MsZUFBZSxtQkFBTyxDQUFDLHVFQUFvQjtBQUMzQyxlQUFlLG1CQUFPLENBQUMseURBQWE7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CLHVDQUF1QztBQUN2QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZGlzcGF0Y2hSZXF1ZXN0LmpzPzRkYzkiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgdHJhbnNmb3JtRGF0YSA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtRGF0YScpO1xudmFyIGlzQ2FuY2VsID0gcmVxdWlyZSgnLi4vY2FuY2VsL2lzQ2FuY2VsJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuLi9kZWZhdWx0cycpO1xuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKSB7XG4gIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICBjb25maWcuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgYWRhcHRlci5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRpc3BhdGNoUmVxdWVzdChjb25maWcpIHtcbiAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gIC8vIEVuc3VyZSBoZWFkZXJzIGV4aXN0XG4gIGNvbmZpZy5oZWFkZXJzID0gY29uZmlnLmhlYWRlcnMgfHwge307XG5cbiAgLy8gVHJhbnNmb3JtIHJlcXVlc3QgZGF0YVxuICBjb25maWcuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICBjb25maWcsXG4gICAgY29uZmlnLmRhdGEsXG4gICAgY29uZmlnLmhlYWRlcnMsXG4gICAgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3RcbiAgKTtcblxuICAvLyBGbGF0dGVuIGhlYWRlcnNcbiAgY29uZmlnLmhlYWRlcnMgPSB1dGlscy5tZXJnZShcbiAgICBjb25maWcuaGVhZGVycy5jb21tb24gfHwge30sXG4gICAgY29uZmlnLmhlYWRlcnNbY29uZmlnLm1ldGhvZF0gfHwge30sXG4gICAgY29uZmlnLmhlYWRlcnNcbiAgKTtcblxuICB1dGlscy5mb3JFYWNoKFxuICAgIFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJywgJ2NvbW1vbiddLFxuICAgIGZ1bmN0aW9uIGNsZWFuSGVhZGVyQ29uZmlnKG1ldGhvZCkge1xuICAgICAgZGVsZXRlIGNvbmZpZy5oZWFkZXJzW21ldGhvZF07XG4gICAgfVxuICApO1xuXG4gIHZhciBhZGFwdGVyID0gY29uZmlnLmFkYXB0ZXIgfHwgZGVmYXVsdHMuYWRhcHRlcjtcblxuICByZXR1cm4gYWRhcHRlcihjb25maWcpLnRoZW4oZnVuY3Rpb24gb25BZGFwdGVyUmVzb2x1dGlvbihyZXNwb25zZSkge1xuICAgIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgcmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICAgIGNvbmZpZyxcbiAgICAgIHJlc3BvbnNlLmRhdGEsXG4gICAgICByZXNwb25zZS5oZWFkZXJzLFxuICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlXG4gICAgKTtcblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfSwgZnVuY3Rpb24gb25BZGFwdGVyUmVqZWN0aW9uKHJlYXNvbikge1xuICAgIGlmICghaXNDYW5jZWwocmVhc29uKSkge1xuICAgICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgICAgaWYgKHJlYXNvbiAmJiByZWFzb24ucmVzcG9uc2UpIHtcbiAgICAgICAgcmVhc29uLnJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIHJlYXNvbi5yZXNwb25zZS5kYXRhLFxuICAgICAgICAgIHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzLFxuICAgICAgICAgIGNvbmZpZy50cmFuc2Zvcm1SZXNwb25zZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZWFzb24pO1xuICB9KTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/dispatchRequest.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/core/enhanceError.js":
/*!*****************************************************!*\
!*** ./node_modules/axios/lib/core/enhanceError.js ***!
\*****************************************************/
/***/ ((module) => {
"use strict";
eval("\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n\n error.request = request;\n error.response = response;\n error.isAxiosError = true;\n\n error.toJSON = function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code\n };\n };\n return error;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZW5oYW5jZUVycm9yLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9lbmhhbmNlRXJyb3IuanM/MGRmMyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXBkYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBjb25maWcsIGVycm9yIGNvZGUsIGFuZCByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciBUaGUgZXJyb3IgdG8gdXBkYXRlLlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW3Jlc3BvbnNlXSBUaGUgcmVzcG9uc2UuXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBlcnJvci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBlbmhhbmNlRXJyb3IoZXJyb3IsIGNvbmZpZywgY29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgZXJyb3IuY29uZmlnID0gY29uZmlnO1xuICBpZiAoY29kZSkge1xuICAgIGVycm9yLmNvZGUgPSBjb2RlO1xuICB9XG5cbiAgZXJyb3IucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIGVycm9yLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gIGVycm9yLmlzQXhpb3NFcnJvciA9IHRydWU7XG5cbiAgZXJyb3IudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvLyBTdGFuZGFyZFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgLy8gTWljcm9zb2Z0XG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIG51bWJlcjogdGhpcy5udW1iZXIsXG4gICAgICAvLyBNb3ppbGxhXG4gICAgICBmaWxlTmFtZTogdGhpcy5maWxlTmFtZSxcbiAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcbiAgICAgIGNvbHVtbk51bWJlcjogdGhpcy5jb2x1bW5OdW1iZXIsXG4gICAgICBzdGFjazogdGhpcy5zdGFjayxcbiAgICAgIC8vIEF4aW9zXG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgY29kZTogdGhpcy5jb2RlXG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIGVycm9yO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/enhanceError.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/core/mergeConfig.js":
/*!****************************************************!*\
!*** ./node_modules/axios/lib/core/mergeConfig.js ***!
\****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ../utils */ \"./node_modules/axios/lib/utils.js\");\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n * @returns {Object} New object resulting from merging config2 to config1\n */\nmodule.exports = function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n var config = {};\n\n var valueFromConfig2Keys = ['url', 'method', 'data'];\n var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy', 'params'];\n var defaultToConfig2Keys = [\n 'baseURL', 'transformRequest', 'transformResponse', 'paramsSerializer',\n 'timeout', 'timeoutMessage', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName',\n 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'decompress',\n 'maxContentLength', 'maxBodyLength', 'maxRedirects', 'transport', 'httpAgent',\n 'httpsAgent', 'cancelToken', 'socketPath', 'responseEncoding'\n ];\n var directMergeKeys = ['validateStatus'];\n\n function getMergedValue(target, source) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge(target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n function mergeDeepProperties(prop) {\n if (!utils.isUndefined(config2[prop])) {\n config[prop] = getMergedValue(config1[prop], config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n config[prop] = getMergedValue(undefined, config1[prop]);\n }\n }\n\n utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n config[prop] = getMergedValue(undefined, config2[prop]);\n }\n });\n\n utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties);\n\n utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n config[prop] = getMergedValue(undefined, config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n config[prop] = getMergedValue(undefined, config1[prop]);\n }\n });\n\n utils.forEach(directMergeKeys, function merge(prop) {\n if (prop in config2) {\n config[prop] = getMergedValue(config1[prop], config2[prop]);\n } else if (prop in config1) {\n config[prop] = getMergedValue(undefined, config1[prop]);\n }\n });\n\n var axiosKeys = valueFromConfig2Keys\n .concat(mergeDeepPropertiesKeys)\n .concat(defaultToConfig2Keys)\n .concat(directMergeKeys);\n\n var otherKeys = Object\n .keys(config1)\n .concat(Object.keys(config2))\n .filter(function filterAxiosKeys(key) {\n return axiosKeys.indexOf(key) === -1;\n });\n\n utils.forEach(otherKeys, mergeDeepProperties);\n\n return config;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvbWVyZ2VDb25maWcuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsWUFBWSxtQkFBTyxDQUFDLG1EQUFVOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLDJCQUEyQjtBQUMzQixNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL21lcmdlQ29uZmlnLmpzP2JkMTMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG4vKipcbiAqIENvbmZpZy1zcGVjaWZpYyBtZXJnZS1mdW5jdGlvbiB3aGljaCBjcmVhdGVzIGEgbmV3IGNvbmZpZy1vYmplY3RcbiAqIGJ5IG1lcmdpbmcgdHdvIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB0b2dldGhlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMVxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzJcbiAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBvYmplY3QgcmVzdWx0aW5nIGZyb20gbWVyZ2luZyBjb25maWcyIHRvIGNvbmZpZzFcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtZXJnZUNvbmZpZyhjb25maWcxLCBjb25maWcyKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBjb25maWcyID0gY29uZmlnMiB8fCB7fTtcbiAgdmFyIGNvbmZpZyA9IHt9O1xuXG4gIHZhciB2YWx1ZUZyb21Db25maWcyS2V5cyA9IFsndXJsJywgJ21ldGhvZCcsICdkYXRhJ107XG4gIHZhciBtZXJnZURlZXBQcm9wZXJ0aWVzS2V5cyA9IFsnaGVhZGVycycsICdhdXRoJywgJ3Byb3h5JywgJ3BhcmFtcyddO1xuICB2YXIgZGVmYXVsdFRvQ29uZmlnMktleXMgPSBbXG4gICAgJ2Jhc2VVUkwnLCAndHJhbnNmb3JtUmVxdWVzdCcsICd0cmFuc2Zvcm1SZXNwb25zZScsICdwYXJhbXNTZXJpYWxpemVyJyxcbiAgICAndGltZW91dCcsICd0aW1lb3V0TWVzc2FnZScsICd3aXRoQ3JlZGVudGlhbHMnLCAnYWRhcHRlcicsICdyZXNwb25zZVR5cGUnLCAneHNyZkNvb2tpZU5hbWUnLFxuICAgICd4c3JmSGVhZGVyTmFtZScsICdvblVwbG9hZFByb2dyZXNzJywgJ29uRG93bmxvYWRQcm9ncmVzcycsICdkZWNvbXByZXNzJyxcbiAgICAnbWF4Q29udGVudExlbmd0aCcsICdtYXhCb2R5TGVuZ3RoJywgJ21heFJlZGlyZWN0cycsICd0cmFuc3BvcnQnLCAnaHR0cEFnZW50JyxcbiAgICAnaHR0cHNBZ2VudCcsICdjYW5jZWxUb2tlbicsICdzb2NrZXRQYXRoJywgJ3Jlc3BvbnNlRW5jb2RpbmcnXG4gIF07XG4gIHZhciBkaXJlY3RNZXJnZUtleXMgPSBbJ3ZhbGlkYXRlU3RhdHVzJ107XG5cbiAgZnVuY3Rpb24gZ2V0TWVyZ2VkVmFsdWUodGFyZ2V0LCBzb3VyY2UpIHtcbiAgICBpZiAodXRpbHMuaXNQbGFpbk9iamVjdCh0YXJnZXQpICYmIHV0aWxzLmlzUGxhaW5PYmplY3Qoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHV0aWxzLm1lcmdlKHRhcmdldCwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3Qoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHV0aWxzLm1lcmdlKHt9LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gc291cmNlLnNsaWNlKCk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZURlZXBQcm9wZXJ0aWVzKHByb3ApIHtcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZzJbcHJvcF0pKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBnZXRNZXJnZWRWYWx1ZShjb25maWcxW3Byb3BdLCBjb25maWcyW3Byb3BdKTtcbiAgICB9IGVsc2UgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChjb25maWcxW3Byb3BdKSkge1xuICAgICAgY29uZmlnW3Byb3BdID0gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBjb25maWcxW3Byb3BdKTtcbiAgICB9XG4gIH1cblxuICB1dGlscy5mb3JFYWNoKHZhbHVlRnJvbUNvbmZpZzJLZXlzLCBmdW5jdGlvbiB2YWx1ZUZyb21Db25maWcyKHByb3ApIHtcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZzJbcHJvcF0pKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGNvbmZpZzJbcHJvcF0pO1xuICAgIH1cbiAgfSk7XG5cbiAgdXRpbHMuZm9yRWFjaChtZXJnZURlZXBQcm9wZXJ0aWVzS2V5cywgbWVyZ2VEZWVwUHJvcGVydGllcyk7XG5cbiAgdXRpbHMuZm9yRWFjaChkZWZhdWx0VG9Db25maWcyS2V5cywgZnVuY3Rpb24gZGVmYXVsdFRvQ29uZmlnMihwcm9wKSB7XG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChjb25maWcyW3Byb3BdKSkge1xuICAgICAgY29uZmlnW3Byb3BdID0gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBjb25maWcyW3Byb3BdKTtcbiAgICB9IGVsc2UgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChjb25maWcxW3Byb3BdKSkge1xuICAgICAgY29uZmlnW3Byb3BdID0gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBjb25maWcxW3Byb3BdKTtcbiAgICB9XG4gIH0pO1xuXG4gIHV0aWxzLmZvckVhY2goZGlyZWN0TWVyZ2VLZXlzLCBmdW5jdGlvbiBtZXJnZShwcm9wKSB7XG4gICAgaWYgKHByb3AgaW4gY29uZmlnMikge1xuICAgICAgY29uZmlnW3Byb3BdID0gZ2V0TWVyZ2VkVmFsdWUoY29uZmlnMVtwcm9wXSwgY29uZmlnMltwcm9wXSk7XG4gICAgfSBlbHNlIGlmIChwcm9wIGluIGNvbmZpZzEpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgY29uZmlnMVtwcm9wXSk7XG4gICAgfVxuICB9KTtcblxuICB2YXIgYXhpb3NLZXlzID0gdmFsdWVGcm9tQ29uZmlnMktleXNcbiAgICAuY29uY2F0KG1lcmdlRGVlcFByb3BlcnRpZXNLZXlzKVxuICAgIC5jb25jYXQoZGVmYXVsdFRvQ29uZmlnMktleXMpXG4gICAgLmNvbmNhdChkaXJlY3RNZXJnZUtleXMpO1xuXG4gIHZhciBvdGhlcktleXMgPSBPYmplY3RcbiAgICAua2V5cyhjb25maWcxKVxuICAgIC5jb25jYXQoT2JqZWN0LmtleXMoY29uZmlnMikpXG4gICAgLmZpbHRlcihmdW5jdGlvbiBmaWx0ZXJBeGlvc0tleXMoa2V5KSB7XG4gICAgICByZXR1cm4gYXhpb3NLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTE7XG4gICAgfSk7XG5cbiAgdXRpbHMuZm9yRWFjaChvdGhlcktleXMsIG1lcmdlRGVlcFByb3BlcnRpZXMpO1xuXG4gIHJldHVybiBjb25maWc7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/mergeConfig.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/core/settle.js":
/*!***********************************************!*\
!*** ./node_modules/axios/lib/core/settle.js ***!
\***********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar createError = __webpack_require__(/*! ./createError */ \"./node_modules/axios/lib/core/createError.js\");\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvc2V0dGxlLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLGtCQUFrQixtQkFBTyxDQUFDLG1FQUFlOztBQUV6QztBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9zZXR0bGUuanM/ODc2OCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJy4vY3JlYXRlRXJyb3InKTtcblxuLyoqXG4gKiBSZXNvbHZlIG9yIHJlamVjdCBhIFByb21pc2UgYmFzZWQgb24gcmVzcG9uc2Ugc3RhdHVzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUgQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0IEEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSkge1xuICB2YXIgdmFsaWRhdGVTdGF0dXMgPSByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXM7XG4gIGlmICghcmVzcG9uc2Uuc3RhdHVzIHx8ICF2YWxpZGF0ZVN0YXR1cyB8fCB2YWxpZGF0ZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gIH0gZWxzZSB7XG4gICAgcmVqZWN0KGNyZWF0ZUVycm9yKFxuICAgICAgJ1JlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHJlc3BvbnNlLmNvbmZpZyxcbiAgICAgIG51bGwsXG4gICAgICByZXNwb25zZS5yZXF1ZXN0LFxuICAgICAgcmVzcG9uc2VcbiAgICApKTtcbiAgfVxufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/settle.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/core/transformData.js":
/*!******************************************************!*\
!*** ./node_modules/axios/lib/core/transformData.js ***!
\******************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\nvar defaults = __webpack_require__(/*! ./../defaults */ \"./node_modules/axios/lib/defaults.js\");\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n var context = this || defaults;\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn.call(context, data, headers);\n });\n\n return data;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvdHJhbnNmb3JtRGF0YS5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixZQUFZLG1CQUFPLENBQUMscURBQVk7QUFDaEMsZUFBZSxtQkFBTyxDQUFDLDJEQUFlOztBQUV0QztBQUNBO0FBQ0E7QUFDQSxXQUFXLGVBQWU7QUFDMUIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsZ0JBQWdCO0FBQzNCLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvdHJhbnNmb3JtRGF0YS5qcz83NjYyIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi8uLi9kZWZhdWx0cycpO1xuXG4vKipcbiAqIFRyYW5zZm9ybSB0aGUgZGF0YSBmb3IgYSByZXF1ZXN0IG9yIGEgcmVzcG9uc2VcbiAqXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IGRhdGEgVGhlIGRhdGEgdG8gYmUgdHJhbnNmb3JtZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGhlYWRlcnMgVGhlIGhlYWRlcnMgZm9yIHRoZSByZXF1ZXN0IG9yIHJlc3BvbnNlXG4gKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufSBmbnMgQSBzaW5nbGUgZnVuY3Rpb24gb3IgQXJyYXkgb2YgZnVuY3Rpb25zXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1lZCBkYXRhXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdHJhbnNmb3JtRGF0YShkYXRhLCBoZWFkZXJzLCBmbnMpIHtcbiAgdmFyIGNvbnRleHQgPSB0aGlzIHx8IGRlZmF1bHRzO1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgdXRpbHMuZm9yRWFjaChmbnMsIGZ1bmN0aW9uIHRyYW5zZm9ybShmbikge1xuICAgIGRhdGEgPSBmbi5jYWxsKGNvbnRleHQsIGRhdGEsIGhlYWRlcnMpO1xuICB9KTtcblxuICByZXR1cm4gZGF0YTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/core/transformData.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/defaults.js":
/*!********************************************!*\
!*** ./node_modules/axios/lib/defaults.js ***!
\********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("/* provided dependency */ var process = __webpack_require__(/*! process/browser.js */ \"./node_modules/process/browser.js\");\n\n\nvar utils = __webpack_require__(/*! ./utils */ \"./node_modules/axios/lib/utils.js\");\nvar normalizeHeaderName = __webpack_require__(/*! ./helpers/normalizeHeaderName */ \"./node_modules/axios/lib/helpers/normalizeHeaderName.js\");\nvar enhanceError = __webpack_require__(/*! ./core/enhanceError */ \"./node_modules/axios/lib/core/enhanceError.js\");\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = __webpack_require__(/*! ./adapters/xhr */ \"./node_modules/axios/lib/adapters/xhr.js\");\n } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {\n // For node use HTTP adapter\n adapter = __webpack_require__(/*! ./adapters/http */ \"./node_modules/axios/lib/adapters/xhr.js\");\n }\n return adapter;\n}\n\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nvar defaults = {\n\n transitional: {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n },\n\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Accept');\n normalizeHeaderName(headers, 'Content-Type');\n\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n if (utils.isObject(data) || (headers && headers['Content-Type'] === 'application/json')) {\n setContentTypeIfUnset(headers, 'application/json');\n return stringifySafely(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n var transitional = this.transitional;\n var silentJSONParsing = transitional && transitional.silentJSONParsing;\n var forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';\n\n if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw enhanceError(e, this, 'E_JSON_PARSE');\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n }\n};\n\ndefaults.headers = {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzLmpzLmpzIiwibWFwcGluZ3MiOiI7QUFBYTs7QUFFYixZQUFZLG1CQUFPLENBQUMsa0RBQVM7QUFDN0IsMEJBQTBCLG1CQUFPLENBQUMsOEZBQStCO0FBQ2pFLG1CQUFtQixtQkFBTyxDQUFDLDBFQUFxQjs7QUFFaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLG1CQUFPLENBQUMsZ0VBQWdCO0FBQ3RDLElBQUksZ0JBQWdCLE9BQU8sbURBQW1ELE9BQU87QUFDckY7QUFDQSxjQUFjLG1CQUFPLENBQUMsaUVBQWlCO0FBQ3ZDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSxDQUFDOztBQUVEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy5qcz9lMjIxIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIG5vcm1hbGl6ZUhlYWRlck5hbWUgPSByZXF1aXJlKCcuL2hlbHBlcnMvbm9ybWFsaXplSGVhZGVyTmFtZScpO1xudmFyIGVuaGFuY2VFcnJvciA9IHJlcXVpcmUoJy4vY29yZS9lbmhhbmNlRXJyb3InKTtcblxudmFyIERFRkFVTFRfQ09OVEVOVF9UWVBFID0ge1xuICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbn07XG5cbmZ1bmN0aW9uIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCB2YWx1ZSkge1xuICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnMpICYmIHV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKSkge1xuICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEFkYXB0ZXIoKSB7XG4gIHZhciBhZGFwdGVyO1xuICBpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIEZvciBicm93c2VycyB1c2UgWEhSIGFkYXB0ZXJcbiAgICBhZGFwdGVyID0gcmVxdWlyZSgnLi9hZGFwdGVycy94aHInKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3MpID09PSAnW29iamVjdCBwcm9jZXNzXScpIHtcbiAgICAvLyBGb3Igbm9kZSB1c2UgSFRUUCBhZGFwdGVyXG4gICAgYWRhcHRlciA9IHJlcXVpcmUoJy4vYWRhcHRlcnMvaHR0cCcpO1xuICB9XG4gIHJldHVybiBhZGFwdGVyO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlTYWZlbHkocmF3VmFsdWUsIHBhcnNlciwgZW5jb2Rlcikge1xuICBpZiAodXRpbHMuaXNTdHJpbmcocmF3VmFsdWUpKSB7XG4gICAgdHJ5IHtcbiAgICAgIChwYXJzZXIgfHwgSlNPTi5wYXJzZSkocmF3VmFsdWUpO1xuICAgICAgcmV0dXJuIHV0aWxzLnRyaW0ocmF3VmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLm5hbWUgIT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gKGVuY29kZXIgfHwgSlNPTi5zdHJpbmdpZnkpKHJhd1ZhbHVlKTtcbn1cblxudmFyIGRlZmF1bHRzID0ge1xuXG4gIHRyYW5zaXRpb25hbDoge1xuICAgIHNpbGVudEpTT05QYXJzaW5nOiB0cnVlLFxuICAgIGZvcmNlZEpTT05QYXJzaW5nOiB0cnVlLFxuICAgIGNsYXJpZnlUaW1lb3V0RXJyb3I6IGZhbHNlXG4gIH0sXG5cbiAgYWRhcHRlcjogZ2V0RGVmYXVsdEFkYXB0ZXIoKSxcblxuICB0cmFuc2Zvcm1SZXF1ZXN0OiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVxdWVzdChkYXRhLCBoZWFkZXJzKSB7XG4gICAgbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCAnQWNjZXB0Jyk7XG4gICAgbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCAnQ29udGVudC1UeXBlJyk7XG5cbiAgICBpZiAodXRpbHMuaXNGb3JtRGF0YShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNBcnJheUJ1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzU3RyZWFtKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0ZpbGUoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQmxvYihkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyVmlldyhkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGEuYnVmZmVyO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMoZGF0YSkpIHtcbiAgICAgIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgnKTtcbiAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc09iamVjdChkYXRhKSB8fCAoaGVhZGVycyAmJiBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgc2V0Q29udGVudFR5cGVJZlVuc2V0KGhlYWRlcnMsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICByZXR1cm4gc3RyaW5naWZ5U2FmZWx5KGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZShkYXRhKSB7XG4gICAgdmFyIHRyYW5zaXRpb25hbCA9IHRoaXMudHJhbnNpdGlvbmFsO1xuICAgIHZhciBzaWxlbnRKU09OUGFyc2luZyA9IHRyYW5zaXRpb25hbCAmJiB0cmFuc2l0aW9uYWwuc2lsZW50SlNPTlBhcnNpbmc7XG4gICAgdmFyIGZvcmNlZEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5mb3JjZWRKU09OUGFyc2luZztcbiAgICB2YXIgc3RyaWN0SlNPTlBhcnNpbmcgPSAhc2lsZW50SlNPTlBhcnNpbmcgJiYgdGhpcy5yZXNwb25zZVR5cGUgPT09ICdqc29uJztcblxuICAgIGlmIChzdHJpY3RKU09OUGFyc2luZyB8fCAoZm9yY2VkSlNPTlBhcnNpbmcgJiYgdXRpbHMuaXNTdHJpbmcoZGF0YSkgJiYgZGF0YS5sZW5ndGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHN0cmljdEpTT05QYXJzaW5nKSB7XG4gICAgICAgICAgaWYgKGUubmFtZSA9PT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICAgICAgdGhyb3cgZW5oYW5jZUVycm9yKGUsIHRoaXMsICdFX0pTT05fUEFSU0UnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICAvKipcbiAgICogQSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byBhYm9ydCBhIHJlcXVlc3QuIElmIHNldCB0byAwIChkZWZhdWx0KSBhXG4gICAqIHRpbWVvdXQgaXMgbm90IGNyZWF0ZWQuXG4gICAqL1xuICB0aW1lb3V0OiAwLFxuXG4gIHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsXG4gIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJyxcblxuICBtYXhDb250ZW50TGVuZ3RoOiAtMSxcbiAgbWF4Qm9keUxlbmd0aDogLTEsXG5cbiAgdmFsaWRhdGVTdGF0dXM6IGZ1bmN0aW9uIHZhbGlkYXRlU3RhdHVzKHN0YXR1cykge1xuICAgIHJldHVybiBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMDtcbiAgfVxufTtcblxuZGVmYXVsdHMuaGVhZGVycyA9IHtcbiAgY29tbW9uOiB7XG4gICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonXG4gIH1cbn07XG5cbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0ge307XG59KTtcblxudXRpbHMuZm9yRWFjaChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2RXaXRoRGF0YShtZXRob2QpIHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0gdXRpbHMubWVyZ2UoREVGQVVMVF9DT05URU5UX1RZUEUpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmYXVsdHM7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/defaults.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/helpers/bind.js":
/*!************************************************!*\
!*** ./node_modules/axios/lib/helpers/bind.js ***!
\************************************************/
/***/ ((module) => {
"use strict";
eval("\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qcz80YmVhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKGZuLCB0aGlzQXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICB9O1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/bind.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/helpers/buildURL.js":
/*!****************************************************!*\
!*** ./node_modules/axios/lib/helpers/buildURL.js ***!
\****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n var hashmarkIndex = url.indexOf('#');\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnVpbGRVUkwuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsWUFBWSxtQkFBTyxDQUFDLHFEQUFZOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnVpbGRVUkwuanM/YzE3OCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gZW5jb2RlKHZhbCkge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbCkuXG4gICAgcmVwbGFjZSgvJTNBL2dpLCAnOicpLlxuICAgIHJlcGxhY2UoLyUyNC9nLCAnJCcpLlxuICAgIHJlcGxhY2UoLyUyQy9naSwgJywnKS5cbiAgICByZXBsYWNlKC8lMjAvZywgJysnKS5cbiAgICByZXBsYWNlKC8lNUIvZ2ksICdbJykuXG4gICAgcmVwbGFjZSgvJTVEL2dpLCAnXScpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgVVJMIGJ5IGFwcGVuZGluZyBwYXJhbXMgdG8gdGhlIGVuZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIGJhc2Ugb2YgdGhlIHVybCAoZS5nLiwgaHR0cDovL3d3dy5nb29nbGUuY29tKVxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbXMgdG8gYmUgYXBwZW5kZWRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgdXJsXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIHBhcmFtc1NlcmlhbGl6ZXIpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIHZhciBzZXJpYWxpemVkUGFyYW1zO1xuICBpZiAocGFyYW1zU2VyaWFsaXplcikge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJhbXNTZXJpYWxpemVyKHBhcmFtcyk7XG4gIH0gZWxzZSBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSkge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcGFydHMgPSBbXTtcblxuICAgIHV0aWxzLmZvckVhY2gocGFyYW1zLCBmdW5jdGlvbiBzZXJpYWxpemUodmFsLCBrZXkpIHtcbiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodXRpbHMuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIGtleSA9IGtleSArICdbXSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSBbdmFsXTtcbiAgICAgIH1cblxuICAgICAgdXRpbHMuZm9yRWFjaCh2YWwsIGZ1bmN0aW9uIHBhcnNlVmFsdWUodikge1xuICAgICAgICBpZiAodXRpbHMuaXNEYXRlKHYpKSB7XG4gICAgICAgICAgdiA9IHYudG9JU09TdHJpbmcoKTtcbiAgICAgICAgfSBlbHNlIGlmICh1dGlscy5pc09iamVjdCh2KSkge1xuICAgICAgICAgIHYgPSBKU09OLnN0cmluZ2lmeSh2KTtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0cy5wdXNoKGVuY29kZShrZXkpICsgJz0nICsgZW5jb2RlKHYpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcnRzLmpvaW4oJyYnKTtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgdmFyIGhhc2htYXJrSW5kZXggPSB1cmwuaW5kZXhPZignIycpO1xuICAgIGlmIChoYXNobWFya0luZGV4ICE9PSAtMSkge1xuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2htYXJrSW5kZXgpO1xuICAgIH1cblxuICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgc2VyaWFsaXplZFBhcmFtcztcbiAgfVxuXG4gIHJldHVybiB1cmw7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/buildURL.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/helpers/combineURLs.js":
/*!*******************************************************!*\
!*** ./node_modules/axios/lib/helpers/combineURLs.js ***!
\*******************************************************/
/***/ ((module) => {
"use strict";
eval("\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tYmluZVVSTHMuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2NvbWJpbmVVUkxzLmpzPzZiYzYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgc3BlY2lmaWVkIFVSTHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVVSTCBUaGUgcmVsYXRpdmUgVVJMXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgVVJMXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVsYXRpdmVVUkwpIHtcbiAgcmV0dXJuIHJlbGF0aXZlVVJMXG4gICAgPyBiYXNlVVJMLnJlcGxhY2UoL1xcLyskLywgJycpICsgJy8nICsgcmVsYXRpdmVVUkwucmVwbGFjZSgvXlxcLysvLCAnJylcbiAgICA6IGJhc2VVUkw7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/combineURLs.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/helpers/cookies.js":
/*!***************************************************!*\
!*** ./node_modules/axios/lib/helpers/cookies.js ***!
\***************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29va2llcy5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixZQUFZLG1CQUFPLENBQUMscURBQVk7O0FBRWhDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwyQ0FBMkM7QUFDM0MsU0FBUzs7QUFFVDtBQUNBLDREQUE0RCx3QkFBd0I7QUFDcEY7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEMsZ0NBQWdDLGNBQWM7QUFDOUM7QUFDQTtBQUNBLEtBQUs7QUFDTCIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb29raWVzLmpzPzFkM2YiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKFxuICB1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpID9cblxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgc3VwcG9ydCBkb2N1bWVudC5jb29raWVcbiAgICAoZnVuY3Rpb24gc3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd3JpdGU6IGZ1bmN0aW9uIHdyaXRlKG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZSkge1xuICAgICAgICAgIHZhciBjb29raWUgPSBbXTtcbiAgICAgICAgICBjb29raWUucHVzaChuYW1lICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XG5cbiAgICAgICAgICBpZiAodXRpbHMuaXNOdW1iZXIoZXhwaXJlcykpIHtcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdleHBpcmVzPScgKyBuZXcgRGF0ZShleHBpcmVzKS50b0dNVFN0cmluZygpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodXRpbHMuaXNTdHJpbmcocGF0aCkpIHtcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdwYXRoPScgKyBwYXRoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodXRpbHMuaXNTdHJpbmcoZG9tYWluKSkge1xuICAgICAgICAgICAgY29va2llLnB1c2goJ2RvbWFpbj0nICsgZG9tYWluKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2VjdXJlID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb29raWUucHVzaCgnc2VjdXJlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZG9jdW1lbnQuY29va2llID0gY29va2llLmpvaW4oJzsgJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVhZDogZnVuY3Rpb24gcmVhZChuYW1lKSB7XG4gICAgICAgICAgdmFyIG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoJyhefDtcXFxccyopKCcgKyBuYW1lICsgJyk9KFteO10qKScpKTtcbiAgICAgICAgICByZXR1cm4gKG1hdGNoID8gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzNdKSA6IG51bGwpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKG5hbWUpIHtcbiAgICAgICAgICB0aGlzLndyaXRlKG5hbWUsICcnLCBEYXRlLm5vdygpIC0gODY0MDAwMDApO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pKCkgOlxuXG4gIC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudiAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgICAoZnVuY3Rpb24gbm9uU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd3JpdGU6IGZ1bmN0aW9uIHdyaXRlKCkge30sXG4gICAgICAgIHJlYWQ6IGZ1bmN0aW9uIHJlYWQoKSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHt9XG4gICAgICB9O1xuICAgIH0pKClcbik7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/cookies.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/helpers/isAbsoluteURL.js":
/*!*********************************************************!*\
!*** ./node_modules/axios/lib/helpers/isAbsoluteURL.js ***!
\*********************************************************/
/***/ ((module) => {
"use strict";
eval("\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwuanM/YTIyNyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZFxcK1xcLVxcLl0qOik/XFwvXFwvL2kudGVzdCh1cmwpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/isAbsoluteURL.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/helpers/isAxiosError.js":
/*!********************************************************!*\
!*** ./node_modules/axios/lib/helpers/isAxiosError.js ***!
\********************************************************/
/***/ ((module) => {
"use strict";
eval("\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nmodule.exports = function isAxiosError(payload) {\n return (typeof payload === 'object') && (payload.isAxiosError === true);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBeGlvc0Vycm9yLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc0F4aW9zRXJyb3IuanM/YmQ5ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIGFuIGVycm9yIHRocm93biBieSBBeGlvc1xuICpcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0F4aW9zRXJyb3IocGF5bG9hZCkge1xuICByZXR1cm4gKHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0JykgJiYgKHBheWxvYWQuaXNBeGlvc0Vycm9yID09PSB0cnVlKTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/isAxiosError.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/helpers/isURLSameOrigin.js":
/*!***********************************************************!*\
!*** ./node_modules/axios/lib/helpers/isURLSameOrigin.js ***!
\***********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxxREFBWTs7QUFFaEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QixnQkFBZ0IsU0FBUztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luLmpzPzg3OTUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKFxuICB1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpID9cblxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgaGF2ZSBmdWxsIHN1cHBvcnQgb2YgdGhlIEFQSXMgbmVlZGVkIHRvIHRlc3RcbiAgLy8gd2hldGhlciB0aGUgcmVxdWVzdCBVUkwgaXMgb2YgdGhlIHNhbWUgb3JpZ2luIGFzIGN1cnJlbnQgbG9jYXRpb24uXG4gICAgKGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICAgIHZhciBtc2llID0gLyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICAgIHZhciB1cmxQYXJzaW5nTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgIHZhciBvcmlnaW5VUkw7XG5cbiAgICAgIC8qKlxuICAgICogUGFyc2UgYSBVUkwgdG8gZGlzY292ZXIgaXQncyBjb21wb25lbnRzXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCBUaGUgVVJMIHRvIGJlIHBhcnNlZFxuICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAqL1xuICAgICAgZnVuY3Rpb24gcmVzb2x2ZVVSTCh1cmwpIHtcbiAgICAgICAgdmFyIGhyZWYgPSB1cmw7XG5cbiAgICAgICAgaWYgKG1zaWUpIHtcbiAgICAgICAgLy8gSUUgbmVlZHMgYXR0cmlidXRlIHNldCB0d2ljZSB0byBub3JtYWxpemUgcHJvcGVydGllc1xuICAgICAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuICAgICAgICAgIGhyZWYgPSB1cmxQYXJzaW5nTm9kZS5ocmVmO1xuICAgICAgICB9XG5cbiAgICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG5cbiAgICAgICAgLy8gdXJsUGFyc2luZ05vZGUgcHJvdmlkZXMgdGhlIFVybFV0aWxzIGludGVyZmFjZSAtIGh0dHA6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmx1dGlsc1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhyZWY6IHVybFBhcnNpbmdOb2RlLmhyZWYsXG4gICAgICAgICAgcHJvdG9jb2w6IHVybFBhcnNpbmdOb2RlLnByb3RvY29sID8gdXJsUGFyc2luZ05vZGUucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJykgOiAnJyxcbiAgICAgICAgICBob3N0OiB1cmxQYXJzaW5nTm9kZS5ob3N0LFxuICAgICAgICAgIHNlYXJjaDogdXJsUGFyc2luZ05vZGUuc2VhcmNoID8gdXJsUGFyc2luZ05vZGUuc2VhcmNoLnJlcGxhY2UoL15cXD8vLCAnJykgOiAnJyxcbiAgICAgICAgICBoYXNoOiB1cmxQYXJzaW5nTm9kZS5oYXNoID8gdXJsUGFyc2luZ05vZGUuaGFzaC5yZXBsYWNlKC9eIy8sICcnKSA6ICcnLFxuICAgICAgICAgIGhvc3RuYW1lOiB1cmxQYXJzaW5nTm9kZS5ob3N0bmFtZSxcbiAgICAgICAgICBwb3J0OiB1cmxQYXJzaW5nTm9kZS5wb3J0LFxuICAgICAgICAgIHBhdGhuYW1lOiAodXJsUGFyc2luZ05vZGUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycpID9cbiAgICAgICAgICAgIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lIDpcbiAgICAgICAgICAgICcvJyArIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG9yaWdpblVSTCA9IHJlc29sdmVVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuXG4gICAgICAvKipcbiAgICAqIERldGVybWluZSBpZiBhIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luIGFzIHRoZSBjdXJyZW50IGxvY2F0aW9uXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RVUkwgVGhlIFVSTCB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cbiAgICAgIHJldHVybiBmdW5jdGlvbiBpc1VSTFNhbWVPcmlnaW4ocmVxdWVzdFVSTCkge1xuICAgICAgICB2YXIgcGFyc2VkID0gKHV0aWxzLmlzU3RyaW5nKHJlcXVlc3RVUkwpKSA/IHJlc29sdmVVUkwocmVxdWVzdFVSTCkgOiByZXF1ZXN0VVJMO1xuICAgICAgICByZXR1cm4gKHBhcnNlZC5wcm90b2NvbCA9PT0gb3JpZ2luVVJMLnByb3RvY29sICYmXG4gICAgICAgICAgICBwYXJzZWQuaG9zdCA9PT0gb3JpZ2luVVJMLmhvc3QpO1xuICAgICAgfTtcbiAgICB9KSgpIDpcblxuICAvLyBOb24gc3RhbmRhcmQgYnJvd3NlciBlbnZzICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICAgIChmdW5jdGlvbiBub25TdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH07XG4gICAgfSkoKVxuKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/isURLSameOrigin.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/helpers/normalizeHeaderName.js":
/*!***************************************************************!*\
!*** ./node_modules/axios/lib/helpers/normalizeHeaderName.js ***!
\***************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ../utils */ \"./node_modules/axios/lib/utils.js\");\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvbm9ybWFsaXplSGVhZGVyTmFtZS5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixZQUFZLG1CQUFPLENBQUMsbURBQVU7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9ub3JtYWxpemVIZWFkZXJOYW1lLmpzPzZiMTUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZUhlYWRlck5hbWUoaGVhZGVycywgbm9ybWFsaXplZE5hbWUpIHtcbiAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLCBmdW5jdGlvbiBwcm9jZXNzSGVhZGVyKHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKG5hbWUgIT09IG5vcm1hbGl6ZWROYW1lICYmIG5hbWUudG9VcHBlckNhc2UoKSA9PT0gbm9ybWFsaXplZE5hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgaGVhZGVyc1tub3JtYWxpemVkTmFtZV0gPSB2YWx1ZTtcbiAgICAgIGRlbGV0ZSBoZWFkZXJzW25hbWVdO1xuICAgIH1cbiAgfSk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/normalizeHeaderName.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/helpers/parseHeaders.js":
/*!********************************************************!*\
!*** ./node_modules/axios/lib/helpers/parseHeaders.js ***!
\********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/axios/lib/utils.js\");\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcGFyc2VIZWFkZXJzLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxxREFBWTs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9wYXJzZUhlYWRlcnMuanM/NTRlOSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuLy8gSGVhZGVycyB3aG9zZSBkdXBsaWNhdGVzIGFyZSBpZ25vcmVkIGJ5IG5vZGVcbi8vIGMuZi4gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX2hlYWRlcnNcbnZhciBpZ25vcmVEdXBsaWNhdGVPZiA9IFtcbiAgJ2FnZScsICdhdXRob3JpemF0aW9uJywgJ2NvbnRlbnQtbGVuZ3RoJywgJ2NvbnRlbnQtdHlwZScsICdldGFnJyxcbiAgJ2V4cGlyZXMnLCAnZnJvbScsICdob3N0JywgJ2lmLW1vZGlmaWVkLXNpbmNlJywgJ2lmLXVubW9kaWZpZWQtc2luY2UnLFxuICAnbGFzdC1tb2RpZmllZCcsICdsb2NhdGlvbicsICdtYXgtZm9yd2FyZHMnLCAncHJveHktYXV0aG9yaXphdGlvbicsXG4gICdyZWZlcmVyJywgJ3JldHJ5LWFmdGVyJywgJ3VzZXItYWdlbnQnXG5dO1xuXG4vKipcbiAqIFBhcnNlIGhlYWRlcnMgaW50byBhbiBvYmplY3RcbiAqXG4gKiBgYGBcbiAqIERhdGU6IFdlZCwgMjcgQXVnIDIwMTQgMDg6NTg6NDkgR01UXG4gKiBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbiAqIENvbm5lY3Rpb246IGtlZXAtYWxpdmVcbiAqIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVycyBIZWFkZXJzIG5lZWRpbmcgdG8gYmUgcGFyc2VkXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhcnNlSGVhZGVycyhoZWFkZXJzKSB7XG4gIHZhciBwYXJzZWQgPSB7fTtcbiAgdmFyIGtleTtcbiAgdmFyIHZhbDtcbiAgdmFyIGk7XG5cbiAgaWYgKCFoZWFkZXJzKSB7IHJldHVybiBwYXJzZWQ7IH1cblxuICB1dGlscy5mb3JFYWNoKGhlYWRlcnMuc3BsaXQoJ1xcbicpLCBmdW5jdGlvbiBwYXJzZXIobGluZSkge1xuICAgIGkgPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBrZXkgPSB1dGlscy50cmltKGxpbmUuc3Vic3RyKDAsIGkpKS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbCA9IHV0aWxzLnRyaW0obGluZS5zdWJzdHIoaSArIDEpKTtcblxuICAgIGlmIChrZXkpIHtcbiAgICAgIGlmIChwYXJzZWRba2V5XSAmJiBpZ25vcmVEdXBsaWNhdGVPZi5pbmRleE9mKGtleSkgPj0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSAocGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSA6IFtdKS5jb25jYXQoW3ZhbF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/parseHeaders.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/helpers/spread.js":
/*!**************************************************!*\
!*** ./node_modules/axios/lib/helpers/spread.js ***!
\**************************************************/
/***/ ((module) => {
"use strict";
eval("\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3ByZWFkLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwcmVhZC5qcz8yNzI5Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGludm9raW5nIGEgZnVuY3Rpb24gYW5kIGV4cGFuZGluZyBhbiBhcnJheSBmb3IgYXJndW1lbnRzLlxuICpcbiAqIENvbW1vbiB1c2UgY2FzZSB3b3VsZCBiZSB0byB1c2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseWAuXG4gKlxuICogIGBgYGpzXG4gKiAgZnVuY3Rpb24gZih4LCB5LCB6KSB7fVxuICogIHZhciBhcmdzID0gWzEsIDIsIDNdO1xuICogIGYuYXBwbHkobnVsbCwgYXJncyk7XG4gKiAgYGBgXG4gKlxuICogV2l0aCBgc3ByZWFkYCB0aGlzIGV4YW1wbGUgY2FuIGJlIHJlLXdyaXR0ZW4uXG4gKlxuICogIGBgYGpzXG4gKiAgc3ByZWFkKGZ1bmN0aW9uKHgsIHksIHopIHt9KShbMSwgMiwgM10pO1xuICogIGBgYFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3ByZWFkKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKGFycikge1xuICAgIHJldHVybiBjYWxsYmFjay5hcHBseShudWxsLCBhcnIpO1xuICB9O1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/spread.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/helpers/validator.js":
/*!*****************************************************!*\
!*** ./node_modules/axios/lib/helpers/validator.js ***!
\*****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar pkg = __webpack_require__(/*! ./../../package.json */ \"./node_modules/axios/package.json\");\n\nvar validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nvar deprecatedWarnings = {};\nvar currentVerArr = pkg.version.split('.');\n\n/**\n * Compare package versions\n * @param {string} version\n * @param {string?} thanVersion\n * @returns {boolean}\n */\nfunction isOlderVersion(version, thanVersion) {\n var pkgVersionArr = thanVersion ? thanVersion.split('.') : currentVerArr;\n var destVer = version.split('.');\n for (var i = 0; i < 3; i++) {\n if (pkgVersionArr[i] > destVer[i]) {\n return true;\n } else if (pkgVersionArr[i] < destVer[i]) {\n return false;\n }\n }\n return false;\n}\n\n/**\n * Transitional option validator\n * @param {function|boolean?} validator\n * @param {string?} version\n * @param {string} message\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n var isDeprecated = version && isOlderVersion(version);\n\n function formatMessage(opt, desc) {\n return '[Axios v' + pkg.version + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return function(value, opt, opts) {\n if (validator === false) {\n throw new Error(formatMessage(opt, ' has been removed in ' + version));\n }\n\n if (isDeprecated && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n var keys = Object.keys(options);\n var i = keys.length;\n while (i-- > 0) {\n var opt = keys[i];\n var validator = schema[opt];\n if (validator) {\n var value = options[opt];\n var result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new TypeError('option ' + opt + ' must be ' + result);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw Error('Unknown option ' + opt);\n }\n }\n}\n\nmodule.exports = {\n isOlderVersion: isOlderVersion,\n assertOptions: assertOptions,\n validators: validators\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdmFsaWRhdG9yLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFVBQVUsbUJBQU8sQ0FBQywrREFBc0I7O0FBRXhDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFNBQVM7QUFDcEIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLFNBQVM7QUFDcEIsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3ZhbGlkYXRvci5qcz8wMTMyIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHBrZyA9IHJlcXVpcmUoJy4vLi4vLi4vcGFja2FnZS5qc29uJyk7XG5cbnZhciB2YWxpZGF0b3JzID0ge307XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5bJ29iamVjdCcsICdib29sZWFuJywgJ251bWJlcicsICdmdW5jdGlvbicsICdzdHJpbmcnLCAnc3ltYm9sJ10uZm9yRWFjaChmdW5jdGlvbih0eXBlLCBpKSB7XG4gIHZhbGlkYXRvcnNbdHlwZV0gPSBmdW5jdGlvbiB2YWxpZGF0b3IodGhpbmcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSB0eXBlIHx8ICdhJyArIChpIDwgMSA/ICduICcgOiAnICcpICsgdHlwZTtcbiAgfTtcbn0pO1xuXG52YXIgZGVwcmVjYXRlZFdhcm5pbmdzID0ge307XG52YXIgY3VycmVudFZlckFyciA9IHBrZy52ZXJzaW9uLnNwbGl0KCcuJyk7XG5cbi8qKlxuICogQ29tcGFyZSBwYWNrYWdlIHZlcnNpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmc/fSB0aGFuVmVyc2lvblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzT2xkZXJWZXJzaW9uKHZlcnNpb24sIHRoYW5WZXJzaW9uKSB7XG4gIHZhciBwa2dWZXJzaW9uQXJyID0gdGhhblZlcnNpb24gPyB0aGFuVmVyc2lvbi5zcGxpdCgnLicpIDogY3VycmVudFZlckFycjtcbiAgdmFyIGRlc3RWZXIgPSB2ZXJzaW9uLnNwbGl0KCcuJyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgaWYgKHBrZ1ZlcnNpb25BcnJbaV0gPiBkZXN0VmVyW2ldKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHBrZ1ZlcnNpb25BcnJbaV0gPCBkZXN0VmVyW2ldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUcmFuc2l0aW9uYWwgb3B0aW9uIHZhbGlkYXRvclxuICogQHBhcmFtIHtmdW5jdGlvbnxib29sZWFuP30gdmFsaWRhdG9yXG4gKiBAcGFyYW0ge3N0cmluZz99IHZlcnNpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259XG4gKi9cbnZhbGlkYXRvcnMudHJhbnNpdGlvbmFsID0gZnVuY3Rpb24gdHJhbnNpdGlvbmFsKHZhbGlkYXRvciwgdmVyc2lvbiwgbWVzc2FnZSkge1xuICB2YXIgaXNEZXByZWNhdGVkID0gdmVyc2lvbiAmJiBpc09sZGVyVmVyc2lvbih2ZXJzaW9uKTtcblxuICBmdW5jdGlvbiBmb3JtYXRNZXNzYWdlKG9wdCwgZGVzYykge1xuICAgIHJldHVybiAnW0F4aW9zIHYnICsgcGtnLnZlcnNpb24gKyAnXSBUcmFuc2l0aW9uYWwgb3B0aW9uIFxcJycgKyBvcHQgKyAnXFwnJyArIGRlc2MgKyAobWVzc2FnZSA/ICcuICcgKyBtZXNzYWdlIDogJycpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBvcHQsIG9wdHMpIHtcbiAgICBpZiAodmFsaWRhdG9yID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGZvcm1hdE1lc3NhZ2Uob3B0LCAnIGhhcyBiZWVuIHJlbW92ZWQgaW4gJyArIHZlcnNpb24pKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEZXByZWNhdGVkICYmICFkZXByZWNhdGVkV2FybmluZ3Nbb3B0XSkge1xuICAgICAgZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0gPSB0cnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICBvcHQsXG4gICAgICAgICAgJyBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYnICsgdmVyc2lvbiArICcgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUnXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvciA/IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRzKSA6IHRydWU7XG4gIH07XG59O1xuXG4vKipcbiAqIEFzc2VydCBvYmplY3QncyBwcm9wZXJ0aWVzIHR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge29iamVjdH0gc2NoZW1hXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBhbGxvd1Vua25vd25cbiAqL1xuXG5mdW5jdGlvbiBhc3NlcnRPcHRpb25zKG9wdGlvbnMsIHNjaGVtYSwgYWxsb3dVbmtub3duKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICB2YXIgb3B0ID0ga2V5c1tpXTtcbiAgICB2YXIgdmFsaWRhdG9yID0gc2NoZW1hW29wdF07XG4gICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgdmFyIHZhbHVlID0gb3B0aW9uc1tvcHRdO1xuICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdGlvbnMpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gJyArIG9wdCArICcgbXVzdCBiZSAnICsgcmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoYWxsb3dVbmtub3duICE9PSB0cnVlKSB7XG4gICAgICB0aHJvdyBFcnJvcignVW5rbm93biBvcHRpb24gJyArIG9wdCk7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc09sZGVyVmVyc2lvbjogaXNPbGRlclZlcnNpb24sXG4gIGFzc2VydE9wdGlvbnM6IGFzc2VydE9wdGlvbnMsXG4gIHZhbGlkYXRvcnM6IHZhbGlkYXRvcnNcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/validator.js\n");
/***/ }),
/***/ "./node_modules/axios/lib/utils.js":
/*!*****************************************!*\
!*** ./node_modules/axios/lib/utils.js ***!
\*****************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
eval("\n\nvar bind = __webpack_require__(/*! ./helpers/bind */ \"./node_modules/axios/lib/helpers/bind.js\");\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {Object} val The value to test\n * @return {boolean} True if value is a plain Object, otherwise false\n */\nfunction isPlainObject(val) {\n if (toString.call(val) !== '[object Object]') {\n return false;\n }\n\n var prototype = Object.getPrototypeOf(val);\n return prototype === null || prototype === Object.prototype;\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||\n navigator.product === 'NativeScript' ||\n navigator.product === 'NS')) {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (isPlainObject(result[key]) && isPlainObject(val)) {\n result[key] = merge(result[key], val);\n } else if (isPlainObject(val)) {\n result[key] = merge({}, val);\n } else if (isArray(val)) {\n result[key] = val.slice();\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n * @return {string} content value without BOM\n */\nfunction stripBOM(content) {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isPlainObject: isPlainObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n extend: extend,\n trim: trim,\n stripBOM: stripBOM\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3V0aWxzLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFdBQVcsbUJBQU8sQ0FBQyxnRUFBZ0I7O0FBRW5DOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxTQUFTO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekIsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQ0FBb0MsT0FBTztBQUMzQztBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUyxHQUFHLFNBQVM7QUFDNUMsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTiw0QkFBNEI7QUFDNUIsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0MsT0FBTztBQUMvQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3V0aWxzLmpzP2M5ZWIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJy4vaGVscGVycy9iaW5kJyk7XG5cbi8vIHV0aWxzIGlzIGEgbGlicmFyeSBvZiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgbm9uLXNwZWNpZmljIHRvIGF4aW9zXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXkodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCdWZmZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQnVmZmVyKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwpICYmIHZhbC5jb25zdHJ1Y3RvciAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsLmNvbnN0cnVjdG9yKVxuICAgICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKHZhbCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGb3JtRGF0YVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGb3JtRGF0YSh2YWwpIHtcbiAgcmV0dXJuICh0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnKSAmJiAodmFsIGluc3RhbmNlb2YgRm9ybURhdGEpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJWaWV3KHZhbCkge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpICYmIChBcnJheUJ1ZmZlci5pc1ZpZXcpKSB7XG4gICAgcmVzdWx0ID0gQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gKHZhbCkgJiYgKHZhbC5idWZmZXIpICYmICh2YWwuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJpbmdcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmluZywgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBOdW1iZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIE51bWJlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTnVtYmVyKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcic7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWwpIHtcbiAgaWYgKHRvU3RyaW5nLmNhbGwodmFsKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbCk7XG4gIHJldHVybiBwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRGF0ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRGF0ZSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRmlsZSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRmlsZV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQmxvYiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQmxvYih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQmxvYl0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZ1bmN0aW9uLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmVhbVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyZWFtLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJlYW0odmFsKSB7XG4gIHJldHVybiBpc09iamVjdCh2YWwpICYmIGlzRnVuY3Rpb24odmFsLnBpcGUpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVVJMU2VhcmNoUGFyYW1zKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zO1xufVxuXG4vKipcbiAqIFRyaW0gZXhjZXNzIHdoaXRlc3BhY2Ugb2ZmIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIFN0cmluZyB0byB0cmltXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgU3RyaW5nIGZyZWVkIG9mIGV4Y2VzcyB3aGl0ZXNwYWNlXG4gKi9cbmZ1bmN0aW9uIHRyaW0oc3RyKSB7XG4gIHJldHVybiBzdHIudHJpbSA/IHN0ci50cmltKCkgOiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudFxuICpcbiAqIFRoaXMgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXIsIGFuZCByZWFjdC1uYXRpdmUuXG4gKiBCb3RoIGVudmlyb25tZW50cyBzdXBwb3J0IFhNTEh0dHBSZXF1ZXN0LCBidXQgbm90IGZ1bGx5IHN0YW5kYXJkIGdsb2JhbHMuXG4gKlxuICogd2ViIHdvcmtlcnM6XG4gKiAgdHlwZW9mIHdpbmRvdyAtPiB1bmRlZmluZWRcbiAqICB0eXBlb2YgZG9jdW1lbnQgLT4gdW5kZWZpbmVkXG4gKlxuICogcmVhY3QtbmF0aXZlOlxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdSZWFjdE5hdGl2ZSdcbiAqIG5hdGl2ZXNjcmlwdFxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdOYXRpdmVTY3JpcHQnIG9yICdOUydcbiAqL1xuZnVuY3Rpb24gaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiAobmF2aWdhdG9yLnByb2R1Y3QgPT09ICdSZWFjdE5hdGl2ZScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ05hdGl2ZVNjcmlwdCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ05TJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdcbiAgKTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0IGludm9raW5nIGEgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiBgb2JqYCBpcyBhbiBBcnJheSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGluZGV4LCBhbmQgY29tcGxldGUgYXJyYXkgZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiAnb2JqJyBpcyBhbiBPYmplY3QgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBrZXksIGFuZCBjb21wbGV0ZSBvYmplY3QgZm9yIGVhY2ggcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggaXRlbVxuICovXG5mdW5jdGlvbiBmb3JFYWNoKG9iaiwgZm4pIHtcbiAgLy8gRG9uJ3QgYm90aGVyIGlmIG5vIHZhbHVlIHByb3ZpZGVkXG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGb3JjZSBhbiBhcnJheSBpZiBub3QgYWxyZWFkeSBzb21ldGhpbmcgaXRlcmFibGVcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgb2JqID0gW29ial07XG4gIH1cblxuICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gb2JqLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpbaV0sIGksIG9iaik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBvYmplY3Qga2V5c1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBY2NlcHRzIHZhcmFyZ3MgZXhwZWN0aW5nIGVhY2ggYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0LCB0aGVuXG4gKiBpbW11dGFibHkgbWVyZ2VzIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGFuZCByZXR1cm5zIHJlc3VsdC5cbiAqXG4gKiBXaGVuIG11bHRpcGxlIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBrZXkgdGhlIGxhdGVyIG9iamVjdCBpblxuICogdGhlIGFyZ3VtZW50cyBsaXN0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciByZXN1bHQgPSBtZXJnZSh7Zm9vOiAxMjN9LCB7Zm9vOiA0NTZ9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5mb28pOyAvLyBvdXRwdXRzIDQ1NlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXN1bHQgb2YgYWxsIG1lcmdlIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gbWVyZ2UoLyogb2JqMSwgb2JqMiwgb2JqMywgLi4uICovKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChyZXN1bHRba2V5XSkgJiYgaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlKHJlc3VsdFtrZXldLCB2YWwpO1xuICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlKHt9LCB2YWwpO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWwpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbC5zbGljZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmb3JFYWNoKGFyZ3VtZW50c1tpXSwgYXNzaWduVmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRXh0ZW5kcyBvYmplY3QgYSBieSBtdXRhYmx5IGFkZGluZyB0byBpdCB0aGUgcHJvcGVydGllcyBvZiBvYmplY3QgYi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge09iamVjdH0gYiBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBUaGUgb2JqZWN0IHRvIGJpbmQgZnVuY3Rpb24gdG9cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHJlc3VsdGluZyB2YWx1ZSBvZiBvYmplY3QgYVxuICovXG5mdW5jdGlvbiBleHRlbmQoYSwgYiwgdGhpc0FyZykge1xuICBmb3JFYWNoKGIsIGZ1bmN0aW9uIGFzc2lnblZhbHVlKHZhbCwga2V5KSB7XG4gICAgaWYgKHRoaXNBcmcgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYVtrZXldID0gYmluZCh2YWwsIHRoaXNBcmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhW2tleV0gPSB2YWw7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGE7XG59XG5cbi8qKlxuICogUmVtb3ZlIGJ5dGUgb3JkZXIgbWFya2VyLiBUaGlzIGNhdGNoZXMgRUYgQkIgQkYgKHRoZSBVVEYtOCBCT00pXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgd2l0aCBCT01cbiAqIEByZXR1cm4ge3N0cmluZ30gY29udGVudCB2YWx1ZSB3aXRob3V0IEJPTVxuICovXG5mdW5jdGlvbiBzdHJpcEJPTShjb250ZW50KSB7XG4gIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICB9XG4gIHJldHVybiBjb250ZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNBcnJheTogaXNBcnJheSxcbiAgaXNBcnJheUJ1ZmZlcjogaXNBcnJheUJ1ZmZlcixcbiAgaXNCdWZmZXI6IGlzQnVmZmVyLFxuICBpc0Zvcm1EYXRhOiBpc0Zvcm1EYXRhLFxuICBpc0FycmF5QnVmZmVyVmlldzogaXNBcnJheUJ1ZmZlclZpZXcsXG4gIGlzU3RyaW5nOiBpc1N0cmluZyxcbiAgaXNOdW1iZXI6IGlzTnVtYmVyLFxuICBpc09iamVjdDogaXNPYmplY3QsXG4gIGlzUGxhaW5PYmplY3Q6IGlzUGxhaW5PYmplY3QsXG4gIGlzVW5kZWZpbmVkOiBpc1VuZGVmaW5lZCxcbiAgaXNEYXRlOiBpc0RhdGUsXG4gIGlzRmlsZTogaXNGaWxlLFxuICBpc0Jsb2I6IGlzQmxvYixcbiAgaXNGdW5jdGlvbjogaXNGdW5jdGlvbixcbiAgaXNTdHJlYW06IGlzU3RyZWFtLFxuICBpc1VSTFNlYXJjaFBhcmFtczogaXNVUkxTZWFyY2hQYXJhbXMsXG4gIGlzU3RhbmRhcmRCcm93c2VyRW52OiBpc1N0YW5kYXJkQnJvd3NlckVudixcbiAgZm9yRWFjaDogZm9yRWFjaCxcbiAgbWVyZ2U6IG1lcmdlLFxuICBleHRlbmQ6IGV4dGVuZCxcbiAgdHJpbTogdHJpbSxcbiAgc3RyaXBCT006IHN0cmlwQk9NXG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/utils.js\n");
/***/ }),
/***/ "./resources/js/adminlte.js":
/*!**********************************!*\
!*** ./resources/js/adminlte.js ***!
\**********************************/
/***/ (function(module, exports, __webpack_require__) {
eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n/*!\n * AdminLTE v3.1.0-rc (https://adminlte.io)\n * Copyright 2014-2020 Colorlib <https://colorlib.com>\n * Licensed under MIT (https://github.com/ColorlibHQ/AdminLTE/blob/master/LICENSE)\n */\n(function (global, factory) {\n ( false ? 0 : _typeof(exports)) === 'object' && \"object\" !== 'undefined' ? factory(exports, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")) : true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : (0);\n})(this, function (exports, $) {\n 'use strict';\n\n function _interopDefaultLegacy(e) {\n return e && _typeof(e) === 'object' && 'default' in e ? e : {\n 'default': e\n };\n }\n var $__default = /*#__PURE__*/_interopDefaultLegacy($);\n\n /**\n * --------------------------------------------\n * AdminLTE CardRefresh.js\n * License MIT\n * --------------------------------------------\n */\n /**\n * Constants\n * ====================================================\n */\n\n var NAME = 'CardRefresh';\n var DATA_KEY = 'lte.cardrefresh';\n var EVENT_KEY = \".\" + DATA_KEY;\n var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];\n var EVENT_LOADED = \"loaded\" + EVENT_KEY;\n var EVENT_OVERLAY_ADDED = \"overlay.added\" + EVENT_KEY;\n var EVENT_OVERLAY_REMOVED = \"overlay.removed\" + EVENT_KEY;\n var CLASS_NAME_CARD = 'card';\n var SELECTOR_CARD = \".\" + CLASS_NAME_CARD;\n var SELECTOR_DATA_REFRESH = '[data-card-widget=\"card-refresh\"]';\n var Default = {\n source: '',\n sourceSelector: '',\n params: {},\n trigger: SELECTOR_DATA_REFRESH,\n content: '.card-body',\n loadInContent: true,\n loadOnInit: true,\n responseType: '',\n overlayTemplate: '<div class=\"overlay\"><i class=\"fas fa-2x fa-sync-alt fa-spin\"></i></div>',\n onLoadStart: function onLoadStart() {},\n onLoadDone: function onLoadDone(response) {\n return response;\n }\n };\n var CardRefresh = /*#__PURE__*/function () {\n function CardRefresh(element, settings) {\n this._element = element;\n this._parent = element.parents(SELECTOR_CARD).first();\n this._settings = $__default['default'].extend({}, Default, settings);\n this._overlay = $__default['default'](this._settings.overlayTemplate);\n if (element.hasClass(CLASS_NAME_CARD)) {\n this._parent = element;\n }\n if (this._settings.source === '') {\n throw new Error('Source url was not defined. Please specify a url in your CardRefresh source option.');\n }\n }\n var _proto = CardRefresh.prototype;\n _proto.load = function load() {\n var _this = this;\n this._addOverlay();\n this._settings.onLoadStart.call($__default['default'](this));\n $__default['default'].get(this._settings.source, this._settings.params, function (response) {\n if (_this._settings.loadInContent) {\n if (_this._settings.sourceSelector !== '') {\n response = $__default['default'](response).find(_this._settings.sourceSelector).html();\n }\n _this._parent.find(_this._settings.content).html(response);\n }\n _this._settings.onLoadDone.call($__default['default'](_this), response);\n _this._removeOverlay();\n }, this._settings.responseType !== '' && this._settings.responseType);\n $__default['default'](this._element).trigger($__default['default'].Event(EVENT_LOADED));\n };\n _proto._addOverlay = function _addOverlay() {\n this._parent.append(this._overlay);\n $__default['default'](this._element).trigger($__default['default'].Event(EVENT_OVERLAY_ADDED));\n };\n _proto._removeOverlay = function _removeOverlay() {\n this._parent.find(this._overlay).remove();\n $__default['default'](this._element).trigger($__default['default'].Event(EVENT_OVERLAY_REMOVED));\n } // Private\n ;\n\n _proto._init = function _init() {\n var _this2 = this;\n $__default['default'](this).find(this._settings.trigger).on('click', function () {\n _this2.load();\n });\n if (this._settings.loadOnInit) {\n this.load();\n }\n } // Static\n ;\n\n CardRefresh._jQueryInterface = function _jQueryInterface(config) {\n var data = $__default['default'](this).data(DATA_KEY);\n var _options = $__default['default'].extend({}, Default, $__default['default'](this).data());\n if (!data) {\n data = new CardRefresh($__default['default'](this), _options);\n $__default['default'](this).data(DATA_KEY, typeof config === 'string' ? data : config);\n }\n if (typeof config === 'string' && config.match(/load/)) {\n data[config]();\n } else {\n data._init($__default['default'](this));\n }\n };\n return CardRefresh;\n }();\n /**\n * Data API\n * ====================================================\n */\n\n $__default['default'](document).on('click', SELECTOR_DATA_REFRESH, function (event) {\n if (event) {\n event.preventDefault();\n }\n CardRefresh._jQueryInterface.call($__default['default'](this), 'load');\n });\n $__default['default'](function () {\n $__default['default'](SELECTOR_DATA_REFRESH).each(function () {\n CardRefresh._jQueryInterface.call($__default['default'](this));\n });\n });\n /**\n * jQuery API\n * ====================================================\n */\n\n $__default['default'].fn[NAME] = CardRefresh._jQueryInterface;\n $__default['default'].fn[NAME].Constructor = CardRefresh;\n $__default['default'].fn[NAME].noConflict = function () {\n $__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;\n return CardRefresh._jQueryInterface;\n };\n\n /**\n * --------------------------------------------\n * AdminLTE CardWidget.js\n * License MIT\n * --------------------------------------------\n */\n /**\n * Constants\n * ====================================================\n */\n\n var NAME$1 = 'CardWidget';\n var DATA_KEY$1 = 'lte.cardwidget';\n var EVENT_KEY$1 = \".\" + DATA_KEY$1;\n var JQUERY_NO_CONFLICT$1 = $__default['default'].fn[NAME$1];\n var EVENT_EXPANDED = \"expanded\" + EVENT_KEY$1;\n var EVENT_COLLAPSED = \"collapsed\" + EVENT_KEY$1;\n var EVENT_MAXIMIZED = \"maximized\" + EVENT_KEY$1;\n var EVENT_MINIMIZED = \"minimized\" + EVENT_KEY$1;\n var EVENT_REMOVED = \"removed\" + EVENT_KEY$1;\n var CLASS_NAME_CARD$1 = 'card';\n var CLASS_NAME_COLLAPSED = 'collapsed-card';\n var CLASS_NAME_COLLAPSING = 'collapsing-card';\n var CLASS_NAME_EXPANDING = 'expanding-card';\n var CLASS_NAME_WAS_COLLAPSED = 'was-collapsed';\n var CLASS_NAME_MAXIMIZED = 'maximized-card';\n var SELECTOR_DATA_REMOVE = '[data-card-widget=\"remove\"]';\n var SELECTOR_DATA_COLLAPSE = '[data-card-widget=\"collapse\"]';\n var SELECTOR_DATA_MAXIMIZE = '[data-card-widget=\"maximize\"]';\n var SELECTOR_CARD$1 = \".\" + CLASS_NAME_CARD$1;\n var SELECTOR_CARD_HEADER = '.card-header';\n var SELECTOR_CARD_BODY = '.card-body';\n var SELECTOR_CARD_FOOTER = '.card-footer';\n var Default$1 = {\n animationSpeed: 'normal',\n collapseTrigger: SELECTOR_DATA_COLLAPSE,\n removeTrigger: SELECTOR_DATA_REMOVE,\n maximizeTrigger: SELECTOR_DATA_MAXIMIZE,\n collapseIcon: 'fa-minus',\n expandIcon: 'fa-plus',\n maximizeIcon: 'fa-expand',\n minimizeIcon: 'fa-compress'\n };\n var CardWidget = /*#__PURE__*/function () {\n function CardWidget(element, settings) {\n this._element = element;\n this._parent = element.parents(SELECTOR_CARD$1).first();\n if (element.hasClass(CLASS_NAME_CARD$1)) {\n this._parent = element;\n }\n this._settings = $__default['default'].extend({}, Default$1, settings);\n }\n var _proto = CardWidget.prototype;\n _proto.collapse = function collapse() {\n var _this = this;\n this._parent.addClass(CLASS_NAME_COLLAPSING).children(SELECTOR_CARD_BODY + \", \" + SELECTOR_CARD_FOOTER).slideUp(this._settings.animationSpeed, function () {\n _this._parent.addClass(CLASS_NAME_COLLAPSED).removeClass(CLASS_NAME_COLLAPSING);\n });\n this._parent.find(\"> \" + SELECTOR_CARD_HEADER + \" \" + this._settings.collapseTrigger + \" .\" + this._settings.collapseIcon).addClass(this._settings.expandIcon).removeClass(this._settings.collapseIcon);\n this._element.trigger($__default['default'].Event(EVENT_COLLAPSED), this._parent);\n };\n _proto.expand = function expand() {\n var _this2 = this;\n this._parent.addClass(CLASS_NAME_EXPANDING).children(SELECTOR_CARD_BODY + \", \" + SELECTOR_CARD_FOOTER).slideDown(this._settings.animationSpeed, function () {\n _this2._parent.removeClass(CLASS_NAME_COLLAPSED).removeClass(CLASS_NAME_EXPANDING);\n });\n this._parent.find(\"> \" + SELECTOR_CARD_HEADER + \" \" + this._settings.collapseTrigger + \" .\" + this._settings.expandIcon).addClass(this._settings.collapseIcon).removeClass(this._settings.expandIcon);\n this._element.trigger($__default['default'].Event(EVENT_EXPANDED), this._parent);\n };\n _proto.remove = function remove() {\n this._parent.slideUp();\n this._element.trigger($__default['default'].Event(EVENT_REMOVED), this._parent);\n };\n _proto.toggle = function toggle() {\n if (this._parent.hasClass(CLASS_NAME_COLLAPSED)) {\n this.expand();\n return;\n }\n this.collapse();\n };\n _proto.maximize = function maximize() {\n this._parent.find(this._settings.maximizeTrigger + \" .\" + this._settings.maximizeIcon).addClass(this._settings.minimizeIcon).removeClass(this._settings.maximizeIcon);\n this._parent.css({\n height: this._parent.height(),\n width: this._parent.width(),\n transition: 'all .15s'\n }).delay(150).queue(function () {\n var $element = $__default['default'](this);\n $element.addClass(CLASS_NAME_MAXIMIZED);\n $__default['default']('html').addClass(CLASS_NAME_MAXIMIZED);\n if ($element.hasClass(CLASS_NAME_COLLAPSED)) {\n $element.addClass(CLASS_NAME_WAS_COLLAPSED);\n }\n $element.dequeue();\n });\n this._element.trigger($__default['default'].Event(EVENT_MAXIMIZED), this._parent);\n };\n _proto.minimize = function minimize() {\n this._parent.find(this._settings.maximizeTrigger + \" .\" + this._settings.minimizeIcon).addClass(this._settings.maximizeIcon).removeClass(this._settings.minimizeIcon);\n this._parent.css('cssText', \"height: \" + this._parent[0].style.height + \" !important; width: \" + this._parent[0].style.width + \" !important; transition: all .15s;\").delay(10).queue(function () {\n var $element = $__default['default'](this);\n $element.removeClass(CLASS_NAME_MAXIMIZED);\n $__default['default']('html').removeClass(CLASS_NAME_MAXIMIZED);\n $element.css({\n height: 'inherit',\n width: 'inherit'\n });\n if ($element.hasClass(CLASS_NAME_WAS_COLLAPSED)) {\n $element.removeClass(CLASS_NAME_WAS_COLLAPSED);\n }\n $element.dequeue();\n });\n this._element.trigger($__default['default'].Event(EVENT_MINIMIZED), this._parent);\n };\n _proto.toggleMaximize = function toggleMaximize() {\n if (this._parent.hasClass(CLASS_NAME_MAXIMIZED)) {\n this.minimize();\n return;\n }\n this.maximize();\n } // Private\n ;\n\n _proto._init = function _init(card) {\n var _this3 = this;\n this._parent = card;\n $__default['default'](this).find(this._settings.collapseTrigger).click(function () {\n _this3.toggle();\n });\n $__default['default'](this).find(this._settings.maximizeTrigger).click(function () {\n _this3.toggleMaximize();\n });\n $__default['default'](this).find(this._settings.removeTrigger).click(function () {\n _this3.remove();\n });\n } // Static\n ;\n\n CardWidget._jQueryInterface = function _jQueryInterface(config) {\n var data = $__default['default'](this).data(DATA_KEY$1);\n var _options = $__default['default'].extend({}, Default$1, $__default['default'](this).data());\n if (!data) {\n data = new CardWidget($__default['default'](this), _options);\n $__default['default'](this).data(DATA_KEY$1, typeof config === 'string' ? data : config);\n }\n if (typeof config === 'string' && config.match(/collapse|expand|remove|toggle|maximize|minimize|toggleMaximize/)) {\n data[config]();\n } else if (_typeof(config) === 'object') {\n data._init($__default['default'](this));\n }\n };\n return CardWidget;\n }();\n /**\n * Data API\n * ====================================================\n */\n\n $__default['default'](document).on('click', SELECTOR_DATA_COLLAPSE, function (event) {\n if (event) {\n event.preventDefault();\n }\n CardWidget._jQueryInterface.call($__default['default'](this), 'toggle');\n });\n $__default['default'](document).on('click', SELECTOR_DATA_REMOVE, function (event) {\n if (event) {\n event.preventDefault();\n }\n CardWidget._jQueryInterface.call($__default['default'](this), 'remove');\n });\n $__default['default'](document).on('click', SELECTOR_DATA_MAXIMIZE, function (event) {\n if (event) {\n event.preventDefault();\n }\n CardWidget._jQueryInterface.call($__default['default'](this), 'toggleMaximize');\n });\n /**\n * jQuery API\n * ====================================================\n */\n\n $__default['default'].fn[NAME$1] = CardWidget._jQueryInterface;\n $__default['default'].fn[NAME$1].Constructor = CardWidget;\n $__default['default'].fn[NAME$1].noConflict = function () {\n $__default['default'].fn[NAME$1] = JQUERY_NO_CONFLICT$1;\n return CardWidget._jQueryInterface;\n };\n\n /**\n * --------------------------------------------\n * AdminLTE ControlSidebar.js\n * License MIT\n * --------------------------------------------\n */\n /**\n * Constants\n * ====================================================\n */\n\n var NAME$2 = 'ControlSidebar';\n var DATA_KEY$2 = 'lte.controlsidebar';\n var EVENT_KEY$2 = \".\" + DATA_KEY$2;\n var JQUERY_NO_CONFLICT$2 = $__default['default'].fn[NAME$2];\n var EVENT_COLLAPSED$1 = \"collapsed\" + EVENT_KEY$2;\n var EVENT_EXPANDED$1 = \"expanded\" + EVENT_KEY$2;\n var SELECTOR_CONTROL_SIDEBAR = '.control-sidebar';\n var SELECTOR_CONTROL_SIDEBAR_CONTENT = '.control-sidebar-content';\n var SELECTOR_DATA_TOGGLE = '[data-widget=\"control-sidebar\"]';\n var SELECTOR_HEADER = '.main-header';\n var SELECTOR_FOOTER = '.main-footer';\n var CLASS_NAME_CONTROL_SIDEBAR_ANIMATE = 'control-sidebar-animate';\n var CLASS_NAME_CONTROL_SIDEBAR_OPEN = 'control-sidebar-open';\n var CLASS_NAME_CONTROL_SIDEBAR_SLIDE = 'control-sidebar-slide-open';\n var CLASS_NAME_LAYOUT_FIXED = 'layout-fixed';\n var CLASS_NAME_NAVBAR_FIXED = 'layout-navbar-fixed';\n var CLASS_NAME_NAVBAR_SM_FIXED = 'layout-sm-navbar-fixed';\n var CLASS_NAME_NAVBAR_MD_FIXED = 'layout-md-navbar-fixed';\n var CLASS_NAME_NAVBAR_LG_FIXED = 'layout-lg-navbar-fixed';\n var CLASS_NAME_NAVBAR_XL_FIXED = 'layout-xl-navbar-fixed';\n var CLASS_NAME_FOOTER_FIXED = 'layout-footer-fixed';\n var CLASS_NAME_FOOTER_SM_FIXED = 'layout-sm-footer-fixed';\n var CLASS_NAME_FOOTER_MD_FIXED = 'layout-md-footer-fixed';\n var CLASS_NAME_FOOTER_LG_FIXED = 'layout-lg-footer-fixed';\n var CLASS_NAME_FOOTER_XL_FIXED = 'layout-xl-footer-fixed';\n var Default$2 = {\n controlsidebarSlide: true,\n scrollbarTheme: 'os-theme-light',\n scrollbarAutoHide: 'l'\n };\n /**\n * Class Definition\n * ====================================================\n */\n\n var ControlSidebar = /*#__PURE__*/function () {\n function ControlSidebar(element, config) {\n this._element = element;\n this._config = config;\n this._init();\n } // Public\n\n var _proto = ControlSidebar.prototype;\n _proto.collapse = function collapse() {\n var $body = $__default['default']('body');\n var $html = $__default['default']('html'); // Show the control sidebar\n\n if (this._config.controlsidebarSlide) {\n $html.addClass(CLASS_NAME_CONTROL_SIDEBAR_ANIMATE);\n $body.removeClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE).delay(300).queue(function () {\n $__default['default'](SELECTOR_CONTROL_SIDEBAR).hide();\n $html.removeClass(CLASS_NAME_CONTROL_SIDEBAR_ANIMATE);\n $__default['default'](this).dequeue();\n });\n } else {\n $body.removeClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN);\n }\n $__default['default'](this._element).trigger($__default['default'].Event(EVENT_COLLAPSED$1));\n };\n _proto.show = function show() {\n var $body = $__default['default']('body');\n var $html = $__default['default']('html'); // Collapse the control sidebar\n\n if (this._config.controlsidebarSlide) {\n $html.addClass(CLASS_NAME_CONTROL_SIDEBAR_ANIMATE);\n $__default['default'](SELECTOR_CONTROL_SIDEBAR).show().delay(10).queue(function () {\n $body.addClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE).delay(300).queue(function () {\n $html.removeClass(CLASS_NAME_CONTROL_SIDEBAR_ANIMATE);\n $__default['default'](this).dequeue();\n });\n $__default['default'](this).dequeue();\n });\n } else {\n $body.addClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN);\n }\n this._fixHeight();\n this._fixScrollHeight();\n $__default['default'](this._element).trigger($__default['default'].Event(EVENT_EXPANDED$1));\n };\n _proto.toggle = function toggle() {\n var $body = $__default['default']('body');\n var shouldClose = $body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN) || $body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE);\n if (shouldClose) {\n // Close the control sidebar\n this.collapse();\n } else {\n // Open the control sidebar\n this.show();\n }\n } // Private\n ;\n\n _proto._init = function _init() {\n var _this = this;\n this._fixHeight();\n this._fixScrollHeight();\n $__default['default'](window).resize(function () {\n _this._fixHeight();\n _this._fixScrollHeight();\n });\n $__default['default'](window).scroll(function () {\n var $body = $__default['default']('body');\n var shouldFixHeight = $body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN) || $body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE);\n if (shouldFixHeight) {\n _this._fixScrollHeight();\n }\n });\n };\n _proto._fixScrollHeight = function _fixScrollHeight() {\n var $body = $__default['default']('body');\n if (!$body.hasClass(CLASS_NAME_LAYOUT_FIXED)) {\n return;\n }\n var heights = {\n scroll: $__default['default'](document).height(),\n window: $__default['default'](window).height(),\n header: $__default['default'](SELECTOR_HEADER).outerHeight(),\n footer: $__default['default'](SELECTOR_FOOTER).outerHeight()\n };\n var positions = {\n bottom: Math.abs(heights.window + $__default['default'](window).scrollTop() - heights.scroll),\n top: $__default['default'](window).scrollTop()\n };\n var navbarFixed = ($body.hasClass(CLASS_NAME_NAVBAR_FIXED) || $body.hasClass(CLASS_NAME_NAVBAR_SM_FIXED) || $body.hasClass(CLASS_NAME_NAVBAR_MD_FIXED) || $body.hasClass(CLASS_NAME_NAVBAR_LG_FIXED) || $body.hasClass(CLASS_NAME_NAVBAR_XL_FIXED)) && $__default['default'](SELECTOR_HEADER).css('position') === 'fixed';\n var footerFixed = ($body.hasClass(CLASS_NAME_FOOTER_FIXED) || $body.hasClass(CLASS_NAME_FOOTER_SM_FIXED) || $body.hasClass(CLASS_NAME_FOOTER_MD_FIXED) || $body.hasClass(CLASS_NAME_FOOTER_LG_FIXED) || $body.hasClass(CLASS_NAME_FOOTER_XL_FIXED)) && $__default['default'](SELECTOR_FOOTER).css('position') === 'fixed';\n var $controlSidebar = $__default['default'](SELECTOR_CONTROL_SIDEBAR);\n var $controlsidebarContent = $__default['default'](SELECTOR_CONTROL_SIDEBAR + \", \" + SELECTOR_CONTROL_SIDEBAR + \" \" + SELECTOR_CONTROL_SIDEBAR_CONTENT);\n if (positions.top === 0 && positions.bottom === 0) {\n $controlSidebar.css({\n bottom: heights.footer,\n top: heights.header\n });\n $controlsidebarContent.css('height', heights.window - (heights.header + heights.footer));\n } else if (positions.bottom <= heights.footer) {\n if (footerFixed === false) {\n var top = heights.header - positions.top;\n $controlSidebar.css('bottom', heights.footer - positions.bottom).css('top', top >= 0 ? top : 0);\n $controlsidebarContent.css('height', heights.window - (heights.footer - positions.bottom));\n } else {\n $controlSidebar.css('bottom', heights.footer);\n }\n } else if (positions.top <= heights.header) {\n if (navbarFixed === false) {\n $controlSidebar.css('top', heights.header - positions.top);\n $controlsidebarContent.css('height', heights.window - (heights.header - positions.top));\n } else {\n $controlSidebar.css('top', heights.header);\n }\n } else if (navbarFixed === false) {\n $controlSidebar.css('top', 0);\n $controlsidebarContent.css('height', heights.window);\n } else {\n $controlSidebar.css('top', heights.header);\n }\n };\n _proto._fixHeight = function _fixHeight() {\n var $body = $__default['default']('body');\n if (!$body.hasClass(CLASS_NAME_LAYOUT_FIXED)) {\n return;\n }\n var heights = {\n window: $__default['default'](window).height(),\n header: $__default['default'](SELECTOR_HEADER).outerHeight(),\n footer: $__default['default'](SELECTOR_FOOTER).outerHeight()\n };\n var sidebarHeight = heights.window - heights.header;\n if ($body.hasClass(CLASS_NAME_FOOTER_FIXED) || $body.hasClass(CLASS_NAME_FOOTER_SM_FIXED) || $body.hasClass(CLASS_NAME_FOOTER_MD_FIXED) || $body.hasClass(CLASS_NAME_FOOTER_LG_FIXED) || $body.hasClass(CLASS_NAME_FOOTER_XL_FIXED)) {\n if ($__default['default'](SELECTOR_FOOTER).css('position') === 'fixed') {\n sidebarHeight = heights.window - heights.header - heights.footer;\n }\n }\n var $controlSidebar = $__default['default'](SELECTOR_CONTROL_SIDEBAR + \" \" + SELECTOR_CONTROL_SIDEBAR_CONTENT);\n $controlSidebar.css('height', sidebarHeight);\n if (typeof $__default['default'].fn.overlayScrollbars !== 'undefined') {\n $controlSidebar.overlayScrollbars({\n className: this._config.scrollbarTheme,\n sizeAutoCapable: true,\n scrollbars: {\n autoHide: this._config.scrollbarAutoHide,\n clickScrolling: true\n }\n });\n }\n } // Static\n ;\n\n ControlSidebar._jQueryInterface = function _jQueryInterface(operation) {\n return this.each(function () {\n var data = $__default['default'](this).data(DATA_KEY$2);\n var _options = $__default['default'].extend({}, Default$2, $__default['default'](this).data());\n if (!data) {\n data = new ControlSidebar(this, _options);\n $__default['default'](this).data(DATA_KEY$2, data);\n }\n if (data[operation] === 'undefined') {\n throw new Error(operation + \" is not a function\");\n }\n data[operation]();\n });\n };\n return ControlSidebar;\n }();\n /**\n *\n * Data Api implementation\n * ====================================================\n */\n\n $__default['default'](document).on('click', SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault();\n ControlSidebar._jQueryInterface.call($__default['default'](this), 'toggle');\n });\n /**\n * jQuery API\n * ====================================================\n */\n\n $__default['default'].fn[NAME$2] = ControlSidebar._jQueryInterface;\n $__default['default'].fn[NAME$2].Constructor = ControlSidebar;\n $__default['default'].fn[NAME$2].noConflict = function () {\n $__default['default'].fn[NAME$2] = JQUERY_NO_CONFLICT$2;\n return ControlSidebar._jQueryInterface;\n };\n\n /**\n * --------------------------------------------\n * AdminLTE DirectChat.js\n * License MIT\n * --------------------------------------------\n */\n /**\n * Constants\n * ====================================================\n */\n\n var NAME$3 = 'DirectChat';\n var DATA_KEY$3 = 'lte.directchat';\n var EVENT_KEY$3 = \".\" + DATA_KEY$3;\n var JQUERY_NO_CONFLICT$3 = $__default['default'].fn[NAME$3];\n var EVENT_TOGGLED = \"toggled\" + EVENT_KEY$3;\n var SELECTOR_DATA_TOGGLE$1 = '[data-widget=\"chat-pane-toggle\"]';\n var SELECTOR_DIRECT_CHAT = '.direct-chat';\n var CLASS_NAME_DIRECT_CHAT_OPEN = 'direct-chat-contacts-open';\n /**\n * Class Definition\n * ====================================================\n */\n\n var DirectChat = /*#__PURE__*/function () {\n function DirectChat(element) {\n this._element = element;\n }\n var _proto = DirectChat.prototype;\n _proto.toggle = function toggle() {\n $__default['default'](this._element).parents(SELECTOR_DIRECT_CHAT).first().toggleClass(CLASS_NAME_DIRECT_CHAT_OPEN);\n $__default['default'](this._element).trigger($__default['default'].Event(EVENT_TOGGLED));\n } // Static\n ;\n\n DirectChat._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $__default['default'](this).data(DATA_KEY$3);\n if (!data) {\n data = new DirectChat($__default['default'](this));\n $__default['default'](this).data(DATA_KEY$3, data);\n }\n data[config]();\n });\n };\n return DirectChat;\n }();\n /**\n *\n * Data Api implementation\n * ====================================================\n */\n\n $__default['default'](document).on('click', SELECTOR_DATA_TOGGLE$1, function (event) {\n if (event) {\n event.preventDefault();\n }\n DirectChat._jQueryInterface.call($__default['default'](this), 'toggle');\n });\n /**\n * jQuery API\n * ====================================================\n */\n\n $__default['default'].fn[NAME$3] = DirectChat._jQueryInterface;\n $__default['default'].fn[NAME$3].Constructor = DirectChat;\n $__default['default'].fn[NAME$3].noConflict = function () {\n $__default['default'].fn[NAME$3] = JQUERY_NO_CONFLICT$3;\n return DirectChat._jQueryInterface;\n };\n\n /**\n * --------------------------------------------\n * AdminLTE Dropdown.js\n * License MIT\n * --------------------------------------------\n */\n /**\n * Constants\n * ====================================================\n */\n\n var NAME$4 = 'Dropdown';\n var DATA_KEY$4 = 'lte.dropdown';\n var JQUERY_NO_CONFLICT$4 = $__default['default'].fn[NAME$4];\n var SELECTOR_NAVBAR = '.navbar';\n var SELECTOR_DROPDOWN_MENU = '.dropdown-menu';\n var SELECTOR_DROPDOWN_MENU_ACTIVE = '.dropdown-menu.show';\n var SELECTOR_DROPDOWN_TOGGLE = '[data-toggle=\"dropdown\"]';\n var CLASS_NAME_DROPDOWN_RIGHT = 'dropdown-menu-right';\n var CLASS_NAME_DROPDOWN_SUBMENU = 'dropdown-submenu'; // TODO: this is unused; should be removed along with the extend?\n\n var Default$3 = {};\n /**\n * Class Definition\n * ====================================================\n */\n\n var Dropdown = /*#__PURE__*/function () {\n function Dropdown(element, config) {\n this._config = config;\n this._element = element;\n } // Public\n\n var _proto = Dropdown.prototype;\n _proto.toggleSubmenu = function toggleSubmenu() {\n this._element.siblings().show().toggleClass('show');\n if (!this._element.next().hasClass('show')) {\n this._element.parents(SELECTOR_DROPDOWN_MENU).first().find('.show').removeClass('show').hide();\n }\n this._element.parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', function () {\n $__default['default']('.dropdown-submenu .show').removeClass('show').hide();\n });\n };\n _proto.fixPosition = function fixPosition() {\n var $element = $__default['default'](SELECTOR_DROPDOWN_MENU_ACTIVE);\n if ($element.length === 0) {\n return;\n }\n if ($element.hasClass(CLASS_NAME_DROPDOWN_RIGHT)) {\n $element.css({\n left: 'inherit',\n right: 0\n });\n } else {\n $element.css({\n left: 0,\n right: 'inherit'\n });\n }\n var offset = $element.offset();\n var width = $element.width();\n var visiblePart = $__default['default'](window).width() - offset.left;\n if (offset.left < 0) {\n $element.css({\n left: 'inherit',\n right: offset.left - 5\n });\n } else if (visiblePart < width) {\n $element.css({\n left: 'inherit',\n right: 0\n });\n }\n } // Static\n ;\n\n Dropdown._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $__default['default'](this).data(DATA_KEY$4);\n var _config = $__default['default'].extend({}, Default$3, $__default['default'](this).data());\n if (!data) {\n data = new Dropdown($__default['default'](this), _config);\n $__default['default'](this).data(DATA_KEY$4, data);\n }\n if (config === 'toggleSubmenu' || config === 'fixPosition') {\n data[config]();\n }\n });\n };\n return Dropdown;\n }();\n /**\n * Data API\n * ====================================================\n */\n\n $__default['default'](SELECTOR_DROPDOWN_MENU + \" \" + SELECTOR_DROPDOWN_TOGGLE).on('click', function (event) {\n event.preventDefault();\n event.stopPropagation();\n Dropdown._jQueryInterface.call($__default['default'](this), 'toggleSubmenu');\n });\n $__default['default'](SELECTOR_NAVBAR + \" \" + SELECTOR_DROPDOWN_TOGGLE).on('click', function (event) {\n event.preventDefault();\n if ($__default['default'](event.target).parent().hasClass(CLASS_NAME_DROPDOWN_SUBMENU)) {\n return;\n }\n setTimeout(function () {\n Dropdown._jQueryInterface.call($__default['default'](this), 'fixPosition');\n }, 1);\n });\n /**\n * jQuery API\n * ====================================================\n */\n\n $__default['default'].fn[NAME$4] = Dropdown._jQueryInterface;\n $__default['default'].fn[NAME$4].Constructor = Dropdown;\n $__default['default'].fn[NAME$4].noConflict = function () {\n $__default['default'].fn[NAME$4] = JQUERY_NO_CONFLICT$4;\n return Dropdown._jQueryInterface;\n };\n\n /**\n * --------------------------------------------\n * AdminLTE ExpandableTable.js\n * License MIT\n * --------------------------------------------\n */\n /**\n * Constants\n * ====================================================\n */\n\n var NAME$5 = 'ExpandableTable';\n var DATA_KEY$5 = 'lte.expandableTable';\n var EVENT_KEY$4 = \".\" + DATA_KEY$5;\n var JQUERY_NO_CONFLICT$5 = $__default['default'].fn[NAME$5];\n var EVENT_EXPANDED$2 = \"expanded\" + EVENT_KEY$4;\n var EVENT_COLLAPSED$2 = \"collapsed\" + EVENT_KEY$4;\n var SELECTOR_TABLE = '.expandable-table';\n var SELECTOR_DATA_TOGGLE$2 = '[data-widget=\"expandable-table\"]';\n var SELECTOR_ARIA_ATTR = 'aria-expanded';\n /**\n * Class Definition\n * ====================================================\n */\n\n var ExpandableTable = /*#__PURE__*/function () {\n function ExpandableTable(element, options) {\n this._options = options;\n this._element = element;\n } // Public\n\n var _proto = ExpandableTable.prototype;\n _proto.init = function init() {\n $__default['default'](SELECTOR_DATA_TOGGLE$2).each(function (_, $header) {\n var $type = $__default['default']($header).attr(SELECTOR_ARIA_ATTR);\n var $body = $__default['default']($header).next().children().first().children();\n if ($type === 'true') {\n $body.show();\n } else if ($type === 'false') {\n $body.hide();\n $body.parent().parent().addClass('d-none');\n }\n });\n };\n _proto.toggleRow = function toggleRow() {\n var $element = this._element;\n var time = 500;\n var $type = $element.attr(SELECTOR_ARIA_ATTR);\n var $body = $element.next().children().first().children();\n $body.stop();\n if ($type === 'true') {\n $body.slideUp(time, function () {\n $element.next().addClass('d-none');\n });\n $element.attr(SELECTOR_ARIA_ATTR, 'false');\n $element.trigger($__default['default'].Event(EVENT_COLLAPSED$2));\n } else if ($type === 'false') {\n $element.next().removeClass('d-none');\n $body.slideDown(time);\n $element.attr(SELECTOR_ARIA_ATTR, 'true');\n $element.trigger($__default['default'].Event(EVENT_EXPANDED$2));\n }\n } // Static\n ;\n\n ExpandableTable._jQueryInterface = function _jQueryInterface(operation) {\n return this.each(function () {\n var data = $__default['default'](this).data(DATA_KEY$5);\n if (!data) {\n data = new ExpandableTable($__default['default'](this));\n $__default['default'](this).data(DATA_KEY$5, data);\n }\n if (typeof operation === 'string' && operation.match(/init|toggleRow/)) {\n data[operation]();\n }\n });\n };\n return ExpandableTable;\n }();\n /**\n * Data API\n * ====================================================\n */\n\n $__default['default'](SELECTOR_TABLE).ready(function () {\n ExpandableTable._jQueryInterface.call($__default['default'](this), 'init');\n });\n $__default['default'](document).on('click', SELECTOR_DATA_TOGGLE$2, function () {\n ExpandableTable._jQueryInterface.call($__default['default'](this), 'toggleRow');\n });\n /**\n * jQuery API\n * ====================================================\n */\n\n $__default['default'].fn[NAME$5] = ExpandableTable._jQueryInterface;\n $__default['default'].fn[NAME$5].Constructor = ExpandableTable;\n $__default['default'].fn[NAME$5].noConflict = function () {\n $__default['default'].fn[NAME$5] = JQUERY_NO_CONFLICT$5;\n return ExpandableTable._jQueryInterface;\n };\n\n /**\n * --------------------------------------------\n * AdminLTE Fullscreen.js\n * License MIT\n * --------------------------------------------\n */\n /**\n * Constants\n * ====================================================\n */\n\n var NAME$6 = 'Fullscreen';\n var DATA_KEY$6 = 'lte.fullscreen';\n var JQUERY_NO_CONFLICT$6 = $__default['default'].fn[NAME$6];\n var SELECTOR_DATA_WIDGET = '[data-widget=\"fullscreen\"]';\n var SELECTOR_ICON = SELECTOR_DATA_WIDGET + \" i\";\n var Default$4 = {\n minimizeIcon: 'fa-compress-arrows-alt',\n maximizeIcon: 'fa-expand-arrows-alt'\n };\n /**\n * Class Definition\n * ====================================================\n */\n\n var Fullscreen = /*#__PURE__*/function () {\n function Fullscreen(_element, _options) {\n this.element = _element;\n this.options = $__default['default'].extend({}, Default$4, _options);\n } // Public\n\n var _proto = Fullscreen.prototype;\n _proto.toggle = function toggle() {\n if (document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement) {\n this.windowed();\n } else {\n this.fullscreen();\n }\n };\n _proto.fullscreen = function fullscreen() {\n if (document.documentElement.requestFullscreen) {\n document.documentElement.requestFullscreen();\n } else if (document.documentElement.webkitRequestFullscreen) {\n document.documentElement.webkitRequestFullscreen();\n } else if (document.documentElement.msRequestFullscreen) {\n document.documentElement.msRequestFullscreen();\n }\n $__default['default'](SELECTOR_ICON).removeClass(this.options.maximizeIcon).addClass(this.options.minimizeIcon);\n };\n _proto.windowed = function windowed() {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n } else if (document.msExitFullscreen) {\n document.msExitFullscreen();\n }\n $__default['default'](SELECTOR_ICON).removeClass(this.options.minimizeIcon).addClass(this.options.maximizeIcon);\n } // Static\n ;\n\n Fullscreen._jQueryInterface = function _jQueryInterface(config) {\n var data = $__default['default'](this).data(DATA_KEY$6);\n if (!data) {\n data = $__default['default'](this).data();\n }\n var _options = $__default['default'].extend({}, Default$4, _typeof(config) === 'object' ? config : data);\n var plugin = new Fullscreen($__default['default'](this), _options);\n $__default['default'](this).data(DATA_KEY$6, _typeof(config) === 'object' ? config : data);\n if (typeof config === 'string' && config.match(/toggle|fullscreen|windowed/)) {\n plugin[config]();\n } else {\n plugin.init();\n }\n };\n return Fullscreen;\n }();\n /**\n * Data API\n * ====================================================\n */\n\n $__default['default'](document).on('click', SELECTOR_DATA_WIDGET, function () {\n Fullscreen._jQueryInterface.call($__default['default'](this), 'toggle');\n });\n /**\n * jQuery API\n * ====================================================\n */\n\n $__default['default'].fn[NAME$6] = Fullscreen._jQueryInterface;\n $__default['default'].fn[NAME$6].Constructor = Fullscreen;\n $__default['default'].fn[NAME$6].noConflict = function () {\n $__default['default'].fn[NAME$6] = JQUERY_NO_CONFLICT$6;\n return Fullscreen._jQueryInterface;\n };\n\n /**\n * --------------------------------------------\n * AdminLTE IFrame.js\n * License MIT\n * --------------------------------------------\n */\n /**\n * Constants\n * ====================================================\n */\n\n var NAME$7 = 'IFrame';\n var DATA_KEY$7 = 'lte.iframe';\n var JQUERY_NO_CONFLICT$7 = $__default['default'].fn[NAME$7];\n var SELECTOR_DATA_TOGGLE$3 = '[data-widget=\"iframe\"]';\n var SELECTOR_DATA_TOGGLE_CLOSE = '[data-widget=\"iframe-close\"]';\n var SELECTOR_DATA_TOGGLE_SCROLL_LEFT = '[data-widget=\"iframe-scrollleft\"]';\n var SELECTOR_DATA_TOGGLE_SCROLL_RIGHT = '[data-widget=\"iframe-scrollright\"]';\n var SELECTOR_DATA_TOGGLE_FULLSCREEN = '[data-widget=\"iframe-fullscreen\"]';\n var SELECTOR_CONTENT_WRAPPER = '.content-wrapper';\n var SELECTOR_CONTENT_IFRAME = SELECTOR_CONTENT_WRAPPER + \" iframe\";\n var SELECTOR_TAB_NAV = SELECTOR_DATA_TOGGLE$3 + \".iframe-mode .nav\";\n var SELECTOR_TAB_NAVBAR_NAV = SELECTOR_DATA_TOGGLE$3 + \".iframe-mode .navbar-nav\";\n var SELECTOR_TAB_NAVBAR_NAV_ITEM = SELECTOR_TAB_NAVBAR_NAV + \" .nav-item\";\n var SELECTOR_TAB_CONTENT = SELECTOR_DATA_TOGGLE$3 + \".iframe-mode .tab-content\";\n var SELECTOR_TAB_EMPTY = SELECTOR_TAB_CONTENT + \" .tab-empty\";\n var SELECTOR_TAB_LOADING = SELECTOR_TAB_CONTENT + \" .tab-loading\";\n var SELECTOR_SIDEBAR_MENU_ITEM = '.main-sidebar .nav-item > a.nav-link';\n var SELECTOR_HEADER_MENU_ITEM = '.main-header .nav-item a.nav-link';\n var SELECTOR_HEADER_DROPDOWN_ITEM = '.main-header a.dropdown-item';\n var CLASS_NAME_IFRAME_MODE = 'iframe-mode';\n var CLASS_NAME_FULLSCREEN_MODE = 'iframe-mode-fullscreen';\n var Default$5 = {\n onTabClick: function onTabClick(item) {\n return item;\n },\n onTabChanged: function onTabChanged(item) {\n return item;\n },\n onTabCreated: function onTabCreated(item) {\n return item;\n },\n autoIframeMode: true,\n autoItemActive: true,\n autoShowNewTab: true,\n loadingScreen: true,\n useNavbarItems: true,\n scrollOffset: 40,\n scrollBehaviorSwap: false,\n iconMaximize: 'fa-expand',\n iconMinimize: 'fa-compress'\n };\n /**\n * Class Definition\n * ====================================================\n */\n\n var IFrame = /*#__PURE__*/function () {\n function IFrame(element, config) {\n this._config = config;\n this._element = element;\n this._init();\n } // Public\n\n var _proto = IFrame.prototype;\n _proto.onTabClick = function onTabClick(item) {\n this._config.onTabClick(item);\n };\n _proto.onTabChanged = function onTabChanged(item) {\n this._config.onTabChanged(item);\n };\n _proto.onTabCreated = function onTabCreated(item) {\n this._config.onTabCreated(item);\n };\n _proto.createTab = function createTab(title, link, uniqueName, autoOpen) {\n var _this = this;\n var tabId = \"panel-\" + uniqueName + \"-\" + Math.floor(Math.random() * 1000);\n var navId = \"tab-\" + uniqueName + \"-\" + Math.floor(Math.random() * 1000);\n var newNavItem = \"<li class=\\\"nav-item\\\" role=\\\"presentation\\\"><a class=\\\"nav-link\\\" data-toggle=\\\"row\\\" id=\\\"\" + navId + \"\\\" href=\\\"#\" + tabId + \"\\\" role=\\\"tab\\\" aria-controls=\\\"\" + tabId + \"\\\" aria-selected=\\\"false\\\">\" + title + \"</a></li>\";\n $__default['default'](SELECTOR_TAB_NAVBAR_NAV).append(newNavItem);\n var newTabItem = \"<div class=\\\"tab-pane fade\\\" id=\\\"\" + tabId + \"\\\" role=\\\"tabpanel\\\" aria-labelledby=\\\"\" + navId + \"\\\"><iframe src=\\\"\" + link + \"\\\"></iframe></div>\";\n $__default['default'](SELECTOR_TAB_CONTENT).append(newTabItem);\n if (autoOpen) {\n if (this._config.loadingScreen) {\n var $loadingScreen = $__default['default'](SELECTOR_TAB_LOADING);\n $loadingScreen.fadeIn();\n $__default['default'](tabId + \" iframe\").ready(function () {\n if (typeof _this._config.loadingScreen === 'number') {\n _this.switchTab(\"#\" + navId, _this._config.loadingScreen);\n setTimeout(function () {\n $loadingScreen.fadeOut();\n }, _this._config.loadingScreen);\n } else {\n _this.switchTab(\"#\" + navId, _this._config.loadingScreen);\n $loadingScreen.fadeOut();\n }\n });\n } else {\n this.switchTab(\"#\" + navId);\n }\n }\n this.onTabCreated($__default['default'](\"#\" + navId));\n };\n _proto.openTabSidebar = function openTabSidebar(item, autoOpen) {\n if (autoOpen === void 0) {\n autoOpen = this._config.autoShowNewTab;\n }\n var $item = $__default['default'](item).clone();\n if ($item.attr('href') === undefined) {\n $item = $__default['default'](item).parent('a').clone();\n }\n $item.find('.right').remove();\n var title = $item.find('p').text();\n if (title === '') {\n title = $item.text();\n }\n var link = $item.attr('href');\n if (link === '#' || link === '' || link === undefined) {\n return;\n }\n this.createTab(title, link, link.replace('.html', '').replace('./', '').replaceAll('/', '-'), autoOpen);\n };\n _proto.switchTab = function switchTab(item) {\n var $item = $__default['default'](item);\n var tabId = $item.attr('href');\n $__default['default'](SELECTOR_TAB_EMPTY).hide();\n $__default['default'](SELECTOR_TAB_NAVBAR_NAV + \" .active\").tab('dispose').removeClass('active');\n this._fixHeight();\n $item.tab('show');\n $item.parents('li').addClass('active');\n this.onTabChanged($item);\n if (this._config.autoItemActive) {\n this._setItemActive($__default['default'](tabId + \" iframe\").attr('src'));\n }\n };\n _proto.removeActiveTab = function removeActiveTab() {\n var $navItem = $__default['default'](SELECTOR_TAB_NAVBAR_NAV_ITEM + \".active\");\n var $navItemParent = $navItem.parent();\n var navItemIndex = $navItem.index();\n $navItem.remove();\n $__default['default']('.tab-pane.active').remove();\n if ($__default['default'](SELECTOR_TAB_CONTENT).children().length == $__default['default'](SELECTOR_TAB_EMPTY + \", \" + SELECTOR_TAB_LOADING).length) {\n $__default['default'](SELECTOR_TAB_EMPTY).show();\n } else {\n var prevNavItemIndex = navItemIndex - 1;\n this.switchTab($navItemParent.children().eq(prevNavItemIndex).find('a'));\n }\n };\n _proto.toggleFullscreen = function toggleFullscreen() {\n if ($__default['default']('body').hasClass(CLASS_NAME_FULLSCREEN_MODE)) {\n $__default['default'](SELECTOR_DATA_TOGGLE_FULLSCREEN + \" i\").removeClass(this._config.iconMinimize).addClass(this._config.iconMaximize);\n $__default['default']('body').removeClass(CLASS_NAME_FULLSCREEN_MODE);\n $__default['default'](SELECTOR_TAB_EMPTY + \", \" + SELECTOR_TAB_LOADING).height('auto');\n $__default['default'](SELECTOR_CONTENT_WRAPPER).height('auto');\n $__default['default'](SELECTOR_CONTENT_IFRAME).height('auto');\n } else {\n $__default['default'](SELECTOR_DATA_TOGGLE_FULLSCREEN + \" i\").removeClass(this._config.iconMaximize).addClass(this._config.iconMinimize);\n $__default['default']('body').addClass(CLASS_NAME_FULLSCREEN_MODE);\n }\n $__default['default'](window).trigger('resize');\n this._fixHeight(true);\n } // Private\n ;\n\n _proto._init = function _init() {\n if (window.frameElement && this._config.autoIframeMode) {\n $__default['default']('body').addClass(CLASS_NAME_IFRAME_MODE);\n } else if ($__default['default'](SELECTOR_CONTENT_WRAPPER).hasClass(CLASS_NAME_IFRAME_MODE)) {\n this._setupListeners();\n this._fixHeight(true);\n }\n };\n _proto._navScroll = function _navScroll(offset) {\n var leftPos = $__default['default'](SELECTOR_TAB_NAVBAR_NAV).scrollLeft();\n $__default['default'](SELECTOR_TAB_NAVBAR_NAV).animate({\n scrollLeft: leftPos + offset\n }, 250, 'linear');\n };\n _proto._setupListeners = function _setupListeners() {\n var _this2 = this;\n $__default['default'](window).on('resize', function () {\n setTimeout(function () {\n _this2._fixHeight();\n }, 1);\n });\n $__default['default'](document).on('click', SELECTOR_SIDEBAR_MENU_ITEM, function (e) {\n e.preventDefault();\n _this2.openTabSidebar(e.target);\n });\n if (this._config.useNavbarItems) {\n $__default['default'](document).on('click', SELECTOR_HEADER_MENU_ITEM + \", \" + SELECTOR_HEADER_DROPDOWN_ITEM, function (e) {\n e.preventDefault();\n _this2.openTabSidebar(e.target);\n });\n }\n $__default['default'](document).on('click', SELECTOR_TAB_NAVBAR_NAV_ITEM, function (e) {\n e.preventDefault();\n _this2.onTabClick(e.target);\n _this2.switchTab(e.target);\n });\n $__default['default'](document).on('click', SELECTOR_DATA_TOGGLE_CLOSE, function (e) {\n e.preventDefault();\n _this2.removeActiveTab();\n });\n $__default['default'](document).on('click', SELECTOR_DATA_TOGGLE_FULLSCREEN, function (e) {\n e.preventDefault();\n _this2.toggleFullscreen();\n });\n var mousedown = false;\n var mousedownInterval = null;\n $__default['default'](document).on('mousedown', SELECTOR_DATA_TOGGLE_SCROLL_LEFT, function (e) {\n e.preventDefault();\n clearInterval(mousedownInterval);\n var scrollOffset = _this2._config.scrollOffset;\n if (!_this2._config.scrollBehaviorSwap) {\n scrollOffset = -scrollOffset;\n }\n mousedown = true;\n _this2._navScroll(scrollOffset);\n mousedownInterval = setInterval(function () {\n _this2._navScroll(scrollOffset);\n }, 250);\n });\n $__default['default'](document).on('mousedown', SELECTOR_DATA_TOGGLE_SCROLL_RIGHT, function (e) {\n e.preventDefault();\n clearInterval(mousedownInterval);\n var scrollOffset = _this2._config.scrollOffset;\n if (_this2._config.scrollBehaviorSwap) {\n scrollOffset = -scrollOffset;\n }\n mousedown = true;\n _this2._navScroll(scrollOffset);\n mousedownInterval = setInterval(function () {\n _this2._navScroll(scrollOffset);\n }, 250);\n });\n $__default['default'](document).on('mouseup', function () {\n if (mousedown) {\n mousedown = false;\n clearInterval(mousedownInterval);\n mousedownInterval = null;\n }\n });\n };\n _proto._setItemActive = function _setItemActive(href) {\n $__default['default'](SELECTOR_SIDEBAR_MENU_ITEM + \", \" + SELECTOR_HEADER_DROPDOWN_ITEM).removeClass('active');\n $__default['default'](SELECTOR_HEADER_MENU_ITEM).parent().removeClass('active');\n var $headerMenuItem = $__default['default'](SELECTOR_HEADER_MENU_ITEM + \"[href$=\\\"\" + href + \"\\\"]\");\n var $headerDropdownItem = $__default['default'](SELECTOR_HEADER_DROPDOWN_ITEM + \"[href$=\\\"\" + href + \"\\\"]\");\n var $sidebarMenuItem = $__default['default'](SELECTOR_SIDEBAR_MENU_ITEM + \"[href$=\\\"\" + href + \"\\\"]\");\n $headerMenuItem.each(function (i, e) {\n $__default['default'](e).parent().addClass('active');\n });\n $headerDropdownItem.each(function (i, e) {\n $__default['default'](e).addClass('active');\n });\n $sidebarMenuItem.each(function (i, e) {\n $__default['default'](e).addClass('active');\n $__default['default'](e).parents('.nav-treeview').prevAll('.nav-link').addClass('active');\n });\n };\n _proto._fixHeight = function _fixHeight(tabEmpty) {\n if (tabEmpty === void 0) {\n tabEmpty = false;\n }\n if ($__default['default']('body').hasClass(CLASS_NAME_FULLSCREEN_MODE)) {\n var windowHeight = $__default['default'](window).height();\n $__default['default'](SELECTOR_TAB_EMPTY + \", \" + SELECTOR_TAB_LOADING).height(windowHeight);\n $__default['default'](SELECTOR_CONTENT_WRAPPER).height(windowHeight);\n $__default['default'](SELECTOR_CONTENT_IFRAME).height(windowHeight);\n } else {\n var contentWrapperHeight = parseFloat($__default['default'](SELECTOR_CONTENT_WRAPPER).css('min-height'));\n var navbarHeight = $__default['default'](SELECTOR_TAB_NAV).outerHeight();\n if (tabEmpty == true) {\n setTimeout(function () {\n $__default['default'](SELECTOR_TAB_EMPTY + \", \" + SELECTOR_TAB_LOADING).height(contentWrapperHeight - navbarHeight);\n }, 50);\n } else {\n $__default['default'](SELECTOR_CONTENT_IFRAME).height(contentWrapperHeight - navbarHeight);\n }\n }\n } // Static\n ;\n\n IFrame._jQueryInterface = function _jQueryInterface(operation) {\n var data = $__default['default'](this).data(DATA_KEY$7);\n var _options = $__default['default'].extend({}, Default$5, $__default['default'](this).data());\n if (!data) {\n data = new IFrame(this, _options);\n $__default['default'](this).data(DATA_KEY$7, data);\n }\n if (typeof operation === 'string' && operation.match(/createTab|openTabSidebar|switchTab|removeActiveTab/)) {\n var _data;\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n (_data = data)[operation].apply(_data, args);\n }\n };\n return IFrame;\n }();\n /**\n * Data API\n * ====================================================\n */\n\n $__default['default'](window).on('load', function () {\n IFrame._jQueryInterface.call($__default['default'](SELECTOR_DATA_TOGGLE$3));\n });\n /**\n * jQuery API\n * ====================================================\n */\n\n $__default['default'].fn[NAME$7] = IFrame._jQueryInterface;\n $__default['default'].fn[NAME$7].Constructor = IFrame;\n $__default['default'].fn[NAME$7].noConflict = function () {\n $__default['default'].fn[NAME$7] = JQUERY_NO_CONFLICT$7;\n return IFrame._jQueryInterface;\n };\n\n /**\n * --------------------------------------------\n * AdminLTE Layout.js\n * License MIT\n * --------------------------------------------\n */\n /**\n * Constants\n * ====================================================\n */\n\n var NAME$8 = 'Layout';\n var DATA_KEY$8 = 'lte.layout';\n var JQUERY_NO_CONFLICT$8 = $__default['default'].fn[NAME$8];\n var SELECTOR_HEADER$1 = '.main-header';\n var SELECTOR_MAIN_SIDEBAR = '.main-sidebar';\n var SELECTOR_SIDEBAR = '.main-sidebar .sidebar';\n var SELECTOR_CONTENT = '.content-wrapper';\n var SELECTOR_CONTROL_SIDEBAR_CONTENT$1 = '.control-sidebar-content';\n var SELECTOR_CONTROL_SIDEBAR_BTN = '[data-widget=\"control-sidebar\"]';\n var SELECTOR_FOOTER$1 = '.main-footer';\n var SELECTOR_PUSHMENU_BTN = '[data-widget=\"pushmenu\"]';\n var SELECTOR_LOGIN_BOX = '.login-box';\n var SELECTOR_REGISTER_BOX = '.register-box';\n var CLASS_NAME_SIDEBAR_FOCUSED = 'sidebar-focused';\n var CLASS_NAME_LAYOUT_FIXED$1 = 'layout-fixed';\n var CLASS_NAME_CONTROL_SIDEBAR_SLIDE_OPEN = 'control-sidebar-slide-open';\n var CLASS_NAME_CONTROL_SIDEBAR_OPEN$1 = 'control-sidebar-open';\n var Default$6 = {\n scrollbarTheme: 'os-theme-light',\n scrollbarAutoHide: 'l',\n panelAutoHeight: true,\n panelAutoHeightMode: 'min-height',\n loginRegisterAutoHeight: true\n };\n /**\n * Class Definition\n * ====================================================\n */\n\n var Layout = /*#__PURE__*/function () {\n function Layout(element, config) {\n this._config = config;\n this._element = element;\n this._init();\n } // Public\n\n var _proto = Layout.prototype;\n _proto.fixLayoutHeight = function fixLayoutHeight(extra) {\n if (extra === void 0) {\n extra = null;\n }\n var $body = $__default['default']('body');\n var controlSidebar = 0;\n if ($body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE_OPEN) || $body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN$1) || extra === 'control_sidebar') {\n controlSidebar = $__default['default'](SELECTOR_CONTROL_SIDEBAR_CONTENT$1).height();\n }\n var heights = {\n window: $__default['default'](window).height(),\n header: $__default['default'](SELECTOR_HEADER$1).length !== 0 ? $__default['default'](SELECTOR_HEADER$1).outerHeight() : 0,\n footer: $__default['default'](SELECTOR_FOOTER$1).length !== 0 ? $__default['default'](SELECTOR_FOOTER$1).outerHeight() : 0,\n sidebar: $__default['default'](SELECTOR_SIDEBAR).length !== 0 ? $__default['default'](SELECTOR_SIDEBAR).height() : 0,\n controlSidebar: controlSidebar\n };\n var max = this._max(heights);\n var offset = this._config.panelAutoHeight;\n if (offset === true) {\n offset = 0;\n }\n var $contentSelector = $__default['default'](SELECTOR_CONTENT);\n if (offset !== false) {\n if (max === heights.controlSidebar) {\n $contentSelector.css(this._config.panelAutoHeightMode, max + offset);\n } else if (max === heights.window) {\n $contentSelector.css(this._config.panelAutoHeightMode, max + offset - heights.header - heights.footer);\n } else {\n $contentSelector.css(this._config.panelAutoHeightMode, max + offset - heights.header);\n }\n if (this._isFooterFixed()) {\n $contentSelector.css(this._config.panelAutoHeightMode, parseFloat($contentSelector.css(this._config.panelAutoHeightMode)) + heights.footer);\n }\n }\n if (!$body.hasClass(CLASS_NAME_LAYOUT_FIXED$1)) {\n return;\n }\n if (offset !== false) {\n $contentSelector.css(this._config.panelAutoHeightMode, max + offset - heights.header - heights.footer);\n }\n if (typeof $__default['default'].fn.overlayScrollbars !== 'undefined') {\n $__default['default'](SELECTOR_SIDEBAR).overlayScrollbars({\n className: this._config.scrollbarTheme,\n sizeAutoCapable: true,\n scrollbars: {\n autoHide: this._config.scrollbarAutoHide,\n clickScrolling: true\n }\n });\n }\n };\n _proto.fixLoginRegisterHeight = function fixLoginRegisterHeight() {\n var $body = $__default['default']('body');\n var $selector = $__default['default'](SELECTOR_LOGIN_BOX + \", \" + SELECTOR_REGISTER_BOX);\n if ($selector.length === 0) {\n $body.css('height', 'auto');\n $__default['default']('html').css('height', 'auto');\n } else {\n var boxHeight = $selector.height();\n if ($body.css(this._config.panelAutoHeightMode) !== boxHeight) {\n $body.css(this._config.panelAutoHeightMode, boxHeight);\n }\n }\n } // Private\n ;\n\n _proto._init = function _init() {\n var _this = this;\n\n // Activate layout height watcher\n this.fixLayoutHeight();\n if (this._config.loginRegisterAutoHeight === true) {\n this.fixLoginRegisterHeight();\n } else if (this._config.loginRegisterAutoHeight === parseInt(this._config.loginRegisterAutoHeight, 10)) {\n setInterval(this.fixLoginRegisterHeight, this._config.loginRegisterAutoHeight);\n }\n $__default['default'](SELECTOR_SIDEBAR).on('collapsed.lte.treeview expanded.lte.treeview', function () {\n _this.fixLayoutHeight();\n });\n $__default['default'](SELECTOR_PUSHMENU_BTN).on('collapsed.lte.pushmenu shown.lte.pushmenu', function () {\n _this.fixLayoutHeight();\n });\n $__default['default'](SELECTOR_CONTROL_SIDEBAR_BTN).on('collapsed.lte.controlsidebar', function () {\n _this.fixLayoutHeight();\n }).on('expanded.lte.controlsidebar', function () {\n _this.fixLayoutHeight('control_sidebar');\n });\n $__default['default'](window).resize(function () {\n _this.fixLayoutHeight();\n });\n setTimeout(function () {\n $__default['default']('body.hold-transition').removeClass('hold-transition');\n }, 50);\n };\n _proto._max = function _max(numbers) {\n // Calculate the maximum number in a list\n var max = 0;\n Object.keys(numbers).forEach(function (key) {\n if (numbers[key] > max) {\n max = numbers[key];\n }\n });\n return max;\n };\n _proto._isFooterFixed = function _isFooterFixed() {\n return $__default['default'](SELECTOR_FOOTER$1).css('position') === 'fixed';\n } // Static\n ;\n\n Layout._jQueryInterface = function _jQueryInterface(config) {\n if (config === void 0) {\n config = '';\n }\n return this.each(function () {\n var data = $__default['default'](this).data(DATA_KEY$8);\n var _options = $__default['default'].extend({}, Default$6, $__default['default'](this).data());\n if (!data) {\n data = new Layout($__default['default'](this), _options);\n $__default['default'](this).data(DATA_KEY$8, data);\n }\n if (config === 'init' || config === '') {\n data._init();\n } else if (config === 'fixLayoutHeight' || config === 'fixLoginRegisterHeight') {\n data[config]();\n }\n });\n };\n return Layout;\n }();\n /**\n * Data API\n * ====================================================\n */\n\n $__default['default'](window).on('load', function () {\n Layout._jQueryInterface.call($__default['default']('body'));\n });\n $__default['default'](SELECTOR_SIDEBAR + \" a\").on('focusin', function () {\n $__default['default'](SELECTOR_MAIN_SIDEBAR).addClass(CLASS_NAME_SIDEBAR_FOCUSED);\n });\n $__default['default'](SELECTOR_SIDEBAR + \" a\").on('focusout', function () {\n $__default['default'](SELECTOR_MAIN_SIDEBAR).removeClass(CLASS_NAME_SIDEBAR_FOCUSED);\n });\n /**\n * jQuery API\n * ====================================================\n */\n\n $__default['default'].fn[NAME$8] = Layout._jQueryInterface;\n $__default['default'].fn[NAME$8].Constructor = Layout;\n $__default['default'].fn[NAME$8].noConflict = function () {\n $__default['default'].fn[NAME$8] = JQUERY_NO_CONFLICT$8;\n return Layout._jQueryInterface;\n };\n\n /**\n * --------------------------------------------\n * AdminLTE PushMenu.js\n * License MIT\n * --------------------------------------------\n */\n /**\n * Constants\n * ====================================================\n */\n\n var NAME$9 = 'PushMenu';\n var DATA_KEY$9 = 'lte.pushmenu';\n var EVENT_KEY$5 = \".\" + DATA_KEY$9;\n var JQUERY_NO_CONFLICT$9 = $__default['default'].fn[NAME$9];\n var EVENT_COLLAPSED$3 = \"collapsed\" + EVENT_KEY$5;\n var EVENT_SHOWN = \"shown\" + EVENT_KEY$5;\n var SELECTOR_TOGGLE_BUTTON = '[data-widget=\"pushmenu\"]';\n var SELECTOR_BODY = 'body';\n var SELECTOR_OVERLAY = '#sidebar-overlay';\n var SELECTOR_WRAPPER = '.wrapper';\n var CLASS_NAME_COLLAPSED$1 = 'sidebar-collapse';\n var CLASS_NAME_OPEN = 'sidebar-open';\n var CLASS_NAME_IS_OPENING = 'sidebar-is-opening';\n var CLASS_NAME_CLOSED = 'sidebar-closed';\n var Default$7 = {\n autoCollapseSize: 992,\n enableRemember: false,\n noTransitionAfterReload: true\n };\n /**\n * Class Definition\n * ====================================================\n */\n\n var PushMenu = /*#__PURE__*/function () {\n function PushMenu(element, options) {\n this._element = element;\n this._options = $__default['default'].extend({}, Default$7, options);\n if ($__default['default'](SELECTOR_OVERLAY).length === 0) {\n this._addOverlay();\n }\n this._init();\n } // Public\n\n var _proto = PushMenu.prototype;\n _proto.expand = function expand() {\n var $bodySelector = $__default['default'](SELECTOR_BODY);\n if (this._options.autoCollapseSize) {\n if ($__default['default'](window).width() <= this._options.autoCollapseSize) {\n $bodySelector.addClass(CLASS_NAME_OPEN);\n }\n }\n $bodySelector.addClass(CLASS_NAME_IS_OPENING).removeClass(CLASS_NAME_COLLAPSED$1 + \" \" + CLASS_NAME_CLOSED).delay(50).queue(function () {\n $bodySelector.removeClass(CLASS_NAME_IS_OPENING);\n $__default['default'](this).dequeue();\n });\n if (this._options.enableRemember) {\n localStorage.setItem(\"remember\" + EVENT_KEY$5, CLASS_NAME_OPEN);\n }\n $__default['default'](this._element).trigger($__default['default'].Event(EVENT_SHOWN));\n };\n _proto.collapse = function collapse() {\n var $bodySelector = $__default['default'](SELECTOR_BODY);\n if (this._options.autoCollapseSize) {\n if ($__default['default'](window).width() <= this._options.autoCollapseSize) {\n $bodySelector.removeClass(CLASS_NAME_OPEN).addClass(CLASS_NAME_CLOSED);\n }\n }\n $bodySelector.addClass(CLASS_NAME_COLLAPSED$1);\n if (this._options.enableRemember) {\n localStorage.setItem(\"remember\" + EVENT_KEY$5, CLASS_NAME_COLLAPSED$1);\n }\n $__default['default'](this._element).trigger($__default['default'].Event(EVENT_COLLAPSED$3));\n };\n _proto.toggle = function toggle() {\n if ($__default['default'](SELECTOR_BODY).hasClass(CLASS_NAME_COLLAPSED$1)) {\n this.expand();\n } else {\n this.collapse();\n }\n };\n _proto.autoCollapse = function autoCollapse(resize) {\n if (resize === void 0) {\n resize = false;\n }\n if (!this._options.autoCollapseSize) {\n return;\n }\n var $bodySelector = $__default['default'](SELECTOR_BODY);\n if ($__default['default'](window).width() <= this._options.autoCollapseSize) {\n if (!$bodySelector.hasClass(CLASS_NAME_OPEN)) {\n this.collapse();\n }\n } else if (resize === true) {\n if ($bodySelector.hasClass(CLASS_NAME_OPEN)) {\n $bodySelector.removeClass(CLASS_NAME_OPEN);\n } else if ($bodySelector.hasClass(CLASS_NAME_CLOSED)) {\n this.expand();\n }\n }\n };\n _proto.remember = function remember() {\n if (!this._options.enableRemember) {\n return;\n }\n var $body = $__default['default']('body');\n var toggleState = localStorage.getItem(\"remember\" + EVENT_KEY$5);\n if (toggleState === CLASS_NAME_COLLAPSED$1) {\n if (this._options.noTransitionAfterReload) {\n $body.addClass('hold-transition').addClass(CLASS_NAME_COLLAPSED$1).delay(50).queue(function () {\n $__default['default'](this).removeClass('hold-transition');\n $__default['default'](this).dequeue();\n });\n } else {\n $body.addClass(CLASS_NAME_COLLAPSED$1);\n }\n } else if (this._options.noTransitionAfterReload) {\n $body.addClass('hold-transition').removeClass(CLASS_NAME_COLLAPSED$1).delay(50).queue(function () {\n $__default['default'](this).removeClass('hold-transition');\n $__default['default'](this).dequeue();\n });\n } else {\n $body.removeClass(CLASS_NAME_COLLAPSED$1);\n }\n } // Private\n ;\n\n _proto._init = function _init() {\n var _this = this;\n this.remember();\n this.autoCollapse();\n $__default['default'](window).resize(function () {\n _this.autoCollapse(true);\n });\n };\n _proto._addOverlay = function _addOverlay() {\n var _this2 = this;\n var overlay = $__default['default']('<div />', {\n id: 'sidebar-overlay'\n });\n overlay.on('click', function () {\n _this2.collapse();\n });\n $__default['default'](SELECTOR_WRAPPER).append(overlay);\n } // Static\n ;\n\n PushMenu._jQueryInterface = function _jQueryInterface(operation) {\n return this.each(function () {\n var data = $__default['default'](this).data(DATA_KEY$9);\n var _options = $__default['default'].extend({}, Default$7, $__default['default'](this).data());\n if (!data) {\n data = new PushMenu(this, _options);\n $__default['default'](this).data(DATA_KEY$9, data);\n }\n if (typeof operation === 'string' && operation.match(/collapse|expand|toggle/)) {\n data[operation]();\n }\n });\n };\n return PushMenu;\n }();\n /**\n * Data API\n * ====================================================\n */\n\n $__default['default'](document).on('click', SELECTOR_TOGGLE_BUTTON, function (event) {\n event.preventDefault();\n var button = event.currentTarget;\n if ($__default['default'](button).data('widget') !== 'pushmenu') {\n button = $__default['default'](button).closest(SELECTOR_TOGGLE_BUTTON);\n }\n PushMenu._jQueryInterface.call($__default['default'](button), 'toggle');\n });\n $__default['default'](window).on('load', function () {\n PushMenu._jQueryInterface.call($__default['default'](SELECTOR_TOGGLE_BUTTON));\n });\n /**\n * jQuery API\n * ====================================================\n */\n\n $__default['default'].fn[NAME$9] = PushMenu._jQueryInterface;\n $__default['default'].fn[NAME$9].Constructor = PushMenu;\n $__default['default'].fn[NAME$9].noConflict = function () {\n $__default['default'].fn[NAME$9] = JQUERY_NO_CONFLICT$9;\n return PushMenu._jQueryInterface;\n };\n\n /**\n * --------------------------------------------\n * AdminLTE SidebarSearch.js\n * License MIT\n * --------------------------------------------\n */\n /**\n * Constants\n * ====================================================\n */\n\n var NAME$a = 'SidebarSearch';\n var DATA_KEY$a = 'lte.sidebar-search';\n var JQUERY_NO_CONFLICT$a = $__default['default'].fn[NAME$a];\n var CLASS_NAME_OPEN$1 = 'sidebar-search-open';\n var CLASS_NAME_ICON_SEARCH = 'fa-search';\n var CLASS_NAME_ICON_CLOSE = 'fa-times';\n var CLASS_NAME_HEADER = 'nav-header';\n var CLASS_NAME_SEARCH_RESULTS = 'sidebar-search-results';\n var CLASS_NAME_LIST_GROUP = 'list-group';\n var SELECTOR_DATA_WIDGET$1 = '[data-widget=\"sidebar-search\"]';\n var SELECTOR_SIDEBAR$1 = '.main-sidebar .nav-sidebar';\n var SELECTOR_NAV_LINK = '.nav-link';\n var SELECTOR_NAV_TREEVIEW = '.nav-treeview';\n var SELECTOR_SEARCH_INPUT = SELECTOR_DATA_WIDGET$1 + \" .form-control\";\n var SELECTOR_SEARCH_BUTTON = SELECTOR_DATA_WIDGET$1 + \" .btn\";\n var SELECTOR_SEARCH_ICON = SELECTOR_SEARCH_BUTTON + \" i\";\n var SELECTOR_SEARCH_LIST_GROUP = \".\" + CLASS_NAME_LIST_GROUP;\n var SELECTOR_SEARCH_RESULTS = \".\" + CLASS_NAME_SEARCH_RESULTS;\n var SELECTOR_SEARCH_RESULTS_GROUP = SELECTOR_SEARCH_RESULTS + \" .\" + CLASS_NAME_LIST_GROUP;\n var Default$8 = {\n arrowSign: '->',\n minLength: 3,\n maxResults: 7,\n highlightName: true,\n highlightPath: false,\n highlightClass: 'text-light',\n notFoundText: 'No element found!'\n };\n var SearchItems = [];\n /**\n * Class Definition\n * ====================================================\n */\n\n var SidebarSearch = /*#__PURE__*/function () {\n function SidebarSearch(_element, _options) {\n this.element = _element;\n this.options = $__default['default'].extend({}, Default$8, _options);\n this.items = [];\n } // Public\n\n var _proto = SidebarSearch.prototype;\n _proto.init = function init() {\n var _this = this;\n if ($__default['default'](SELECTOR_DATA_WIDGET$1).length == 0) {\n return;\n }\n if ($__default['default'](SELECTOR_DATA_WIDGET$1).next(SELECTOR_SEARCH_RESULTS).length == 0) {\n $__default['default'](SELECTOR_DATA_WIDGET$1).after($__default['default']('<div />', {\n \"class\": CLASS_NAME_SEARCH_RESULTS\n }));\n }\n if ($__default['default'](SELECTOR_SEARCH_RESULTS).children(SELECTOR_SEARCH_LIST_GROUP).length == 0) {\n $__default['default'](SELECTOR_SEARCH_RESULTS).append($__default['default']('<div />', {\n \"class\": CLASS_NAME_LIST_GROUP\n }));\n }\n this._addNotFound();\n $__default['default'](SELECTOR_SIDEBAR$1).children().each(function (i, child) {\n _this._parseItem(child);\n });\n };\n _proto.search = function search() {\n var _this2 = this;\n var searchValue = $__default['default'](SELECTOR_SEARCH_INPUT).val().toLowerCase();\n if (searchValue.length < this.options.minLength) {\n $__default['default'](SELECTOR_SEARCH_RESULTS_GROUP).empty();\n this._addNotFound();\n this.close();\n return;\n }\n var searchResults = SearchItems.filter(function (item) {\n return item.name.toLowerCase().includes(searchValue);\n });\n var endResults = $__default['default'](searchResults.slice(0, this.options.maxResults));\n $__default['default'](SELECTOR_SEARCH_RESULTS_GROUP).empty();\n if (endResults.length === 0) {\n this._addNotFound();\n } else {\n endResults.each(function (i, result) {\n $__default['default'](SELECTOR_SEARCH_RESULTS_GROUP).append(_this2._renderItem(result.name, result.link, result.path));\n });\n }\n this.open();\n };\n _proto.open = function open() {\n $__default['default'](SELECTOR_DATA_WIDGET$1).parent().addClass(CLASS_NAME_OPEN$1);\n $__default['default'](SELECTOR_SEARCH_ICON).removeClass(CLASS_NAME_ICON_SEARCH).addClass(CLASS_NAME_ICON_CLOSE);\n };\n _proto.close = function close() {\n $__default['default'](SELECTOR_DATA_WIDGET$1).parent().removeClass(CLASS_NAME_OPEN$1);\n $__default['default'](SELECTOR_SEARCH_ICON).removeClass(CLASS_NAME_ICON_CLOSE).addClass(CLASS_NAME_ICON_SEARCH);\n };\n _proto.toggle = function toggle() {\n if ($__default['default'](SELECTOR_DATA_WIDGET$1).parent().hasClass(CLASS_NAME_OPEN$1)) {\n this.close();\n } else {\n this.open();\n }\n } // Private\n ;\n\n _proto._parseItem = function _parseItem(item, path) {\n var _this3 = this;\n if (path === void 0) {\n path = [];\n }\n if ($__default['default'](item).hasClass(CLASS_NAME_HEADER)) {\n return;\n }\n var itemObject = {};\n var navLink = $__default['default'](item).clone().find(\"> \" + SELECTOR_NAV_LINK);\n var navTreeview = $__default['default'](item).clone().find(\"> \" + SELECTOR_NAV_TREEVIEW);\n var link = navLink.attr('href');\n var name = navLink.find('p').children().remove().end().text();\n itemObject.name = this._trimText(name);\n itemObject.link = link;\n itemObject.path = path;\n if (navTreeview.length === 0) {\n SearchItems.push(itemObject);\n } else {\n var newPath = itemObject.path.concat([itemObject.name]);\n navTreeview.children().each(function (i, child) {\n _this3._parseItem(child, newPath);\n });\n }\n };\n _proto._trimText = function _trimText(text) {\n return $.trim(text.replace(/(\\r\\n|\\n|\\r)/gm, ' '));\n };\n _proto._renderItem = function _renderItem(name, link, path) {\n var _this4 = this;\n path = path.join(\" \" + this.options.arrowSign + \" \");\n if (this.options.highlightName || this.options.highlightPath) {\n var searchValue = $__default['default'](SELECTOR_SEARCH_INPUT).val().toLowerCase();\n var regExp = new RegExp(searchValue, 'gi');\n if (this.options.highlightName) {\n name = name.replace(regExp, function (str) {\n return \"<b class=\\\"\" + _this4.options.highlightClass + \"\\\">\" + str + \"</b>\";\n });\n }\n if (this.options.highlightPath) {\n path = path.replace(regExp, function (str) {\n return \"<b class=\\\"\" + _this4.options.highlightClass + \"\\\">\" + str + \"</b>\";\n });\n }\n }\n return \"<a href=\\\"\" + link + \"\\\" class=\\\"list-group-item\\\">\\n <div class=\\\"search-title\\\">\\n \" + name + \"\\n </div>\\n <div class=\\\"search-path\\\">\\n \" + path + \"\\n </div>\\n </a>\";\n };\n _proto._addNotFound = function _addNotFound() {\n $__default['default'](SELECTOR_SEARCH_RESULTS_GROUP).append(this._renderItem(this.options.notFoundText, '#', []));\n } // Static\n ;\n\n SidebarSearch._jQueryInterface = function _jQueryInterface(config) {\n var data = $__default['default'](this).data(DATA_KEY$a);\n if (!data) {\n data = $__default['default'](this).data();\n }\n var _options = $__default['default'].extend({}, Default$8, _typeof(config) === 'object' ? config : data);\n var plugin = new SidebarSearch($__default['default'](this), _options);\n $__default['default'](this).data(DATA_KEY$a, _typeof(config) === 'object' ? config : data);\n if (typeof config === 'string' && config.match(/init|toggle|close|open|search/)) {\n plugin[config]();\n } else {\n plugin.init();\n }\n };\n return SidebarSearch;\n }();\n /**\n * Data API\n * ====================================================\n */\n\n $__default['default'](document).on('click', SELECTOR_SEARCH_BUTTON, function (event) {\n event.preventDefault();\n SidebarSearch._jQueryInterface.call($__default['default'](SELECTOR_DATA_WIDGET$1), 'toggle');\n });\n $__default['default'](document).on('keyup', SELECTOR_SEARCH_INPUT, function (event) {\n if (event.keyCode == 38) {\n event.preventDefault();\n $__default['default'](SELECTOR_SEARCH_RESULTS_GROUP).children().last().focus();\n return;\n }\n if (event.keyCode == 40) {\n event.preventDefault();\n $__default['default'](SELECTOR_SEARCH_RESULTS_GROUP).children().first().focus();\n return;\n }\n var timer = 0;\n clearTimeout(timer);\n timer = setTimeout(function () {\n SidebarSearch._jQueryInterface.call($__default['default'](SELECTOR_DATA_WIDGET$1), 'search');\n }, 100);\n });\n $__default['default'](document).on('keydown', SELECTOR_SEARCH_RESULTS_GROUP, function (event) {\n var $focused = $__default['default'](':focus');\n if (event.keyCode == 38) {\n event.preventDefault();\n if ($focused.is(':first-child')) {\n $focused.siblings().last().focus();\n } else {\n $focused.prev().focus();\n }\n }\n if (event.keyCode == 40) {\n event.preventDefault();\n if ($focused.is(':last-child')) {\n $focused.siblings().first().focus();\n } else {\n $focused.next().focus();\n }\n }\n });\n $__default['default'](window).on('load', function () {\n SidebarSearch._jQueryInterface.call($__default['default'](SELECTOR_DATA_WIDGET$1), 'init');\n });\n /**\n * jQuery API\n * ====================================================\n */\n\n $__default['default'].fn[NAME$a] = SidebarSearch._jQueryInterface;\n $__default['default'].fn[NAME$a].Constructor = SidebarSearch;\n $__default['default'].fn[NAME$a].noConflict = function () {\n $__default['default'].fn[NAME$a] = JQUERY_NO_CONFLICT$a;\n return SidebarSearch._jQueryInterface;\n };\n\n /**\n * --------------------------------------------\n * AdminLTE Toasts.js\n * License MIT\n * --------------------------------------------\n */\n /**\n * Constants\n * ====================================================\n */\n\n var NAME$b = 'Toasts';\n var DATA_KEY$b = 'lte.toasts';\n var EVENT_KEY$6 = \".\" + DATA_KEY$b;\n var JQUERY_NO_CONFLICT$b = $__default['default'].fn[NAME$b];\n var EVENT_INIT = \"init\" + EVENT_KEY$6;\n var EVENT_CREATED = \"created\" + EVENT_KEY$6;\n var EVENT_REMOVED$1 = \"removed\" + EVENT_KEY$6;\n var SELECTOR_CONTAINER_TOP_RIGHT = '#toastsContainerTopRight';\n var SELECTOR_CONTAINER_TOP_LEFT = '#toastsContainerTopLeft';\n var SELECTOR_CONTAINER_BOTTOM_RIGHT = '#toastsContainerBottomRight';\n var SELECTOR_CONTAINER_BOTTOM_LEFT = '#toastsContainerBottomLeft';\n var CLASS_NAME_TOP_RIGHT = 'toasts-top-right';\n var CLASS_NAME_TOP_LEFT = 'toasts-top-left';\n var CLASS_NAME_BOTTOM_RIGHT = 'toasts-bottom-right';\n var CLASS_NAME_BOTTOM_LEFT = 'toasts-bottom-left';\n var POSITION_TOP_RIGHT = 'topRight';\n var POSITION_TOP_LEFT = 'topLeft';\n var POSITION_BOTTOM_RIGHT = 'bottomRight';\n var POSITION_BOTTOM_LEFT = 'bottomLeft';\n var Default$9 = {\n position: POSITION_TOP_RIGHT,\n fixed: true,\n autohide: false,\n autoremove: true,\n delay: 1000,\n fade: true,\n icon: null,\n image: null,\n imageAlt: null,\n imageHeight: '25px',\n title: null,\n subtitle: null,\n close: true,\n body: null,\n \"class\": null\n };\n /**\n * Class Definition\n * ====================================================\n */\n\n var Toasts = /*#__PURE__*/function () {\n function Toasts(element, config) {\n this._config = config;\n this._prepareContainer();\n $__default['default']('body').trigger($__default['default'].Event(EVENT_INIT));\n } // Public\n\n var _proto = Toasts.prototype;\n _proto.create = function create() {\n var toast = $__default['default']('<div class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\"/>');\n toast.data('autohide', this._config.autohide);\n toast.data('animation', this._config.fade);\n if (this._config[\"class\"]) {\n toast.addClass(this._config[\"class\"]);\n }\n if (this._config.delay && this._config.delay != 500) {\n toast.data('delay', this._config.delay);\n }\n var toastHeader = $__default['default']('<div class=\"toast-header\">');\n if (this._config.image != null) {\n var toastImage = $__default['default']('<img />').addClass('rounded mr-2').attr('src', this._config.image).attr('alt', this._config.imageAlt);\n if (this._config.imageHeight != null) {\n toastImage.height(this._config.imageHeight).width('auto');\n }\n toastHeader.append(toastImage);\n }\n if (this._config.icon != null) {\n toastHeader.append($__default['default']('<i />').addClass('mr-2').addClass(this._config.icon));\n }\n if (this._config.title != null) {\n toastHeader.append($__default['default']('<strong />').addClass('mr-auto').html(this._config.title));\n }\n if (this._config.subtitle != null) {\n toastHeader.append($__default['default']('<small />').html(this._config.subtitle));\n }\n if (this._config.close == true) {\n var toastClose = $__default['default']('<button data-dismiss=\"toast\" />').attr('type', 'button').addClass('ml-2 mb-1 close').attr('aria-label', 'Close').append('<span aria-hidden=\"true\">&times;</span>');\n if (this._config.title == null) {\n toastClose.toggleClass('ml-2 ml-auto');\n }\n toastHeader.append(toastClose);\n }\n toast.append(toastHeader);\n if (this._config.body != null) {\n toast.append($__default['default']('<div class=\"toast-body\" />').html(this._config.body));\n }\n $__default['default'](this._getContainerId()).prepend(toast);\n var $body = $__default['default']('body');\n $body.trigger($__default['default'].Event(EVENT_CREATED));\n toast.toast('show');\n if (this._config.autoremove) {\n toast.on('hidden.bs.toast', function () {\n $__default['default'](this).delay(200).remove();\n $body.trigger($__default['default'].Event(EVENT_REMOVED$1));\n });\n }\n } // Static\n ;\n\n _proto._getContainerId = function _getContainerId() {\n if (this._config.position == POSITION_TOP_RIGHT) {\n return SELECTOR_CONTAINER_TOP_RIGHT;\n }\n if (this._config.position == POSITION_TOP_LEFT) {\n return SELECTOR_CONTAINER_TOP_LEFT;\n }\n if (this._config.position == POSITION_BOTTOM_RIGHT) {\n return SELECTOR_CONTAINER_BOTTOM_RIGHT;\n }\n if (this._config.position == POSITION_BOTTOM_LEFT) {\n return SELECTOR_CONTAINER_BOTTOM_LEFT;\n }\n };\n _proto._prepareContainer = function _prepareContainer() {\n if ($__default['default'](this._getContainerId()).length === 0) {\n var container = $__default['default']('<div />').attr('id', this._getContainerId().replace('#', ''));\n if (this._config.position == POSITION_TOP_RIGHT) {\n container.addClass(CLASS_NAME_TOP_RIGHT);\n } else if (this._config.position == POSITION_TOP_LEFT) {\n container.addClass(CLASS_NAME_TOP_LEFT);\n } else if (this._config.position == POSITION_BOTTOM_RIGHT) {\n container.addClass(CLASS_NAME_BOTTOM_RIGHT);\n } else if (this._config.position == POSITION_BOTTOM_LEFT) {\n container.addClass(CLASS_NAME_BOTTOM_LEFT);\n }\n $__default['default']('body').append(container);\n }\n if (this._config.fixed) {\n $__default['default'](this._getContainerId()).addClass('fixed');\n } else {\n $__default['default'](this._getContainerId()).removeClass('fixed');\n }\n } // Static\n ;\n\n Toasts._jQueryInterface = function _jQueryInterface(option, config) {\n return this.each(function () {\n var _options = $__default['default'].extend({}, Default$9, config);\n var toast = new Toasts($__default['default'](this), _options);\n if (option === 'create') {\n toast[option]();\n }\n });\n };\n return Toasts;\n }();\n /**\n * jQuery API\n * ====================================================\n */\n\n $__default['default'].fn[NAME$b] = Toasts._jQueryInterface;\n $__default['default'].fn[NAME$b].Constructor = Toasts;\n $__default['default'].fn[NAME$b].noConflict = function () {\n $__default['default'].fn[NAME$b] = JQUERY_NO_CONFLICT$b;\n return Toasts._jQueryInterface;\n };\n\n /**\n * --------------------------------------------\n * AdminLTE TodoList.js\n * License MIT\n * --------------------------------------------\n */\n /**\n * Constants\n * ====================================================\n */\n\n var NAME$c = 'TodoList';\n var DATA_KEY$c = 'lte.todolist';\n var JQUERY_NO_CONFLICT$c = $__default['default'].fn[NAME$c];\n var SELECTOR_DATA_TOGGLE$4 = '[data-widget=\"todo-list\"]';\n var CLASS_NAME_TODO_LIST_DONE = 'done';\n var Default$a = {\n onCheck: function onCheck(item) {\n return item;\n },\n onUnCheck: function onUnCheck(item) {\n return item;\n }\n };\n /**\n * Class Definition\n * ====================================================\n */\n\n var TodoList = /*#__PURE__*/function () {\n function TodoList(element, config) {\n this._config = config;\n this._element = element;\n this._init();\n } // Public\n\n var _proto = TodoList.prototype;\n _proto.toggle = function toggle(item) {\n item.parents('li').toggleClass(CLASS_NAME_TODO_LIST_DONE);\n if (!$__default['default'](item).prop('checked')) {\n this.unCheck($__default['default'](item));\n return;\n }\n this.check(item);\n };\n _proto.check = function check(item) {\n this._config.onCheck.call(item);\n };\n _proto.unCheck = function unCheck(item) {\n this._config.onUnCheck.call(item);\n } // Private\n ;\n\n _proto._init = function _init() {\n var _this = this;\n var $toggleSelector = this._element;\n $toggleSelector.find('input:checkbox:checked').parents('li').toggleClass(CLASS_NAME_TODO_LIST_DONE);\n $toggleSelector.on('change', 'input:checkbox', function (event) {\n _this.toggle($__default['default'](event.target));\n });\n } // Static\n ;\n\n TodoList._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $__default['default'](this).data(DATA_KEY$c);\n if (!data) {\n data = $__default['default'](this).data();\n }\n var _options = $__default['default'].extend({}, Default$a, _typeof(config) === 'object' ? config : data);\n var plugin = new TodoList($__default['default'](this), _options);\n $__default['default'](this).data(DATA_KEY$c, _typeof(config) === 'object' ? config : data);\n if (config === 'init') {\n plugin[config]();\n }\n });\n };\n return TodoList;\n }();\n /**\n * Data API\n * ====================================================\n */\n\n $__default['default'](window).on('load', function () {\n TodoList._jQueryInterface.call($__default['default'](SELECTOR_DATA_TOGGLE$4));\n });\n /**\n * jQuery API\n * ====================================================\n */\n\n $__default['default'].fn[NAME$c] = TodoList._jQueryInterface;\n $__default['default'].fn[NAME$c].Constructor = TodoList;\n $__default['default'].fn[NAME$c].noConflict = function () {\n $__default['default'].fn[NAME$c] = JQUERY_NO_CONFLICT$c;\n return TodoList._jQueryInterface;\n };\n\n /**\n * --------------------------------------------\n * AdminLTE Treeview.js\n * License MIT\n * --------------------------------------------\n */\n /**\n * Constants\n * ====================================================\n */\n\n var NAME$d = 'Treeview';\n var DATA_KEY$d = 'lte.treeview';\n var EVENT_KEY$7 = \".\" + DATA_KEY$d;\n var JQUERY_NO_CONFLICT$d = $__default['default'].fn[NAME$d];\n var EVENT_EXPANDED$3 = \"expanded\" + EVENT_KEY$7;\n var EVENT_COLLAPSED$4 = \"collapsed\" + EVENT_KEY$7;\n var EVENT_LOAD_DATA_API = \"load\" + EVENT_KEY$7;\n var SELECTOR_LI = '.nav-item';\n var SELECTOR_LINK = '.nav-link';\n var SELECTOR_TREEVIEW_MENU = '.nav-treeview';\n var SELECTOR_OPEN = '.menu-open';\n var SELECTOR_DATA_WIDGET$2 = '[data-widget=\"treeview\"]';\n var CLASS_NAME_OPEN$2 = 'menu-open';\n var CLASS_NAME_IS_OPENING$1 = 'menu-is-opening';\n var CLASS_NAME_SIDEBAR_COLLAPSED = 'sidebar-collapse';\n var Default$b = {\n trigger: SELECTOR_DATA_WIDGET$2 + \" \" + SELECTOR_LINK,\n animationSpeed: 300,\n accordion: true,\n expandSidebar: false,\n sidebarButtonSelector: '[data-widget=\"pushmenu\"]'\n };\n /**\n * Class Definition\n * ====================================================\n */\n\n var Treeview = /*#__PURE__*/function () {\n function Treeview(element, config) {\n this._config = config;\n this._element = element;\n } // Public\n\n var _proto = Treeview.prototype;\n _proto.init = function init() {\n $__default['default'](\"\" + SELECTOR_LI + SELECTOR_OPEN + \" \" + SELECTOR_TREEVIEW_MENU).css('display', 'block');\n this._setupListeners();\n };\n _proto.expand = function expand(treeviewMenu, parentLi) {\n var _this = this;\n var expandedEvent = $__default['default'].Event(EVENT_EXPANDED$3);\n if (this._config.accordion) {\n var openMenuLi = parentLi.siblings(SELECTOR_OPEN).first();\n var openTreeview = openMenuLi.find(SELECTOR_TREEVIEW_MENU).first();\n this.collapse(openTreeview, openMenuLi);\n }\n parentLi.addClass(CLASS_NAME_IS_OPENING$1);\n treeviewMenu.stop().slideDown(this._config.animationSpeed, function () {\n parentLi.addClass(CLASS_NAME_OPEN$2);\n $__default['default'](_this._element).trigger(expandedEvent);\n });\n if (this._config.expandSidebar) {\n this._expandSidebar();\n }\n };\n _proto.collapse = function collapse(treeviewMenu, parentLi) {\n var _this2 = this;\n var collapsedEvent = $__default['default'].Event(EVENT_COLLAPSED$4);\n parentLi.removeClass(CLASS_NAME_IS_OPENING$1 + \" \" + CLASS_NAME_OPEN$2);\n treeviewMenu.stop().slideUp(this._config.animationSpeed, function () {\n $__default['default'](_this2._element).trigger(collapsedEvent);\n treeviewMenu.find(SELECTOR_OPEN + \" > \" + SELECTOR_TREEVIEW_MENU).slideUp();\n treeviewMenu.find(SELECTOR_OPEN).removeClass(CLASS_NAME_OPEN$2);\n });\n };\n _proto.toggle = function toggle(event) {\n var $relativeTarget = $__default['default'](event.currentTarget);\n var $parent = $relativeTarget.parent();\n var treeviewMenu = $parent.find(\"> \" + SELECTOR_TREEVIEW_MENU);\n if (!treeviewMenu.is(SELECTOR_TREEVIEW_MENU)) {\n if (!$parent.is(SELECTOR_LI)) {\n treeviewMenu = $parent.parent().find(\"> \" + SELECTOR_TREEVIEW_MENU);\n }\n if (!treeviewMenu.is(SELECTOR_TREEVIEW_MENU)) {\n return;\n }\n }\n event.preventDefault();\n var parentLi = $relativeTarget.parents(SELECTOR_LI).first();\n var isOpen = parentLi.hasClass(CLASS_NAME_OPEN$2);\n if (isOpen) {\n this.collapse($__default['default'](treeviewMenu), parentLi);\n } else {\n this.expand($__default['default'](treeviewMenu), parentLi);\n }\n } // Private\n ;\n\n _proto._setupListeners = function _setupListeners() {\n var _this3 = this;\n var elementId = this._element.attr('id') !== undefined ? \"#\" + this._element.attr('id') : '';\n $__default['default'](document).on('click', \"\" + elementId + this._config.trigger, function (event) {\n _this3.toggle(event);\n });\n };\n _proto._expandSidebar = function _expandSidebar() {\n if ($__default['default']('body').hasClass(CLASS_NAME_SIDEBAR_COLLAPSED)) {\n $__default['default'](this._config.sidebarButtonSelector).PushMenu('expand');\n }\n } // Static\n ;\n\n Treeview._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $__default['default'](this).data(DATA_KEY$d);\n var _options = $__default['default'].extend({}, Default$b, $__default['default'](this).data());\n if (!data) {\n data = new Treeview($__default['default'](this), _options);\n $__default['default'](this).data(DATA_KEY$d, data);\n }\n if (config === 'init') {\n data[config]();\n }\n });\n };\n return Treeview;\n }();\n /**\n * Data API\n * ====================================================\n */\n\n $__default['default'](window).on(EVENT_LOAD_DATA_API, function () {\n $__default['default'](SELECTOR_DATA_WIDGET$2).each(function () {\n Treeview._jQueryInterface.call($__default['default'](this), 'init');\n });\n });\n /**\n * jQuery API\n * ====================================================\n */\n\n $__default['default'].fn[NAME$d] = Treeview._jQueryInterface;\n $__default['default'].fn[NAME$d].Constructor = Treeview;\n $__default['default'].fn[NAME$d].noConflict = function () {\n $__default['default'].fn[NAME$d] = JQUERY_NO_CONFLICT$d;\n return Treeview._jQueryInterface;\n };\n exports.CardRefresh = CardRefresh;\n exports.CardWidget = CardWidget;\n exports.ControlSidebar = ControlSidebar;\n exports.DirectChat = DirectChat;\n exports.Dropdown = Dropdown;\n exports.ExpandableTable = ExpandableTable;\n exports.Fullscreen = Fullscreen;\n exports.IFrame = IFrame;\n exports.Layout = Layout;\n exports.PushMenu = PushMenu;\n exports.SidebarSearch = SidebarSearch;\n exports.Toasts = Toasts;\n exports.TodoList = TodoList;\n exports.Treeview = Treeview;\n Object.defineProperty(exports, '__esModule', {\n value: true\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQytQLFVBQVUsR0FBR0EsVUFBVTtFQUMvQi9QLE9BQU8sQ0FBQ2lULE1BQU0sR0FBR0EsTUFBTTtFQUN2QmpULE9BQU8sQ0FBQ21ZLE1BQU0sR0FBR0EsTUFBTTtFQUN2Qm5ZLE9BQU8sQ0FBQ3VhLFFBQVEsR0FBR0EsUUFBUTtFQUMzQnZhLE9BQU8sQ0FBQ2dkLGFBQWEsR0FBR0EsYUFBYTtFQUNyQ2hkLE9BQU8sQ0FBQzJoQixNQUFNLEdBQUdBLE1BQU07RUFDdkIzaEIsT0FBTyxDQUFDOGlCLFFBQVEsR0FBR0EsUUFBUTtFQUMzQjlpQixPQUFPLENBQUNza0IsUUFBUSxHQUFHQSxRQUFRO0VBRTNCckwsTUFBTSxDQUFDaU0sY0FBYyxDQUFDbGxCLE9BQU8sRUFBRSxZQUFZLEVBQUU7SUFBRW1sQixLQUFLLEVBQUU7RUFBSyxDQUFDLENBQUM7QUFFL0QsQ0FBQyxDQUFFIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2FkbWlubHRlLmpzPzYxMjYiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBBZG1pbkxURSB2My4xLjAtcmMgKGh0dHBzOi8vYWRtaW5sdGUuaW8pXG4gKiBDb3B5cmlnaHQgMjAxNC0yMDIwIENvbG9ybGliIDxodHRwczovL2NvbG9ybGliLmNvbT5cbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL0NvbG9ybGliSFEvQWRtaW5MVEUvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCdqcXVlcnknKSkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJywgJ2pxdWVyeSddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGZhY3RvcnkoZ2xvYmFsLmFkbWlubHRlID0ge30sIGdsb2JhbC5qUXVlcnkpKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLCAkKSB7ICd1c2Ugc3RyaWN0JztcblxuICBmdW5jdGlvbiBfaW50ZXJvcERlZmF1bHRMZWdhY3kgKGUpIHsgcmV0dXJuIGUgJiYgdHlwZW9mIGUgPT09ICdvYmplY3QnICYmICdkZWZhdWx0JyBpbiBlID8gZSA6IHsgJ2RlZmF1bHQnOiBlIH07IH1cblxuICB2YXIgJF9fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9faW50ZXJvcERlZmF1bHRMZWdhY3koJCk7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEFkbWluTFRFIENhcmRSZWZyZXNoLmpzXG4gICAqIExpY2Vuc2UgTUlUXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICAvKipcbiAgICogQ29uc3RhbnRzXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICovXG5cbiAgdmFyIE5BTUUgPSAnQ2FyZFJlZnJlc2gnO1xuICB2YXIgREFUQV9LRVkgPSAnbHRlLmNhcmRyZWZyZXNoJztcbiAgdmFyIEVWRU5UX0tFWSA9IFwiLlwiICsgREFUQV9LRVk7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRV07XG4gIHZhciBFVkVOVF9MT0FERUQgPSBcImxvYWRlZFwiICsgRVZFTlRfS0VZO1xuICB2YXIgRVZFTlRfT1ZFUkxBWV9BRERFRCA9IFwib3ZlcmxheS5hZGRlZFwiICsgRVZFTlRfS0VZO1xuICB2YXIgRVZFTlRfT1ZFUkxBWV9SRU1PVkVEID0gXCJvdmVybGF5LnJlbW92ZWRcIiArIEVWRU5UX0tFWTtcbiAgdmFyIENMQVNTX05BTUVfQ0FSRCA9ICdjYXJkJztcbiAgdmFyIFNFTEVDVE9SX0NBUkQgPSBcIi5cIiArIENMQVNTX05BTUVfQ0FSRDtcbiAgdmFyIFNFTEVDVE9SX0RBVEFfUkVGUkVTSCA9ICdbZGF0YS1jYXJkLXdpZGdldD1cImNhcmQtcmVmcmVzaFwiXSc7XG4gIHZhciBEZWZhdWx0ID0ge1xuICAgIHNvdXJjZTogJycsXG4gICAgc291cmNlU2VsZWN0b3I6ICcnLFxuICAgIHBhcmFtczoge30sXG4gICAgdHJpZ2dlcjogU0VMRUNUT1JfREFUQV9SRUZSRVNILFxuICAgIGNvbnRlbnQ6ICcuY2FyZC1ib2R5JyxcbiAgICBsb2FkSW5Db250ZW50OiB0cnVlLFxuICAgIGxvYWRPbkluaXQ6IHRydWUsXG4gICAgcmVzcG9uc2VUeXBlOiAnJyxcbiAgICBvdmVybGF5VGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwib3ZlcmxheVwiPjxpIGNsYXNzPVwiZmFzIGZhLTJ4IGZhLXN5bmMtYWx0IGZhLXNwaW5cIj48L2k+PC9kaXY+JyxcbiAgICBvbkxvYWRTdGFydDogZnVuY3Rpb24gb25Mb2FkU3RhcnQoKSB7fSxcbiAgICBvbkxvYWREb25lOiBmdW5jdGlvbiBvbkxvYWREb25lKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICB9O1xuXG4gIHZhciBDYXJkUmVmcmVzaCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2FyZFJlZnJlc2goZWxlbWVudCwgc2V0dGluZ3MpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgdGhpcy5fcGFyZW50ID0gZWxlbWVudC5wYXJlbnRzKFNFTEVDVE9SX0NBUkQpLmZpcnN0KCk7XG4gICAgICB0aGlzLl9zZXR0aW5ncyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5leHRlbmQoe30sIERlZmF1bHQsIHNldHRpbmdzKTtcbiAgICAgIHRoaXMuX292ZXJsYXkgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fc2V0dGluZ3Mub3ZlcmxheVRlbXBsYXRlKTtcblxuICAgICAgaWYgKGVsZW1lbnQuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9DQVJEKSkge1xuICAgICAgICB0aGlzLl9wYXJlbnQgPSBlbGVtZW50O1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fc2V0dGluZ3Muc291cmNlID09PSAnJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvdXJjZSB1cmwgd2FzIG5vdCBkZWZpbmVkLiBQbGVhc2Ugc3BlY2lmeSBhIHVybCBpbiB5b3VyIENhcmRSZWZyZXNoIHNvdXJjZSBvcHRpb24uJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIF9wcm90byA9IENhcmRSZWZyZXNoLnByb3RvdHlwZTtcblxuICAgIF9wcm90by5sb2FkID0gZnVuY3Rpb24gbG9hZCgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHRoaXMuX2FkZE92ZXJsYXkoKTtcblxuICAgICAgdGhpcy5fc2V0dGluZ3Mub25Mb2FkU3RhcnQuY2FsbCgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykpO1xuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10uZ2V0KHRoaXMuX3NldHRpbmdzLnNvdXJjZSwgdGhpcy5fc2V0dGluZ3MucGFyYW1zLCBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKF90aGlzLl9zZXR0aW5ncy5sb2FkSW5Db250ZW50KSB7XG4gICAgICAgICAgaWYgKF90aGlzLl9zZXR0aW5ncy5zb3VyY2VTZWxlY3RvciAhPT0gJycpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHJlc3BvbnNlKS5maW5kKF90aGlzLl9zZXR0aW5ncy5zb3VyY2VTZWxlY3RvcikuaHRtbCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzLl9wYXJlbnQuZmluZChfdGhpcy5fc2V0dGluZ3MuY29udGVudCkuaHRtbChyZXNwb25zZSk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5fc2V0dGluZ3Mub25Mb2FkRG9uZS5jYWxsKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShfdGhpcyksIHJlc3BvbnNlKTtcblxuICAgICAgICBfdGhpcy5fcmVtb3ZlT3ZlcmxheSgpO1xuICAgICAgfSwgdGhpcy5fc2V0dGluZ3MucmVzcG9uc2VUeXBlICE9PSAnJyAmJiB0aGlzLl9zZXR0aW5ncy5yZXNwb25zZVR5cGUpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX0xPQURFRCkpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2FkZE92ZXJsYXkgPSBmdW5jdGlvbiBfYWRkT3ZlcmxheSgpIHtcbiAgICAgIHRoaXMuX3BhcmVudC5hcHBlbmQodGhpcy5fb3ZlcmxheSk7XG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9PVkVSTEFZX0FEREVEKSk7XG4gICAgfTtcblxuICAgIF9wcm90by5fcmVtb3ZlT3ZlcmxheSA9IGZ1bmN0aW9uIF9yZW1vdmVPdmVybGF5KCkge1xuICAgICAgdGhpcy5fcGFyZW50LmZpbmQodGhpcy5fb3ZlcmxheSkucmVtb3ZlKCk7XG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9PVkVSTEFZX1JFTU9WRUQpKTtcbiAgICB9IC8vIFByaXZhdGVcbiAgICA7XG5cbiAgICBfcHJvdG8uX2luaXQgPSBmdW5jdGlvbiBfaW5pdCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZmluZCh0aGlzLl9zZXR0aW5ncy50cmlnZ2VyKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMi5sb2FkKCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLmxvYWRPbkluaXQpIHtcbiAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgICB9XG4gICAgfSAvLyBTdGF0aWNcbiAgICA7XG5cbiAgICBDYXJkUmVmcmVzaC5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgIHZhciBkYXRhID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkpO1xuXG4gICAgICB2YXIgX29wdGlvbnMgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZXh0ZW5kKHt9LCBEZWZhdWx0LCAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YSgpKTtcblxuICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIGRhdGEgPSBuZXcgQ2FyZFJlZnJlc2goJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCBfb3B0aW9ucyk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZLCB0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJyA/IGRhdGEgOiBjb25maWcpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycgJiYgY29uZmlnLm1hdGNoKC9sb2FkLykpIHtcbiAgICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhLl9pbml0KCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBDYXJkUmVmcmVzaDtcbiAgfSgpO1xuICAvKipcbiAgICogRGF0YSBBUElcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub24oJ2NsaWNrJywgU0VMRUNUT1JfREFUQV9SRUZSRVNILCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgQ2FyZFJlZnJlc2guX2pRdWVyeUludGVyZmFjZS5jYWxsKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSwgJ2xvYWQnKTtcbiAgfSk7XG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShmdW5jdGlvbiAoKSB7XG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0RBVEFfUkVGUkVTSCkuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBDYXJkUmVmcmVzaC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpKTtcbiAgICB9KTtcbiAgfSk7XG4gIC8qKlxuICAgKiBqUXVlcnkgQVBJXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICovXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUVdID0gQ2FyZFJlZnJlc2guX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUVdLkNvbnN0cnVjdG9yID0gQ2FyZFJlZnJlc2g7XG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUVdID0gSlFVRVJZX05PX0NPTkZMSUNUO1xuICAgIHJldHVybiBDYXJkUmVmcmVzaC5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBBZG1pbkxURSBDYXJkV2lkZ2V0LmpzXG4gICAqIExpY2Vuc2UgTUlUXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICAvKipcbiAgICogQ29uc3RhbnRzXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICovXG5cbiAgdmFyIE5BTUUkMSA9ICdDYXJkV2lkZ2V0JztcbiAgdmFyIERBVEFfS0VZJDEgPSAnbHRlLmNhcmR3aWRnZXQnO1xuICB2YXIgRVZFTlRfS0VZJDEgPSBcIi5cIiArIERBVEFfS0VZJDE7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkMSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDFdO1xuICB2YXIgRVZFTlRfRVhQQU5ERUQgPSBcImV4cGFuZGVkXCIgKyBFVkVOVF9LRVkkMTtcbiAgdmFyIEVWRU5UX0NPTExBUFNFRCA9IFwiY29sbGFwc2VkXCIgKyBFVkVOVF9LRVkkMTtcbiAgdmFyIEVWRU5UX01BWElNSVpFRCA9IFwibWF4aW1pemVkXCIgKyBFVkVOVF9LRVkkMTtcbiAgdmFyIEVWRU5UX01JTklNSVpFRCA9IFwibWluaW1pemVkXCIgKyBFVkVOVF9LRVkkMTtcbiAgdmFyIEVWRU5UX1JFTU9WRUQgPSBcInJlbW92ZWRcIiArIEVWRU5UX0tFWSQxO1xuICB2YXIgQ0xBU1NfTkFNRV9DQVJEJDEgPSAnY2FyZCc7XG4gIHZhciBDTEFTU19OQU1FX0NPTExBUFNFRCA9ICdjb2xsYXBzZWQtY2FyZCc7XG4gIHZhciBDTEFTU19OQU1FX0NPTExBUFNJTkcgPSAnY29sbGFwc2luZy1jYXJkJztcbiAgdmFyIENMQVNTX05BTUVfRVhQQU5ESU5HID0gJ2V4cGFuZGluZy1jYXJkJztcbiAgdmFyIENMQVNTX05BTUVfV0FTX0NPTExBUFNFRCA9ICd3YXMtY29sbGFwc2VkJztcbiAgdmFyIENMQVNTX05BTUVfTUFYSU1JWkVEID0gJ21heGltaXplZC1jYXJkJztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfUkVNT1ZFID0gJ1tkYXRhLWNhcmQtd2lkZ2V0PVwicmVtb3ZlXCJdJztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfQ09MTEFQU0UgPSAnW2RhdGEtY2FyZC13aWRnZXQ9XCJjb2xsYXBzZVwiXSc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX01BWElNSVpFID0gJ1tkYXRhLWNhcmQtd2lkZ2V0PVwibWF4aW1pemVcIl0nO1xuICB2YXIgU0VMRUNUT1JfQ0FSRCQxID0gXCIuXCIgKyBDTEFTU19OQU1FX0NBUkQkMTtcbiAgdmFyIFNFTEVDVE9SX0NBUkRfSEVBREVSID0gJy5jYXJkLWhlYWRlcic7XG4gIHZhciBTRUxFQ1RPUl9DQVJEX0JPRFkgPSAnLmNhcmQtYm9keSc7XG4gIHZhciBTRUxFQ1RPUl9DQVJEX0ZPT1RFUiA9ICcuY2FyZC1mb290ZXInO1xuICB2YXIgRGVmYXVsdCQxID0ge1xuICAgIGFuaW1hdGlvblNwZWVkOiAnbm9ybWFsJyxcbiAgICBjb2xsYXBzZVRyaWdnZXI6IFNFTEVDVE9SX0RBVEFfQ09MTEFQU0UsXG4gICAgcmVtb3ZlVHJpZ2dlcjogU0VMRUNUT1JfREFUQV9SRU1PVkUsXG4gICAgbWF4aW1pemVUcmlnZ2VyOiBTRUxFQ1RPUl9EQVRBX01BWElNSVpFLFxuICAgIGNvbGxhcHNlSWNvbjogJ2ZhLW1pbnVzJyxcbiAgICBleHBhbmRJY29uOiAnZmEtcGx1cycsXG4gICAgbWF4aW1pemVJY29uOiAnZmEtZXhwYW5kJyxcbiAgICBtaW5pbWl6ZUljb246ICdmYS1jb21wcmVzcydcbiAgfTtcblxuICB2YXIgQ2FyZFdpZGdldCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2FyZFdpZGdldChlbGVtZW50LCBzZXR0aW5ncykge1xuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLl9wYXJlbnQgPSBlbGVtZW50LnBhcmVudHMoU0VMRUNUT1JfQ0FSRCQxKS5maXJzdCgpO1xuXG4gICAgICBpZiAoZWxlbWVudC5oYXNDbGFzcyhDTEFTU19OQU1FX0NBUkQkMSkpIHtcbiAgICAgICAgdGhpcy5fcGFyZW50ID0gZWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2V0dGluZ3MgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZXh0ZW5kKHt9LCBEZWZhdWx0JDEsIHNldHRpbmdzKTtcbiAgICB9XG5cbiAgICB2YXIgX3Byb3RvID0gQ2FyZFdpZGdldC5wcm90b3R5cGU7XG5cbiAgICBfcHJvdG8uY29sbGFwc2UgPSBmdW5jdGlvbiBjb2xsYXBzZSgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHRoaXMuX3BhcmVudC5hZGRDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNJTkcpLmNoaWxkcmVuKFNFTEVDVE9SX0NBUkRfQk9EWSArIFwiLCBcIiArIFNFTEVDVE9SX0NBUkRfRk9PVEVSKS5zbGlkZVVwKHRoaXMuX3NldHRpbmdzLmFuaW1hdGlvblNwZWVkLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLl9wYXJlbnQuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRUQpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQ09MTEFQU0lORyk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fcGFyZW50LmZpbmQoXCI+IFwiICsgU0VMRUNUT1JfQ0FSRF9IRUFERVIgKyBcIiBcIiArIHRoaXMuX3NldHRpbmdzLmNvbGxhcHNlVHJpZ2dlciArIFwiIC5cIiArIHRoaXMuX3NldHRpbmdzLmNvbGxhcHNlSWNvbikuYWRkQ2xhc3ModGhpcy5fc2V0dGluZ3MuZXhwYW5kSWNvbikucmVtb3ZlQ2xhc3ModGhpcy5fc2V0dGluZ3MuY29sbGFwc2VJY29uKTtcblxuICAgICAgdGhpcy5fZWxlbWVudC50cmlnZ2VyKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9DT0xMQVBTRUQpLCB0aGlzLl9wYXJlbnQpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZXhwYW5kID0gZnVuY3Rpb24gZXhwYW5kKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHRoaXMuX3BhcmVudC5hZGRDbGFzcyhDTEFTU19OQU1FX0VYUEFORElORykuY2hpbGRyZW4oU0VMRUNUT1JfQ0FSRF9CT0RZICsgXCIsIFwiICsgU0VMRUNUT1JfQ0FSRF9GT09URVIpLnNsaWRlRG93bih0aGlzLl9zZXR0aW5ncy5hbmltYXRpb25TcGVlZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuX3BhcmVudC5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNFRCkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9FWFBBTkRJTkcpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX3BhcmVudC5maW5kKFwiPiBcIiArIFNFTEVDVE9SX0NBUkRfSEVBREVSICsgXCIgXCIgKyB0aGlzLl9zZXR0aW5ncy5jb2xsYXBzZVRyaWdnZXIgKyBcIiAuXCIgKyB0aGlzLl9zZXR0aW5ncy5leHBhbmRJY29uKS5hZGRDbGFzcyh0aGlzLl9zZXR0aW5ncy5jb2xsYXBzZUljb24pLnJlbW92ZUNsYXNzKHRoaXMuX3NldHRpbmdzLmV4cGFuZEljb24pO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnRyaWdnZXIoJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX0VYUEFOREVEKSwgdGhpcy5fcGFyZW50KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnJlbW92ZSA9IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHRoaXMuX3BhcmVudC5zbGlkZVVwKCk7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQudHJpZ2dlcigkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfUkVNT1ZFRCksIHRoaXMuX3BhcmVudCk7XG4gICAgfTtcblxuICAgIF9wcm90by50b2dnbGUgPSBmdW5jdGlvbiB0b2dnbGUoKSB7XG4gICAgICBpZiAodGhpcy5fcGFyZW50Lmhhc0NsYXNzKENMQVNTX05BTUVfQ09MTEFQU0VEKSkge1xuICAgICAgICB0aGlzLmV4cGFuZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29sbGFwc2UoKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLm1heGltaXplID0gZnVuY3Rpb24gbWF4aW1pemUoKSB7XG4gICAgICB0aGlzLl9wYXJlbnQuZmluZCh0aGlzLl9zZXR0aW5ncy5tYXhpbWl6ZVRyaWdnZXIgKyBcIiAuXCIgKyB0aGlzLl9zZXR0aW5ncy5tYXhpbWl6ZUljb24pLmFkZENsYXNzKHRoaXMuX3NldHRpbmdzLm1pbmltaXplSWNvbikucmVtb3ZlQ2xhc3ModGhpcy5fc2V0dGluZ3MubWF4aW1pemVJY29uKTtcblxuICAgICAgdGhpcy5fcGFyZW50LmNzcyh7XG4gICAgICAgIGhlaWdodDogdGhpcy5fcGFyZW50LmhlaWdodCgpLFxuICAgICAgICB3aWR0aDogdGhpcy5fcGFyZW50LndpZHRoKCksXG4gICAgICAgIHRyYW5zaXRpb246ICdhbGwgLjE1cydcbiAgICAgIH0pLmRlbGF5KDE1MCkucXVldWUoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJGVsZW1lbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcyk7XG4gICAgICAgICRlbGVtZW50LmFkZENsYXNzKENMQVNTX05BTUVfTUFYSU1JWkVEKTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdodG1sJykuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9NQVhJTUlaRUQpO1xuXG4gICAgICAgIGlmICgkZWxlbWVudC5oYXNDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNFRCkpIHtcbiAgICAgICAgICAkZWxlbWVudC5hZGRDbGFzcyhDTEFTU19OQU1FX1dBU19DT0xMQVBTRUQpO1xuICAgICAgICB9XG5cbiAgICAgICAgJGVsZW1lbnQuZGVxdWV1ZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQudHJpZ2dlcigkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfTUFYSU1JWkVEKSwgdGhpcy5fcGFyZW50KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLm1pbmltaXplID0gZnVuY3Rpb24gbWluaW1pemUoKSB7XG4gICAgICB0aGlzLl9wYXJlbnQuZmluZCh0aGlzLl9zZXR0aW5ncy5tYXhpbWl6ZVRyaWdnZXIgKyBcIiAuXCIgKyB0aGlzLl9zZXR0aW5ncy5taW5pbWl6ZUljb24pLmFkZENsYXNzKHRoaXMuX3NldHRpbmdzLm1heGltaXplSWNvbikucmVtb3ZlQ2xhc3ModGhpcy5fc2V0dGluZ3MubWluaW1pemVJY29uKTtcblxuICAgICAgdGhpcy5fcGFyZW50LmNzcygnY3NzVGV4dCcsIFwiaGVpZ2h0OiBcIiArIHRoaXMuX3BhcmVudFswXS5zdHlsZS5oZWlnaHQgKyBcIiAhaW1wb3J0YW50OyB3aWR0aDogXCIgKyB0aGlzLl9wYXJlbnRbMF0uc3R5bGUud2lkdGggKyBcIiAhaW1wb3J0YW50OyB0cmFuc2l0aW9uOiBhbGwgLjE1cztcIikuZGVsYXkoMTApLnF1ZXVlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICRlbGVtZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpO1xuICAgICAgICAkZWxlbWVudC5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX01BWElNSVpFRCk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnaHRtbCcpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfTUFYSU1JWkVEKTtcbiAgICAgICAgJGVsZW1lbnQuY3NzKHtcbiAgICAgICAgICBoZWlnaHQ6ICdpbmhlcml0JyxcbiAgICAgICAgICB3aWR0aDogJ2luaGVyaXQnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICgkZWxlbWVudC5oYXNDbGFzcyhDTEFTU19OQU1FX1dBU19DT0xMQVBTRUQpKSB7XG4gICAgICAgICAgJGVsZW1lbnQucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9XQVNfQ09MTEFQU0VEKTtcbiAgICAgICAgfVxuXG4gICAgICAgICRlbGVtZW50LmRlcXVldWUoKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnRyaWdnZXIoJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX01JTklNSVpFRCksIHRoaXMuX3BhcmVudCk7XG4gICAgfTtcblxuICAgIF9wcm90by50b2dnbGVNYXhpbWl6ZSA9IGZ1bmN0aW9uIHRvZ2dsZU1heGltaXplKCkge1xuICAgICAgaWYgKHRoaXMuX3BhcmVudC5oYXNDbGFzcyhDTEFTU19OQU1FX01BWElNSVpFRCkpIHtcbiAgICAgICAgdGhpcy5taW5pbWl6ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWF4aW1pemUoKTtcbiAgICB9IC8vIFByaXZhdGVcbiAgICA7XG5cbiAgICBfcHJvdG8uX2luaXQgPSBmdW5jdGlvbiBfaW5pdChjYXJkKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdGhpcy5fcGFyZW50ID0gY2FyZDtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5maW5kKHRoaXMuX3NldHRpbmdzLmNvbGxhcHNlVHJpZ2dlcikuY2xpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczMudG9nZ2xlKCk7XG4gICAgICB9KTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5maW5kKHRoaXMuX3NldHRpbmdzLm1heGltaXplVHJpZ2dlcikuY2xpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczMudG9nZ2xlTWF4aW1pemUoKTtcbiAgICAgIH0pO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmZpbmQodGhpcy5fc2V0dGluZ3MucmVtb3ZlVHJpZ2dlcikuY2xpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczMucmVtb3ZlKCk7XG4gICAgICB9KTtcbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIENhcmRXaWRnZXQuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICB2YXIgZGF0YSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJDEpO1xuXG4gICAgICB2YXIgX29wdGlvbnMgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZXh0ZW5kKHt9LCBEZWZhdWx0JDEsICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKCkpO1xuXG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgZGF0YSA9IG5ldyBDYXJkV2lkZ2V0KCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSwgX29wdGlvbnMpO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQxLCB0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJyA/IGRhdGEgOiBjb25maWcpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycgJiYgY29uZmlnLm1hdGNoKC9jb2xsYXBzZXxleHBhbmR8cmVtb3ZlfHRvZ2dsZXxtYXhpbWl6ZXxtaW5pbWl6ZXx0b2dnbGVNYXhpbWl6ZS8pKSB7XG4gICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0Jykge1xuICAgICAgICBkYXRhLl9pbml0KCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBDYXJkV2lkZ2V0O1xuICB9KCk7XG4gIC8qKlxuICAgKiBEYXRhIEFQSVxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbignY2xpY2snLCBTRUxFQ1RPUl9EQVRBX0NPTExBUFNFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgQ2FyZFdpZGdldC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCAndG9nZ2xlJyk7XG4gIH0pO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9uKCdjbGljaycsIFNFTEVDVE9SX0RBVEFfUkVNT1ZFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgQ2FyZFdpZGdldC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCAncmVtb3ZlJyk7XG4gIH0pO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9uKCdjbGljaycsIFNFTEVDVE9SX0RBVEFfTUFYSU1JWkUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBDYXJkV2lkZ2V0Ll9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcyksICd0b2dnbGVNYXhpbWl6ZScpO1xuICB9KTtcbiAgLyoqXG4gICAqIGpRdWVyeSBBUElcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQxXSA9IENhcmRXaWRnZXQuX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkMV0uQ29uc3RydWN0b3IgPSBDYXJkV2lkZ2V0O1xuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDFdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkMV0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkMTtcbiAgICByZXR1cm4gQ2FyZFdpZGdldC5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBBZG1pbkxURSBDb250cm9sU2lkZWJhci5qc1xuICAgKiBMaWNlbnNlIE1JVFxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG4gIHZhciBOQU1FJDIgPSAnQ29udHJvbFNpZGViYXInO1xuICB2YXIgREFUQV9LRVkkMiA9ICdsdGUuY29udHJvbHNpZGViYXInO1xuICB2YXIgRVZFTlRfS0VZJDIgPSBcIi5cIiArIERBVEFfS0VZJDI7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkMiA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDJdO1xuICB2YXIgRVZFTlRfQ09MTEFQU0VEJDEgPSBcImNvbGxhcHNlZFwiICsgRVZFTlRfS0VZJDI7XG4gIHZhciBFVkVOVF9FWFBBTkRFRCQxID0gXCJleHBhbmRlZFwiICsgRVZFTlRfS0VZJDI7XG4gIHZhciBTRUxFQ1RPUl9DT05UUk9MX1NJREVCQVIgPSAnLmNvbnRyb2wtc2lkZWJhcic7XG4gIHZhciBTRUxFQ1RPUl9DT05UUk9MX1NJREVCQVJfQ09OVEVOVCA9ICcuY29udHJvbC1zaWRlYmFyLWNvbnRlbnQnO1xuICB2YXIgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtd2lkZ2V0PVwiY29udHJvbC1zaWRlYmFyXCJdJztcbiAgdmFyIFNFTEVDVE9SX0hFQURFUiA9ICcubWFpbi1oZWFkZXInO1xuICB2YXIgU0VMRUNUT1JfRk9PVEVSID0gJy5tYWluLWZvb3Rlcic7XG4gIHZhciBDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9BTklNQVRFID0gJ2NvbnRyb2wtc2lkZWJhci1hbmltYXRlJztcbiAgdmFyIENMQVNTX05BTUVfQ09OVFJPTF9TSURFQkFSX09QRU4gPSAnY29udHJvbC1zaWRlYmFyLW9wZW4nO1xuICB2YXIgQ0xBU1NfTkFNRV9DT05UUk9MX1NJREVCQVJfU0xJREUgPSAnY29udHJvbC1zaWRlYmFyLXNsaWRlLW9wZW4nO1xuICB2YXIgQ0xBU1NfTkFNRV9MQVlPVVRfRklYRUQgPSAnbGF5b3V0LWZpeGVkJztcbiAgdmFyIENMQVNTX05BTUVfTkFWQkFSX0ZJWEVEID0gJ2xheW91dC1uYXZiYXItZml4ZWQnO1xuICB2YXIgQ0xBU1NfTkFNRV9OQVZCQVJfU01fRklYRUQgPSAnbGF5b3V0LXNtLW5hdmJhci1maXhlZCc7XG4gIHZhciBDTEFTU19OQU1FX05BVkJBUl9NRF9GSVhFRCA9ICdsYXlvdXQtbWQtbmF2YmFyLWZpeGVkJztcbiAgdmFyIENMQVNTX05BTUVfTkFWQkFSX0xHX0ZJWEVEID0gJ2xheW91dC1sZy1uYXZiYXItZml4ZWQnO1xuICB2YXIgQ0xBU1NfTkFNRV9OQVZCQVJfWExfRklYRUQgPSAnbGF5b3V0LXhsLW5hdmJhci1maXhlZCc7XG4gIHZhciBDTEFTU19OQU1FX0ZPT1RFUl9GSVhFRCA9ICdsYXlvdXQtZm9vdGVyLWZpeGVkJztcbiAgdmFyIENMQVNTX05BTUVfRk9PVEVSX1NNX0ZJWEVEID0gJ2xheW91dC1zbS1mb290ZXItZml4ZWQnO1xuICB2YXIgQ0xBU1NfTkFNRV9GT09URVJfTURfRklYRUQgPSAnbGF5b3V0LW1kLWZvb3Rlci1maXhlZCc7XG4gIHZhciBDTEFTU19OQU1FX0ZPT1RFUl9MR19GSVhFRCA9ICdsYXlvdXQtbGctZm9vdGVyLWZpeGVkJztcbiAgdmFyIENMQVNTX05BTUVfRk9PVEVSX1hMX0ZJWEVEID0gJ2xheW91dC14bC1mb290ZXItZml4ZWQnO1xuICB2YXIgRGVmYXVsdCQyID0ge1xuICAgIGNvbnRyb2xzaWRlYmFyU2xpZGU6IHRydWUsXG4gICAgc2Nyb2xsYmFyVGhlbWU6ICdvcy10aGVtZS1saWdodCcsXG4gICAgc2Nyb2xsYmFyQXV0b0hpZGU6ICdsJ1xuICB9O1xuICAvKipcbiAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG4gIHZhciBDb250cm9sU2lkZWJhciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29udHJvbFNpZGViYXIoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcblxuICAgICAgdGhpcy5faW5pdCgpO1xuICAgIH0gLy8gUHVibGljXG5cblxuICAgIHZhciBfcHJvdG8gPSBDb250cm9sU2lkZWJhci5wcm90b3R5cGU7XG5cbiAgICBfcHJvdG8uY29sbGFwc2UgPSBmdW5jdGlvbiBjb2xsYXBzZSgpIHtcbiAgICAgIHZhciAkYm9keSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnYm9keScpO1xuICAgICAgdmFyICRodG1sID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdodG1sJyk7IC8vIFNob3cgdGhlIGNvbnRyb2wgc2lkZWJhclxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmNvbnRyb2xzaWRlYmFyU2xpZGUpIHtcbiAgICAgICAgJGh0bWwuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9DT05UUk9MX1NJREVCQVJfQU5JTUFURSk7XG4gICAgICAgICRib2R5LnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQ09OVFJPTF9TSURFQkFSX1NMSURFKS5kZWxheSgzMDApLnF1ZXVlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfQ09OVFJPTF9TSURFQkFSKS5oaWRlKCk7XG4gICAgICAgICAgJGh0bWwucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9DT05UUk9MX1NJREVCQVJfQU5JTUFURSk7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRlcXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkYm9keS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9PUEVOKTtcbiAgICAgIH1cblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX0NPTExBUFNFRCQxKSk7XG4gICAgfTtcblxuICAgIF9wcm90by5zaG93ID0gZnVuY3Rpb24gc2hvdygpIHtcbiAgICAgIHZhciAkYm9keSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnYm9keScpO1xuICAgICAgdmFyICRodG1sID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdodG1sJyk7IC8vIENvbGxhcHNlIHRoZSBjb250cm9sIHNpZGViYXJcblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5jb250cm9sc2lkZWJhclNsaWRlKSB7XG4gICAgICAgICRodG1sLmFkZENsYXNzKENMQVNTX05BTUVfQ09OVFJPTF9TSURFQkFSX0FOSU1BVEUpO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfQ09OVFJPTF9TSURFQkFSKS5zaG93KCkuZGVsYXkoMTApLnF1ZXVlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAkYm9keS5hZGRDbGFzcyhDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9TTElERSkuZGVsYXkoMzAwKS5xdWV1ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkaHRtbC5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9BTklNQVRFKTtcbiAgICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kZXF1ZXVlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRlcXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkYm9keS5hZGRDbGFzcyhDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9PUEVOKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZml4SGVpZ2h0KCk7XG5cbiAgICAgIHRoaXMuX2ZpeFNjcm9sbEhlaWdodCgpO1xuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkudHJpZ2dlcigkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfRVhQQU5ERUQkMSkpO1xuICAgIH07XG5cbiAgICBfcHJvdG8udG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgICAgdmFyICRib2R5ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdib2R5Jyk7XG4gICAgICB2YXIgc2hvdWxkQ2xvc2UgPSAkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9PUEVOKSB8fCAkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9TTElERSk7XG5cbiAgICAgIGlmIChzaG91bGRDbG9zZSkge1xuICAgICAgICAvLyBDbG9zZSB0aGUgY29udHJvbCBzaWRlYmFyXG4gICAgICAgIHRoaXMuY29sbGFwc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE9wZW4gdGhlIGNvbnRyb2wgc2lkZWJhclxuICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgIH1cbiAgICB9IC8vIFByaXZhdGVcbiAgICA7XG5cbiAgICBfcHJvdG8uX2luaXQgPSBmdW5jdGlvbiBfaW5pdCgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHRoaXMuX2ZpeEhlaWdodCgpO1xuXG4gICAgICB0aGlzLl9maXhTY3JvbGxIZWlnaHQoKTtcblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMuX2ZpeEhlaWdodCgpO1xuXG4gICAgICAgIF90aGlzLl9maXhTY3JvbGxIZWlnaHQoKTtcbiAgICAgIH0pO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICRib2R5ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdib2R5Jyk7XG4gICAgICAgIHZhciBzaG91bGRGaXhIZWlnaHQgPSAkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9PUEVOKSB8fCAkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9TTElERSk7XG5cbiAgICAgICAgaWYgKHNob3VsZEZpeEhlaWdodCkge1xuICAgICAgICAgIF90aGlzLl9maXhTY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5fZml4U2Nyb2xsSGVpZ2h0ID0gZnVuY3Rpb24gX2ZpeFNjcm9sbEhlaWdodCgpIHtcbiAgICAgIHZhciAkYm9keSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnYm9keScpO1xuXG4gICAgICBpZiAoISRib2R5Lmhhc0NsYXNzKENMQVNTX05BTUVfTEFZT1VUX0ZJWEVEKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBoZWlnaHRzID0ge1xuICAgICAgICBzY3JvbGw6ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkuaGVpZ2h0KCksXG4gICAgICAgIHdpbmRvdzogJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykuaGVpZ2h0KCksXG4gICAgICAgIGhlYWRlcjogJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0hFQURFUikub3V0ZXJIZWlnaHQoKSxcbiAgICAgICAgZm9vdGVyOiAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfRk9PVEVSKS5vdXRlckhlaWdodCgpXG4gICAgICB9O1xuICAgICAgdmFyIHBvc2l0aW9ucyA9IHtcbiAgICAgICAgYm90dG9tOiBNYXRoLmFicyhoZWlnaHRzLndpbmRvdyArICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh3aW5kb3cpLnNjcm9sbFRvcCgpIC0gaGVpZ2h0cy5zY3JvbGwpLFxuICAgICAgICB0b3A6ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh3aW5kb3cpLnNjcm9sbFRvcCgpXG4gICAgICB9O1xuICAgICAgdmFyIG5hdmJhckZpeGVkID0gKCRib2R5Lmhhc0NsYXNzKENMQVNTX05BTUVfTkFWQkFSX0ZJWEVEKSB8fCAkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX05BVkJBUl9TTV9GSVhFRCkgfHwgJGJvZHkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9OQVZCQVJfTURfRklYRUQpIHx8ICRib2R5Lmhhc0NsYXNzKENMQVNTX05BTUVfTkFWQkFSX0xHX0ZJWEVEKSB8fCAkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX05BVkJBUl9YTF9GSVhFRCkpICYmICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9IRUFERVIpLmNzcygncG9zaXRpb24nKSA9PT0gJ2ZpeGVkJztcbiAgICAgIHZhciBmb290ZXJGaXhlZCA9ICgkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZPT1RFUl9GSVhFRCkgfHwgJGJvZHkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GT09URVJfU01fRklYRUQpIHx8ICRib2R5Lmhhc0NsYXNzKENMQVNTX05BTUVfRk9PVEVSX01EX0ZJWEVEKSB8fCAkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZPT1RFUl9MR19GSVhFRCkgfHwgJGJvZHkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GT09URVJfWExfRklYRUQpKSAmJiAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfRk9PVEVSKS5jc3MoJ3Bvc2l0aW9uJykgPT09ICdmaXhlZCc7XG4gICAgICB2YXIgJGNvbnRyb2xTaWRlYmFyID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0NPTlRST0xfU0lERUJBUik7XG4gICAgICB2YXIgJGNvbnRyb2xzaWRlYmFyQ29udGVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9DT05UUk9MX1NJREVCQVIgKyBcIiwgXCIgKyBTRUxFQ1RPUl9DT05UUk9MX1NJREVCQVIgKyBcIiBcIiArIFNFTEVDVE9SX0NPTlRST0xfU0lERUJBUl9DT05URU5UKTtcblxuICAgICAgaWYgKHBvc2l0aW9ucy50b3AgPT09IDAgJiYgcG9zaXRpb25zLmJvdHRvbSA9PT0gMCkge1xuICAgICAgICAkY29udHJvbFNpZGViYXIuY3NzKHtcbiAgICAgICAgICBib3R0b206IGhlaWdodHMuZm9vdGVyLFxuICAgICAgICAgIHRvcDogaGVpZ2h0cy5oZWFkZXJcbiAgICAgICAgfSk7XG4gICAgICAgICRjb250cm9sc2lkZWJhckNvbnRlbnQuY3NzKCdoZWlnaHQnLCBoZWlnaHRzLndpbmRvdyAtIChoZWlnaHRzLmhlYWRlciArIGhlaWdodHMuZm9vdGVyKSk7XG4gICAgICB9IGVsc2UgaWYgKHBvc2l0aW9ucy5ib3R0b20gPD0gaGVpZ2h0cy5mb290ZXIpIHtcbiAgICAgICAgaWYgKGZvb3RlckZpeGVkID09PSBmYWxzZSkge1xuICAgICAgICAgIHZhciB0b3AgPSBoZWlnaHRzLmhlYWRlciAtIHBvc2l0aW9ucy50b3A7XG4gICAgICAgICAgJGNvbnRyb2xTaWRlYmFyLmNzcygnYm90dG9tJywgaGVpZ2h0cy5mb290ZXIgLSBwb3NpdGlvbnMuYm90dG9tKS5jc3MoJ3RvcCcsIHRvcCA+PSAwID8gdG9wIDogMCk7XG4gICAgICAgICAgJGNvbnRyb2xzaWRlYmFyQ29udGVudC5jc3MoJ2hlaWdodCcsIGhlaWdodHMud2luZG93IC0gKGhlaWdodHMuZm9vdGVyIC0gcG9zaXRpb25zLmJvdHRvbSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRjb250cm9sU2lkZWJhci5jc3MoJ2JvdHRvbScsIGhlaWdodHMuZm9vdGVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbnMudG9wIDw9IGhlaWdodHMuaGVhZGVyKSB7XG4gICAgICAgIGlmIChuYXZiYXJGaXhlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAkY29udHJvbFNpZGViYXIuY3NzKCd0b3AnLCBoZWlnaHRzLmhlYWRlciAtIHBvc2l0aW9ucy50b3ApO1xuICAgICAgICAgICRjb250cm9sc2lkZWJhckNvbnRlbnQuY3NzKCdoZWlnaHQnLCBoZWlnaHRzLndpbmRvdyAtIChoZWlnaHRzLmhlYWRlciAtIHBvc2l0aW9ucy50b3ApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkY29udHJvbFNpZGViYXIuY3NzKCd0b3AnLCBoZWlnaHRzLmhlYWRlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobmF2YmFyRml4ZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICRjb250cm9sU2lkZWJhci5jc3MoJ3RvcCcsIDApO1xuICAgICAgICAkY29udHJvbHNpZGViYXJDb250ZW50LmNzcygnaGVpZ2h0JywgaGVpZ2h0cy53aW5kb3cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJGNvbnRyb2xTaWRlYmFyLmNzcygndG9wJywgaGVpZ2h0cy5oZWFkZXIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX2ZpeEhlaWdodCA9IGZ1bmN0aW9uIF9maXhIZWlnaHQoKSB7XG4gICAgICB2YXIgJGJvZHkgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oJ2JvZHknKTtcblxuICAgICAgaWYgKCEkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX0xBWU9VVF9GSVhFRCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGVpZ2h0cyA9IHtcbiAgICAgICAgd2luZG93OiAkX19kZWZhdWx0WydkZWZhdWx0J10od2luZG93KS5oZWlnaHQoKSxcbiAgICAgICAgaGVhZGVyOiAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfSEVBREVSKS5vdXRlckhlaWdodCgpLFxuICAgICAgICBmb290ZXI6ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9GT09URVIpLm91dGVySGVpZ2h0KClcbiAgICAgIH07XG4gICAgICB2YXIgc2lkZWJhckhlaWdodCA9IGhlaWdodHMud2luZG93IC0gaGVpZ2h0cy5oZWFkZXI7XG5cbiAgICAgIGlmICgkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZPT1RFUl9GSVhFRCkgfHwgJGJvZHkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GT09URVJfU01fRklYRUQpIHx8ICRib2R5Lmhhc0NsYXNzKENMQVNTX05BTUVfRk9PVEVSX01EX0ZJWEVEKSB8fCAkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZPT1RFUl9MR19GSVhFRCkgfHwgJGJvZHkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GT09URVJfWExfRklYRUQpKSB7XG4gICAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfRk9PVEVSKS5jc3MoJ3Bvc2l0aW9uJykgPT09ICdmaXhlZCcpIHtcbiAgICAgICAgICBzaWRlYmFySGVpZ2h0ID0gaGVpZ2h0cy53aW5kb3cgLSBoZWlnaHRzLmhlYWRlciAtIGhlaWdodHMuZm9vdGVyO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciAkY29udHJvbFNpZGViYXIgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfQ09OVFJPTF9TSURFQkFSICsgXCIgXCIgKyBTRUxFQ1RPUl9DT05UUk9MX1NJREVCQVJfQ09OVEVOVCk7XG4gICAgICAkY29udHJvbFNpZGViYXIuY3NzKCdoZWlnaHQnLCBzaWRlYmFySGVpZ2h0KTtcblxuICAgICAgaWYgKHR5cGVvZiAkX19kZWZhdWx0WydkZWZhdWx0J10uZm4ub3ZlcmxheVNjcm9sbGJhcnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICRjb250cm9sU2lkZWJhci5vdmVybGF5U2Nyb2xsYmFycyh7XG4gICAgICAgICAgY2xhc3NOYW1lOiB0aGlzLl9jb25maWcuc2Nyb2xsYmFyVGhlbWUsXG4gICAgICAgICAgc2l6ZUF1dG9DYXBhYmxlOiB0cnVlLFxuICAgICAgICAgIHNjcm9sbGJhcnM6IHtcbiAgICAgICAgICAgIGF1dG9IaWRlOiB0aGlzLl9jb25maWcuc2Nyb2xsYmFyQXV0b0hpZGUsXG4gICAgICAgICAgICBjbGlja1Njcm9sbGluZzogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSAvLyBTdGF0aWNcbiAgICA7XG5cbiAgICBDb250cm9sU2lkZWJhci5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShvcGVyYXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGF0YSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJDIpO1xuXG4gICAgICAgIHZhciBfb3B0aW9ucyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5leHRlbmQoe30sIERlZmF1bHQkMiwgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoKSk7XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBDb250cm9sU2lkZWJhcih0aGlzLCBfb3B0aW9ucyk7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkMiwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YVtvcGVyYXRpb25dID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihvcGVyYXRpb24gKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFbb3BlcmF0aW9uXSgpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBDb250cm9sU2lkZWJhcjtcbiAgfSgpO1xuICAvKipcbiAgICpcbiAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub24oJ2NsaWNrJywgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBDb250cm9sU2lkZWJhci5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCAndG9nZ2xlJyk7XG4gIH0pO1xuICAvKipcbiAgICogalF1ZXJ5IEFQSVxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDJdID0gQ29udHJvbFNpZGViYXIuX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkMl0uQ29uc3RydWN0b3IgPSBDb250cm9sU2lkZWJhcjtcblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQyXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDJdID0gSlFVRVJZX05PX0NPTkZMSUNUJDI7XG4gICAgcmV0dXJuIENvbnRyb2xTaWRlYmFyLl9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEFkbWluTFRFIERpcmVjdENoYXQuanNcbiAgICogTGljZW5zZSBNSVRcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG4gIC8qKlxuICAgKiBDb25zdGFudHNcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuICB2YXIgTkFNRSQzID0gJ0RpcmVjdENoYXQnO1xuICB2YXIgREFUQV9LRVkkMyA9ICdsdGUuZGlyZWN0Y2hhdCc7XG4gIHZhciBFVkVOVF9LRVkkMyA9IFwiLlwiICsgREFUQV9LRVkkMztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCQzID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkM107XG4gIHZhciBFVkVOVF9UT0dHTEVEID0gXCJ0b2dnbGVkXCIgKyBFVkVOVF9LRVkkMztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDEgPSAnW2RhdGEtd2lkZ2V0PVwiY2hhdC1wYW5lLXRvZ2dsZVwiXSc7XG4gIHZhciBTRUxFQ1RPUl9ESVJFQ1RfQ0hBVCA9ICcuZGlyZWN0LWNoYXQnO1xuICB2YXIgQ0xBU1NfTkFNRV9ESVJFQ1RfQ0hBVF9PUEVOID0gJ2RpcmVjdC1jaGF0LWNvbnRhY3RzLW9wZW4nO1xuICAvKipcbiAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG4gIHZhciBEaXJlY3RDaGF0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEaXJlY3RDaGF0KGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIH1cblxuICAgIHZhciBfcHJvdG8gPSBEaXJlY3RDaGF0LnByb3RvdHlwZTtcblxuICAgIF9wcm90by50b2dnbGUgPSBmdW5jdGlvbiB0b2dnbGUoKSB7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkucGFyZW50cyhTRUxFQ1RPUl9ESVJFQ1RfQ0hBVCkuZmlyc3QoKS50b2dnbGVDbGFzcyhDTEFTU19OQU1FX0RJUkVDVF9DSEFUX09QRU4pO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX1RPR0dMRUQpKTtcbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIERpcmVjdENoYXQuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQzKTtcblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IERpcmVjdENoYXQoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpKTtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQzLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBEaXJlY3RDaGF0O1xuICB9KCk7XG4gIC8qKlxuICAgKlxuICAgKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbignY2xpY2snLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQxLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgRGlyZWN0Q2hhdC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCAndG9nZ2xlJyk7XG4gIH0pO1xuICAvKipcbiAgICogalF1ZXJ5IEFQSVxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDNdID0gRGlyZWN0Q2hhdC5falF1ZXJ5SW50ZXJmYWNlO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQzXS5Db25zdHJ1Y3RvciA9IERpcmVjdENoYXQ7XG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkM10ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQzXSA9IEpRVUVSWV9OT19DT05GTElDVCQzO1xuICAgIHJldHVybiBEaXJlY3RDaGF0Ll9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEFkbWluTFRFIERyb3Bkb3duLmpzXG4gICAqIExpY2Vuc2UgTUlUXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICAvKipcbiAgICogQ29uc3RhbnRzXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICovXG5cbiAgdmFyIE5BTUUkNCA9ICdEcm9wZG93bic7XG4gIHZhciBEQVRBX0tFWSQ0ID0gJ2x0ZS5kcm9wZG93bic7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkNCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDRdO1xuICB2YXIgU0VMRUNUT1JfTkFWQkFSID0gJy5uYXZiYXInO1xuICB2YXIgU0VMRUNUT1JfRFJPUERPV05fTUVOVSA9ICcuZHJvcGRvd24tbWVudSc7XG4gIHZhciBTRUxFQ1RPUl9EUk9QRE9XTl9NRU5VX0FDVElWRSA9ICcuZHJvcGRvd24tbWVudS5zaG93JztcbiAgdmFyIFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9ICdbZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXSc7XG4gIHZhciBDTEFTU19OQU1FX0RST1BET1dOX1JJR0hUID0gJ2Ryb3Bkb3duLW1lbnUtcmlnaHQnO1xuICB2YXIgQ0xBU1NfTkFNRV9EUk9QRE9XTl9TVUJNRU5VID0gJ2Ryb3Bkb3duLXN1Ym1lbnUnOyAvLyBUT0RPOiB0aGlzIGlzIHVudXNlZDsgc2hvdWxkIGJlIHJlbW92ZWQgYWxvbmcgd2l0aCB0aGUgZXh0ZW5kP1xuXG4gIHZhciBEZWZhdWx0JDMgPSB7fTtcbiAgLyoqXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuICB2YXIgRHJvcGRvd24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERyb3Bkb3duKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfSAvLyBQdWJsaWNcblxuXG4gICAgdmFyIF9wcm90byA9IERyb3Bkb3duLnByb3RvdHlwZTtcblxuICAgIF9wcm90by50b2dnbGVTdWJtZW51ID0gZnVuY3Rpb24gdG9nZ2xlU3VibWVudSgpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc2libGluZ3MoKS5zaG93KCkudG9nZ2xlQ2xhc3MoJ3Nob3cnKTtcblxuICAgICAgaWYgKCF0aGlzLl9lbGVtZW50Lm5leHQoKS5oYXNDbGFzcygnc2hvdycpKSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQucGFyZW50cyhTRUxFQ1RPUl9EUk9QRE9XTl9NRU5VKS5maXJzdCgpLmZpbmQoJy5zaG93JykucmVtb3ZlQ2xhc3MoJ3Nob3cnKS5oaWRlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQucGFyZW50cygnbGkubmF2LWl0ZW0uZHJvcGRvd24uc2hvdycpLm9uKCdoaWRkZW4uYnMuZHJvcGRvd24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnLmRyb3Bkb3duLXN1Ym1lbnUgLnNob3cnKS5yZW1vdmVDbGFzcygnc2hvdycpLmhpZGUoKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZml4UG9zaXRpb24gPSBmdW5jdGlvbiBmaXhQb3NpdGlvbigpIHtcbiAgICAgIHZhciAkZWxlbWVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9EUk9QRE9XTl9NRU5VX0FDVElWRSk7XG5cbiAgICAgIGlmICgkZWxlbWVudC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoJGVsZW1lbnQuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9EUk9QRE9XTl9SSUdIVCkpIHtcbiAgICAgICAgJGVsZW1lbnQuY3NzKHtcbiAgICAgICAgICBsZWZ0OiAnaW5oZXJpdCcsXG4gICAgICAgICAgcmlnaHQ6IDBcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkZWxlbWVudC5jc3Moe1xuICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgcmlnaHQ6ICdpbmhlcml0J1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIG9mZnNldCA9ICRlbGVtZW50Lm9mZnNldCgpO1xuICAgICAgdmFyIHdpZHRoID0gJGVsZW1lbnQud2lkdGgoKTtcbiAgICAgIHZhciB2aXNpYmxlUGFydCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh3aW5kb3cpLndpZHRoKCkgLSBvZmZzZXQubGVmdDtcblxuICAgICAgaWYgKG9mZnNldC5sZWZ0IDwgMCkge1xuICAgICAgICAkZWxlbWVudC5jc3Moe1xuICAgICAgICAgIGxlZnQ6ICdpbmhlcml0JyxcbiAgICAgICAgICByaWdodDogb2Zmc2V0LmxlZnQgLSA1XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh2aXNpYmxlUGFydCA8IHdpZHRoKSB7XG4gICAgICAgICRlbGVtZW50LmNzcyh7XG4gICAgICAgICAgbGVmdDogJ2luaGVyaXQnLFxuICAgICAgICAgIHJpZ2h0OiAwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgRHJvcGRvd24uX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQ0KTtcblxuICAgICAgICB2YXIgX2NvbmZpZyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5leHRlbmQoe30sIERlZmF1bHQkMywgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoKSk7XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBEcm9wZG93bigkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcyksIF9jb25maWcpO1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJDQsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gJ3RvZ2dsZVN1Ym1lbnUnIHx8IGNvbmZpZyA9PT0gJ2ZpeFBvc2l0aW9uJykge1xuICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIERyb3Bkb3duO1xuICB9KCk7XG4gIC8qKlxuICAgKiBEYXRhIEFQSVxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0RST1BET1dOX01FTlUgKyBcIiBcIiArIFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSkub24oJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIERyb3Bkb3duLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcyksICd0b2dnbGVTdWJtZW51Jyk7XG4gIH0pO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfTkFWQkFSICsgXCIgXCIgKyBTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoJF9fZGVmYXVsdFsnZGVmYXVsdCddKGV2ZW50LnRhcmdldCkucGFyZW50KCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9EUk9QRE9XTl9TVUJNRU5VKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgRHJvcGRvd24uX2pRdWVyeUludGVyZmFjZS5jYWxsKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSwgJ2ZpeFBvc2l0aW9uJyk7XG4gICAgfSwgMSk7XG4gIH0pO1xuICAvKipcbiAgICogalF1ZXJ5IEFQSVxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDRdID0gRHJvcGRvd24uX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNF0uQ29uc3RydWN0b3IgPSBEcm9wZG93bjtcblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ0XS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDRdID0gSlFVRVJZX05PX0NPTkZMSUNUJDQ7XG4gICAgcmV0dXJuIERyb3Bkb3duLl9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEFkbWluTFRFIEV4cGFuZGFibGVUYWJsZS5qc1xuICAgKiBMaWNlbnNlIE1JVFxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cbiAgLyoqXG4gICAgKiBDb25zdGFudHNcbiAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAqL1xuXG4gIHZhciBOQU1FJDUgPSAnRXhwYW5kYWJsZVRhYmxlJztcbiAgdmFyIERBVEFfS0VZJDUgPSAnbHRlLmV4cGFuZGFibGVUYWJsZSc7XG4gIHZhciBFVkVOVF9LRVkkNCA9IFwiLlwiICsgREFUQV9LRVkkNTtcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCQ1ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNV07XG4gIHZhciBFVkVOVF9FWFBBTkRFRCQyID0gXCJleHBhbmRlZFwiICsgRVZFTlRfS0VZJDQ7XG4gIHZhciBFVkVOVF9DT0xMQVBTRUQkMiA9IFwiY29sbGFwc2VkXCIgKyBFVkVOVF9LRVkkNDtcbiAgdmFyIFNFTEVDVE9SX1RBQkxFID0gJy5leHBhbmRhYmxlLXRhYmxlJztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDIgPSAnW2RhdGEtd2lkZ2V0PVwiZXhwYW5kYWJsZS10YWJsZVwiXSc7XG4gIHZhciBTRUxFQ1RPUl9BUklBX0FUVFIgPSAnYXJpYS1leHBhbmRlZCc7XG4gIC8qKlxuICAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICovXG5cbiAgdmFyIEV4cGFuZGFibGVUYWJsZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRXhwYW5kYWJsZVRhYmxlKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfSAvLyBQdWJsaWNcblxuXG4gICAgdmFyIF9wcm90byA9IEV4cGFuZGFibGVUYWJsZS5wcm90b3R5cGU7XG5cbiAgICBfcHJvdG8uaW5pdCA9IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfREFUQV9UT0dHTEUkMikuZWFjaChmdW5jdGlvbiAoXywgJGhlYWRlcikge1xuICAgICAgICB2YXIgJHR5cGUgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oJGhlYWRlcikuYXR0cihTRUxFQ1RPUl9BUklBX0FUVFIpO1xuICAgICAgICB2YXIgJGJvZHkgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oJGhlYWRlcikubmV4dCgpLmNoaWxkcmVuKCkuZmlyc3QoKS5jaGlsZHJlbigpO1xuXG4gICAgICAgIGlmICgkdHlwZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgJGJvZHkuc2hvdygpO1xuICAgICAgICB9IGVsc2UgaWYgKCR0eXBlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgJGJvZHkuaGlkZSgpO1xuICAgICAgICAgICRib2R5LnBhcmVudCgpLnBhcmVudCgpLmFkZENsYXNzKCdkLW5vbmUnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by50b2dnbGVSb3cgPSBmdW5jdGlvbiB0b2dnbGVSb3coKSB7XG4gICAgICB2YXIgJGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgICAgdmFyIHRpbWUgPSA1MDA7XG4gICAgICB2YXIgJHR5cGUgPSAkZWxlbWVudC5hdHRyKFNFTEVDVE9SX0FSSUFfQVRUUik7XG4gICAgICB2YXIgJGJvZHkgPSAkZWxlbWVudC5uZXh0KCkuY2hpbGRyZW4oKS5maXJzdCgpLmNoaWxkcmVuKCk7XG4gICAgICAkYm9keS5zdG9wKCk7XG5cbiAgICAgIGlmICgkdHlwZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICRib2R5LnNsaWRlVXAodGltZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICRlbGVtZW50Lm5leHQoKS5hZGRDbGFzcygnZC1ub25lJyk7XG4gICAgICAgIH0pO1xuICAgICAgICAkZWxlbWVudC5hdHRyKFNFTEVDVE9SX0FSSUFfQVRUUiwgJ2ZhbHNlJyk7XG4gICAgICAgICRlbGVtZW50LnRyaWdnZXIoJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX0NPTExBUFNFRCQyKSk7XG4gICAgICB9IGVsc2UgaWYgKCR0eXBlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICRlbGVtZW50Lm5leHQoKS5yZW1vdmVDbGFzcygnZC1ub25lJyk7XG4gICAgICAgICRib2R5LnNsaWRlRG93bih0aW1lKTtcbiAgICAgICAgJGVsZW1lbnQuYXR0cihTRUxFQ1RPUl9BUklBX0FUVFIsICd0cnVlJyk7XG4gICAgICAgICRlbGVtZW50LnRyaWdnZXIoJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX0VYUEFOREVEJDIpKTtcbiAgICAgIH1cbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIEV4cGFuZGFibGVUYWJsZS5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShvcGVyYXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGF0YSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJDUpO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgRXhwYW5kYWJsZVRhYmxlKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSk7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkNSwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG9wZXJhdGlvbiA9PT0gJ3N0cmluZycgJiYgb3BlcmF0aW9uLm1hdGNoKC9pbml0fHRvZ2dsZVJvdy8pKSB7XG4gICAgICAgICAgZGF0YVtvcGVyYXRpb25dKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gRXhwYW5kYWJsZVRhYmxlO1xuICB9KCk7XG4gIC8qKlxuICAgICogRGF0YSBBUElcbiAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAqL1xuXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1RBQkxFKS5yZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgRXhwYW5kYWJsZVRhYmxlLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcyksICdpbml0Jyk7XG4gIH0pO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9uKCdjbGljaycsIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDIsIGZ1bmN0aW9uICgpIHtcbiAgICBFeHBhbmRhYmxlVGFibGUuX2pRdWVyeUludGVyZmFjZS5jYWxsKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSwgJ3RvZ2dsZVJvdycpO1xuICB9KTtcbiAgLyoqXG4gICAgKiBqUXVlcnkgQVBJXG4gICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgKi9cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ1XSA9IEV4cGFuZGFibGVUYWJsZS5falF1ZXJ5SW50ZXJmYWNlO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ1XS5Db25zdHJ1Y3RvciA9IEV4cGFuZGFibGVUYWJsZTtcblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ1XS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDVdID0gSlFVRVJZX05PX0NPTkZMSUNUJDU7XG4gICAgcmV0dXJuIEV4cGFuZGFibGVUYWJsZS5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBBZG1pbkxURSBGdWxsc2NyZWVuLmpzXG4gICAqIExpY2Vuc2UgTUlUXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICAvKipcbiAgICogQ29uc3RhbnRzXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICovXG5cbiAgdmFyIE5BTUUkNiA9ICdGdWxsc2NyZWVuJztcbiAgdmFyIERBVEFfS0VZJDYgPSAnbHRlLmZ1bGxzY3JlZW4nO1xuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJDYgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ2XTtcbiAgdmFyIFNFTEVDVE9SX0RBVEFfV0lER0VUID0gJ1tkYXRhLXdpZGdldD1cImZ1bGxzY3JlZW5cIl0nO1xuICB2YXIgU0VMRUNUT1JfSUNPTiA9IFNFTEVDVE9SX0RBVEFfV0lER0VUICsgXCIgaVwiO1xuICB2YXIgRGVmYXVsdCQ0ID0ge1xuICAgIG1pbmltaXplSWNvbjogJ2ZhLWNvbXByZXNzLWFycm93cy1hbHQnLFxuICAgIG1heGltaXplSWNvbjogJ2ZhLWV4cGFuZC1hcnJvd3MtYWx0J1xuICB9O1xuICAvKipcbiAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG4gIHZhciBGdWxsc2NyZWVuID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGdWxsc2NyZWVuKF9lbGVtZW50LCBfb3B0aW9ucykge1xuICAgICAgdGhpcy5lbGVtZW50ID0gX2VsZW1lbnQ7XG4gICAgICB0aGlzLm9wdGlvbnMgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZXh0ZW5kKHt9LCBEZWZhdWx0JDQsIF9vcHRpb25zKTtcbiAgICB9IC8vIFB1YmxpY1xuXG5cbiAgICB2YXIgX3Byb3RvID0gRnVsbHNjcmVlbi5wcm90b3R5cGU7XG5cbiAgICBfcHJvdG8udG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgICAgaWYgKGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50Lm1vekZ1bGxTY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50Lm1zRnVsbHNjcmVlbkVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy53aW5kb3dlZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mdWxsc2NyZWVuKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5mdWxsc2NyZWVuID0gZnVuY3Rpb24gZnVsbHNjcmVlbigpIHtcbiAgICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm1zUmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm1zUmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICAgIH1cblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0lDT04pLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5tYXhpbWl6ZUljb24pLmFkZENsYXNzKHRoaXMub3B0aW9ucy5taW5pbWl6ZUljb24pO1xuICAgIH07XG5cbiAgICBfcHJvdG8ud2luZG93ZWQgPSBmdW5jdGlvbiB3aW5kb3dlZCgpIHtcbiAgICAgIGlmIChkb2N1bWVudC5leGl0RnVsbHNjcmVlbikge1xuICAgICAgICBkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpO1xuICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbikge1xuICAgICAgICBkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO1xuICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKSB7XG4gICAgICAgIGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtcbiAgICAgIH1cblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0lDT04pLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5taW5pbWl6ZUljb24pLmFkZENsYXNzKHRoaXMub3B0aW9ucy5tYXhpbWl6ZUljb24pO1xuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgRnVsbHNjcmVlbi5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgIHZhciBkYXRhID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkNik7XG5cbiAgICAgIGlmICghZGF0YSkge1xuICAgICAgICBkYXRhID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIF9vcHRpb25zID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmV4dGVuZCh7fSwgRGVmYXVsdCQ0LCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IGRhdGEpO1xuXG4gICAgICB2YXIgcGx1Z2luID0gbmV3IEZ1bGxzY3JlZW4oJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCBfb3B0aW9ucyk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQ2LCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IGRhdGEpO1xuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycgJiYgY29uZmlnLm1hdGNoKC90b2dnbGV8ZnVsbHNjcmVlbnx3aW5kb3dlZC8pKSB7XG4gICAgICAgIHBsdWdpbltjb25maWddKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwbHVnaW4uaW5pdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gRnVsbHNjcmVlbjtcbiAgfSgpO1xuICAvKipcbiAgICAqIERhdGEgQVBJXG4gICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgKi9cblxuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub24oJ2NsaWNrJywgU0VMRUNUT1JfREFUQV9XSURHRVQsIGZ1bmN0aW9uICgpIHtcbiAgICBGdWxsc2NyZWVuLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcyksICd0b2dnbGUnKTtcbiAgfSk7XG4gIC8qKlxuICAgKiBqUXVlcnkgQVBJXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICovXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNl0gPSBGdWxsc2NyZWVuLl9qUXVlcnlJbnRlcmZhY2U7XG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDZdLkNvbnN0cnVjdG9yID0gRnVsbHNjcmVlbjtcblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ2XS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDZdID0gSlFVRVJZX05PX0NPTkZMSUNUJDY7XG4gICAgcmV0dXJuIEZ1bGxzY3JlZW4uX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQWRtaW5MVEUgSUZyYW1lLmpzXG4gICAqIExpY2Vuc2UgTUlUXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICAvKipcbiAgICogQ29uc3RhbnRzXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICovXG5cbiAgdmFyIE5BTUUkNyA9ICdJRnJhbWUnO1xuICB2YXIgREFUQV9LRVkkNyA9ICdsdGUuaWZyYW1lJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCQ3ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkN107XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzID0gJ1tkYXRhLXdpZGdldD1cImlmcmFtZVwiXSc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9DTE9TRSA9ICdbZGF0YS13aWRnZXQ9XCJpZnJhbWUtY2xvc2VcIl0nO1xuICB2YXIgU0VMRUNUT1JfREFUQV9UT0dHTEVfU0NST0xMX0xFRlQgPSAnW2RhdGEtd2lkZ2V0PVwiaWZyYW1lLXNjcm9sbGxlZnRcIl0nO1xuICB2YXIgU0VMRUNUT1JfREFUQV9UT0dHTEVfU0NST0xMX1JJR0hUID0gJ1tkYXRhLXdpZGdldD1cImlmcmFtZS1zY3JvbGxyaWdodFwiXSc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9GVUxMU0NSRUVOID0gJ1tkYXRhLXdpZGdldD1cImlmcmFtZS1mdWxsc2NyZWVuXCJdJztcbiAgdmFyIFNFTEVDVE9SX0NPTlRFTlRfV1JBUFBFUiA9ICcuY29udGVudC13cmFwcGVyJztcbiAgdmFyIFNFTEVDVE9SX0NPTlRFTlRfSUZSQU1FID0gU0VMRUNUT1JfQ09OVEVOVF9XUkFQUEVSICsgXCIgaWZyYW1lXCI7XG4gIHZhciBTRUxFQ1RPUl9UQUJfTkFWID0gU0VMRUNUT1JfREFUQV9UT0dHTEUkMyArIFwiLmlmcmFtZS1tb2RlIC5uYXZcIjtcbiAgdmFyIFNFTEVDVE9SX1RBQl9OQVZCQVJfTkFWID0gU0VMRUNUT1JfREFUQV9UT0dHTEUkMyArIFwiLmlmcmFtZS1tb2RlIC5uYXZiYXItbmF2XCI7XG4gIHZhciBTRUxFQ1RPUl9UQUJfTkFWQkFSX05BVl9JVEVNID0gU0VMRUNUT1JfVEFCX05BVkJBUl9OQVYgKyBcIiAubmF2LWl0ZW1cIjtcbiAgdmFyIFNFTEVDVE9SX1RBQl9DT05URU5UID0gU0VMRUNUT1JfREFUQV9UT0dHTEUkMyArIFwiLmlmcmFtZS1tb2RlIC50YWItY29udGVudFwiO1xuICB2YXIgU0VMRUNUT1JfVEFCX0VNUFRZID0gU0VMRUNUT1JfVEFCX0NPTlRFTlQgKyBcIiAudGFiLWVtcHR5XCI7XG4gIHZhciBTRUxFQ1RPUl9UQUJfTE9BRElORyA9IFNFTEVDVE9SX1RBQl9DT05URU5UICsgXCIgLnRhYi1sb2FkaW5nXCI7XG4gIHZhciBTRUxFQ1RPUl9TSURFQkFSX01FTlVfSVRFTSA9ICcubWFpbi1zaWRlYmFyIC5uYXYtaXRlbSA+IGEubmF2LWxpbmsnO1xuICB2YXIgU0VMRUNUT1JfSEVBREVSX01FTlVfSVRFTSA9ICcubWFpbi1oZWFkZXIgLm5hdi1pdGVtIGEubmF2LWxpbmsnO1xuICB2YXIgU0VMRUNUT1JfSEVBREVSX0RST1BET1dOX0lURU0gPSAnLm1haW4taGVhZGVyIGEuZHJvcGRvd24taXRlbSc7XG4gIHZhciBDTEFTU19OQU1FX0lGUkFNRV9NT0RFID0gJ2lmcmFtZS1tb2RlJztcbiAgdmFyIENMQVNTX05BTUVfRlVMTFNDUkVFTl9NT0RFID0gJ2lmcmFtZS1tb2RlLWZ1bGxzY3JlZW4nO1xuICB2YXIgRGVmYXVsdCQ1ID0ge1xuICAgIG9uVGFiQ2xpY2s6IGZ1bmN0aW9uIG9uVGFiQ2xpY2soaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfSxcbiAgICBvblRhYkNoYW5nZWQ6IGZ1bmN0aW9uIG9uVGFiQ2hhbmdlZChpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9LFxuICAgIG9uVGFiQ3JlYXRlZDogZnVuY3Rpb24gb25UYWJDcmVhdGVkKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0sXG4gICAgYXV0b0lmcmFtZU1vZGU6IHRydWUsXG4gICAgYXV0b0l0ZW1BY3RpdmU6IHRydWUsXG4gICAgYXV0b1Nob3dOZXdUYWI6IHRydWUsXG4gICAgbG9hZGluZ1NjcmVlbjogdHJ1ZSxcbiAgICB1c2VOYXZiYXJJdGVtczogdHJ1ZSxcbiAgICBzY3JvbGxPZmZzZXQ6IDQwLFxuICAgIHNjcm9sbEJlaGF2aW9yU3dhcDogZmFsc2UsXG4gICAgaWNvbk1heGltaXplOiAnZmEtZXhwYW5kJyxcbiAgICBpY29uTWluaW1pemU6ICdmYS1jb21wcmVzcydcbiAgfTtcbiAgLyoqXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuICB2YXIgSUZyYW1lID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJRnJhbWUoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcblxuICAgICAgdGhpcy5faW5pdCgpO1xuICAgIH0gLy8gUHVibGljXG5cblxuICAgIHZhciBfcHJvdG8gPSBJRnJhbWUucHJvdG90eXBlO1xuXG4gICAgX3Byb3RvLm9uVGFiQ2xpY2sgPSBmdW5jdGlvbiBvblRhYkNsaWNrKGl0ZW0pIHtcbiAgICAgIHRoaXMuX2NvbmZpZy5vblRhYkNsaWNrKGl0ZW0pO1xuICAgIH07XG5cbiAgICBfcHJvdG8ub25UYWJDaGFuZ2VkID0gZnVuY3Rpb24gb25UYWJDaGFuZ2VkKGl0ZW0pIHtcbiAgICAgIHRoaXMuX2NvbmZpZy5vblRhYkNoYW5nZWQoaXRlbSk7XG4gICAgfTtcblxuICAgIF9wcm90by5vblRhYkNyZWF0ZWQgPSBmdW5jdGlvbiBvblRhYkNyZWF0ZWQoaXRlbSkge1xuICAgICAgdGhpcy5fY29uZmlnLm9uVGFiQ3JlYXRlZChpdGVtKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmNyZWF0ZVRhYiA9IGZ1bmN0aW9uIGNyZWF0ZVRhYih0aXRsZSwgbGluaywgdW5pcXVlTmFtZSwgYXV0b09wZW4pIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciB0YWJJZCA9IFwicGFuZWwtXCIgKyB1bmlxdWVOYW1lICsgXCItXCIgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwKTtcbiAgICAgIHZhciBuYXZJZCA9IFwidGFiLVwiICsgdW5pcXVlTmFtZSArIFwiLVwiICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMCk7XG4gICAgICB2YXIgbmV3TmF2SXRlbSA9IFwiPGxpIGNsYXNzPVxcXCJuYXYtaXRlbVxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj48YSBjbGFzcz1cXFwibmF2LWxpbmtcXFwiIGRhdGEtdG9nZ2xlPVxcXCJyb3dcXFwiIGlkPVxcXCJcIiArIG5hdklkICsgXCJcXFwiIGhyZWY9XFxcIiNcIiArIHRhYklkICsgXCJcXFwiIHJvbGU9XFxcInRhYlxcXCIgYXJpYS1jb250cm9scz1cXFwiXCIgKyB0YWJJZCArIFwiXFxcIiBhcmlhLXNlbGVjdGVkPVxcXCJmYWxzZVxcXCI+XCIgKyB0aXRsZSArIFwiPC9hPjwvbGk+XCI7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfVEFCX05BVkJBUl9OQVYpLmFwcGVuZChuZXdOYXZJdGVtKTtcbiAgICAgIHZhciBuZXdUYWJJdGVtID0gXCI8ZGl2IGNsYXNzPVxcXCJ0YWItcGFuZSBmYWRlXFxcIiBpZD1cXFwiXCIgKyB0YWJJZCArIFwiXFxcIiByb2xlPVxcXCJ0YWJwYW5lbFxcXCIgYXJpYS1sYWJlbGxlZGJ5PVxcXCJcIiArIG5hdklkICsgXCJcXFwiPjxpZnJhbWUgc3JjPVxcXCJcIiArIGxpbmsgKyBcIlxcXCI+PC9pZnJhbWU+PC9kaXY+XCI7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfVEFCX0NPTlRFTlQpLmFwcGVuZChuZXdUYWJJdGVtKTtcblxuICAgICAgaWYgKGF1dG9PcGVuKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcubG9hZGluZ1NjcmVlbikge1xuICAgICAgICAgIHZhciAkbG9hZGluZ1NjcmVlbiA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9UQUJfTE9BRElORyk7XG4gICAgICAgICAgJGxvYWRpbmdTY3JlZW4uZmFkZUluKCk7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRhYklkICsgXCIgaWZyYW1lXCIpLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgX3RoaXMuX2NvbmZpZy5sb2FkaW5nU2NyZWVuID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICBfdGhpcy5zd2l0Y2hUYWIoXCIjXCIgKyBuYXZJZCwgX3RoaXMuX2NvbmZpZy5sb2FkaW5nU2NyZWVuKTtcblxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAkbG9hZGluZ1NjcmVlbi5mYWRlT3V0KCk7XG4gICAgICAgICAgICAgIH0sIF90aGlzLl9jb25maWcubG9hZGluZ1NjcmVlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBfdGhpcy5zd2l0Y2hUYWIoXCIjXCIgKyBuYXZJZCwgX3RoaXMuX2NvbmZpZy5sb2FkaW5nU2NyZWVuKTtcblxuICAgICAgICAgICAgICAkbG9hZGluZ1NjcmVlbi5mYWRlT3V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zd2l0Y2hUYWIoXCIjXCIgKyBuYXZJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5vblRhYkNyZWF0ZWQoJF9fZGVmYXVsdFsnZGVmYXVsdCddKFwiI1wiICsgbmF2SWQpKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLm9wZW5UYWJTaWRlYmFyID0gZnVuY3Rpb24gb3BlblRhYlNpZGViYXIoaXRlbSwgYXV0b09wZW4pIHtcbiAgICAgIGlmIChhdXRvT3BlbiA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGF1dG9PcGVuID0gdGhpcy5fY29uZmlnLmF1dG9TaG93TmV3VGFiO1xuICAgICAgfVxuXG4gICAgICB2YXIgJGl0ZW0gPSAkX19kZWZhdWx0WydkZWZhdWx0J10oaXRlbSkuY2xvbmUoKTtcblxuICAgICAgaWYgKCRpdGVtLmF0dHIoJ2hyZWYnKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICRpdGVtID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGl0ZW0pLnBhcmVudCgnYScpLmNsb25lKCk7XG4gICAgICB9XG5cbiAgICAgICRpdGVtLmZpbmQoJy5yaWdodCcpLnJlbW92ZSgpO1xuICAgICAgdmFyIHRpdGxlID0gJGl0ZW0uZmluZCgncCcpLnRleHQoKTtcblxuICAgICAgaWYgKHRpdGxlID09PSAnJykge1xuICAgICAgICB0aXRsZSA9ICRpdGVtLnRleHQoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGxpbmsgPSAkaXRlbS5hdHRyKCdocmVmJyk7XG5cbiAgICAgIGlmIChsaW5rID09PSAnIycgfHwgbGluayA9PT0gJycgfHwgbGluayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jcmVhdGVUYWIodGl0bGUsIGxpbmssIGxpbmsucmVwbGFjZSgnLmh0bWwnLCAnJykucmVwbGFjZSgnLi8nLCAnJykucmVwbGFjZUFsbCgnLycsICctJyksIGF1dG9PcGVuKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnN3aXRjaFRhYiA9IGZ1bmN0aW9uIHN3aXRjaFRhYihpdGVtKSB7XG4gICAgICB2YXIgJGl0ZW0gPSAkX19kZWZhdWx0WydkZWZhdWx0J10oaXRlbSk7XG4gICAgICB2YXIgdGFiSWQgPSAkaXRlbS5hdHRyKCdocmVmJyk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfVEFCX0VNUFRZKS5oaWRlKCk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfVEFCX05BVkJBUl9OQVYgKyBcIiAuYWN0aXZlXCIpLnRhYignZGlzcG9zZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcblxuICAgICAgdGhpcy5fZml4SGVpZ2h0KCk7XG5cbiAgICAgICRpdGVtLnRhYignc2hvdycpO1xuICAgICAgJGl0ZW0ucGFyZW50cygnbGknKS5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgICB0aGlzLm9uVGFiQ2hhbmdlZCgkaXRlbSk7XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcuYXV0b0l0ZW1BY3RpdmUpIHtcbiAgICAgICAgdGhpcy5fc2V0SXRlbUFjdGl2ZSgkX19kZWZhdWx0WydkZWZhdWx0J10odGFiSWQgKyBcIiBpZnJhbWVcIikuYXR0cignc3JjJykpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8ucmVtb3ZlQWN0aXZlVGFiID0gZnVuY3Rpb24gcmVtb3ZlQWN0aXZlVGFiKCkge1xuICAgICAgdmFyICRuYXZJdGVtID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1RBQl9OQVZCQVJfTkFWX0lURU0gKyBcIi5hY3RpdmVcIik7XG4gICAgICB2YXIgJG5hdkl0ZW1QYXJlbnQgPSAkbmF2SXRlbS5wYXJlbnQoKTtcbiAgICAgIHZhciBuYXZJdGVtSW5kZXggPSAkbmF2SXRlbS5pbmRleCgpO1xuICAgICAgJG5hdkl0ZW0ucmVtb3ZlKCk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oJy50YWItcGFuZS5hY3RpdmUnKS5yZW1vdmUoKTtcblxuICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9UQUJfQ09OVEVOVCkuY2hpbGRyZW4oKS5sZW5ndGggPT0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1RBQl9FTVBUWSArIFwiLCBcIiArIFNFTEVDVE9SX1RBQl9MT0FESU5HKS5sZW5ndGgpIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1RBQl9FTVBUWSkuc2hvdygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHByZXZOYXZJdGVtSW5kZXggPSBuYXZJdGVtSW5kZXggLSAxO1xuICAgICAgICB0aGlzLnN3aXRjaFRhYigkbmF2SXRlbVBhcmVudC5jaGlsZHJlbigpLmVxKHByZXZOYXZJdGVtSW5kZXgpLmZpbmQoJ2EnKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by50b2dnbGVGdWxsc2NyZWVuID0gZnVuY3Rpb24gdG9nZ2xlRnVsbHNjcmVlbigpIHtcbiAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10oJ2JvZHknKS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZVTExTQ1JFRU5fTU9ERSkpIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0RBVEFfVE9HR0xFX0ZVTExTQ1JFRU4gKyBcIiBpXCIpLnJlbW92ZUNsYXNzKHRoaXMuX2NvbmZpZy5pY29uTWluaW1pemUpLmFkZENsYXNzKHRoaXMuX2NvbmZpZy5pY29uTWF4aW1pemUpO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oJ2JvZHknKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0ZVTExTQ1JFRU5fTU9ERSk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9UQUJfRU1QVFkgKyBcIiwgXCIgKyBTRUxFQ1RPUl9UQUJfTE9BRElORykuaGVpZ2h0KCdhdXRvJyk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9DT05URU5UX1dSQVBQRVIpLmhlaWdodCgnYXV0bycpO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfQ09OVEVOVF9JRlJBTUUpLmhlaWdodCgnYXV0bycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0RBVEFfVE9HR0xFX0ZVTExTQ1JFRU4gKyBcIiBpXCIpLnJlbW92ZUNsYXNzKHRoaXMuX2NvbmZpZy5pY29uTWF4aW1pemUpLmFkZENsYXNzKHRoaXMuX2NvbmZpZy5pY29uTWluaW1pemUpO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oJ2JvZHknKS5hZGRDbGFzcyhDTEFTU19OQU1FX0ZVTExTQ1JFRU5fTU9ERSk7XG4gICAgICB9XG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh3aW5kb3cpLnRyaWdnZXIoJ3Jlc2l6ZScpO1xuXG4gICAgICB0aGlzLl9maXhIZWlnaHQodHJ1ZSk7XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9pbml0ID0gZnVuY3Rpb24gX2luaXQoKSB7XG4gICAgICBpZiAod2luZG93LmZyYW1lRWxlbWVudCAmJiB0aGlzLl9jb25maWcuYXV0b0lmcmFtZU1vZGUpIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdib2R5JykuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9JRlJBTUVfTU9ERSk7XG4gICAgICB9IGVsc2UgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9DT05URU5UX1dSQVBQRVIpLmhhc0NsYXNzKENMQVNTX05BTUVfSUZSQU1FX01PREUpKSB7XG4gICAgICAgIHRoaXMuX3NldHVwTGlzdGVuZXJzKCk7XG5cbiAgICAgICAgdGhpcy5fZml4SGVpZ2h0KHRydWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX25hdlNjcm9sbCA9IGZ1bmN0aW9uIF9uYXZTY3JvbGwob2Zmc2V0KSB7XG4gICAgICB2YXIgbGVmdFBvcyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9UQUJfTkFWQkFSX05BVikuc2Nyb2xsTGVmdCgpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1RBQl9OQVZCQVJfTkFWKS5hbmltYXRlKHtcbiAgICAgICAgc2Nyb2xsTGVmdDogbGVmdFBvcyArIG9mZnNldFxuICAgICAgfSwgMjUwLCAnbGluZWFyJyk7XG4gICAgfTtcblxuICAgIF9wcm90by5fc2V0dXBMaXN0ZW5lcnMgPSBmdW5jdGlvbiBfc2V0dXBMaXN0ZW5lcnMoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykub24oJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMyLl9maXhIZWlnaHQoKTtcbiAgICAgICAgfSwgMSk7XG4gICAgICB9KTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub24oJ2NsaWNrJywgU0VMRUNUT1JfU0lERUJBUl9NRU5VX0lURU0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBfdGhpczIub3BlblRhYlNpZGViYXIoZS50YXJnZXQpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcudXNlTmF2YmFySXRlbXMpIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbignY2xpY2snLCBTRUxFQ1RPUl9IRUFERVJfTUVOVV9JVEVNICsgXCIsIFwiICsgU0VMRUNUT1JfSEVBREVSX0RST1BET1dOX0lURU0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgX3RoaXMyLm9wZW5UYWJTaWRlYmFyKGUudGFyZ2V0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub24oJ2NsaWNrJywgU0VMRUNUT1JfVEFCX05BVkJBUl9OQVZfSVRFTSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIF90aGlzMi5vblRhYkNsaWNrKGUudGFyZ2V0KTtcblxuICAgICAgICBfdGhpczIuc3dpdGNoVGFiKGUudGFyZ2V0KTtcbiAgICAgIH0pO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbignY2xpY2snLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9DTE9TRSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIF90aGlzMi5yZW1vdmVBY3RpdmVUYWIoKTtcbiAgICAgIH0pO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbignY2xpY2snLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9GVUxMU0NSRUVOLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgX3RoaXMyLnRvZ2dsZUZ1bGxzY3JlZW4oKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIG1vdXNlZG93biA9IGZhbHNlO1xuICAgICAgdmFyIG1vdXNlZG93bkludGVydmFsID0gbnVsbDtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub24oJ21vdXNlZG93bicsIFNFTEVDVE9SX0RBVEFfVE9HR0xFX1NDUk9MTF9MRUZULCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwobW91c2Vkb3duSW50ZXJ2YWwpO1xuICAgICAgICB2YXIgc2Nyb2xsT2Zmc2V0ID0gX3RoaXMyLl9jb25maWcuc2Nyb2xsT2Zmc2V0O1xuXG4gICAgICAgIGlmICghX3RoaXMyLl9jb25maWcuc2Nyb2xsQmVoYXZpb3JTd2FwKSB7XG4gICAgICAgICAgc2Nyb2xsT2Zmc2V0ID0gLXNjcm9sbE9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vdXNlZG93biA9IHRydWU7XG5cbiAgICAgICAgX3RoaXMyLl9uYXZTY3JvbGwoc2Nyb2xsT2Zmc2V0KTtcblxuICAgICAgICBtb3VzZWRvd25JbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczIuX25hdlNjcm9sbChzY3JvbGxPZmZzZXQpO1xuICAgICAgICB9LCAyNTApO1xuICAgICAgfSk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9uKCdtb3VzZWRvd24nLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TQ1JPTExfUklHSFQsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChtb3VzZWRvd25JbnRlcnZhbCk7XG4gICAgICAgIHZhciBzY3JvbGxPZmZzZXQgPSBfdGhpczIuX2NvbmZpZy5zY3JvbGxPZmZzZXQ7XG5cbiAgICAgICAgaWYgKF90aGlzMi5fY29uZmlnLnNjcm9sbEJlaGF2aW9yU3dhcCkge1xuICAgICAgICAgIHNjcm9sbE9mZnNldCA9IC1zY3JvbGxPZmZzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBtb3VzZWRvd24gPSB0cnVlO1xuXG4gICAgICAgIF90aGlzMi5fbmF2U2Nyb2xsKHNjcm9sbE9mZnNldCk7XG5cbiAgICAgICAgbW91c2Vkb3duSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMyLl9uYXZTY3JvbGwoc2Nyb2xsT2Zmc2V0KTtcbiAgICAgICAgfSwgMjUwKTtcbiAgICAgIH0pO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbignbW91c2V1cCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKG1vdXNlZG93bikge1xuICAgICAgICAgIG1vdXNlZG93biA9IGZhbHNlO1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwobW91c2Vkb3duSW50ZXJ2YWwpO1xuICAgICAgICAgIG1vdXNlZG93bkludGVydmFsID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5fc2V0SXRlbUFjdGl2ZSA9IGZ1bmN0aW9uIF9zZXRJdGVtQWN0aXZlKGhyZWYpIHtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9TSURFQkFSX01FTlVfSVRFTSArIFwiLCBcIiArIFNFTEVDVE9SX0hFQURFUl9EUk9QRE9XTl9JVEVNKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfSEVBREVSX01FTlVfSVRFTSkucGFyZW50KCkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgdmFyICRoZWFkZXJNZW51SXRlbSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9IRUFERVJfTUVOVV9JVEVNICsgXCJbaHJlZiQ9XFxcIlwiICsgaHJlZiArIFwiXFxcIl1cIik7XG4gICAgICB2YXIgJGhlYWRlckRyb3Bkb3duSXRlbSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9IRUFERVJfRFJPUERPV05fSVRFTSArIFwiW2hyZWYkPVxcXCJcIiArIGhyZWYgKyBcIlxcXCJdXCIpO1xuICAgICAgdmFyICRzaWRlYmFyTWVudUl0ZW0gPSAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfU0lERUJBUl9NRU5VX0lURU0gKyBcIltocmVmJD1cXFwiXCIgKyBocmVmICsgXCJcXFwiXVwiKTtcbiAgICAgICRoZWFkZXJNZW51SXRlbS5lYWNoKGZ1bmN0aW9uIChpLCBlKSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlKS5wYXJlbnQoKS5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgICB9KTtcbiAgICAgICRoZWFkZXJEcm9wZG93bkl0ZW0uZWFjaChmdW5jdGlvbiAoaSwgZSkge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZSkuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgfSk7XG4gICAgICAkc2lkZWJhck1lbnVJdGVtLmVhY2goZnVuY3Rpb24gKGksIGUpIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGUpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGUpLnBhcmVudHMoJy5uYXYtdHJlZXZpZXcnKS5wcmV2QWxsKCcubmF2LWxpbmsnKS5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9maXhIZWlnaHQgPSBmdW5jdGlvbiBfZml4SGVpZ2h0KHRhYkVtcHR5KSB7XG4gICAgICBpZiAodGFiRW1wdHkgPT09IHZvaWQgMCkge1xuICAgICAgICB0YWJFbXB0eSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdib2R5JykuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GVUxMU0NSRUVOX01PREUpKSB7XG4gICAgICAgIHZhciB3aW5kb3dIZWlnaHQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10od2luZG93KS5oZWlnaHQoKTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1RBQl9FTVBUWSArIFwiLCBcIiArIFNFTEVDVE9SX1RBQl9MT0FESU5HKS5oZWlnaHQod2luZG93SGVpZ2h0KTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0NPTlRFTlRfV1JBUFBFUikuaGVpZ2h0KHdpbmRvd0hlaWdodCk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9DT05URU5UX0lGUkFNRSkuaGVpZ2h0KHdpbmRvd0hlaWdodCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgY29udGVudFdyYXBwZXJIZWlnaHQgPSBwYXJzZUZsb2F0KCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9DT05URU5UX1dSQVBQRVIpLmNzcygnbWluLWhlaWdodCcpKTtcbiAgICAgICAgdmFyIG5hdmJhckhlaWdodCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9UQUJfTkFWKS5vdXRlckhlaWdodCgpO1xuXG4gICAgICAgIGlmICh0YWJFbXB0eSA9PSB0cnVlKSB7XG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfVEFCX0VNUFRZICsgXCIsIFwiICsgU0VMRUNUT1JfVEFCX0xPQURJTkcpLmhlaWdodChjb250ZW50V3JhcHBlckhlaWdodCAtIG5hdmJhckhlaWdodCk7XG4gICAgICAgICAgfSwgNTApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9DT05URU5UX0lGUkFNRSkuaGVpZ2h0KGNvbnRlbnRXcmFwcGVySGVpZ2h0IC0gbmF2YmFySGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgSUZyYW1lLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKG9wZXJhdGlvbikge1xuICAgICAgdmFyIGRhdGEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQ3KTtcblxuICAgICAgdmFyIF9vcHRpb25zID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmV4dGVuZCh7fSwgRGVmYXVsdCQ1LCAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YSgpKTtcblxuICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIGRhdGEgPSBuZXcgSUZyYW1lKHRoaXMsIF9vcHRpb25zKTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkNywgZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb3BlcmF0aW9uID09PSAnc3RyaW5nJyAmJiBvcGVyYXRpb24ubWF0Y2goL2NyZWF0ZVRhYnxvcGVuVGFiU2lkZWJhcnxzd2l0Y2hUYWJ8cmVtb3ZlQWN0aXZlVGFiLykpIHtcbiAgICAgICAgdmFyIF9kYXRhO1xuXG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIChfZGF0YSA9IGRhdGEpW29wZXJhdGlvbl0uYXBwbHkoX2RhdGEsIGFyZ3MpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gSUZyYW1lO1xuICB9KCk7XG4gIC8qKlxuICAgKiBEYXRhIEFQSVxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgSUZyYW1lLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfREFUQV9UT0dHTEUkMykpO1xuICB9KTtcbiAgLyoqXG4gICAqIGpRdWVyeSBBUElcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ3XSA9IElGcmFtZS5falF1ZXJ5SW50ZXJmYWNlO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ3XS5Db25zdHJ1Y3RvciA9IElGcmFtZTtcblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ3XS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDddID0gSlFVRVJZX05PX0NPTkZMSUNUJDc7XG4gICAgcmV0dXJuIElGcmFtZS5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBBZG1pbkxURSBMYXlvdXQuanNcbiAgICogTGljZW5zZSBNSVRcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG4gIC8qKlxuICAgKiBDb25zdGFudHNcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuICB2YXIgTkFNRSQ4ID0gJ0xheW91dCc7XG4gIHZhciBEQVRBX0tFWSQ4ID0gJ2x0ZS5sYXlvdXQnO1xuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJDggPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ4XTtcbiAgdmFyIFNFTEVDVE9SX0hFQURFUiQxID0gJy5tYWluLWhlYWRlcic7XG4gIHZhciBTRUxFQ1RPUl9NQUlOX1NJREVCQVIgPSAnLm1haW4tc2lkZWJhcic7XG4gIHZhciBTRUxFQ1RPUl9TSURFQkFSID0gJy5tYWluLXNpZGViYXIgLnNpZGViYXInO1xuICB2YXIgU0VMRUNUT1JfQ09OVEVOVCA9ICcuY29udGVudC13cmFwcGVyJztcbiAgdmFyIFNFTEVDVE9SX0NPTlRST0xfU0lERUJBUl9DT05URU5UJDEgPSAnLmNvbnRyb2wtc2lkZWJhci1jb250ZW50JztcbiAgdmFyIFNFTEVDVE9SX0NPTlRST0xfU0lERUJBUl9CVE4gPSAnW2RhdGEtd2lkZ2V0PVwiY29udHJvbC1zaWRlYmFyXCJdJztcbiAgdmFyIFNFTEVDVE9SX0ZPT1RFUiQxID0gJy5tYWluLWZvb3Rlcic7XG4gIHZhciBTRUxFQ1RPUl9QVVNITUVOVV9CVE4gPSAnW2RhdGEtd2lkZ2V0PVwicHVzaG1lbnVcIl0nO1xuICB2YXIgU0VMRUNUT1JfTE9HSU5fQk9YID0gJy5sb2dpbi1ib3gnO1xuICB2YXIgU0VMRUNUT1JfUkVHSVNURVJfQk9YID0gJy5yZWdpc3Rlci1ib3gnO1xuICB2YXIgQ0xBU1NfTkFNRV9TSURFQkFSX0ZPQ1VTRUQgPSAnc2lkZWJhci1mb2N1c2VkJztcbiAgdmFyIENMQVNTX05BTUVfTEFZT1VUX0ZJWEVEJDEgPSAnbGF5b3V0LWZpeGVkJztcbiAgdmFyIENMQVNTX05BTUVfQ09OVFJPTF9TSURFQkFSX1NMSURFX09QRU4gPSAnY29udHJvbC1zaWRlYmFyLXNsaWRlLW9wZW4nO1xuICB2YXIgQ0xBU1NfTkFNRV9DT05UUk9MX1NJREVCQVJfT1BFTiQxID0gJ2NvbnRyb2wtc2lkZWJhci1vcGVuJztcbiAgdmFyIERlZmF1bHQkNiA9IHtcbiAgICBzY3JvbGxiYXJUaGVtZTogJ29zLXRoZW1lLWxpZ2h0JyxcbiAgICBzY3JvbGxiYXJBdXRvSGlkZTogJ2wnLFxuICAgIHBhbmVsQXV0b0hlaWdodDogdHJ1ZSxcbiAgICBwYW5lbEF1dG9IZWlnaHRNb2RlOiAnbWluLWhlaWdodCcsXG4gICAgbG9naW5SZWdpc3RlckF1dG9IZWlnaHQ6IHRydWVcbiAgfTtcbiAgLyoqXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuICB2YXIgTGF5b3V0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBMYXlvdXQoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcblxuICAgICAgdGhpcy5faW5pdCgpO1xuICAgIH0gLy8gUHVibGljXG5cblxuICAgIHZhciBfcHJvdG8gPSBMYXlvdXQucHJvdG90eXBlO1xuXG4gICAgX3Byb3RvLmZpeExheW91dEhlaWdodCA9IGZ1bmN0aW9uIGZpeExheW91dEhlaWdodChleHRyYSkge1xuICAgICAgaWYgKGV4dHJhID09PSB2b2lkIDApIHtcbiAgICAgICAgZXh0cmEgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgJGJvZHkgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oJ2JvZHknKTtcbiAgICAgIHZhciBjb250cm9sU2lkZWJhciA9IDA7XG5cbiAgICAgIGlmICgkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9TTElERV9PUEVOKSB8fCAkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9PUEVOJDEpIHx8IGV4dHJhID09PSAnY29udHJvbF9zaWRlYmFyJykge1xuICAgICAgICBjb250cm9sU2lkZWJhciA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9DT05UUk9MX1NJREVCQVJfQ09OVEVOVCQxKS5oZWlnaHQoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGhlaWdodHMgPSB7XG4gICAgICAgIHdpbmRvdzogJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykuaGVpZ2h0KCksXG4gICAgICAgIGhlYWRlcjogJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0hFQURFUiQxKS5sZW5ndGggIT09IDAgPyAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfSEVBREVSJDEpLm91dGVySGVpZ2h0KCkgOiAwLFxuICAgICAgICBmb290ZXI6ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9GT09URVIkMSkubGVuZ3RoICE9PSAwID8gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0ZPT1RFUiQxKS5vdXRlckhlaWdodCgpIDogMCxcbiAgICAgICAgc2lkZWJhcjogJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1NJREVCQVIpLmxlbmd0aCAhPT0gMCA/ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9TSURFQkFSKS5oZWlnaHQoKSA6IDAsXG4gICAgICAgIGNvbnRyb2xTaWRlYmFyOiBjb250cm9sU2lkZWJhclxuICAgICAgfTtcblxuICAgICAgdmFyIG1heCA9IHRoaXMuX21heChoZWlnaHRzKTtcblxuICAgICAgdmFyIG9mZnNldCA9IHRoaXMuX2NvbmZpZy5wYW5lbEF1dG9IZWlnaHQ7XG5cbiAgICAgIGlmIChvZmZzZXQgPT09IHRydWUpIHtcbiAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgIH1cblxuICAgICAgdmFyICRjb250ZW50U2VsZWN0b3IgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfQ09OVEVOVCk7XG5cbiAgICAgIGlmIChvZmZzZXQgIT09IGZhbHNlKSB7XG4gICAgICAgIGlmIChtYXggPT09IGhlaWdodHMuY29udHJvbFNpZGViYXIpIHtcbiAgICAgICAgICAkY29udGVudFNlbGVjdG9yLmNzcyh0aGlzLl9jb25maWcucGFuZWxBdXRvSGVpZ2h0TW9kZSwgbWF4ICsgb2Zmc2V0KTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXggPT09IGhlaWdodHMud2luZG93KSB7XG4gICAgICAgICAgJGNvbnRlbnRTZWxlY3Rvci5jc3ModGhpcy5fY29uZmlnLnBhbmVsQXV0b0hlaWdodE1vZGUsIG1heCArIG9mZnNldCAtIGhlaWdodHMuaGVhZGVyIC0gaGVpZ2h0cy5mb290ZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRjb250ZW50U2VsZWN0b3IuY3NzKHRoaXMuX2NvbmZpZy5wYW5lbEF1dG9IZWlnaHRNb2RlLCBtYXggKyBvZmZzZXQgLSBoZWlnaHRzLmhlYWRlcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faXNGb290ZXJGaXhlZCgpKSB7XG4gICAgICAgICAgJGNvbnRlbnRTZWxlY3Rvci5jc3ModGhpcy5fY29uZmlnLnBhbmVsQXV0b0hlaWdodE1vZGUsIHBhcnNlRmxvYXQoJGNvbnRlbnRTZWxlY3Rvci5jc3ModGhpcy5fY29uZmlnLnBhbmVsQXV0b0hlaWdodE1vZGUpKSArIGhlaWdodHMuZm9vdGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoISRib2R5Lmhhc0NsYXNzKENMQVNTX05BTUVfTEFZT1VUX0ZJWEVEJDEpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9mZnNldCAhPT0gZmFsc2UpIHtcbiAgICAgICAgJGNvbnRlbnRTZWxlY3Rvci5jc3ModGhpcy5fY29uZmlnLnBhbmVsQXV0b0hlaWdodE1vZGUsIG1heCArIG9mZnNldCAtIGhlaWdodHMuaGVhZGVyIC0gaGVpZ2h0cy5mb290ZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbi5vdmVybGF5U2Nyb2xsYmFycyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1NJREVCQVIpLm92ZXJsYXlTY3JvbGxiYXJzKHtcbiAgICAgICAgICBjbGFzc05hbWU6IHRoaXMuX2NvbmZpZy5zY3JvbGxiYXJUaGVtZSxcbiAgICAgICAgICBzaXplQXV0b0NhcGFibGU6IHRydWUsXG4gICAgICAgICAgc2Nyb2xsYmFyczoge1xuICAgICAgICAgICAgYXV0b0hpZGU6IHRoaXMuX2NvbmZpZy5zY3JvbGxiYXJBdXRvSGlkZSxcbiAgICAgICAgICAgIGNsaWNrU2Nyb2xsaW5nOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmZpeExvZ2luUmVnaXN0ZXJIZWlnaHQgPSBmdW5jdGlvbiBmaXhMb2dpblJlZ2lzdGVySGVpZ2h0KCkge1xuICAgICAgdmFyICRib2R5ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdib2R5Jyk7XG4gICAgICB2YXIgJHNlbGVjdG9yID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0xPR0lOX0JPWCArIFwiLCBcIiArIFNFTEVDVE9SX1JFR0lTVEVSX0JPWCk7XG5cbiAgICAgIGlmICgkc2VsZWN0b3IubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICRib2R5LmNzcygnaGVpZ2h0JywgJ2F1dG8nKTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdodG1sJykuY3NzKCdoZWlnaHQnLCAnYXV0bycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGJveEhlaWdodCA9ICRzZWxlY3Rvci5oZWlnaHQoKTtcblxuICAgICAgICBpZiAoJGJvZHkuY3NzKHRoaXMuX2NvbmZpZy5wYW5lbEF1dG9IZWlnaHRNb2RlKSAhPT0gYm94SGVpZ2h0KSB7XG4gICAgICAgICAgJGJvZHkuY3NzKHRoaXMuX2NvbmZpZy5wYW5lbEF1dG9IZWlnaHRNb2RlLCBib3hIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9pbml0ID0gZnVuY3Rpb24gX2luaXQoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAvLyBBY3RpdmF0ZSBsYXlvdXQgaGVpZ2h0IHdhdGNoZXJcbiAgICAgIHRoaXMuZml4TGF5b3V0SGVpZ2h0KCk7XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcubG9naW5SZWdpc3RlckF1dG9IZWlnaHQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5maXhMb2dpblJlZ2lzdGVySGVpZ2h0KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2NvbmZpZy5sb2dpblJlZ2lzdGVyQXV0b0hlaWdodCA9PT0gcGFyc2VJbnQodGhpcy5fY29uZmlnLmxvZ2luUmVnaXN0ZXJBdXRvSGVpZ2h0LCAxMCkpIHtcbiAgICAgICAgc2V0SW50ZXJ2YWwodGhpcy5maXhMb2dpblJlZ2lzdGVySGVpZ2h0LCB0aGlzLl9jb25maWcubG9naW5SZWdpc3RlckF1dG9IZWlnaHQpO1xuICAgICAgfVxuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfU0lERUJBUikub24oJ2NvbGxhcHNlZC5sdGUudHJlZXZpZXcgZXhwYW5kZWQubHRlLnRyZWV2aWV3JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy5maXhMYXlvdXRIZWlnaHQoKTtcbiAgICAgIH0pO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1BVU0hNRU5VX0JUTikub24oJ2NvbGxhcHNlZC5sdGUucHVzaG1lbnUgc2hvd24ubHRlLnB1c2htZW51JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy5maXhMYXlvdXRIZWlnaHQoKTtcbiAgICAgIH0pO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0NPTlRST0xfU0lERUJBUl9CVE4pLm9uKCdjb2xsYXBzZWQubHRlLmNvbnRyb2xzaWRlYmFyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy5maXhMYXlvdXRIZWlnaHQoKTtcbiAgICAgIH0pLm9uKCdleHBhbmRlZC5sdGUuY29udHJvbHNpZGViYXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLmZpeExheW91dEhlaWdodCgnY29udHJvbF9zaWRlYmFyJyk7XG4gICAgICB9KTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh3aW5kb3cpLnJlc2l6ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLmZpeExheW91dEhlaWdodCgpO1xuICAgICAgfSk7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdib2R5LmhvbGQtdHJhbnNpdGlvbicpLnJlbW92ZUNsYXNzKCdob2xkLXRyYW5zaXRpb24nKTtcbiAgICAgIH0sIDUwKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9tYXggPSBmdW5jdGlvbiBfbWF4KG51bWJlcnMpIHtcbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBudW1iZXIgaW4gYSBsaXN0XG4gICAgICB2YXIgbWF4ID0gMDtcbiAgICAgIE9iamVjdC5rZXlzKG51bWJlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAobnVtYmVyc1trZXldID4gbWF4KSB7XG4gICAgICAgICAgbWF4ID0gbnVtYmVyc1trZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBtYXg7XG4gICAgfTtcblxuICAgIF9wcm90by5faXNGb290ZXJGaXhlZCA9IGZ1bmN0aW9uIF9pc0Zvb3RlckZpeGVkKCkge1xuICAgICAgcmV0dXJuICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9GT09URVIkMSkuY3NzKCdwb3NpdGlvbicpID09PSAnZml4ZWQnO1xuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgTGF5b3V0Ll9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgaWYgKGNvbmZpZyA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGNvbmZpZyA9ICcnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQ4KTtcblxuICAgICAgICB2YXIgX29wdGlvbnMgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZXh0ZW5kKHt9LCBEZWZhdWx0JDYsICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKCkpO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgTGF5b3V0KCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSwgX29wdGlvbnMpO1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJDgsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gJ2luaXQnIHx8IGNvbmZpZyA9PT0gJycpIHtcbiAgICAgICAgICBkYXRhLl9pbml0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnID09PSAnZml4TGF5b3V0SGVpZ2h0JyB8fCBjb25maWcgPT09ICdmaXhMb2dpblJlZ2lzdGVySGVpZ2h0Jykge1xuICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIExheW91dDtcbiAgfSgpO1xuICAvKipcbiAgICogRGF0YSBBUElcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh3aW5kb3cpLm9uKCdsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgIExheW91dC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdib2R5JykpO1xuICB9KTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1NJREVCQVIgKyBcIiBhXCIpLm9uKCdmb2N1c2luJywgZnVuY3Rpb24gKCkge1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9NQUlOX1NJREVCQVIpLmFkZENsYXNzKENMQVNTX05BTUVfU0lERUJBUl9GT0NVU0VEKTtcbiAgfSk7XG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9TSURFQkFSICsgXCIgYVwiKS5vbignZm9jdXNvdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX01BSU5fU0lERUJBUikucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9TSURFQkFSX0ZPQ1VTRUQpO1xuICB9KTtcbiAgLyoqXG4gICAqIGpRdWVyeSBBUElcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ4XSA9IExheW91dC5falF1ZXJ5SW50ZXJmYWNlO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ4XS5Db25zdHJ1Y3RvciA9IExheW91dDtcblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ4XS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDhdID0gSlFVRVJZX05PX0NPTkZMSUNUJDg7XG4gICAgcmV0dXJuIExheW91dC5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBBZG1pbkxURSBQdXNoTWVudS5qc1xuICAgKiBMaWNlbnNlIE1JVFxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG4gIHZhciBOQU1FJDkgPSAnUHVzaE1lbnUnO1xuICB2YXIgREFUQV9LRVkkOSA9ICdsdGUucHVzaG1lbnUnO1xuICB2YXIgRVZFTlRfS0VZJDUgPSBcIi5cIiArIERBVEFfS0VZJDk7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkOSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDldO1xuICB2YXIgRVZFTlRfQ09MTEFQU0VEJDMgPSBcImNvbGxhcHNlZFwiICsgRVZFTlRfS0VZJDU7XG4gIHZhciBFVkVOVF9TSE9XTiA9IFwic2hvd25cIiArIEVWRU5UX0tFWSQ1O1xuICB2YXIgU0VMRUNUT1JfVE9HR0xFX0JVVFRPTiA9ICdbZGF0YS13aWRnZXQ9XCJwdXNobWVudVwiXSc7XG4gIHZhciBTRUxFQ1RPUl9CT0RZID0gJ2JvZHknO1xuICB2YXIgU0VMRUNUT1JfT1ZFUkxBWSA9ICcjc2lkZWJhci1vdmVybGF5JztcbiAgdmFyIFNFTEVDVE9SX1dSQVBQRVIgPSAnLndyYXBwZXInO1xuICB2YXIgQ0xBU1NfTkFNRV9DT0xMQVBTRUQkMSA9ICdzaWRlYmFyLWNvbGxhcHNlJztcbiAgdmFyIENMQVNTX05BTUVfT1BFTiA9ICdzaWRlYmFyLW9wZW4nO1xuICB2YXIgQ0xBU1NfTkFNRV9JU19PUEVOSU5HID0gJ3NpZGViYXItaXMtb3BlbmluZyc7XG4gIHZhciBDTEFTU19OQU1FX0NMT1NFRCA9ICdzaWRlYmFyLWNsb3NlZCc7XG4gIHZhciBEZWZhdWx0JDcgPSB7XG4gICAgYXV0b0NvbGxhcHNlU2l6ZTogOTkyLFxuICAgIGVuYWJsZVJlbWVtYmVyOiBmYWxzZSxcbiAgICBub1RyYW5zaXRpb25BZnRlclJlbG9hZDogdHJ1ZVxuICB9O1xuICAvKipcbiAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG4gIHZhciBQdXNoTWVudSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUHVzaE1lbnUoZWxlbWVudCwgb3B0aW9ucykge1xuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLl9vcHRpb25zID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmV4dGVuZCh7fSwgRGVmYXVsdCQ3LCBvcHRpb25zKTtcblxuICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9PVkVSTEFZKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5fYWRkT3ZlcmxheSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pbml0KCk7XG4gICAgfSAvLyBQdWJsaWNcblxuXG4gICAgdmFyIF9wcm90byA9IFB1c2hNZW51LnByb3RvdHlwZTtcblxuICAgIF9wcm90by5leHBhbmQgPSBmdW5jdGlvbiBleHBhbmQoKSB7XG4gICAgICB2YXIgJGJvZHlTZWxlY3RvciA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9CT0RZKTtcblxuICAgICAgaWYgKHRoaXMuX29wdGlvbnMuYXV0b0NvbGxhcHNlU2l6ZSkge1xuICAgICAgICBpZiAoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykud2lkdGgoKSA8PSB0aGlzLl9vcHRpb25zLmF1dG9Db2xsYXBzZVNpemUpIHtcbiAgICAgICAgICAkYm9keVNlbGVjdG9yLmFkZENsYXNzKENMQVNTX05BTUVfT1BFTik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgJGJvZHlTZWxlY3Rvci5hZGRDbGFzcyhDTEFTU19OQU1FX0lTX09QRU5JTkcpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQ09MTEFQU0VEJDEgKyBcIiBcIiArIENMQVNTX05BTUVfQ0xPU0VEKS5kZWxheSg1MCkucXVldWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAkYm9keVNlbGVjdG9yLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfSVNfT1BFTklORyk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kZXF1ZXVlKCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuX29wdGlvbnMuZW5hYmxlUmVtZW1iZXIpIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJyZW1lbWJlclwiICsgRVZFTlRfS0VZJDUsIENMQVNTX05BTUVfT1BFTik7XG4gICAgICB9XG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9TSE9XTikpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uY29sbGFwc2UgPSBmdW5jdGlvbiBjb2xsYXBzZSgpIHtcbiAgICAgIHZhciAkYm9keVNlbGVjdG9yID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0JPRFkpO1xuXG4gICAgICBpZiAodGhpcy5fb3B0aW9ucy5hdXRvQ29sbGFwc2VTaXplKSB7XG4gICAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10od2luZG93KS53aWR0aCgpIDw9IHRoaXMuX29wdGlvbnMuYXV0b0NvbGxhcHNlU2l6ZSkge1xuICAgICAgICAgICRib2R5U2VsZWN0b3IucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9PUEVOKS5hZGRDbGFzcyhDTEFTU19OQU1FX0NMT1NFRCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgJGJvZHlTZWxlY3Rvci5hZGRDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNFRCQxKTtcblxuICAgICAgaWYgKHRoaXMuX29wdGlvbnMuZW5hYmxlUmVtZW1iZXIpIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJyZW1lbWJlclwiICsgRVZFTlRfS0VZJDUsIENMQVNTX05BTUVfQ09MTEFQU0VEJDEpO1xuICAgICAgfVxuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkudHJpZ2dlcigkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfQ09MTEFQU0VEJDMpKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcbiAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfQk9EWSkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRUQkMSkpIHtcbiAgICAgICAgdGhpcy5leHBhbmQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29sbGFwc2UoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmF1dG9Db2xsYXBzZSA9IGZ1bmN0aW9uIGF1dG9Db2xsYXBzZShyZXNpemUpIHtcbiAgICAgIGlmIChyZXNpemUgPT09IHZvaWQgMCkge1xuICAgICAgICByZXNpemUgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9vcHRpb25zLmF1dG9Db2xsYXBzZVNpemUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgJGJvZHlTZWxlY3RvciA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9CT0RZKTtcblxuICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh3aW5kb3cpLndpZHRoKCkgPD0gdGhpcy5fb3B0aW9ucy5hdXRvQ29sbGFwc2VTaXplKSB7XG4gICAgICAgIGlmICghJGJvZHlTZWxlY3Rvci5oYXNDbGFzcyhDTEFTU19OQU1FX09QRU4pKSB7XG4gICAgICAgICAgdGhpcy5jb2xsYXBzZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlc2l6ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBpZiAoJGJvZHlTZWxlY3Rvci5oYXNDbGFzcyhDTEFTU19OQU1FX09QRU4pKSB7XG4gICAgICAgICAgJGJvZHlTZWxlY3Rvci5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX09QRU4pO1xuICAgICAgICB9IGVsc2UgaWYgKCRib2R5U2VsZWN0b3IuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9DTE9TRUQpKSB7XG4gICAgICAgICAgdGhpcy5leHBhbmQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8ucmVtZW1iZXIgPSBmdW5jdGlvbiByZW1lbWJlcigpIHtcbiAgICAgIGlmICghdGhpcy5fb3B0aW9ucy5lbmFibGVSZW1lbWJlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciAkYm9keSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnYm9keScpO1xuICAgICAgdmFyIHRvZ2dsZVN0YXRlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJyZW1lbWJlclwiICsgRVZFTlRfS0VZJDUpO1xuXG4gICAgICBpZiAodG9nZ2xlU3RhdGUgPT09IENMQVNTX05BTUVfQ09MTEFQU0VEJDEpIHtcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMubm9UcmFuc2l0aW9uQWZ0ZXJSZWxvYWQpIHtcbiAgICAgICAgICAkYm9keS5hZGRDbGFzcygnaG9sZC10cmFuc2l0aW9uJykuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRUQkMSkuZGVsYXkoNTApLnF1ZXVlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5yZW1vdmVDbGFzcygnaG9sZC10cmFuc2l0aW9uJyk7XG4gICAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGVxdWV1ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRib2R5LmFkZENsYXNzKENMQVNTX05BTUVfQ09MTEFQU0VEJDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX29wdGlvbnMubm9UcmFuc2l0aW9uQWZ0ZXJSZWxvYWQpIHtcbiAgICAgICAgJGJvZHkuYWRkQ2xhc3MoJ2hvbGQtdHJhbnNpdGlvbicpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQ09MTEFQU0VEJDEpLmRlbGF5KDUwKS5xdWV1ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLnJlbW92ZUNsYXNzKCdob2xkLXRyYW5zaXRpb24nKTtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGVxdWV1ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICRib2R5LnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQ09MTEFQU0VEJDEpO1xuICAgICAgfVxuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5faW5pdCA9IGZ1bmN0aW9uIF9pbml0KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdGhpcy5yZW1lbWJlcigpO1xuICAgICAgdGhpcy5hdXRvQ29sbGFwc2UoKTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh3aW5kb3cpLnJlc2l6ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLmF1dG9Db2xsYXBzZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2FkZE92ZXJsYXkgPSBmdW5jdGlvbiBfYWRkT3ZlcmxheSgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgb3ZlcmxheSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnPGRpdiAvPicsIHtcbiAgICAgICAgaWQ6ICdzaWRlYmFyLW92ZXJsYXknXG4gICAgICB9KTtcbiAgICAgIG92ZXJsYXkub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuY29sbGFwc2UoKTtcbiAgICAgIH0pO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1dSQVBQRVIpLmFwcGVuZChvdmVybGF5KTtcbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIFB1c2hNZW51Ll9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKG9wZXJhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYXRhID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkOSk7XG5cbiAgICAgICAgdmFyIF9vcHRpb25zID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmV4dGVuZCh7fSwgRGVmYXVsdCQ3LCAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YSgpKTtcblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IFB1c2hNZW51KHRoaXMsIF9vcHRpb25zKTtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQ5LCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygb3BlcmF0aW9uID09PSAnc3RyaW5nJyAmJiBvcGVyYXRpb24ubWF0Y2goL2NvbGxhcHNlfGV4cGFuZHx0b2dnbGUvKSkge1xuICAgICAgICAgIGRhdGFbb3BlcmF0aW9uXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFB1c2hNZW51O1xuICB9KCk7XG4gIC8qKlxuICAgKiBEYXRhIEFQSVxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbignY2xpY2snLCBTRUxFQ1RPUl9UT0dHTEVfQlVUVE9OLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHZhciBidXR0b24gPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuXG4gICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShidXR0b24pLmRhdGEoJ3dpZGdldCcpICE9PSAncHVzaG1lbnUnKSB7XG4gICAgICBidXR0b24gPSAkX19kZWZhdWx0WydkZWZhdWx0J10oYnV0dG9uKS5jbG9zZXN0KFNFTEVDVE9SX1RPR0dMRV9CVVRUT04pO1xuICAgIH1cblxuICAgIFB1c2hNZW51Ll9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkX19kZWZhdWx0WydkZWZhdWx0J10oYnV0dG9uKSwgJ3RvZ2dsZScpO1xuICB9KTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgUHVzaE1lbnUuX2pRdWVyeUludGVyZmFjZS5jYWxsKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9UT0dHTEVfQlVUVE9OKSk7XG4gIH0pO1xuICAvKipcbiAgICogalF1ZXJ5IEFQSVxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDldID0gUHVzaE1lbnUuX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkOV0uQ29uc3RydWN0b3IgPSBQdXNoTWVudTtcblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ5XS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDldID0gSlFVRVJZX05PX0NPTkZMSUNUJDk7XG4gICAgcmV0dXJuIFB1c2hNZW51Ll9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEFkbWluTFRFIFNpZGViYXJTZWFyY2guanNcbiAgICogTGljZW5zZSBNSVRcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG4gIC8qKlxuICAgKiBDb25zdGFudHNcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuICB2YXIgTkFNRSRhID0gJ1NpZGViYXJTZWFyY2gnO1xuICB2YXIgREFUQV9LRVkkYSA9ICdsdGUuc2lkZWJhci1zZWFyY2gnO1xuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJGEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRhXTtcbiAgdmFyIENMQVNTX05BTUVfT1BFTiQxID0gJ3NpZGViYXItc2VhcmNoLW9wZW4nO1xuICB2YXIgQ0xBU1NfTkFNRV9JQ09OX1NFQVJDSCA9ICdmYS1zZWFyY2gnO1xuICB2YXIgQ0xBU1NfTkFNRV9JQ09OX0NMT1NFID0gJ2ZhLXRpbWVzJztcbiAgdmFyIENMQVNTX05BTUVfSEVBREVSID0gJ25hdi1oZWFkZXInO1xuICB2YXIgQ0xBU1NfTkFNRV9TRUFSQ0hfUkVTVUxUUyA9ICdzaWRlYmFyLXNlYXJjaC1yZXN1bHRzJztcbiAgdmFyIENMQVNTX05BTUVfTElTVF9HUk9VUCA9ICdsaXN0LWdyb3VwJztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfV0lER0VUJDEgPSAnW2RhdGEtd2lkZ2V0PVwic2lkZWJhci1zZWFyY2hcIl0nO1xuICB2YXIgU0VMRUNUT1JfU0lERUJBUiQxID0gJy5tYWluLXNpZGViYXIgLm5hdi1zaWRlYmFyJztcbiAgdmFyIFNFTEVDVE9SX05BVl9MSU5LID0gJy5uYXYtbGluayc7XG4gIHZhciBTRUxFQ1RPUl9OQVZfVFJFRVZJRVcgPSAnLm5hdi10cmVldmlldyc7XG4gIHZhciBTRUxFQ1RPUl9TRUFSQ0hfSU5QVVQgPSBTRUxFQ1RPUl9EQVRBX1dJREdFVCQxICsgXCIgLmZvcm0tY29udHJvbFwiO1xuICB2YXIgU0VMRUNUT1JfU0VBUkNIX0JVVFRPTiA9IFNFTEVDVE9SX0RBVEFfV0lER0VUJDEgKyBcIiAuYnRuXCI7XG4gIHZhciBTRUxFQ1RPUl9TRUFSQ0hfSUNPTiA9IFNFTEVDVE9SX1NFQVJDSF9CVVRUT04gKyBcIiBpXCI7XG4gIHZhciBTRUxFQ1RPUl9TRUFSQ0hfTElTVF9HUk9VUCA9IFwiLlwiICsgQ0xBU1NfTkFNRV9MSVNUX0dST1VQO1xuICB2YXIgU0VMRUNUT1JfU0VBUkNIX1JFU1VMVFMgPSBcIi5cIiArIENMQVNTX05BTUVfU0VBUkNIX1JFU1VMVFM7XG4gIHZhciBTRUxFQ1RPUl9TRUFSQ0hfUkVTVUxUU19HUk9VUCA9IFNFTEVDVE9SX1NFQVJDSF9SRVNVTFRTICsgXCIgLlwiICsgQ0xBU1NfTkFNRV9MSVNUX0dST1VQO1xuICB2YXIgRGVmYXVsdCQ4ID0ge1xuICAgIGFycm93U2lnbjogJy0+JyxcbiAgICBtaW5MZW5ndGg6IDMsXG4gICAgbWF4UmVzdWx0czogNyxcbiAgICBoaWdobGlnaHROYW1lOiB0cnVlLFxuICAgIGhpZ2hsaWdodFBhdGg6IGZhbHNlLFxuICAgIGhpZ2hsaWdodENsYXNzOiAndGV4dC1saWdodCcsXG4gICAgbm90Rm91bmRUZXh0OiAnTm8gZWxlbWVudCBmb3VuZCEnXG4gIH07XG4gIHZhciBTZWFyY2hJdGVtcyA9IFtdO1xuICAvKipcbiAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG4gIHZhciBTaWRlYmFyU2VhcmNoID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTaWRlYmFyU2VhcmNoKF9lbGVtZW50LCBfb3B0aW9ucykge1xuICAgICAgdGhpcy5lbGVtZW50ID0gX2VsZW1lbnQ7XG4gICAgICB0aGlzLm9wdGlvbnMgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZXh0ZW5kKHt9LCBEZWZhdWx0JDgsIF9vcHRpb25zKTtcbiAgICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICB9IC8vIFB1YmxpY1xuXG5cbiAgICB2YXIgX3Byb3RvID0gU2lkZWJhclNlYXJjaC5wcm90b3R5cGU7XG5cbiAgICBfcHJvdG8uaW5pdCA9IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAoJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0RBVEFfV0lER0VUJDEpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9EQVRBX1dJREdFVCQxKS5uZXh0KFNFTEVDVE9SX1NFQVJDSF9SRVNVTFRTKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfREFUQV9XSURHRVQkMSkuYWZ0ZXIoJF9fZGVmYXVsdFsnZGVmYXVsdCddKCc8ZGl2IC8+Jywge1xuICAgICAgICAgIGNsYXNzOiBDTEFTU19OQU1FX1NFQVJDSF9SRVNVTFRTXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9TRUFSQ0hfUkVTVUxUUykuY2hpbGRyZW4oU0VMRUNUT1JfU0VBUkNIX0xJU1RfR1JPVVApLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9TRUFSQ0hfUkVTVUxUUykuYXBwZW5kKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnPGRpdiAvPicsIHtcbiAgICAgICAgICBjbGFzczogQ0xBU1NfTkFNRV9MSVNUX0dST1VQXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fYWRkTm90Rm91bmQoKTtcblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1NJREVCQVIkMSkuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uIChpLCBjaGlsZCkge1xuICAgICAgICBfdGhpcy5fcGFyc2VJdGVtKGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uc2VhcmNoID0gZnVuY3Rpb24gc2VhcmNoKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBzZWFyY2hWYWx1ZSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9TRUFSQ0hfSU5QVVQpLnZhbCgpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmIChzZWFyY2hWYWx1ZS5sZW5ndGggPCB0aGlzLm9wdGlvbnMubWluTGVuZ3RoKSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9TRUFSQ0hfUkVTVUxUU19HUk9VUCkuZW1wdHkoKTtcblxuICAgICAgICB0aGlzLl9hZGROb3RGb3VuZCgpO1xuXG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2VhcmNoUmVzdWx0cyA9IFNlYXJjaEl0ZW1zLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVmFsdWUpO1xuICAgICAgfSk7XG4gICAgICB2YXIgZW5kUmVzdWx0cyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShzZWFyY2hSZXN1bHRzLnNsaWNlKDAsIHRoaXMub3B0aW9ucy5tYXhSZXN1bHRzKSk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfU0VBUkNIX1JFU1VMVFNfR1JPVVApLmVtcHR5KCk7XG5cbiAgICAgIGlmIChlbmRSZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9hZGROb3RGb3VuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kUmVzdWx0cy5lYWNoKGZ1bmN0aW9uIChpLCByZXN1bHQpIHtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfU0VBUkNIX1JFU1VMVFNfR1JPVVApLmFwcGVuZChfdGhpczIuX3JlbmRlckl0ZW0ocmVzdWx0Lm5hbWUsIHJlc3VsdC5saW5rLCByZXN1bHQucGF0aCkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfTtcblxuICAgIF9wcm90by5vcGVuID0gZnVuY3Rpb24gb3BlbigpIHtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9EQVRBX1dJREdFVCQxKS5wYXJlbnQoKS5hZGRDbGFzcyhDTEFTU19OQU1FX09QRU4kMSk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfU0VBUkNIX0lDT04pLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfSUNPTl9TRUFSQ0gpLmFkZENsYXNzKENMQVNTX05BTUVfSUNPTl9DTE9TRSk7XG4gICAgfTtcblxuICAgIF9wcm90by5jbG9zZSA9IGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0RBVEFfV0lER0VUJDEpLnBhcmVudCgpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfT1BFTiQxKTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9TRUFSQ0hfSUNPTikucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9JQ09OX0NMT1NFKS5hZGRDbGFzcyhDTEFTU19OQU1FX0lDT05fU0VBUkNIKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcbiAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfREFUQV9XSURHRVQkMSkucGFyZW50KCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9PUEVOJDEpKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgfVxuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fcGFyc2VJdGVtID0gZnVuY3Rpb24gX3BhcnNlSXRlbShpdGVtLCBwYXRoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgaWYgKHBhdGggPT09IHZvaWQgMCkge1xuICAgICAgICBwYXRoID0gW107XG4gICAgICB9XG5cbiAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10oaXRlbSkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9IRUFERVIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZW1PYmplY3QgPSB7fTtcbiAgICAgIHZhciBuYXZMaW5rID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGl0ZW0pLmNsb25lKCkuZmluZChcIj4gXCIgKyBTRUxFQ1RPUl9OQVZfTElOSyk7XG4gICAgICB2YXIgbmF2VHJlZXZpZXcgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oaXRlbSkuY2xvbmUoKS5maW5kKFwiPiBcIiArIFNFTEVDVE9SX05BVl9UUkVFVklFVyk7XG4gICAgICB2YXIgbGluayA9IG5hdkxpbmsuYXR0cignaHJlZicpO1xuICAgICAgdmFyIG5hbWUgPSBuYXZMaW5rLmZpbmQoJ3AnKS5jaGlsZHJlbigpLnJlbW92ZSgpLmVuZCgpLnRleHQoKTtcbiAgICAgIGl0ZW1PYmplY3QubmFtZSA9IHRoaXMuX3RyaW1UZXh0KG5hbWUpO1xuICAgICAgaXRlbU9iamVjdC5saW5rID0gbGluaztcbiAgICAgIGl0ZW1PYmplY3QucGF0aCA9IHBhdGg7XG5cbiAgICAgIGlmIChuYXZUcmVldmlldy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgU2VhcmNoSXRlbXMucHVzaChpdGVtT2JqZWN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBuZXdQYXRoID0gaXRlbU9iamVjdC5wYXRoLmNvbmNhdChbaXRlbU9iamVjdC5uYW1lXSk7XG4gICAgICAgIG5hdlRyZWV2aWV3LmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbiAoaSwgY2hpbGQpIHtcbiAgICAgICAgICBfdGhpczMuX3BhcnNlSXRlbShjaGlsZCwgbmV3UGF0aCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX3RyaW1UZXh0ID0gZnVuY3Rpb24gX3RyaW1UZXh0KHRleHQpIHtcbiAgICAgIHJldHVybiAkLnRyaW0odGV4dC5yZXBsYWNlKC8oXFxyXFxufFxcbnxcXHIpL2dtLCAnICcpKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9yZW5kZXJJdGVtID0gZnVuY3Rpb24gX3JlbmRlckl0ZW0obmFtZSwgbGluaywgcGF0aCkge1xuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgIHBhdGggPSBwYXRoLmpvaW4oXCIgXCIgKyB0aGlzLm9wdGlvbnMuYXJyb3dTaWduICsgXCIgXCIpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmhpZ2hsaWdodE5hbWUgfHwgdGhpcy5vcHRpb25zLmhpZ2hsaWdodFBhdGgpIHtcbiAgICAgICAgdmFyIHNlYXJjaFZhbHVlID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1NFQVJDSF9JTlBVVCkudmFsKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdmFyIHJlZ0V4cCA9IG5ldyBSZWdFeHAoc2VhcmNoVmFsdWUsICdnaScpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGlnaGxpZ2h0TmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UocmVnRXhwLCBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICByZXR1cm4gXCI8YiBjbGFzcz1cXFwiXCIgKyBfdGhpczQub3B0aW9ucy5oaWdobGlnaHRDbGFzcyArIFwiXFxcIj5cIiArIHN0ciArIFwiPC9iPlwiO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oaWdobGlnaHRQYXRoKSB7XG4gICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZShyZWdFeHAsIGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjxiIGNsYXNzPVxcXCJcIiArIF90aGlzNC5vcHRpb25zLmhpZ2hsaWdodENsYXNzICsgXCJcXFwiPlwiICsgc3RyICsgXCI8L2I+XCI7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFwiPGEgaHJlZj1cXFwiXCIgKyBsaW5rICsgXCJcXFwiIGNsYXNzPVxcXCJsaXN0LWdyb3VwLWl0ZW1cXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwic2VhcmNoLXRpdGxlXFxcIj5cXG4gICAgICAgICAgXCIgKyBuYW1lICsgXCJcXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwic2VhcmNoLXBhdGhcXFwiPlxcbiAgICAgICAgICBcIiArIHBhdGggKyBcIlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgPC9hPlwiO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2FkZE5vdEZvdW5kID0gZnVuY3Rpb24gX2FkZE5vdEZvdW5kKCkge1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1NFQVJDSF9SRVNVTFRTX0dST1VQKS5hcHBlbmQodGhpcy5fcmVuZGVySXRlbSh0aGlzLm9wdGlvbnMubm90Rm91bmRUZXh0LCAnIycsIFtdKSk7XG4gICAgfSAvLyBTdGF0aWNcbiAgICA7XG5cbiAgICBTaWRlYmFyU2VhcmNoLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgdmFyIGRhdGEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSRhKTtcblxuICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIGRhdGEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YSgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgX29wdGlvbnMgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZXh0ZW5kKHt9LCBEZWZhdWx0JDgsIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDogZGF0YSk7XG5cbiAgICAgIHZhciBwbHVnaW4gPSBuZXcgU2lkZWJhclNlYXJjaCgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcyksIF9vcHRpb25zKTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJGEsIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDogZGF0YSk7XG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJyAmJiBjb25maWcubWF0Y2goL2luaXR8dG9nZ2xlfGNsb3NlfG9wZW58c2VhcmNoLykpIHtcbiAgICAgICAgcGx1Z2luW2NvbmZpZ10oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBsdWdpbi5pbml0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBTaWRlYmFyU2VhcmNoO1xuICB9KCk7XG4gIC8qKlxuICAgKiBEYXRhIEFQSVxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbignY2xpY2snLCBTRUxFQ1RPUl9TRUFSQ0hfQlVUVE9OLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgU2lkZWJhclNlYXJjaC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0RBVEFfV0lER0VUJDEpLCAndG9nZ2xlJyk7XG4gIH0pO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9uKCdrZXl1cCcsIFNFTEVDVE9SX1NFQVJDSF9JTlBVVCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gMzgpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfU0VBUkNIX1JFU1VMVFNfR1JPVVApLmNoaWxkcmVuKCkubGFzdCgpLmZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gNDApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfU0VBUkNIX1JFU1VMVFNfR1JPVVApLmNoaWxkcmVuKCkuZmlyc3QoKS5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB0aW1lciA9IDA7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgU2lkZWJhclNlYXJjaC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0RBVEFfV0lER0VUJDEpLCAnc2VhcmNoJyk7XG4gICAgfSwgMTAwKTtcbiAgfSk7XG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub24oJ2tleWRvd24nLCBTRUxFQ1RPUl9TRUFSQ0hfUkVTVUxUU19HUk9VUCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyICRmb2N1c2VkID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKCc6Zm9jdXMnKTtcblxuICAgIGlmIChldmVudC5rZXlDb2RlID09IDM4KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBpZiAoJGZvY3VzZWQuaXMoJzpmaXJzdC1jaGlsZCcpKSB7XG4gICAgICAgICRmb2N1c2VkLnNpYmxpbmdzKCkubGFzdCgpLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkZm9jdXNlZC5wcmV2KCkuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSA0MCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKCRmb2N1c2VkLmlzKCc6bGFzdC1jaGlsZCcpKSB7XG4gICAgICAgICRmb2N1c2VkLnNpYmxpbmdzKCkuZmlyc3QoKS5mb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJGZvY3VzZWQubmV4dCgpLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgU2lkZWJhclNlYXJjaC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0RBVEFfV0lER0VUJDEpLCAnaW5pdCcpO1xuICB9KTtcbiAgLyoqXG4gICAqIGpRdWVyeSBBUElcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRhXSA9IFNpZGViYXJTZWFyY2guX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkYV0uQ29uc3RydWN0b3IgPSBTaWRlYmFyU2VhcmNoO1xuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJGFdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkYV0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkYTtcbiAgICByZXR1cm4gU2lkZWJhclNlYXJjaC5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBBZG1pbkxURSBUb2FzdHMuanNcbiAgICogTGljZW5zZSBNSVRcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG4gIC8qKlxuICAgKiBDb25zdGFudHNcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuICB2YXIgTkFNRSRiID0gJ1RvYXN0cyc7XG4gIHZhciBEQVRBX0tFWSRiID0gJ2x0ZS50b2FzdHMnO1xuICB2YXIgRVZFTlRfS0VZJDYgPSBcIi5cIiArIERBVEFfS0VZJGI7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkYiA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJGJdO1xuICB2YXIgRVZFTlRfSU5JVCA9IFwiaW5pdFwiICsgRVZFTlRfS0VZJDY7XG4gIHZhciBFVkVOVF9DUkVBVEVEID0gXCJjcmVhdGVkXCIgKyBFVkVOVF9LRVkkNjtcbiAgdmFyIEVWRU5UX1JFTU9WRUQkMSA9IFwicmVtb3ZlZFwiICsgRVZFTlRfS0VZJDY7XG4gIHZhciBTRUxFQ1RPUl9DT05UQUlORVJfVE9QX1JJR0hUID0gJyN0b2FzdHNDb250YWluZXJUb3BSaWdodCc7XG4gIHZhciBTRUxFQ1RPUl9DT05UQUlORVJfVE9QX0xFRlQgPSAnI3RvYXN0c0NvbnRhaW5lclRvcExlZnQnO1xuICB2YXIgU0VMRUNUT1JfQ09OVEFJTkVSX0JPVFRPTV9SSUdIVCA9ICcjdG9hc3RzQ29udGFpbmVyQm90dG9tUmlnaHQnO1xuICB2YXIgU0VMRUNUT1JfQ09OVEFJTkVSX0JPVFRPTV9MRUZUID0gJyN0b2FzdHNDb250YWluZXJCb3R0b21MZWZ0JztcbiAgdmFyIENMQVNTX05BTUVfVE9QX1JJR0hUID0gJ3RvYXN0cy10b3AtcmlnaHQnO1xuICB2YXIgQ0xBU1NfTkFNRV9UT1BfTEVGVCA9ICd0b2FzdHMtdG9wLWxlZnQnO1xuICB2YXIgQ0xBU1NfTkFNRV9CT1RUT01fUklHSFQgPSAndG9hc3RzLWJvdHRvbS1yaWdodCc7XG4gIHZhciBDTEFTU19OQU1FX0JPVFRPTV9MRUZUID0gJ3RvYXN0cy1ib3R0b20tbGVmdCc7XG4gIHZhciBQT1NJVElPTl9UT1BfUklHSFQgPSAndG9wUmlnaHQnO1xuICB2YXIgUE9TSVRJT05fVE9QX0xFRlQgPSAndG9wTGVmdCc7XG4gIHZhciBQT1NJVElPTl9CT1RUT01fUklHSFQgPSAnYm90dG9tUmlnaHQnO1xuICB2YXIgUE9TSVRJT05fQk9UVE9NX0xFRlQgPSAnYm90dG9tTGVmdCc7XG4gIHZhciBEZWZhdWx0JDkgPSB7XG4gICAgcG9zaXRpb246IFBPU0lUSU9OX1RPUF9SSUdIVCxcbiAgICBmaXhlZDogdHJ1ZSxcbiAgICBhdXRvaGlkZTogZmFsc2UsXG4gICAgYXV0b3JlbW92ZTogdHJ1ZSxcbiAgICBkZWxheTogMTAwMCxcbiAgICBmYWRlOiB0cnVlLFxuICAgIGljb246IG51bGwsXG4gICAgaW1hZ2U6IG51bGwsXG4gICAgaW1hZ2VBbHQ6IG51bGwsXG4gICAgaW1hZ2VIZWlnaHQ6ICcyNXB4JyxcbiAgICB0aXRsZTogbnVsbCxcbiAgICBzdWJ0aXRsZTogbnVsbCxcbiAgICBjbG9zZTogdHJ1ZSxcbiAgICBib2R5OiBudWxsLFxuICAgIGNsYXNzOiBudWxsXG4gIH07XG4gIC8qKlxuICAgKiBDbGFzcyBEZWZpbml0aW9uXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICovXG5cbiAgdmFyIFRvYXN0cyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVG9hc3RzKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuXG4gICAgICB0aGlzLl9wcmVwYXJlQ29udGFpbmVyKCk7XG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnYm9keScpLnRyaWdnZXIoJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX0lOSVQpKTtcbiAgICB9IC8vIFB1YmxpY1xuXG5cbiAgICB2YXIgX3Byb3RvID0gVG9hc3RzLnByb3RvdHlwZTtcblxuICAgIF9wcm90by5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgdG9hc3QgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oJzxkaXYgY2xhc3M9XCJ0b2FzdFwiIHJvbGU9XCJhbGVydFwiIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiIGFyaWEtYXRvbWljPVwidHJ1ZVwiLz4nKTtcbiAgICAgIHRvYXN0LmRhdGEoJ2F1dG9oaWRlJywgdGhpcy5fY29uZmlnLmF1dG9oaWRlKTtcbiAgICAgIHRvYXN0LmRhdGEoJ2FuaW1hdGlvbicsIHRoaXMuX2NvbmZpZy5mYWRlKTtcblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5jbGFzcykge1xuICAgICAgICB0b2FzdC5hZGRDbGFzcyh0aGlzLl9jb25maWcuY2xhc3MpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmRlbGF5ICYmIHRoaXMuX2NvbmZpZy5kZWxheSAhPSA1MDApIHtcbiAgICAgICAgdG9hc3QuZGF0YSgnZGVsYXknLCB0aGlzLl9jb25maWcuZGVsYXkpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdG9hc3RIZWFkZXIgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oJzxkaXYgY2xhc3M9XCJ0b2FzdC1oZWFkZXJcIj4nKTtcblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5pbWFnZSAhPSBudWxsKSB7XG4gICAgICAgIHZhciB0b2FzdEltYWdlID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKCc8aW1nIC8+JykuYWRkQ2xhc3MoJ3JvdW5kZWQgbXItMicpLmF0dHIoJ3NyYycsIHRoaXMuX2NvbmZpZy5pbWFnZSkuYXR0cignYWx0JywgdGhpcy5fY29uZmlnLmltYWdlQWx0KTtcblxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmltYWdlSGVpZ2h0ICE9IG51bGwpIHtcbiAgICAgICAgICB0b2FzdEltYWdlLmhlaWdodCh0aGlzLl9jb25maWcuaW1hZ2VIZWlnaHQpLndpZHRoKCdhdXRvJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0b2FzdEhlYWRlci5hcHBlbmQodG9hc3RJbWFnZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcuaWNvbiAhPSBudWxsKSB7XG4gICAgICAgIHRvYXN0SGVhZGVyLmFwcGVuZCgkX19kZWZhdWx0WydkZWZhdWx0J10oJzxpIC8+JykuYWRkQ2xhc3MoJ21yLTInKS5hZGRDbGFzcyh0aGlzLl9jb25maWcuaWNvbikpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLnRpdGxlICE9IG51bGwpIHtcbiAgICAgICAgdG9hc3RIZWFkZXIuYXBwZW5kKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnPHN0cm9uZyAvPicpLmFkZENsYXNzKCdtci1hdXRvJykuaHRtbCh0aGlzLl9jb25maWcudGl0bGUpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5zdWJ0aXRsZSAhPSBudWxsKSB7XG4gICAgICAgIHRvYXN0SGVhZGVyLmFwcGVuZCgkX19kZWZhdWx0WydkZWZhdWx0J10oJzxzbWFsbCAvPicpLmh0bWwodGhpcy5fY29uZmlnLnN1YnRpdGxlKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcuY2xvc2UgPT0gdHJ1ZSkge1xuICAgICAgICB2YXIgdG9hc3RDbG9zZSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnPGJ1dHRvbiBkYXRhLWRpc21pc3M9XCJ0b2FzdFwiIC8+JykuYXR0cigndHlwZScsICdidXR0b24nKS5hZGRDbGFzcygnbWwtMiBtYi0xIGNsb3NlJykuYXR0cignYXJpYS1sYWJlbCcsICdDbG9zZScpLmFwcGVuZCgnPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj4nKTtcblxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLnRpdGxlID09IG51bGwpIHtcbiAgICAgICAgICB0b2FzdENsb3NlLnRvZ2dsZUNsYXNzKCdtbC0yIG1sLWF1dG8nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRvYXN0SGVhZGVyLmFwcGVuZCh0b2FzdENsb3NlKTtcbiAgICAgIH1cblxuICAgICAgdG9hc3QuYXBwZW5kKHRvYXN0SGVhZGVyKTtcblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5ib2R5ICE9IG51bGwpIHtcbiAgICAgICAgdG9hc3QuYXBwZW5kKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnPGRpdiBjbGFzcz1cInRvYXN0LWJvZHlcIiAvPicpLmh0bWwodGhpcy5fY29uZmlnLmJvZHkpKTtcbiAgICAgIH1cblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2dldENvbnRhaW5lcklkKCkpLnByZXBlbmQodG9hc3QpO1xuICAgICAgdmFyICRib2R5ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdib2R5Jyk7XG4gICAgICAkYm9keS50cmlnZ2VyKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9DUkVBVEVEKSk7XG4gICAgICB0b2FzdC50b2FzdCgnc2hvdycpO1xuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmF1dG9yZW1vdmUpIHtcbiAgICAgICAgdG9hc3Qub24oJ2hpZGRlbi5icy50b2FzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGVsYXkoMjAwKS5yZW1vdmUoKTtcbiAgICAgICAgICAkYm9keS50cmlnZ2VyKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9SRU1PVkVEJDEpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSAvLyBTdGF0aWNcbiAgICA7XG5cbiAgICBfcHJvdG8uX2dldENvbnRhaW5lcklkID0gZnVuY3Rpb24gX2dldENvbnRhaW5lcklkKCkge1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5wb3NpdGlvbiA9PSBQT1NJVElPTl9UT1BfUklHSFQpIHtcbiAgICAgICAgcmV0dXJuIFNFTEVDVE9SX0NPTlRBSU5FUl9UT1BfUklHSFQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcucG9zaXRpb24gPT0gUE9TSVRJT05fVE9QX0xFRlQpIHtcbiAgICAgICAgcmV0dXJuIFNFTEVDVE9SX0NPTlRBSU5FUl9UT1BfTEVGVDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5wb3NpdGlvbiA9PSBQT1NJVElPTl9CT1RUT01fUklHSFQpIHtcbiAgICAgICAgcmV0dXJuIFNFTEVDVE9SX0NPTlRBSU5FUl9CT1RUT01fUklHSFQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcucG9zaXRpb24gPT0gUE9TSVRJT05fQk9UVE9NX0xFRlQpIHtcbiAgICAgICAgcmV0dXJuIFNFTEVDVE9SX0NPTlRBSU5FUl9CT1RUT01fTEVGVDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9wcmVwYXJlQ29udGFpbmVyID0gZnVuY3Rpb24gX3ByZXBhcmVDb250YWluZXIoKSB7XG4gICAgICBpZiAoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2dldENvbnRhaW5lcklkKCkpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKCc8ZGl2IC8+JykuYXR0cignaWQnLCB0aGlzLl9nZXRDb250YWluZXJJZCgpLnJlcGxhY2UoJyMnLCAnJykpO1xuXG4gICAgICAgIGlmICh0aGlzLl9jb25maWcucG9zaXRpb24gPT0gUE9TSVRJT05fVE9QX1JJR0hUKSB7XG4gICAgICAgICAgY29udGFpbmVyLmFkZENsYXNzKENMQVNTX05BTUVfVE9QX1JJR0hUKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jb25maWcucG9zaXRpb24gPT0gUE9TSVRJT05fVE9QX0xFRlQpIHtcbiAgICAgICAgICBjb250YWluZXIuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9UT1BfTEVGVCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY29uZmlnLnBvc2l0aW9uID09IFBPU0lUSU9OX0JPVFRPTV9SSUdIVCkge1xuICAgICAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyhDTEFTU19OQU1FX0JPVFRPTV9SSUdIVCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY29uZmlnLnBvc2l0aW9uID09IFBPU0lUSU9OX0JPVFRPTV9MRUZUKSB7XG4gICAgICAgICAgY29udGFpbmVyLmFkZENsYXNzKENMQVNTX05BTUVfQk9UVE9NX0xFRlQpO1xuICAgICAgICB9XG5cbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdib2R5JykuYXBwZW5kKGNvbnRhaW5lcik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcuZml4ZWQpIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2dldENvbnRhaW5lcklkKCkpLmFkZENsYXNzKCdmaXhlZCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2dldENvbnRhaW5lcklkKCkpLnJlbW92ZUNsYXNzKCdmaXhlZCcpO1xuICAgICAgfVxuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgVG9hc3RzLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKG9wdGlvbiwgY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9vcHRpb25zID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmV4dGVuZCh7fSwgRGVmYXVsdCQ5LCBjb25maWcpO1xuXG4gICAgICAgIHZhciB0b2FzdCA9IG5ldyBUb2FzdHMoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCBfb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbiA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgICAgICB0b2FzdFtvcHRpb25dKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gVG9hc3RzO1xuICB9KCk7XG4gIC8qKlxuICAgKiBqUXVlcnkgQVBJXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICovXG5cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRiXSA9IFRvYXN0cy5falF1ZXJ5SW50ZXJmYWNlO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRiXS5Db25zdHJ1Y3RvciA9IFRvYXN0cztcblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRiXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJGJdID0gSlFVRVJZX05PX0NPTkZMSUNUJGI7XG4gICAgcmV0dXJuIFRvYXN0cy5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBBZG1pbkxURSBUb2RvTGlzdC5qc1xuICAgKiBMaWNlbnNlIE1JVFxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG4gIHZhciBOQU1FJGMgPSAnVG9kb0xpc3QnO1xuICB2YXIgREFUQV9LRVkkYyA9ICdsdGUudG9kb2xpc3QnO1xuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJGMgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRjXTtcbiAgdmFyIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDQgPSAnW2RhdGEtd2lkZ2V0PVwidG9kby1saXN0XCJdJztcbiAgdmFyIENMQVNTX05BTUVfVE9ET19MSVNUX0RPTkUgPSAnZG9uZSc7XG4gIHZhciBEZWZhdWx0JGEgPSB7XG4gICAgb25DaGVjazogZnVuY3Rpb24gb25DaGVjayhpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9LFxuICAgIG9uVW5DaGVjazogZnVuY3Rpb24gb25VbkNoZWNrKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuICB2YXIgVG9kb0xpc3QgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRvZG9MaXN0KGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAgIHRoaXMuX2luaXQoKTtcbiAgICB9IC8vIFB1YmxpY1xuXG5cbiAgICB2YXIgX3Byb3RvID0gVG9kb0xpc3QucHJvdG90eXBlO1xuXG4gICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZShpdGVtKSB7XG4gICAgICBpdGVtLnBhcmVudHMoJ2xpJykudG9nZ2xlQ2xhc3MoQ0xBU1NfTkFNRV9UT0RPX0xJU1RfRE9ORSk7XG5cbiAgICAgIGlmICghJF9fZGVmYXVsdFsnZGVmYXVsdCddKGl0ZW0pLnByb3AoJ2NoZWNrZWQnKSkge1xuICAgICAgICB0aGlzLnVuQ2hlY2soJF9fZGVmYXVsdFsnZGVmYXVsdCddKGl0ZW0pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNoZWNrKGl0ZW0pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uY2hlY2sgPSBmdW5jdGlvbiBjaGVjayhpdGVtKSB7XG4gICAgICB0aGlzLl9jb25maWcub25DaGVjay5jYWxsKGl0ZW0pO1xuICAgIH07XG5cbiAgICBfcHJvdG8udW5DaGVjayA9IGZ1bmN0aW9uIHVuQ2hlY2soaXRlbSkge1xuICAgICAgdGhpcy5fY29uZmlnLm9uVW5DaGVjay5jYWxsKGl0ZW0pO1xuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5faW5pdCA9IGZ1bmN0aW9uIF9pbml0KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyICR0b2dnbGVTZWxlY3RvciA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgICAkdG9nZ2xlU2VsZWN0b3IuZmluZCgnaW5wdXQ6Y2hlY2tib3g6Y2hlY2tlZCcpLnBhcmVudHMoJ2xpJykudG9nZ2xlQ2xhc3MoQ0xBU1NfTkFNRV9UT0RPX0xJU1RfRE9ORSk7XG4gICAgICAkdG9nZ2xlU2VsZWN0b3Iub24oJ2NoYW5nZScsICdpbnB1dDpjaGVja2JveCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBfdGhpcy50b2dnbGUoJF9fZGVmYXVsdFsnZGVmYXVsdCddKGV2ZW50LnRhcmdldCkpO1xuICAgICAgfSk7XG4gICAgfSAvLyBTdGF0aWNcbiAgICA7XG5cbiAgICBUb2RvTGlzdC5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGF0YSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJGMpO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9vcHRpb25zID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmV4dGVuZCh7fSwgRGVmYXVsdCRhLCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IGRhdGEpO1xuXG4gICAgICAgIHZhciBwbHVnaW4gPSBuZXcgVG9kb0xpc3QoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCBfb3B0aW9ucyk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJGMsIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDogZGF0YSk7XG5cbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gJ2luaXQnKSB7XG4gICAgICAgICAgcGx1Z2luW2NvbmZpZ10oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBUb2RvTGlzdDtcbiAgfSgpO1xuICAvKipcbiAgICogRGF0YSBBUElcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh3aW5kb3cpLm9uKCdsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgIFRvZG9MaXN0Ll9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfREFUQV9UT0dHTEUkNCkpO1xuICB9KTtcbiAgLyoqXG4gICAqIGpRdWVyeSBBUElcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRjXSA9IFRvZG9MaXN0Ll9qUXVlcnlJbnRlcmZhY2U7XG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJGNdLkNvbnN0cnVjdG9yID0gVG9kb0xpc3Q7XG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkY10ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRjXSA9IEpRVUVSWV9OT19DT05GTElDVCRjO1xuICAgIHJldHVybiBUb2RvTGlzdC5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBBZG1pbkxURSBUcmVldmlldy5qc1xuICAgKiBMaWNlbnNlIE1JVFxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuXG4gIHZhciBOQU1FJGQgPSAnVHJlZXZpZXcnO1xuICB2YXIgREFUQV9LRVkkZCA9ICdsdGUudHJlZXZpZXcnO1xuICB2YXIgRVZFTlRfS0VZJDcgPSBcIi5cIiArIERBVEFfS0VZJGQ7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkZCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJGRdO1xuICB2YXIgRVZFTlRfRVhQQU5ERUQkMyA9IFwiZXhwYW5kZWRcIiArIEVWRU5UX0tFWSQ3O1xuICB2YXIgRVZFTlRfQ09MTEFQU0VEJDQgPSBcImNvbGxhcHNlZFwiICsgRVZFTlRfS0VZJDc7XG4gIHZhciBFVkVOVF9MT0FEX0RBVEFfQVBJID0gXCJsb2FkXCIgKyBFVkVOVF9LRVkkNztcbiAgdmFyIFNFTEVDVE9SX0xJID0gJy5uYXYtaXRlbSc7XG4gIHZhciBTRUxFQ1RPUl9MSU5LID0gJy5uYXYtbGluayc7XG4gIHZhciBTRUxFQ1RPUl9UUkVFVklFV19NRU5VID0gJy5uYXYtdHJlZXZpZXcnO1xuICB2YXIgU0VMRUNUT1JfT1BFTiA9ICcubWVudS1vcGVuJztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfV0lER0VUJDIgPSAnW2RhdGEtd2lkZ2V0PVwidHJlZXZpZXdcIl0nO1xuICB2YXIgQ0xBU1NfTkFNRV9PUEVOJDIgPSAnbWVudS1vcGVuJztcbiAgdmFyIENMQVNTX05BTUVfSVNfT1BFTklORyQxID0gJ21lbnUtaXMtb3BlbmluZyc7XG4gIHZhciBDTEFTU19OQU1FX1NJREVCQVJfQ09MTEFQU0VEID0gJ3NpZGViYXItY29sbGFwc2UnO1xuICB2YXIgRGVmYXVsdCRiID0ge1xuICAgIHRyaWdnZXI6IFNFTEVDVE9SX0RBVEFfV0lER0VUJDIgKyBcIiBcIiArIFNFTEVDVE9SX0xJTkssXG4gICAgYW5pbWF0aW9uU3BlZWQ6IDMwMCxcbiAgICBhY2NvcmRpb246IHRydWUsXG4gICAgZXhwYW5kU2lkZWJhcjogZmFsc2UsXG4gICAgc2lkZWJhckJ1dHRvblNlbGVjdG9yOiAnW2RhdGEtd2lkZ2V0PVwicHVzaG1lbnVcIl0nXG4gIH07XG4gIC8qKlxuICAgKiBDbGFzcyBEZWZpbml0aW9uXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICovXG5cbiAgdmFyIFRyZWV2aWV3ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUcmVldmlldyhlbGVtZW50LCBjb25maWcpIHtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIH0gLy8gUHVibGljXG5cblxuICAgIHZhciBfcHJvdG8gPSBUcmVldmlldy5wcm90b3R5cGU7XG5cbiAgICBfcHJvdG8uaW5pdCA9IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oXCJcIiArIFNFTEVDVE9SX0xJICsgU0VMRUNUT1JfT1BFTiArIFwiIFwiICsgU0VMRUNUT1JfVFJFRVZJRVdfTUVOVSkuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7XG5cbiAgICAgIHRoaXMuX3NldHVwTGlzdGVuZXJzKCk7XG4gICAgfTtcblxuICAgIF9wcm90by5leHBhbmQgPSBmdW5jdGlvbiBleHBhbmQodHJlZXZpZXdNZW51LCBwYXJlbnRMaSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGV4cGFuZGVkRXZlbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfRVhQQU5ERUQkMyk7XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcuYWNjb3JkaW9uKSB7XG4gICAgICAgIHZhciBvcGVuTWVudUxpID0gcGFyZW50TGkuc2libGluZ3MoU0VMRUNUT1JfT1BFTikuZmlyc3QoKTtcbiAgICAgICAgdmFyIG9wZW5UcmVldmlldyA9IG9wZW5NZW51TGkuZmluZChTRUxFQ1RPUl9UUkVFVklFV19NRU5VKS5maXJzdCgpO1xuICAgICAgICB0aGlzLmNvbGxhcHNlKG9wZW5UcmVldmlldywgb3Blbk1lbnVMaSk7XG4gICAgICB9XG5cbiAgICAgIHBhcmVudExpLmFkZENsYXNzKENMQVNTX05BTUVfSVNfT1BFTklORyQxKTtcbiAgICAgIHRyZWV2aWV3TWVudS5zdG9wKCkuc2xpZGVEb3duKHRoaXMuX2NvbmZpZy5hbmltYXRpb25TcGVlZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBwYXJlbnRMaS5hZGRDbGFzcyhDTEFTU19OQU1FX09QRU4kMik7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShfdGhpcy5fZWxlbWVudCkudHJpZ2dlcihleHBhbmRlZEV2ZW50KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmV4cGFuZFNpZGViYXIpIHtcbiAgICAgICAgdGhpcy5fZXhwYW5kU2lkZWJhcigpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uY29sbGFwc2UgPSBmdW5jdGlvbiBjb2xsYXBzZSh0cmVldmlld01lbnUsIHBhcmVudExpKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGNvbGxhcHNlZEV2ZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX0NPTExBUFNFRCQ0KTtcbiAgICAgIHBhcmVudExpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfSVNfT1BFTklORyQxICsgXCIgXCIgKyBDTEFTU19OQU1FX09QRU4kMik7XG4gICAgICB0cmVldmlld01lbnUuc3RvcCgpLnNsaWRlVXAodGhpcy5fY29uZmlnLmFuaW1hdGlvblNwZWVkLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShfdGhpczIuX2VsZW1lbnQpLnRyaWdnZXIoY29sbGFwc2VkRXZlbnQpO1xuICAgICAgICB0cmVldmlld01lbnUuZmluZChTRUxFQ1RPUl9PUEVOICsgXCIgPiBcIiArIFNFTEVDVE9SX1RSRUVWSUVXX01FTlUpLnNsaWRlVXAoKTtcbiAgICAgICAgdHJlZXZpZXdNZW51LmZpbmQoU0VMRUNUT1JfT1BFTikucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9PUEVOJDIpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by50b2dnbGUgPSBmdW5jdGlvbiB0b2dnbGUoZXZlbnQpIHtcbiAgICAgIHZhciAkcmVsYXRpdmVUYXJnZXQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgICB2YXIgJHBhcmVudCA9ICRyZWxhdGl2ZVRhcmdldC5wYXJlbnQoKTtcbiAgICAgIHZhciB0cmVldmlld01lbnUgPSAkcGFyZW50LmZpbmQoXCI+IFwiICsgU0VMRUNUT1JfVFJFRVZJRVdfTUVOVSk7XG5cbiAgICAgIGlmICghdHJlZXZpZXdNZW51LmlzKFNFTEVDVE9SX1RSRUVWSUVXX01FTlUpKSB7XG4gICAgICAgIGlmICghJHBhcmVudC5pcyhTRUxFQ1RPUl9MSSkpIHtcbiAgICAgICAgICB0cmVldmlld01lbnUgPSAkcGFyZW50LnBhcmVudCgpLmZpbmQoXCI+IFwiICsgU0VMRUNUT1JfVFJFRVZJRVdfTUVOVSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRyZWV2aWV3TWVudS5pcyhTRUxFQ1RPUl9UUkVFVklFV19NRU5VKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdmFyIHBhcmVudExpID0gJHJlbGF0aXZlVGFyZ2V0LnBhcmVudHMoU0VMRUNUT1JfTEkpLmZpcnN0KCk7XG4gICAgICB2YXIgaXNPcGVuID0gcGFyZW50TGkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9PUEVOJDIpO1xuXG4gICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgIHRoaXMuY29sbGFwc2UoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRyZWV2aWV3TWVudSksIHBhcmVudExpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXhwYW5kKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0cmVldmlld01lbnUpLCBwYXJlbnRMaSk7XG4gICAgICB9XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9zZXR1cExpc3RlbmVycyA9IGZ1bmN0aW9uIF9zZXR1cExpc3RlbmVycygpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgZWxlbWVudElkID0gdGhpcy5fZWxlbWVudC5hdHRyKCdpZCcpICE9PSB1bmRlZmluZWQgPyBcIiNcIiArIHRoaXMuX2VsZW1lbnQuYXR0cignaWQnKSA6ICcnO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbignY2xpY2snLCBcIlwiICsgZWxlbWVudElkICsgdGhpcy5fY29uZmlnLnRyaWdnZXIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBfdGhpczMudG9nZ2xlKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2V4cGFuZFNpZGViYXIgPSBmdW5jdGlvbiBfZXhwYW5kU2lkZWJhcigpIHtcbiAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10oJ2JvZHknKS5oYXNDbGFzcyhDTEFTU19OQU1FX1NJREVCQVJfQ09MTEFQU0VEKSkge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fY29uZmlnLnNpZGViYXJCdXR0b25TZWxlY3RvcikuUHVzaE1lbnUoJ2V4cGFuZCcpO1xuICAgICAgfVxuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgVHJlZXZpZXcuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSRkKTtcblxuICAgICAgICB2YXIgX29wdGlvbnMgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZXh0ZW5kKHt9LCBEZWZhdWx0JGIsICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKCkpO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgVHJlZXZpZXcoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCBfb3B0aW9ucyk7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkZCwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnID09PSAnaW5pdCcpIHtcbiAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBUcmVldmlldztcbiAgfSgpO1xuICAvKipcbiAgICogRGF0YSBBUElcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh3aW5kb3cpLm9uKEVWRU5UX0xPQURfREFUQV9BUEksIGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfREFUQV9XSURHRVQkMikuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBUcmVldmlldy5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCAnaW5pdCcpO1xuICAgIH0pO1xuICB9KTtcbiAgLyoqXG4gICAqIGpRdWVyeSBBUElcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRkXSA9IFRyZWV2aWV3Ll9qUXVlcnlJbnRlcmZhY2U7XG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJGRdLkNvbnN0cnVjdG9yID0gVHJlZXZpZXc7XG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkZF0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRkXSA9IEpRVUVSWV9OT19DT05GTElDVCRkO1xuICAgIHJldHVybiBUcmVldmlldy5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIGV4cG9ydHMuQ2FyZFJlZnJlc2ggPSBDYXJkUmVmcmVzaDtcbiAgZXhwb3J0cy5DYXJkV2lkZ2V0ID0gQ2FyZFdpZGdldDtcbiAgZXhwb3J0cy5Db250cm9sU2lkZWJhciA9IENvbnRyb2xTaWRlYmFyO1xuICBleHBvcnRzLkRpcmVjdENoYXQgPSBEaXJlY3RDaGF0O1xuICBleHBvcnRzLkRyb3Bkb3duID0gRHJvcGRvd247XG4gIGV4cG9ydHMuRXhwYW5kYWJsZVRhYmxlID0gRXhwYW5kYWJsZVRhYmxlO1xuICBleHBvcnRzLkZ1bGxzY3JlZW4gPSBGdWxsc2NyZWVuO1xuICBleHBvcnRzLklGcmFtZSA9IElGcmFtZTtcbiAgZXhwb3J0cy5MYXlvdXQgPSBMYXlvdXQ7XG4gIGV4cG9ydHMuUHVzaE1lbnUgPSBQdXNoTWVudTtcbiAgZXhwb3J0cy5TaWRlYmFyU2VhcmNoID0gU2lkZWJhclNlYXJjaDtcbiAgZXhwb3J0cy5Ub2FzdHMgPSBUb2FzdHM7XG4gIGV4cG9ydHMuVG9kb0xpc3QgPSBUb2RvTGlzdDtcbiAgZXhwb3J0cy5UcmVldmlldyA9IFRyZWV2aWV3O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZG1pbmx0ZS5qcy5tYXBcbiJdLCJuYW1lcyI6WyJnbG9iYWwiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsInJlcXVpcmUiLCJkZWZpbmUiLCJhbWQiLCJnbG9iYWxUaGlzIiwic2VsZiIsImFkbWlubHRlIiwialF1ZXJ5IiwiJCIsIl9pbnRlcm9wRGVmYXVsdExlZ2FjeSIsImUiLCIkX19kZWZhdWx0IiwiTkFNRSIsIkRBVEFfS0VZIiwiRVZFTlRfS0VZIiwiSlFVRVJZX05PX0NPTkZMSUNUIiwiZm4iLCJFVkVOVF9MT0FERUQiLCJFVkVOVF9PVkVSTEFZX0FEREVEIiwiRVZFTlRfT1ZFUkxBWV9SRU1PVkVEIiwiQ0xBU1NfTkFNRV9DQVJEIiwiU0VMRUNUT1JfQ0FSRCIsIlNFTEVDVE9SX0RBVEFfUkVGUkVTSCIsIkRlZmF1bHQiLCJzb3VyY2UiLCJzb3VyY2VTZWxlY3RvciIsInBhcmFtcyIsInRyaWdnZXIiLCJjb250ZW50IiwibG9hZEluQ29udGVudCIsImxvYWRPbkluaXQiLCJyZXNwb25zZVR5cGUiLCJvdmVybGF5VGVtcGxhdGUiLCJvbkxvYWRTdGFydCIsIm9uTG9hZERvbmUiLCJyZXNwb25zZSIsIkNhcmRSZWZyZXNoIiwiZWxlbWVudCIsInNldHRpbmdzIiwiX2VsZW1lbnQiLCJfcGFyZW50IiwicGFyZW50cyIsImZpcnN0IiwiX3NldHRpbmdzIiwiZXh0ZW5kIiwiX292ZXJsYXkiLCJoYXNDbGFzcyIsIkVycm9yIiwiX3Byb3RvIiwicHJvdG90eXBlIiwibG9hZCIsIl90aGlzIiwiX2FkZE92ZXJsYXkiLCJjYWxsIiwiZ2V0IiwiZmluZCIsImh0bWwiLCJfcmVtb3ZlT3ZlcmxheSIsIkV2ZW50IiwiYXBwZW5kIiwicmVtb3ZlIiwiX2luaXQiLCJfdGhpczIiLCJvbiIsIl9qUXVlcnlJbnRlcmZhY2UiLCJjb25maWciLCJkYXRhIiwiX29wdGlvbnMiLCJtYXRjaCIsImRvY3VtZW50IiwiZXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsImVhY2giLCJDb25zdHJ1Y3RvciIsIm5vQ29uZmxpY3QiLCJOQU1FJDEiLCJEQVRBX0tFWSQxIiwiRVZFTlRfS0VZJDEiLCJKUVVFUllfTk9fQ09ORkxJQ1QkMSIsIkVWRU5UX0VYUEFOREVEIiwiRVZFTlRfQ09MTEFQU0VEIiwiRVZFTlRfTUFYSU1JWkVEIiwiRVZFTlRfTUlOSU1JWkVEIiwiRVZFTlRfUkVNT1ZFRCIsIkNMQVNTX05BTUVfQ0FSRCQxIiwiQ0xBU1NfTkFNRV9DT0xMQVBTRUQiLCJDTEFTU19OQU1FX0NPTExBUFNJTkciLCJDTEFTU19OQU1FX0VYUEFORElORyIsIkNMQVNTX05BTUVfV0FTX0NPTExBUFNFRCIsIkNMQVNTX05BTUVfTUFYSU1JWkVEIiwiU0VMRUNUT1JfREFUQV9SRU1PVkUiLCJTRUxFQ1RPUl9EQVRBX0NPTExBUFNFIiwiU0VMRUNUT1JfREFUQV9NQVhJTUlaRSIsIlNFTEVDVE9SX0NBUkQkMSIsIlNFTEVDVE9SX0NBUkRfSEVBREVSIiwiU0VMRUNUT1JfQ0FSRF9CT0RZIiwiU0VMRUNUT1JfQ0FSRF9GT09URVIiLCJEZWZhdWx0JDEiLCJhbmltYXRpb25TcGVlZCIsImNvbGxhcHNlVHJpZ2dlciIsInJlbW92ZVRyaWdnZXIiLCJtYXhpbWl6ZVRyaWdnZXIiLCJjb2xsYXBzZUljb24iLCJleHBhbmRJY29uIiwibWF4aW1pemVJY29uIiwibWluaW1pemVJY29uIiwiQ2FyZFdpZGdldCIsImNvbGxhcHNlIiwiYWRkQ2xhc3MiLCJjaGlsZHJlbiIsInNsaWRlVXAiLCJyZW1vdmVDbGFzcyIsImV4cGFuZCIsInNsaWRlRG93biIsInRvZ2dsZSIsIm1heGltaXplIiwiY3NzIiwiaGVpZ2h0Iiwid2lkdGgiLCJ0cmFuc2l0aW9uIiwiZGVsYXkiLCJxdWV1ZSIsIiRlbGVtZW50IiwiZGVxdWV1ZSIsIm1pbmltaXplIiwic3R5bGUiLCJ0b2dnbGVNYXhpbWl6ZSIsImNhcmQiLCJfdGhpczMiLCJjbGljayIsIk5BTUUkMiIsIkRBVEFfS0VZJDIiLCJFVkVOVF9LRVkkMiIsIkpRVUVSWV9OT19DT05GTElDVCQyIiwiRVZFTlRfQ09MTEFQU0VEJDEiLCJFVkVOVF9FWFBBTkRFRCQxIiwiU0VMRUNUT1JfQ09OVFJPTF9TSURFQkFSIiwiU0VMRUNUT1JfQ09OVFJPTF9TSURFQkFSX0NPTlRFTlQiLCJTRUxFQ1RPUl9EQVRBX1RPR0dMRSIsIlNFTEVDVE9SX0hFQURFUiIsIlNFTEVDVE9SX0ZPT1RFUiIsIkNMQVNTX05BTUVfQ09OVFJPTF9TSURFQkFSX0FOSU1BVEUiLCJDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9PUEVOIiwiQ0xBU1NfTkFNRV9DT05UUk9MX1NJREVCQVJfU0xJREUiLCJDTEFTU19OQU1FX0xBWU9VVF9GSVhFRCIsIkNMQVNTX05BTUVfTkFWQkFSX0ZJWEVEIiwiQ0xBU1NfTkFNRV9OQVZCQVJfU01fRklYRUQiLCJDTEFTU19OQU1FX05BVkJBUl9NRF9GSVhFRCIsIkNMQVNTX05BTUVfTkFWQkFSX0xHX0ZJWEVEIiwiQ0xBU1NfTkFNRV9OQVZCQVJfWExfRklYRUQiLCJDTEFTU19OQU1FX0ZPT1RFUl9GSVhFRCIsIkNMQVNTX05BTUVfRk9PVEVSX1NNX0ZJWEVEIiwiQ0xBU1NfTkFNRV9GT09URVJfTURfRklYRUQiLCJDTEFTU19OQU1FX0ZPT1RFUl9MR19GSVhFRCIsIkNMQVNTX05BTUVfRk9PVEVSX1hMX0ZJWEVEIiwiRGVmYXVsdCQyIiwiY29udHJvbHNpZGViYXJTbGlkZSIsInNjcm9sbGJhclRoZW1lIiwic2Nyb2xsYmFyQXV0b0hpZGUiLCJDb250cm9sU2lkZWJhciIsIl9jb25maWciLCIkYm9keSIsIiRodG1sIiwiaGlkZSIsInNob3ciLCJfZml4SGVpZ2h0IiwiX2ZpeFNjcm9sbEhlaWdodCIsInNob3VsZENsb3NlIiwid2luZG93IiwicmVzaXplIiwic2Nyb2xsIiwic2hvdWxkRml4SGVpZ2h0IiwiaGVpZ2h0cyIsImhlYWRlciIsIm91dGVySGVpZ2h0IiwiZm9vdGVyIiwicG9zaXRpb25zIiwiYm90dG9tIiwiTWF0aCIsImFicyIsInNjcm9sbFRvcCIsInRvcCIsIm5hdmJhckZpeGVkIiwiZm9vdGVyRml4ZWQiLCIkY29udHJvbFNpZGViYXIiLCIkY29udHJvbHNpZGViYXJDb250ZW50Iiwic2lkZWJhckhlaWdodCIsIm92ZXJsYXlTY3JvbGxiYXJzIiwiY2xhc3NOYW1lIiwic2l6ZUF1dG9DYXBhYmxlIiwic2Nyb2xsYmFycyIsImF1dG9IaWRlIiwiY2xpY2tTY3JvbGxpbmciLCJvcGVyYXRpb24iLCJOQU1FJDMiLCJEQVRBX0tFWSQzIiwiRVZFTlRfS0VZJDMiLCJKUVVFUllfTk9fQ09ORkxJQ1QkMyIsIkVWRU5UX1RPR0dMRUQiLCJTRUxFQ1RPUl9EQVRBX1RPR0dMRSQxIiwiU0VMRUNUT1JfRElSRUNUX0NIQVQiLCJDTEFTU19OQU1FX0RJUkVDVF9DSEFUX09QRU4iLCJEaXJlY3RDaGF0IiwidG9nZ2xlQ2xhc3MiLCJOQU1FJDQiLCJEQVRBX0tFWSQ0IiwiSlFVRVJZX05PX0NPTkZMSUNUJDQiLCJTRUxFQ1RPUl9OQVZCQVIiLCJTRUxFQ1RPUl9EUk9QRE9XTl9NRU5VIiwiU0VMRUNUT1JfRFJPUERPV05fTUVOVV9BQ1RJVkUiLCJTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUiLCJDTEFTU19OQU1FX0RST1BET1dOX1JJR0hUIiwiQ0xBU1NfTkFNRV9EUk9QRE9XTl9TVUJNRU5VIiwiRGVmYXVsdCQzIiwiRHJvcGRvd24iLCJ0b2dnbGVTdWJtZW51Iiwic2libGluZ3MiLCJuZXh0IiwiZml4UG9zaXRpb24iLCJsZW5ndGgiLCJsZWZ0IiwicmlnaHQiLCJvZmZzZXQiLCJ2aXNpYmxlUGFydCIsInN0b3BQcm9wYWdhdGlvbiIsInRhcmdldCIsInBhcmVudCIsInNldFRpbWVvdXQiLCJOQU1FJDUiLCJEQVRBX0tFWSQ1IiwiRVZFTlRfS0VZJDQiLCJKUVVFUllfTk9fQ09ORkxJQ1QkNSIsIkVWRU5UX0VYUEFOREVEJDIiLCJFVkVOVF9DT0xMQVBTRUQkMiIsIlNFTEVDVE9SX1RBQkxFIiwiU0VMRUNUT1JfREFUQV9UT0dHTEUkMiIsIlNFTEVDVE9SX0FSSUFfQVRUUiIsIkV4cGFuZGFibGVUYWJsZSIsIm9wdGlvbnMiLCJpbml0IiwiXyIsIiRoZWFkZXIiLCIkdHlwZSIsImF0dHIiLCJ0b2dnbGVSb3ciLCJ0aW1lIiwic3RvcCIsInJlYWR5IiwiTkFNRSQ2IiwiREFUQV9LRVkkNiIsIkpRVUVSWV9OT19DT05GTElDVCQ2IiwiU0VMRUNUT1JfREFUQV9XSURHRVQiLCJTRUxFQ1RPUl9JQ09OIiwiRGVmYXVsdCQ0IiwiRnVsbHNjcmVlbiIsImZ1bGxzY3JlZW5FbGVtZW50IiwibW96RnVsbFNjcmVlbkVsZW1lbnQiLCJ3ZWJraXRGdWxsc2NyZWVuRWxlbWVudCIsIm1zRnVsbHNjcmVlbkVsZW1lbnQiLCJ3aW5kb3dlZCIsImZ1bGxzY3JlZW4iLCJkb2N1bWVudEVsZW1lbnQiLCJyZXF1ZXN0RnVsbHNjcmVlbiIsIndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuIiwibXNSZXF1ZXN0RnVsbHNjcmVlbiIsImV4aXRGdWxsc2NyZWVuIiwid2Via2l0RXhpdEZ1bGxzY3JlZW4iLCJtc0V4aXRGdWxsc2NyZWVuIiwicGx1Z2luIiwiTkFNRSQ3IiwiREFUQV9LRVkkNyIsIkpRVUVSWV9OT19DT05GTElDVCQ3IiwiU0VMRUNUT1JfREFUQV9UT0dHTEUkMyIsIlNFTEVDVE9SX0RBVEFfVE9HR0xFX0NMT1NFIiwiU0VMRUNUT1JfREFUQV9UT0dHTEVfU0NST0xMX0xFRlQiLCJTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TQ1JPTExfUklHSFQiLCJTRUxFQ1RPUl9EQVRBX1RPR0dMRV9GVUxMU0NSRUVOIiwiU0VMRUNUT1JfQ09OVEVOVF9XUkFQUEVSIiwiU0VMRUNUT1JfQ09OVEVOVF9JRlJBTUUiLCJTRUxFQ1RPUl9UQUJfTkFWIiwiU0VMRUNUT1JfVEFCX05BVkJBUl9OQVYiLCJTRUxFQ1RPUl9UQUJfTkFWQkFSX05BVl9JVEVNIiwiU0VMRUNUT1JfVEFCX0NPTlRFTlQiLCJTRUxFQ1RPUl9UQUJfRU1QVFkiLCJTRUxFQ1RPUl9UQUJfTE9BRElORyIsIlNFTEVDVE9SX1NJREVCQVJfTUVOVV9JVEVNIiwiU0VMRUNUT1JfSEVBREVSX01FTlVfSVRFTSIsIlNFTEVDVE9SX0hFQURFUl9EUk9QRE9XTl9JVEVNIiwiQ0xBU1NfTkFNRV9JRlJBTUVfTU9ERSIsIkNMQVNTX05BTUVfRlVMTFNDUkVFTl9NT0RFIiwiRGVmYXVsdCQ1Iiwib25UYWJDbGljayIsIml0ZW0iLCJvblRhYkNoYW5nZWQiLCJvblRhYkNyZWF0ZWQiLCJhdXRvSWZyYW1lTW9kZSIsImF1dG9JdGVtQWN0aXZlIiwiYXV0b1Nob3dOZXdUYWIiLCJsb2FkaW5nU2NyZWVuIiwidXNlTmF2YmFySXRlbXMiLCJzY3JvbGxPZmZzZXQiLCJzY3JvbGxCZWhhdmlvclN3YXAiLCJpY29uTWF4aW1pemUiLCJpY29uTWluaW1pemUiLCJJRnJhbWUiLCJjcmVhdGVUYWIiLCJ0aXRsZSIsImxpbmsiLCJ1bmlxdWVOYW1lIiwiYXV0b09wZW4iLCJ0YWJJZCIsImZsb29yIiwicmFuZG9tIiwibmF2SWQiLCJuZXdOYXZJdGVtIiwibmV3VGFiSXRlbSIsIiRsb2FkaW5nU2NyZWVuIiwiZmFkZUluIiwic3dpdGNoVGFiIiwiZmFkZU91dCIsIm9wZW5UYWJTaWRlYmFyIiwiJGl0ZW0iLCJjbG9uZSIsInVuZGVmaW5lZCIsInRleHQiLCJyZXBsYWNlIiwicmVwbGFjZUFsbCIsInRhYiIsIl9zZXRJdGVtQWN0aXZlIiwicmVtb3ZlQWN0aXZlVGFiIiwiJG5hdkl0ZW0iLCIkbmF2SXRlbVBhcmVudCIsIm5hdkl0ZW1JbmRleCIsImluZGV4IiwicHJldk5hdkl0ZW1JbmRleCIsImVxIiwidG9nZ2xlRnVsbHNjcmVlbiIsImZyYW1lRWxlbWVudCIsIl9zZXR1cExpc3RlbmVycyIsIl9uYXZTY3JvbGwiLCJsZWZ0UG9zIiwic2Nyb2xsTGVmdCIsImFuaW1hdGUiLCJtb3VzZWRvd24iLCJtb3VzZWRvd25JbnRlcnZhbCIsImNsZWFySW50ZXJ2YWwiLCJzZXRJbnRlcnZhbCIsImhyZWYiLCIkaGVhZGVyTWVudUl0ZW0iLCIkaGVhZGVyRHJvcGRvd25JdGVtIiwiJHNpZGViYXJNZW51SXRlbSIsImkiLCJwcmV2QWxsIiwidGFiRW1wdHkiLCJ3aW5kb3dIZWlnaHQiLCJjb250ZW50V3JhcHBlckhlaWdodCIsInBhcnNlRmxvYXQiLCJuYXZiYXJIZWlnaHQiLCJfZGF0YSIsIl9sZW4iLCJhcmd1bWVudHMiLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiYXBwbHkiLCJOQU1FJDgiLCJEQVRBX0tFWSQ4IiwiSlFVRVJZX05PX0NPTkZMSUNUJDgiLCJTRUxFQ1RPUl9IRUFERVIkMSIsIlNFTEVDVE9SX01BSU5fU0lERUJBUiIsIlNFTEVDVE9SX1NJREVCQVIiLCJTRUxFQ1RPUl9DT05URU5UIiwiU0VMRUNUT1JfQ09OVFJPTF9TSURFQkFSX0NPTlRFTlQkMSIsIlNFTEVDVE9SX0NPTlRST0xfU0lERUJBUl9CVE4iLCJTRUxFQ1RPUl9GT09URVIkMSIsIlNFTEVDVE9SX1BVU0hNRU5VX0JUTiIsIlNFTEVDVE9SX0xPR0lOX0JPWCIsIlNFTEVDVE9SX1JFR0lTVEVSX0JPWCIsIkNMQVNTX05BTUVfU0lERUJBUl9GT0NVU0VEIiwiQ0xBU1NfTkFNRV9MQVlPVVRfRklYRUQkMSIsIkNMQVNTX05BTUVfQ09OVFJPTF9TSURFQkFSX1NMSURFX09QRU4iLCJDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9PUEVOJDEiLCJEZWZhdWx0JDYiLCJwYW5lbEF1dG9IZWlnaHQiLCJwYW5lbEF1dG9IZWlnaHRNb2RlIiwibG9naW5SZWdpc3RlckF1dG9IZWlnaHQiLCJMYXlvdXQiLCJmaXhMYXlvdXRIZWlnaHQiLCJleHRyYSIsImNvbnRyb2xTaWRlYmFyIiwic2lkZWJhciIsIm1heCIsIl9tYXgiLCIkY29udGVudFNlbGVjdG9yIiwiX2lzRm9vdGVyRml4ZWQiLCJmaXhMb2dpblJlZ2lzdGVySGVpZ2h0IiwiJHNlbGVjdG9yIiwiYm94SGVpZ2h0IiwicGFyc2VJbnQiLCJudW1iZXJzIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJrZXkiLCJOQU1FJDkiLCJEQVRBX0tFWSQ5IiwiRVZFTlRfS0VZJDUiLCJKUVVFUllfTk9fQ09ORkxJQ1QkOSIsIkVWRU5UX0NPTExBUFNFRCQzIiwiRVZFTlRfU0hPV04iLCJTRUxFQ1RPUl9UT0dHTEVfQlVUVE9OIiwiU0VMRUNUT1JfQk9EWSIsIlNFTEVDVE9SX09WRVJMQVkiLCJTRUxFQ1RPUl9XUkFQUEVSIiwiQ0xBU1NfTkFNRV9DT0xMQVBTRUQkMSIsIkNMQVNTX05BTUVfT1BFTiIsIkNMQVNTX05BTUVfSVNfT1BFTklORyIsIkNMQVNTX05BTUVfQ0xPU0VEIiwiRGVmYXVsdCQ3IiwiYXV0b0NvbGxhcHNlU2l6ZSIsImVuYWJsZVJlbWVtYmVyIiwibm9UcmFuc2l0aW9uQWZ0ZXJSZWxvYWQiLCJQdXNoTWVudSIsIiRib2R5U2VsZWN0b3IiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwiYXV0b0NvbGxhcHNlIiwicmVtZW1iZXIiLCJ0b2dnbGVTdGF0ZSIsImdldEl0ZW0iLCJvdmVybGF5IiwiaWQiLCJidXR0b24iLCJjdXJyZW50VGFyZ2V0IiwiY2xvc2VzdCIsIk5BTUUkYSIsIkRBVEFfS0VZJGEiLCJKUVVFUllfTk9fQ09ORkxJQ1QkYSIsIkNMQVNTX05BTUVfT1BFTiQxIiwiQ0xBU1NfTkFNRV9JQ09OX1NFQVJDSCIsIkNMQVNTX05BTUVfSUNPTl9DTE9TRSIsIkNMQVNTX05BTUVfSEVBREVSIiwiQ0xBU1NfTkFNRV9TRUFSQ0hfUkVTVUxUUyIsIkNMQVNTX05BTUVfTElTVF9HUk9VUCIsIlNFTEVDVE9SX0RBVEFfV0lER0VUJDEiLCJTRUxFQ1RPUl9TSURFQkFSJDEiLCJTRUxFQ1RPUl9OQVZfTElOSyIsIlNFTEVDVE9SX05BVl9UUkVFVklFVyIsIlNFTEVDVE9SX1NFQVJDSF9JTlBVVCIsIlNFTEVDVE9SX1NFQVJDSF9CVVRUT04iLCJTRUxFQ1RPUl9TRUFSQ0hfSUNPTiIsIlNFTEVDVE9SX1NFQVJDSF9MSVNUX0dST1VQIiwiU0VMRUNUT1JfU0VBUkNIX1JFU1VMVFMiLCJTRUxFQ1RPUl9TRUFSQ0hfUkVTVUxUU19HUk9VUCIsIkRlZmF1bHQkOCIsImFycm93U2lnbiIsIm1pbkxlbmd0aCIsIm1heFJlc3VsdHMiLCJoaWdobGlnaHROYW1lIiwiaGlnaGxpZ2h0UGF0aCIsImhpZ2hsaWdodENsYXNzIiwibm90Rm91bmRUZXh0IiwiU2VhcmNoSXRlbXMiLCJTaWRlYmFyU2VhcmNoIiwiaXRlbXMiLCJhZnRlciIsIl9hZGROb3RGb3VuZCIsImNoaWxkIiwiX3BhcnNlSXRlbSIsInNlYXJjaCIsInNlYXJjaFZhbHVlIiwidmFsIiwidG9Mb3dlckNhc2UiLCJlbXB0eSIsImNsb3NlIiwic2VhcmNoUmVzdWx0cyIsImZpbHRlciIsIm5hbWUiLCJpbmNsdWRlcyIsImVuZFJlc3VsdHMiLCJzbGljZSIsInJlc3VsdCIsIl9yZW5kZXJJdGVtIiwicGF0aCIsIm9wZW4iLCJpdGVtT2JqZWN0IiwibmF2TGluayIsIm5hdlRyZWV2aWV3IiwiZW5kIiwiX3RyaW1UZXh0IiwicHVzaCIsIm5ld1BhdGgiLCJjb25jYXQiLCJ0cmltIiwiX3RoaXM0Iiwiam9pbiIsInJlZ0V4cCIsIlJlZ0V4cCIsInN0ciIsImtleUNvZGUiLCJsYXN0IiwiZm9jdXMiLCJ0aW1lciIsImNsZWFyVGltZW91dCIsIiRmb2N1c2VkIiwiaXMiLCJwcmV2IiwiTkFNRSRiIiwiREFUQV9LRVkkYiIsIkVWRU5UX0tFWSQ2IiwiSlFVRVJZX05PX0NPTkZMSUNUJGIiLCJFVkVOVF9JTklUIiwiRVZFTlRfQ1JFQVRFRCIsIkVWRU5UX1JFTU9WRUQkMSIsIlNFTEVDVE9SX0NPTlRBSU5FUl9UT1BfUklHSFQiLCJTRUxFQ1RPUl9DT05UQUlORVJfVE9QX0xFRlQiLCJTRUxFQ1RPUl9DT05UQUlORVJfQk9UVE9NX1JJR0hUIiwiU0VMRUNUT1JfQ09OVEFJTkVSX0JPVFRPTV9MRUZUIiwiQ0xBU1NfTkFNRV9UT1BfUklHSFQiLCJDTEFTU19OQU1FX1RPUF9MRUZUIiwiQ0xBU1NfTkFNRV9CT1RUT01fUklHSFQiLCJDTEFTU19OQU1FX0JPVFRPTV9MRUZUIiwiUE9TSVRJT05fVE9QX1JJR0hUIiwiUE9TSVRJT05fVE9QX0xFRlQiLCJQT1NJVElPTl9CT1RUT01fUklHSFQiLCJQT1NJVElPTl9CT1RUT01fTEVGVCIsIkRlZmF1bHQkOSIsInBvc2l0aW9uIiwiZml4ZWQiLCJhdXRvaGlkZSIsImF1dG9yZW1vdmUiLCJmYWRlIiwiaWNvbiIsImltYWdlIiwiaW1hZ2VBbHQiLCJpbWFnZUhlaWdodCIsInN1YnRpdGxlIiwiYm9keSIsIlRvYXN0cyIsIl9wcmVwYXJlQ29udGFpbmVyIiwiY3JlYXRlIiwidG9hc3QiLCJ0b2FzdEhlYWRlciIsInRvYXN0SW1hZ2UiLCJ0b2FzdENsb3NlIiwiX2dldENvbnRhaW5lcklkIiwicHJlcGVuZCIsImNvbnRhaW5lciIsIm9wdGlvbiIsIk5BTUUkYyIsIkRBVEFfS0VZJGMiLCJKUVVFUllfTk9fQ09ORkxJQ1QkYyIsIlNFTEVDVE9SX0RBVEFfVE9HR0xFJDQiLCJDTEFTU19OQU1FX1RPRE9fTElTVF9ET05FIiwiRGVmYXVsdCRhIiwib25DaGVjayIsIm9uVW5DaGVjayIsIlRvZG9MaXN0IiwicHJvcCIsInVuQ2hlY2siLCJjaGVjayIsIiR0b2dnbGVTZWxlY3RvciIsIk5BTUUkZCIsIkRBVEFfS0VZJGQiLCJFVkVOVF9LRVkkNyIsIkpRVUVSWV9OT19DT05GTElDVCRkIiwiRVZFTlRfRVhQQU5ERUQkMyIsIkVWRU5UX0NPTExBUFNFRCQ0IiwiRVZFTlRfTE9BRF9EQVRBX0FQSSIsIlNFTEVDVE9SX0xJIiwiU0VMRUNUT1JfTElOSyIsIlNFTEVDVE9SX1RSRUVWSUVXX01FTlUiLCJTRUxFQ1RPUl9PUEVOIiwiU0VMRUNUT1JfREFUQV9XSURHRVQkMiIsIkNMQVNTX05BTUVfT1BFTiQyIiwiQ0xBU1NfTkFNRV9JU19PUEVOSU5HJDEiLCJDTEFTU19OQU1FX1NJREVCQVJfQ09MTEFQU0VEIiwiRGVmYXVsdCRiIiwiYWNjb3JkaW9uIiwiZXhwYW5kU2lkZWJhciIsInNpZGViYXJCdXR0b25TZWxlY3RvciIsIlRyZWV2aWV3IiwidHJlZXZpZXdNZW51IiwicGFyZW50TGkiLCJleHBhbmRlZEV2ZW50Iiwib3Blbk1lbnVMaSIsIm9wZW5UcmVldmlldyIsIl9leHBhbmRTaWRlYmFyIiwiY29sbGFwc2VkRXZlbnQiLCIkcmVsYXRpdmVUYXJnZXQiLCIkcGFyZW50IiwiaXNPcGVuIiwiZWxlbWVudElkIiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/adminlte.js\n");
/***/ }),
/***/ "./resources/js/app.js":
/*!*****************************!*\
!*** ./resources/js/app.js ***!
\*****************************/
/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
eval("__webpack_require__(/*! ./adminlte */ \"./resources/js/adminlte.js\");\n__webpack_require__(/*! ./slim.kickstart.min */ \"./resources/js/slim.kickstart.min.js\");\n__webpack_require__(/*! ./bootstrap */ \"./resources/js/bootstrap.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYXBwLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFBQSxtQkFBTyxDQUFDLDhDQUFZLENBQUM7QUFDckJBLG1CQUFPLENBQUMsa0VBQXNCLENBQUM7QUFDL0JBLG1CQUFPLENBQUMsZ0RBQWEsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9hcHAuanM/Y2VkNiJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuL2FkbWlubHRlJyk7XG5yZXF1aXJlKCcuL3NsaW0ua2lja3N0YXJ0Lm1pbicpXG5yZXF1aXJlKCcuL2Jvb3RzdHJhcCcpO1xuXG5cblxuIl0sIm5hbWVzIjpbInJlcXVpcmUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/app.js\n");
/***/ }),
/***/ "./resources/js/bootstrap.js":
/*!***********************************!*\
!*** ./resources/js/bootstrap.js ***!
\***********************************/
/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
eval("// window._ = require('lodash');\n\n/**\n * We'll load jQuery and the Bootstrap jQuery plugin which provides support\n * for JavaScript based Bootstrap features such as modals and tabs. This\n * code may be modified to fit the specific needs of your application.\n */\n\ntry {\n window.Popper = (__webpack_require__(/*! popper.js */ \"./node_modules/popper.js/dist/esm/popper.js\")[\"default\"]);\n window.$ = window.jQuery = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n __webpack_require__(/*! bootstrap */ \"./node_modules/bootstrap/dist/js/bootstrap.js\");\n} catch (e) {}\n\n/**\n * We'll load the axios HTTP library which allows us to easily issue requests\n * to our Laravel back-end. This library automatically handles sending the\n * CSRF token as a header based on the value of the \"XSRF\" token cookie.\n */\n\nwindow.axios = __webpack_require__(/*! axios */ \"./node_modules/axios/index.js\");\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\n\n/**\n * Echo exposes an expressive API for subscribing to channels and listening\n * for events that are broadcast by Laravel. Echo and event broadcasting\n * allows your team to easily build robust real-time web applications.\n */\n\n// import Echo from 'laravel-echo';\n\n// window.Pusher = require('pusher-js');\n\n// window.Echo = new Echo({\n// broadcaster: 'pusher',\n// key: process.env.MIX_PUSHER_APP_KEY,\n// cluster: process.env.MIX_PUSHER_APP_CLUSTER,\n// forceTLS: true\n// });//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSTtFQUNBQSxNQUFNLENBQUNDLE1BQU0sR0FBR0MsZ0dBQTRCO0VBQzVDRixNQUFNLENBQUNHLENBQUMsR0FBR0gsTUFBTSxDQUFDSSxNQUFNLEdBQUdGLG1CQUFPLENBQUMsb0RBQVEsQ0FBQztFQUU1Q0EsbUJBQU8sQ0FBQyxnRUFBVyxDQUFDO0FBQ3hCLENBQUMsQ0FBQyxPQUFPRyxDQUFDLEVBQUUsQ0FBQzs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBTCxNQUFNLENBQUNNLEtBQUssR0FBR0osbUJBQU8sQ0FBQyw0Q0FBTyxDQUFDO0FBRS9CRixNQUFNLENBQUNNLEtBQUssQ0FBQ0MsUUFBUSxDQUFDQyxPQUFPLENBQUNDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLGdCQUFnQjs7QUFFM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzZkZTciXSwic291cmNlc0NvbnRlbnQiOlsiLy8gd2luZG93Ll8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcblxuLyoqXG4gKiBXZSdsbCBsb2FkIGpRdWVyeSBhbmQgdGhlIEJvb3RzdHJhcCBqUXVlcnkgcGx1Z2luIHdoaWNoIHByb3ZpZGVzIHN1cHBvcnRcbiAqIGZvciBKYXZhU2NyaXB0IGJhc2VkIEJvb3RzdHJhcCBmZWF0dXJlcyBzdWNoIGFzIG1vZGFscyBhbmQgdGFicy4gVGhpc1xuICogY29kZSBtYXkgYmUgbW9kaWZpZWQgdG8gZml0IHRoZSBzcGVjaWZpYyBuZWVkcyBvZiB5b3VyIGFwcGxpY2F0aW9uLlxuICovXG5cbnRyeSB7XG4gICAgd2luZG93LlBvcHBlciA9IHJlcXVpcmUoJ3BvcHBlci5qcycpLmRlZmF1bHQ7XG4gICAgd2luZG93LiQgPSB3aW5kb3cualF1ZXJ5ID0gcmVxdWlyZSgnanF1ZXJ5Jyk7XG5cbiAgICByZXF1aXJlKCdib290c3RyYXAnKTtcbn0gY2F0Y2ggKGUpIHt9XG5cbi8qKlxuICogV2UnbGwgbG9hZCB0aGUgYXhpb3MgSFRUUCBsaWJyYXJ5IHdoaWNoIGFsbG93cyB1cyB0byBlYXNpbHkgaXNzdWUgcmVxdWVzdHNcbiAqIHRvIG91ciBMYXJhdmVsIGJhY2stZW5kLiBUaGlzIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYW5kbGVzIHNlbmRpbmcgdGhlXG4gKiBDU1JGIHRva2VuIGFzIGEgaGVhZGVyIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgXCJYU1JGXCIgdG9rZW4gY29va2llLlxuICovXG5cbndpbmRvdy5heGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XG5cbndpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1SZXF1ZXN0ZWQtV2l0aCddID0gJ1hNTEh0dHBSZXF1ZXN0JztcblxuLyoqXG4gKiBFY2hvIGV4cG9zZXMgYW4gZXhwcmVzc2l2ZSBBUEkgZm9yIHN1YnNjcmliaW5nIHRvIGNoYW5uZWxzIGFuZCBsaXN0ZW5pbmdcbiAqIGZvciBldmVudHMgdGhhdCBhcmUgYnJvYWRjYXN0IGJ5IExhcmF2ZWwuIEVjaG8gYW5kIGV2ZW50IGJyb2FkY2FzdGluZ1xuICogYWxsb3dzIHlvdXIgdGVhbSB0byBlYXNpbHkgYnVpbGQgcm9idXN0IHJlYWwtdGltZSB3ZWIgYXBwbGljYXRpb25zLlxuICovXG5cbi8vIGltcG9ydCBFY2hvIGZyb20gJ2xhcmF2ZWwtZWNobyc7XG5cbi8vIHdpbmRvdy5QdXNoZXIgPSByZXF1aXJlKCdwdXNoZXItanMnKTtcblxuLy8gd2luZG93LkVjaG8gPSBuZXcgRWNobyh7XG4vLyAgICAgYnJvYWRjYXN0ZXI6ICdwdXNoZXInLFxuLy8gICAgIGtleTogcHJvY2Vzcy5lbnYuTUlYX1BVU0hFUl9BUFBfS0VZLFxuLy8gICAgIGNsdXN0ZXI6IHByb2Nlc3MuZW52Lk1JWF9QVVNIRVJfQVBQX0NMVVNURVIsXG4vLyAgICAgZm9yY2VUTFM6IHRydWVcbi8vIH0pO1xuIl0sIm5hbWVzIjpbIndpbmRvdyIsIlBvcHBlciIsInJlcXVpcmUiLCIkIiwialF1ZXJ5IiwiZSIsImF4aW9zIiwiZGVmYXVsdHMiLCJoZWFkZXJzIiwiY29tbW9uIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n");
/***/ }),
/***/ "./resources/js/slim.kickstart.min.js":
/*!********************************************!*\
!*** ./resources/js/slim.kickstart.min.js ***!
\********************************************/
/***/ (() => {
eval("function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n/*\n * Slim v4.19.0 - Image Cropping Made Easy\n * Copyright (c) 2018 Rik Schennink - http://slimimagecropper.com\n */\n!function (t, e) {\n function i() {\n t.Slim.parse(document);\n }\n if (t) if (t.Slim = function () {\n function t(t, e) {\n if (!(t instanceof e)) throw new TypeError(\"Cannot call a class as a function\");\n }\n function i(t, e, i, n) {\n if (!(e >= 1)) {\n for (var o = t.width, a = t.height, r = Math.max(n.width, Math.min(i.width, Math.round(t.width * e))), s = Math.max(n.height, Math.min(i.height, Math.round(t.height * e))), h = st(t), u = void 0, l = void 0; o > r && a > s;) {\n u = document.createElement(\"canvas\"), o = Math.round(.5 * h.width), a = Math.round(.5 * h.height), o < r && (o = r), a < s && (a = s), u.width = o, u.height = a, l = u.getContext(\"2d\"), l.drawImage(h, 0, 0, o, a), h = st(u);\n }\n t.width = r, t.height = s, l = t.getContext(\"2d\"), l.drawImage(h, 0, 0, r, s);\n }\n }\n !function () {\n function t(t, i) {\n i = i || {\n bubbles: !1,\n cancelable: !1,\n detail: e\n };\n var n = document.createEvent(\"CustomEvent\");\n return n.initCustomEvent(t, i.bubbles, i.cancelable, i.detail), n;\n }\n return \"function\" != typeof window.CustomEvent && (t.prototype = window.Event.prototype, void (window.CustomEvent = t));\n }();\n var n = function n(t, e, i) {\n var o,\n a,\n r = document.createElement(\"img\");\n if (r.onerror = e, r.onload = function () {\n !a || i && i.noRevoke || n.revokeObjectURL(a), e && e(n.scale(r, i));\n }, n.isInstanceOf(\"Blob\", t) || n.isInstanceOf(\"File\", t)) o = a = n.createObjectURL(t), r._type = t.type;else {\n if (\"string\" != typeof t) return !1;\n o = t, i && i.crossOrigin && (r.crossOrigin = i.crossOrigin);\n }\n return o ? (r.src = o, r) : n.readFile(t, function (t) {\n var i = t.target;\n i && i.result ? r.src = i.result : e && e(t);\n });\n },\n o = window.createObjectURL && window || window.URL && URL.revokeObjectURL && URL || window.webkitURL && webkitURL;\n n.isInstanceOf = function (t, e) {\n return Object.prototype.toString.call(e) === \"[object \" + t + \"]\";\n }, n.transformCoordinates = function () {}, n.getTransformedOptions = function (t, e) {\n var i,\n n,\n o,\n a,\n r = e.aspectRatio;\n if (!r) return e;\n i = {};\n for (n in e) {\n e.hasOwnProperty(n) && (i[n] = e[n]);\n }\n return i.crop = !0, o = t.naturalWidth || t.width, a = t.naturalHeight || t.height, o / a > r ? (i.maxWidth = a * r, i.maxHeight = a) : (i.maxWidth = o, i.maxHeight = o / r), i;\n }, n.renderImageToCanvas = function (t, e, i, n, o, a, r, s, h, u) {\n return t.getContext(\"2d\").drawImage(e, i, n, o, a, r, s, h, u), t;\n }, n.hasCanvasOption = function (t) {\n return t.canvas || t.crop || !!t.aspectRatio;\n }, n.scale = function (t, i) {\n function o() {\n var t = Math.max((h || b) / b, (u || k) / k);\n t > 1 && (b *= t, k *= t);\n }\n function a() {\n var t = Math.min((r || b) / b, (s || k) / k);\n t < 1 && (b *= t, k *= t);\n }\n i = i || {};\n var r,\n s,\n h,\n u,\n l,\n p,\n c,\n d,\n f,\n _,\n m,\n g = document.createElement(\"canvas\"),\n v = t.getContext || n.hasCanvasOption(i) && g.getContext,\n y = t.naturalWidth || t.width,\n w = t.naturalHeight || t.height,\n b = y,\n k = w;\n if (v && (i = n.getTransformedOptions(t, i), c = i.left || 0, d = i.top || 0, i.sourceWidth ? (l = i.sourceWidth, i.right !== e && i.left === e && (c = y - l - i.right)) : l = y - c - (i.right || 0), i.sourceHeight ? (p = i.sourceHeight, i.bottom !== e && i.top === e && (d = w - p - i.bottom)) : p = w - d - (i.bottom || 0), b = l, k = p), r = i.maxWidth, s = i.maxHeight, h = i.minWidth, u = i.minHeight, v && r && s && i.crop ? (b = r, k = s, m = l / p - r / s, m < 0 ? (p = s * l / r, i.top === e && i.bottom === e && (d = (w - p) / 2)) : m > 0 && (l = r * p / s, i.left === e && i.right === e && (c = (y - l) / 2))) : ((i.contain || i.cover) && (h = r = r || h, u = s = s || u), i.cover ? (a(), o()) : (o(), a())), v) {\n if (f = i.pixelRatio, f > 1 && (g.style.width = b + \"px\", g.style.height = k + \"px\", b *= f, k *= f, g.getContext(\"2d\").scale(f, f)), _ = i.downsamplingRatio, _ > 0 && _ < 1 && b < l && k < p) for (; l * _ > b;) {\n g.width = l * _, g.height = p * _, n.renderImageToCanvas(g, t, c, d, l, p, 0, 0, g.width, g.height), l = g.width, p = g.height, t = document.createElement(\"canvas\"), t.width = l, t.height = p, n.renderImageToCanvas(t, g, 0, 0, l, p, 0, 0, l, p);\n }\n return g.width = b, g.height = k, n.transformCoordinates(g, i), n.renderImageToCanvas(g, t, c, d, l, p, 0, 0, b, k);\n }\n return t.width = b, t.height = k, t;\n }, n.createObjectURL = function (t) {\n return !!o && o.createObjectURL(t);\n }, n.revokeObjectURL = function (t) {\n return !!o && o.revokeObjectURL(t);\n }, n.readFile = function (t, e, i) {\n if (window.FileReader) {\n var n = new FileReader();\n if (n.onload = n.onerror = e, i = i || \"readAsDataURL\", n[i]) return n[i](t), n;\n }\n return !1;\n };\n var a = n.hasCanvasOption,\n r = n.transformCoordinates,\n s = n.getTransformedOptions;\n n.hasCanvasOption = function (t) {\n return !!t.orientation || a.call(n, t);\n }, n.transformCoordinates = function (t, e) {\n r.call(n, t, e);\n var i = t.getContext(\"2d\"),\n o = t.width,\n a = t.height,\n s = t.style.width,\n h = t.style.height,\n u = e.orientation;\n if (u && !(u > 8)) switch (u > 4 && (t.width = a, t.height = o, t.style.width = h, t.style.height = s), u) {\n case 2:\n i.translate(o, 0), i.scale(-1, 1);\n break;\n case 3:\n i.translate(o, a), i.rotate(Math.PI);\n break;\n case 4:\n i.translate(0, a), i.scale(1, -1);\n break;\n case 5:\n i.rotate(.5 * Math.PI), i.scale(1, -1);\n break;\n case 6:\n i.rotate(.5 * Math.PI), i.translate(0, -a);\n break;\n case 7:\n i.rotate(.5 * Math.PI), i.translate(o, -a), i.scale(-1, 1);\n break;\n case 8:\n i.rotate(-.5 * Math.PI), i.translate(-o, 0);\n }\n }, n.getTransformedOptions = function (t, e) {\n var i,\n o,\n a = s.call(n, t, e),\n r = a.orientation;\n if (!r || r > 8 || 1 === r) return a;\n i = {};\n for (o in a) {\n a.hasOwnProperty(o) && (i[o] = a[o]);\n }\n switch (a.orientation) {\n case 2:\n i.left = a.right, i.right = a.left;\n break;\n case 3:\n i.left = a.right, i.top = a.bottom, i.right = a.left, i.bottom = a.top;\n break;\n case 4:\n i.top = a.bottom, i.bottom = a.top;\n break;\n case 5:\n i.left = a.top, i.top = a.left, i.right = a.bottom, i.bottom = a.right;\n break;\n case 6:\n i.left = a.top, i.top = a.right, i.right = a.bottom, i.bottom = a.left;\n break;\n case 7:\n i.left = a.bottom, i.top = a.right, i.right = a.top, i.bottom = a.left;\n break;\n case 8:\n i.left = a.bottom, i.top = a.left, i.right = a.top, i.bottom = a.right;\n }\n return a.orientation > 4 && (i.maxWidth = a.maxHeight, i.maxHeight = a.maxWidth, i.minWidth = a.minHeight, i.minHeight = a.minWidth, i.sourceWidth = a.sourceHeight, i.sourceHeight = a.sourceWidth), i;\n };\n var h = window.Blob && (Blob.prototype.slice || Blob.prototype.webkitSlice || Blob.prototype.mozSlice);\n n.blobSlice = h && function () {\n var t = this.slice || this.webkitSlice || this.mozSlice;\n return t.apply(this, arguments);\n }, n.metaDataParsers = {\n jpeg: {\n 65505: []\n }\n }, n.parseMetaData = function (t, e, i) {\n i = i || {};\n var o = this,\n a = i.maxMetaDataSize || 262144,\n r = {},\n s = !(window.DataView && t && t.size >= 12 && \"image/jpeg\" === t.type && n.blobSlice);\n !s && n.readFile(n.blobSlice.call(t, 0, a), function (t) {\n if (t.target.error) return void e(r);\n var a,\n s,\n h,\n u,\n l = t.target.result,\n p = new DataView(l),\n c = 2,\n d = p.byteLength - 4,\n f = c;\n if (65496 === p.getUint16(0)) {\n for (; c < d && (a = p.getUint16(c), a >= 65504 && a <= 65519 || 65534 === a) && (s = p.getUint16(c + 2) + 2, !(c + s > p.byteLength));) {\n if (h = n.metaDataParsers.jpeg[a]) for (u = 0; u < h.length; u += 1) {\n h[u].call(o, p, c, s, r, i);\n }\n c += s, f = c;\n }\n !i.disableImageHead && f > 6 && (l.slice ? r.imageHead = l.slice(0, f) : r.imageHead = new Uint8Array(l).subarray(0, f));\n }\n e(r);\n }, \"readAsArrayBuffer\") || e(r);\n }, n.ExifMap = function () {\n return this;\n }, n.ExifMap.prototype.map = {\n Orientation: 274\n }, n.ExifMap.prototype.get = function (t) {\n return this[t] || this[this.map[t]];\n }, n.getExifThumbnail = function (t, e, i) {\n var n, o, a;\n if (i && !(e + i > t.byteLength)) {\n for (n = [], o = 0; o < i; o += 1) {\n a = t.getUint8(e + o), n.push((a < 16 ? \"0\" : \"\") + a.toString(16));\n }\n return \"data:image/jpeg,%\" + n.join(\"%\");\n }\n }, n.exifTagTypes = {\n 1: {\n getValue: function getValue(t, e) {\n return t.getUint8(e);\n },\n size: 1\n },\n 2: {\n getValue: function getValue(t, e) {\n return String.fromCharCode(t.getUint8(e));\n },\n size: 1,\n ascii: !0\n },\n 3: {\n getValue: function getValue(t, e, i) {\n return t.getUint16(e, i);\n },\n size: 2\n },\n 4: {\n getValue: function getValue(t, e, i) {\n return t.getUint32(e, i);\n },\n size: 4\n },\n 5: {\n getValue: function getValue(t, e, i) {\n return t.getUint32(e, i) / t.getUint32(e + 4, i);\n },\n size: 8\n },\n 9: {\n getValue: function getValue(t, e, i) {\n return t.getInt32(e, i);\n },\n size: 4\n },\n 10: {\n getValue: function getValue(t, e, i) {\n return t.getInt32(e, i) / t.getInt32(e + 4, i);\n },\n size: 8\n }\n }, n.exifTagTypes[7] = n.exifTagTypes[1], n.getExifValue = function (t, e, i, o, a, r) {\n var s,\n h,\n u,\n l,\n p,\n c,\n d = n.exifTagTypes[o];\n if (d && (s = d.size * a, h = s > 4 ? e + t.getUint32(i + 8, r) : i + 8, !(h + s > t.byteLength))) {\n if (1 === a) return d.getValue(t, h, r);\n for (u = [], l = 0; l < a; l += 1) {\n u[l] = d.getValue(t, h + l * d.size, r);\n }\n if (d.ascii) {\n for (p = \"\", l = 0; l < u.length && (c = u[l], \"\\0\" !== c); l += 1) {\n p += c;\n }\n return p;\n }\n return u;\n }\n }, n.parseExifTag = function (t, e, i, o, a) {\n var r = t.getUint16(i, o);\n a.exif[r] = n.getExifValue(t, e, i, t.getUint16(i + 2, o), t.getUint32(i + 4, o), o);\n }, n.parseExifTags = function (t, e, i, n, o) {\n var a, r, s;\n if (!(i + 6 > t.byteLength || (a = t.getUint16(i, n), r = i + 2 + 12 * a, r + 4 > t.byteLength))) {\n for (s = 0; s < a; s += 1) {\n this.parseExifTag(t, e, i + 2 + 12 * s, n, o);\n }\n return t.getUint32(r, n);\n }\n }, n.parseExifData = function (t, e, i, o, a) {\n if (!a.disableExif) {\n var r,\n s,\n h,\n u = e + 10;\n if (1165519206 === t.getUint32(e + 4) && !(u + 8 > t.byteLength) && 0 === t.getUint16(e + 8)) {\n switch (t.getUint16(u)) {\n case 18761:\n r = !0;\n break;\n case 19789:\n r = !1;\n break;\n default:\n return;\n }\n 42 === t.getUint16(u + 2, r) && (s = t.getUint32(u + 4, r), o.exif = new n.ExifMap(), s = n.parseExifTags(t, u, u + s, r, o), s && !a.disableExifThumbnail && (h = {\n exif: {}\n }, s = n.parseExifTags(t, u, u + s, r, h), h.exif[513] && (o.exif.Thumbnail = n.getExifThumbnail(t, u + h.exif[513], h.exif[514]))), o.exif[34665] && !a.disableExifSub && n.parseExifTags(t, u, u + o.exif[34665], r, o), o.exif[34853] && !a.disableExifGps && n.parseExifTags(t, u, u + o.exif[34853], r, o));\n }\n }\n }, n.metaDataParsers.jpeg[65505].push(n.parseExifData);\n var u = function () {\n var t = [],\n i = [],\n n = [],\n o = \"transform\",\n a = window.getComputedStyle(document.documentElement, \"\"),\n r = (Array.prototype.slice.call(a).join(\"\").match(/-(moz|webkit|ms)-/) || \"\" === a.OLink && [\"\", \"o\"])[1];\n \"webkit\" === r && (o = \"webkitTransform\");\n var s = function s(t, i, n) {\n var o = t;\n if (o.length !== e) {\n for (var a = {\n chainers: [],\n then: function then(t) {\n return this.snabbt(t);\n },\n snabbt: function snabbt(t) {\n var e = this.chainers.length;\n return this.chainers.forEach(function (i, n) {\n i.snabbt(h(t, n, e));\n }), a;\n },\n setValue: function setValue(t) {\n return this.chainers.forEach(function (e) {\n e.setValue(t);\n }), a;\n },\n finish: function finish() {\n return this.chainers.forEach(function (t) {\n t.finish();\n }), a;\n },\n rollback: function rollback() {\n return this.chainers.forEach(function (t) {\n t.rollback();\n }), a;\n }\n }, r = 0, s = o.length; r < s; ++r) {\n \"string\" == typeof i ? a.chainers.push(u(o[r], i, h(n, r, s))) : a.chainers.push(u(o[r], h(i, r, s), n));\n }\n return a;\n }\n return \"string\" == typeof i ? u(o, i, h(n, 0, 1)) : u(o, h(i, 0, 1), n);\n },\n h = function h(t, e, i) {\n if (!t) return t;\n var n = $(t);\n J(t.delay) && (n.delay = t.delay(e, i)), J(t.callback) && (n.complete = function () {\n t.callback.call(this, e, i);\n });\n var o = J(t.allDone),\n a = J(t.complete);\n (a || o) && (n.complete = function () {\n a && t.complete.call(this, e, i), o && e == i - 1 && t.allDone();\n }), J(t.valueFeeder) && (n.valueFeeder = function (n, o) {\n return t.valueFeeder(n, o, e, i);\n }), J(t.easing) && (n.easing = function (n) {\n return t.easing(n, e, i);\n });\n var r = [\"position\", \"rotation\", \"skew\", \"rotationPost\", \"scale\", \"width\", \"height\", \"opacity\", \"fromPosition\", \"fromRotation\", \"fromSkew\", \"fromRotationPost\", \"fromScale\", \"fromWidth\", \"fromHeight\", \"fromOpacity\", \"transformOrigin\", \"duration\", \"delay\"];\n return r.forEach(function (o) {\n J(t[o]) && (n[o] = t[o](e, i));\n }), n;\n },\n u = function u(t, e, n) {\n function o(e) {\n if (f.tick(e), f.updateElement(t), !f.isStopped()) return f.completed() ? void (a.loop > 1 && !f.isStopped() ? (a.loop -= 1, f.restart(), k(o)) : (a.complete && a.complete.call(t), _.length && (a = _.pop(), s = y(a, u, !0), u = y(a, $(u)), a = w(s, u, a), f = S(a), i.push([t, f]), f.tick(e), k(o)))) : k(o);\n }\n if (\"attention\" === e) return l(t, n);\n if (\"stop\" === e) return p(t);\n if (\"detach\" === e) return d(t);\n var a = e;\n m();\n var r = v(t),\n s = r;\n s = y(a, s, !0);\n var u = $(r);\n u = y(a, u);\n var c = w(s, u, a),\n f = S(c);\n i.push([t, f]), f.updateElement(t, !0);\n var _ = [],\n g = {\n snabbt: function snabbt(t) {\n return _.unshift(h(t, 0, 1)), g;\n },\n then: function then(t) {\n return this.snabbt(t);\n }\n };\n return k(o), a.manual ? f : g;\n },\n l = function l(t, e) {\n function n(i) {\n a.tick(i), a.updateElement(t), a.completed() ? (e.callback && e.callback(t), e.loop && e.loop > 1 && (e.loop--, a.restart(), k(n))) : k(n);\n }\n var o = y(e, q({}));\n e.movement = o;\n var a = E(e);\n i.push([t, a]), k(n);\n },\n p = function p(t) {\n for (var e = 0, n = i.length; e < n; ++e) {\n var o = i[e],\n a = o[0],\n r = o[1];\n a === t && r.stop();\n }\n },\n c = function c(t, e) {\n for (var i = 0, n = t.length; i < n; ++i) {\n if (t[i][0] === e) return i;\n }\n return -1;\n },\n d = function d(t) {\n var e,\n o,\n a = [],\n r = i.concat(n),\n s = r.length;\n for (o = 0; o < s; ++o) {\n e = r[o][0], (t.contains(e) || t === e) && a.push(e);\n }\n for (s = a.length, o = 0; o < s; ++o) {\n f(a[o]);\n }\n },\n f = function f(t) {\n p(t);\n var e = c(i, t);\n e >= 0 && i.splice(e, 1), e = c(n, t), e >= 0 && n.splice(e, 1);\n },\n _ = function _(t, e) {\n for (var i = 0, n = t.length; i < n; ++i) {\n var o = t[i],\n a = o[0],\n r = o[1];\n if (a === e) {\n var s = r.getCurrentState();\n return r.stop(), s;\n }\n }\n },\n m = function m() {\n n = n.filter(function (t) {\n return g(t[0]).body;\n });\n },\n g = function g(t) {\n for (var e = t; e.parentNode;) {\n e = e.parentNode;\n }\n return e;\n },\n v = function v(t) {\n var e = _(i, t);\n return e ? e : _(n, t);\n },\n y = function y(t, e, i) {\n e || (e = q({\n position: [0, 0, 0],\n rotation: [0, 0, 0],\n rotationPost: [0, 0, 0],\n scale: [1, 1],\n skew: [0, 0]\n }));\n var n = \"position\",\n o = \"rotation\",\n a = \"skew\",\n r = \"rotationPost\",\n s = \"scale\",\n h = \"scalePost\",\n u = \"width\",\n l = \"height\",\n p = \"opacity\";\n return i && (n = \"fromPosition\", o = \"fromRotation\", a = \"fromSkew\", r = \"fromRotationPost\", s = \"fromScale\", h = \"fromScalePost\", u = \"fromWidth\", l = \"fromHeight\", p = \"fromOpacity\"), e.position = G(t[n], e.position), e.rotation = G(t[o], e.rotation), e.rotationPost = G(t[r], e.rotationPost), e.skew = G(t[a], e.skew), e.scale = G(t[s], e.scale), e.scalePost = G(t[h], e.scalePost), e.opacity = t[p], e.width = t[u], e.height = t[l], e;\n },\n w = function w(t, e, i) {\n return i.startState = t, i.endState = e, i;\n },\n b = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame || function (t) {\n return setTimeout(t, 1e3 / 60);\n },\n k = function k(e) {\n 0 === t.length && b(x), t.push(e);\n },\n x = function x(e) {\n for (var o = t.length, a = 0; a < o; ++a) {\n t[a](e);\n }\n t.splice(0, o);\n var r = i.filter(function (t) {\n return t[1].completed();\n });\n n = n.filter(function (t) {\n for (var e = 0, i = r.length; e < i; ++e) {\n if (t[0] === r[e][0]) return !1;\n }\n return !0;\n }), n = n.concat(r), i = i.filter(function (t) {\n return !t[1].completed();\n }), 0 !== t.length && b(x);\n },\n S = function S(t) {\n var i = t.startState,\n n = t.endState,\n o = G(t.duration, 500),\n a = G(t.delay, 0),\n r = t.perspective,\n s = L(G(t.easing, \"linear\"), t),\n h = 0 === o ? n.clone() : i.clone();\n t.transformOrigin;\n h.transformOrigin = t.transformOrigin;\n var u,\n l,\n p = 0,\n c = 0,\n d = !1,\n f = !1,\n _ = t.manual,\n m = 0,\n g = a / o;\n return l = t.valueFeeder ? V(t.valueFeeder, i, n, h) : j(i, n, h), {\n stop: function stop() {\n d = !0;\n },\n isStopped: function isStopped() {\n return d;\n },\n finish: function finish(t) {\n _ = !1;\n var e = o * m;\n p = c - e, u = t, s.resetFrom = m;\n },\n rollback: function rollback(t) {\n _ = !1, l.setReverse();\n var e = o * (1 - m);\n p = c - e, u = t, s.resetFrom = m;\n },\n restart: function restart() {\n p = e, s.resetFrom(0);\n },\n tick: function tick(t) {\n if (!d) {\n if (_) return c = t, void this.updateCurrentTransform();\n if (p || (p = t), t - p > a) {\n f = !0, c = t - a;\n var e = Math.min(Math.max(0, c - p), o);\n s.tick(e / o), this.updateCurrentTransform(), this.completed() && u && u();\n }\n }\n },\n getCurrentState: function getCurrentState() {\n return h;\n },\n setValue: function setValue(t) {\n f = !0, m = Math.min(Math.max(t, 1e-4), 1 + g);\n },\n updateCurrentTransform: function updateCurrentTransform() {\n var t = s.getValue();\n if (_) {\n var e = Math.max(1e-5, m - g);\n s.tick(e), t = s.getValue();\n }\n l.tween(t);\n },\n completed: function completed() {\n return !!d || 0 !== p && s.completed();\n },\n updateElement: function updateElement(t, e) {\n if (f || e) {\n var i = l.asMatrix(),\n n = l.getProperties();\n X(t, i, r), Y(t, n);\n }\n }\n };\n },\n E = function E(t) {\n var i = t.movement;\n t.initialVelocity = .1, t.equilibriumPosition = 0;\n var n = T(t),\n o = !1,\n a = i.position,\n r = i.rotation,\n s = i.rotationPost,\n h = i.scale,\n u = i.skew,\n l = q({\n position: a ? [0, 0, 0] : e,\n rotation: r ? [0, 0, 0] : e,\n rotationPost: s ? [0, 0, 0] : e,\n scale: h ? [0, 0] : e,\n skew: u ? [0, 0] : e\n });\n return {\n stop: function stop() {\n o = !0;\n },\n isStopped: function isStopped(t) {\n return o;\n },\n tick: function tick(t) {\n o || n.equilibrium || (n.tick(), this.updateMovement());\n },\n updateMovement: function updateMovement() {\n var t = n.getValue();\n a && (l.position[0] = i.position[0] * t, l.position[1] = i.position[1] * t, l.position[2] = i.position[2] * t), r && (l.rotation[0] = i.rotation[0] * t, l.rotation[1] = i.rotation[1] * t, l.rotation[2] = i.rotation[2] * t), s && (l.rotationPost[0] = i.rotationPost[0] * t, l.rotationPost[1] = i.rotationPost[1] * t, l.rotationPost[2] = i.rotationPost[2] * t), h && (l.scale[0] = 1 + i.scale[0] * t, l.scale[1] = 1 + i.scale[1] * t), u && (l.skew[0] = i.skew[0] * t, l.skew[1] = i.skew[1] * t);\n },\n updateElement: function updateElement(t) {\n X(t, l.asMatrix()), Y(t, l.getProperties());\n },\n getCurrentState: function getCurrentState() {\n return l;\n },\n completed: function completed() {\n return n.equilibrium || o;\n },\n restart: function restart() {\n n = T(t);\n }\n };\n },\n C = function C(t) {\n return t;\n },\n P = function P(t) {\n return (Math.cos(t * Math.PI + Math.PI) + 1) / 2;\n },\n M = function M(t) {\n return t * t;\n },\n R = function R(t) {\n return -Math.pow(t - 1, 2) + 1;\n },\n T = function T(t) {\n var e = G(t.startPosition, 0),\n i = G(t.equilibriumPosition, 1),\n n = G(t.initialVelocity, 0),\n o = G(t.springConstant, .8),\n a = G(t.springDeceleration, .9),\n r = G(t.springMass, 10),\n s = !1;\n return {\n tick: function tick(t) {\n if (0 !== t && !s) {\n var h = -(e - i) * o,\n u = h / r;\n n += u, e += n, n *= a, Math.abs(e - i) < .001 && Math.abs(n) < .001 && (s = !0);\n }\n },\n resetFrom: function resetFrom(t) {\n e = t, n = 0;\n },\n getValue: function getValue() {\n return s ? i : e;\n },\n completed: function completed() {\n return s;\n }\n };\n },\n I = {\n linear: C,\n ease: P,\n easeIn: M,\n easeOut: R\n },\n L = function L(t, e) {\n if (\"spring\" == t) return T(e);\n var i = t;\n J(t) || (i = I[t]);\n var n,\n o = i,\n a = 0;\n return {\n tick: function tick(t) {\n a = o(t), n = t;\n },\n resetFrom: function resetFrom(t) {\n n = 0;\n },\n getValue: function getValue() {\n return a;\n },\n completed: function completed() {\n return n >= 1 && n;\n }\n };\n },\n O = function O(t, e, i, n) {\n t[0] = 1, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, t[5] = 1, t[6] = 0, t[7] = 0, t[8] = 0, t[9] = 0, t[10] = 1, t[11] = 0, t[12] = e, t[13] = i, t[14] = n, t[15] = 1;\n },\n z = function z(t, e) {\n t[0] = 1, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, t[5] = Math.cos(e), t[6] = -Math.sin(e), t[7] = 0, t[8] = 0, t[9] = Math.sin(e), t[10] = Math.cos(e), t[11] = 0, t[12] = 0, t[13] = 0, t[14] = 0, t[15] = 1;\n },\n D = function D(t, e) {\n t[0] = Math.cos(e), t[1] = 0, t[2] = Math.sin(e), t[3] = 0, t[4] = 0, t[5] = 1, t[6] = 0, t[7] = 0, t[8] = -Math.sin(e), t[9] = 0, t[10] = Math.cos(e), t[11] = 0, t[12] = 0, t[13] = 0, t[14] = 0, t[15] = 1;\n },\n A = function A(t, e) {\n t[0] = Math.cos(e), t[1] = -Math.sin(e), t[2] = 0, t[3] = 0, t[4] = Math.sin(e), t[5] = Math.cos(e), t[6] = 0, t[7] = 0, t[8] = 0, t[9] = 0, t[10] = 1, t[11] = 0, t[12] = 0, t[13] = 0, t[14] = 0, t[15] = 1;\n },\n U = function U(t, e, i) {\n t[0] = 1, t[1] = Math.tan(e), t[2] = 0, t[3] = 0, t[4] = Math.tan(i), t[5] = 1, t[6] = 0, t[7] = 0, t[8] = 0, t[9] = 0, t[10] = 1, t[11] = 0, t[12] = 0, t[13] = 0, t[14] = 0, t[15] = 1;\n },\n H = function H(t, e, i) {\n t[0] = e, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, t[5] = i, t[6] = 0, t[7] = 0, t[8] = 0, t[9] = 0, t[10] = 1, t[11] = 0, t[12] = 0, t[13] = 0, t[14] = 0, t[15] = 1;\n },\n N = function N(t) {\n t[0] = 1, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, t[5] = 1, t[6] = 0, t[7] = 0, t[8] = 0, t[9] = 0, t[10] = 1, t[11] = 0, t[12] = 0, t[13] = 0, t[14] = 0, t[15] = 1;\n },\n B = function B(t, e) {\n e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e[4] = t[4], e[5] = t[5], e[6] = t[6], e[7] = t[7], e[8] = t[8], e[9] = t[9], e[10] = t[10], e[11] = t[11], e[12] = t[12], e[13] = t[13], e[14] = t[14], e[15] = t[15];\n },\n F = function F() {\n var t = new Float32Array(16),\n e = new Float32Array(16),\n i = new Float32Array(16);\n return N(t), {\n data: t,\n asCSS: function asCSS() {\n for (var e = \"matrix3d(\", i = 0; i < 15; ++i) {\n e += Math.abs(t[i]) < 1e-4 ? \"0,\" : t[i].toFixed(10) + \",\";\n }\n return e += Math.abs(t[15]) < 1e-4 ? \"0)\" : t[15].toFixed(10) + \")\";\n },\n clear: function clear() {\n N(t);\n },\n translate: function translate(n, o, a) {\n return B(t, e), O(i, n, o, a), W(e, i, t), this;\n },\n rotateX: function rotateX(n) {\n return B(t, e), z(i, n), W(e, i, t), this;\n },\n rotateY: function rotateY(n) {\n return B(t, e), D(i, n), W(e, i, t), this;\n },\n rotateZ: function rotateZ(n) {\n return B(t, e), A(i, n), W(e, i, t), this;\n },\n scale: function scale(n, o) {\n return B(t, e), H(i, n, o), W(e, i, t), this;\n },\n skew: function skew(n, o) {\n return B(t, e), U(i, n, o), W(e, i, t), this;\n }\n };\n },\n W = function W(t, e, i) {\n return i[0] = t[0] * e[0] + t[1] * e[4] + t[2] * e[8] + t[3] * e[12], i[1] = t[0] * e[1] + t[1] * e[5] + t[2] * e[9] + t[3] * e[13], i[2] = t[0] * e[2] + t[1] * e[6] + t[2] * e[10] + t[3] * e[14], i[3] = t[0] * e[3] + t[1] * e[7] + t[2] * e[11] + t[3] * e[15], i[4] = t[4] * e[0] + t[5] * e[4] + t[6] * e[8] + t[7] * e[12], i[5] = t[4] * e[1] + t[5] * e[5] + t[6] * e[9] + t[7] * e[13], i[6] = t[4] * e[2] + t[5] * e[6] + t[6] * e[10] + t[7] * e[14], i[7] = t[4] * e[3] + t[5] * e[7] + t[6] * e[11] + t[7] * e[15], i[8] = t[8] * e[0] + t[9] * e[4] + t[10] * e[8] + t[11] * e[12], i[9] = t[8] * e[1] + t[9] * e[5] + t[10] * e[9] + t[11] * e[13], i[10] = t[8] * e[2] + t[9] * e[6] + t[10] * e[10] + t[11] * e[14], i[11] = t[8] * e[3] + t[9] * e[7] + t[10] * e[11] + t[11] * e[15], i[12] = t[12] * e[0] + t[13] * e[4] + t[14] * e[8] + t[15] * e[12], i[13] = t[12] * e[1] + t[13] * e[5] + t[14] * e[9] + t[15] * e[13], i[14] = t[12] * e[2] + t[13] * e[6] + t[14] * e[10] + t[15] * e[14], i[15] = t[12] * e[3] + t[13] * e[7] + t[14] * e[11] + t[15] * e[15], i;\n },\n q = function q(t) {\n var i = F(),\n n = {\n opacity: e,\n width: e,\n height: e\n };\n return {\n position: t.position,\n rotation: t.rotation,\n rotationPost: t.rotationPost,\n skew: t.skew,\n scale: t.scale,\n scalePost: t.scalePost,\n opacity: t.opacity,\n width: t.width,\n height: t.height,\n clone: function clone() {\n return q({\n position: this.position ? this.position.slice(0) : e,\n rotation: this.rotation ? this.rotation.slice(0) : e,\n rotationPost: this.rotationPost ? this.rotationPost.slice(0) : e,\n skew: this.skew ? this.skew.slice(0) : e,\n scale: this.scale ? this.scale.slice(0) : e,\n scalePost: this.scalePost ? this.scalePost.slice(0) : e,\n height: this.height,\n width: this.width,\n opacity: this.opacity\n });\n },\n asMatrix: function asMatrix() {\n var t = i;\n return t.clear(), this.transformOrigin && t.translate(-this.transformOrigin[0], -this.transformOrigin[1], -this.transformOrigin[2]), this.scale && t.scale(this.scale[0], this.scale[1]), this.skew && t.skew(this.skew[0], this.skew[1]), this.rotation && (t.rotateX(this.rotation[0]), t.rotateY(this.rotation[1]), t.rotateZ(this.rotation[2])), this.position && t.translate(this.position[0], this.position[1], this.position[2]), this.rotationPost && (t.rotateX(this.rotationPost[0]), t.rotateY(this.rotationPost[1]), t.rotateZ(this.rotationPost[2])), this.scalePost && t.scale(this.scalePost[0], this.scalePost[1]), this.transformOrigin && t.translate(this.transformOrigin[0], this.transformOrigin[1], this.transformOrigin[2]), t;\n },\n getProperties: function getProperties() {\n return n.opacity = this.opacity, n.width = this.width + \"px\", n.height = this.height + \"px\", n;\n }\n };\n },\n j = function j(t, i, n) {\n var o = t,\n a = i,\n r = n,\n s = a.position !== e,\n h = a.rotation !== e,\n u = a.rotationPost !== e,\n l = a.scale !== e,\n p = a.skew !== e,\n c = a.width !== e,\n d = a.height !== e,\n f = a.opacity !== e;\n return {\n tween: function tween(t) {\n if (s) {\n var e = a.position[0] - o.position[0],\n i = a.position[1] - o.position[1],\n n = a.position[2] - o.position[2];\n r.position[0] = o.position[0] + t * e, r.position[1] = o.position[1] + t * i, r.position[2] = o.position[2] + t * n;\n }\n if (h) {\n var _ = a.rotation[0] - o.rotation[0],\n m = a.rotation[1] - o.rotation[1],\n g = a.rotation[2] - o.rotation[2];\n r.rotation[0] = o.rotation[0] + t * _, r.rotation[1] = o.rotation[1] + t * m, r.rotation[2] = o.rotation[2] + t * g;\n }\n if (u) {\n var v = a.rotationPost[0] - o.rotationPost[0],\n y = a.rotationPost[1] - o.rotationPost[1],\n w = a.rotationPost[2] - o.rotationPost[2];\n r.rotationPost[0] = o.rotationPost[0] + t * v, r.rotationPost[1] = o.rotationPost[1] + t * y, r.rotationPost[2] = o.rotationPost[2] + t * w;\n }\n if (p) {\n var b = a.scale[0] - o.scale[0],\n k = a.scale[1] - o.scale[1];\n r.scale[0] = o.scale[0] + t * b, r.scale[1] = o.scale[1] + t * k;\n }\n if (l) {\n var x = a.skew[0] - o.skew[0],\n S = a.skew[1] - o.skew[1];\n r.skew[0] = o.skew[0] + t * x, r.skew[1] = o.skew[1] + t * S;\n }\n if (c) {\n var E = a.width - o.width;\n r.width = o.width + t * E;\n }\n if (d) {\n var C = a.height - o.height;\n r.height = o.height + t * C;\n }\n if (f) {\n var P = a.opacity - o.opacity;\n r.opacity = o.opacity + t * P;\n }\n },\n asMatrix: function asMatrix() {\n return r.asMatrix();\n },\n getProperties: function getProperties() {\n return r.getProperties();\n },\n setReverse: function setReverse() {\n var t = o;\n o = a, a = t;\n }\n };\n },\n V = function V(t, i, n, o) {\n var a = t(0, F()),\n r = i,\n s = n,\n h = o,\n u = !1;\n return {\n tween: function tween(i) {\n u && (i = 1 - i), a.clear(), a = t(i, a);\n var n = s.width - r.width,\n o = s.height - r.height,\n l = s.opacity - r.opacity;\n s.width !== e && (h.width = r.width + i * n), s.height !== e && (h.height = r.height + i * o), s.opacity !== e && (h.opacity = r.opacity + i * l);\n },\n asMatrix: function asMatrix() {\n return a;\n },\n getProperties: function getProperties() {\n return h.getProperties();\n },\n setReverse: function setReverse() {\n u = !0;\n }\n };\n },\n G = function G(t, e) {\n return \"undefined\" == typeof t ? e : t;\n },\n X = function X(t, e, i) {\n var n = \"\";\n i && (n = \"perspective(\" + i + \"px) \");\n var a = e.asCSS();\n t.style[o] = n + a;\n },\n Y = function Y(t, e) {\n for (var i in e) {\n t.style[i] = e[i];\n }\n },\n J = function J(t) {\n return \"function\" == typeof t;\n },\n $ = function $(t) {\n if (!t) return t;\n var e = {};\n for (var i in t) {\n e[i] = t[i];\n }\n return e;\n };\n return s.createMatrix = F, s.setElementTransform = X, s;\n }(),\n l = function () {\n function t(t, e, i, n, o) {\n if (\"string\" == typeof t) t = document.getElementById(t);else if (!t instanceof HTMLCanvasElement) return;\n var a,\n r = t.getContext(\"2d\");\n try {\n try {\n a = r.getImageData(e, i, n, o);\n } catch (s) {\n throw new Error(\"unable to access local image data: \" + s);\n }\n } catch (s) {\n throw new Error(\"unable to access image data: \" + s);\n }\n return a;\n }\n function e(e, n, o, a, r, s) {\n if (!(isNaN(s) || s < 1)) {\n s |= 0;\n var h = t(e, n, o, a, r);\n h = i(h, n, o, a, r, s), e.getContext(\"2d\").putImageData(h, n, o);\n }\n }\n function i(t, e, i, r, s, h) {\n var u,\n l,\n p,\n c,\n d,\n f,\n _,\n m,\n g,\n v,\n y,\n w,\n b,\n k,\n x,\n S,\n E,\n C,\n P,\n M,\n R,\n T,\n I,\n L,\n O = t.data,\n z = h + h + 1,\n D = r - 1,\n A = s - 1,\n U = h + 1,\n H = U * (U + 1) / 2,\n N = new n(),\n B = N;\n for (p = 1; p < z; p++) {\n if (B = B.next = new n(), p == U) var F = B;\n }\n B.next = N;\n var W = null,\n q = null;\n _ = f = 0;\n var j = o[h],\n V = a[h];\n for (l = 0; l < s; l++) {\n for (S = E = C = P = m = g = v = y = 0, w = U * (M = O[f]), b = U * (R = O[f + 1]), k = U * (T = O[f + 2]), x = U * (I = O[f + 3]), m += H * M, g += H * R, v += H * T, y += H * I, B = N, p = 0; p < U; p++) {\n B.r = M, B.g = R, B.b = T, B.a = I, B = B.next;\n }\n for (p = 1; p < U; p++) {\n c = f + ((D < p ? D : p) << 2), m += (B.r = M = O[c]) * (L = U - p), g += (B.g = R = O[c + 1]) * L, v += (B.b = T = O[c + 2]) * L, y += (B.a = I = O[c + 3]) * L, S += M, E += R, C += T, P += I, B = B.next;\n }\n for (W = N, q = F, u = 0; u < r; u++) {\n O[f + 3] = I = y * j >> V, 0 != I ? (I = 255 / I, O[f] = (m * j >> V) * I, O[f + 1] = (g * j >> V) * I, O[f + 2] = (v * j >> V) * I) : O[f] = O[f + 1] = O[f + 2] = 0, m -= w, g -= b, v -= k, y -= x, w -= W.r, b -= W.g, k -= W.b, x -= W.a, c = _ + ((c = u + h + 1) < D ? c : D) << 2, S += W.r = O[c], E += W.g = O[c + 1], C += W.b = O[c + 2], P += W.a = O[c + 3], m += S, g += E, v += C, y += P, W = W.next, w += M = q.r, b += R = q.g, k += T = q.b, x += I = q.a, S -= M, E -= R, C -= T, P -= I, q = q.next, f += 4;\n }\n _ += r;\n }\n for (u = 0; u < r; u++) {\n for (E = C = P = S = g = v = y = m = 0, f = u << 2, w = U * (M = O[f]), b = U * (R = O[f + 1]), k = U * (T = O[f + 2]), x = U * (I = O[f + 3]), m += H * M, g += H * R, v += H * T, y += H * I, B = N, p = 0; p < U; p++) {\n B.r = M, B.g = R, B.b = T, B.a = I, B = B.next;\n }\n for (d = r, p = 1; p <= h; p++) {\n f = d + u << 2, m += (B.r = M = O[f]) * (L = U - p), g += (B.g = R = O[f + 1]) * L, v += (B.b = T = O[f + 2]) * L, y += (B.a = I = O[f + 3]) * L, S += M, E += R, C += T, P += I, B = B.next, p < A && (d += r);\n }\n for (f = u, W = N, q = F, l = 0; l < s; l++) {\n c = f << 2, O[c + 3] = I = y * j >> V, I > 0 ? (I = 255 / I, O[c] = (m * j >> V) * I, O[c + 1] = (g * j >> V) * I, O[c + 2] = (v * j >> V) * I) : O[c] = O[c + 1] = O[c + 2] = 0, m -= w, g -= b, v -= k, y -= x, w -= W.r, b -= W.g, k -= W.b, x -= W.a, c = u + ((c = l + U) < A ? c : A) * r << 2, m += S += W.r = O[c], g += E += W.g = O[c + 1], v += C += W.b = O[c + 2], y += P += W.a = O[c + 3], W = W.next, w += M = q.r, b += R = q.g, k += T = q.b, x += I = q.a, S -= M, E -= R, C -= T, P -= I, q = q.next, f += r;\n }\n }\n return t;\n }\n function n() {\n this.r = 0, this.g = 0, this.b = 0, this.a = 0, this.next = null;\n }\n var o = [512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259],\n a = [9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24];\n return e;\n }();\n HTMLCanvasElement.prototype.toBlob || Object.defineProperty(HTMLCanvasElement.prototype, \"toBlob\", {\n value: function value(t, e, i) {\n for (var n = atob(this.toDataURL(e, i).split(\",\")[1]), o = n.length, a = new Uint8Array(o), r = 0; r < o; r++) {\n a[r] = n.charCodeAt(r);\n }\n t(new Blob([a], {\n type: e || \"image/png\"\n }));\n }\n });\n var p = function () {\n function t(t, e) {\n for (var i = 0; i < e.length; i++) {\n var n = e[i];\n n.enumerable = n.enumerable || !1, n.configurable = !0, \"value\" in n && (n.writable = !0), Object.defineProperty(t, n.key, n);\n }\n }\n return function (e, i, n) {\n return i && t(e.prototype, i), n && t(e, n), e;\n };\n }(),\n c = \"function\" == typeof Symbol && \"symbol\" == _typeof(Symbol.iterator) ? function (t) {\n return _typeof(t);\n } : function (t) {\n return t && \"function\" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? \"symbol\" : _typeof(t);\n },\n d = function d(t) {\n if (\"undefined\" == typeof t.dataset) {\n var e,\n i,\n n = {},\n o = t.attributes;\n for (e in o) {\n o.hasOwnProperty(e) && o[e].name && /^data-[a-z_\\-\\d]*$/i.test(o[e].name) && (i = f(o[e].name.substr(5)), n[i] = o[e].value);\n }\n return n;\n }\n return t.dataset;\n },\n f = function f(t) {\n return t.replace(/\\-./g, function (t) {\n return t.charAt(1).toUpperCase();\n });\n },\n _ = function _(t) {\n for (var e = [], i = Array.prototype.slice.call(t.attributes), n = i.length, o = 0; o < n; o++) {\n e.push({\n name: i[o].name,\n value: i[o].value\n });\n }\n return e;\n },\n m = function m(t) {\n return {\n x: \"undefined\" == typeof t.offsetX ? t.layerX : t.offsetX,\n y: \"undefined\" == typeof t.offsetY ? t.layerY : t.offsetY\n };\n },\n g = function g(t, e) {\n var i,\n n = {},\n o = e || {};\n for (i in t) {\n t.hasOwnProperty(i) && (n[i] = \"undefined\" == typeof o[i] ? t[i] : o[i]);\n }\n return n;\n },\n v = {\n ESC: 27,\n RETURN: 13\n },\n y = {\n DOWN: [\"touchstart\", \"pointerdown\", \"mousedown\"],\n MOVE: [\"touchmove\", \"pointermove\", \"mousemove\"],\n UP: [\"touchend\", \"touchcancel\", \"pointerup\", \"mouseup\"]\n },\n w = {\n jpeg: \"image/jpeg\",\n jpg: \"image/jpeg\",\n jpe: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n bmp: \"image/bmp\"\n },\n b = /(\\.png|\\.bmp|\\.gif|\\.jpg|\\.jpe|\\.jpg|\\.jpeg)$/,\n k = function k(t, e) {\n var i = document.createElement(t);\n return e && (i.className = e), i;\n },\n x = function x(t, e, i) {\n e.forEach(function (e) {\n t.addEventListener(e, i, !1);\n });\n },\n S = function S(t, e, i) {\n e.forEach(function (e) {\n t.removeEventListener(e, i, !1);\n });\n },\n E = function E(t) {\n var e = t.changedTouches ? t.changedTouches[0] : t;\n if (e) return {\n x: e.pageX,\n y: e.pageY\n };\n },\n C = function C(t, e) {\n var i = .5,\n n = .5,\n o = Math.PI / 180 * e,\n a = Math.cos(o),\n r = Math.sin(o),\n s = t.x,\n h = t.y,\n u = t.x + t.width,\n l = t.y + t.height,\n p = a * (s - i) + r * (h - n) + i,\n c = a * (h - n) - r * (s - i) + n,\n d = a * (u - i) + r * (l - n) + i,\n f = a * (l - n) - r * (u - i) + n;\n p <= d ? (t.x = p, t.width = d - p) : (t.x = d, t.width = p - d), c <= f ? (t.y = c, t.height = f - c) : (t.y = f, t.height = c - f);\n },\n P = function P(t) {\n var e = E(t);\n return e.x -= window.pageXOffset || document.documentElement.scrollLeft, e.y -= window.pageYOffset || document.documentElement.scrollTop, e;\n },\n M = function M(t) {\n return t.charAt(0).toLowerCase() + t.slice(1);\n },\n R = function R(t) {\n return t.charAt(0).toUpperCase() + t.slice(1);\n },\n T = function T(t) {\n return t[t.length - 1];\n },\n I = function I(t, e, i) {\n return Math.max(e, Math.min(i, t));\n },\n L = function L(t, e) {\n if (!e) return !1;\n for (var i = 0; i < e.length; i++) {\n if (e[i] === t) return !0;\n }\n return !1;\n },\n O = function O(t) {\n var i = arguments.length > 1 && arguments[1] !== e ? arguments[1] : \"POST\",\n n = arguments[2],\n o = arguments[3],\n a = arguments[4],\n r = arguments[5],\n s = arguments[6],\n h = new XMLHttpRequest();\n a && h.upload.addEventListener(\"progress\", function (t) {\n a(t.loaded, t.total);\n }), h.open(i, t, !0), o && o(h, n), h.onreadystatechange = function () {\n if (4 === h.readyState && h.status >= 200 && h.status < 300) {\n var t = h.responseText;\n if (!t.length) return void r();\n if (t.indexOf(\"Content-Length\") !== -1) return void s(\"file-too-big\");\n var e = void 0;\n try {\n e = JSON.parse(h.responseText);\n } catch (i) {}\n if (\"object\" === (\"undefined\" == typeof e ? \"undefined\" : c(e)) && \"failure\" === e.status) return void s(e.message);\n r(e || t);\n } else if (4 === h.readyState) {\n var n = void 0;\n try {\n n = JSON.parse(h.responseText);\n } catch (i) {}\n if (\"object\" === (\"undefined\" == typeof n ? \"undefined\" : c(n)) && \"failure\" === n.status) return void s(n.message);\n s(\"fail\");\n }\n }, h.send(n);\n },\n z = function z(t) {\n t && (t.style.webkitTransform = \"\", t.style.transform = \"\");\n },\n D = function D(t) {\n return t / 1e6;\n },\n A = function A() {\n var t = [],\n e = void 0,\n i = void 0;\n for (e in w) {\n w.hasOwnProperty(e) && (i = w[e], t.indexOf(i) == -1 && t.push(i));\n }\n return t;\n },\n U = function U(t) {\n return \"image/jpeg\" === t;\n },\n H = function H(t) {\n var e = void 0;\n for (e in w) {\n if (w.hasOwnProperty(e) && w[e] === t) return e;\n }\n return t;\n },\n N = function N(t) {\n var e = void 0;\n for (e in w) {\n if (w.hasOwnProperty(e) && t.indexOf(w[e]) !== -1) return w[e];\n }\n return null;\n },\n B = function B(t) {\n return t.split(\"/\").pop().split(\"?\").shift();\n },\n F = function F(t) {\n var i = arguments.length > 1 && arguments[1] !== e ? arguments[1] : \"\";\n return (i + t).slice(-i.length);\n },\n W = function W(t) {\n return t.getFullYear() + \"-\" + F(t.getMonth() + 1, \"00\") + \"-\" + F(t.getDate(), \"00\") + \"_\" + F(t.getHours(), \"00\") + \"-\" + F(t.getMinutes(), \"00\") + \"-\" + F(t.getSeconds(), \"00\");\n },\n q = function q(t) {\n return \"undefined\" == typeof t.name ? W(new Date()) + \".\" + H(j(t)) : t.name;\n },\n j = function j(t) {\n return t.type || \"image/jpeg\";\n },\n V = function V(t) {\n if (\"string\" != typeof t) return W(new Date());\n var e = B(t);\n return e.split(\".\").shift();\n },\n G = function G(t, e) {\n try {\n return new File([t], e, {\n type: t.type,\n lastModified: Date.now()\n });\n } catch (i) {\n return t.lastModified = new Date(), t.name = e, t;\n }\n },\n X = function X(t) {\n return /^data:image/.test(t);\n },\n Y = function Y(t, e, i, n, o, a) {\n t = \"\" + t + (t.indexOf(\"?\") !== -1 ? \"&\" : \"?\") + \"url=\" + n;\n var r = new XMLHttpRequest();\n r.open(\"GET\", t, !0), e(r), r.responseType = \"json\", r.onload = function () {\n return \"failure\" === this.response.status ? void o(this.response.message) : void J(this.response.body, i, a);\n }, r.send();\n },\n J = function J(t, e, i, n) {\n var o = new XMLHttpRequest();\n o.open(\"GET\", t, !0), e(o), o.responseType = \"blob\", o.onload = function (e) {\n if (o.status >= 200 && o.status < 300) {\n var a = B(t),\n r = N(this.response.type);\n b.test(a) || (a += \".\" + H(r));\n var s = G(this.response, a);\n i(gt(s, r));\n } else n(o.status + \": \" + o.statusText);\n }, o.onerror = function () {\n n();\n }, o.send();\n },\n $ = function $(t) {\n var e = t.split(\",\")[1],\n i = e.replace(/\\s/g, \"\");\n return atob(i);\n },\n Z = function Z(t, e) {\n for (var i = $(t), n = new ArrayBuffer(i.length), o = new Uint8Array(n), a = 0; a < i.length; a++) {\n o[a] = i.charCodeAt(a);\n }\n var r = wt(t);\n return \"undefined\" == typeof e && (e = W(new Date()) + \".\" + H(r)), G(K(n, r), e);\n },\n K = function K(t, e) {\n var i = window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\n if (i) {\n var n = new i();\n return n.append(t), n.getBlob(e);\n }\n return new Blob([t], {\n type: e\n });\n },\n Q = function Q(t, e, i) {\n var o = \"string\" != typeof t || 0 !== t.indexOf(\"data:image\");\n n.parseMetaData(t, function (a) {\n var r = {\n canvas: !0,\n crossOrigin: o\n };\n e && (r.maxWidth = e.width, r.maxHeight = e.height), a.exif && (r.orientation = a.exif.get(\"Orientation\")), n(t, function (t) {\n return \"error\" === t.type ? void i() : void i(t, a);\n }, r);\n });\n },\n tt = function tt(t, e, i) {\n var n,\n o,\n a,\n r,\n s = e / t;\n return s < i ? (r = e, a = r / i, n = .5 * (t - a), o = 0) : (a = t, r = a * i, n = 0, o = .5 * (e - r)), {\n x: n,\n y: o,\n height: r,\n width: a\n };\n },\n et = function et(t) {\n var n = arguments.length > 1 && arguments[1] !== e ? arguments[1] : {},\n o = arguments[2],\n a = k(\"canvas\"),\n r = n.rotation,\n s = n.crop,\n h = n.size,\n u = n.filters,\n l = n.minSize;\n if (s) {\n var p = r % 180 !== 0,\n c = {\n width: p ? t.height : t.width,\n height: p ? t.width : t.height\n };\n s.x < 0 && (s.x = 0), s.y < 0 && (s.y = 0), s.width > c.width && (s.width = c.width), s.height > c.height && (s.height = c.height), s.y + s.height > c.height && (s.y = Math.max(0, c.height - s.height)), s.x + s.width > c.width && (s.x = Math.max(0, c.width - s.width));\n var d = s.x / c.width,\n f = s.y / c.height,\n _ = s.width / c.width,\n m = s.height / c.height;\n a.width = s.width, a.height = s.height;\n var g = a.getContext(\"2d\");\n 90 === r ? (g.translate(.5 * a.width, .5 * a.height), g.rotate(-90 * Math.PI / 180), g.drawImage(t, (1 - f) * t.width - t.width * m, s.x, s.height, s.width, .5 * -a.height, .5 * -a.width, a.height, a.width)) : 180 === r ? (g.translate(.5 * a.width, .5 * a.height), g.rotate(-180 * Math.PI / 180), g.drawImage(t, (1 - (d + _)) * c.width, (1 - (f + m)) * c.height, _ * c.width, m * c.height, .5 * -a.width, .5 * -a.height, a.width, a.height)) : 270 === r ? (g.translate(.5 * a.width, .5 * a.height), g.rotate(-270 * Math.PI / 180), g.drawImage(t, s.y, (1 - d) * t.height - t.height * _, s.height, s.width, .5 * -a.height, .5 * -a.width, a.height, a.width)) : g.drawImage(t, s.x, s.y, s.width, s.height, 0, 0, a.width, a.height);\n }\n if (h) {\n var v = h.width / a.width,\n y = h.height / a.height,\n w = Math.min(v, y);\n i(a, w, h, l), u.sharpen > 0 && nt(a, at(u.sharpen));\n }\n o(a);\n },\n it = function it(t) {\n var e = t.getContext(\"2d\");\n return e.getImageData(0, 0, t.width, t.height);\n },\n nt = function nt(t, e) {\n var i = t.getContext(\"2d\");\n i.putImageData(e(it(t), t.width, t.height), 0, 0);\n },\n ot = function ot(t, e, i) {\n var n = document.createElement(\"canvas\");\n n.width = t, n.height = e;\n var o = n.getContext(\"2d\"),\n a = o.createImageData(n.width, n.height);\n return i && a.set(i.data), a;\n },\n at = function at(t) {\n return function (e, i, n) {\n for (var o = [0, -1, 0, -1, 5, -1, 0, -1, 0], a = Math.round(Math.sqrt(o.length)), r = .5 * a | 0, s = ot(i, n), h = s.data, u = e.data, l = n, p = void 0; l--;) {\n for (p = i; p--;) {\n for (var c = l, d = p, f = 4 * (l * i + p), _ = 0, m = 0, g = 0, v = 0, y = 0; y < a; y++) {\n for (var w = 0; w < a; w++) {\n var b = c + y - r,\n k = d + w - r;\n if (b >= 0 && b < n && k >= 0 && k < i) {\n var x = 4 * (b * i + k),\n S = o[y * a + w];\n _ += u[x] * S, m += u[x + 1] * S, g += u[x + 2] * S, v += u[x + 3] * S;\n }\n }\n }\n h[f] = _ * t + u[f] * (1 - t), h[f + 1] = m * t + u[f + 1] * (1 - t), h[f + 2] = g * t + u[f + 2] * (1 - t), h[f + 3] = u[f + 3];\n }\n }\n return s;\n };\n },\n rt = function rt(t, e) {\n var i = Math.abs(t.width - e.width),\n n = Math.abs(t.height - e.height);\n return Math.max(i, n);\n },\n st = function st(t) {\n return ht(t, 1);\n },\n ht = function ht(t, e) {\n if (!t) return null;\n var n = document.createElement(\"canvas\"),\n o = n.getContext(\"2d\");\n return n.width = t.width, n.height = t.height, o.drawImage(t, 0, 0), e > 0 && 1 !== e && i(n, e, {\n width: Math.round(t.width * e),\n height: Math.round(t.height * e)\n }, {\n width: 0,\n height: 0\n }), n;\n },\n ut = function ut(t) {\n return t.width && t.height;\n },\n lt = function lt(t, e) {\n var i = e.getContext(\"2d\");\n ut(e) ? i.drawImage(t, 0, 0, e.width, e.height) : (e.width = t.width, e.height = t.height, i.drawImage(t, 0, 0));\n },\n pt = function pt(t) {\n l(t, 0, 0, t.width, t.height, 3);\n },\n ct = function ct(t, e) {\n return parseInt(t.width, 10) >= e.width && parseInt(t.height, 10) >= e.height;\n },\n dt = function dt(t, e, i) {\n return {\n x: t.x * e,\n y: t.y * i,\n width: t.width * e,\n height: t.height * i\n };\n },\n ft = function ft(t, e, i) {\n return {\n x: t.x / e,\n y: t.y / i,\n width: t.width / e,\n height: t.height / i\n };\n },\n _t = function _t(t) {\n if (t && \"\" !== t.value) {\n try {\n t.value = \"\";\n } catch (e) {}\n if (t.value) {\n var i = document.createElement(\"form\"),\n n = t.parentNode,\n o = t.nextSibling;\n i.appendChild(t), i.reset(), o ? n.insertBefore(t, o) : n.appendChild(t);\n }\n }\n },\n mt = function mt(t) {\n return \"object\" === (\"undefined\" == typeof value ? \"undefined\" : c(value)) && null !== value ? JSON.parse(JSON.stringify(t)) : t;\n },\n gt = function gt(t) {\n var i = arguments.length > 1 && arguments[1] !== e ? arguments[1] : null;\n if (!t) return null;\n var n = t.slice(0, t.size, i || t.type);\n return n.name = t.name, n.lastModified = new Date(t.lastModified), n;\n },\n vt = function vt(t) {\n var e = mt(t);\n return e.input.file = gt(t.input.file), e.output.image = st(t.output.image), e;\n },\n yt = function yt(t, i, n) {\n return t && i ? t.toDataURL(i, U(i) && \"number\" == typeof n ? n / 100 : e) : null;\n },\n wt = function wt(t) {\n if (!t) return null;\n var e = t.substr(0, 16).match(/^.+;/);\n return e.length ? e[0].substring(5, e[0].length - 1) : null;\n },\n bt = function bt(t) {\n var i = arguments.length > 1 && arguments[1] !== e ? arguments[1] : [],\n n = arguments[2],\n o = arguments[3],\n a = arguments[4],\n r = {\n server: mt(t.server),\n meta: mt(t.meta),\n input: {\n name: t.input.name,\n type: t.input.type,\n size: t.input.size,\n width: t.input.width,\n height: t.input.height,\n field: t.input.field\n }\n };\n return L(\"input\", i) && !a && (r.input.image = yt(t.input.image, t.input.type)), L(\"output\", i) && (r.output = {\n name: o ? V(t.input.name) + \".\" + o : t.input.name,\n type: w[o] || t.input.type,\n width: t.output.width,\n height: t.output.height\n }, r.output.image = yt(t.output.image, r.output.type, n), r.output.type = wt(r.output.image), \"image/png\" === r.output.type && (r.output.name = V(r.input.name) + \".png\")), L(\"actions\", i) && (r.actions = mt(t.actions)), r;\n },\n kt = function kt(t, i, n) {\n var o = t.output.image,\n a = n ? V(t.input.name) + \".\" + n : t.input.name,\n r = w[n] || t.input.type;\n \"image/png\" === r && (a = V(t.input.name) + \".png\"), o.toBlob(function (t) {\n if (\"msSaveBlob\" in window.navigator) return void window.navigator.msSaveBlob(t, a);\n var e = (window.URL || window.webkitURL).createObjectURL(t),\n i = k(\"a\");\n i.style.display = \"none\", i.download = a, i.href = e, document.body.appendChild(i), i.click(), setTimeout(function () {\n document.body.removeChild(i), (window.URL || window.webkitURL).revokeObjectURL(e);\n }, 0);\n }, r, \"number\" == typeof i ? i / 100 : e);\n },\n xt = function xt(t, e, i) {\n var n = i.querySelector(t);\n n && (n.style.display = e ? \"\" : \"none\");\n },\n St = function St(t) {\n return Array.prototype.slice.call(t);\n },\n Et = function Et(t) {\n t.parentNode.removeChild(t);\n },\n Ct = function Ct(t) {\n var e = k(\"div\");\n return t.parentNode && (t.nextSibling ? t.parentNode.insertBefore(e, t.nextSibling) : t.parentNode.appendChild(e)), e.appendChild(t), e;\n },\n Pt = function Pt(t, e, i, n) {\n var o = (n - 90) * Math.PI / 180;\n return {\n x: t + i * Math.cos(o),\n y: e + i * Math.sin(o)\n };\n },\n Mt = function Mt(t, e, i, n, o) {\n var a = Pt(t, e, i, o),\n r = Pt(t, e, i, n),\n s = o - n <= 180 ? \"0\" : \"1\",\n h = [\"M\", a.x, a.y, \"A\", i, i, 0, s, 0, r.x, r.y].join(\" \");\n return h;\n },\n Rt = function Rt(t, e, i, n) {\n return Mt(t, e, i, 0, 360 * n);\n },\n Tt = function () {\n var i = {\n n: function n(t, e, i, _n) {\n var o, a, r, s, h, u, l, p;\n return r = t.y + t.height, o = I(e.y, 0, r), r - o < i.min.height && (o = r - i.min.height), h = _n ? (r - o) / _n : t.width, h < i.min.width && (h = i.min.width, o = r - h * _n), l = .5 * (h - t.width), s = t.x - l, a = t.x + t.width + l, (s < 0 || Math.round(a) > Math.round(i.width)) && (p = Math.min(t.x, i.width - (t.x + t.width)), s = t.x - p, a = t.x + t.width + p, h = a - s, u = h * _n, o = r - u), {\n x: s,\n y: o,\n width: a - s,\n height: r - o\n };\n },\n s: function s(t, e, i, n) {\n var o, a, r, s, h, u, l, p;\n return o = t.y, r = I(e.y, o, i.height), r - o < i.min.height && (r = o + i.min.height), h = n ? (r - o) / n : t.width, h < i.min.width && (h = i.min.width, r = o + h * n), l = .5 * (h - t.width), s = t.x - l, a = t.x + t.width + l, (s < 0 || Math.round(a) > Math.round(i.width)) && (p = Math.min(t.x, i.width - (t.x + t.width)), s = t.x - p, a = t.x + t.width + p, h = a - s, u = h * n, r = o + u), {\n x: s,\n y: o,\n width: a - s,\n height: r - o\n };\n },\n e: function e(t, _e, i, n) {\n var o, a, r, s, h, u, l, p;\n return s = t.x, a = I(_e.x, s, i.width), a - s < i.min.width && (a = s + i.min.width), u = n ? (a - s) * n : t.height, u < i.min.height && (u = i.min.height, a = s + u / n), l = .5 * (u - t.height), o = t.y - l, r = t.y + t.height + l, (o < 0 || Math.round(r) > Math.round(i.height)) && (p = Math.min(t.y, i.height - (t.y + t.height)), o = t.y - p, r = t.y + t.height + p, u = r - o, h = u / n, a = s + h), {\n x: s,\n y: o,\n width: a - s,\n height: r - o\n };\n },\n w: function n(t, e, i, o) {\n var a, r, s, h, n, u, l, p;\n return r = t.x + t.width, h = I(e.x, 0, r), r - h < i.min.width && (h = r - i.min.width), u = o ? (r - h) * o : t.height, u < i.min.height && (u = i.min.height, h = r - u / o), l = .5 * (u - t.height), a = t.y - l, s = t.y + t.height + l, (a < 0 || Math.round(s) > Math.round(i.height)) && (p = Math.min(t.y, i.height - (t.y + t.height)), a = t.y - p, s = t.y + t.height + p, u = s - a, n = u / o, h = r - n), {\n x: h,\n y: a,\n width: r - h,\n height: s - a\n };\n },\n ne: function ne(t, e, i, n) {\n var o, a, r, s, h, u, l;\n return s = t.x, r = t.y + t.height, a = I(e.x, s, i.width), a - s < i.min.width && (a = s + i.min.width), u = n ? (a - s) * n : I(r - e.y, i.min.height, r), u < i.min.height && (u = i.min.height, a = s + u / n), o = t.y - (u - t.height), (o < 0 || Math.round(r) > Math.round(i.height)) && (l = Math.min(t.y, i.height - (t.y + t.height)), o = t.y - l, u = r - o, h = u / n, a = s + h), {\n x: s,\n y: o,\n width: a - s,\n height: r - o\n };\n },\n se: function se(t, e, i, n) {\n var o, a, r, s, h, u, l;\n return s = t.x, o = t.y, a = I(e.x, s, i.width), a - s < i.min.width && (a = s + i.min.width), u = n ? (a - s) * n : I(e.y - t.y, i.min.height, i.height - o), u < i.min.height && (u = i.min.height, a = s + u / n), r = t.y + t.height + (u - t.height), (o < 0 || Math.round(r) > Math.round(i.height)) && (l = Math.min(t.y, i.height - (t.y + t.height)), r = t.y + t.height + l, u = r - o, h = u / n, a = s + h), {\n x: s,\n y: o,\n width: a - s,\n height: r - o\n };\n },\n sw: function sw(t, e, i, n) {\n var o, a, r, s, h, u, l;\n return a = t.x + t.width, o = t.y, s = I(e.x, 0, a), a - s < i.min.width && (s = a - i.min.width), u = n ? (a - s) * n : I(e.y - t.y, i.min.height, i.height - o), u < i.min.height && (u = i.min.height, s = a - u / n), r = t.y + t.height + (u - t.height), (o < 0 || Math.round(r) > Math.round(i.height)) && (l = Math.min(t.y, i.height - (t.y + t.height)), r = t.y + t.height + l, u = r - o, h = u / n, s = a - h), {\n x: s,\n y: o,\n width: a - s,\n height: r - o\n };\n },\n nw: function nw(t, e, i, n) {\n var o, a, r, s, h, u, l;\n return a = t.x + t.width, r = t.y + t.height, s = I(e.x, 0, a), a - s < i.min.width && (s = a - i.min.width), u = n ? (a - s) * n : I(r - e.y, i.min.height, r), u < i.min.height && (u = i.min.height, s = a - u / n), o = t.y - (u - t.height), (o < 0 || Math.round(r) > Math.round(i.height)) && (l = Math.min(t.y, i.height - (t.y + t.height)), o = t.y - l, u = r - o, h = u / n, s = a - h), {\n x: s,\n y: o,\n width: a - s,\n height: r - o\n };\n }\n };\n return function () {\n function n() {\n var i = arguments.length > 0 && arguments[0] !== e ? arguments[0] : document.createElement(\"div\");\n t(this, n), this._element = i, this._interaction = null, this._minWidth = 1, this._minHeight = 1, this._ratio = null, this._rect = {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n }, this._space = {\n width: 0,\n height: 0\n }, this._rectChanged = !1, this._init();\n }\n return p(n, [{\n key: \"_init\",\n value: function value() {\n this._element.className = \"slim-crop-area\";\n var t = k(\"div\", \"grid\");\n this._element.appendChild(t);\n for (var e in i) {\n if (i.hasOwnProperty(e)) {\n var n = k(\"button\", e);\n this._element.appendChild(n);\n }\n }\n var o = k(\"button\", \"c\");\n this._element.appendChild(o), x(document, y.DOWN, this);\n }\n }, {\n key: \"reset\",\n value: function value() {\n this._interaction = null, this._rect = {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n }, this._rectChanged = !0, this._redraw(), this._element.dispatchEvent(new CustomEvent(\"change\"));\n }\n }, {\n key: \"rescale\",\n value: function value(t) {\n 1 !== t && (this._interaction = null, this._rectChanged = !0, this._rect.x *= t, this._rect.y *= t, this._rect.width *= t, this._rect.height *= t, this._redraw(), this._element.dispatchEvent(new CustomEvent(\"change\")));\n }\n }, {\n key: \"limit\",\n value: function value(t, e) {\n this._space.width = t, this._space.height = e;\n }\n }, {\n key: \"offset\",\n value: function value(t, e) {\n this._space.x = t, this._space.y = e;\n }\n }, {\n key: \"resize\",\n value: function value(t, e, i, n) {\n this._interaction = null, this._rect = {\n x: I(t, 0, this._space.width - this._minWidth),\n y: I(e, 0, this._space.height - this._minHeight),\n width: I(i, this._minWidth, this._space.width),\n height: I(n, this._minHeight, this._space.height)\n }, this._rectChanged = !0, this._redraw(), this._element.dispatchEvent(new CustomEvent(\"change\"));\n }\n }, {\n key: \"handleEvent\",\n value: function value(t) {\n switch (t.type) {\n case \"touchstart\":\n case \"pointerdown\":\n case \"mousedown\":\n this._onStartDrag(t);\n break;\n case \"touchmove\":\n case \"pointermove\":\n case \"mousemove\":\n this._onDrag(t);\n break;\n case \"touchend\":\n case \"touchcancel\":\n case \"pointerup\":\n case \"mouseup\":\n this._onStopDrag(t);\n }\n }\n }, {\n key: \"_onStartDrag\",\n value: function value(t) {\n this._element.contains(t.target) && (t.preventDefault(), x(document, y.MOVE, this), x(document, y.UP, this), this._interaction = {\n type: t.target.className,\n offset: P(t)\n }, this._interaction.offset.x -= this._rect.x, this._interaction.offset.y -= this._rect.y, this._element.setAttribute(\"data-dragging\", \"true\"), this._redraw());\n }\n }, {\n key: \"_onDrag\",\n value: function value(t) {\n t.preventDefault();\n var e = P(t),\n n = this._interaction.type;\n \"c\" === n ? (this._rect.x = I(e.x - this._interaction.offset.x, 0, this._space.width - this._rect.width), this._rect.y = I(e.y - this._interaction.offset.y, 0, this._space.height - this._rect.height)) : i[n] && (this._rect = i[n](this._rect, {\n x: e.x - this._space.x,\n y: e.y - this._space.y\n }, {\n x: 0,\n y: 0,\n width: this._space.width,\n height: this._space.height,\n min: {\n width: this._minWidth,\n height: this._minHeight\n }\n }, this._ratio)), this._rectChanged = !0, this._element.dispatchEvent(new CustomEvent(\"input\"));\n }\n }, {\n key: \"_onStopDrag\",\n value: function value(t) {\n t.preventDefault(), S(document, y.MOVE, this), S(document, y.UP, this), this._interaction = null, this._element.setAttribute(\"data-dragging\", \"false\"), this._element.dispatchEvent(new CustomEvent(\"change\"));\n }\n }, {\n key: \"_redraw\",\n value: function value() {\n var t = this;\n if (this._rectChanged) {\n var e = \"translate(\" + this._rect.x + \"px,\" + this._rect.y + \"px);\";\n this._element.style.cssText = \"\\n\\t\\t\\t\\t\\t-webkit-transform: \" + e + \";\\n\\t\\t\\t\\t\\ttransform: \" + e + \";\\n\\t\\t\\t\\t\\twidth:\" + this._rect.width + \"px;\\n\\t\\t\\t\\t\\theight:\" + this._rect.height + \"px;\\n\\t\\t\\t\\t\", this._rectChanged = !1;\n }\n this._interaction && requestAnimationFrame(function () {\n return t._redraw();\n });\n }\n }, {\n key: \"destroy\",\n value: function value() {\n this._interaction = !1, this._rectChanged = !1, S(document, y.DOWN, this), S(document, y.MOVE, this), S(document, y.UP, this), Et(this._element);\n }\n }, {\n key: \"element\",\n get: function get() {\n return this._element;\n }\n }, {\n key: \"space\",\n get: function get() {\n return this._space;\n }\n }, {\n key: \"area\",\n get: function get() {\n var t = this._rect.x / this._space.width,\n e = this._rect.y / this._space.height,\n i = this._rect.width / this._space.width,\n n = this._rect.height / this._space.height;\n return {\n x: t,\n y: e,\n width: i,\n height: n\n };\n }\n }, {\n key: \"dirty\",\n get: function get() {\n return 0 !== this._rect.x || 0 !== this._rect.y || 0 !== this._rect.width || 0 !== this._rect.height;\n }\n }, {\n key: \"minWidth\",\n set: function set(t) {\n this._minWidth = Math.max(t, 1);\n }\n }, {\n key: \"minHeight\",\n set: function set(t) {\n this._minHeight = Math.max(t, 1);\n }\n }, {\n key: \"ratio\",\n set: function set(t) {\n this._ratio = t;\n }\n }]), n;\n }();\n }(),\n It = function () {\n var i = [\"input\", \"change\"],\n n = function () {\n function n() {\n var i = arguments.length > 0 && arguments[0] !== e ? arguments[0] : document.createElement(\"div\"),\n o = arguments.length > 1 && arguments[1] !== e ? arguments[1] : {};\n t(this, n), this._element = i, this._options = g(n.options(), o), this._ratio = null, this._output = null, this._rotating = !1, this._input = null, this._preview = null, this._previewBlurred = null, this._blurredPreview = !1, this._cropper = null, this._straightCrop = null, this._previewWrapper = null, this._currentWindowSize = {}, this._btnGroup = null, this._maskFrame = null, this._dirty = !1, this._wrapperRotation = 0, this._wrapperScale = 1, this._init();\n }\n return p(n, [{\n key: \"_init\",\n value: function value() {\n var t = this;\n this._element.className = \"slim-image-editor\", this._container = k(\"div\", \"slim-container\"), this._wrapper = k(\"div\", \"slim-wrapper\"), this._stage = k(\"div\", \"slim-stage\"), this._container.appendChild(this._stage), this._cropper = new Tt(), i.forEach(function (e) {\n t._cropper.element.addEventListener(e, t);\n }), this._stage.appendChild(this._cropper.element), this._previewWrapper = k(\"div\", \"slim-image-editor-preview slim-crop-preview\"), this._previewBlurred = k(\"canvas\", \"slim-crop-blur\"), this._previewWrapper.appendChild(this._previewBlurred), this._wrapper.appendChild(this._previewWrapper), this._previewMask = k(\"div\", \"slim-crop-mask\"), this._preview = k(\"img\"), this._previewMask.appendChild(this._preview), this._cropper.element.appendChild(this._previewMask), this._btnGroup = k(\"div\", \"slim-editor-btn-group\"), n.Buttons.forEach(function (e) {\n var i = R(e),\n n = t._options[\"button\" + i + \"Label\"],\n o = t._options[\"button\" + i + \"Title\"],\n a = t._options[\"button\" + i + \"ClassName\"],\n r = k(\"button\", \"slim-editor-btn slim-btn-\" + e + (a ? \" \" + a : \"\"));\n r.innerHTML = n, r.title = o || n, r.type = \"button\", r.setAttribute(\"data-action\", e), r.addEventListener(\"click\", t), t._btnGroup.appendChild(r);\n }), this._utilsGroup = k(\"div\", \"slim-editor-utils-group\");\n var e = k(\"button\", \"slim-editor-utils-btn slim-btn-rotate\" + (this._options.buttonRotateClassName ? \" \" + this._options.buttonRotateClassName : \"\"));\n e.setAttribute(\"data-action\", \"rotate\"), e.addEventListener(\"click\", this), e.title = this._options.buttonRotateTitle, this._utilsGroup.appendChild(e), this._container.appendChild(this._wrapper), this._element.appendChild(this._container), this._element.appendChild(this._utilsGroup), this._element.appendChild(this._btnGroup);\n }\n }, {\n key: \"dirty\",\n value: function value() {\n this._dirty = !0;\n }\n }, {\n key: \"handleEvent\",\n value: function value(t) {\n switch (t.type) {\n case \"click\":\n this._onClick(t);\n break;\n case \"change\":\n this._onGridChange(t);\n break;\n case \"input\":\n this._onGridInput(t);\n break;\n case \"keydown\":\n this._onKeyDown(t);\n break;\n case \"resize\":\n this._onResize(t);\n }\n }\n }, {\n key: \"_onKeyDown\",\n value: function value(t) {\n switch (t.keyCode) {\n case v.RETURN:\n this._confirm();\n break;\n case v.ESC:\n this._cancel();\n }\n }\n }, {\n key: \"_onClick\",\n value: function value(t) {\n t.target.classList.contains(\"slim-btn-cancel\") && this._cancel(), t.target.classList.contains(\"slim-btn-confirm\") && this._confirm(), t.target.classList.contains(\"slim-btn-rotate\") && this._rotate();\n }\n }, {\n key: \"_onResize\",\n value: function value() {\n this._currentWindowSize = {\n width: window.innerWidth,\n height: window.innerHeight\n }, this._redraw(), this._redrawCropper(this._cropper.area), this._updateWrapperScale(), this._redrawWrapper();\n }\n }, {\n key: \"_redrawWrapper\",\n value: function value() {\n var t = u.createMatrix();\n t.scale(this._wrapperScale, this._wrapperScale), t.rotateZ(this._wrapperRotation * (Math.PI / 180)), u.setElementTransform(this._previewWrapper, t);\n }\n }, {\n key: \"_onGridInput\",\n value: function value() {\n this._redrawCropMask();\n }\n }, {\n key: \"_onGridChange\",\n value: function value() {\n this._redrawCropMask();\n }\n }, {\n key: \"_updateWrapperRotation\",\n value: function value() {\n this._options.minSize.width > this._input.height || this._options.minSize.height > this._input.width ? this._wrapperRotation += 180 : this._wrapperRotation += 90;\n }\n }, {\n key: \"_updateWrapperScale\",\n value: function value() {\n var t = this._wrapperRotation % 180 !== 0;\n if (t) {\n var e = this._container.offsetWidth,\n i = this._container.offsetHeight,\n n = this._wrapper.offsetHeight,\n o = this._wrapper.offsetWidth,\n a = e / n;\n a * o > i && (a = i / o), this._wrapperScale = a;\n } else this._wrapperScale = 1;\n }\n }, {\n key: \"_cancel\",\n value: function value() {\n this._rotating || this._element.dispatchEvent(new CustomEvent(\"cancel\"));\n }\n }, {\n key: \"_confirm\",\n value: function value() {\n if (!this._rotating) {\n var t = this._wrapperRotation % 180 !== 0,\n e = this._cropper.area,\n i = dt(e, t ? this._input.height : this._input.width, t ? this._input.width : this._input.height);\n this._element.dispatchEvent(new CustomEvent(\"confirm\", {\n detail: {\n rotation: this._wrapperRotation % 360,\n crop: i\n }\n }));\n }\n }\n }, {\n key: \"_rotate\",\n value: function value() {\n var t = this;\n if (!this._rotating) {\n this._rotating = !0, this._updateWrapperRotation();\n var e = 1 === this.ratio || null === this._ratio ? this._cropper.area : null;\n e && C(e, 90), this._updateWrapperScale(), this._hideCropper(), u(this._previewWrapper, {\n rotation: [0, 0, this._wrapperRotation * (Math.PI / 180)],\n scale: [this._wrapperScale, this._wrapperScale],\n easing: \"spring\",\n springConstant: .8,\n springDeceleration: .65,\n complete: function complete() {\n t._redrawCropper(e), t._showCropper(), t._rotating = !1;\n }\n });\n }\n }\n }, {\n key: \"_showCropper\",\n value: function value() {\n u(this._stage, {\n easing: \"ease\",\n duration: 250,\n fromOpacity: 0,\n opacity: 1\n });\n }\n }, {\n key: \"_hideCropper\",\n value: function value() {\n u(this._stage, {\n duration: 0,\n fromOpacity: 0,\n opacity: 0\n });\n }\n }, {\n key: \"_redrawCropMask\",\n value: function value() {\n var t = this,\n e = this._wrapperRotation % 360,\n i = this._wrapperScale,\n n = {\n width: this._wrapper.offsetWidth,\n height: this._wrapper.offsetHeight\n },\n o = this._cropper.area,\n a = {\n x: 0,\n y: 0\n };\n 0 === e ? (a.x = -o.x, a.y = -o.y) : 90 === e ? (a.x = -(1 - o.y), a.y = -o.x) : 180 === e ? (a.x = -(1 - o.x), a.y = -(1 - o.y)) : 270 === e && (a.x = -o.y, a.y = -(1 - o.x)), a.x *= n.width, a.y *= n.height, cancelAnimationFrame(this._maskFrame), this._maskFrame = requestAnimationFrame(function () {\n var n = \"scale(\" + i + \") rotate(\" + -e + \"deg) translate(\" + a.x + \"px, \" + a.y + \"px);\";\n t._preview.style.cssText = \"\\n\\t\\t\\t\\t\\twidth: \" + t._previewSize.width + \"px;\\n\\t\\t\\t\\t\\theight: \" + t._previewSize.height + \"px;\\n\\t\\t\\t\\t\\t-webkit-transform: \" + n + \";\\n\\t\\t\\t\\t\\ttransform: \" + n + \";\\n\\t\\t\\t\\t\";\n });\n }\n }, {\n key: \"open\",\n value: function value(t, e, i, n, o) {\n var a = this;\n if (this._input && !this._dirty && this._ratio === e) return void o();\n this._currentWindowSize = {\n width: window.innerWidth,\n height: window.innerHeight\n }, this._dirty = !1, this._wrapperRotation = n || 0, this._blurredPreview = !1, this._ratio = e, this._previewSize = null, this._element.style.opacity = \"0\", this._input = t;\n var r = n % 180 !== 0,\n s = ft(i, r ? t.height : t.width, r ? t.width : t.height);\n this._preview.onload = function () {\n a._preview.onload = null, a._cropper.ratio = a.ratio, a._redraw(), a._redrawCropper(s), o(), a._element.style.opacity = \"\";\n }, this._preview.src = \"\", this._preview.src = ht(this._input, Math.min(this._container.offsetWidth / this._input.width, this._container.offsetHeight / this._input.height) * this._options.devicePixelRatio).toDataURL();\n }\n }, {\n key: \"_redrawCropper\",\n value: function value(t) {\n var e = this._wrapperRotation % 180 !== 0,\n i = e ? this._input.height / this._input.width : this._input.width / this._input.height,\n n = this._wrapper.offsetWidth,\n o = this._wrapper.offsetHeight,\n a = this._container.offsetWidth,\n r = this._container.offsetHeight;\n this._updateWrapperScale();\n var s = this._wrapperScale * (e ? o : n),\n h = this._wrapperScale * (e ? n : o),\n u = e ? .5 * (a - s) : this._wrapper.offsetLeft,\n l = e ? .5 * (r - h) : this._wrapper.offsetTop;\n this._stage.style.cssText = \"\\n\\t\\t\\t\\tleft:\" + u + \"px;\\n\\t\\t\\t\\ttop:\" + l + \"px;\\n\\t\\t\\t\\twidth:\" + s + \"px;\\n\\t\\t\\t\\theight:\" + h + \"px;\\n\\t\\t\\t\", this._cropper.limit(s, s / i), this._cropper.offset(u + this._element.offsetLeft, l + this._element.offsetTop), this._cropper.minWidth = this._wrapperScale * this._options.minSize.width * this.scalar, this._cropper.minHeight = this._wrapperScale * this._options.minSize.height * this.scalar;\n var p = null;\n p = t ? {\n x: t.x * s,\n y: t.y * h,\n width: t.width * s,\n height: t.height * h\n } : tt(s, h, this._ratio || h / s), this._cropper.resize(p.x, p.y, p.width, p.height);\n }\n }, {\n key: \"_redraw\",\n value: function value() {\n var t = this._input.height / this._input.width,\n e = this._container.clientWidth,\n i = this._container.clientHeight,\n n = e,\n o = n * t;\n o > i && (o = i, n = o / t), n = Math.round(n), o = Math.round(o);\n var a = (e - n) / 2,\n r = (i - o) / 2;\n this._wrapper.style.cssText = \"\\n\\t\\t\\t\\tleft:\" + a + \"px;\\n\\t\\t\\t\\ttop:\" + r + \"px;\\n\\t\\t\\t\\twidth:\" + n + \"px;\\n\\t\\t\\t\\theight:\" + o + \"px;\\n\\t\\t\\t\", this._previewBlurred.style.cssText = \"\\n\\t\\t\\t\\twidth:\" + n + \"px;\\n\\t\\t\\t\\theight:\" + o + \"px;\\n\\t\\t\\t\", this._preview.style.cssText = \"\\n\\t\\t\\t\\twidth:\" + n + \"px;\\n\\t\\t\\t\\theight:\" + o + \"px;\\n\\t\\t\\t\", this._previewSize = {\n width: n,\n height: o\n }, this._blurredPreview || (this._previewBlurred.width = 300, this._previewBlurred.height = this._previewBlurred.width * t, lt(this._input, this._previewBlurred), pt(this._previewBlurred, 3), this._blurredPreview = !0);\n }\n }, {\n key: \"show\",\n value: function value() {\n var t = arguments.length > 0 && arguments[0] !== e ? arguments[0] : function () {};\n this._currentWindowSize.width === window.innerWidth && this._currentWindowSize.height === window.innerHeight || (this._redraw(), this._redrawCropper(this._cropper.area)), document.addEventListener(\"keydown\", this), window.addEventListener(\"resize\", this);\n var i = this._wrapperRotation * (Math.PI / 180);\n u(this._previewWrapper, {\n fromRotation: [0, 0, i],\n rotation: [0, 0, i],\n fromPosition: [0, 0, 0],\n position: [0, 0, 0],\n fromOpacity: 0,\n opacity: 1,\n fromScale: [this._wrapperScale - .02, this._wrapperScale - .02],\n scale: [this._wrapperScale, this._wrapperScale],\n easing: \"spring\",\n springConstant: .3,\n springDeceleration: .85,\n delay: 450,\n complete: function complete() {}\n }), this._cropper.dirty ? u(this._stage, {\n fromPosition: [0, 0, 0],\n position: [0, 0, 0],\n fromOpacity: 0,\n opacity: 1,\n duration: 250,\n delay: 850,\n complete: function complete() {\n z(this), t();\n }\n }) : u(this._stage, {\n fromPosition: [0, 0, 0],\n position: [0, 0, 0],\n fromOpacity: 0,\n opacity: 1,\n duration: 250,\n delay: 1e3,\n complete: function complete() {\n z(this);\n }\n }), u(this._btnGroup.childNodes, {\n fromScale: [.9, .9],\n scale: [1, 1],\n fromOpacity: 0,\n opacity: 1,\n delay: function delay(t) {\n return 1e3 + 100 * t;\n },\n easing: \"spring\",\n springConstant: .3,\n springDeceleration: .85,\n complete: function complete() {\n z(this);\n }\n }), u(this._utilsGroup.childNodes, {\n fromScale: [.9, .9],\n scale: [1, 1],\n fromOpacity: 0,\n opacity: 1,\n easing: \"spring\",\n springConstant: .3,\n springDeceleration: .85,\n delay: 1250,\n complete: function complete() {\n z(this);\n }\n });\n }\n }, {\n key: \"hide\",\n value: function value() {\n var t = arguments.length > 0 && arguments[0] !== e ? arguments[0] : function () {};\n document.removeEventListener(\"keydown\", this), window.removeEventListener(\"resize\", this), u(this._utilsGroup.childNodes, {\n fromOpacity: 1,\n opacity: 0,\n duration: 250\n }), u(this._btnGroup.childNodes, {\n fromOpacity: 1,\n opacity: 0,\n delay: 200,\n duration: 350\n }), u([this._stage, this._previewWrapper], {\n fromPosition: [0, 0, 0],\n position: [0, -250, 0],\n fromOpacity: 1,\n opacity: 0,\n easing: \"spring\",\n springConstant: .3,\n springDeceleration: .75,\n delay: 250,\n allDone: function allDone() {\n t();\n }\n });\n }\n }, {\n key: \"destroy\",\n value: function value() {\n var t = this;\n St(this._btnGroup.children).forEach(function (e) {\n e.removeEventListener(\"click\", t);\n }), i.forEach(function (e) {\n t._cropper.element.removeEventListener(e, t);\n }), this._cropper.destroy(), this._element.parentNode && Et(this._element);\n }\n }, {\n key: \"showRotateButton\",\n set: function set(t) {\n t ? this._element.classList.remove(\"slim-rotation-disabled\") : this._element.classList.add(\"slim-rotation-disabled\");\n }\n }, {\n key: \"element\",\n get: function get() {\n return this._element;\n }\n }, {\n key: \"ratio\",\n get: function get() {\n return \"input\" === this._ratio ? this._input.height / this._input.width : this._ratio;\n }\n }, {\n key: \"offset\",\n get: function get() {\n return this._element.getBoundingClientRect();\n }\n }, {\n key: \"original\",\n get: function get() {\n return this._input;\n }\n }, {\n key: \"scalar\",\n get: function get() {\n return this._previewSize.width / this._input.width;\n }\n }], [{\n key: \"options\",\n value: function value() {\n return {\n buttonCancelClassName: null,\n buttonConfirmClassName: null,\n buttonCancelLabel: \"Cancel\",\n buttonConfirmLabel: \"Confirm\",\n buttonCancelTitle: null,\n buttonConfirmTitle: null,\n buttonRotateTitle: \"Rotate\",\n buttonRotateClassName: null,\n devicePixelRatio: null,\n minSize: {\n width: 0,\n height: 0\n }\n };\n }\n }]), n;\n }();\n return n.Buttons = [\"cancel\", \"confirm\"], n;\n }(Tt),\n Lt = function () {\n var i = [\"dragenter\", \"dragover\", \"dragleave\", \"drop\"];\n return function () {\n function n() {\n var i = arguments.length > 0 && arguments[0] !== e ? arguments[0] : document.createElement(\"div\");\n t(this, n), this._element = i, this._accept = [], this._allowURLs = !1, this._dragPath = null, this._init();\n }\n return p(n, [{\n key: \"isValidDataTransfer\",\n value: function value(t) {\n return t.files && t.files.length ? this.areValidDataTransferFiles(t.files) : t.items && t.items.length ? this.areValidDataTransferItems(t.items) : null;\n }\n }, {\n key: \"areValidDataTransferFiles\",\n value: function value(t) {\n return !this._accept.length || !t || this._accept.indexOf(t[0].type) !== -1;\n }\n }, {\n key: \"areValidDataTransferItems\",\n value: function value(t) {\n return !this._accept.length || !t || (this._allowURLs && \"string\" === t[0].kind ? null : t[0].type && 0 === t[0].type.indexOf(\"application\") ? null : this._accept.indexOf(t[0].type) !== -1);\n }\n }, {\n key: \"reset\",\n value: function value() {\n this._element.files = null;\n }\n }, {\n key: \"_init\",\n value: function value() {\n var t = this;\n this._element.className = \"slim-file-hopper\", i.forEach(function (e) {\n t._element.addEventListener(e, t);\n });\n }\n }, {\n key: \"handleEvent\",\n value: function value(t) {\n switch (t.type) {\n case \"dragenter\":\n case \"dragover\":\n this._onDragOver(t);\n break;\n case \"dragleave\":\n this._onDragLeave(t);\n break;\n case \"drop\":\n this._onDrop(t);\n }\n }\n }, {\n key: \"_onDrop\",\n value: function value(t) {\n t.preventDefault();\n var e = null;\n if (this._allowURLs) {\n var i = void 0,\n n = void 0;\n try {\n i = t.dataTransfer.getData(\"url\"), n = t.dataTransfer.getData(\"text/html\");\n } catch (t) {}\n if (n && n.length) {\n var o = n.match(/src\\s*=\\s*\"(.+?)\"/);\n o && (e = o[1]);\n } else i && i.length && (e = i);\n }\n if (e) this._element.files = [{\n remote: e\n }];else {\n var a = this.isValidDataTransfer(t.dataTransfer);\n if (!a) return this._element.dispatchEvent(new CustomEvent(\"file-invalid-drop\")), void (this._dragPath = null);\n this._element.files = t.dataTransfer.files;\n }\n this._element.dispatchEvent(new CustomEvent(\"file-drop\", {\n detail: m(t)\n })), this._element.dispatchEvent(new CustomEvent(\"change\")), this._dragPath = null;\n }\n }, {\n key: \"_onDragOver\",\n value: function value(t) {\n t.preventDefault(), t.dataTransfer.dropEffect = \"copy\";\n var e = this.isValidDataTransfer(t.dataTransfer);\n return null === e || e ? (this._dragPath || (this._dragPath = []), this._dragPath.push(m(t)), void this._element.dispatchEvent(new CustomEvent(\"file-over\", {\n detail: {\n x: T(this._dragPath).x,\n y: T(this._dragPath).y\n }\n }))) : (t.dataTransfer.dropEffect = \"none\", void this._element.dispatchEvent(new CustomEvent(\"file-invalid\")));\n }\n }, {\n key: \"_onDragLeave\",\n value: function value(t) {\n this._element.dispatchEvent(new CustomEvent(\"file-out\", {\n detail: m(t)\n })), this._dragPath = null;\n }\n }, {\n key: \"destroy\",\n value: function value() {\n var t = this;\n i.forEach(function (e) {\n t._element.removeEventListener(e, t);\n }), Et(this._element), this._element = null, this._dragPath = null, this._accept = null;\n }\n }, {\n key: \"element\",\n get: function get() {\n return this._element;\n }\n }, {\n key: \"dragPath\",\n get: function get() {\n return this._dragPath;\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return \"\" === this._element.style.display;\n },\n set: function set(t) {\n this._element.style.display = t ? \"\" : \"none\";\n }\n }, {\n key: \"allowURLs\",\n set: function set(t) {\n this._allowURLs = t;\n }\n }, {\n key: \"accept\",\n set: function set(t) {\n this._accept = t;\n },\n get: function get() {\n return this._accept;\n }\n }]), n;\n }();\n }(),\n Ot = function () {\n return function () {\n function i() {\n t(this, i), this._element = null, this._inner = null, this._init();\n }\n return p(i, [{\n key: \"_init\",\n value: function value() {\n this._element = k(\"div\", \"slim-popover\"), this._element.setAttribute(\"data-state\", \"off\"), document.body.appendChild(this._element), this._element.addEventListener(\"touchmove\", function (t) {\n t.preventDefault();\n }, !0);\n }\n }, {\n key: \"show\",\n value: function value() {\n var t = this,\n i = arguments.length > 0 && arguments[0] !== e ? arguments[0] : function () {};\n this._element.setAttribute(\"data-state\", \"on\"), u(this._element, {\n fromOpacity: 0,\n opacity: 1,\n duration: 350,\n complete: function complete() {\n z(t._element), i();\n }\n });\n }\n }, {\n key: \"hide\",\n value: function value() {\n var t = this,\n i = arguments.length > 0 && arguments[0] !== e ? arguments[0] : function () {};\n u(this._element, {\n fromOpacity: 1,\n opacity: 0,\n duration: 500,\n complete: function complete() {\n z(t._element), t._element.setAttribute(\"data-state\", \"off\"), i();\n }\n });\n }\n }, {\n key: \"destroy\",\n value: function value() {\n this._element.parentNode && (this._element.parentNode.removeChild(this._element), this._element = null, this._inner = null);\n }\n }, {\n key: \"inner\",\n set: function set(t) {\n this._inner = t, this._element.firstChild && this._element.removeChild(this._element.firstChild), this._element.appendChild(this._inner);\n }\n }, {\n key: \"className\",\n set: function set(t) {\n this._element.className = \"slim-popover\" + (null === t ? \"\" : \" \" + t);\n }\n }]), i;\n }();\n }(),\n zt = function zt(t, e) {\n return t.split(e).map(function (t) {\n return parseInt(t, 10);\n });\n },\n Dt = function Dt(t) {\n return \"DIV\" === t.nodeName || \"SPAN\" === t.nodeName;\n },\n At = {\n AUTO: \"auto\",\n INITIAL: \"initial\",\n MANUAL: \"manual\"\n },\n Ut = [\"x\", \"y\", \"width\", \"height\"],\n Ht = [\"file-invalid-drop\", \"file-invalid\", \"file-drop\", \"file-over\", \"file-out\", \"click\"],\n Nt = [\"cancel\", \"confirm\"],\n Bt = [\"remove\", \"edit\", \"download\", \"upload\"],\n Ft = null,\n Wt = 0,\n qt = '\\n<div class=\"slim-loader\">\\n\\t<svg>\\n\\t\\t<path class=\"slim-loader-background\" fill=\"none\" stroke-width=\"3\" />\\n\\t\\t<path class=\"slim-loader-foreground\" fill=\"none\" stroke-width=\"3\" />\\n\\t</svg>\\n</div>\\n',\n jt = '\\n<div class=\"slim-upload-status\"></div>\\n',\n Vt = function Vt(t) {\n var e = t.split(\",\");\n return {\n width: parseInt(e[0], 10),\n height: parseInt(e[1], 10)\n };\n },\n Gt = function () {\n function i(n) {\n var o = arguments.length > 1 && arguments[1] !== e ? arguments[1] : {};\n t(this, i), Ft || (Ft = new Ot()), this._uid = Wt++, this._options = g(i.options(), o), this._options.forceSize && (\"string\" == typeof this._options.forceSize && (this._options.forceSize = Vt(this._options.forceSize)), this._options.ratio = this._options.forceSize.width + \":\" + this._options.forceSize.height, this._options.size = mt(this._options.forceSize)), \"string\" == typeof this._options.size && (this._options.size = Vt(this._options.size)), \"string\" == typeof this._options.minSize && (this._options.minSize = Vt(this._options.minSize)), \"string\" == typeof this._options.post && (this._options.post = this._options.post.split(\",\").map(function (t) {\n return t.trim();\n })), this._originalElement = n, this._originalElementInner = n.innerHTML, this._originalElementAttributes = _(n), Dt(n) ? this._element = n : (this._element = Ct(n), this._element.className = n.className, n.className = \"\", this._element.setAttribute(\"data-ratio\", this._options.ratio)), this._element.classList.add(\"slim\"), this._element.setAttribute(\"data-state\", \"init\"), this._state = [], this._timers = [], this._input = null, this._inputReference = null, this._output = null, this._ratio = null, this._isRequired = !1, this._imageHopper = null, this._imageEditor = null, this._progressEnabled = !0, this._data = {}, this._resetData(), this._drip = null, this._hasInitialImage = !1, this._initialCrop = this._options.crop, this._initialRotation = this._options.rotation && this._options.rotation % 90 === 0 ? this._options.rotation : null, this._isBeingDestroyed = !1, i.supported ? this._init() : this._fallback();\n }\n return p(i, [{\n key: \"setRotation\",\n value: function value(t, e) {\n if (\"number\" == typeof t || t % 90 === 0) {\n this._data.actions.rotation = t;\n var i = this._data.actions.rotation % 180 !== 0;\n if (this._data.input.image) {\n var n = i ? this._data.input.image.height : this._data.input.image.width,\n o = i ? this._data.input.image.width : this._data.input.image.height;\n this._data.actions.crop = tt(n, o, this._ratio), this._data.actions.crop.type = At.AUTO;\n }\n this._data.input.image && e && this._manualTransform(e);\n }\n }\n }, {\n key: \"setSize\",\n value: function value(t, e) {\n \"string\" == typeof t && (t = Vt(t)), t && t.width && t.height && (this._options.size = mt(t), this._data.actions.size = mt(t), this._data.input.image && e && this._manualTransform(e));\n }\n }, {\n key: \"setForceSize\",\n value: function value(t, e) {\n \"string\" == typeof t && (t = Vt(t)), t && t.width && t.height && (this._options.size = mt(t), this._options.forceSize = mt(t), this._data.actions.size = mt(t), this.setRatio(this._options.forceSize.width + \":\" + this._options.forceSize.height, e));\n }\n }, {\n key: \"setRatio\",\n value: function value(t, e) {\n var i = this;\n if (t && \"string\" == typeof t && (this._options.ratio = t, this._isFixedRatio())) {\n var n = zt(this._options.ratio, \":\");\n this._ratio = n[1] / n[0], this._data.input.image && e ? this._cropAuto(function (t) {\n i._scaleDropArea(i._ratio), e && e(t);\n }) : (this._data.input.image && (this._data.actions.crop = tt(this._data.input.image.width, this._data.input.image.height, this._ratio), this._data.actions.crop.type = At.AUTO), this._scaleDropArea(this._ratio), e && e(null));\n }\n }\n }, {\n key: \"isAttachedTo\",\n value: function value(t) {\n return this._element === t || this._originalElement === t;\n }\n }, {\n key: \"isDetached\",\n value: function value() {\n return null === this._element.parentNode;\n }\n }, {\n key: \"load\",\n value: function value(t) {\n var i = arguments.length > 1 && arguments[1] !== e ? arguments[1] : {},\n n = arguments[2];\n \"function\" == typeof i ? n = i : (this._options.crop = i.crop, this._options.rotation = i.rotation, this._initialRotation = i.rotation && i.rotation % 90 === 0 ? i.rotation : null, this._initialCrop = this._options.crop), this._load(t, n, {\n blockPush: i.blockPush\n });\n }\n }, {\n key: \"upload\",\n value: function value(t) {\n this._doUpload(t);\n }\n }, {\n key: \"download\",\n value: function value() {\n this._doDownload();\n }\n }, {\n key: \"remove\",\n value: function value() {\n return this._doRemove();\n }\n }, {\n key: \"destroy\",\n value: function value() {\n this._doDestroy();\n }\n }, {\n key: \"edit\",\n value: function value() {\n this._doEdit();\n }\n }, {\n key: \"crop\",\n value: function value(t, e) {\n this._crop(t.x, t.y, t.width, t.height, e);\n }\n }, {\n key: \"containsImage\",\n value: function value() {\n return null !== this._data.input.name;\n }\n }, {\n key: \"_canInstantEdit\",\n value: function value() {\n return this._options.instantEdit && !this._isInitialising;\n }\n }, {\n key: \"_getFileInput\",\n value: function value() {\n return this._element.querySelector(\"input[type=file]\");\n }\n }, {\n key: \"_getInitialImage\",\n value: function value() {\n return this._element.querySelector(\"img\");\n }\n }, {\n key: \"_getInputElement\",\n value: function value() {\n return this._getFileInput() || this._getInitialImage();\n }\n }, {\n key: \"_getRatioSpacerElement\",\n value: function value() {\n return this._element.children[0];\n }\n }, {\n key: \"_isImageOnly\",\n value: function value() {\n return \"INPUT\" !== this._input.nodeName;\n }\n }, {\n key: \"_isFixedRatio\",\n value: function value() {\n return this._options.ratio.indexOf(\":\") !== -1;\n }\n }, {\n key: \"_isAutoCrop\",\n value: function value() {\n return this._data.actions.crop.type === At.AUTO;\n }\n }, {\n key: \"_toggleButton\",\n value: function value(t, e) {\n xt('.slim-btn[data-action=\"' + t + '\"]', e, this._element);\n }\n }, {\n key: \"_clearState\",\n value: function value() {\n this._state = [], this._updateState();\n }\n }, {\n key: \"_removeState\",\n value: function value(t) {\n this._state = this._state.filter(function (e) {\n return e !== t;\n }), this._updateState();\n }\n }, {\n key: \"_addState\",\n value: function value(t) {\n L(t, this._state) || (this._state.push(t), this._updateState());\n }\n }, {\n key: \"_updateState\",\n value: function value() {\n this._element && this._element.setAttribute(\"data-state\", this._state.join(\",\"));\n }\n }, {\n key: \"_resetData\",\n value: function value() {\n this._data = {\n server: null,\n meta: mt(this._options.meta),\n input: {\n field: this._inputReference,\n name: null,\n type: null,\n width: 0,\n height: 0,\n file: null\n },\n output: {\n image: null,\n width: 0,\n height: 0\n },\n actions: {\n rotation: null,\n crop: null,\n size: null\n }\n }, this._output && (this._output.value = \"\"), _t(this._getFileInput());\n }\n }, {\n key: \"_init\",\n value: function value() {\n var t = this;\n if (this._isInitialising = !0, this._addState(\"empty\"), L(\"input\", this._options.post) && (this._inputReference = \"slim_input_\" + this._uid), this._input = this._getInputElement(), this._input || (this._input = k(\"input\"), this._input.type = \"file\", this._element.appendChild(this._input)), this._isRequired = this._input.required === !0, this._output = this._element.querySelector(\"input[type=hidden]\"), this._output) {\n var e = null;\n try {\n e = JSON.parse(this._output.value);\n } catch (i) {}\n if (e) {\n var n = new Image();\n n.src = e.output.image, n.setAttribute(\"data-filename\", e.output.name), this._element.insertBefore(n, this._element.firstChild);\n }\n } else this._output = k(\"input\"), this._output.type = \"hidden\", this._output.name = this._input.name || this._options.defaultInputName, this._element.appendChild(this._output);\n this._input.removeAttribute(\"name\");\n var o = k(\"div\", \"slim-area\"),\n a = this._getInitialImage(),\n r = (a || {}).src,\n s = a ? a.getAttribute(\"data-filename\") : null;\n r ? this._hasInitialImage = !0 : (this._initialCrop = null, this._initialRotation = null);\n var h = '\\n\\t\\t<div class=\"slim-result\">\\n\\t\\t\\t<img class=\"in\" style=\"opacity:0\" ' + (r ? 'src=\"' + r + '\"' : \"\") + '><img><img style=\"opacity:0\">\\n\\t\\t</div>';\n if (this._isImageOnly()) o.innerHTML = \"\\n\\t\\t\\t\\t\" + qt + \"\\n\\t\\t\\t\\t\" + jt + \"\\n\\t\\t\\t\\t\" + h + '\\n\\t\\t\\t\\t<div class=\"slim-status\"><div class=\"slim-label-loading\">' + (this._options.labelLoading || \"\") + \"</div></div>\\n\\t\\t\\t\";else {\n L(\"input\", this._options.post) && (this._data.input.field = this._inputReference, this._options.service || (this._input.name = this._inputReference));\n var u = void 0;\n this._input.hasAttribute(\"accept\") && \"image/*\" !== this._input.getAttribute(\"accept\") ? u = this._input.accept.split(\",\").map(function (t) {\n return t.trim();\n }).filter(function (t) {\n return t.length > 0;\n }) : (u = A(), this._input.setAttribute(\"accept\", u.join(\",\"))), this._imageHopper = new Lt(), this._imageHopper.accept = u, this._imageHopper.allowURLs = \"string\" == typeof this._options.fetcher, this._element.appendChild(this._imageHopper.element), Ht.forEach(function (e) {\n t._imageHopper.element.addEventListener(e, t);\n }), o.innerHTML = \"\\n\\t\\t\\t\\t\" + qt + \"\\n\\t\\t\\t\\t\" + jt + '\\n\\t\\t\\t\\t<div class=\"slim-drip\"><span><span></span></span></div>\\n\\t\\t\\t\\t<div class=\"slim-status\"><div class=\"slim-label\">' + (this._options.label || \"\") + '</div><div class=\"slim-label-loading\">' + (this._options.labelLoading || \"\") + \"</div></div>\\n\\t\\t\\t\\t\" + h + \"\\n\\t\\t\\t\", this._input.addEventListener(\"change\", this);\n }\n if (this._element.appendChild(o), this._btnGroup = k(\"div\", \"slim-btn-group\"), this._btnGroup.style.display = \"none\", this._element.appendChild(this._btnGroup), Bt.filter(function (e) {\n return t._isButtonAllowed(e);\n }).forEach(function (e) {\n var i = R(e),\n n = t._options[\"button\" + i + \"Label\"],\n o = t._options[\"button\" + i + \"Title\"] || n,\n a = t._options[\"button\" + i + \"ClassName\"],\n r = k(\"button\", \"slim-btn slim-btn-\" + e + (a ? \" \" + a : \"\"));\n r.innerHTML = n, r.title = o, r.type = \"button\", r.addEventListener(\"click\", t), r.setAttribute(\"data-action\", e), t._btnGroup.appendChild(r);\n }), this._isFixedRatio()) {\n var l = zt(this._options.ratio, \":\");\n this._ratio = l[1] / l[0], this._scaleDropArea(this._ratio);\n }\n this._updateProgress(.5), r ? this._load(r, function () {\n t._onInit();\n }, {\n name: s\n }) : this._onInit();\n }\n }, {\n key: \"_onInit\",\n value: function value() {\n var t = this;\n this._isInitialising = !1;\n var e = function e() {\n var e = setTimeout(function () {\n t._options.didInit.apply(t, [t.data, t]);\n }, 0);\n t._timers.push(e);\n };\n this._options.saveInitialImage && this.containsImage() ? this._options.service || this._save(function () {\n e();\n }, !1) : (this._options.service && this.containsImage() && this._toggleButton(\"upload\", !1), e());\n }\n }, {\n key: \"_updateProgress\",\n value: function value(t) {\n if (t = Math.min(.99999, t), this._element && this._progressEnabled) {\n var e = this._element.querySelector(\".slim-loader\");\n if (e) {\n var i = e.offsetWidth,\n n = e.querySelectorAll(\"path\"),\n o = parseInt(n[0].getAttribute(\"stroke-width\"), 10);\n n[0].setAttribute(\"d\", Rt(.5 * i, .5 * i, .5 * i - o, .9999)), n[1].setAttribute(\"d\", Rt(.5 * i, .5 * i, .5 * i - o, t));\n }\n }\n }\n }, {\n key: \"_startProgress\",\n value: function value(t) {\n var e = this;\n if (this._element) {\n this._progressEnabled = !1;\n var i = this._element.querySelector(\".slim-loader\");\n if (i) {\n var n = i.children[0];\n this._stopProgressLoop(function () {\n i.removeAttribute(\"style\"), n.removeAttribute(\"style\"), e._progressEnabled = !0, e._updateProgress(0), e._progressEnabled = !1, u(n, {\n fromOpacity: 0,\n opacity: 1,\n duration: 250,\n complete: function complete() {\n e._progressEnabled = !0, t && t();\n }\n });\n });\n }\n }\n }\n }, {\n key: \"_stopProgress\",\n value: function value() {\n var t = this;\n if (this._element) {\n var e = this._element.querySelector(\".slim-loader\");\n if (e) {\n var i = e.children[0];\n this._updateProgress(1), u(i, {\n fromOpacity: 1,\n opacity: 0,\n duration: 250,\n complete: function complete() {\n e.removeAttribute(\"style\"), i.removeAttribute(\"style\"), t._updateProgress(.5), t._progressEnabled = !1;\n }\n });\n }\n }\n }\n }, {\n key: \"_startProgressLoop\",\n value: function value() {\n if (this._element) {\n var t = this._element.querySelector(\".slim-loader\");\n if (t) {\n var e = t.children[0];\n t.removeAttribute(\"style\"), e.removeAttribute(\"style\"), this._updateProgress(.5);\n var i = 1e3;\n u(t, \"stop\"), u(t, {\n rotation: [0, 0, -(2 * Math.PI) * i],\n easing: \"linear\",\n duration: 1e3 * i\n }), u(e, {\n fromOpacity: 0,\n opacity: 1,\n duration: 250\n });\n }\n }\n }\n }, {\n key: \"_stopProgressLoop\",\n value: function value(t) {\n if (this._element) {\n var e = this._element.querySelector(\".slim-loader\");\n if (e) {\n var i = e.children[0];\n u(i, {\n fromOpacity: parseFloat(i.style.opacity),\n opacity: 0,\n duration: 250,\n complete: function complete() {\n u(e, \"stop\"), e.removeAttribute(\"style\"), i.removeAttribute(\"style\"), t && t();\n }\n });\n }\n }\n }\n }, {\n key: \"_isButtonAllowed\",\n value: function value(t) {\n return \"edit\" === t ? this._options.edit : \"download\" === t ? this._options.download : \"upload\" === t ? !!this._options.service && !this._options.push : \"remove\" !== t || !this._isImageOnly();\n }\n }, {\n key: \"_fallback\",\n value: function value() {\n var t = k(\"div\", \"slim-area\");\n t.innerHTML = '\\n\\t\\t\\t<div class=\"slim-status\"><div class=\"slim-label\">' + (this._options.label || \"\") + \"</div></div>\\n\\t\\t\", this._element.appendChild(t), this._throwError(this._options.statusNoSupport);\n }\n }, {\n key: \"handleEvent\",\n value: function value(t) {\n switch (t.type) {\n case \"click\":\n this._onClick(t);\n break;\n case \"change\":\n this._onChange(t);\n break;\n case \"cancel\":\n this._onCancel(t);\n break;\n case \"confirm\":\n this._onConfirm(t);\n break;\n case \"file-over\":\n this._onFileOver(t);\n break;\n case \"file-out\":\n this._onFileOut(t);\n break;\n case \"file-drop\":\n this._onDropFile(t);\n break;\n case \"file-invalid\":\n this._onInvalidFile(t);\n break;\n case \"file-invalid-drop\":\n this._onInvalidFileDrop(t);\n }\n }\n }, {\n key: \"_getIntro\",\n value: function value() {\n return this._element.querySelector(\".slim-result .in\");\n }\n }, {\n key: \"_getOutro\",\n value: function value() {\n return this._element.querySelector(\".slim-result .out\");\n }\n }, {\n key: \"_getInOut\",\n value: function value() {\n return this._element.querySelectorAll(\".slim-result img\");\n }\n }, {\n key: \"_getDrip\",\n value: function value() {\n return this._drip || (this._drip = this._element.querySelector(\".slim-drip > span\")), this._drip;\n }\n }, {\n key: \"_throwError\",\n value: function value(t) {\n this._addState(\"error\"), this._element.querySelector(\".slim-label\").style.display = \"none\";\n var e = this._element.querySelector(\".slim-error\");\n e || (e = k(\"div\", \"slim-error\"), this._element.querySelector(\".slim-status\").appendChild(e)), e.innerHTML = t, this._options.didThrowError.apply(this, [t]);\n }\n }, {\n key: \"_removeError\",\n value: function value() {\n this._removeState(\"error\"), this._element.querySelector(\".slim-label\").style.display = \"\";\n var t = this._element.querySelector(\".slim-error\");\n t && t.parentNode.removeChild(t);\n }\n }, {\n key: \"_openFileDialog\",\n value: function value() {\n this._removeError(), this._input.click();\n }\n }, {\n key: \"_onClick\",\n value: function value(t) {\n var e = this,\n i = t.target.classList,\n n = t.target;\n if (i.contains(\"slim-file-hopper\")) return t.preventDefault(), void this._openFileDialog();\n switch (n.getAttribute(\"data-action\")) {\n case \"remove\":\n this._options.willRemove.apply(this, [this.data, function () {\n e._doRemove();\n }]);\n break;\n case \"edit\":\n this._doEdit();\n break;\n case \"download\":\n this._doDownload();\n break;\n case \"upload\":\n this._doUpload();\n }\n }\n }, {\n key: \"_onInvalidFileDrop\",\n value: function value() {\n this._onInvalidFile(), this._removeState(\"file-over\");\n var t = this._getDrip();\n u(t.firstChild, {\n fromScale: [.5, .5],\n scale: [0, 0],\n fromOpacity: .5,\n opacity: 0,\n duration: 150,\n complete: function complete() {\n z(t.firstChild);\n }\n });\n }\n }, {\n key: \"_onInvalidFile\",\n value: function value() {\n var t = this._imageHopper.accept.map(H),\n e = this._options.statusFileType.replace(\"$0\", t.join(\", \"));\n this._throwError(e);\n }\n }, {\n key: \"_onImageTooSmall\",\n value: function value() {\n var t = this._options.statusImageTooSmall.replace(\"$0\", this._options.minSize.width + \" × \" + this._options.minSize.height);\n this._throwError(t);\n }\n }, {\n key: \"_onOverWeightFile\",\n value: function value() {\n var t = this._options.statusFileSize.replace(\"$0\", this._options.maxFileSize);\n this._throwError(t);\n }\n }, {\n key: \"_onLocalURLProblem\",\n value: function value(t) {\n this._throwError(this._options.statusLocalUrlProblem || t);\n }\n }, {\n key: \"_onRemoteURLProblem\",\n value: function value(t) {\n this._throwError(t);\n }\n }, {\n key: \"_onFileOver\",\n value: function value(t) {\n this._addState(\"file-over\"), this._removeError();\n var e = this._getDrip(),\n i = u.createMatrix();\n i.translate(t.detail.x, t.detail.y, 0), u.setElementTransform(e, i), 1 == this._imageHopper.dragPath.length && (e.style.opacity = 1, u(e.firstChild, {\n fromOpacity: 0,\n opacity: .5,\n fromScale: [0, 0],\n scale: [.5, .5],\n duration: 150\n }));\n }\n }, {\n key: \"_onFileOut\",\n value: function value(t) {\n this._removeState(\"file-over\"), this._removeState(\"file-invalid\"), this._removeError();\n var e = this._getDrip(),\n i = u.createMatrix();\n i.translate(t.detail.x, t.detail.y, 0), u.setElementTransform(e, i), u(e.firstChild, {\n fromScale: [.5, .5],\n scale: [0, 0],\n fromOpacity: .5,\n opacity: 0,\n duration: 150,\n complete: function complete() {\n z(e.firstChild);\n }\n });\n }\n }, {\n key: \"_onDropFile\",\n value: function value(t) {\n var e = this;\n this._removeState(\"file-over\");\n var i = this._getDrip(),\n n = u.createMatrix();\n n.translate(t.detail.x, t.detail.y, 0), u.setElementTransform(i, n);\n var o = this._imageHopper.dragPath.length,\n a = this._imageHopper.dragPath[o - Math.min(10, o)],\n r = t.detail.x - a.x,\n s = t.detail.y - a.y;\n u(i, {\n fromPosition: [t.detail.x, t.detail.y, 0],\n position: [t.detail.x + r, t.detail.y + s, 0],\n duration: 200\n }), u(i.firstChild, {\n fromScale: [.5, .5],\n scale: [2, 2],\n fromOpacity: 1,\n opacity: 0,\n duration: 200,\n complete: function complete() {\n z(i.firstChild), e._load(t.target.files[0]);\n }\n });\n }\n }, {\n key: \"_onChange\",\n value: function value(t) {\n t.target.files.length && this._load(t.target.files[0]);\n }\n }, {\n key: \"_load\",\n value: function value(t, i) {\n var n = this,\n o = arguments.length > 2 && arguments[2] !== e ? arguments[2] : {};\n if (!this._isBeingDestroyed) {\n if (this.containsImage()) return clearTimeout(this._replaceTimeout), void this._doRemove(function () {\n n._replaceTimeout = setTimeout(function () {\n n._load(t, i, o);\n }, 100);\n });\n this._removeState(\"empty\"), this._addState(\"busy\"), this._startProgressLoop(), this._imageHopper && (this._imageHopper.enabled = !1), clearTimeout(this._loadTimeout);\n var a = function a() {\n clearTimeout(n._loadTimeout), n._loadTimeout = setTimeout(function () {\n n._isBeingDestroyed || (n._addState(\"loading\"), u(n._element.querySelector(\".slim-label-loading\"), {\n fromOpacity: 0,\n opacity: 1,\n duration: 250\n }));\n }, 500);\n },\n r = function r() {\n n._imageHopper && (n._imageHopper.enabled = !0), n._removeState(\"loading\"), n._removeState(\"busy\"), n._addState(\"empty\"), n._stopProgressLoop();\n };\n if (\"string\" == typeof t) return void (X(t) ? this._load(Z(t), i, o) : (a(), J(t, this._options.willLoad, function (t) {\n n._load(t, i, o);\n }, function (t) {\n setTimeout(function () {\n r(), n._onLocalURLProblem(\"<p>\" + t + \"</p>\"), i && i.apply(n, [\"local-url-problem\"]);\n }, 500);\n })));\n if (\"undefined\" != typeof t.remote) return X(t.remote) ? void this._load(Z(t.remote), i, o) : void (this._options.fetcher && Y(this._options.fetcher, this._options.willFetch, this._options.willLoad, t.remote, function (t) {\n r(), n._onRemoteURLProblem(\"<p>\" + t + \"</p>\"), i && i.apply(n, [\"remote-url-problem\"]);\n }, function (t) {\n n._load(t, i, o);\n }));\n var s = t;\n if (this._imageHopper && this._imageHopper.accept.indexOf(s.type) === -1) return r(), this._onInvalidFile(), void (i && i.apply(this, [\"file-invalid\"]));\n if (s.size && this._options.maxFileSize && D(s.size) > this._options.maxFileSize) return r(), this._onOverWeightFile(), void (i && i.apply(this, [\"file-too-big\"]));\n this._imageEditor && this._imageEditor.dirty(), this._data.input.name = o && o.name ? o.name : q(s), this._data.input.type = j(s), this._data.input.size = s.size, this._data.input.file = s, Q(s, this._options.internalCanvasSize, function (t, e) {\n var a = function a() {\n n._imageHopper && (n._imageHopper.enabled = !0), n._removeState(\"loading\"), n._removeState(\"busy\"), n._addState(\"empty\"), n._stopProgressLoop(), n._resetData();\n };\n if (!t) return a(), void (i && i.apply(n, [\"file-not-found\"]));\n if (!ct(t, n._options.minSize)) return a(), n._onImageTooSmall(), void (i && i.apply(n, [\"image-too-small\"]));\n var r = n._options.didLoad.apply(n, [s, t, e, n]);\n if (r !== !0) return a(), r !== !1 && n._throwError(r), void (i && i.apply(n, [r]));\n n._removeState(\"loading\");\n var h = function h(t) {\n n._imageHopper && n._options.dropReplace && (n._imageHopper.enabled = !0);\n var e = n._getIntro(),\n i = {\n fromScale: [1.25, 1.25],\n scale: [1, 1],\n fromOpacity: 0,\n opacity: 1,\n complete: function complete() {\n z(e), e.style.opacity = 1, t();\n }\n };\n n.isDetached() ? i.duration = 1 : (i.easing = \"spring\", i.springConstant = .3, i.springDeceleration = .7), n._canInstantEdit() && (i.delay = 500, i.duration = 1, n._doEdit()), u(e, i);\n };\n n._loadCanvas(t, function (t) {\n n._addState(\"preview\"), h(function () {\n n._canInstantEdit() || t || n._showButtons(), t || (n._stopProgressLoop(), n._removeState(\"busy\")), i && i.apply(n, [null, n.data]);\n });\n }, function () {\n n._canInstantEdit() || n._showButtons(), n._removeState(\"busy\");\n }, {\n blockPush: o.blockPush\n });\n });\n }\n }\n }, {\n key: \"_loadCanvas\",\n value: function value(t, e, i, n) {\n var o = this;\n if (n || (n = {}), !this._isBeingDestroyed) {\n this._data.input.image = t, this._data.input.width = t.width, this._data.input.height = t.height, this._initialRotation && (this._data.actions.rotation = this._initialRotation, this._initialRotation = null);\n var a = this._data.actions.rotation % 180 !== 0;\n this._isFixedRatio() || (this._initialCrop ? this._ratio = this._initialCrop.height / this._initialCrop.width : this._ratio = a ? t.width / t.height : t.height / t.width, this._scaleDropArea(this._ratio));\n var r = function r() {\n o._options.size && (o._data.actions.size = {\n width: o._options.size.width,\n height: o._options.size.height\n }), o._applyTransforms(t, function (t) {\n var a = o._getIntro(),\n r = a.offsetWidth / t.width,\n s = !1;\n o._options.service && o._options.push && !n.blockPush && (o._hasInitialImage || o._canInstantEdit() || (s = !0, o._stopProgressLoop(function () {\n o._startProgress(function () {\n o._updateProgress(.1);\n });\n }))), o._canInstantEdit() || o._save(function () {\n o._isBeingDestroyed || s && (o._stopProgress(), i());\n }, s);\n var h = \"auto\" === o._options.devicePixelRatio ? window.devicePixelRatio : o._options.devicePixelRatio;\n a.src = \"\", a.src = ht(t, r * h).toDataURL(), a.onload = function () {\n a.onload = null, o._isBeingDestroyed || e && e(s);\n };\n });\n };\n this._initialCrop ? (this._data.actions.crop = mt(this._initialCrop), this._data.actions.crop.type = At.INITIAL, this._initialCrop = null, r()) : this._options.willCropInitial.apply(this, [this.data, function (e) {\n e ? (o._data.actions.crop = e, o._data.actions.crop.type = At.INITIAL) : (o._data.actions.crop = tt(a ? t.height : t.width, a ? t.width : t.height, o._ratio), o._data.actions.crop.type = At.AUTO), r();\n }, this]);\n }\n }\n }, {\n key: \"_applyTransforms\",\n value: function value(t, e) {\n var i = this,\n n = mt(this._data.actions);\n n.filters = {\n sharpen: this._options.filterSharpen / 100\n }, this._options.forceMinSize ? n.minSize = this._options.minSize : n.minSize = {\n width: 0,\n height: 0\n }, et(t, n, function (t) {\n var n = t;\n if (i._options.forceSize || i._options.size && 1 == rt(i._options.size, t)) {\n n = k(\"canvas\"), n.width = i._options.size.width, n.height = i._options.size.height;\n var o = n.getContext(\"2d\");\n o.drawImage(t, 0, 0, i._options.size.width, i._options.size.height);\n }\n if (i._options.forceMinSize && i._options.size && i._options.minSize.width === i._options.size.width && i._options.minSize.height === i._options.size.height && (n.width < i._options.minSize.width || n.height < i._options.minSize.height)) {\n var a = Math.max(n.width, i._options.minSize.width),\n r = Math.max(n.height, i._options.minSize.height);\n n = k(\"canvas\"), n.width = a, n.height = r;\n var s = n.getContext(\"2d\");\n s.drawImage(t, 0, 0, a, r);\n }\n if (i._options.forceMinSize && 1 === i._ratio && (n.width < i._options.minSize.width || n.height < i._options.minSize.height)) {\n n = k(\"canvas\"), n.width = i._options.minSize.width, n.height = i._options.minSize.height;\n var h = n.getContext(\"2d\");\n h.drawImage(t, 0, 0, n.width, n.height);\n }\n i._data.output.width = n.width, i._data.output.height = n.height, i._data.output.image = n, i._onTransformCanvas(function (t) {\n i._data = t, i._options.didTransform.apply(i, [i.data, i]), e(i._data.output.image);\n });\n });\n }\n }, {\n key: \"_onTransformCanvas\",\n value: function value(t) {\n this._options.willTransform.apply(this, [this.data, t, this]);\n }\n }, {\n key: \"_appendEditor\",\n value: function value() {\n var t = this;\n this._imageEditor || (this._imageEditor = new It(k(\"div\"), {\n minSize: this._options.minSize,\n devicePixelRatio: this._options.devicePixelRatio,\n buttonConfirmClassName: this._options.buttonConfirmClassName,\n buttonCancelClassName: this._options.buttonCancelClassName,\n buttonRotateClassName: this._options.buttonRotateClassName,\n buttonConfirmLabel: this._options.buttonConfirmLabel,\n buttonCancelLabel: this._options.buttonCancelLabel,\n buttonRotateLabel: this._options.buttonRotateLabel,\n buttonConfirmTitle: this._options.buttonConfirmTitle,\n buttonCancelTitle: this._options.buttonCancelTitle,\n buttonRotateTitle: this._options.buttonRotateTitle\n }), Nt.forEach(function (e) {\n t._imageEditor.element.addEventListener(e, t);\n }));\n }\n }, {\n key: \"_scaleDropArea\",\n value: function value(t) {\n var e = this._getRatioSpacerElement();\n e && this._element && (e.style.marginBottom = 100 * t + \"%\", this._element.setAttribute(\"data-ratio\", \"1:\" + t));\n }\n }, {\n key: \"_onCancel\",\n value: function value(t) {\n this._removeState(\"editor\"), this._options.didCancel.apply(this, [this]), this._showButtons(), this._hideEditor(), this._options.instantEdit && !this._hasInitialImage && this._isAutoCrop() && this._doRemove();\n }\n }, {\n key: \"_onConfirm\",\n value: function value(t) {\n var e = this,\n i = this._options.service && this._options.push;\n i ? this._startProgress(function () {\n e._updateProgress(.1);\n }) : this._startProgressLoop(), this._removeState(\"editor\"), this._addState(\"busy\"), this._output.value = \"\", this._data.actions.rotation = t.detail.rotation, this._data.actions.crop = t.detail.crop, this._data.actions.crop.type = At.MANUAL, this._applyTransforms(this._data.input.image, function (t) {\n e._options.didConfirm.apply(e, [e.data, e]);\n var n = e._getInOut(),\n o = \"out\" === n[0].className ? n[0] : n[1],\n a = o === n[0] ? n[1] : n[0];\n o.className = \"in\", o.style.opacity = \"0\", o.style.zIndex = \"2\", a.className = \"out\", a.style.zIndex = \"1\";\n var r = \"auto\" === e._options.devicePixelRatio ? window.devicePixelRatio : e._options.devicePixelRatio;\n o.src = \"\", o.src = ht(t, o.offsetWidth / t.width * r).toDataURL(), o.onload = function () {\n o.onload = null, \"free\" === e._options.ratio && (e._ratio = o.naturalHeight / o.naturalWidth, e._scaleDropArea(e._ratio)), e._hideEditor();\n var t = setTimeout(function () {\n e._showPreview(o, function () {\n e._save(function (t, n, o) {\n e._toggleButton(\"upload\", !0), i ? e._stopProgress() : e._stopProgressLoop(), e._removeState(\"busy\"), e._showButtons();\n }, i);\n });\n }, 250);\n e._timers.push(t);\n };\n });\n }\n }, {\n key: \"_cropAuto\",\n value: function value() {\n var t = arguments.length > 0 && arguments[0] !== e ? arguments[0] : function (t) {},\n i = this._data.actions.rotation % 180 !== 0,\n n = tt(i ? this._data.input.image.height : this._data.input.image.width, i ? this._data.input.image.width : this._data.input.image.height, this._ratio);\n this._crop(n.x, n.y, n.width, n.height, t, At.AUTO);\n }\n }, {\n key: \"_crop\",\n value: function value(t, i, n, o) {\n var a = arguments.length > 4 && arguments[4] !== e ? arguments[4] : function (t) {},\n r = arguments.length > 5 && arguments[5] !== e ? arguments[5] : At.MANUAL;\n this._output.value = \"\", this._data.actions.crop = {\n x: t,\n y: i,\n width: n,\n height: o\n }, this._data.actions.crop.type = r, this._manualTransform(a);\n }\n }, {\n key: \"_manualTransform\",\n value: function value(t) {\n var e = this;\n this._startProgressLoop(), this._addState(\"busy\"), this._applyTransforms(this._data.input.image, function (i) {\n var n = e._getInOut(),\n o = \"out\" === n[0].className ? n[0] : n[1],\n a = o === n[0] ? n[1] : n[0];\n o.className = \"in\", o.style.opacity = \"1\", o.style.zIndex = \"2\", a.className = \"out\", a.style.zIndex = \"0\";\n var r = \"auto\" === e._options.devicePixelRatio ? window.devicePixelRatio : e._options.devicePixelRatio;\n o.src = \"\", o.src = ht(i, o.offsetWidth / i.width * r).toDataURL(), o.onload = function () {\n o.onload = null, \"free\" === e._options.ratio && (e._ratio = o.naturalHeight / o.naturalWidth, e._scaleDropArea(e._ratio));\n var i = e._options.service && e._options.push,\n n = function n() {\n e._save(function (n, o, a) {\n i || e._stopProgressLoop(), e._removeState(\"busy\"), t.apply(e, [e.data]);\n }, i);\n };\n i ? e._startProgress(n) : n();\n };\n });\n }\n }, {\n key: \"_save\",\n value: function value() {\n var t = this,\n i = arguments.length > 0 && arguments[0] !== e ? arguments[0] : function () {},\n n = !(arguments.length > 1 && arguments[1] !== e) || arguments[1];\n if (!this._isBeingDestroyed) {\n var o = this.dataBase64;\n this._options.service || this._isInitialising && !this._isImageOnly() || this._options.willSave.apply(this, [o, function (e) {\n t._store(e), t._options.didSave.apply(t, [e, t]);\n }, this]), this._isBeingDestroyed || (this._options.service && n && this._options.willSave.apply(this, [o, function (e) {\n t._addState(\"upload\"), t._imageHopper && t._options.dropReplace && (t._imageHopper.enabled = !1), t._upload(e, function (n, o) {\n t._imageHopper && t._options.dropReplace && (t._imageHopper.enabled = !0), n || t._storeServerResponse(o), t._options.didUpload.apply(t, [n, e, o, t]), t._removeState(\"upload\"), i(n, e, o);\n });\n }, this]), this._options.service && n || i());\n }\n }\n }, {\n key: \"_storeServerResponse\",\n value: function value(t) {\n this._isRequired && (this._input.required = !1), this._data.server = t, this._output.value = \"object\" === (\"undefined\" == typeof t ? \"undefined\" : c(t)) ? JSON.stringify(this._data.server) : t;\n }\n }, {\n key: \"_store\",\n value: function value(t) {\n this._isRequired && (this._input.required = !1), this._output.value = JSON.stringify(t);\n }\n }, {\n key: \"_upload\",\n value: function value(t, e) {\n var i = this;\n this.requestOutput(function (t, n) {\n var o = i._element.querySelector(\".slim-upload-status\"),\n a = i._options.willRequest,\n r = function r(t, e) {\n i._updateProgress(Math.max(.1, t / e));\n },\n s = function s(t) {\n var n = setTimeout(function () {\n if (!i._isBeingDestroyed) {\n o.innerHTML = i._options.statusUploadSuccess, o.setAttribute(\"data-state\", \"success\"), o.style.opacity = 1;\n var t = setTimeout(function () {\n o.style.opacity = 0;\n }, 2e3);\n i._timers.push(t);\n }\n }, 250);\n i._timers.push(n), e(null, t);\n },\n h = function h(t) {\n var n = \"\";\n n = \"file-too-big\" === t ? i._options.statusContentLength : i._options.didReceiveServerError.apply(i, [t, i._options.statusUnknownResponse, i]);\n var a = setTimeout(function () {\n o.innerHTML = n, o.setAttribute(\"data-state\", \"error\"), o.style.opacity = 1;\n }, 250);\n i._timers.push(a), e(t);\n };\n \"string\" == typeof i._options.service ? O(i._options.service, i._options.uploadMethod, n, a, r, s, h) : \"function\" == typeof i._options.service && i._options.service.apply(i, [\"file\" === i._options.serviceFormat ? t : n, r, s, h, i]);\n }, t);\n }\n }, {\n key: \"requestOutput\",\n value: function value(t, e) {\n var i = this;\n return this._data.input.file ? (e || (e = this.dataBase64), void n.parseMetaData(this._data.input.file, function (o) {\n var a = [],\n r = new FormData();\n if (L(\"input\", i._options.post) && (a.push(i._data.input.file), r.append(i._inputReference, i._data.input.file, i._data.input.file.name)), L(\"output\", i._options.post) && null !== i._data.output.image && i._options.uploadBase64 === !1) {\n var s = Z(e.output.image, e.output.name);\n if (o.imageHead && i._options.copyImageHead) try {\n s = new Blob([o.imageHead, n.blobSlice.call(s, 20)], {\n type: wt(e.output.image)\n }), s = G(s, e.output.name);\n } catch (h) {}\n a.push(s);\n var u = \"slim_output_\" + i._uid;\n e.output.image = null, e.output.field = u, r.append(u, s, e.output.name);\n }\n r.append(i._output.name, JSON.stringify(e)), t(a, r);\n }, {\n maxMetaDataSize: 262144,\n disableImageHead: !1\n })) : void t(null, null);\n }\n }, {\n key: \"_showEditor\",\n value: function value() {\n Ft.className = this._options.popoverClassName, Ft.show(), this._imageEditor.show();\n }\n }, {\n key: \"_hideEditor\",\n value: function value() {\n this._imageEditor.hide();\n var t = setTimeout(function () {\n Ft.hide();\n }, 250);\n this._timers.push(t);\n }\n }, {\n key: \"_showPreview\",\n value: function value(t, e) {\n u(t, {\n fromPosition: [0, 50, 0],\n position: [0, 0, 0],\n fromScale: [1.5, 1.5],\n scale: [1, 1],\n fromOpacity: 0,\n opacity: 1,\n easing: \"spring\",\n springConstant: .3,\n springDeceleration: .7,\n complete: function complete() {\n z(t), e && e();\n }\n });\n }\n }, {\n key: \"_hideResult\",\n value: function value(t) {\n var e = this._getIntro();\n e && u(e, {\n fromScale: [1, 1],\n scale: [.5, .5],\n fromOpacity: 1,\n opacity: 0,\n easing: \"spring\",\n springConstant: .3,\n springDeceleration: .75,\n complete: function complete() {\n z(e), t && t();\n }\n });\n }\n }, {\n key: \"_showButtons\",\n value: function value(t) {\n if (this._btnGroup) {\n this._btnGroup.style.display = \"\";\n var e = {\n fromScale: [.5, .5],\n scale: [1, 1],\n fromPosition: [0, 10, 0],\n position: [0, 0, 0],\n fromOpacity: 0,\n opacity: 1,\n complete: function complete() {\n z(this);\n },\n allDone: function allDone() {\n t && t();\n }\n };\n this.isDetached() ? e.duration = 1 : (e.delay = function (t) {\n return 250 + 50 * t;\n }, e.easing = \"spring\", e.springConstant = .3, e.springDeceleration = .85), u(this._btnGroup.childNodes, e);\n }\n }\n }, {\n key: \"_hideButtons\",\n value: function value(t) {\n var e = this;\n if (this._btnGroup) {\n var i = {\n fromScale: [1, 1],\n scale: [.85, .85],\n fromOpacity: 1,\n opacity: 0,\n allDone: function allDone() {\n e._btnGroup.style.display = \"none\", t && t();\n }\n };\n this.isDetached() ? i.duration = 1 : (i.easing = \"spring\", i.springConstant = .3, i.springDeceleration = .75), u(this._btnGroup.childNodes, i);\n }\n }\n }, {\n key: \"_hideStatus\",\n value: function value() {\n var t = this._element.querySelector(\".slim-upload-status\");\n t.style.opacity = 0;\n }\n }, {\n key: \"_doEdit\",\n value: function value() {\n var t = this;\n this._data.input.image && (this._addState(\"editor\"), this._imageEditor || this._appendEditor(), this._imageEditor.showRotateButton = this._options.rotateButton, Ft.inner = this._imageEditor.element, this._imageEditor.open(st(this._data.input.image), \"free\" === this._options.ratio ? null : this._ratio, this._data.actions.crop, this._data.actions.rotation, function () {\n t._showEditor(), t._hideButtons(), t._hideStatus();\n }));\n }\n }, {\n key: \"_doRemove\",\n value: function value(t) {\n var e = this;\n if (!this._isImageOnly()) {\n this._clearState(), this._addState(\"empty\"), this._hasInitialImage = !1, this._imageHopper && (this._imageHopper.enabled = !0), this._isRequired && (this._input.required = !0);\n var i = this._getOutro();\n i && (i.style.opacity = \"0\");\n var n = this.data;\n this._resetData();\n var o = setTimeout(function () {\n e._isBeingDestroyed || (e._hideButtons(function () {\n e._toggleButton(\"upload\", !0);\n }), e._hideStatus(), e._hideResult(), e._options.didRemove.apply(e, [n, e]), t && t());\n }, this.isDetached() ? 0 : 250);\n return this._timers.push(o), n;\n }\n }\n }, {\n key: \"_doUpload\",\n value: function value(t) {\n var e = this;\n this._data.input.image && (this._addState(\"upload\"), this._startProgress(), this._hideButtons(function () {\n e._toggleButton(\"upload\", !1), e._save(function (i, n, o) {\n e._removeState(\"upload\"), e._stopProgress(), t && t.apply(e, [i, n, o]), i && e._toggleButton(\"upload\", !0), e._showButtons();\n });\n }));\n }\n }, {\n key: \"_doDownload\",\n value: function value() {\n var t = this._data.output.image;\n t && kt(this._data, this._options.jpegCompression, this._options.forceType);\n }\n }, {\n key: \"_doDestroy\",\n value: function value() {\n function t(t, e) {\n return 0 !== e.filter(function (e) {\n return t.name === e.name && t.value === e.value;\n }).length;\n }\n var e = this;\n this._isBeingDestroyed = !0, this._timers.forEach(function (t) {\n clearTimeout(t);\n }), this._timers = [], u(this._element, \"detach\"), this._imageHopper && (Ht.forEach(function (t) {\n e._imageHopper.element.removeEventListener(t, e);\n }), this._imageHopper.destroy(), this._imageHopper = null), this._imageEditor && (Nt.forEach(function (t) {\n e._imageEditor.element.removeEventListener(t, e);\n }), this._imageEditor.destroy(), this._imageEditor = null), St(this._btnGroup.children).forEach(function (t) {\n t.removeEventListener(\"click\", e);\n }), this._input.removeEventListener(\"change\", this), this._element !== this._originalElement && this._element.parentNode && this._element.parentNode.replaceChild(this._originalElement, this._element), this._originalElement.innerHTML = this._originalElementInner;\n var i = _(this._originalElement);\n i.forEach(function (i) {\n t(i, e._originalElementAttributes) || e._originalElement.removeAttribute(i.name);\n }), this._originalElementAttributes.forEach(function (n) {\n t(n, i) || e._originalElement.setAttribute(n.name, n.value);\n }), Wt = Math.max(0, Wt - 1), Ft && 0 === Wt && (Ft.destroy(), Ft = null), this._originalElement = null, this._element = null, this._input = null, this._output = null, this._btnGroup = null, this._options = null;\n }\n }, {\n key: \"dataBase64\",\n get: function get() {\n return bt(this._data, this._options.post, this._options.jpegCompression, this._options.forceType, null !== this._options.service);\n }\n }, {\n key: \"data\",\n get: function get() {\n return vt(this._data);\n }\n }, {\n key: \"element\",\n get: function get() {\n return this._element;\n }\n }, {\n key: \"service\",\n set: function set(t) {\n this._options.service = t;\n }\n }, {\n key: \"size\",\n set: function set(t) {\n this.setSize(t, null);\n }\n }, {\n key: \"rotation\",\n set: function set(t) {\n this.setRotation(t, null);\n }\n }, {\n key: \"forceSize\",\n set: function set(t) {\n this.setForceSize(t, null);\n }\n }, {\n key: \"ratio\",\n set: function set(t) {\n this.setRatio(t, null);\n }\n }], [{\n key: \"options\",\n value: function value() {\n var t = {\n edit: !0,\n instantEdit: !1,\n uploadBase64: !1,\n meta: {},\n ratio: \"free\",\n devicePixelRatio: 1,\n size: null,\n rotation: null,\n crop: null,\n post: [\"output\", \"actions\"],\n service: null,\n serviceFormat: null,\n filterSharpen: 0,\n push: !1,\n defaultInputName: \"slim[]\",\n minSize: {\n width: 0,\n height: 0\n },\n maxFileSize: null,\n jpegCompression: null,\n uploadMethod: \"POST\",\n download: !1,\n saveInitialImage: !1,\n forceType: !1,\n forceSize: null,\n forceMinSize: !0,\n dropReplace: !0,\n fetcher: null,\n internalCanvasSize: {\n width: 4096,\n height: 4096\n },\n copyImageHead: !1,\n rotateButton: !0,\n popoverClassName: null,\n label: \"<p>Drop your image here</p>\",\n labelLoading: \"<p>Loading image...</p>\",\n statusFileType: \"<p>Invalid file type, expects: $0.</p>\",\n statusFileSize: \"<p>File is too big, maximum file size: $0 MB.</p>\",\n statusNoSupport: \"<p>Your browser does not support image cropping.</p>\",\n statusImageTooSmall: \"<p>Image is too small, minimum size is: $0 pixels.</p>\",\n statusContentLength: '<span class=\"slim-upload-status-icon\"></span> The file is probably too big',\n statusUnknownResponse: '<span class=\"slim-upload-status-icon\"></span> An unknown error occurred',\n statusUploadSuccess: '<span class=\"slim-upload-status-icon\"></span> Saved',\n statusLocalUrlProblem: null,\n didInit: function didInit(t) {},\n didLoad: function didLoad(t, e, i) {\n return !0;\n },\n didSave: function didSave(t) {},\n didUpload: function didUpload(t, e, i) {},\n didReceiveServerError: function didReceiveServerError(t, e) {\n return e;\n },\n didRemove: function didRemove(t) {},\n didTransform: function didTransform(t) {},\n didConfirm: function didConfirm(t) {},\n didCancel: function didCancel() {},\n didThrowError: function didThrowError() {},\n willCropInitial: function willCropInitial(t, e) {\n e(null);\n },\n willTransform: function willTransform(t, e) {\n e(t);\n },\n willSave: function willSave(t, e) {\n e(t);\n },\n willRemove: function willRemove(t, e) {\n e();\n },\n willRequest: function willRequest(t, e) {},\n willFetch: function willFetch(t) {},\n willLoad: function willLoad(t) {}\n };\n return Bt.concat(It.Buttons).concat(\"rotate\").forEach(function (e) {\n var i = R(e);\n t[\"button\" + i + \"ClassName\"] = null, t[\"button\" + i + \"Label\"] = i, t[\"button\" + i + \"Title\"] = i;\n }), t;\n }\n }]), i;\n }();\n return function () {\n function t(t) {\n return t ? \"<p>\" + t + \"</p>\" : null;\n }\n function e(t) {\n var e = window,\n i = t.split(\".\");\n return i.forEach(function (t, n) {\n e[i[n]] && (e = e[i[n]]);\n }), e !== window ? e : null;\n }\n var i = [],\n n = function n(t) {\n for (var e = 0, n = i.length; e < n; e++) {\n if (i[e].isAttachedTo(t)) return e;\n }\n return -1;\n },\n o = function o(t) {\n return t;\n },\n a = function a(t) {\n return \"true\" === t;\n },\n r = function r(t) {\n return !t || \"true\" === t;\n },\n s = function s(e) {\n return t(e);\n },\n h = function h(t) {\n return t ? e(t) : null;\n },\n u = function u(t) {\n if (!t) return null;\n var e = zt(t, \",\");\n return {\n width: e[0],\n height: e[1]\n };\n },\n l = function l(t) {\n return t ? parseFloat(t) : null;\n },\n p = function p(t) {\n return t ? parseInt(t, 10) : null;\n },\n c = function c(t) {\n if (!t) return null;\n var e = {};\n return t.split(\",\").map(function (t) {\n return parseInt(t, 10);\n }).forEach(function (t, i) {\n e[Ut[i]] = t;\n }), e;\n },\n f = {\n download: a,\n edit: r,\n instantEdit: a,\n minSize: u,\n size: u,\n forceSize: u,\n forceMinSize: r,\n internalCanvasSize: u,\n service: function service(t) {\n if (\"undefined\" == typeof t) return null;\n var i = e(t);\n return i ? i : t;\n },\n serviceFormat: function serviceFormat(t) {\n return \"undefined\" == typeof t ? null : t;\n },\n fetcher: function fetcher(t) {\n return \"undefined\" == typeof t ? null : t;\n },\n push: a,\n rotation: function rotation(t) {\n return \"undefined\" == typeof t ? null : parseInt(t, 10);\n },\n crop: c,\n post: function post(t) {\n return t ? t.split(\",\").map(function (t) {\n return t.trim();\n }) : null;\n },\n defaultInputName: o,\n ratio: function ratio(t) {\n return t ? t : null;\n },\n maxFileSize: l,\n filterSharpen: p,\n jpegCompression: p,\n uploadBase64: a,\n forceType: o,\n dropReplace: r,\n saveInitialImage: a,\n copyImageHead: a,\n rotateButton: r,\n label: s,\n labelLoading: s,\n popoverClassName: o,\n devicePixelRatio: o,\n uploadMethod: o\n };\n [\"FileSize\", \"FileType\", \"NoSupport\", \"ImageTooSmall\"].forEach(function (t) {\n f[\"status\" + t] = s;\n }), [\"ContentLength\", \"UnknownResponse\", \"UploadSuccess\", \"localUrlProblem\"].forEach(function (t) {\n f[\"status\" + t] = o;\n }), [\"Init\", \"Load\", \"Save\", \"Upload\", \"Remove\", \"Transform\", \"ReceiveServerError\", \"Confirm\", \"Cancel\", \"ThrowError\"].forEach(function (t) {\n f[\"did\" + t] = h;\n }), [\"CropInitial\", \"Transform\", \"Save\", \"Remove\", \"Request\", \"Load\", \"Fetch\"].forEach(function (t) {\n f[\"will\" + t] = h;\n });\n var _ = [\"ClassName\", \"Label\", \"Title\"];\n Bt.concat(It.Buttons).concat(\"rotate\").forEach(function (t) {\n var e = R(t);\n _.forEach(function (t) {\n f[\"button\" + e + t] = o;\n });\n }), Gt.supported = function () {\n return !(\"[object OperaMini]\" === Object.prototype.toString.call(window.operamini) || \"undefined\" == typeof window.addEventListener || \"undefined\" == typeof window.FileReader || !(\"slice\" in Blob.prototype) || \"undefined\" == typeof window.URL || \"undefined\" == typeof window.URL.createObjectURL);\n }(), Gt.parse = function (t) {\n var e,\n i,\n n,\n o = [];\n for (e = t.querySelectorAll(\".slim:not([data-state])\"), n = e.length; n--;) {\n i = e[n], o.push(Gt.create(i, Gt.getOptionsFromAttributes(i)));\n }\n return o;\n }, Gt.getOptionsFromAttributes = function (t) {\n var e = d(t),\n i = {\n meta: {}\n };\n for (var n in e) {\n var o = f[n],\n a = e[n];\n o ? (a = o(a), a = null === a ? mt(Gt.options()[n]) : a, i[n] = a) : 0 === n.indexOf(\"meta\") && (i.meta[M(n.substr(4))] = a);\n }\n return i;\n }, Gt.find = function (t) {\n var e = i.filter(function (e) {\n return e.isAttachedTo(t);\n });\n return e ? e[0] : null;\n }, Gt.create = function (t, e) {\n if (!Gt.find(t)) {\n e || (e = Gt.getOptionsFromAttributes(t));\n var n = new Gt(t, e);\n return i.push(n), n;\n }\n }, Gt.destroy = function (t) {\n var e = n(t);\n return !(e < 0) && (i[e].destroy(), i.splice(e, 1), !0);\n };\n }(), Gt;\n }(), t.Slim.supported) \"loading\" !== document.readyState ? i() : document.addEventListener(\"DOMContentLoaded\", i);else {\n var n = t.getElementsByClassName(\"slim\"),\n o = 0,\n a = n.length;\n for (o = 0; o < a; o++) {\n n[o].className = \"\";\n }\n }\n}(window);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvc2xpbS5raWNrc3RhcnQubWluLmpzLmpzIiwibmFtZXMiOlsidCIsImUiLCJpIiwiU2xpbSIsInBhcnNlIiwiZG9jdW1lbnQiLCJUeXBlRXJyb3IiLCJuIiwibyIsIndpZHRoIiwiYSIsImhlaWdodCIsInIiLCJNYXRoIiwibWF4IiwibWluIiwicm91bmQiLCJzIiwiaCIsInN0IiwidSIsImwiLCJjcmVhdGVFbGVtZW50IiwiZ2V0Q29udGV4dCIsImRyYXdJbWFnZSIsImJ1YmJsZXMiLCJjYW5jZWxhYmxlIiwiZGV0YWlsIiwiY3JlYXRlRXZlbnQiLCJpbml0Q3VzdG9tRXZlbnQiLCJ3aW5kb3ciLCJDdXN0b21FdmVudCIsInByb3RvdHlwZSIsIkV2ZW50Iiwib25lcnJvciIsIm9ubG9hZCIsIm5vUmV2b2tlIiwicmV2b2tlT2JqZWN0VVJMIiwic2NhbGUiLCJpc0luc3RhbmNlT2YiLCJjcmVhdGVPYmplY3RVUkwiLCJfdHlwZSIsInR5cGUiLCJjcm9zc09yaWdpbiIsInNyYyIsInJlYWRGaWxlIiwidGFyZ2V0IiwicmVzdWx0IiwiVVJMIiwid2Via2l0VVJMIiwiT2JqZWN0IiwidG9TdHJpbmciLCJjYWxsIiwidHJhbnNmb3JtQ29vcmRpbmF0ZXMiLCJnZXRUcmFuc2Zvcm1lZE9wdGlvbnMiLCJhc3BlY3RSYXRpbyIsImhhc093blByb3BlcnR5IiwiY3JvcCIsIm5hdHVyYWxXaWR0aCIsIm5hdHVyYWxIZWlnaHQiLCJtYXhXaWR0aCIsIm1heEhlaWdodCIsInJlbmRlckltYWdlVG9DYW52YXMiLCJoYXNDYW52YXNPcHRpb24iLCJjYW52YXMiLCJiIiwiayIsInAiLCJjIiwiZCIsImYiLCJfIiwibSIsImciLCJ2IiwieSIsInciLCJsZWZ0IiwidG9wIiwic291cmNlV2lkdGgiLCJyaWdodCIsInNvdXJjZUhlaWdodCIsImJvdHRvbSIsIm1pbldpZHRoIiwibWluSGVpZ2h0IiwiY29udGFpbiIsImNvdmVyIiwicGl4ZWxSYXRpbyIsInN0eWxlIiwiZG93bnNhbXBsaW5nUmF0aW8iLCJGaWxlUmVhZGVyIiwib3JpZW50YXRpb24iLCJ0cmFuc2xhdGUiLCJyb3RhdGUiLCJQSSIsIkJsb2IiLCJzbGljZSIsIndlYmtpdFNsaWNlIiwibW96U2xpY2UiLCJibG9iU2xpY2UiLCJhcHBseSIsImFyZ3VtZW50cyIsIm1ldGFEYXRhUGFyc2VycyIsImpwZWciLCJwYXJzZU1ldGFEYXRhIiwibWF4TWV0YURhdGFTaXplIiwiRGF0YVZpZXciLCJzaXplIiwiZXJyb3IiLCJieXRlTGVuZ3RoIiwiZ2V0VWludDE2IiwibGVuZ3RoIiwiZGlzYWJsZUltYWdlSGVhZCIsImltYWdlSGVhZCIsIlVpbnQ4QXJyYXkiLCJzdWJhcnJheSIsIkV4aWZNYXAiLCJtYXAiLCJPcmllbnRhdGlvbiIsImdldCIsImdldEV4aWZUaHVtYm5haWwiLCJnZXRVaW50OCIsInB1c2giLCJqb2luIiwiZXhpZlRhZ1R5cGVzIiwiZ2V0VmFsdWUiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJhc2NpaSIsImdldFVpbnQzMiIsImdldEludDMyIiwiZ2V0RXhpZlZhbHVlIiwicGFyc2VFeGlmVGFnIiwiZXhpZiIsInBhcnNlRXhpZlRhZ3MiLCJwYXJzZUV4aWZEYXRhIiwiZGlzYWJsZUV4aWYiLCJkaXNhYmxlRXhpZlRodW1ibmFpbCIsIlRodW1ibmFpbCIsImRpc2FibGVFeGlmU3ViIiwiZGlzYWJsZUV4aWZHcHMiLCJnZXRDb21wdXRlZFN0eWxlIiwiZG9jdW1lbnRFbGVtZW50IiwiQXJyYXkiLCJtYXRjaCIsIk9MaW5rIiwiY2hhaW5lcnMiLCJ0aGVuIiwic25hYmJ0IiwiZm9yRWFjaCIsInNldFZhbHVlIiwiZmluaXNoIiwicm9sbGJhY2siLCIkIiwiSiIsImRlbGF5IiwiY2FsbGJhY2siLCJjb21wbGV0ZSIsImFsbERvbmUiLCJ2YWx1ZUZlZWRlciIsImVhc2luZyIsInRpY2siLCJ1cGRhdGVFbGVtZW50IiwiaXNTdG9wcGVkIiwiY29tcGxldGVkIiwibG9vcCIsInJlc3RhcnQiLCJwb3AiLCJTIiwidW5zaGlmdCIsIm1hbnVhbCIsInEiLCJtb3ZlbWVudCIsIkUiLCJzdG9wIiwiY29uY2F0IiwiY29udGFpbnMiLCJzcGxpY2UiLCJnZXRDdXJyZW50U3RhdGUiLCJmaWx0ZXIiLCJib2R5IiwicGFyZW50Tm9kZSIsInBvc2l0aW9uIiwicm90YXRpb24iLCJyb3RhdGlvblBvc3QiLCJza2V3IiwiRyIsInNjYWxlUG9zdCIsIm9wYWNpdHkiLCJzdGFydFN0YXRlIiwiZW5kU3RhdGUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJtb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJtc1JlcXVlc3RBbmltYXRpb25GcmFtZSIsInNldFRpbWVvdXQiLCJ4IiwiZHVyYXRpb24iLCJwZXJzcGVjdGl2ZSIsIkwiLCJjbG9uZSIsInRyYW5zZm9ybU9yaWdpbiIsIlYiLCJqIiwicmVzZXRGcm9tIiwic2V0UmV2ZXJzZSIsInVwZGF0ZUN1cnJlbnRUcmFuc2Zvcm0iLCJ0d2VlbiIsImFzTWF0cml4IiwiZ2V0UHJvcGVydGllcyIsIlgiLCJZIiwiaW5pdGlhbFZlbG9jaXR5IiwiZXF1aWxpYnJpdW1Qb3NpdGlvbiIsIlQiLCJlcXVpbGlicml1bSIsInVwZGF0ZU1vdmVtZW50IiwiQyIsIlAiLCJjb3MiLCJNIiwiUiIsInBvdyIsInN0YXJ0UG9zaXRpb24iLCJzcHJpbmdDb25zdGFudCIsInNwcmluZ0RlY2VsZXJhdGlvbiIsInNwcmluZ01hc3MiLCJhYnMiLCJJIiwibGluZWFyIiwiZWFzZSIsImVhc2VJbiIsImVhc2VPdXQiLCJPIiwieiIsInNpbiIsIkQiLCJBIiwiVSIsInRhbiIsIkgiLCJOIiwiQiIsIkYiLCJGbG9hdDMyQXJyYXkiLCJkYXRhIiwiYXNDU1MiLCJ0b0ZpeGVkIiwiY2xlYXIiLCJXIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwiY3JlYXRlTWF0cml4Iiwic2V0RWxlbWVudFRyYW5zZm9ybSIsImdldEVsZW1lbnRCeUlkIiwiSFRNTENhbnZhc0VsZW1lbnQiLCJnZXRJbWFnZURhdGEiLCJFcnJvciIsImlzTmFOIiwicHV0SW1hZ2VEYXRhIiwibmV4dCIsInRvQmxvYiIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJhdG9iIiwidG9EYXRhVVJMIiwic3BsaXQiLCJjaGFyQ29kZUF0IiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwia2V5IiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJjb25zdHJ1Y3RvciIsImRhdGFzZXQiLCJhdHRyaWJ1dGVzIiwibmFtZSIsInRlc3QiLCJzdWJzdHIiLCJyZXBsYWNlIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJvZmZzZXRYIiwibGF5ZXJYIiwib2Zmc2V0WSIsImxheWVyWSIsIkVTQyIsIlJFVFVSTiIsIkRPV04iLCJNT1ZFIiwiVVAiLCJqcGciLCJqcGUiLCJwbmciLCJnaWYiLCJibXAiLCJjbGFzc05hbWUiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImNoYW5nZWRUb3VjaGVzIiwicGFnZVgiLCJwYWdlWSIsInBhZ2VYT2Zmc2V0Iiwic2Nyb2xsTGVmdCIsInBhZ2VZT2Zmc2V0Iiwic2Nyb2xsVG9wIiwidG9Mb3dlckNhc2UiLCJYTUxIdHRwUmVxdWVzdCIsInVwbG9hZCIsImxvYWRlZCIsInRvdGFsIiwib3BlbiIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJzdGF0dXMiLCJyZXNwb25zZVRleHQiLCJpbmRleE9mIiwiSlNPTiIsIm1lc3NhZ2UiLCJzZW5kIiwid2Via2l0VHJhbnNmb3JtIiwidHJhbnNmb3JtIiwic2hpZnQiLCJnZXRGdWxsWWVhciIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJEYXRlIiwiRmlsZSIsImxhc3RNb2RpZmllZCIsIm5vdyIsInJlc3BvbnNlVHlwZSIsInJlc3BvbnNlIiwiZ3QiLCJzdGF0dXNUZXh0IiwiWiIsIkFycmF5QnVmZmVyIiwid3QiLCJLIiwiQmxvYkJ1aWxkZXIiLCJXZWJLaXRCbG9iQnVpbGRlciIsIk1vekJsb2JCdWlsZGVyIiwiTVNCbG9iQnVpbGRlciIsImFwcGVuZCIsImdldEJsb2IiLCJRIiwidHQiLCJldCIsImZpbHRlcnMiLCJtaW5TaXplIiwic2hhcnBlbiIsIm50IiwiYXQiLCJpdCIsIm90IiwiY3JlYXRlSW1hZ2VEYXRhIiwic2V0Iiwic3FydCIsInJ0IiwiaHQiLCJ1dCIsImx0IiwicHQiLCJjdCIsInBhcnNlSW50IiwiZHQiLCJmdCIsIl90IiwibmV4dFNpYmxpbmciLCJhcHBlbmRDaGlsZCIsInJlc2V0IiwiaW5zZXJ0QmVmb3JlIiwibXQiLCJzdHJpbmdpZnkiLCJ2dCIsImlucHV0IiwiZmlsZSIsIm91dHB1dCIsImltYWdlIiwieXQiLCJzdWJzdHJpbmciLCJidCIsInNlcnZlciIsIm1ldGEiLCJmaWVsZCIsImFjdGlvbnMiLCJrdCIsIm5hdmlnYXRvciIsIm1zU2F2ZUJsb2IiLCJkaXNwbGF5IiwiZG93bmxvYWQiLCJocmVmIiwiY2xpY2siLCJyZW1vdmVDaGlsZCIsInh0IiwicXVlcnlTZWxlY3RvciIsIlN0IiwiRXQiLCJDdCIsIlB0IiwiTXQiLCJSdCIsIlR0IiwibmUiLCJzZSIsInN3IiwibnciLCJfZWxlbWVudCIsIl9pbnRlcmFjdGlvbiIsIl9taW5XaWR0aCIsIl9taW5IZWlnaHQiLCJfcmF0aW8iLCJfcmVjdCIsIl9zcGFjZSIsIl9yZWN0Q2hhbmdlZCIsIl9pbml0IiwiX3JlZHJhdyIsImRpc3BhdGNoRXZlbnQiLCJfb25TdGFydERyYWciLCJfb25EcmFnIiwiX29uU3RvcERyYWciLCJwcmV2ZW50RGVmYXVsdCIsIm9mZnNldCIsInNldEF0dHJpYnV0ZSIsImNzc1RleHQiLCJJdCIsIl9vcHRpb25zIiwib3B0aW9ucyIsIl9vdXRwdXQiLCJfcm90YXRpbmciLCJfaW5wdXQiLCJfcHJldmlldyIsIl9wcmV2aWV3Qmx1cnJlZCIsIl9ibHVycmVkUHJldmlldyIsIl9jcm9wcGVyIiwiX3N0cmFpZ2h0Q3JvcCIsIl9wcmV2aWV3V3JhcHBlciIsIl9jdXJyZW50V2luZG93U2l6ZSIsIl9idG5Hcm91cCIsIl9tYXNrRnJhbWUiLCJfZGlydHkiLCJfd3JhcHBlclJvdGF0aW9uIiwiX3dyYXBwZXJTY2FsZSIsIl9jb250YWluZXIiLCJfd3JhcHBlciIsIl9zdGFnZSIsImVsZW1lbnQiLCJfcHJldmlld01hc2siLCJCdXR0b25zIiwiaW5uZXJIVE1MIiwidGl0bGUiLCJfdXRpbHNHcm91cCIsImJ1dHRvblJvdGF0ZUNsYXNzTmFtZSIsImJ1dHRvblJvdGF0ZVRpdGxlIiwiX29uQ2xpY2siLCJfb25HcmlkQ2hhbmdlIiwiX29uR3JpZElucHV0IiwiX29uS2V5RG93biIsIl9vblJlc2l6ZSIsImtleUNvZGUiLCJfY29uZmlybSIsIl9jYW5jZWwiLCJjbGFzc0xpc3QiLCJfcm90YXRlIiwiaW5uZXJXaWR0aCIsImlubmVySGVpZ2h0IiwiX3JlZHJhd0Nyb3BwZXIiLCJhcmVhIiwiX3VwZGF0ZVdyYXBwZXJTY2FsZSIsIl9yZWRyYXdXcmFwcGVyIiwiX3JlZHJhd0Nyb3BNYXNrIiwib2Zmc2V0V2lkdGgiLCJvZmZzZXRIZWlnaHQiLCJfdXBkYXRlV3JhcHBlclJvdGF0aW9uIiwicmF0aW8iLCJfaGlkZUNyb3BwZXIiLCJfc2hvd0Nyb3BwZXIiLCJmcm9tT3BhY2l0eSIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwiX3ByZXZpZXdTaXplIiwiZGV2aWNlUGl4ZWxSYXRpbyIsIm9mZnNldExlZnQiLCJvZmZzZXRUb3AiLCJsaW1pdCIsInNjYWxhciIsInJlc2l6ZSIsImNsaWVudFdpZHRoIiwiY2xpZW50SGVpZ2h0IiwiZnJvbVJvdGF0aW9uIiwiZnJvbVBvc2l0aW9uIiwiZnJvbVNjYWxlIiwiZGlydHkiLCJjaGlsZE5vZGVzIiwiY2hpbGRyZW4iLCJkZXN0cm95IiwicmVtb3ZlIiwiYWRkIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiYnV0dG9uQ2FuY2VsQ2xhc3NOYW1lIiwiYnV0dG9uQ29uZmlybUNsYXNzTmFtZSIsImJ1dHRvbkNhbmNlbExhYmVsIiwiYnV0dG9uQ29uZmlybUxhYmVsIiwiYnV0dG9uQ2FuY2VsVGl0bGUiLCJidXR0b25Db25maXJtVGl0bGUiLCJMdCIsIl9hY2NlcHQiLCJfYWxsb3dVUkxzIiwiX2RyYWdQYXRoIiwiZmlsZXMiLCJhcmVWYWxpZERhdGFUcmFuc2ZlckZpbGVzIiwiaXRlbXMiLCJhcmVWYWxpZERhdGFUcmFuc2Zlckl0ZW1zIiwia2luZCIsIl9vbkRyYWdPdmVyIiwiX29uRHJhZ0xlYXZlIiwiX29uRHJvcCIsImRhdGFUcmFuc2ZlciIsImdldERhdGEiLCJyZW1vdGUiLCJpc1ZhbGlkRGF0YVRyYW5zZmVyIiwiZHJvcEVmZmVjdCIsIk90IiwiX2lubmVyIiwiZmlyc3RDaGlsZCIsInp0IiwiRHQiLCJub2RlTmFtZSIsIkF0IiwiQVVUTyIsIklOSVRJQUwiLCJNQU5VQUwiLCJVdCIsIkh0IiwiTnQiLCJCdCIsIkZ0IiwiV3QiLCJxdCIsImp0IiwiVnQiLCJHdCIsIl91aWQiLCJmb3JjZVNpemUiLCJwb3N0IiwidHJpbSIsIl9vcmlnaW5hbEVsZW1lbnQiLCJfb3JpZ2luYWxFbGVtZW50SW5uZXIiLCJfb3JpZ2luYWxFbGVtZW50QXR0cmlidXRlcyIsIl9zdGF0ZSIsIl90aW1lcnMiLCJfaW5wdXRSZWZlcmVuY2UiLCJfaXNSZXF1aXJlZCIsIl9pbWFnZUhvcHBlciIsIl9pbWFnZUVkaXRvciIsIl9wcm9ncmVzc0VuYWJsZWQiLCJfZGF0YSIsIl9yZXNldERhdGEiLCJfZHJpcCIsIl9oYXNJbml0aWFsSW1hZ2UiLCJfaW5pdGlhbENyb3AiLCJfaW5pdGlhbFJvdGF0aW9uIiwiX2lzQmVpbmdEZXN0cm95ZWQiLCJzdXBwb3J0ZWQiLCJfZmFsbGJhY2siLCJfbWFudWFsVHJhbnNmb3JtIiwic2V0UmF0aW8iLCJfaXNGaXhlZFJhdGlvIiwiX2Nyb3BBdXRvIiwiX3NjYWxlRHJvcEFyZWEiLCJfbG9hZCIsImJsb2NrUHVzaCIsIl9kb1VwbG9hZCIsIl9kb0Rvd25sb2FkIiwiX2RvUmVtb3ZlIiwiX2RvRGVzdHJveSIsIl9kb0VkaXQiLCJfY3JvcCIsImluc3RhbnRFZGl0IiwiX2lzSW5pdGlhbGlzaW5nIiwiX2dldEZpbGVJbnB1dCIsIl9nZXRJbml0aWFsSW1hZ2UiLCJfdXBkYXRlU3RhdGUiLCJfYWRkU3RhdGUiLCJfZ2V0SW5wdXRFbGVtZW50IiwicmVxdWlyZWQiLCJJbWFnZSIsImRlZmF1bHRJbnB1dE5hbWUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGUiLCJfaXNJbWFnZU9ubHkiLCJsYWJlbExvYWRpbmciLCJzZXJ2aWNlIiwiaGFzQXR0cmlidXRlIiwiYWNjZXB0IiwiYWxsb3dVUkxzIiwiZmV0Y2hlciIsImxhYmVsIiwiX2lzQnV0dG9uQWxsb3dlZCIsIl91cGRhdGVQcm9ncmVzcyIsIl9vbkluaXQiLCJkaWRJbml0Iiwic2F2ZUluaXRpYWxJbWFnZSIsImNvbnRhaW5zSW1hZ2UiLCJfc2F2ZSIsIl90b2dnbGVCdXR0b24iLCJxdWVyeVNlbGVjdG9yQWxsIiwiX3N0b3BQcm9ncmVzc0xvb3AiLCJwYXJzZUZsb2F0IiwiZWRpdCIsIl90aHJvd0Vycm9yIiwic3RhdHVzTm9TdXBwb3J0IiwiX29uQ2hhbmdlIiwiX29uQ2FuY2VsIiwiX29uQ29uZmlybSIsIl9vbkZpbGVPdmVyIiwiX29uRmlsZU91dCIsIl9vbkRyb3BGaWxlIiwiX29uSW52YWxpZEZpbGUiLCJfb25JbnZhbGlkRmlsZURyb3AiLCJkaWRUaHJvd0Vycm9yIiwiX3JlbW92ZVN0YXRlIiwiX3JlbW92ZUVycm9yIiwiX29wZW5GaWxlRGlhbG9nIiwid2lsbFJlbW92ZSIsIl9nZXREcmlwIiwic3RhdHVzRmlsZVR5cGUiLCJzdGF0dXNJbWFnZVRvb1NtYWxsIiwic3RhdHVzRmlsZVNpemUiLCJtYXhGaWxlU2l6ZSIsInN0YXR1c0xvY2FsVXJsUHJvYmxlbSIsImRyYWdQYXRoIiwiY2xlYXJUaW1lb3V0IiwiX3JlcGxhY2VUaW1lb3V0IiwiX3N0YXJ0UHJvZ3Jlc3NMb29wIiwiZW5hYmxlZCIsIl9sb2FkVGltZW91dCIsIndpbGxMb2FkIiwiX29uTG9jYWxVUkxQcm9ibGVtIiwid2lsbEZldGNoIiwiX29uUmVtb3RlVVJMUHJvYmxlbSIsIl9vbk92ZXJXZWlnaHRGaWxlIiwiaW50ZXJuYWxDYW52YXNTaXplIiwiX29uSW1hZ2VUb29TbWFsbCIsImRpZExvYWQiLCJkcm9wUmVwbGFjZSIsIl9nZXRJbnRybyIsImlzRGV0YWNoZWQiLCJfY2FuSW5zdGFudEVkaXQiLCJfbG9hZENhbnZhcyIsIl9zaG93QnV0dG9ucyIsIl9hcHBseVRyYW5zZm9ybXMiLCJfc3RhcnRQcm9ncmVzcyIsIl9zdG9wUHJvZ3Jlc3MiLCJ3aWxsQ3JvcEluaXRpYWwiLCJmaWx0ZXJTaGFycGVuIiwiZm9yY2VNaW5TaXplIiwiX29uVHJhbnNmb3JtQ2FudmFzIiwiZGlkVHJhbnNmb3JtIiwid2lsbFRyYW5zZm9ybSIsImJ1dHRvblJvdGF0ZUxhYmVsIiwiX2dldFJhdGlvU3BhY2VyRWxlbWVudCIsIm1hcmdpbkJvdHRvbSIsImRpZENhbmNlbCIsIl9oaWRlRWRpdG9yIiwiX2lzQXV0b0Nyb3AiLCJkaWRDb25maXJtIiwiX2dldEluT3V0IiwiekluZGV4IiwiX3Nob3dQcmV2aWV3IiwiZGF0YUJhc2U2NCIsIndpbGxTYXZlIiwiX3N0b3JlIiwiZGlkU2F2ZSIsIl91cGxvYWQiLCJfc3RvcmVTZXJ2ZXJSZXNwb25zZSIsImRpZFVwbG9hZCIsInJlcXVlc3RPdXRwdXQiLCJ3aWxsUmVxdWVzdCIsInN0YXR1c1VwbG9hZFN1Y2Nlc3MiLCJzdGF0dXNDb250ZW50TGVuZ3RoIiwiZGlkUmVjZWl2ZVNlcnZlckVycm9yIiwic3RhdHVzVW5rbm93blJlc3BvbnNlIiwidXBsb2FkTWV0aG9kIiwic2VydmljZUZvcm1hdCIsIkZvcm1EYXRhIiwidXBsb2FkQmFzZTY0IiwiY29weUltYWdlSGVhZCIsInBvcG92ZXJDbGFzc05hbWUiLCJzaG93IiwiaGlkZSIsIl9hcHBlbmRFZGl0b3IiLCJzaG93Um90YXRlQnV0dG9uIiwicm90YXRlQnV0dG9uIiwiaW5uZXIiLCJfc2hvd0VkaXRvciIsIl9oaWRlQnV0dG9ucyIsIl9oaWRlU3RhdHVzIiwiX2NsZWFyU3RhdGUiLCJfZ2V0T3V0cm8iLCJfaGlkZVJlc3VsdCIsImRpZFJlbW92ZSIsImpwZWdDb21wcmVzc2lvbiIsImZvcmNlVHlwZSIsInJlcGxhY2VDaGlsZCIsInNldFNpemUiLCJzZXRSb3RhdGlvbiIsInNldEZvcmNlU2l6ZSIsImlzQXR0YWNoZWRUbyIsIm9wZXJhbWluaSIsImNyZWF0ZSIsImdldE9wdGlvbnNGcm9tQXR0cmlidXRlcyIsImZpbmQiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIl0sInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2xpbS5raWNrc3RhcnQubWluLmpzP2M1MTciXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFNsaW0gdjQuMTkuMCAtIEltYWdlIENyb3BwaW5nIE1hZGUgRWFzeVxuICogQ29weXJpZ2h0IChjKSAyMDE4IFJpayBTY2hlbm5pbmsgLSBodHRwOi8vc2xpbWltYWdlY3JvcHBlci5jb21cbiAqL1xuIWZ1bmN0aW9uICh0LCBlKSB7XG4gICAgZnVuY3Rpb24gaSgpIHtcbiAgICAgICAgdC5TbGltLnBhcnNlKGRvY3VtZW50KVxuICAgIH1cblxuICAgIGlmICh0KSBpZiAodC5TbGltID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiB0KHQsIGUpIHtcbiAgICAgICAgICAgIGlmICghKHQgaW5zdGFuY2VvZiBlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaSh0LCBlLCBpLCBuKSB7XG4gICAgICAgICAgICBpZiAoIShlID49IDEpKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbyA9IHQud2lkdGgsIGEgPSB0LmhlaWdodCwgciA9IE1hdGgubWF4KG4ud2lkdGgsIE1hdGgubWluKGkud2lkdGgsIE1hdGgucm91bmQodC53aWR0aCAqIGUpKSksIHMgPSBNYXRoLm1heChuLmhlaWdodCwgTWF0aC5taW4oaS5oZWlnaHQsIE1hdGgucm91bmQodC5oZWlnaHQgKiBlKSkpLCBoID0gc3QodCksIHUgPSB2b2lkIDAsIGwgPSB2b2lkIDA7IG8gPiByICYmIGEgPiBzOykgdSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiksIG8gPSBNYXRoLnJvdW5kKC41ICogaC53aWR0aCksIGEgPSBNYXRoLnJvdW5kKC41ICogaC5oZWlnaHQpLCBvIDwgciAmJiAobyA9IHIpLCBhIDwgcyAmJiAoYSA9IHMpLCB1LndpZHRoID0gbywgdS5oZWlnaHQgPSBhLCBsID0gdS5nZXRDb250ZXh0KFwiMmRcIiksIGwuZHJhd0ltYWdlKGgsIDAsIDAsIG8sIGEpLCBoID0gc3QodSk7XG4gICAgICAgICAgICAgICAgdC53aWR0aCA9IHIsIHQuaGVpZ2h0ID0gcywgbCA9IHQuZ2V0Q29udGV4dChcIjJkXCIpLCBsLmRyYXdJbWFnZShoLCAwLCAwLCByLCBzKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgIWZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgaSkge1xuICAgICAgICAgICAgICAgIGkgPSBpIHx8IHtidWJibGVzOiAhMSwgY2FuY2VsYWJsZTogITEsIGRldGFpbDogZX07XG4gICAgICAgICAgICAgICAgdmFyIG4gPSBkb2N1bWVudC5jcmVhdGVFdmVudChcIkN1c3RvbUV2ZW50XCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuLmluaXRDdXN0b21FdmVudCh0LCBpLmJ1YmJsZXMsIGkuY2FuY2VsYWJsZSwgaS5kZXRhaWwpLCBuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCAmJiAodC5wcm90b3R5cGUgPSB3aW5kb3cuRXZlbnQucHJvdG90eXBlLCB2b2lkKHdpbmRvdy5DdXN0b21FdmVudCA9IHQpKVxuICAgICAgICB9KCk7XG4gICAgICAgIHZhciBuID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbywgYSwgciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgICAgICAgICAgaWYgKHIub25lcnJvciA9IGUsIHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAhYSB8fCBpICYmIGkubm9SZXZva2UgfHwgbi5yZXZva2VPYmplY3RVUkwoYSksIGUgJiYgZShuLnNjYWxlKHIsIGkpKVxuICAgICAgICAgICAgICAgIH0sIG4uaXNJbnN0YW5jZU9mKFwiQmxvYlwiLCB0KSB8fCBuLmlzSW5zdGFuY2VPZihcIkZpbGVcIiwgdCkpIG8gPSBhID0gbi5jcmVhdGVPYmplY3RVUkwodCksIHIuX3R5cGUgPSB0LnR5cGU7IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXCJzdHJpbmdcIiAhPSB0eXBlb2YgdCkgcmV0dXJuICExO1xuICAgICAgICAgICAgICAgICAgICBvID0gdCwgaSAmJiBpLmNyb3NzT3JpZ2luICYmIChyLmNyb3NzT3JpZ2luID0gaS5jcm9zc09yaWdpbilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG8gPyAoci5zcmMgPSBvLCByKSA6IG4ucmVhZEZpbGUodCwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LnRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgaSAmJiBpLnJlc3VsdCA/IHIuc3JjID0gaS5yZXN1bHQgOiBlICYmIGUodClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG8gPSB3aW5kb3cuY3JlYXRlT2JqZWN0VVJMICYmIHdpbmRvdyB8fCB3aW5kb3cuVVJMICYmIFVSTC5yZXZva2VPYmplY3RVUkwgJiYgVVJMIHx8IHdpbmRvdy53ZWJraXRVUkwgJiYgd2Via2l0VVJMO1xuICAgICAgICBuLmlzSW5zdGFuY2VPZiA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpID09PSBcIltvYmplY3QgXCIgKyB0ICsgXCJdXCJcbiAgICAgICAgfSwgbi50cmFuc2Zvcm1Db29yZGluYXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgfSwgbi5nZXRUcmFuc2Zvcm1lZE9wdGlvbnMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgdmFyIGksIG4sIG8sIGEsIHIgPSBlLmFzcGVjdFJhdGlvO1xuICAgICAgICAgICAgaWYgKCFyKSByZXR1cm4gZTtcbiAgICAgICAgICAgIGkgPSB7fTtcbiAgICAgICAgICAgIGZvciAobiBpbiBlKSBlLmhhc093blByb3BlcnR5KG4pICYmIChpW25dID0gZVtuXSk7XG4gICAgICAgICAgICByZXR1cm4gaS5jcm9wID0gITAsIG8gPSB0Lm5hdHVyYWxXaWR0aCB8fCB0LndpZHRoLCBhID0gdC5uYXR1cmFsSGVpZ2h0IHx8IHQuaGVpZ2h0LCBvIC8gYSA+IHIgPyAoaS5tYXhXaWR0aCA9IGEgKiByLCBpLm1heEhlaWdodCA9IGEpIDogKGkubWF4V2lkdGggPSBvLCBpLm1heEhlaWdodCA9IG8gLyByKSwgaVxuICAgICAgICB9LCBuLnJlbmRlckltYWdlVG9DYW52YXMgPSBmdW5jdGlvbiAodCwgZSwgaSwgbiwgbywgYSwgciwgcywgaCwgdSkge1xuICAgICAgICAgICAgcmV0dXJuIHQuZ2V0Q29udGV4dChcIjJkXCIpLmRyYXdJbWFnZShlLCBpLCBuLCBvLCBhLCByLCBzLCBoLCB1KSwgdFxuICAgICAgICB9LCBuLmhhc0NhbnZhc09wdGlvbiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdC5jYW52YXMgfHwgdC5jcm9wIHx8ICEhdC5hc3BlY3RSYXRpb1xuICAgICAgICB9LCBuLnNjYWxlID0gZnVuY3Rpb24gKHQsIGkpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG8oKSB7XG4gICAgICAgICAgICAgICAgdmFyIHQgPSBNYXRoLm1heCgoaCB8fCBiKSAvIGIsICh1IHx8IGspIC8gayk7XG4gICAgICAgICAgICAgICAgdCA+IDEgJiYgKGIgKj0gdCwgayAqPSB0KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBhKCkge1xuICAgICAgICAgICAgICAgIHZhciB0ID0gTWF0aC5taW4oKHIgfHwgYikgLyBiLCAocyB8fCBrKSAvIGspO1xuICAgICAgICAgICAgICAgIHQgPCAxICYmIChiICo9IHQsIGsgKj0gdClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaSA9IGkgfHwge307XG4gICAgICAgICAgICB2YXIgciwgcywgaCwgdSwgbCwgcCwgYywgZCwgZiwgXywgbSwgZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiksXG4gICAgICAgICAgICAgICAgdiA9IHQuZ2V0Q29udGV4dCB8fCBuLmhhc0NhbnZhc09wdGlvbihpKSAmJiBnLmdldENvbnRleHQsIHkgPSB0Lm5hdHVyYWxXaWR0aCB8fCB0LndpZHRoLFxuICAgICAgICAgICAgICAgIHcgPSB0Lm5hdHVyYWxIZWlnaHQgfHwgdC5oZWlnaHQsIGIgPSB5LCBrID0gdztcbiAgICAgICAgICAgIGlmICh2ICYmIChpID0gbi5nZXRUcmFuc2Zvcm1lZE9wdGlvbnModCwgaSksIGMgPSBpLmxlZnQgfHwgMCwgZCA9IGkudG9wIHx8IDAsIGkuc291cmNlV2lkdGggPyAobCA9IGkuc291cmNlV2lkdGgsIGkucmlnaHQgIT09IGUgJiYgaS5sZWZ0ID09PSBlICYmIChjID0geSAtIGwgLSBpLnJpZ2h0KSkgOiBsID0geSAtIGMgLSAoaS5yaWdodCB8fCAwKSwgaS5zb3VyY2VIZWlnaHQgPyAocCA9IGkuc291cmNlSGVpZ2h0LCBpLmJvdHRvbSAhPT0gZSAmJiBpLnRvcCA9PT0gZSAmJiAoZCA9IHcgLSBwIC0gaS5ib3R0b20pKSA6IHAgPSB3IC0gZCAtIChpLmJvdHRvbSB8fCAwKSwgYiA9IGwsIGsgPSBwKSwgciA9IGkubWF4V2lkdGgsIHMgPSBpLm1heEhlaWdodCwgaCA9IGkubWluV2lkdGgsIHUgPSBpLm1pbkhlaWdodCwgdiAmJiByICYmIHMgJiYgaS5jcm9wID8gKGIgPSByLCBrID0gcywgbSA9IGwgLyBwIC0gciAvIHMsIG0gPCAwID8gKHAgPSBzICogbCAvIHIsIGkudG9wID09PSBlICYmIGkuYm90dG9tID09PSBlICYmIChkID0gKHcgLSBwKSAvIDIpKSA6IG0gPiAwICYmIChsID0gciAqIHAgLyBzLCBpLmxlZnQgPT09IGUgJiYgaS5yaWdodCA9PT0gZSAmJiAoYyA9ICh5IC0gbCkgLyAyKSkpIDogKChpLmNvbnRhaW4gfHwgaS5jb3ZlcikgJiYgKGggPSByID0gciB8fCBoLCB1ID0gcyA9IHMgfHwgdSksIGkuY292ZXIgPyAoYSgpLCBvKCkpIDogKG8oKSwgYSgpKSksIHYpIHtcbiAgICAgICAgICAgICAgICBpZiAoZiA9IGkucGl4ZWxSYXRpbywgZiA+IDEgJiYgKGcuc3R5bGUud2lkdGggPSBiICsgXCJweFwiLCBnLnN0eWxlLmhlaWdodCA9IGsgKyBcInB4XCIsIGIgKj0gZiwgayAqPSBmLCBnLmdldENvbnRleHQoXCIyZFwiKS5zY2FsZShmLCBmKSksIF8gPSBpLmRvd25zYW1wbGluZ1JhdGlvLCBfID4gMCAmJiBfIDwgMSAmJiBiIDwgbCAmJiBrIDwgcCkgZm9yICg7IGwgKiBfID4gYjspIGcud2lkdGggPSBsICogXywgZy5oZWlnaHQgPSBwICogXywgbi5yZW5kZXJJbWFnZVRvQ2FudmFzKGcsIHQsIGMsIGQsIGwsIHAsIDAsIDAsIGcud2lkdGgsIGcuaGVpZ2h0KSwgbCA9IGcud2lkdGgsIHAgPSBnLmhlaWdodCwgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiksIHQud2lkdGggPSBsLCB0LmhlaWdodCA9IHAsIG4ucmVuZGVySW1hZ2VUb0NhbnZhcyh0LCBnLCAwLCAwLCBsLCBwLCAwLCAwLCBsLCBwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZy53aWR0aCA9IGIsIGcuaGVpZ2h0ID0gaywgbi50cmFuc2Zvcm1Db29yZGluYXRlcyhnLCBpKSwgbi5yZW5kZXJJbWFnZVRvQ2FudmFzKGcsIHQsIGMsIGQsIGwsIHAsIDAsIDAsIGIsIGspXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdC53aWR0aCA9IGIsIHQuaGVpZ2h0ID0gaywgdFxuICAgICAgICB9LCBuLmNyZWF0ZU9iamVjdFVSTCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gISFvICYmIG8uY3JlYXRlT2JqZWN0VVJMKHQpXG4gICAgICAgIH0sIG4ucmV2b2tlT2JqZWN0VVJMID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHJldHVybiAhIW8gJiYgby5yZXZva2VPYmplY3RVUkwodClcbiAgICAgICAgfSwgbi5yZWFkRmlsZSA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgICAgICBpZiAod2luZG93LkZpbGVSZWFkZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgbiA9IG5ldyBGaWxlUmVhZGVyO1xuICAgICAgICAgICAgICAgIGlmIChuLm9ubG9hZCA9IG4ub25lcnJvciA9IGUsIGkgPSBpIHx8IFwicmVhZEFzRGF0YVVSTFwiLCBuW2ldKSByZXR1cm4gbltpXSh0KSwgblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICExXG4gICAgICAgIH07XG4gICAgICAgIHZhciBhID0gbi5oYXNDYW52YXNPcHRpb24sIHIgPSBuLnRyYW5zZm9ybUNvb3JkaW5hdGVzLCBzID0gbi5nZXRUcmFuc2Zvcm1lZE9wdGlvbnM7XG4gICAgICAgIG4uaGFzQ2FudmFzT3B0aW9uID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHJldHVybiAhIXQub3JpZW50YXRpb24gfHwgYS5jYWxsKG4sIHQpXG4gICAgICAgIH0sIG4udHJhbnNmb3JtQ29vcmRpbmF0ZXMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgci5jYWxsKG4sIHQsIGUpO1xuICAgICAgICAgICAgdmFyIGkgPSB0LmdldENvbnRleHQoXCIyZFwiKSwgbyA9IHQud2lkdGgsIGEgPSB0LmhlaWdodCwgcyA9IHQuc3R5bGUud2lkdGgsIGggPSB0LnN0eWxlLmhlaWdodCxcbiAgICAgICAgICAgICAgICB1ID0gZS5vcmllbnRhdGlvbjtcbiAgICAgICAgICAgIGlmICh1ICYmICEodSA+IDgpKSBzd2l0Y2ggKHUgPiA0ICYmICh0LndpZHRoID0gYSwgdC5oZWlnaHQgPSBvLCB0LnN0eWxlLndpZHRoID0gaCwgdC5zdHlsZS5oZWlnaHQgPSBzKSwgdSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaS50cmFuc2xhdGUobywgMCksIGkuc2NhbGUoLTEsIDEpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGkudHJhbnNsYXRlKG8sIGEpLCBpLnJvdGF0ZShNYXRoLlBJKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBpLnRyYW5zbGF0ZSgwLCBhKSwgaS5zY2FsZSgxLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgaS5yb3RhdGUoLjUgKiBNYXRoLlBJKSwgaS5zY2FsZSgxLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgaS5yb3RhdGUoLjUgKiBNYXRoLlBJKSwgaS50cmFuc2xhdGUoMCwgLWEpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIGkucm90YXRlKC41ICogTWF0aC5QSSksIGkudHJhbnNsYXRlKG8sIC1hKSwgaS5zY2FsZSgtMSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgaS5yb3RhdGUoLS41ICogTWF0aC5QSSksIGkudHJhbnNsYXRlKC1vLCAwKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCBuLmdldFRyYW5zZm9ybWVkT3B0aW9ucyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICB2YXIgaSwgbywgYSA9IHMuY2FsbChuLCB0LCBlKSwgciA9IGEub3JpZW50YXRpb247XG4gICAgICAgICAgICBpZiAoIXIgfHwgciA+IDggfHwgMSA9PT0gcikgcmV0dXJuIGE7XG4gICAgICAgICAgICBpID0ge307XG4gICAgICAgICAgICBmb3IgKG8gaW4gYSkgYS5oYXNPd25Qcm9wZXJ0eShvKSAmJiAoaVtvXSA9IGFbb10pO1xuICAgICAgICAgICAgc3dpdGNoIChhLm9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpLmxlZnQgPSBhLnJpZ2h0LCBpLnJpZ2h0ID0gYS5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGkubGVmdCA9IGEucmlnaHQsIGkudG9wID0gYS5ib3R0b20sIGkucmlnaHQgPSBhLmxlZnQsIGkuYm90dG9tID0gYS50b3A7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgaS50b3AgPSBhLmJvdHRvbSwgaS5ib3R0b20gPSBhLnRvcDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBpLmxlZnQgPSBhLnRvcCwgaS50b3AgPSBhLmxlZnQsIGkucmlnaHQgPSBhLmJvdHRvbSwgaS5ib3R0b20gPSBhLnJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIGkubGVmdCA9IGEudG9wLCBpLnRvcCA9IGEucmlnaHQsIGkucmlnaHQgPSBhLmJvdHRvbSwgaS5ib3R0b20gPSBhLmxlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgaS5sZWZ0ID0gYS5ib3R0b20sIGkudG9wID0gYS5yaWdodCwgaS5yaWdodCA9IGEudG9wLCBpLmJvdHRvbSA9IGEubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICBpLmxlZnQgPSBhLmJvdHRvbSwgaS50b3AgPSBhLmxlZnQsIGkucmlnaHQgPSBhLnRvcCwgaS5ib3R0b20gPSBhLnJpZ2h0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYS5vcmllbnRhdGlvbiA+IDQgJiYgKGkubWF4V2lkdGggPSBhLm1heEhlaWdodCwgaS5tYXhIZWlnaHQgPSBhLm1heFdpZHRoLCBpLm1pbldpZHRoID0gYS5taW5IZWlnaHQsIGkubWluSGVpZ2h0ID0gYS5taW5XaWR0aCwgaS5zb3VyY2VXaWR0aCA9IGEuc291cmNlSGVpZ2h0LCBpLnNvdXJjZUhlaWdodCA9IGEuc291cmNlV2lkdGgpLCBpXG4gICAgICAgIH07XG4gICAgICAgIHZhciBoID0gd2luZG93LkJsb2IgJiYgKEJsb2IucHJvdG90eXBlLnNsaWNlIHx8IEJsb2IucHJvdG90eXBlLndlYmtpdFNsaWNlIHx8IEJsb2IucHJvdG90eXBlLm1velNsaWNlKTtcbiAgICAgICAgbi5ibG9iU2xpY2UgPSBoICYmIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0ID0gdGhpcy5zbGljZSB8fCB0aGlzLndlYmtpdFNsaWNlIHx8IHRoaXMubW96U2xpY2U7XG4gICAgICAgICAgICByZXR1cm4gdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH0sIG4ubWV0YURhdGFQYXJzZXJzID0ge2pwZWc6IHs2NTUwNTogW119fSwgbi5wYXJzZU1ldGFEYXRhID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgICAgICAgIGkgPSBpIHx8IHt9O1xuICAgICAgICAgICAgdmFyIG8gPSB0aGlzLCBhID0gaS5tYXhNZXRhRGF0YVNpemUgfHwgMjYyMTQ0LCByID0ge30sXG4gICAgICAgICAgICAgICAgcyA9ICEod2luZG93LkRhdGFWaWV3ICYmIHQgJiYgdC5zaXplID49IDEyICYmIFwiaW1hZ2UvanBlZ1wiID09PSB0LnR5cGUgJiYgbi5ibG9iU2xpY2UpO1xuICAgICAgICAgICAgIXMgJiYgbi5yZWFkRmlsZShuLmJsb2JTbGljZS5jYWxsKHQsIDAsIGEpLCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIGlmICh0LnRhcmdldC5lcnJvcikgcmV0dXJuIHZvaWQgZShyKTtcbiAgICAgICAgICAgICAgICB2YXIgYSwgcywgaCwgdSwgbCA9IHQudGFyZ2V0LnJlc3VsdCwgcCA9IG5ldyBEYXRhVmlldyhsKSwgYyA9IDIsIGQgPSBwLmJ5dGVMZW5ndGggLSA0LCBmID0gYztcbiAgICAgICAgICAgICAgICBpZiAoNjU0OTYgPT09IHAuZ2V0VWludDE2KDApKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoOyBjIDwgZCAmJiAoYSA9IHAuZ2V0VWludDE2KGMpLCBhID49IDY1NTA0ICYmIGEgPD0gNjU1MTkgfHwgNjU1MzQgPT09IGEpICYmIChzID0gcC5nZXRVaW50MTYoYyArIDIpICsgMiwgIShjICsgcyA+IHAuYnl0ZUxlbmd0aCkpOykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggPSBuLm1ldGFEYXRhUGFyc2Vycy5qcGVnW2FdKSBmb3IgKHUgPSAwOyB1IDwgaC5sZW5ndGg7IHUgKz0gMSkgaFt1XS5jYWxsKG8sIHAsIGMsIHMsIHIsIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYyArPSBzLCBmID0gY1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICFpLmRpc2FibGVJbWFnZUhlYWQgJiYgZiA+IDYgJiYgKGwuc2xpY2UgPyByLmltYWdlSGVhZCA9IGwuc2xpY2UoMCwgZikgOiByLmltYWdlSGVhZCA9IG5ldyBVaW50OEFycmF5KGwpLnN1YmFycmF5KDAsIGYpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlKHIpXG4gICAgICAgICAgICB9LCBcInJlYWRBc0FycmF5QnVmZmVyXCIpIHx8IGUocilcbiAgICAgICAgfSwgbi5FeGlmTWFwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgfSwgbi5FeGlmTWFwLnByb3RvdHlwZS5tYXAgPSB7T3JpZW50YXRpb246IDI3NH0sIG4uRXhpZk1hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzW3RdIHx8IHRoaXNbdGhpcy5tYXBbdF1dXG4gICAgICAgIH0sIG4uZ2V0RXhpZlRodW1ibmFpbCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgICAgICB2YXIgbiwgbywgYTtcbiAgICAgICAgICAgIGlmIChpICYmICEoZSArIGkgPiB0LmJ5dGVMZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChuID0gW10sIG8gPSAwOyBvIDwgaTsgbyArPSAxKSBhID0gdC5nZXRVaW50OChlICsgbyksIG4ucHVzaCgoYSA8IDE2ID8gXCIwXCIgOiBcIlwiKSArIGEudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJkYXRhOmltYWdlL2pwZWcsJVwiICsgbi5qb2luKFwiJVwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCBuLmV4aWZUYWdUeXBlcyA9IHtcbiAgICAgICAgICAgIDE6IHtcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZ2V0VWludDgoZSlcbiAgICAgICAgICAgICAgICB9LCBzaXplOiAxXG4gICAgICAgICAgICB9LCAyOiB7XG4gICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHQuZ2V0VWludDgoZSkpXG4gICAgICAgICAgICAgICAgfSwgc2l6ZTogMSwgYXNjaWk6ICEwXG4gICAgICAgICAgICB9LCAzOiB7XG4gICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldFVpbnQxNihlLCBpKVxuICAgICAgICAgICAgICAgIH0sIHNpemU6IDJcbiAgICAgICAgICAgIH0sIDQ6IHtcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZ2V0VWludDMyKGUsIGkpXG4gICAgICAgICAgICAgICAgfSwgc2l6ZTogNFxuICAgICAgICAgICAgfSwgNToge1xuICAgICAgICAgICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5nZXRVaW50MzIoZSwgaSkgLyB0LmdldFVpbnQzMihlICsgNCwgaSlcbiAgICAgICAgICAgICAgICB9LCBzaXplOiA4XG4gICAgICAgICAgICB9LCA5OiB7XG4gICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldEludDMyKGUsIGkpXG4gICAgICAgICAgICAgICAgfSwgc2l6ZTogNFxuICAgICAgICAgICAgfSwgMTA6IHtcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZ2V0SW50MzIoZSwgaSkgLyB0LmdldEludDMyKGUgKyA0LCBpKVxuICAgICAgICAgICAgICAgIH0sIHNpemU6IDhcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgbi5leGlmVGFnVHlwZXNbN10gPSBuLmV4aWZUYWdUeXBlc1sxXSwgbi5nZXRFeGlmVmFsdWUgPSBmdW5jdGlvbiAodCwgZSwgaSwgbywgYSwgcikge1xuICAgICAgICAgICAgdmFyIHMsIGgsIHUsIGwsIHAsIGMsIGQgPSBuLmV4aWZUYWdUeXBlc1tvXTtcbiAgICAgICAgICAgIGlmIChkICYmIChzID0gZC5zaXplICogYSwgaCA9IHMgPiA0ID8gZSArIHQuZ2V0VWludDMyKGkgKyA4LCByKSA6IGkgKyA4LCAhKGggKyBzID4gdC5ieXRlTGVuZ3RoKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoMSA9PT0gYSkgcmV0dXJuIGQuZ2V0VmFsdWUodCwgaCwgcik7XG4gICAgICAgICAgICAgICAgZm9yICh1ID0gW10sIGwgPSAwOyBsIDwgYTsgbCArPSAxKSB1W2xdID0gZC5nZXRWYWx1ZSh0LCBoICsgbCAqIGQuc2l6ZSwgcik7XG4gICAgICAgICAgICAgICAgaWYgKGQuYXNjaWkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChwID0gXCJcIiwgbCA9IDA7IGwgPCB1Lmxlbmd0aCAmJiAoYyA9IHVbbF0sIFwiXFwwXCIgIT09IGMpOyBsICs9IDEpIHAgKz0gYztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgbi5wYXJzZUV4aWZUYWcgPSBmdW5jdGlvbiAodCwgZSwgaSwgbywgYSkge1xuICAgICAgICAgICAgdmFyIHIgPSB0LmdldFVpbnQxNihpLCBvKTtcbiAgICAgICAgICAgIGEuZXhpZltyXSA9IG4uZ2V0RXhpZlZhbHVlKHQsIGUsIGksIHQuZ2V0VWludDE2KGkgKyAyLCBvKSwgdC5nZXRVaW50MzIoaSArIDQsIG8pLCBvKVxuICAgICAgICB9LCBuLnBhcnNlRXhpZlRhZ3MgPSBmdW5jdGlvbiAodCwgZSwgaSwgbiwgbykge1xuICAgICAgICAgICAgdmFyIGEsIHIsIHM7XG4gICAgICAgICAgICBpZiAoIShpICsgNiA+IHQuYnl0ZUxlbmd0aCB8fCAoYSA9IHQuZ2V0VWludDE2KGksIG4pLCByID0gaSArIDIgKyAxMiAqIGEsIHIgKyA0ID4gdC5ieXRlTGVuZ3RoKSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHMgPSAwOyBzIDwgYTsgcyArPSAxKSB0aGlzLnBhcnNlRXhpZlRhZyh0LCBlLCBpICsgMiArIDEyICogcywgbiwgbyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQuZ2V0VWludDMyKHIsIG4pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIG4ucGFyc2VFeGlmRGF0YSA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvLCBhKSB7XG4gICAgICAgICAgICBpZiAoIWEuZGlzYWJsZUV4aWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgciwgcywgaCwgdSA9IGUgKyAxMDtcbiAgICAgICAgICAgICAgICBpZiAoMTE2NTUxOTIwNiA9PT0gdC5nZXRVaW50MzIoZSArIDQpICYmICEodSArIDggPiB0LmJ5dGVMZW5ndGgpICYmIDAgPT09IHQuZ2V0VWludDE2KGUgKyA4KSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQuZ2V0VWludDE2KHUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4NzYxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAhMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk3ODk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9ICExO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA0MiA9PT0gdC5nZXRVaW50MTYodSArIDIsIHIpICYmIChzID0gdC5nZXRVaW50MzIodSArIDQsIHIpLCBvLmV4aWYgPSBuZXcgbi5FeGlmTWFwLCBzID0gbi5wYXJzZUV4aWZUYWdzKHQsIHUsIHUgKyBzLCByLCBvKSwgcyAmJiAhYS5kaXNhYmxlRXhpZlRodW1ibmFpbCAmJiAoaCA9IHtleGlmOiB7fX0sIHMgPSBuLnBhcnNlRXhpZlRhZ3ModCwgdSwgdSArIHMsIHIsIGgpLCBoLmV4aWZbNTEzXSAmJiAoby5leGlmLlRodW1ibmFpbCA9IG4uZ2V0RXhpZlRodW1ibmFpbCh0LCB1ICsgaC5leGlmWzUxM10sIGguZXhpZls1MTRdKSkpLCBvLmV4aWZbMzQ2NjVdICYmICFhLmRpc2FibGVFeGlmU3ViICYmIG4ucGFyc2VFeGlmVGFncyh0LCB1LCB1ICsgby5leGlmWzM0NjY1XSwgciwgbyksIG8uZXhpZlszNDg1M10gJiYgIWEuZGlzYWJsZUV4aWZHcHMgJiYgbi5wYXJzZUV4aWZUYWdzKHQsIHUsIHUgKyBvLmV4aWZbMzQ4NTNdLCByLCBvKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIG4ubWV0YURhdGFQYXJzZXJzLmpwZWdbNjU1MDVdLnB1c2gobi5wYXJzZUV4aWZEYXRhKTtcbiAgICAgICAgdmFyIHUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdCA9IFtdLCBpID0gW10sIG4gPSBbXSwgbyA9IFwidHJhbnNmb3JtXCIsIGEgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIFwiXCIpLFxuICAgICAgICAgICAgICAgIHIgPSAoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSkuam9pbihcIlwiKS5tYXRjaCgvLShtb3p8d2Via2l0fG1zKS0vKSB8fCBcIlwiID09PSBhLk9MaW5rICYmIFtcIlwiLCBcIm9cIl0pWzFdO1xuICAgICAgICAgICAgXCJ3ZWJraXRcIiA9PT0gciAmJiAobyA9IFwid2Via2l0VHJhbnNmb3JtXCIpO1xuICAgICAgICAgICAgdmFyIHMgPSBmdW5jdGlvbiAodCwgaSwgbikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvLmxlbmd0aCAhPT0gZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbmVyczogW10sIHRoZW46IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNuYWJidCh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHNuYWJidDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmNoYWluZXJzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5lcnMuZm9yRWFjaChmdW5jdGlvbiAoaSwgbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5zbmFiYnQoaCh0LCBuLCBlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzZXRWYWx1ZTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5lcnMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXRWYWx1ZSh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZpbmlzaDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFpbmVycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmZpbmlzaCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm9sbGJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhaW5lcnMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5yb2xsYmFjaygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgciA9IDAsIHMgPSBvLmxlbmd0aDsgciA8IHM7ICsrcikgXCJzdHJpbmdcIiA9PSB0eXBlb2YgaSA/IGEuY2hhaW5lcnMucHVzaCh1KG9bcl0sIGksIGgobiwgciwgcykpKSA6IGEuY2hhaW5lcnMucHVzaCh1KG9bcl0sIGgoaSwgciwgcyksIG4pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwic3RyaW5nXCIgPT0gdHlwZW9mIGkgPyB1KG8sIGksIGgobiwgMCwgMSkpIDogdShvLCBoKGksIDAsIDEpLCBuKVxuICAgICAgICAgICAgICAgIH0sIGggPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXQpIHJldHVybiB0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICQodCk7XG4gICAgICAgICAgICAgICAgICAgIEoodC5kZWxheSkgJiYgKG4uZGVsYXkgPSB0LmRlbGF5KGUsIGkpKSwgSih0LmNhbGxiYWNrKSAmJiAobi5jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQuY2FsbGJhY2suY2FsbCh0aGlzLCBlLCBpKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBKKHQuYWxsRG9uZSksIGEgPSBKKHQuY29tcGxldGUpO1xuICAgICAgICAgICAgICAgICAgICAoYSB8fCBvKSAmJiAobi5jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgdC5jb21wbGV0ZS5jYWxsKHRoaXMsIGUsIGkpLCBvICYmIGUgPT0gaSAtIDEgJiYgdC5hbGxEb25lKClcbiAgICAgICAgICAgICAgICAgICAgfSksIEoodC52YWx1ZUZlZWRlcikgJiYgKG4udmFsdWVGZWVkZXIgPSBmdW5jdGlvbiAobiwgbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudmFsdWVGZWVkZXIobiwgbywgZSwgaSlcbiAgICAgICAgICAgICAgICAgICAgfSksIEoodC5lYXNpbmcpICYmIChuLmVhc2luZyA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5lYXNpbmcobiwgZSwgaSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByID0gW1wicG9zaXRpb25cIiwgXCJyb3RhdGlvblwiLCBcInNrZXdcIiwgXCJyb3RhdGlvblBvc3RcIiwgXCJzY2FsZVwiLCBcIndpZHRoXCIsIFwiaGVpZ2h0XCIsIFwib3BhY2l0eVwiLCBcImZyb21Qb3NpdGlvblwiLCBcImZyb21Sb3RhdGlvblwiLCBcImZyb21Ta2V3XCIsIFwiZnJvbVJvdGF0aW9uUG9zdFwiLCBcImZyb21TY2FsZVwiLCBcImZyb21XaWR0aFwiLCBcImZyb21IZWlnaHRcIiwgXCJmcm9tT3BhY2l0eVwiLCBcInRyYW5zZm9ybU9yaWdpblwiLCBcImR1cmF0aW9uXCIsIFwiZGVsYXlcIl07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByLmZvckVhY2goZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEoodFtvXSkgJiYgKG5bb10gPSB0W29dKGUsIGkpKVxuICAgICAgICAgICAgICAgICAgICB9KSwgblxuICAgICAgICAgICAgICAgIH0sIHUgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLnRpY2soZSksIGYudXBkYXRlRWxlbWVudCh0KSwgIWYuaXNTdG9wcGVkKCkpIHJldHVybiBmLmNvbXBsZXRlZCgpID8gdm9pZChhLmxvb3AgPiAxICYmICFmLmlzU3RvcHBlZCgpID8gKGEubG9vcCAtPSAxLCBmLnJlc3RhcnQoKSwgayhvKSkgOiAoYS5jb21wbGV0ZSAmJiBhLmNvbXBsZXRlLmNhbGwodCksIF8ubGVuZ3RoICYmIChhID0gXy5wb3AoKSwgcyA9IHkoYSwgdSwgITApLCB1ID0geShhLCAkKHUpKSwgYSA9IHcocywgdSwgYSksIGYgPSBTKGEpLCBpLnB1c2goW3QsIGZdKSwgZi50aWNrKGUpLCBrKG8pKSkpIDogayhvKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFwiYXR0ZW50aW9uXCIgPT09IGUpIHJldHVybiBsKHQsIG4pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXCJzdG9wXCIgPT09IGUpIHJldHVybiBwKHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXCJkZXRhY2hcIiA9PT0gZSkgcmV0dXJuIGQodCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhID0gZTtcbiAgICAgICAgICAgICAgICAgICAgbSgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHYodCksIHMgPSByO1xuICAgICAgICAgICAgICAgICAgICBzID0geShhLCBzLCAhMCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB1ID0gJChyKTtcbiAgICAgICAgICAgICAgICAgICAgdSA9IHkoYSwgdSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjID0gdyhzLCB1LCBhKSwgZiA9IFMoYyk7XG4gICAgICAgICAgICAgICAgICAgIGkucHVzaChbdCwgZl0pLCBmLnVwZGF0ZUVsZW1lbnQodCwgITApO1xuICAgICAgICAgICAgICAgICAgICB2YXIgXyA9IFtdLCBnID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc25hYmJ0OiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfLnVuc2hpZnQoaCh0LCAwLCAxKSksIGdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoZW46IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc25hYmJ0KHQpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrKG8pLCBhLm1hbnVhbCA/IGYgOiBnXG4gICAgICAgICAgICAgICAgfSwgbCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYS50aWNrKGkpLCBhLnVwZGF0ZUVsZW1lbnQodCksIGEuY29tcGxldGVkKCkgPyAoZS5jYWxsYmFjayAmJiBlLmNhbGxiYWNrKHQpLCBlLmxvb3AgJiYgZS5sb29wID4gMSAmJiAoZS5sb29wLS0sIGEucmVzdGFydCgpLCBrKG4pKSkgOiBrKG4pXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHkoZSwgcSh7fSkpO1xuICAgICAgICAgICAgICAgICAgICBlLm1vdmVtZW50ID0gbztcbiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBFKGUpO1xuICAgICAgICAgICAgICAgICAgICBpLnB1c2goW3QsIGFdKSwgayhuKVxuICAgICAgICAgICAgICAgIH0sIHAgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMCwgbiA9IGkubGVuZ3RoOyBlIDwgbjsgKytlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGlbZV0sIGEgPSBvWzBdLCByID0gb1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGEgPT09IHQgJiYgci5zdG9wKClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSBpZiAodFtpXVswXSA9PT0gZSkgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMVxuICAgICAgICAgICAgICAgIH0sIGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZSwgbywgYSA9IFtdLCByID0gaS5jb25jYXQobiksIHMgPSByLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChvID0gMDsgbyA8IHM7ICsrbykgZSA9IHJbb11bMF0sICh0LmNvbnRhaW5zKGUpIHx8IHQgPT09IGUpICYmIGEucHVzaChlKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChzID0gYS5sZW5ndGgsIG8gPSAwOyBvIDwgczsgKytvKSBmKGFbb10pXG4gICAgICAgICAgICAgICAgfSwgZiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHAodCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlID0gYyhpLCB0KTtcbiAgICAgICAgICAgICAgICAgICAgZSA+PSAwICYmIGkuc3BsaWNlKGUsIDEpLCBlID0gYyhuLCB0KSwgZSA+PSAwICYmIG4uc3BsaWNlKGUsIDEpXG4gICAgICAgICAgICAgICAgfSwgXyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gdFtpXSwgYSA9IG9bMF0sIHIgPSBvWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT09IGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHIuZ2V0Q3VycmVudFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuc3RvcCgpLCBzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBuID0gbi5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKHRbMF0pLmJvZHlcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9LCBnID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHQ7IGUucGFyZW50Tm9kZTspIGUgPSBlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlXG4gICAgICAgICAgICAgICAgfSwgdiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlID0gXyhpLCB0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPyBlIDogXyhuLCB0KVxuICAgICAgICAgICAgICAgIH0sIHkgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgICAgICAgICAgICAgICBlIHx8IChlID0gcSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogWzAsIDAsIDBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb246IFswLCAwLCAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uUG9zdDogWzAsIDAsIDBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IFsxLCAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNrZXc6IFswLCAwXVxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuID0gXCJwb3NpdGlvblwiLCBvID0gXCJyb3RhdGlvblwiLCBhID0gXCJza2V3XCIsIHIgPSBcInJvdGF0aW9uUG9zdFwiLCBzID0gXCJzY2FsZVwiLCBoID0gXCJzY2FsZVBvc3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBcIndpZHRoXCIsIGwgPSBcImhlaWdodFwiLCBwID0gXCJvcGFjaXR5XCI7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpICYmIChuID0gXCJmcm9tUG9zaXRpb25cIiwgbyA9IFwiZnJvbVJvdGF0aW9uXCIsIGEgPSBcImZyb21Ta2V3XCIsIHIgPSBcImZyb21Sb3RhdGlvblBvc3RcIiwgcyA9IFwiZnJvbVNjYWxlXCIsIGggPSBcImZyb21TY2FsZVBvc3RcIiwgdSA9IFwiZnJvbVdpZHRoXCIsIGwgPSBcImZyb21IZWlnaHRcIiwgcCA9IFwiZnJvbU9wYWNpdHlcIiksIGUucG9zaXRpb24gPSBHKHRbbl0sIGUucG9zaXRpb24pLCBlLnJvdGF0aW9uID0gRyh0W29dLCBlLnJvdGF0aW9uKSwgZS5yb3RhdGlvblBvc3QgPSBHKHRbcl0sIGUucm90YXRpb25Qb3N0KSwgZS5za2V3ID0gRyh0W2FdLCBlLnNrZXcpLCBlLnNjYWxlID0gRyh0W3NdLCBlLnNjYWxlKSwgZS5zY2FsZVBvc3QgPSBHKHRbaF0sIGUuc2NhbGVQb3N0KSwgZS5vcGFjaXR5ID0gdFtwXSwgZS53aWR0aCA9IHRbdV0sIGUuaGVpZ2h0ID0gdFtsXSwgZVxuICAgICAgICAgICAgICAgIH0sIHcgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5zdGFydFN0YXRlID0gdCwgaS5lbmRTdGF0ZSA9IGUsIGlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGIgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCB3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQodCwgMWUzIC8gNjApXG4gICAgICAgICAgICAgICAgfSwgayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIDAgPT09IHQubGVuZ3RoICYmIGIoeCksIHQucHVzaChlKVxuICAgICAgICAgICAgICAgIH0sIHggPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBvID0gdC5sZW5ndGgsIGEgPSAwOyBhIDwgbzsgKythKSB0W2FdKGUpO1xuICAgICAgICAgICAgICAgICAgICB0LnNwbGljZSgwLCBvKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBpLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbMV0uY29tcGxldGVkKClcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIG4gPSBuLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDAsIGkgPSByLmxlbmd0aDsgZSA8IGk7ICsrZSkgaWYgKHRbMF0gPT09IHJbZV1bMF0pIHJldHVybiAhMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMFxuICAgICAgICAgICAgICAgICAgICB9KSwgbiA9IG4uY29uY2F0KHIpLCBpID0gaS5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdFsxXS5jb21wbGV0ZWQoKVxuICAgICAgICAgICAgICAgICAgICB9KSwgMCAhPT0gdC5sZW5ndGggJiYgYih4KVxuICAgICAgICAgICAgICAgIH0sIFMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQuc3RhcnRTdGF0ZSwgbiA9IHQuZW5kU3RhdGUsIG8gPSBHKHQuZHVyYXRpb24sIDUwMCksIGEgPSBHKHQuZGVsYXksIDApLCByID0gdC5wZXJzcGVjdGl2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBMKEcodC5lYXNpbmcsIFwibGluZWFyXCIpLCB0KSwgaCA9IDAgPT09IG8gPyBuLmNsb25lKCkgOiBpLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIHQudHJhbnNmb3JtT3JpZ2luO1xuICAgICAgICAgICAgICAgICAgICBoLnRyYW5zZm9ybU9yaWdpbiA9IHQudHJhbnNmb3JtT3JpZ2luO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdSwgbCwgcCA9IDAsIGMgPSAwLCBkID0gITEsIGYgPSAhMSwgXyA9IHQubWFudWFsLCBtID0gMCwgZyA9IGEgLyBvO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbCA9IHQudmFsdWVGZWVkZXIgPyBWKHQudmFsdWVGZWVkZXIsIGksIG4sIGgpIDogaihpLCBuLCBoKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSAhMFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgaXNTdG9wcGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZpbmlzaDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfID0gITE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBvICogbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gYyAtIGUsIHUgPSB0LCBzLnJlc2V0RnJvbSA9IG1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvbGxiYWNrOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gPSAhMSwgbC5zZXRSZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBvICogKDEgLSBtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gYyAtIGUsIHUgPSB0LCBzLnJlc2V0RnJvbSA9IG1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJlc3RhcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gZSwgcy5yZXNldEZyb20oMClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRpY2s6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfKSByZXR1cm4gYyA9IHQsIHZvaWQgdGhpcy51cGRhdGVDdXJyZW50VHJhbnNmb3JtKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwIHx8IChwID0gdCksIHQgLSBwID4gYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9ICEwLCBjID0gdCAtIGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IE1hdGgubWluKE1hdGgubWF4KDAsIGMgLSBwKSwgbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnRpY2soZSAvIG8pLCB0aGlzLnVwZGF0ZUN1cnJlbnRUcmFuc2Zvcm0oKSwgdGhpcy5jb21wbGV0ZWQoKSAmJiB1ICYmIHUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZ2V0Q3VycmVudFN0YXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHNldFZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSAhMCwgbSA9IE1hdGgubWluKE1hdGgubWF4KHQsIDFlLTQpLCAxICsgZylcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHVwZGF0ZUN1cnJlbnRUcmFuc2Zvcm06IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHMuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IE1hdGgubWF4KDFlLTUsIG0gLSBnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy50aWNrKGUpLCB0ID0gcy5nZXRWYWx1ZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwudHdlZW4odClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGNvbXBsZXRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWQgfHwgMCAhPT0gcCAmJiBzLmNvbXBsZXRlZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB1cGRhdGVFbGVtZW50OiBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmIHx8IGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBsLmFzTWF0cml4KCksIG4gPSBsLmdldFByb3BlcnRpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWCh0LCBpLCByKSwgWSh0LCBuKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIEUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQubW92ZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHQuaW5pdGlhbFZlbG9jaXR5ID0gLjEsIHQuZXF1aWxpYnJpdW1Qb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuID0gVCh0KSwgbyA9ICExLCBhID0gaS5wb3NpdGlvbiwgciA9IGkucm90YXRpb24sIHMgPSBpLnJvdGF0aW9uUG9zdCwgaCA9IGkuc2NhbGUsIHUgPSBpLnNrZXcsXG4gICAgICAgICAgICAgICAgICAgICAgICBsID0gcSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGEgPyBbMCwgMCwgMF0gOiBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiByID8gWzAsIDAsIDBdIDogZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvblBvc3Q6IHMgPyBbMCwgMCwgMF0gOiBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiBoID8gWzAsIDBdIDogZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2V3OiB1ID8gWzAsIDBdIDogZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9wOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9ICEwXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBpc1N0b3BwZWQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRpY2s6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbyB8fCBuLmVxdWlsaWJyaXVtIHx8IChuLnRpY2soKSwgdGhpcy51cGRhdGVNb3ZlbWVudCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdXBkYXRlTW92ZW1lbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG4uZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICYmIChsLnBvc2l0aW9uWzBdID0gaS5wb3NpdGlvblswXSAqIHQsIGwucG9zaXRpb25bMV0gPSBpLnBvc2l0aW9uWzFdICogdCwgbC5wb3NpdGlvblsyXSA9IGkucG9zaXRpb25bMl0gKiB0KSwgciAmJiAobC5yb3RhdGlvblswXSA9IGkucm90YXRpb25bMF0gKiB0LCBsLnJvdGF0aW9uWzFdID0gaS5yb3RhdGlvblsxXSAqIHQsIGwucm90YXRpb25bMl0gPSBpLnJvdGF0aW9uWzJdICogdCksIHMgJiYgKGwucm90YXRpb25Qb3N0WzBdID0gaS5yb3RhdGlvblBvc3RbMF0gKiB0LCBsLnJvdGF0aW9uUG9zdFsxXSA9IGkucm90YXRpb25Qb3N0WzFdICogdCwgbC5yb3RhdGlvblBvc3RbMl0gPSBpLnJvdGF0aW9uUG9zdFsyXSAqIHQpLCBoICYmIChsLnNjYWxlWzBdID0gMSArIGkuc2NhbGVbMF0gKiB0LCBsLnNjYWxlWzFdID0gMSArIGkuc2NhbGVbMV0gKiB0KSwgdSAmJiAobC5za2V3WzBdID0gaS5za2V3WzBdICogdCwgbC5za2V3WzFdID0gaS5za2V3WzFdICogdClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHVwZGF0ZUVsZW1lbnQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWCh0LCBsLmFzTWF0cml4KCkpLCBZKHQsIGwuZ2V0UHJvcGVydGllcygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZ2V0Q3VycmVudFN0YXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGNvbXBsZXRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmVxdWlsaWJyaXVtIHx8IG9cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJlc3RhcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gVCh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgQyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0XG4gICAgICAgICAgICAgICAgfSwgUCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoTWF0aC5jb3ModCAqIE1hdGguUEkgKyBNYXRoLlBJKSArIDEpIC8gMlxuICAgICAgICAgICAgICAgIH0sIE0gPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAqIHRcbiAgICAgICAgICAgICAgICB9LCBSID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1NYXRoLnBvdyh0IC0gMSwgMikgKyAxXG4gICAgICAgICAgICAgICAgfSwgVCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlID0gRyh0LnN0YXJ0UG9zaXRpb24sIDApLCBpID0gRyh0LmVxdWlsaWJyaXVtUG9zaXRpb24sIDEpLCBuID0gRyh0LmluaXRpYWxWZWxvY2l0eSwgMCksXG4gICAgICAgICAgICAgICAgICAgICAgICBvID0gRyh0LnNwcmluZ0NvbnN0YW50LCAuOCksIGEgPSBHKHQuc3ByaW5nRGVjZWxlcmF0aW9uLCAuOSksIHIgPSBHKHQuc3ByaW5nTWFzcywgMTApLCBzID0gITE7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwICE9PSB0ICYmICFzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gLShlIC0gaSkgKiBvLCB1ID0gaCAvIHI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gKz0gdSwgZSArPSBuLCBuICo9IGEsIE1hdGguYWJzKGUgLSBpKSA8IC4wMDEgJiYgTWF0aC5hYnMobikgPCAuMDAxICYmIChzID0gITApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcmVzZXRGcm9tOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0LCBuID0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZ2V0VmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyA/IGkgOiBlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBjb21wbGV0ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgSSA9IHtsaW5lYXI6IEMsIGVhc2U6IFAsIGVhc2VJbjogTSwgZWFzZU91dDogUn0sIEwgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXCJzcHJpbmdcIiA9PSB0KSByZXR1cm4gVChlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0O1xuICAgICAgICAgICAgICAgICAgICBKKHQpIHx8IChpID0gSVt0XSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuLCBvID0gaSwgYSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBvKHQpLCBuID0gdFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcmVzZXRGcm9tOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBnZXRWYWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBjb21wbGV0ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA+PSAxICYmIG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIE8gPSBmdW5jdGlvbiAodCwgZSwgaSwgbikge1xuICAgICAgICAgICAgICAgICAgICB0WzBdID0gMSwgdFsxXSA9IDAsIHRbMl0gPSAwLCB0WzNdID0gMCwgdFs0XSA9IDAsIHRbNV0gPSAxLCB0WzZdID0gMCwgdFs3XSA9IDAsIHRbOF0gPSAwLCB0WzldID0gMCwgdFsxMF0gPSAxLCB0WzExXSA9IDAsIHRbMTJdID0gZSwgdFsxM10gPSBpLCB0WzE0XSA9IG4sIHRbMTVdID0gMVxuICAgICAgICAgICAgICAgIH0sIHogPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICAgICAgICB0WzBdID0gMSwgdFsxXSA9IDAsIHRbMl0gPSAwLCB0WzNdID0gMCwgdFs0XSA9IDAsIHRbNV0gPSBNYXRoLmNvcyhlKSwgdFs2XSA9IC1NYXRoLnNpbihlKSwgdFs3XSA9IDAsIHRbOF0gPSAwLCB0WzldID0gTWF0aC5zaW4oZSksIHRbMTBdID0gTWF0aC5jb3MoZSksIHRbMTFdID0gMCwgdFsxMl0gPSAwLCB0WzEzXSA9IDAsIHRbMTRdID0gMCwgdFsxNV0gPSAxXG4gICAgICAgICAgICAgICAgfSwgRCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRbMF0gPSBNYXRoLmNvcyhlKSwgdFsxXSA9IDAsIHRbMl0gPSBNYXRoLnNpbihlKSwgdFszXSA9IDAsIHRbNF0gPSAwLCB0WzVdID0gMSwgdFs2XSA9IDAsIHRbN10gPSAwLCB0WzhdID0gLU1hdGguc2luKGUpLCB0WzldID0gMCwgdFsxMF0gPSBNYXRoLmNvcyhlKSwgdFsxMV0gPSAwLCB0WzEyXSA9IDAsIHRbMTNdID0gMCwgdFsxNF0gPSAwLCB0WzE1XSA9IDFcbiAgICAgICAgICAgICAgICB9LCBBID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdFswXSA9IE1hdGguY29zKGUpLCB0WzFdID0gLU1hdGguc2luKGUpLCB0WzJdID0gMCwgdFszXSA9IDAsIHRbNF0gPSBNYXRoLnNpbihlKSwgdFs1XSA9IE1hdGguY29zKGUpLCB0WzZdID0gMCwgdFs3XSA9IDAsIHRbOF0gPSAwLCB0WzldID0gMCwgdFsxMF0gPSAxLCB0WzExXSA9IDAsIHRbMTJdID0gMCwgdFsxM10gPSAwLCB0WzE0XSA9IDAsIHRbMTVdID0gMVxuICAgICAgICAgICAgICAgIH0sIFUgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgICAgICAgICAgICAgICB0WzBdID0gMSwgdFsxXSA9IE1hdGgudGFuKGUpLCB0WzJdID0gMCwgdFszXSA9IDAsIHRbNF0gPSBNYXRoLnRhbihpKSwgdFs1XSA9IDEsIHRbNl0gPSAwLCB0WzddID0gMCwgdFs4XSA9IDAsIHRbOV0gPSAwLCB0WzEwXSA9IDEsIHRbMTFdID0gMCwgdFsxMl0gPSAwLCB0WzEzXSA9IDAsIHRbMTRdID0gMCwgdFsxNV0gPSAxXG4gICAgICAgICAgICAgICAgfSwgSCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRbMF0gPSBlLCB0WzFdID0gMCwgdFsyXSA9IDAsIHRbM10gPSAwLCB0WzRdID0gMCwgdFs1XSA9IGksIHRbNl0gPSAwLCB0WzddID0gMCwgdFs4XSA9IDAsIHRbOV0gPSAwLCB0WzEwXSA9IDEsIHRbMTFdID0gMCwgdFsxMl0gPSAwLCB0WzEzXSA9IDAsIHRbMTRdID0gMCwgdFsxNV0gPSAxXG4gICAgICAgICAgICAgICAgfSwgTiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRbMF0gPSAxLCB0WzFdID0gMCwgdFsyXSA9IDAsIHRbM10gPSAwLCB0WzRdID0gMCwgdFs1XSA9IDEsIHRbNl0gPSAwLCB0WzddID0gMCwgdFs4XSA9IDAsIHRbOV0gPSAwLCB0WzEwXSA9IDEsIHRbMTFdID0gMCwgdFsxMl0gPSAwLCB0WzEzXSA9IDAsIHRbMTRdID0gMCwgdFsxNV0gPSAxXG4gICAgICAgICAgICAgICAgfSwgQiA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVbMF0gPSB0WzBdLCBlWzFdID0gdFsxXSwgZVsyXSA9IHRbMl0sIGVbM10gPSB0WzNdLCBlWzRdID0gdFs0XSwgZVs1XSA9IHRbNV0sIGVbNl0gPSB0WzZdLCBlWzddID0gdFs3XSwgZVs4XSA9IHRbOF0sIGVbOV0gPSB0WzldLCBlWzEwXSA9IHRbMTBdLCBlWzExXSA9IHRbMTFdLCBlWzEyXSA9IHRbMTJdLCBlWzEzXSA9IHRbMTNdLCBlWzE0XSA9IHRbMTRdLCBlWzE1XSA9IHRbMTVdXG4gICAgICAgICAgICAgICAgfSwgRiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgRmxvYXQzMkFycmF5KDE2KSwgZSA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpLCBpID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBOKHQpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0LCBhc0NTUzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBcIm1hdHJpeDNkKFwiLCBpID0gMDsgaSA8IDE1OyArK2kpIGUgKz0gTWF0aC5hYnModFtpXSkgPCAxZS00ID8gXCIwLFwiIDogdFtpXS50b0ZpeGVkKDEwKSArIFwiLFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICs9IE1hdGguYWJzKHRbMTVdKSA8IDFlLTQgPyBcIjApXCIgOiB0WzE1XS50b0ZpeGVkKDEwKSArIFwiKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBjbGVhcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4odClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRyYW5zbGF0ZTogZnVuY3Rpb24gKG4sIG8sIGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQih0LCBlKSwgTyhpLCBuLCBvLCBhKSwgVyhlLCBpLCB0KSwgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm90YXRlWDogZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQih0LCBlKSwgeihpLCBuKSwgVyhlLCBpLCB0KSwgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm90YXRlWTogZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQih0LCBlKSwgRChpLCBuKSwgVyhlLCBpLCB0KSwgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm90YXRlWjogZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQih0LCBlKSwgQShpLCBuKSwgVyhlLCBpLCB0KSwgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgc2NhbGU6IGZ1bmN0aW9uIChuLCBvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEIodCwgZSksIEgoaSwgbiwgbyksIFcoZSwgaSwgdCksIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHNrZXc6IGZ1bmN0aW9uIChuLCBvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEIodCwgZSksIFUoaSwgbiwgbyksIFcoZSwgaSwgdCksIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIFcgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVswXSA9IHRbMF0gKiBlWzBdICsgdFsxXSAqIGVbNF0gKyB0WzJdICogZVs4XSArIHRbM10gKiBlWzEyXSwgaVsxXSA9IHRbMF0gKiBlWzFdICsgdFsxXSAqIGVbNV0gKyB0WzJdICogZVs5XSArIHRbM10gKiBlWzEzXSwgaVsyXSA9IHRbMF0gKiBlWzJdICsgdFsxXSAqIGVbNl0gKyB0WzJdICogZVsxMF0gKyB0WzNdICogZVsxNF0sIGlbM10gPSB0WzBdICogZVszXSArIHRbMV0gKiBlWzddICsgdFsyXSAqIGVbMTFdICsgdFszXSAqIGVbMTVdLCBpWzRdID0gdFs0XSAqIGVbMF0gKyB0WzVdICogZVs0XSArIHRbNl0gKiBlWzhdICsgdFs3XSAqIGVbMTJdLCBpWzVdID0gdFs0XSAqIGVbMV0gKyB0WzVdICogZVs1XSArIHRbNl0gKiBlWzldICsgdFs3XSAqIGVbMTNdLCBpWzZdID0gdFs0XSAqIGVbMl0gKyB0WzVdICogZVs2XSArIHRbNl0gKiBlWzEwXSArIHRbN10gKiBlWzE0XSwgaVs3XSA9IHRbNF0gKiBlWzNdICsgdFs1XSAqIGVbN10gKyB0WzZdICogZVsxMV0gKyB0WzddICogZVsxNV0sIGlbOF0gPSB0WzhdICogZVswXSArIHRbOV0gKiBlWzRdICsgdFsxMF0gKiBlWzhdICsgdFsxMV0gKiBlWzEyXSwgaVs5XSA9IHRbOF0gKiBlWzFdICsgdFs5XSAqIGVbNV0gKyB0WzEwXSAqIGVbOV0gKyB0WzExXSAqIGVbMTNdLCBpWzEwXSA9IHRbOF0gKiBlWzJdICsgdFs5XSAqIGVbNl0gKyB0WzEwXSAqIGVbMTBdICsgdFsxMV0gKiBlWzE0XSwgaVsxMV0gPSB0WzhdICogZVszXSArIHRbOV0gKiBlWzddICsgdFsxMF0gKiBlWzExXSArIHRbMTFdICogZVsxNV0sIGlbMTJdID0gdFsxMl0gKiBlWzBdICsgdFsxM10gKiBlWzRdICsgdFsxNF0gKiBlWzhdICsgdFsxNV0gKiBlWzEyXSwgaVsxM10gPSB0WzEyXSAqIGVbMV0gKyB0WzEzXSAqIGVbNV0gKyB0WzE0XSAqIGVbOV0gKyB0WzE1XSAqIGVbMTNdLCBpWzE0XSA9IHRbMTJdICogZVsyXSArIHRbMTNdICogZVs2XSArIHRbMTRdICogZVsxMF0gKyB0WzE1XSAqIGVbMTRdLCBpWzE1XSA9IHRbMTJdICogZVszXSArIHRbMTNdICogZVs3XSArIHRbMTRdICogZVsxMV0gKyB0WzE1XSAqIGVbMTVdLCBpXG4gICAgICAgICAgICAgICAgfSwgcSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0gRigpLCBuID0ge29wYWNpdHk6IGUsIHdpZHRoOiBlLCBoZWlnaHQ6IGV9O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHQucG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbjogdC5yb3RhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uUG9zdDogdC5yb3RhdGlvblBvc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBza2V3OiB0LnNrZXcsXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZTogdC5zY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlUG9zdDogdC5zY2FsZVBvc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiB0Lm9wYWNpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdC53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBxKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb24gPyB0aGlzLnBvc2l0aW9uLnNsaWNlKDApIDogZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24gPyB0aGlzLnJvdGF0aW9uLnNsaWNlKDApIDogZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25Qb3N0OiB0aGlzLnJvdGF0aW9uUG9zdCA/IHRoaXMucm90YXRpb25Qb3N0LnNsaWNlKDApIDogZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tldzogdGhpcy5za2V3ID8gdGhpcy5za2V3LnNsaWNlKDApIDogZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IHRoaXMuc2NhbGUgPyB0aGlzLnNjYWxlLnNsaWNlKDApIDogZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVQb3N0OiB0aGlzLnNjYWxlUG9zdCA/IHRoaXMuc2NhbGVQb3N0LnNsaWNlKDApIDogZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IHRoaXMub3BhY2l0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXNNYXRyaXg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY2xlYXIoKSwgdGhpcy50cmFuc2Zvcm1PcmlnaW4gJiYgdC50cmFuc2xhdGUoLXRoaXMudHJhbnNmb3JtT3JpZ2luWzBdLCAtdGhpcy50cmFuc2Zvcm1PcmlnaW5bMV0sIC10aGlzLnRyYW5zZm9ybU9yaWdpblsyXSksIHRoaXMuc2NhbGUgJiYgdC5zY2FsZSh0aGlzLnNjYWxlWzBdLCB0aGlzLnNjYWxlWzFdKSwgdGhpcy5za2V3ICYmIHQuc2tldyh0aGlzLnNrZXdbMF0sIHRoaXMuc2tld1sxXSksIHRoaXMucm90YXRpb24gJiYgKHQucm90YXRlWCh0aGlzLnJvdGF0aW9uWzBdKSwgdC5yb3RhdGVZKHRoaXMucm90YXRpb25bMV0pLCB0LnJvdGF0ZVoodGhpcy5yb3RhdGlvblsyXSkpLCB0aGlzLnBvc2l0aW9uICYmIHQudHJhbnNsYXRlKHRoaXMucG9zaXRpb25bMF0sIHRoaXMucG9zaXRpb25bMV0sIHRoaXMucG9zaXRpb25bMl0pLCB0aGlzLnJvdGF0aW9uUG9zdCAmJiAodC5yb3RhdGVYKHRoaXMucm90YXRpb25Qb3N0WzBdKSwgdC5yb3RhdGVZKHRoaXMucm90YXRpb25Qb3N0WzFdKSwgdC5yb3RhdGVaKHRoaXMucm90YXRpb25Qb3N0WzJdKSksIHRoaXMuc2NhbGVQb3N0ICYmIHQuc2NhbGUodGhpcy5zY2FsZVBvc3RbMF0sIHRoaXMuc2NhbGVQb3N0WzFdKSwgdGhpcy50cmFuc2Zvcm1PcmlnaW4gJiYgdC50cmFuc2xhdGUodGhpcy50cmFuc2Zvcm1PcmlnaW5bMF0sIHRoaXMudHJhbnNmb3JtT3JpZ2luWzFdLCB0aGlzLnRyYW5zZm9ybU9yaWdpblsyXSksIHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0aWVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ub3BhY2l0eSA9IHRoaXMub3BhY2l0eSwgbi53aWR0aCA9IHRoaXMud2lkdGggKyBcInB4XCIsIG4uaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyBcInB4XCIsIG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGogPSBmdW5jdGlvbiAodCwgaSwgbikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHQsIGEgPSBpLCByID0gbiwgcyA9IGEucG9zaXRpb24gIT09IGUsIGggPSBhLnJvdGF0aW9uICE9PSBlLCB1ID0gYS5yb3RhdGlvblBvc3QgIT09IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsID0gYS5zY2FsZSAhPT0gZSwgcCA9IGEuc2tldyAhPT0gZSwgYyA9IGEud2lkdGggIT09IGUsIGQgPSBhLmhlaWdodCAhPT0gZSwgZiA9IGEub3BhY2l0eSAhPT0gZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR3ZWVuOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYS5wb3NpdGlvblswXSAtIG8ucG9zaXRpb25bMF0sIGkgPSBhLnBvc2l0aW9uWzFdIC0gby5wb3NpdGlvblsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBhLnBvc2l0aW9uWzJdIC0gby5wb3NpdGlvblsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5wb3NpdGlvblswXSA9IG8ucG9zaXRpb25bMF0gKyB0ICogZSwgci5wb3NpdGlvblsxXSA9IG8ucG9zaXRpb25bMV0gKyB0ICogaSwgci5wb3NpdGlvblsyXSA9IG8ucG9zaXRpb25bMl0gKyB0ICogblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyA9IGEucm90YXRpb25bMF0gLSBvLnJvdGF0aW9uWzBdLCBtID0gYS5yb3RhdGlvblsxXSAtIG8ucm90YXRpb25bMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gYS5yb3RhdGlvblsyXSAtIG8ucm90YXRpb25bMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIucm90YXRpb25bMF0gPSBvLnJvdGF0aW9uWzBdICsgdCAqIF8sIHIucm90YXRpb25bMV0gPSBvLnJvdGF0aW9uWzFdICsgdCAqIG0sIHIucm90YXRpb25bMl0gPSBvLnJvdGF0aW9uWzJdICsgdCAqIGdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBhLnJvdGF0aW9uUG9zdFswXSAtIG8ucm90YXRpb25Qb3N0WzBdLCB5ID0gYS5yb3RhdGlvblBvc3RbMV0gLSBvLnJvdGF0aW9uUG9zdFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBhLnJvdGF0aW9uUG9zdFsyXSAtIG8ucm90YXRpb25Qb3N0WzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnJvdGF0aW9uUG9zdFswXSA9IG8ucm90YXRpb25Qb3N0WzBdICsgdCAqIHYsIHIucm90YXRpb25Qb3N0WzFdID0gby5yb3RhdGlvblBvc3RbMV0gKyB0ICogeSwgci5yb3RhdGlvblBvc3RbMl0gPSBvLnJvdGF0aW9uUG9zdFsyXSArIHQgKiB3XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gYS5zY2FsZVswXSAtIG8uc2NhbGVbMF0sIGsgPSBhLnNjYWxlWzFdIC0gby5zY2FsZVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zY2FsZVswXSA9IG8uc2NhbGVbMF0gKyB0ICogYiwgci5zY2FsZVsxXSA9IG8uc2NhbGVbMV0gKyB0ICoga1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IGEuc2tld1swXSAtIG8uc2tld1swXSwgUyA9IGEuc2tld1sxXSAtIG8uc2tld1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5za2V3WzBdID0gby5za2V3WzBdICsgdCAqIHgsIHIuc2tld1sxXSA9IG8uc2tld1sxXSArIHQgKiBTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBFID0gYS53aWR0aCAtIG8ud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIud2lkdGggPSBvLndpZHRoICsgdCAqIEVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEMgPSBhLmhlaWdodCAtIG8uaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmhlaWdodCA9IG8uaGVpZ2h0ICsgdCAqIENcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFAgPSBhLm9wYWNpdHkgLSBvLm9wYWNpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIub3BhY2l0eSA9IG8ub3BhY2l0eSArIHQgKiBQXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgYXNNYXRyaXg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5hc01hdHJpeCgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBnZXRQcm9wZXJ0aWVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuZ2V0UHJvcGVydGllcygpXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBzZXRSZXZlcnNlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBvO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBhLCBhID0gdFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgViA9IGZ1bmN0aW9uICh0LCBpLCBuLCBvKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhID0gdCgwLCBGKCkpLCByID0gaSwgcyA9IG4sIGggPSBvLCB1ID0gITE7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0d2VlbjogZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ICYmIChpID0gMSAtIGkpLCBhLmNsZWFyKCksIGEgPSB0KGksIGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gcy53aWR0aCAtIHIud2lkdGgsIG8gPSBzLmhlaWdodCAtIHIuaGVpZ2h0LCBsID0gcy5vcGFjaXR5IC0gci5vcGFjaXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMud2lkdGggIT09IGUgJiYgKGgud2lkdGggPSByLndpZHRoICsgaSAqIG4pLCBzLmhlaWdodCAhPT0gZSAmJiAoaC5oZWlnaHQgPSByLmhlaWdodCArIGkgKiBvKSwgcy5vcGFjaXR5ICE9PSBlICYmIChoLm9wYWNpdHkgPSByLm9wYWNpdHkgKyBpICogbClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGFzTWF0cml4OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGdldFByb3BlcnRpZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaC5nZXRQcm9wZXJ0aWVzKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHNldFJldmVyc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gITBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIEcgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2YgdCA/IGUgOiB0XG4gICAgICAgICAgICAgICAgfSwgWCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaSAmJiAobiA9IFwicGVyc3BlY3RpdmUoXCIgKyBpICsgXCJweCkgXCIpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGUuYXNDU1MoKTtcbiAgICAgICAgICAgICAgICAgICAgdC5zdHlsZVtvXSA9IG4gKyBhXG4gICAgICAgICAgICAgICAgfSwgWSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZSkgdC5zdHlsZVtpXSA9IGVbaV1cbiAgICAgICAgICAgICAgICB9LCBKID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdFxuICAgICAgICAgICAgICAgIH0sICQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXQpIHJldHVybiB0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHQpIGVbaV0gPSB0W2ldO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcy5jcmVhdGVNYXRyaXggPSBGLCBzLnNldEVsZW1lbnRUcmFuc2Zvcm0gPSBYLCBzXG4gICAgICAgIH0oKSwgbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgZSwgaSwgbiwgbykge1xuICAgICAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiB0KSB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCk7IGVsc2UgaWYgKCF0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpIHJldHVybjtcbiAgICAgICAgICAgICAgICB2YXIgYSwgciA9IHQuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhID0gci5nZXRJbWFnZURhdGEoZSwgaSwgbiwgbylcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5hYmxlIHRvIGFjY2VzcyBsb2NhbCBpbWFnZSBkYXRhOiBcIiArIHMpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuYWJsZSB0byBhY2Nlc3MgaW1hZ2UgZGF0YTogXCIgKyBzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBlKGUsIG4sIG8sIGEsIHIsIHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShpc05hTihzKSB8fCBzIDwgMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcyB8PSAwO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IHQoZSwgbiwgbywgYSwgcik7XG4gICAgICAgICAgICAgICAgICAgIGggPSBpKGgsIG4sIG8sIGEsIHIsIHMpLCBlLmdldENvbnRleHQoXCIyZFwiKS5wdXRJbWFnZURhdGEoaCwgbiwgbylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGkodCwgZSwgaSwgciwgcywgaCkge1xuICAgICAgICAgICAgICAgIHZhciB1LCBsLCBwLCBjLCBkLCBmLCBfLCBtLCBnLCB2LCB5LCB3LCBiLCBrLCB4LCBTLCBFLCBDLCBQLCBNLCBSLCBULCBJLCBMLCBPID0gdC5kYXRhLCB6ID0gaCArIGggKyAxLFxuICAgICAgICAgICAgICAgICAgICBEID0gciAtIDEsIEEgPSBzIC0gMSwgVSA9IGggKyAxLCBIID0gVSAqIChVICsgMSkgLyAyLCBOID0gbmV3IG4sIEIgPSBOO1xuICAgICAgICAgICAgICAgIGZvciAocCA9IDE7IHAgPCB6OyBwKyspIGlmIChCID0gQi5uZXh0ID0gbmV3IG4sIHAgPT0gVSkgdmFyIEYgPSBCO1xuICAgICAgICAgICAgICAgIEIubmV4dCA9IE47XG4gICAgICAgICAgICAgICAgdmFyIFcgPSBudWxsLCBxID0gbnVsbDtcbiAgICAgICAgICAgICAgICBfID0gZiA9IDA7XG4gICAgICAgICAgICAgICAgdmFyIGogPSBvW2hdLCBWID0gYVtoXTtcbiAgICAgICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgczsgbCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoUyA9IEUgPSBDID0gUCA9IG0gPSBnID0gdiA9IHkgPSAwLCB3ID0gVSAqIChNID0gT1tmXSksIGIgPSBVICogKFIgPSBPW2YgKyAxXSksIGsgPSBVICogKFQgPSBPW2YgKyAyXSksIHggPSBVICogKEkgPSBPW2YgKyAzXSksIG0gKz0gSCAqIE0sIGcgKz0gSCAqIFIsIHYgKz0gSCAqIFQsIHkgKz0gSCAqIEksIEIgPSBOLCBwID0gMDsgcCA8IFU7IHArKykgQi5yID0gTSwgQi5nID0gUiwgQi5iID0gVCwgQi5hID0gSSwgQiA9IEIubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChwID0gMTsgcCA8IFU7IHArKykgYyA9IGYgKyAoKEQgPCBwID8gRCA6IHApIDw8IDIpLCBtICs9IChCLnIgPSBNID0gT1tjXSkgKiAoTCA9IFUgLSBwKSwgZyArPSAoQi5nID0gUiA9IE9bYyArIDFdKSAqIEwsIHYgKz0gKEIuYiA9IFQgPSBPW2MgKyAyXSkgKiBMLCB5ICs9IChCLmEgPSBJID0gT1tjICsgM10pICogTCwgUyArPSBNLCBFICs9IFIsIEMgKz0gVCwgUCArPSBJLCBCID0gQi5uZXh0O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKFcgPSBOLCBxID0gRiwgdSA9IDA7IHUgPCByOyB1KyspIE9bZiArIDNdID0gSSA9IHkgKiBqID4+IFYsIDAgIT0gSSA/IChJID0gMjU1IC8gSSwgT1tmXSA9IChtICogaiA+PiBWKSAqIEksIE9bZiArIDFdID0gKGcgKiBqID4+IFYpICogSSwgT1tmICsgMl0gPSAodiAqIGogPj4gVikgKiBJKSA6IE9bZl0gPSBPW2YgKyAxXSA9IE9bZiArIDJdID0gMCwgbSAtPSB3LCBnIC09IGIsIHYgLT0gaywgeSAtPSB4LCB3IC09IFcuciwgYiAtPSBXLmcsIGsgLT0gVy5iLCB4IC09IFcuYSwgYyA9IF8gKyAoKGMgPSB1ICsgaCArIDEpIDwgRCA/IGMgOiBEKSA8PCAyLCBTICs9IFcuciA9IE9bY10sIEUgKz0gVy5nID0gT1tjICsgMV0sIEMgKz0gVy5iID0gT1tjICsgMl0sIFAgKz0gVy5hID0gT1tjICsgM10sIG0gKz0gUywgZyArPSBFLCB2ICs9IEMsIHkgKz0gUCwgVyA9IFcubmV4dCwgdyArPSBNID0gcS5yLCBiICs9IFIgPSBxLmcsIGsgKz0gVCA9IHEuYiwgeCArPSBJID0gcS5hLCBTIC09IE0sIEUgLT0gUiwgQyAtPSBULCBQIC09IEksIHEgPSBxLm5leHQsIGYgKz0gNDtcbiAgICAgICAgICAgICAgICAgICAgXyArPSByXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAodSA9IDA7IHUgPCByOyB1KyspIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChFID0gQyA9IFAgPSBTID0gZyA9IHYgPSB5ID0gbSA9IDAsIGYgPSB1IDw8IDIsIHcgPSBVICogKE0gPSBPW2ZdKSwgYiA9IFUgKiAoUiA9IE9bZiArIDFdKSwgayA9IFUgKiAoVCA9IE9bZiArIDJdKSwgeCA9IFUgKiAoSSA9IE9bZiArIDNdKSwgbSArPSBIICogTSwgZyArPSBIICogUiwgdiArPSBIICogVCwgeSArPSBIICogSSwgQiA9IE4sIHAgPSAwOyBwIDwgVTsgcCsrKSBCLnIgPSBNLCBCLmcgPSBSLCBCLmIgPSBULCBCLmEgPSBJLCBCID0gQi5uZXh0O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGQgPSByLCBwID0gMTsgcCA8PSBoOyBwKyspIGYgPSBkICsgdSA8PCAyLCBtICs9IChCLnIgPSBNID0gT1tmXSkgKiAoTCA9IFUgLSBwKSwgZyArPSAoQi5nID0gUiA9IE9bZiArIDFdKSAqIEwsIHYgKz0gKEIuYiA9IFQgPSBPW2YgKyAyXSkgKiBMLCB5ICs9IChCLmEgPSBJID0gT1tmICsgM10pICogTCwgUyArPSBNLCBFICs9IFIsIEMgKz0gVCwgUCArPSBJLCBCID0gQi5uZXh0LCBwIDwgQSAmJiAoZCArPSByKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChmID0gdSwgVyA9IE4sIHEgPSBGLCBsID0gMDsgbCA8IHM7IGwrKykgYyA9IGYgPDwgMiwgT1tjICsgM10gPSBJID0geSAqIGogPj4gViwgSSA+IDAgPyAoSSA9IDI1NSAvIEksIE9bY10gPSAobSAqIGogPj4gVikgKiBJLCBPW2MgKyAxXSA9IChnICogaiA+PiBWKSAqIEksIE9bYyArIDJdID0gKHYgKiBqID4+IFYpICogSSkgOiBPW2NdID0gT1tjICsgMV0gPSBPW2MgKyAyXSA9IDAsIG0gLT0gdywgZyAtPSBiLCB2IC09IGssIHkgLT0geCwgdyAtPSBXLnIsIGIgLT0gVy5nLCBrIC09IFcuYiwgeCAtPSBXLmEsIGMgPSB1ICsgKChjID0gbCArIFUpIDwgQSA/IGMgOiBBKSAqIHIgPDwgMiwgbSArPSBTICs9IFcuciA9IE9bY10sIGcgKz0gRSArPSBXLmcgPSBPW2MgKyAxXSwgdiArPSBDICs9IFcuYiA9IE9bYyArIDJdLCB5ICs9IFAgKz0gVy5hID0gT1tjICsgM10sIFcgPSBXLm5leHQsIHcgKz0gTSA9IHEuciwgYiArPSBSID0gcS5nLCBrICs9IFQgPSBxLmIsIHggKz0gSSA9IHEuYSwgUyAtPSBNLCBFIC09IFIsIEMgLT0gVCwgUCAtPSBJLCBxID0gcS5uZXh0LCBmICs9IHJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gbigpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnIgPSAwLCB0aGlzLmcgPSAwLCB0aGlzLmIgPSAwLCB0aGlzLmEgPSAwLCB0aGlzLm5leHQgPSBudWxsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBvID0gWzUxMiwgNTEyLCA0NTYsIDUxMiwgMzI4LCA0NTYsIDMzNSwgNTEyLCA0MDUsIDMyOCwgMjcxLCA0NTYsIDM4OCwgMzM1LCAyOTIsIDUxMiwgNDU0LCA0MDUsIDM2NCwgMzI4LCAyOTgsIDI3MSwgNDk2LCA0NTYsIDQyMCwgMzg4LCAzNjAsIDMzNSwgMzEyLCAyOTIsIDI3MywgNTEyLCA0ODIsIDQ1NCwgNDI4LCA0MDUsIDM4MywgMzY0LCAzNDUsIDMyOCwgMzEyLCAyOTgsIDI4NCwgMjcxLCAyNTksIDQ5NiwgNDc1LCA0NTYsIDQzNywgNDIwLCA0MDQsIDM4OCwgMzc0LCAzNjAsIDM0NywgMzM1LCAzMjMsIDMxMiwgMzAyLCAyOTIsIDI4MiwgMjczLCAyNjUsIDUxMiwgNDk3LCA0ODIsIDQ2OCwgNDU0LCA0NDEsIDQyOCwgNDE3LCA0MDUsIDM5NCwgMzgzLCAzNzMsIDM2NCwgMzU0LCAzNDUsIDMzNywgMzI4LCAzMjAsIDMxMiwgMzA1LCAyOTgsIDI5MSwgMjg0LCAyNzgsIDI3MSwgMjY1LCAyNTksIDUwNywgNDk2LCA0ODUsIDQ3NSwgNDY1LCA0NTYsIDQ0NiwgNDM3LCA0MjgsIDQyMCwgNDEyLCA0MDQsIDM5NiwgMzg4LCAzODEsIDM3NCwgMzY3LCAzNjAsIDM1NCwgMzQ3LCAzNDEsIDMzNSwgMzI5LCAzMjMsIDMxOCwgMzEyLCAzMDcsIDMwMiwgMjk3LCAyOTIsIDI4NywgMjgyLCAyNzgsIDI3MywgMjY5LCAyNjUsIDI2MSwgNTEyLCA1MDUsIDQ5NywgNDg5LCA0ODIsIDQ3NSwgNDY4LCA0NjEsIDQ1NCwgNDQ3LCA0NDEsIDQzNSwgNDI4LCA0MjIsIDQxNywgNDExLCA0MDUsIDM5OSwgMzk0LCAzODksIDM4MywgMzc4LCAzNzMsIDM2OCwgMzY0LCAzNTksIDM1NCwgMzUwLCAzNDUsIDM0MSwgMzM3LCAzMzIsIDMyOCwgMzI0LCAzMjAsIDMxNiwgMzEyLCAzMDksIDMwNSwgMzAxLCAyOTgsIDI5NCwgMjkxLCAyODcsIDI4NCwgMjgxLCAyNzgsIDI3NCwgMjcxLCAyNjgsIDI2NSwgMjYyLCAyNTksIDI1NywgNTA3LCA1MDEsIDQ5NiwgNDkxLCA0ODUsIDQ4MCwgNDc1LCA0NzAsIDQ2NSwgNDYwLCA0NTYsIDQ1MSwgNDQ2LCA0NDIsIDQzNywgNDMzLCA0MjgsIDQyNCwgNDIwLCA0MTYsIDQxMiwgNDA4LCA0MDQsIDQwMCwgMzk2LCAzOTIsIDM4OCwgMzg1LCAzODEsIDM3NywgMzc0LCAzNzAsIDM2NywgMzYzLCAzNjAsIDM1NywgMzU0LCAzNTAsIDM0NywgMzQ0LCAzNDEsIDMzOCwgMzM1LCAzMzIsIDMyOSwgMzI2LCAzMjMsIDMyMCwgMzE4LCAzMTUsIDMxMiwgMzEwLCAzMDcsIDMwNCwgMzAyLCAyOTksIDI5NywgMjk0LCAyOTIsIDI4OSwgMjg3LCAyODUsIDI4MiwgMjgwLCAyNzgsIDI3NSwgMjczLCAyNzEsIDI2OSwgMjY3LCAyNjUsIDI2MywgMjYxLCAyNTldLFxuICAgICAgICAgICAgICAgIGEgPSBbOSwgMTEsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0XTtcbiAgICAgICAgICAgIHJldHVybiBlXG4gICAgICAgIH0oKTtcbiAgICAgICAgSFRNTENhbnZhc0VsZW1lbnQucHJvdG90eXBlLnRvQmxvYiB8fCBPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTENhbnZhc0VsZW1lbnQucHJvdG90eXBlLCBcInRvQmxvYlwiLCB7XG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gYXRvYih0aGlzLnRvRGF0YVVSTChlLCBpKS5zcGxpdChcIixcIilbMV0pLCBvID0gbi5sZW5ndGgsIGEgPSBuZXcgVWludDhBcnJheShvKSwgciA9IDA7IHIgPCBvOyByKyspIGFbcl0gPSBuLmNoYXJDb2RlQXQocik7XG4gICAgICAgICAgICAgICAgdChuZXcgQmxvYihbYV0sIHt0eXBlOiBlIHx8IFwiaW1hZ2UvcG5nXCJ9KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgZSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZVtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG4uZW51bWVyYWJsZSA9IG4uZW51bWVyYWJsZSB8fCAhMSwgbi5jb25maWd1cmFibGUgPSAhMCwgXCJ2YWx1ZVwiIGluIG4gJiYgKG4ud3JpdGFibGUgPSAhMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBuLmtleSwgbilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgaSwgbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSAmJiB0KGUucHJvdG90eXBlLCBpKSwgbiAmJiB0KGUsIG4pLCBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSgpLCBjID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHRcbiAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIHQuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiB0ICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiB0XG4gICAgICAgICAgICB9LCBkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2YgdC5kYXRhc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlLCBpLCBuID0ge30sIG8gPSB0LmF0dHJpYnV0ZXM7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoZSBpbiBvKSBvLmhhc093blByb3BlcnR5KGUpICYmIG9bZV0ubmFtZSAmJiAvXmRhdGEtW2Etel9cXC1cXGRdKiQvaS50ZXN0KG9bZV0ubmFtZSkgJiYgKGkgPSBmKG9bZV0ubmFtZS5zdWJzdHIoNSkpLCBuW2ldID0gb1tlXS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0LmRhdGFzZXRcbiAgICAgICAgICAgIH0sIGYgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0LnJlcGxhY2UoL1xcLS4vZywgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY2hhckF0KDEpLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgXyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IFtdLCBpID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodC5hdHRyaWJ1dGVzKSwgbiA9IGkubGVuZ3RoLCBvID0gMDsgbyA8IG47IG8rKykgZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogaVtvXS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaVtvXS52YWx1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBlXG4gICAgICAgICAgICB9LCBtID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB4OiBcInVuZGVmaW5lZFwiID09IHR5cGVvZiB0Lm9mZnNldFggPyB0LmxheWVyWCA6IHQub2Zmc2V0WCxcbiAgICAgICAgICAgICAgICAgICAgeTogXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2YgdC5vZmZzZXRZID8gdC5sYXllclkgOiB0Lm9mZnNldFlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBnID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSwgbiA9IHt9LCBvID0gZSB8fCB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGkgaW4gdCkgdC5oYXNPd25Qcm9wZXJ0eShpKSAmJiAobltpXSA9IFwidW5kZWZpbmVkXCIgPT0gdHlwZW9mIG9baV0gPyB0W2ldIDogb1tpXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5cbiAgICAgICAgICAgIH0sIHYgPSB7RVNDOiAyNywgUkVUVVJOOiAxM30sIHkgPSB7XG4gICAgICAgICAgICAgICAgRE9XTjogW1widG91Y2hzdGFydFwiLCBcInBvaW50ZXJkb3duXCIsIFwibW91c2Vkb3duXCJdLFxuICAgICAgICAgICAgICAgIE1PVkU6IFtcInRvdWNobW92ZVwiLCBcInBvaW50ZXJtb3ZlXCIsIFwibW91c2Vtb3ZlXCJdLFxuICAgICAgICAgICAgICAgIFVQOiBbXCJ0b3VjaGVuZFwiLCBcInRvdWNoY2FuY2VsXCIsIFwicG9pbnRlcnVwXCIsIFwibW91c2V1cFwiXVxuICAgICAgICAgICAgfSwgdyA9IHtcbiAgICAgICAgICAgICAgICBqcGVnOiBcImltYWdlL2pwZWdcIixcbiAgICAgICAgICAgICAgICBqcGc6IFwiaW1hZ2UvanBlZ1wiLFxuICAgICAgICAgICAgICAgIGpwZTogXCJpbWFnZS9qcGVnXCIsXG4gICAgICAgICAgICAgICAgcG5nOiBcImltYWdlL3BuZ1wiLFxuICAgICAgICAgICAgICAgIGdpZjogXCJpbWFnZS9naWZcIixcbiAgICAgICAgICAgICAgICBibXA6IFwiaW1hZ2UvYm1wXCJcbiAgICAgICAgICAgIH0sIGIgPSAvKFxcLnBuZ3xcXC5ibXB8XFwuZ2lmfFxcLmpwZ3xcXC5qcGV8XFwuanBnfFxcLmpwZWcpJC8sIGsgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICAgIHZhciBpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAoaS5jbGFzc05hbWUgPSBlKSwgaVxuICAgICAgICAgICAgfSwgeCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgICAgICAgICAgZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHQuYWRkRXZlbnRMaXN0ZW5lcihlLCBpLCAhMSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgUyA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgICAgICAgICAgZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLCBpLCAhMSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgRSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSB0LmNoYW5nZWRUb3VjaGVzID8gdC5jaGFuZ2VkVG91Y2hlc1swXSA6IHQ7XG4gICAgICAgICAgICAgICAgaWYgKGUpIHJldHVybiB7eDogZS5wYWdlWCwgeTogZS5wYWdlWX1cbiAgICAgICAgICAgIH0sIEMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICAgIHZhciBpID0gLjUsIG4gPSAuNSwgbyA9IE1hdGguUEkgLyAxODAgKiBlLCBhID0gTWF0aC5jb3MobyksIHIgPSBNYXRoLnNpbihvKSwgcyA9IHQueCwgaCA9IHQueSxcbiAgICAgICAgICAgICAgICAgICAgdSA9IHQueCArIHQud2lkdGgsIGwgPSB0LnkgKyB0LmhlaWdodCwgcCA9IGEgKiAocyAtIGkpICsgciAqIChoIC0gbikgKyBpLFxuICAgICAgICAgICAgICAgICAgICBjID0gYSAqIChoIC0gbikgLSByICogKHMgLSBpKSArIG4sIGQgPSBhICogKHUgLSBpKSArIHIgKiAobCAtIG4pICsgaSwgZiA9IGEgKiAobCAtIG4pIC0gciAqICh1IC0gaSkgKyBuO1xuICAgICAgICAgICAgICAgIHAgPD0gZCA/ICh0LnggPSBwLCB0LndpZHRoID0gZCAtIHApIDogKHQueCA9IGQsIHQud2lkdGggPSBwIC0gZCksIGMgPD0gZiA/ICh0LnkgPSBjLCB0LmhlaWdodCA9IGYgLSBjKSA6ICh0LnkgPSBmLCB0LmhlaWdodCA9IGMgLSBmKVxuICAgICAgICAgICAgfSwgUCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSBFKHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlLnggLT0gd2luZG93LnBhZ2VYT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LCBlLnkgLT0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AsIGVcbiAgICAgICAgICAgIH0sIE0gPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgdC5zbGljZSgxKVxuICAgICAgICAgICAgfSwgUiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0LnNsaWNlKDEpXG4gICAgICAgICAgICB9LCBUID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdFt0Lmxlbmd0aCAtIDFdXG4gICAgICAgICAgICB9LCBJID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoZSwgTWF0aC5taW4oaSwgdCkpXG4gICAgICAgICAgICB9LCBMID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWUpIHJldHVybiAhMTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGUubGVuZ3RoOyBpKyspIGlmIChlW2ldID09PSB0KSByZXR1cm4gITA7XG4gICAgICAgICAgICAgICAgcmV0dXJuICExXG4gICAgICAgICAgICB9LCBPID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gZSA/IGFyZ3VtZW50c1sxXSA6IFwiUE9TVFwiLCBuID0gYXJndW1lbnRzWzJdLFxuICAgICAgICAgICAgICAgICAgICBvID0gYXJndW1lbnRzWzNdLCBhID0gYXJndW1lbnRzWzRdLCByID0gYXJndW1lbnRzWzVdLCBzID0gYXJndW1lbnRzWzZdLCBoID0gbmV3IFhNTEh0dHBSZXF1ZXN0O1xuICAgICAgICAgICAgICAgIGEgJiYgaC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcihcInByb2dyZXNzXCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGEodC5sb2FkZWQsIHQudG90YWwpXG4gICAgICAgICAgICAgICAgfSksIGgub3BlbihpLCB0LCAhMCksIG8gJiYgbyhoLCBuKSwgaC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICg0ID09PSBoLnJlYWR5U3RhdGUgJiYgaC5zdGF0dXMgPj0gMjAwICYmIGguc3RhdHVzIDwgMzAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGgucmVzcG9uc2VUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0Lmxlbmd0aCkgcmV0dXJuIHZvaWQgcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuaW5kZXhPZihcIkNvbnRlbnQtTGVuZ3RoXCIpICE9PSAtMSkgcmV0dXJuIHZvaWQgcyhcImZpbGUtdG9vLWJpZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gSlNPTi5wYXJzZShoLnJlc3BvbnNlVGV4dClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcIm9iamVjdFwiID09PSAoXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2YgZSA/IFwidW5kZWZpbmVkXCIgOiBjKGUpKSAmJiBcImZhaWx1cmVcIiA9PT0gZS5zdGF0dXMpIHJldHVybiB2b2lkIHMoZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHIoZSB8fCB0KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKDQgPT09IGgucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBKU09OLnBhcnNlKGgucmVzcG9uc2VUZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwib2JqZWN0XCIgPT09IChcInVuZGVmaW5lZFwiID09IHR5cGVvZiBuID8gXCJ1bmRlZmluZWRcIiA6IGMobikpICYmIFwiZmFpbHVyZVwiID09PSBuLnN0YXR1cykgcmV0dXJuIHZvaWQgcyhuLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcyhcImZhaWxcIilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGguc2VuZChuKVxuICAgICAgICAgICAgfSwgeiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdCAmJiAodC5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSBcIlwiLCB0LnN0eWxlLnRyYW5zZm9ybSA9IFwiXCIpXG4gICAgICAgICAgICB9LCBEID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdCAvIDFlNlxuICAgICAgICAgICAgfSwgQSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgdCA9IFtdLCBlID0gdm9pZCAwLCBpID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGZvciAoZSBpbiB3KSB3Lmhhc093blByb3BlcnR5KGUpICYmIChpID0gd1tlXSwgdC5pbmRleE9mKGkpID09IC0xICYmIHQucHVzaChpKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRcbiAgICAgICAgICAgIH0sIFUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImltYWdlL2pwZWdcIiA9PT0gdFxuICAgICAgICAgICAgfSwgSCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgZm9yIChlIGluIHcpIGlmICh3Lmhhc093blByb3BlcnR5KGUpICYmIHdbZV0gPT09IHQpIHJldHVybiBlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0XG4gICAgICAgICAgICB9LCBOID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBmb3IgKGUgaW4gdykgaWYgKHcuaGFzT3duUHJvcGVydHkoZSkgJiYgdC5pbmRleE9mKHdbZV0pICE9PSAtMSkgcmV0dXJuIHdbZV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH0sIEIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0LnNwbGl0KFwiL1wiKS5wb3AoKS5zcGxpdChcIj9cIikuc2hpZnQoKVxuICAgICAgICAgICAgfSwgRiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IGUgPyBhcmd1bWVudHNbMV0gOiBcIlwiO1xuICAgICAgICAgICAgICAgIHJldHVybiAoaSArIHQpLnNsaWNlKC1pLmxlbmd0aClcbiAgICAgICAgICAgIH0sIFcgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0LmdldEZ1bGxZZWFyKCkgKyBcIi1cIiArIEYodC5nZXRNb250aCgpICsgMSwgXCIwMFwiKSArIFwiLVwiICsgRih0LmdldERhdGUoKSwgXCIwMFwiKSArIFwiX1wiICsgRih0LmdldEhvdXJzKCksIFwiMDBcIikgKyBcIi1cIiArIEYodC5nZXRNaW51dGVzKCksIFwiMDBcIikgKyBcIi1cIiArIEYodC5nZXRTZWNvbmRzKCksIFwiMDBcIilcbiAgICAgICAgICAgIH0sIHEgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiID09IHR5cGVvZiB0Lm5hbWUgPyBXKG5ldyBEYXRlKSArIFwiLlwiICsgSChqKHQpKSA6IHQubmFtZVxuICAgICAgICAgICAgfSwgaiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQudHlwZSB8fCBcImltYWdlL2pwZWdcIlxuICAgICAgICAgICAgfSwgViA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgIT0gdHlwZW9mIHQpIHJldHVybiBXKG5ldyBEYXRlKTtcbiAgICAgICAgICAgICAgICB2YXIgZSA9IEIodCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuc3BsaXQoXCIuXCIpLnNoaWZ0KClcbiAgICAgICAgICAgIH0sIEcgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShbdF0sIGUsIHt0eXBlOiB0LnR5cGUsIGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKX0pXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoaSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5sYXN0TW9kaWZpZWQgPSBuZXcgRGF0ZSwgdC5uYW1lID0gZSwgdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIFggPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAvXmRhdGE6aW1hZ2UvLnRlc3QodClcbiAgICAgICAgICAgIH0sIFkgPSBmdW5jdGlvbiAodCwgZSwgaSwgbiwgbywgYSkge1xuICAgICAgICAgICAgICAgIHQgPSBcIlwiICsgdCArICh0LmluZGV4T2YoXCI/XCIpICE9PSAtMSA/IFwiJlwiIDogXCI/XCIpICsgXCJ1cmw9XCIgKyBuO1xuICAgICAgICAgICAgICAgIHZhciByID0gbmV3IFhNTEh0dHBSZXF1ZXN0O1xuICAgICAgICAgICAgICAgIHIub3BlbihcIkdFVFwiLCB0LCAhMCksIGUociksIHIucmVzcG9uc2VUeXBlID0gXCJqc29uXCIsIHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJmYWlsdXJlXCIgPT09IHRoaXMucmVzcG9uc2Uuc3RhdHVzID8gdm9pZCBvKHRoaXMucmVzcG9uc2UubWVzc2FnZSkgOiB2b2lkIEoodGhpcy5yZXNwb25zZS5ib2R5LCBpLCBhKVxuICAgICAgICAgICAgICAgIH0sIHIuc2VuZCgpXG4gICAgICAgICAgICB9LCBKID0gZnVuY3Rpb24gKHQsIGUsIGksIG4pIHtcbiAgICAgICAgICAgICAgICB2YXIgbyA9IG5ldyBYTUxIdHRwUmVxdWVzdDtcbiAgICAgICAgICAgICAgICBvLm9wZW4oXCJHRVRcIiwgdCwgITApLCBlKG8pLCBvLnJlc3BvbnNlVHlwZSA9IFwiYmxvYlwiLCBvLm9ubG9hZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvLnN0YXR1cyA+PSAyMDAgJiYgby5zdGF0dXMgPCAzMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gQih0KSwgciA9IE4odGhpcy5yZXNwb25zZS50eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGIudGVzdChhKSB8fCAoYSArPSBcIi5cIiArIEgocikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBHKHRoaXMucmVzcG9uc2UsIGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaShndChzLCByKSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIG4oby5zdGF0dXMgKyBcIjogXCIgKyBvLnN0YXR1c1RleHQpXG4gICAgICAgICAgICAgICAgfSwgby5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBuKClcbiAgICAgICAgICAgICAgICB9LCBvLnNlbmQoKVxuICAgICAgICAgICAgfSwgJCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSB0LnNwbGl0KFwiLFwiKVsxXSwgaSA9IGUucmVwbGFjZSgvXFxzL2csIFwiXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhdG9iKGkpXG4gICAgICAgICAgICB9LCBaID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gJCh0KSwgbiA9IG5ldyBBcnJheUJ1ZmZlcihpLmxlbmd0aCksIG8gPSBuZXcgVWludDhBcnJheShuKSwgYSA9IDA7IGEgPCBpLmxlbmd0aDsgYSsrKSBvW2FdID0gaS5jaGFyQ29kZUF0KGEpO1xuICAgICAgICAgICAgICAgIHZhciByID0gd3QodCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCIgPT0gdHlwZW9mIGUgJiYgKGUgPSBXKG5ldyBEYXRlKSArIFwiLlwiICsgSChyKSksIEcoSyhuLCByKSwgZSlcbiAgICAgICAgICAgIH0sIEsgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICAgIHZhciBpID0gd2luZG93LkJsb2JCdWlsZGVyID0gd2luZG93LkJsb2JCdWlsZGVyIHx8IHdpbmRvdy5XZWJLaXRCbG9iQnVpbGRlciB8fCB3aW5kb3cuTW96QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1TQmxvYkJ1aWxkZXI7XG4gICAgICAgICAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgaTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uYXBwZW5kKHQpLCBuLmdldEJsb2IoZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFt0XSwge3R5cGU6IGV9KVxuICAgICAgICAgICAgfSwgUSA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG8gPSBcInN0cmluZ1wiICE9IHR5cGVvZiB0IHx8IDAgIT09IHQuaW5kZXhPZihcImRhdGE6aW1hZ2VcIik7XG4gICAgICAgICAgICAgICAgbi5wYXJzZU1ldGFEYXRhKHQsIGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByID0ge2NhbnZhczogITAsIGNyb3NzT3JpZ2luOiBvfTtcbiAgICAgICAgICAgICAgICAgICAgZSAmJiAoci5tYXhXaWR0aCA9IGUud2lkdGgsIHIubWF4SGVpZ2h0ID0gZS5oZWlnaHQpLCBhLmV4aWYgJiYgKHIub3JpZW50YXRpb24gPSBhLmV4aWYuZ2V0KFwiT3JpZW50YXRpb25cIikpLCBuKHQsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJlcnJvclwiID09PSB0LnR5cGUgPyB2b2lkIGkoKSA6IHZvaWQgaSh0LCBhKVxuICAgICAgICAgICAgICAgICAgICB9LCByKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCB0dCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG4sIG8sIGEsIHIsIHMgPSBlIC8gdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcyA8IGkgPyAociA9IGUsIGEgPSByIC8gaSwgbiA9IC41ICogKHQgLSBhKSwgbyA9IDApIDogKGEgPSB0LCByID0gYSAqIGksIG4gPSAwLCBvID0gLjUgKiAoZSAtIHIpKSwge1xuICAgICAgICAgICAgICAgICAgICB4OiBuLCB5OiBvLCBoZWlnaHQ6IHIsIHdpZHRoOiBhXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSBlID8gYXJndW1lbnRzWzFdIDoge30sIG8gPSBhcmd1bWVudHNbMl0sIGEgPSBrKFwiY2FudmFzXCIpLFxuICAgICAgICAgICAgICAgICAgICByID0gbi5yb3RhdGlvbiwgcyA9IG4uY3JvcCwgaCA9IG4uc2l6ZSwgdSA9IG4uZmlsdGVycywgbCA9IG4ubWluU2l6ZTtcbiAgICAgICAgICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHIgJSAxODAgIT09IDAsIGMgPSB7d2lkdGg6IHAgPyB0LmhlaWdodCA6IHQud2lkdGgsIGhlaWdodDogcCA/IHQud2lkdGggOiB0LmhlaWdodH07XG4gICAgICAgICAgICAgICAgICAgIHMueCA8IDAgJiYgKHMueCA9IDApLCBzLnkgPCAwICYmIChzLnkgPSAwKSwgcy53aWR0aCA+IGMud2lkdGggJiYgKHMud2lkdGggPSBjLndpZHRoKSwgcy5oZWlnaHQgPiBjLmhlaWdodCAmJiAocy5oZWlnaHQgPSBjLmhlaWdodCksIHMueSArIHMuaGVpZ2h0ID4gYy5oZWlnaHQgJiYgKHMueSA9IE1hdGgubWF4KDAsIGMuaGVpZ2h0IC0gcy5oZWlnaHQpKSwgcy54ICsgcy53aWR0aCA+IGMud2lkdGggJiYgKHMueCA9IE1hdGgubWF4KDAsIGMud2lkdGggLSBzLndpZHRoKSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkID0gcy54IC8gYy53aWR0aCwgZiA9IHMueSAvIGMuaGVpZ2h0LCBfID0gcy53aWR0aCAvIGMud2lkdGgsIG0gPSBzLmhlaWdodCAvIGMuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBhLndpZHRoID0gcy53aWR0aCwgYS5oZWlnaHQgPSBzLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBhLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgOTAgPT09IHIgPyAoZy50cmFuc2xhdGUoLjUgKiBhLndpZHRoLCAuNSAqIGEuaGVpZ2h0KSwgZy5yb3RhdGUoLTkwICogTWF0aC5QSSAvIDE4MCksIGcuZHJhd0ltYWdlKHQsICgxIC0gZikgKiB0LndpZHRoIC0gdC53aWR0aCAqIG0sIHMueCwgcy5oZWlnaHQsIHMud2lkdGgsIC41ICogLWEuaGVpZ2h0LCAuNSAqIC1hLndpZHRoLCBhLmhlaWdodCwgYS53aWR0aCkpIDogMTgwID09PSByID8gKGcudHJhbnNsYXRlKC41ICogYS53aWR0aCwgLjUgKiBhLmhlaWdodCksIGcucm90YXRlKC0xODAgKiBNYXRoLlBJIC8gMTgwKSwgZy5kcmF3SW1hZ2UodCwgKDEgLSAoZCArIF8pKSAqIGMud2lkdGgsICgxIC0gKGYgKyBtKSkgKiBjLmhlaWdodCwgXyAqIGMud2lkdGgsIG0gKiBjLmhlaWdodCwgLjUgKiAtYS53aWR0aCwgLjUgKiAtYS5oZWlnaHQsIGEud2lkdGgsIGEuaGVpZ2h0KSkgOiAyNzAgPT09IHIgPyAoZy50cmFuc2xhdGUoLjUgKiBhLndpZHRoLCAuNSAqIGEuaGVpZ2h0KSwgZy5yb3RhdGUoLTI3MCAqIE1hdGguUEkgLyAxODApLCBnLmRyYXdJbWFnZSh0LCBzLnksICgxIC0gZCkgKiB0LmhlaWdodCAtIHQuaGVpZ2h0ICogXywgcy5oZWlnaHQsIHMud2lkdGgsIC41ICogLWEuaGVpZ2h0LCAuNSAqIC1hLndpZHRoLCBhLmhlaWdodCwgYS53aWR0aCkpIDogZy5kcmF3SW1hZ2UodCwgcy54LCBzLnksIHMud2lkdGgsIHMuaGVpZ2h0LCAwLCAwLCBhLndpZHRoLCBhLmhlaWdodClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBoLndpZHRoIC8gYS53aWR0aCwgeSA9IGguaGVpZ2h0IC8gYS5oZWlnaHQsIHcgPSBNYXRoLm1pbih2LCB5KTtcbiAgICAgICAgICAgICAgICAgICAgaShhLCB3LCBoLCBsKSwgdS5zaGFycGVuID4gMCAmJiBudChhLCBhdCh1LnNoYXJwZW4pKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvKGEpXG4gICAgICAgICAgICB9LCBpdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSB0LmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRJbWFnZURhdGEoMCwgMCwgdC53aWR0aCwgdC5oZWlnaHQpXG4gICAgICAgICAgICB9LCBudCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSB0LmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgICAgICAgICAgICBpLnB1dEltYWdlRGF0YShlKGl0KHQpLCB0LndpZHRoLCB0LmhlaWdodCksIDAsIDApXG4gICAgICAgICAgICB9LCBvdCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICAgICAgICAgIG4ud2lkdGggPSB0LCBuLmhlaWdodCA9IGU7XG4gICAgICAgICAgICAgICAgdmFyIG8gPSBuLmdldENvbnRleHQoXCIyZFwiKSwgYSA9IG8uY3JlYXRlSW1hZ2VEYXRhKG4ud2lkdGgsIG4uaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAmJiBhLnNldChpLmRhdGEpLCBhXG4gICAgICAgICAgICB9LCBhdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlLCBpLCBuKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gPSBbMCwgLTEsIDAsIC0xLCA1LCAtMSwgMCwgLTEsIDBdLCBhID0gTWF0aC5yb3VuZChNYXRoLnNxcnQoby5sZW5ndGgpKSwgciA9IC41ICogYSB8IDAsIHMgPSBvdChpLCBuKSwgaCA9IHMuZGF0YSwgdSA9IGUuZGF0YSwgbCA9IG4sIHAgPSB2b2lkIDA7IGwtLTspIGZvciAocCA9IGk7IHAtLTspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSBsLCBkID0gcCwgZiA9IDQgKiAobCAqIGkgKyBwKSwgXyA9IDAsIG0gPSAwLCBnID0gMCwgdiA9IDAsIHkgPSAwOyB5IDwgYTsgeSsrKSBmb3IgKHZhciB3ID0gMDsgdyA8IGE7IHcrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gYyArIHkgLSByLCBrID0gZCArIHcgLSByO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiID49IDAgJiYgYiA8IG4gJiYgayA+PSAwICYmIGsgPCBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gNCAqIChiICogaSArIGspLCBTID0gb1t5ICogYSArIHddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfICs9IHVbeF0gKiBTLCBtICs9IHVbeCArIDFdICogUywgZyArPSB1W3ggKyAyXSAqIFMsIHYgKz0gdVt4ICsgM10gKiBTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaFtmXSA9IF8gKiB0ICsgdVtmXSAqICgxIC0gdCksIGhbZiArIDFdID0gbSAqIHQgKyB1W2YgKyAxXSAqICgxIC0gdCksIGhbZiArIDJdID0gZyAqIHQgKyB1W2YgKyAyXSAqICgxIC0gdCksIGhbZiArIDNdID0gdVtmICsgM11cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHJ0ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IE1hdGguYWJzKHQud2lkdGggLSBlLndpZHRoKSwgbiA9IE1hdGguYWJzKHQuaGVpZ2h0IC0gZS5oZWlnaHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChpLCBuKVxuICAgICAgICAgICAgfSwgc3QgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBodCh0LCAxKVxuICAgICAgICAgICAgfSwgaHQgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICAgIGlmICghdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgdmFyIG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLCBvID0gbi5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG4ud2lkdGggPSB0LndpZHRoLCBuLmhlaWdodCA9IHQuaGVpZ2h0LCBvLmRyYXdJbWFnZSh0LCAwLCAwKSwgZSA+IDAgJiYgMSAhPT0gZSAmJiBpKG4sIGUsIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodC53aWR0aCAqIGUpLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IE1hdGgucm91bmQodC5oZWlnaHQgKiBlKVxuICAgICAgICAgICAgICAgIH0sIHt3aWR0aDogMCwgaGVpZ2h0OiAwfSksIG5cbiAgICAgICAgICAgIH0sIHV0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC53aWR0aCAmJiB0LmhlaWdodFxuICAgICAgICAgICAgfSwgbHQgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICAgIHZhciBpID0gZS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgICAgICAgICAgdXQoZSkgPyBpLmRyYXdJbWFnZSh0LCAwLCAwLCBlLndpZHRoLCBlLmhlaWdodCkgOiAoZS53aWR0aCA9IHQud2lkdGgsIGUuaGVpZ2h0ID0gdC5oZWlnaHQsIGkuZHJhd0ltYWdlKHQsIDAsIDApKVxuICAgICAgICAgICAgfSwgcHQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIGwodCwgMCwgMCwgdC53aWR0aCwgdC5oZWlnaHQsIDMpXG4gICAgICAgICAgICB9LCBjdCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHQud2lkdGgsIDEwKSA+PSBlLndpZHRoICYmIHBhcnNlSW50KHQuaGVpZ2h0LCAxMCkgPj0gZS5oZWlnaHRcbiAgICAgICAgICAgIH0sIGR0ID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge3g6IHQueCAqIGUsIHk6IHQueSAqIGksIHdpZHRoOiB0LndpZHRoICogZSwgaGVpZ2h0OiB0LmhlaWdodCAqIGl9XG4gICAgICAgICAgICB9LCBmdCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt4OiB0LnggLyBlLCB5OiB0LnkgLyBpLCB3aWR0aDogdC53aWR0aCAvIGUsIGhlaWdodDogdC5oZWlnaHQgLyBpfVxuICAgICAgICAgICAgfSwgX3QgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIGlmICh0ICYmIFwiXCIgIT09IHQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQudmFsdWUgPSBcIlwiXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKSwgbiA9IHQucGFyZW50Tm9kZSwgbyA9IHQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpLmFwcGVuZENoaWxkKHQpLCBpLnJlc2V0KCksIG8gPyBuLmluc2VydEJlZm9yZSh0LCBvKSA6IG4uYXBwZW5kQ2hpbGQodClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIG10ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvYmplY3RcIiA9PT0gKFwidW5kZWZpbmVkXCIgPT0gdHlwZW9mIHZhbHVlID8gXCJ1bmRlZmluZWRcIiA6IGModmFsdWUpKSAmJiBudWxsICE9PSB2YWx1ZSA/IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodCkpIDogdFxuICAgICAgICAgICAgfSwgZ3QgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSBlID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoIXQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHZhciBuID0gdC5zbGljZSgwLCB0LnNpemUsIGkgfHwgdC50eXBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5uYW1lID0gdC5uYW1lLCBuLmxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKHQubGFzdE1vZGlmaWVkKSwgblxuICAgICAgICAgICAgfSwgdnQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHZhciBlID0gbXQodCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaW5wdXQuZmlsZSA9IGd0KHQuaW5wdXQuZmlsZSksIGUub3V0cHV0LmltYWdlID0gc3QodC5vdXRwdXQuaW1hZ2UpLCBlXG4gICAgICAgICAgICB9LCB5dCA9IGZ1bmN0aW9uICh0LCBpLCBuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgaSA/IHQudG9EYXRhVVJMKGksIFUoaSkgJiYgXCJudW1iZXJcIiA9PSB0eXBlb2YgbiA/IG4gLyAxMDAgOiBlKSA6IG51bGxcbiAgICAgICAgICAgIH0sIHd0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHZhciBlID0gdC5zdWJzdHIoMCwgMTYpLm1hdGNoKC9eLis7Lyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUubGVuZ3RoID8gZVswXS5zdWJzdHJpbmcoNSwgZVswXS5sZW5ndGggLSAxKSA6IG51bGxcbiAgICAgICAgICAgIH0sIGJ0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gZSA/IGFyZ3VtZW50c1sxXSA6IFtdLCBuID0gYXJndW1lbnRzWzJdLCBvID0gYXJndW1lbnRzWzNdLFxuICAgICAgICAgICAgICAgICAgICBhID0gYXJndW1lbnRzWzRdLCByID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyOiBtdCh0LnNlcnZlciksXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhOiBtdCh0Lm1ldGEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0LmlucHV0Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdC5pbnB1dC50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IHQuaW5wdXQuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdC5pbnB1dC53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHQuaW5wdXQuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiB0LmlucHV0LmZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIEwoXCJpbnB1dFwiLCBpKSAmJiAhYSAmJiAoci5pbnB1dC5pbWFnZSA9IHl0KHQuaW5wdXQuaW1hZ2UsIHQuaW5wdXQudHlwZSkpLCBMKFwib3V0cHV0XCIsIGkpICYmIChyLm91dHB1dCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbyA/IFYodC5pbnB1dC5uYW1lKSArIFwiLlwiICsgbyA6IHQuaW5wdXQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogd1tvXSB8fCB0LmlucHV0LnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0Lm91dHB1dC53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB0Lm91dHB1dC5oZWlnaHRcbiAgICAgICAgICAgICAgICB9LCByLm91dHB1dC5pbWFnZSA9IHl0KHQub3V0cHV0LmltYWdlLCByLm91dHB1dC50eXBlLCBuKSwgci5vdXRwdXQudHlwZSA9IHd0KHIub3V0cHV0LmltYWdlKSwgXCJpbWFnZS9wbmdcIiA9PT0gci5vdXRwdXQudHlwZSAmJiAoci5vdXRwdXQubmFtZSA9IFYoci5pbnB1dC5uYW1lKSArIFwiLnBuZ1wiKSksIEwoXCJhY3Rpb25zXCIsIGkpICYmIChyLmFjdGlvbnMgPSBtdCh0LmFjdGlvbnMpKSwgclxuICAgICAgICAgICAgfSwga3QgPSBmdW5jdGlvbiAodCwgaSwgbikge1xuICAgICAgICAgICAgICAgIHZhciBvID0gdC5vdXRwdXQuaW1hZ2UsIGEgPSBuID8gVih0LmlucHV0Lm5hbWUpICsgXCIuXCIgKyBuIDogdC5pbnB1dC5uYW1lLCByID0gd1tuXSB8fCB0LmlucHV0LnR5cGU7XG4gICAgICAgICAgICAgICAgXCJpbWFnZS9wbmdcIiA9PT0gciAmJiAoYSA9IFYodC5pbnB1dC5uYW1lKSArIFwiLnBuZ1wiKSwgby50b0Jsb2IoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFwibXNTYXZlQmxvYlwiIGluIHdpbmRvdy5uYXZpZ2F0b3IpIHJldHVybiB2b2lkIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlQmxvYih0LCBhKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAod2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMKS5jcmVhdGVPYmplY3RVUkwodCksIGkgPSBrKFwiYVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCIsIGkuZG93bmxvYWQgPSBhLCBpLmhyZWYgPSBlLCBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGkpLCBpLmNsaWNrKCksIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChpKSwgKHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTCkucmV2b2tlT2JqZWN0VVJMKGUpXG4gICAgICAgICAgICAgICAgICAgIH0sIDApXG4gICAgICAgICAgICAgICAgfSwgciwgXCJudW1iZXJcIiA9PSB0eXBlb2YgaSA/IGkgLyAxMDAgOiBlKVxuICAgICAgICAgICAgfSwgeHQgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgICAgICAgICAgIHZhciBuID0gaS5xdWVyeVNlbGVjdG9yKHQpO1xuICAgICAgICAgICAgICAgIG4gJiYgKG4uc3R5bGUuZGlzcGxheSA9IGUgPyBcIlwiIDogXCJub25lXCIpXG4gICAgICAgICAgICB9LCBTdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpXG4gICAgICAgICAgICB9LCBFdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpXG4gICAgICAgICAgICB9LCBDdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSBrKFwiZGl2XCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0LnBhcmVudE5vZGUgJiYgKHQubmV4dFNpYmxpbmcgPyB0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsIHQubmV4dFNpYmxpbmcpIDogdC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGUpKSwgZS5hcHBlbmRDaGlsZCh0KSwgZVxuICAgICAgICAgICAgfSwgUHQgPSBmdW5jdGlvbiAodCwgZSwgaSwgbikge1xuICAgICAgICAgICAgICAgIHZhciBvID0gKG4gLSA5MCkgKiBNYXRoLlBJIC8gMTgwO1xuICAgICAgICAgICAgICAgIHJldHVybiB7eDogdCArIGkgKiBNYXRoLmNvcyhvKSwgeTogZSArIGkgKiBNYXRoLnNpbihvKX1cbiAgICAgICAgICAgIH0sIE10ID0gZnVuY3Rpb24gKHQsIGUsIGksIG4sIG8pIHtcbiAgICAgICAgICAgICAgICB2YXIgYSA9IFB0KHQsIGUsIGksIG8pLCByID0gUHQodCwgZSwgaSwgbiksIHMgPSBvIC0gbiA8PSAxODAgPyBcIjBcIiA6IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICBoID0gW1wiTVwiLCBhLngsIGEueSwgXCJBXCIsIGksIGksIDAsIHMsIDAsIHIueCwgci55XS5qb2luKFwiIFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaFxuICAgICAgICAgICAgfSwgUnQgPSBmdW5jdGlvbiAodCwgZSwgaSwgbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBNdCh0LCBlLCBpLCAwLCAzNjAgKiBuKVxuICAgICAgICAgICAgfSwgVHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSB7XG4gICAgICAgICAgICAgICAgICAgIG46IGZ1bmN0aW9uICh0LCBlLCBpLCBuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbywgYSwgciwgcywgaCwgdSwgbCwgcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByID0gdC55ICsgdC5oZWlnaHQsIG8gPSBJKGUueSwgMCwgciksIHIgLSBvIDwgaS5taW4uaGVpZ2h0ICYmIChvID0gciAtIGkubWluLmhlaWdodCksIGggPSBuID8gKHIgLSBvKSAvIG4gOiB0LndpZHRoLCBoIDwgaS5taW4ud2lkdGggJiYgKGggPSBpLm1pbi53aWR0aCwgbyA9IHIgLSBoICogbiksIGwgPSAuNSAqIChoIC0gdC53aWR0aCksIHMgPSB0LnggLSBsLCBhID0gdC54ICsgdC53aWR0aCArIGwsIChzIDwgMCB8fCBNYXRoLnJvdW5kKGEpID4gTWF0aC5yb3VuZChpLndpZHRoKSkgJiYgKHAgPSBNYXRoLm1pbih0LngsIGkud2lkdGggLSAodC54ICsgdC53aWR0aCkpLCBzID0gdC54IC0gcCwgYSA9IHQueCArIHQud2lkdGggKyBwLCBoID0gYSAtIHMsIHUgPSBoICogbiwgbyA9IHIgLSB1KSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYSAtIHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByIC0gb1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCBzOiBmdW5jdGlvbiAodCwgZSwgaSwgbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8sIGEsIHIsIHMsIGgsIHUsIGwsIHA7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyA9IHQueSwgciA9IEkoZS55LCBvLCBpLmhlaWdodCksIHIgLSBvIDwgaS5taW4uaGVpZ2h0ICYmIChyID0gbyArIGkubWluLmhlaWdodCksIGggPSBuID8gKHIgLSBvKSAvIG4gOiB0LndpZHRoLCBoIDwgaS5taW4ud2lkdGggJiYgKGggPSBpLm1pbi53aWR0aCwgciA9IG8gKyBoICogbiksIGwgPSAuNSAqIChoIC0gdC53aWR0aCksIHMgPSB0LnggLSBsLCBhID0gdC54ICsgdC53aWR0aCArIGwsIChzIDwgMCB8fCBNYXRoLnJvdW5kKGEpID4gTWF0aC5yb3VuZChpLndpZHRoKSkgJiYgKHAgPSBNYXRoLm1pbih0LngsIGkud2lkdGggLSAodC54ICsgdC53aWR0aCkpLCBzID0gdC54IC0gcCwgYSA9IHQueCArIHQud2lkdGggKyBwLCBoID0gYSAtIHMsIHUgPSBoICogbiwgciA9IG8gKyB1KSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYSAtIHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByIC0gb1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCBlOiBmdW5jdGlvbiAodCwgZSwgaSwgbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8sIGEsIHIsIHMsIGgsIHUsIGwsIHA7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyA9IHQueCwgYSA9IEkoZS54LCBzLCBpLndpZHRoKSwgYSAtIHMgPCBpLm1pbi53aWR0aCAmJiAoYSA9IHMgKyBpLm1pbi53aWR0aCksIHUgPSBuID8gKGEgLSBzKSAqIG4gOiB0LmhlaWdodCwgdSA8IGkubWluLmhlaWdodCAmJiAodSA9IGkubWluLmhlaWdodCwgYSA9IHMgKyB1IC8gbiksIGwgPSAuNSAqICh1IC0gdC5oZWlnaHQpLCBvID0gdC55IC0gbCwgciA9IHQueSArIHQuaGVpZ2h0ICsgbCwgKG8gPCAwIHx8IE1hdGgucm91bmQocikgPiBNYXRoLnJvdW5kKGkuaGVpZ2h0KSkgJiYgKHAgPSBNYXRoLm1pbih0LnksIGkuaGVpZ2h0IC0gKHQueSArIHQuaGVpZ2h0KSksIG8gPSB0LnkgLSBwLCByID0gdC55ICsgdC5oZWlnaHQgKyBwLCB1ID0gciAtIG8sIGggPSB1IC8gbiwgYSA9IHMgKyBoKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYSAtIHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByIC0gb1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB3OiBmdW5jdGlvbiBuKHQsIGUsIGksIG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhLCByLCBzLCBoLCBuLCB1LCBsLCBwO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgPSB0LnggKyB0LndpZHRoLCBoID0gSShlLngsIDAsIHIpLCByIC0gaCA8IGkubWluLndpZHRoICYmIChoID0gciAtIGkubWluLndpZHRoKSwgdSA9IG8gPyAociAtIGgpICogbyA6IHQuaGVpZ2h0LCB1IDwgaS5taW4uaGVpZ2h0ICYmICh1ID0gaS5taW4uaGVpZ2h0LCBoID0gciAtIHUgLyBvKSwgbCA9IC41ICogKHUgLSB0LmhlaWdodCksIGEgPSB0LnkgLSBsLCBzID0gdC55ICsgdC5oZWlnaHQgKyBsLCAoYSA8IDAgfHwgTWF0aC5yb3VuZChzKSA+IE1hdGgucm91bmQoaS5oZWlnaHQpKSAmJiAocCA9IE1hdGgubWluKHQueSwgaS5oZWlnaHQgLSAodC55ICsgdC5oZWlnaHQpKSwgYSA9IHQueSAtIHAsIHMgPSB0LnkgKyB0LmhlaWdodCArIHAsIHUgPSBzIC0gYSwgbiA9IHUgLyBvLCBoID0gciAtIG4pLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiByIC0gaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHMgLSBhXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIG5lOiBmdW5jdGlvbiAodCwgZSwgaSwgbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8sIGEsIHIsIHMsIGgsIHUsIGw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyA9IHQueCwgciA9IHQueSArIHQuaGVpZ2h0LCBhID0gSShlLngsIHMsIGkud2lkdGgpLCBhIC0gcyA8IGkubWluLndpZHRoICYmIChhID0gcyArIGkubWluLndpZHRoKSwgdSA9IG4gPyAoYSAtIHMpICogbiA6IEkociAtIGUueSwgaS5taW4uaGVpZ2h0LCByKSwgdSA8IGkubWluLmhlaWdodCAmJiAodSA9IGkubWluLmhlaWdodCwgYSA9IHMgKyB1IC8gbiksIG8gPSB0LnkgLSAodSAtIHQuaGVpZ2h0KSwgKG8gPCAwIHx8IE1hdGgucm91bmQocikgPiBNYXRoLnJvdW5kKGkuaGVpZ2h0KSkgJiYgKGwgPSBNYXRoLm1pbih0LnksIGkuaGVpZ2h0IC0gKHQueSArIHQuaGVpZ2h0KSksIG8gPSB0LnkgLSBsLCB1ID0gciAtIG8sIGggPSB1IC8gbiwgYSA9IHMgKyBoKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYSAtIHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByIC0gb1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCBzZTogZnVuY3Rpb24gKHQsIGUsIGksIG4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvLCBhLCByLCBzLCBoLCB1LCBsO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMgPSB0LngsIG8gPSB0LnksIGEgPSBJKGUueCwgcywgaS53aWR0aCksIGEgLSBzIDwgaS5taW4ud2lkdGggJiYgKGEgPSBzICsgaS5taW4ud2lkdGgpLCB1ID0gbiA/IChhIC0gcykgKiBuIDogSShlLnkgLSB0LnksIGkubWluLmhlaWdodCwgaS5oZWlnaHQgLSBvKSwgdSA8IGkubWluLmhlaWdodCAmJiAodSA9IGkubWluLmhlaWdodCwgYSA9IHMgKyB1IC8gbiksIHIgPSB0LnkgKyB0LmhlaWdodCArICh1IC0gdC5oZWlnaHQpLCAobyA8IDAgfHwgTWF0aC5yb3VuZChyKSA+IE1hdGgucm91bmQoaS5oZWlnaHQpKSAmJiAobCA9IE1hdGgubWluKHQueSwgaS5oZWlnaHQgLSAodC55ICsgdC5oZWlnaHQpKSwgciA9IHQueSArIHQuaGVpZ2h0ICsgbCwgdSA9IHIgLSBvLCBoID0gdSAvIG4sIGEgPSBzICsgaCksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGEgLSBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogciAtIG9cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgc3c6IGZ1bmN0aW9uICh0LCBlLCBpLCBuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbywgYSwgciwgcywgaCwgdSwgbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhID0gdC54ICsgdC53aWR0aCwgbyA9IHQueSwgcyA9IEkoZS54LCAwLCBhKSwgYSAtIHMgPCBpLm1pbi53aWR0aCAmJiAocyA9IGEgLSBpLm1pbi53aWR0aCksIHUgPSBuID8gKGEgLSBzKSAqIG4gOiBJKGUueSAtIHQueSwgaS5taW4uaGVpZ2h0LCBpLmhlaWdodCAtIG8pLCB1IDwgaS5taW4uaGVpZ2h0ICYmICh1ID0gaS5taW4uaGVpZ2h0LCBzID0gYSAtIHUgLyBuKSwgciA9IHQueSArIHQuaGVpZ2h0ICsgKHUgLSB0LmhlaWdodCksIChvIDwgMCB8fCBNYXRoLnJvdW5kKHIpID4gTWF0aC5yb3VuZChpLmhlaWdodCkpICYmIChsID0gTWF0aC5taW4odC55LCBpLmhlaWdodCAtICh0LnkgKyB0LmhlaWdodCkpLCByID0gdC55ICsgdC5oZWlnaHQgKyBsLCB1ID0gciAtIG8sIGggPSB1IC8gbiwgcyA9IGEgLSBoKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYSAtIHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByIC0gb1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCBudzogZnVuY3Rpb24gKHQsIGUsIGksIG4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvLCBhLCByLCBzLCBoLCB1LCBsO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPSB0LnggKyB0LndpZHRoLCByID0gdC55ICsgdC5oZWlnaHQsIHMgPSBJKGUueCwgMCwgYSksIGEgLSBzIDwgaS5taW4ud2lkdGggJiYgKHMgPSBhIC0gaS5taW4ud2lkdGgpLCB1ID0gbiA/IChhIC0gcykgKiBuIDogSShyIC0gZS55LCBpLm1pbi5oZWlnaHQsIHIpLCB1IDwgaS5taW4uaGVpZ2h0ICYmICh1ID0gaS5taW4uaGVpZ2h0LCBzID0gYSAtIHUgLyBuKSwgbyA9IHQueSAtICh1IC0gdC5oZWlnaHQpLCAobyA8IDAgfHwgTWF0aC5yb3VuZChyKSA+IE1hdGgucm91bmQoaS5oZWlnaHQpKSAmJiAobCA9IE1hdGgubWluKHQueSwgaS5oZWlnaHQgLSAodC55ICsgdC5oZWlnaHQpKSwgbyA9IHQueSAtIGwsIHUgPSByIC0gbywgaCA9IHUgLyBuLCBzID0gYSAtIGgpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBhIC0gcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHIgLSBvXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gZSA/IGFyZ3VtZW50c1swXSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0KHRoaXMsIG4pLCB0aGlzLl9lbGVtZW50ID0gaSwgdGhpcy5faW50ZXJhY3Rpb24gPSBudWxsLCB0aGlzLl9taW5XaWR0aCA9IDEsIHRoaXMuX21pbkhlaWdodCA9IDEsIHRoaXMuX3JhdGlvID0gbnVsbCwgdGhpcy5fcmVjdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLl9zcGFjZSA9IHt3aWR0aDogMCwgaGVpZ2h0OiAwfSwgdGhpcy5fcmVjdENoYW5nZWQgPSAhMSwgdGhpcy5faW5pdCgpXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcChuLCBbe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9pbml0XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc05hbWUgPSBcInNsaW0tY3JvcC1hcmVhXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBrKFwiZGl2XCIsIFwiZ3JpZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgaW4gaSkgaWYgKGkuaGFzT3duUHJvcGVydHkoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBrKFwiYnV0dG9uXCIsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKG4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gayhcImJ1dHRvblwiLCBcImNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZChvKSwgeChkb2N1bWVudCwgeS5ET1dOLCB0aGlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwicmVzZXRcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcmFjdGlvbiA9IG51bGwsIHRoaXMuX3JlY3QgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLl9yZWN0Q2hhbmdlZCA9ICEwLCB0aGlzLl9yZWRyYXcoKSwgdGhpcy5fZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImNoYW5nZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcInJlc2NhbGVcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAhPT0gdCAmJiAodGhpcy5faW50ZXJhY3Rpb24gPSBudWxsLCB0aGlzLl9yZWN0Q2hhbmdlZCA9ICEwLCB0aGlzLl9yZWN0LnggKj0gdCwgdGhpcy5fcmVjdC55ICo9IHQsIHRoaXMuX3JlY3Qud2lkdGggKj0gdCwgdGhpcy5fcmVjdC5oZWlnaHQgKj0gdCwgdGhpcy5fcmVkcmF3KCksIHRoaXMuX2VsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJjaGFuZ2VcIikpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwibGltaXRcIiwgdmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3BhY2Uud2lkdGggPSB0LCB0aGlzLl9zcGFjZS5oZWlnaHQgPSBlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJvZmZzZXRcIiwgdmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3BhY2UueCA9IHQsIHRoaXMuX3NwYWNlLnkgPSBlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJyZXNpemVcIiwgdmFsdWU6IGZ1bmN0aW9uICh0LCBlLCBpLCBuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW50ZXJhY3Rpb24gPSBudWxsLCB0aGlzLl9yZWN0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBJKHQsIDAsIHRoaXMuX3NwYWNlLndpZHRoIC0gdGhpcy5fbWluV2lkdGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBJKGUsIDAsIHRoaXMuX3NwYWNlLmhlaWdodCAtIHRoaXMuX21pbkhlaWdodCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBJKGksIHRoaXMuX21pbldpZHRoLCB0aGlzLl9zcGFjZS53aWR0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogSShuLCB0aGlzLl9taW5IZWlnaHQsIHRoaXMuX3NwYWNlLmhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLl9yZWN0Q2hhbmdlZCA9ICEwLCB0aGlzLl9yZWRyYXcoKSwgdGhpcy5fZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImNoYW5nZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImhhbmRsZUV2ZW50XCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcInRvdWNoc3RhcnRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwicG9pbnRlcmRvd25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwibW91c2Vkb3duXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblN0YXJ0RHJhZyh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJ0b3VjaG1vdmVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwicG9pbnRlcm1vdmVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwibW91c2Vtb3ZlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkRyYWcodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwidG91Y2hlbmRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwidG91Y2hjYW5jZWxcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwicG9pbnRlcnVwXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcIm1vdXNldXBcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uU3RvcERyYWcodClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJfb25TdGFydERyYWdcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jb250YWlucyh0LnRhcmdldCkgJiYgKHQucHJldmVudERlZmF1bHQoKSwgeChkb2N1bWVudCwgeS5NT1ZFLCB0aGlzKSwgeChkb2N1bWVudCwgeS5VUCwgdGhpcyksIHRoaXMuX2ludGVyYWN0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0LnRhcmdldC5jbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogUCh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuX2ludGVyYWN0aW9uLm9mZnNldC54IC09IHRoaXMuX3JlY3QueCwgdGhpcy5faW50ZXJhY3Rpb24ub2Zmc2V0LnkgLT0gdGhpcy5fcmVjdC55LCB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtZHJhZ2dpbmdcIiwgXCJ0cnVlXCIpLCB0aGlzLl9yZWRyYXcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbkRyYWdcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gUCh0KSwgbiA9IHRoaXMuX2ludGVyYWN0aW9uLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjXCIgPT09IG4gPyAodGhpcy5fcmVjdC54ID0gSShlLnggLSB0aGlzLl9pbnRlcmFjdGlvbi5vZmZzZXQueCwgMCwgdGhpcy5fc3BhY2Uud2lkdGggLSB0aGlzLl9yZWN0LndpZHRoKSwgdGhpcy5fcmVjdC55ID0gSShlLnkgLSB0aGlzLl9pbnRlcmFjdGlvbi5vZmZzZXQueSwgMCwgdGhpcy5fc3BhY2UuaGVpZ2h0IC0gdGhpcy5fcmVjdC5oZWlnaHQpKSA6IGlbbl0gJiYgKHRoaXMuX3JlY3QgPSBpW25dKHRoaXMuX3JlY3QsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogZS54IC0gdGhpcy5fc3BhY2UueCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogZS55IC0gdGhpcy5fc3BhY2UueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMuX3NwYWNlLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuX3NwYWNlLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluOiB7d2lkdGg6IHRoaXMuX21pbldpZHRoLCBoZWlnaHQ6IHRoaXMuX21pbkhlaWdodH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLl9yYXRpbykpLCB0aGlzLl9yZWN0Q2hhbmdlZCA9ICEwLCB0aGlzLl9lbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiaW5wdXRcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJfb25TdG9wRHJhZ1wiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnByZXZlbnREZWZhdWx0KCksIFMoZG9jdW1lbnQsIHkuTU9WRSwgdGhpcyksIFMoZG9jdW1lbnQsIHkuVVAsIHRoaXMpLCB0aGlzLl9pbnRlcmFjdGlvbiA9IG51bGwsIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1kcmFnZ2luZ1wiLCBcImZhbHNlXCIpLCB0aGlzLl9lbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiY2hhbmdlXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3JlZHJhd1wiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fcmVjdENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBcInRyYW5zbGF0ZShcIiArIHRoaXMuX3JlY3QueCArIFwicHgsXCIgKyB0aGlzLl9yZWN0LnkgKyBcInB4KTtcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gXCJcXG5cXHRcXHRcXHRcXHRcXHQtd2Via2l0LXRyYW5zZm9ybTogXCIgKyBlICsgXCI7XFxuXFx0XFx0XFx0XFx0XFx0dHJhbnNmb3JtOiBcIiArIGUgKyBcIjtcXG5cXHRcXHRcXHRcXHRcXHR3aWR0aDpcIiArIHRoaXMuX3JlY3Qud2lkdGggKyBcInB4O1xcblxcdFxcdFxcdFxcdFxcdGhlaWdodDpcIiArIHRoaXMuX3JlY3QuaGVpZ2h0ICsgXCJweDtcXG5cXHRcXHRcXHRcXHRcIiwgdGhpcy5fcmVjdENoYW5nZWQgPSAhMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcmFjdGlvbiAmJiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5fcmVkcmF3KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZGVzdHJveVwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludGVyYWN0aW9uID0gITEsIHRoaXMuX3JlY3RDaGFuZ2VkID0gITEsIFMoZG9jdW1lbnQsIHkuRE9XTiwgdGhpcyksIFMoZG9jdW1lbnQsIHkuTU9WRSwgdGhpcyksIFMoZG9jdW1lbnQsIHkuVVAsIHRoaXMpLCBFdCh0aGlzLl9lbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZWxlbWVudFwiLCBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwic3BhY2VcIiwgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NwYWNlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJhcmVhXCIsIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5fcmVjdC54IC8gdGhpcy5fc3BhY2Uud2lkdGgsIGUgPSB0aGlzLl9yZWN0LnkgLyB0aGlzLl9zcGFjZS5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLl9yZWN0LndpZHRoIC8gdGhpcy5fc3BhY2Uud2lkdGgsIG4gPSB0aGlzLl9yZWN0LmhlaWdodCAvIHRoaXMuX3NwYWNlLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3g6IHQsIHk6IGUsIHdpZHRoOiBpLCBoZWlnaHQ6IG59XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJkaXJ0eVwiLCBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAhPT0gdGhpcy5fcmVjdC54IHx8IDAgIT09IHRoaXMuX3JlY3QueSB8fCAwICE9PSB0aGlzLl9yZWN0LndpZHRoIHx8IDAgIT09IHRoaXMuX3JlY3QuaGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJtaW5XaWR0aFwiLCBzZXQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWluV2lkdGggPSBNYXRoLm1heCh0LCAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwibWluSGVpZ2h0XCIsIHNldDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9taW5IZWlnaHQgPSBNYXRoLm1heCh0LCAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwicmF0aW9cIiwgc2V0OiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JhdGlvID0gdFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XSksIG5cbiAgICAgICAgICAgICAgICB9KClcbiAgICAgICAgICAgIH0oKSwgSXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSBbXCJpbnB1dFwiLCBcImNoYW5nZVwiXSwgbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSBlID8gYXJndW1lbnRzWzBdIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSBlID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICAgICAgICAgICAgICAgICAgICB0KHRoaXMsIG4pLCB0aGlzLl9lbGVtZW50ID0gaSwgdGhpcy5fb3B0aW9ucyA9IGcobi5vcHRpb25zKCksIG8pLCB0aGlzLl9yYXRpbyA9IG51bGwsIHRoaXMuX291dHB1dCA9IG51bGwsIHRoaXMuX3JvdGF0aW5nID0gITEsIHRoaXMuX2lucHV0ID0gbnVsbCwgdGhpcy5fcHJldmlldyA9IG51bGwsIHRoaXMuX3ByZXZpZXdCbHVycmVkID0gbnVsbCwgdGhpcy5fYmx1cnJlZFByZXZpZXcgPSAhMSwgdGhpcy5fY3JvcHBlciA9IG51bGwsIHRoaXMuX3N0cmFpZ2h0Q3JvcCA9IG51bGwsIHRoaXMuX3ByZXZpZXdXcmFwcGVyID0gbnVsbCwgdGhpcy5fY3VycmVudFdpbmRvd1NpemUgPSB7fSwgdGhpcy5fYnRuR3JvdXAgPSBudWxsLCB0aGlzLl9tYXNrRnJhbWUgPSBudWxsLCB0aGlzLl9kaXJ0eSA9ICExLCB0aGlzLl93cmFwcGVyUm90YXRpb24gPSAwLCB0aGlzLl93cmFwcGVyU2NhbGUgPSAxLCB0aGlzLl9pbml0KClcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwKG4sIFt7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2luaXRcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc05hbWUgPSBcInNsaW0taW1hZ2UtZWRpdG9yXCIsIHRoaXMuX2NvbnRhaW5lciA9IGsoXCJkaXZcIiwgXCJzbGltLWNvbnRhaW5lclwiKSwgdGhpcy5fd3JhcHBlciA9IGsoXCJkaXZcIiwgXCJzbGltLXdyYXBwZXJcIiksIHRoaXMuX3N0YWdlID0gayhcImRpdlwiLCBcInNsaW0tc3RhZ2VcIiksIHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9zdGFnZSksIHRoaXMuX2Nyb3BwZXIgPSBuZXcgVHQsIGkuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9jcm9wcGVyLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihlLCB0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl9zdGFnZS5hcHBlbmRDaGlsZCh0aGlzLl9jcm9wcGVyLmVsZW1lbnQpLCB0aGlzLl9wcmV2aWV3V3JhcHBlciA9IGsoXCJkaXZcIiwgXCJzbGltLWltYWdlLWVkaXRvci1wcmV2aWV3IHNsaW0tY3JvcC1wcmV2aWV3XCIpLCB0aGlzLl9wcmV2aWV3Qmx1cnJlZCA9IGsoXCJjYW52YXNcIiwgXCJzbGltLWNyb3AtYmx1clwiKSwgdGhpcy5fcHJldmlld1dyYXBwZXIuYXBwZW5kQ2hpbGQodGhpcy5fcHJldmlld0JsdXJyZWQpLCB0aGlzLl93cmFwcGVyLmFwcGVuZENoaWxkKHRoaXMuX3ByZXZpZXdXcmFwcGVyKSwgdGhpcy5fcHJldmlld01hc2sgPSBrKFwiZGl2XCIsIFwic2xpbS1jcm9wLW1hc2tcIiksIHRoaXMuX3ByZXZpZXcgPSBrKFwiaW1nXCIpLCB0aGlzLl9wcmV2aWV3TWFzay5hcHBlbmRDaGlsZCh0aGlzLl9wcmV2aWV3KSwgdGhpcy5fY3JvcHBlci5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3ByZXZpZXdNYXNrKSwgdGhpcy5fYnRuR3JvdXAgPSBrKFwiZGl2XCIsIFwic2xpbS1lZGl0b3ItYnRuLWdyb3VwXCIpLCBuLkJ1dHRvbnMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IFIoZSksIG4gPSB0Ll9vcHRpb25zW1wiYnV0dG9uXCIgKyBpICsgXCJMYWJlbFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSB0Ll9vcHRpb25zW1wiYnV0dG9uXCIgKyBpICsgXCJUaXRsZVwiXSwgYSA9IHQuX29wdGlvbnNbXCJidXR0b25cIiArIGkgKyBcIkNsYXNzTmFtZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBrKFwiYnV0dG9uXCIsIFwic2xpbS1lZGl0b3ItYnRuIHNsaW0tYnRuLVwiICsgZSArIChhID8gXCIgXCIgKyBhIDogXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmlubmVySFRNTCA9IG4sIHIudGl0bGUgPSBvIHx8IG4sIHIudHlwZSA9IFwiYnV0dG9uXCIsIHIuc2V0QXR0cmlidXRlKFwiZGF0YS1hY3Rpb25cIiwgZSksIHIuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHQpLCB0Ll9idG5Hcm91cC5hcHBlbmRDaGlsZChyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl91dGlsc0dyb3VwID0gayhcImRpdlwiLCBcInNsaW0tZWRpdG9yLXV0aWxzLWdyb3VwXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gayhcImJ1dHRvblwiLCBcInNsaW0tZWRpdG9yLXV0aWxzLWJ0biBzbGltLWJ0bi1yb3RhdGVcIiArICh0aGlzLl9vcHRpb25zLmJ1dHRvblJvdGF0ZUNsYXNzTmFtZSA/IFwiIFwiICsgdGhpcy5fb3B0aW9ucy5idXR0b25Sb3RhdGVDbGFzc05hbWUgOiBcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWFjdGlvblwiLCBcInJvdGF0ZVwiKSwgZS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcyksIGUudGl0bGUgPSB0aGlzLl9vcHRpb25zLmJ1dHRvblJvdGF0ZVRpdGxlLCB0aGlzLl91dGlsc0dyb3VwLmFwcGVuZENoaWxkKGUpLCB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fd3JhcHBlciksIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY29udGFpbmVyKSwgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl91dGlsc0dyb3VwKSwgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9idG5Hcm91cClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImRpcnR5XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlydHkgPSAhMFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiaGFuZGxlRXZlbnRcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiY2xpY2tcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2xpY2sodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiY2hhbmdlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkdyaWRDaGFuZ2UodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiaW5wdXRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uR3JpZElucHV0KHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcImtleWRvd25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uS2V5RG93bih0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJyZXNpemVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uUmVzaXplKHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uS2V5RG93blwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQua2V5Q29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHYuUkVUVVJOOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uZmlybSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugdi5FU0M6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYW5jZWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbkNsaWNrXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhcInNsaW0tYnRuLWNhbmNlbFwiKSAmJiB0aGlzLl9jYW5jZWwoKSwgdC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKFwic2xpbS1idG4tY29uZmlybVwiKSAmJiB0aGlzLl9jb25maXJtKCksIHQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhcInNsaW0tYnRuLXJvdGF0ZVwiKSAmJiB0aGlzLl9yb3RhdGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uUmVzaXplXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFdpbmRvd1NpemUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLl9yZWRyYXcoKSwgdGhpcy5fcmVkcmF3Q3JvcHBlcih0aGlzLl9jcm9wcGVyLmFyZWEpLCB0aGlzLl91cGRhdGVXcmFwcGVyU2NhbGUoKSwgdGhpcy5fcmVkcmF3V3JhcHBlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJfcmVkcmF3V3JhcHBlclwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdS5jcmVhdGVNYXRyaXgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNjYWxlKHRoaXMuX3dyYXBwZXJTY2FsZSwgdGhpcy5fd3JhcHBlclNjYWxlKSwgdC5yb3RhdGVaKHRoaXMuX3dyYXBwZXJSb3RhdGlvbiAqIChNYXRoLlBJIC8gMTgwKSksIHUuc2V0RWxlbWVudFRyYW5zZm9ybSh0aGlzLl9wcmV2aWV3V3JhcHBlciwgdClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbkdyaWRJbnB1dFwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlZHJhd0Nyb3BNYXNrKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbkdyaWRDaGFuZ2VcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWRyYXdDcm9wTWFzaygpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJfdXBkYXRlV3JhcHBlclJvdGF0aW9uXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5taW5TaXplLndpZHRoID4gdGhpcy5faW5wdXQuaGVpZ2h0IHx8IHRoaXMuX29wdGlvbnMubWluU2l6ZS5oZWlnaHQgPiB0aGlzLl9pbnB1dC53aWR0aCA/IHRoaXMuX3dyYXBwZXJSb3RhdGlvbiArPSAxODAgOiB0aGlzLl93cmFwcGVyUm90YXRpb24gKz0gOTBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl91cGRhdGVXcmFwcGVyU2NhbGVcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX3dyYXBwZXJSb3RhdGlvbiAlIDE4MCAhPT0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuX2NvbnRhaW5lci5vZmZzZXRXaWR0aCwgaSA9IHRoaXMuX2NvbnRhaW5lci5vZmZzZXRIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gdGhpcy5fd3JhcHBlci5vZmZzZXRIZWlnaHQsIG8gPSB0aGlzLl93cmFwcGVyLm9mZnNldFdpZHRoLCBhID0gZSAvIG47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgKiBvID4gaSAmJiAoYSA9IGkgLyBvKSwgdGhpcy5fd3JhcHBlclNjYWxlID0gYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLl93cmFwcGVyU2NhbGUgPSAxXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJfY2FuY2VsXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcm90YXRpbmcgfHwgdGhpcy5fZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImNhbmNlbFwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9jb25maXJtXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9yb3RhdGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX3dyYXBwZXJSb3RhdGlvbiAlIDE4MCAhPT0gMCwgZSA9IHRoaXMuX2Nyb3BwZXIuYXJlYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBkdChlLCB0ID8gdGhpcy5faW5wdXQuaGVpZ2h0IDogdGhpcy5faW5wdXQud2lkdGgsIHQgPyB0aGlzLl9pbnB1dC53aWR0aCA6IHRoaXMuX2lucHV0LmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJjb25maXJtXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiB0aGlzLl93cmFwcGVyUm90YXRpb24gJSAzNjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcDogaVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJfcm90YXRlXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fcm90YXRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcm90YXRpbmcgPSAhMCwgdGhpcy5fdXBkYXRlV3JhcHBlclJvdGF0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gMSA9PT0gdGhpcy5yYXRpbyB8fCBudWxsID09PSB0aGlzLl9yYXRpbyA/IHRoaXMuX2Nyb3BwZXIuYXJlYSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgQyhlLCA5MCksIHRoaXMuX3VwZGF0ZVdyYXBwZXJTY2FsZSgpLCB0aGlzLl9oaWRlQ3JvcHBlcigpLCB1KHRoaXMuX3ByZXZpZXdXcmFwcGVyLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbjogWzAsIDAsIHRoaXMuX3dyYXBwZXJSb3RhdGlvbiAqIChNYXRoLlBJIC8gMTgwKV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZTogW3RoaXMuX3dyYXBwZXJTY2FsZSwgdGhpcy5fd3JhcHBlclNjYWxlXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhc2luZzogXCJzcHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmluZ0NvbnN0YW50OiAuOCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmluZ0RlY2VsZXJhdGlvbjogLjY1LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9yZWRyYXdDcm9wcGVyKGUpLCB0Ll9zaG93Q3JvcHBlcigpLCB0Ll9yb3RhdGluZyA9ICExXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3Nob3dDcm9wcGVyXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSh0aGlzLl9zdGFnZSwge2Vhc2luZzogXCJlYXNlXCIsIGR1cmF0aW9uOiAyNTAsIGZyb21PcGFjaXR5OiAwLCBvcGFjaXR5OiAxfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9oaWRlQ3JvcHBlclwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUodGhpcy5fc3RhZ2UsIHtkdXJhdGlvbjogMCwgZnJvbU9wYWNpdHk6IDAsIG9wYWNpdHk6IDB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3JlZHJhd0Nyb3BNYXNrXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLCBlID0gdGhpcy5fd3JhcHBlclJvdGF0aW9uICUgMzYwLCBpID0gdGhpcy5fd3JhcHBlclNjYWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0ge3dpZHRoOiB0aGlzLl93cmFwcGVyLm9mZnNldFdpZHRoLCBoZWlnaHQ6IHRoaXMuX3dyYXBwZXIub2Zmc2V0SGVpZ2h0fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IHRoaXMuX2Nyb3BwZXIuYXJlYSwgYSA9IHt4OiAwLCB5OiAwfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID09PSBlID8gKGEueCA9IC1vLngsIGEueSA9IC1vLnkpIDogOTAgPT09IGUgPyAoYS54ID0gLSgxIC0gby55KSwgYS55ID0gLW8ueCkgOiAxODAgPT09IGUgPyAoYS54ID0gLSgxIC0gby54KSwgYS55ID0gLSgxIC0gby55KSkgOiAyNzAgPT09IGUgJiYgKGEueCA9IC1vLnksIGEueSA9IC0oMSAtIG8ueCkpLCBhLnggKj0gbi53aWR0aCwgYS55ICo9IG4uaGVpZ2h0LCBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9tYXNrRnJhbWUpLCB0aGlzLl9tYXNrRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFwic2NhbGUoXCIgKyBpICsgXCIpIHJvdGF0ZShcIiArIC1lICsgXCJkZWcpIHRyYW5zbGF0ZShcIiArIGEueCArIFwicHgsIFwiICsgYS55ICsgXCJweCk7XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX3ByZXZpZXcuc3R5bGUuY3NzVGV4dCA9IFwiXFxuXFx0XFx0XFx0XFx0XFx0d2lkdGg6IFwiICsgdC5fcHJldmlld1NpemUud2lkdGggKyBcInB4O1xcblxcdFxcdFxcdFxcdFxcdGhlaWdodDogXCIgKyB0Ll9wcmV2aWV3U2l6ZS5oZWlnaHQgKyBcInB4O1xcblxcdFxcdFxcdFxcdFxcdC13ZWJraXQtdHJhbnNmb3JtOiBcIiArIG4gKyBcIjtcXG5cXHRcXHRcXHRcXHRcXHR0cmFuc2Zvcm06IFwiICsgbiArIFwiO1xcblxcdFxcdFxcdFxcdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIm9wZW5cIiwgdmFsdWU6IGZ1bmN0aW9uICh0LCBlLCBpLCBuLCBvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbnB1dCAmJiAhdGhpcy5fZGlydHkgJiYgdGhpcy5fcmF0aW8gPT09IGUpIHJldHVybiB2b2lkIG8oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50V2luZG93U2l6ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuX2RpcnR5ID0gITEsIHRoaXMuX3dyYXBwZXJSb3RhdGlvbiA9IG4gfHwgMCwgdGhpcy5fYmx1cnJlZFByZXZpZXcgPSAhMSwgdGhpcy5fcmF0aW8gPSBlLCB0aGlzLl9wcmV2aWV3U2l6ZSA9IG51bGwsIHRoaXMuX2VsZW1lbnQuc3R5bGUub3BhY2l0eSA9IFwiMFwiLCB0aGlzLl9pbnB1dCA9IHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuICUgMTgwICE9PSAwLCBzID0gZnQoaSwgciA/IHQuaGVpZ2h0IDogdC53aWR0aCwgciA/IHQud2lkdGggOiB0LmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJldmlldy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuX3ByZXZpZXcub25sb2FkID0gbnVsbCwgYS5fY3JvcHBlci5yYXRpbyA9IGEucmF0aW8sIGEuX3JlZHJhdygpLCBhLl9yZWRyYXdDcm9wcGVyKHMpLCBvKCksIGEuX2VsZW1lbnQuc3R5bGUub3BhY2l0eSA9IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLl9wcmV2aWV3LnNyYyA9IFwiXCIsIHRoaXMuX3ByZXZpZXcuc3JjID0gaHQodGhpcy5faW5wdXQsIE1hdGgubWluKHRoaXMuX2NvbnRhaW5lci5vZmZzZXRXaWR0aCAvIHRoaXMuX2lucHV0LndpZHRoLCB0aGlzLl9jb250YWluZXIub2Zmc2V0SGVpZ2h0IC8gdGhpcy5faW5wdXQuaGVpZ2h0KSAqIHRoaXMuX29wdGlvbnMuZGV2aWNlUGl4ZWxSYXRpbykudG9EYXRhVVJMKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9yZWRyYXdDcm9wcGVyXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5fd3JhcHBlclJvdGF0aW9uICUgMTgwICE9PSAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZSA/IHRoaXMuX2lucHV0LmhlaWdodCAvIHRoaXMuX2lucHV0LndpZHRoIDogdGhpcy5faW5wdXQud2lkdGggLyB0aGlzLl9pbnB1dC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB0aGlzLl93cmFwcGVyLm9mZnNldFdpZHRoLCBvID0gdGhpcy5fd3JhcHBlci5vZmZzZXRIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSB0aGlzLl9jb250YWluZXIub2Zmc2V0V2lkdGgsIHIgPSB0aGlzLl9jb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVdyYXBwZXJTY2FsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gdGhpcy5fd3JhcHBlclNjYWxlICogKGUgPyBvIDogbiksIGggPSB0aGlzLl93cmFwcGVyU2NhbGUgKiAoZSA/IG4gOiBvKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IGUgPyAuNSAqIChhIC0gcykgOiB0aGlzLl93cmFwcGVyLm9mZnNldExlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBlID8gLjUgKiAociAtIGgpIDogdGhpcy5fd3JhcHBlci5vZmZzZXRUb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhZ2Uuc3R5bGUuY3NzVGV4dCA9IFwiXFxuXFx0XFx0XFx0XFx0bGVmdDpcIiArIHUgKyBcInB4O1xcblxcdFxcdFxcdFxcdHRvcDpcIiArIGwgKyBcInB4O1xcblxcdFxcdFxcdFxcdHdpZHRoOlwiICsgcyArIFwicHg7XFxuXFx0XFx0XFx0XFx0aGVpZ2h0OlwiICsgaCArIFwicHg7XFxuXFx0XFx0XFx0XCIsIHRoaXMuX2Nyb3BwZXIubGltaXQocywgcyAvIGkpLCB0aGlzLl9jcm9wcGVyLm9mZnNldCh1ICsgdGhpcy5fZWxlbWVudC5vZmZzZXRMZWZ0LCBsICsgdGhpcy5fZWxlbWVudC5vZmZzZXRUb3ApLCB0aGlzLl9jcm9wcGVyLm1pbldpZHRoID0gdGhpcy5fd3JhcHBlclNjYWxlICogdGhpcy5fb3B0aW9ucy5taW5TaXplLndpZHRoICogdGhpcy5zY2FsYXIsIHRoaXMuX2Nyb3BwZXIubWluSGVpZ2h0ID0gdGhpcy5fd3JhcHBlclNjYWxlICogdGhpcy5fb3B0aW9ucy5taW5TaXplLmhlaWdodCAqIHRoaXMuc2NhbGFyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gdCA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogdC54ICogcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogdC55ICogaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHQud2lkdGggKiBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHQuaGVpZ2h0ICogaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiB0dChzLCBoLCB0aGlzLl9yYXRpbyB8fCBoIC8gcyksIHRoaXMuX2Nyb3BwZXIucmVzaXplKHAueCwgcC55LCBwLndpZHRoLCBwLmhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9yZWRyYXdcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX2lucHV0LmhlaWdodCAvIHRoaXMuX2lucHV0LndpZHRoLCBlID0gdGhpcy5fY29udGFpbmVyLmNsaWVudFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gdGhpcy5fY29udGFpbmVyLmNsaWVudEhlaWdodCwgbiA9IGUsIG8gPSBuICogdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID4gaSAmJiAobyA9IGksIG4gPSBvIC8gdCksIG4gPSBNYXRoLnJvdW5kKG4pLCBvID0gTWF0aC5yb3VuZChvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IChlIC0gbikgLyAyLCByID0gKGkgLSBvKSAvIDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fd3JhcHBlci5zdHlsZS5jc3NUZXh0ID0gXCJcXG5cXHRcXHRcXHRcXHRsZWZ0OlwiICsgYSArIFwicHg7XFxuXFx0XFx0XFx0XFx0dG9wOlwiICsgciArIFwicHg7XFxuXFx0XFx0XFx0XFx0d2lkdGg6XCIgKyBuICsgXCJweDtcXG5cXHRcXHRcXHRcXHRoZWlnaHQ6XCIgKyBvICsgXCJweDtcXG5cXHRcXHRcXHRcIiwgdGhpcy5fcHJldmlld0JsdXJyZWQuc3R5bGUuY3NzVGV4dCA9IFwiXFxuXFx0XFx0XFx0XFx0d2lkdGg6XCIgKyBuICsgXCJweDtcXG5cXHRcXHRcXHRcXHRoZWlnaHQ6XCIgKyBvICsgXCJweDtcXG5cXHRcXHRcXHRcIiwgdGhpcy5fcHJldmlldy5zdHlsZS5jc3NUZXh0ID0gXCJcXG5cXHRcXHRcXHRcXHR3aWR0aDpcIiArIG4gKyBcInB4O1xcblxcdFxcdFxcdFxcdGhlaWdodDpcIiArIG8gKyBcInB4O1xcblxcdFxcdFxcdFwiLCB0aGlzLl9wcmV2aWV3U2l6ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IG4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuX2JsdXJyZWRQcmV2aWV3IHx8ICh0aGlzLl9wcmV2aWV3Qmx1cnJlZC53aWR0aCA9IDMwMCwgdGhpcy5fcHJldmlld0JsdXJyZWQuaGVpZ2h0ID0gdGhpcy5fcHJldmlld0JsdXJyZWQud2lkdGggKiB0LCBsdCh0aGlzLl9pbnB1dCwgdGhpcy5fcHJldmlld0JsdXJyZWQpLCBwdCh0aGlzLl9wcmV2aWV3Qmx1cnJlZCwgMyksIHRoaXMuX2JsdXJyZWRQcmV2aWV3ID0gITApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJzaG93XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IGUgPyBhcmd1bWVudHNbMF0gOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50V2luZG93U2l6ZS53aWR0aCA9PT0gd2luZG93LmlubmVyV2lkdGggJiYgdGhpcy5fY3VycmVudFdpbmRvd1NpemUuaGVpZ2h0ID09PSB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgKHRoaXMuX3JlZHJhdygpLCB0aGlzLl9yZWRyYXdDcm9wcGVyKHRoaXMuX2Nyb3BwZXIuYXJlYSkpLCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzKSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLl93cmFwcGVyUm90YXRpb24gKiAoTWF0aC5QSSAvIDE4MCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSh0aGlzLl9wcmV2aWV3V3JhcHBlciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tUm90YXRpb246IFswLCAwLCBpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb246IFswLCAwLCBpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVBvc2l0aW9uOiBbMCwgMCwgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBbMCwgMCwgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21PcGFjaXR5OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tU2NhbGU6IFt0aGlzLl93cmFwcGVyU2NhbGUgLSAuMDIsIHRoaXMuX3dyYXBwZXJTY2FsZSAtIC4wMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiBbdGhpcy5fd3JhcHBlclNjYWxlLCB0aGlzLl93cmFwcGVyU2NhbGVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXNpbmc6IFwic3ByaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmluZ0NvbnN0YW50OiAuMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nRGVjZWxlcmF0aW9uOiAuODUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5OiA0NTAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5fY3JvcHBlci5kaXJ0eSA/IHUodGhpcy5fc3RhZ2UsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVBvc2l0aW9uOiBbMCwgMCwgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBbMCwgMCwgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21PcGFjaXR5OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMjUwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheTogODUwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeih0aGlzKSwgdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IHUodGhpcy5fc3RhZ2UsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVBvc2l0aW9uOiBbMCwgMCwgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBbMCwgMCwgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21PcGFjaXR5OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMjUwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheTogMWUzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeih0aGlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHUodGhpcy5fYnRuR3JvdXAuY2hpbGROb2Rlcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tU2NhbGU6IFsuOSwgLjldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZTogWzEsIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tT3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXk6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMWUzICsgMTAwICogdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXNpbmc6IFwic3ByaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmluZ0NvbnN0YW50OiAuMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nRGVjZWxlcmF0aW9uOiAuODUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6KHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdSh0aGlzLl91dGlsc0dyb3VwLmNoaWxkTm9kZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVNjYWxlOiBbLjksIC45XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IFsxLCAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wYWNpdHk6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhc2luZzogXCJzcHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nQ29uc3RhbnQ6IC4zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbmdEZWNlbGVyYXRpb246IC44NSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXk6IDEyNTAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6KHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiaGlkZVwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSBlID8gYXJndW1lbnRzWzBdIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcyksIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMpLCB1KHRoaXMuX3V0aWxzR3JvdXAuY2hpbGROb2Rlcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tT3BhY2l0eTogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDI1MFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB1KHRoaXMuX2J0bkdyb3VwLmNoaWxkTm9kZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wYWNpdHk6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5OiAyMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzNTBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdShbdGhpcy5fc3RhZ2UsIHRoaXMuX3ByZXZpZXdXcmFwcGVyXSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tUG9zaXRpb246IFswLCAwLCAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IFswLCAtMjUwLCAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wYWNpdHk6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhc2luZzogXCJzcHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nQ29uc3RhbnQ6IC4zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbmdEZWNlbGVyYXRpb246IC43NSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXk6IDI1MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsRG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZGVzdHJveVwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdCh0aGlzLl9idG5Hcm91cC5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fY3JvcHBlci5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSwgdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5fY3JvcHBlci5kZXN0cm95KCksIHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZSAmJiBFdCh0aGlzLl9lbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwic2hvd1JvdGF0ZUJ1dHRvblwiLCBzZXQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA/IHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcInNsaW0tcm90YXRpb24tZGlzYWJsZWRcIikgOiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJzbGltLXJvdGF0aW9uLWRpc2FibGVkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJlbGVtZW50XCIsIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJyYXRpb1wiLCBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJpbnB1dFwiID09PSB0aGlzLl9yYXRpbyA/IHRoaXMuX2lucHV0LmhlaWdodCAvIHRoaXMuX2lucHV0LndpZHRoIDogdGhpcy5fcmF0aW9cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIm9mZnNldFwiLCBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwib3JpZ2luYWxcIiwgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJzY2FsYXJcIiwgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ByZXZpZXdTaXplLndpZHRoIC8gdGhpcy5faW5wdXQud2lkdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfV0sIFt7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwib3B0aW9uc1wiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNhbmNlbENsYXNzTmFtZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ29uZmlybUNsYXNzTmFtZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ2FuY2VsTGFiZWw6IFwiQ2FuY2VsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNvbmZpcm1MYWJlbDogXCJDb25maXJtXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNhbmNlbFRpdGxlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25Db25maXJtVGl0bGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblJvdGF0ZVRpdGxlOiBcIlJvdGF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25Sb3RhdGVDbGFzc05hbWU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVBpeGVsUmF0aW86IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblNpemU6IHt3aWR0aDogMCwgaGVpZ2h0OiAwfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfV0pLCBuXG4gICAgICAgICAgICAgICAgfSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuLkJ1dHRvbnMgPSBbXCJjYW5jZWxcIiwgXCJjb25maXJtXCJdLCBuXG4gICAgICAgICAgICB9KFR0KSwgTHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSBbXCJkcmFnZW50ZXJcIiwgXCJkcmFnb3ZlclwiLCBcImRyYWdsZWF2ZVwiLCBcImRyb3BcIl07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSBlID8gYXJndW1lbnRzWzBdIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQodGhpcywgbiksIHRoaXMuX2VsZW1lbnQgPSBpLCB0aGlzLl9hY2NlcHQgPSBbXSwgdGhpcy5fYWxsb3dVUkxzID0gITEsIHRoaXMuX2RyYWdQYXRoID0gbnVsbCwgdGhpcy5faW5pdCgpXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcChuLCBbe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImlzVmFsaWREYXRhVHJhbnNmZXJcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZmlsZXMgJiYgdC5maWxlcy5sZW5ndGggPyB0aGlzLmFyZVZhbGlkRGF0YVRyYW5zZmVyRmlsZXModC5maWxlcykgOiB0Lml0ZW1zICYmIHQuaXRlbXMubGVuZ3RoID8gdGhpcy5hcmVWYWxpZERhdGFUcmFuc2Zlckl0ZW1zKHQuaXRlbXMpIDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiYXJlVmFsaWREYXRhVHJhbnNmZXJGaWxlc1wiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuX2FjY2VwdC5sZW5ndGggfHwgIXQgfHwgdGhpcy5fYWNjZXB0LmluZGV4T2YodFswXS50eXBlKSAhPT0gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImFyZVZhbGlkRGF0YVRyYW5zZmVySXRlbXNcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLl9hY2NlcHQubGVuZ3RoIHx8ICF0IHx8ICh0aGlzLl9hbGxvd1VSTHMgJiYgXCJzdHJpbmdcIiA9PT0gdFswXS5raW5kID8gbnVsbCA6IHRbMF0udHlwZSAmJiAwID09PSB0WzBdLnR5cGUuaW5kZXhPZihcImFwcGxpY2F0aW9uXCIpID8gbnVsbCA6IHRoaXMuX2FjY2VwdC5pbmRleE9mKHRbMF0udHlwZSkgIT09IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwicmVzZXRcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LmZpbGVzID0gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2luaXRcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc05hbWUgPSBcInNsaW0tZmlsZS1ob3BwZXJcIiwgaS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihlLCB0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJoYW5kbGVFdmVudFwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJkcmFnZW50ZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiZHJhZ292ZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRHJhZ092ZXIodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiZHJhZ2xlYXZlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkRyYWdMZWF2ZSh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJkcm9wXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkRyb3AodClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJfb25Ecm9wXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2FsbG93VVJMcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHZvaWQgMCwgbiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSB0LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidXJsXCIpLCBuID0gdC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShcInRleHQvaHRtbFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gJiYgbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gbi5tYXRjaCgvc3JjXFxzKj1cXHMqXCIoLis/KVwiLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvICYmIChlID0gb1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGkgJiYgaS5sZW5ndGggJiYgKGUgPSBpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgdGhpcy5fZWxlbWVudC5maWxlcyA9IFt7cmVtb3RlOiBlfV07IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMuaXNWYWxpZERhdGFUcmFuc2Zlcih0LmRhdGFUcmFuc2Zlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYSkgcmV0dXJuIHRoaXMuX2VsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJmaWxlLWludmFsaWQtZHJvcFwiKSksIHZvaWQodGhpcy5fZHJhZ1BhdGggPSBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5maWxlcyA9IHQuZGF0YVRyYW5zZmVyLmZpbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJmaWxlLWRyb3BcIiwge2RldGFpbDogbSh0KX0pKSwgdGhpcy5fZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImNoYW5nZVwiKSksIHRoaXMuX2RyYWdQYXRoID0gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uRHJhZ092ZXJcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpLCB0LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gXCJjb3B5XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmlzVmFsaWREYXRhVHJhbnNmZXIodC5kYXRhVHJhbnNmZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsID09PSBlIHx8IGUgPyAodGhpcy5fZHJhZ1BhdGggfHwgKHRoaXMuX2RyYWdQYXRoID0gW10pLCB0aGlzLl9kcmFnUGF0aC5wdXNoKG0odCkpLCB2b2lkIHRoaXMuX2VsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJmaWxlLW92ZXJcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IFQodGhpcy5fZHJhZ1BhdGgpLngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBUKHRoaXMuX2RyYWdQYXRoKS55XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpIDogKHQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSBcIm5vbmVcIiwgdm9pZCB0aGlzLl9lbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiZmlsZS1pbnZhbGlkXCIpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbkRyYWdMZWF2ZVwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiZmlsZS1vdXRcIiwge2RldGFpbDogbSh0KX0pKSwgdGhpcy5fZHJhZ1BhdGggPSBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJkZXN0cm95XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSwgdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgRXQodGhpcy5fZWxlbWVudCksIHRoaXMuX2VsZW1lbnQgPSBudWxsLCB0aGlzLl9kcmFnUGF0aCA9IG51bGwsIHRoaXMuX2FjY2VwdCA9IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImVsZW1lbnRcIiwgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImRyYWdQYXRoXCIsIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kcmFnUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZW5hYmxlZFwiLCBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiA9PT0gdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBzZXQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gdCA/IFwiXCIgOiBcIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiYWxsb3dVUkxzXCIsIHNldDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hbGxvd1VSTHMgPSB0XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJhY2NlcHRcIiwgc2V0OiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FjY2VwdCA9IHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hY2NlcHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfV0pLCBuXG4gICAgICAgICAgICAgICAgfSgpXG4gICAgICAgICAgICB9KCksIE90ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0KHRoaXMsIGkpLCB0aGlzLl9lbGVtZW50ID0gbnVsbCwgdGhpcy5faW5uZXIgPSBudWxsLCB0aGlzLl9pbml0KClcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwKGksIFt7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2luaXRcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50ID0gayhcImRpdlwiLCBcInNsaW0tcG9wb3ZlclwiKSwgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXN0YXRlXCIsIFwib2ZmXCIpLCBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpLCB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgITApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJzaG93XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLCBpID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSBlID8gYXJndW1lbnRzWzBdIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXN0YXRlXCIsIFwib25cIiksIHUodGhpcy5fZWxlbWVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tT3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDM1MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHoodC5fZWxlbWVudCksIGkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImhpZGVcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMsIGkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IGUgPyBhcmd1bWVudHNbMF0gOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KHRoaXMuX2VsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wYWNpdHk6IDEsIG9wYWNpdHk6IDAsIGR1cmF0aW9uOiA1MDAsIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6KHQuX2VsZW1lbnQpLCB0Ll9lbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtc3RhdGVcIiwgXCJvZmZcIiksIGkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImRlc3Ryb3lcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUgJiYgKHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9lbGVtZW50KSwgdGhpcy5fZWxlbWVudCA9IG51bGwsIHRoaXMuX2lubmVyID0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImlubmVyXCIsIHNldDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbm5lciA9IHQsIHRoaXMuX2VsZW1lbnQuZmlyc3RDaGlsZCAmJiB0aGlzLl9lbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuX2VsZW1lbnQuZmlyc3RDaGlsZCksIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5faW5uZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJjbGFzc05hbWVcIiwgc2V0OiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NOYW1lID0gXCJzbGltLXBvcG92ZXJcIiArIChudWxsID09PSB0ID8gXCJcIiA6IFwiIFwiICsgdClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfV0pLCBpXG4gICAgICAgICAgICAgICAgfSgpXG4gICAgICAgICAgICB9KCksIHp0ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5zcGxpdChlKS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHQsIDEwKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCBEdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiRElWXCIgPT09IHQubm9kZU5hbWUgfHwgXCJTUEFOXCIgPT09IHQubm9kZU5hbWVcbiAgICAgICAgICAgIH0sIEF0ID0ge0FVVE86IFwiYXV0b1wiLCBJTklUSUFMOiBcImluaXRpYWxcIiwgTUFOVUFMOiBcIm1hbnVhbFwifSwgVXQgPSBbXCJ4XCIsIFwieVwiLCBcIndpZHRoXCIsIFwiaGVpZ2h0XCJdLFxuICAgICAgICAgICAgSHQgPSBbXCJmaWxlLWludmFsaWQtZHJvcFwiLCBcImZpbGUtaW52YWxpZFwiLCBcImZpbGUtZHJvcFwiLCBcImZpbGUtb3ZlclwiLCBcImZpbGUtb3V0XCIsIFwiY2xpY2tcIl0sXG4gICAgICAgICAgICBOdCA9IFtcImNhbmNlbFwiLCBcImNvbmZpcm1cIl0sIEJ0ID0gW1wicmVtb3ZlXCIsIFwiZWRpdFwiLCBcImRvd25sb2FkXCIsIFwidXBsb2FkXCJdLCBGdCA9IG51bGwsIFd0ID0gMCxcbiAgICAgICAgICAgIHF0ID0gJ1xcbjxkaXYgY2xhc3M9XCJzbGltLWxvYWRlclwiPlxcblxcdDxzdmc+XFxuXFx0XFx0PHBhdGggY2xhc3M9XCJzbGltLWxvYWRlci1iYWNrZ3JvdW5kXCIgZmlsbD1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCIzXCIgLz5cXG5cXHRcXHQ8cGF0aCBjbGFzcz1cInNsaW0tbG9hZGVyLWZvcmVncm91bmRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjNcIiAvPlxcblxcdDwvc3ZnPlxcbjwvZGl2PlxcbicsXG4gICAgICAgICAgICBqdCA9ICdcXG48ZGl2IGNsYXNzPVwic2xpbS11cGxvYWQtc3RhdHVzXCI+PC9kaXY+XFxuJywgVnQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHZhciBlID0gdC5zcGxpdChcIixcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt3aWR0aDogcGFyc2VJbnQoZVswXSwgMTApLCBoZWlnaHQ6IHBhcnNlSW50KGVbMV0sIDEwKX1cbiAgICAgICAgICAgIH0sIEd0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkobikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gZSA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgICAgICAgICAgICAgICB0KHRoaXMsIGkpLCBGdCB8fCAoRnQgPSBuZXcgT3QpLCB0aGlzLl91aWQgPSBXdCsrLCB0aGlzLl9vcHRpb25zID0gZyhpLm9wdGlvbnMoKSwgbyksIHRoaXMuX29wdGlvbnMuZm9yY2VTaXplICYmIChcInN0cmluZ1wiID09IHR5cGVvZiB0aGlzLl9vcHRpb25zLmZvcmNlU2l6ZSAmJiAodGhpcy5fb3B0aW9ucy5mb3JjZVNpemUgPSBWdCh0aGlzLl9vcHRpb25zLmZvcmNlU2l6ZSkpLCB0aGlzLl9vcHRpb25zLnJhdGlvID0gdGhpcy5fb3B0aW9ucy5mb3JjZVNpemUud2lkdGggKyBcIjpcIiArIHRoaXMuX29wdGlvbnMuZm9yY2VTaXplLmhlaWdodCwgdGhpcy5fb3B0aW9ucy5zaXplID0gbXQodGhpcy5fb3B0aW9ucy5mb3JjZVNpemUpKSwgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdGhpcy5fb3B0aW9ucy5zaXplICYmICh0aGlzLl9vcHRpb25zLnNpemUgPSBWdCh0aGlzLl9vcHRpb25zLnNpemUpKSwgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdGhpcy5fb3B0aW9ucy5taW5TaXplICYmICh0aGlzLl9vcHRpb25zLm1pblNpemUgPSBWdCh0aGlzLl9vcHRpb25zLm1pblNpemUpKSwgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdGhpcy5fb3B0aW9ucy5wb3N0ICYmICh0aGlzLl9vcHRpb25zLnBvc3QgPSB0aGlzLl9vcHRpb25zLnBvc3Quc3BsaXQoXCIsXCIpLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgIH0pKSwgdGhpcy5fb3JpZ2luYWxFbGVtZW50ID0gbiwgdGhpcy5fb3JpZ2luYWxFbGVtZW50SW5uZXIgPSBuLmlubmVySFRNTCwgdGhpcy5fb3JpZ2luYWxFbGVtZW50QXR0cmlidXRlcyA9IF8obiksIER0KG4pID8gdGhpcy5fZWxlbWVudCA9IG4gOiAodGhpcy5fZWxlbWVudCA9IEN0KG4pLCB0aGlzLl9lbGVtZW50LmNsYXNzTmFtZSA9IG4uY2xhc3NOYW1lLCBuLmNsYXNzTmFtZSA9IFwiXCIsIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1yYXRpb1wiLCB0aGlzLl9vcHRpb25zLnJhdGlvKSksIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChcInNsaW1cIiksIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1zdGF0ZVwiLCBcImluaXRcIiksIHRoaXMuX3N0YXRlID0gW10sIHRoaXMuX3RpbWVycyA9IFtdLCB0aGlzLl9pbnB1dCA9IG51bGwsIHRoaXMuX2lucHV0UmVmZXJlbmNlID0gbnVsbCwgdGhpcy5fb3V0cHV0ID0gbnVsbCwgdGhpcy5fcmF0aW8gPSBudWxsLCB0aGlzLl9pc1JlcXVpcmVkID0gITEsIHRoaXMuX2ltYWdlSG9wcGVyID0gbnVsbCwgdGhpcy5faW1hZ2VFZGl0b3IgPSBudWxsLCB0aGlzLl9wcm9ncmVzc0VuYWJsZWQgPSAhMCwgdGhpcy5fZGF0YSA9IHt9LCB0aGlzLl9yZXNldERhdGEoKSwgdGhpcy5fZHJpcCA9IG51bGwsIHRoaXMuX2hhc0luaXRpYWxJbWFnZSA9ICExLCB0aGlzLl9pbml0aWFsQ3JvcCA9IHRoaXMuX29wdGlvbnMuY3JvcCwgdGhpcy5faW5pdGlhbFJvdGF0aW9uID0gdGhpcy5fb3B0aW9ucy5yb3RhdGlvbiAmJiB0aGlzLl9vcHRpb25zLnJvdGF0aW9uICUgOTAgPT09IDAgPyB0aGlzLl9vcHRpb25zLnJvdGF0aW9uIDogbnVsbCwgdGhpcy5faXNCZWluZ0Rlc3Ryb3llZCA9ICExLCBpLnN1cHBvcnRlZCA/IHRoaXMuX2luaXQoKSA6IHRoaXMuX2ZhbGxiYWNrKClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcChpLCBbe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwic2V0Um90YXRpb25cIiwgdmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXCJudW1iZXJcIiA9PSB0eXBlb2YgdCB8fCB0ICUgOTAgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRhLmFjdGlvbnMucm90YXRpb24gPSB0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5fZGF0YS5hY3Rpb25zLnJvdGF0aW9uICUgMTgwICE9PSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kYXRhLmlucHV0LmltYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gaSA/IHRoaXMuX2RhdGEuaW5wdXQuaW1hZ2UuaGVpZ2h0IDogdGhpcy5fZGF0YS5pbnB1dC5pbWFnZS53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBpID8gdGhpcy5fZGF0YS5pbnB1dC5pbWFnZS53aWR0aCA6IHRoaXMuX2RhdGEuaW5wdXQuaW1hZ2UuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRhLmFjdGlvbnMuY3JvcCA9IHR0KG4sIG8sIHRoaXMuX3JhdGlvKSwgdGhpcy5fZGF0YS5hY3Rpb25zLmNyb3AudHlwZSA9IEF0LkFVVE9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YS5pbnB1dC5pbWFnZSAmJiBlICYmIHRoaXMuX21hbnVhbFRyYW5zZm9ybShlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwic2V0U2l6ZVwiLCB2YWx1ZTogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQgJiYgKHQgPSBWdCh0KSksIHQgJiYgdC53aWR0aCAmJiB0LmhlaWdodCAmJiAodGhpcy5fb3B0aW9ucy5zaXplID0gbXQodCksIHRoaXMuX2RhdGEuYWN0aW9ucy5zaXplID0gbXQodCksIHRoaXMuX2RhdGEuaW5wdXQuaW1hZ2UgJiYgZSAmJiB0aGlzLl9tYW51YWxUcmFuc2Zvcm0oZSkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJzZXRGb3JjZVNpemVcIiwgdmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcInN0cmluZ1wiID09IHR5cGVvZiB0ICYmICh0ID0gVnQodCkpLCB0ICYmIHQud2lkdGggJiYgdC5oZWlnaHQgJiYgKHRoaXMuX29wdGlvbnMuc2l6ZSA9IG10KHQpLCB0aGlzLl9vcHRpb25zLmZvcmNlU2l6ZSA9IG10KHQpLCB0aGlzLl9kYXRhLmFjdGlvbnMuc2l6ZSA9IG10KHQpLCB0aGlzLnNldFJhdGlvKHRoaXMuX29wdGlvbnMuZm9yY2VTaXplLndpZHRoICsgXCI6XCIgKyB0aGlzLl9vcHRpb25zLmZvcmNlU2l6ZS5oZWlnaHQsIGUpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwic2V0UmF0aW9cIiwgdmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBcInN0cmluZ1wiID09IHR5cGVvZiB0ICYmICh0aGlzLl9vcHRpb25zLnJhdGlvID0gdCwgdGhpcy5faXNGaXhlZFJhdGlvKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB6dCh0aGlzLl9vcHRpb25zLnJhdGlvLCBcIjpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmF0aW8gPSBuWzFdIC8gblswXSwgdGhpcy5fZGF0YS5pbnB1dC5pbWFnZSAmJiBlID8gdGhpcy5fY3JvcEF1dG8oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5fc2NhbGVEcm9wQXJlYShpLl9yYXRpbyksIGUgJiYgZSh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogKHRoaXMuX2RhdGEuaW5wdXQuaW1hZ2UgJiYgKHRoaXMuX2RhdGEuYWN0aW9ucy5jcm9wID0gdHQodGhpcy5fZGF0YS5pbnB1dC5pbWFnZS53aWR0aCwgdGhpcy5fZGF0YS5pbnB1dC5pbWFnZS5oZWlnaHQsIHRoaXMuX3JhdGlvKSwgdGhpcy5fZGF0YS5hY3Rpb25zLmNyb3AudHlwZSA9IEF0LkFVVE8pLCB0aGlzLl9zY2FsZURyb3BBcmVhKHRoaXMuX3JhdGlvKSwgZSAmJiBlKG51bGwpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiaXNBdHRhY2hlZFRvXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQgPT09IHQgfHwgdGhpcy5fb3JpZ2luYWxFbGVtZW50ID09PSB0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiaXNEZXRhY2hlZFwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT09IHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwibG9hZFwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSBlID8gYXJndW1lbnRzWzFdIDoge30sIG4gPSBhcmd1bWVudHNbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGkgPyBuID0gaSA6ICh0aGlzLl9vcHRpb25zLmNyb3AgPSBpLmNyb3AsIHRoaXMuX29wdGlvbnMucm90YXRpb24gPSBpLnJvdGF0aW9uLCB0aGlzLl9pbml0aWFsUm90YXRpb24gPSBpLnJvdGF0aW9uICYmIGkucm90YXRpb24gJSA5MCA9PT0gMCA/IGkucm90YXRpb24gOiBudWxsLCB0aGlzLl9pbml0aWFsQ3JvcCA9IHRoaXMuX29wdGlvbnMuY3JvcCksIHRoaXMuX2xvYWQodCwgbiwge2Jsb2NrUHVzaDogaS5ibG9ja1B1c2h9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwidXBsb2FkXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZG9VcGxvYWQodClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcImRvd25sb2FkXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kb0Rvd25sb2FkKClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcInJlbW92ZVwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RvUmVtb3ZlKClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcImRlc3Ryb3lcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RvRGVzdHJveSgpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJlZGl0XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kb0VkaXQoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiY3JvcFwiLCB2YWx1ZTogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Nyb3AodC54LCB0LnksIHQud2lkdGgsIHQuaGVpZ2h0LCBlKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiY29udGFpbnNJbWFnZVwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IHRoaXMuX2RhdGEuaW5wdXQubmFtZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2Nhbkluc3RhbnRFZGl0XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucy5pbnN0YW50RWRpdCAmJiAhdGhpcy5faXNJbml0aWFsaXNpbmdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9nZXRGaWxlSW5wdXRcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFt0eXBlPWZpbGVdXCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfZ2V0SW5pdGlhbEltYWdlXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiaW1nXCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfZ2V0SW5wdXRFbGVtZW50XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RmlsZUlucHV0KCkgfHwgdGhpcy5fZ2V0SW5pdGlhbEltYWdlKClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9nZXRSYXRpb1NwYWNlckVsZW1lbnRcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNoaWxkcmVuWzBdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfaXNJbWFnZU9ubHlcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIklOUFVUXCIgIT09IHRoaXMuX2lucHV0Lm5vZGVOYW1lXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfaXNGaXhlZFJhdGlvXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucy5yYXRpby5pbmRleE9mKFwiOlwiKSAhPT0gLTFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9pc0F1dG9Dcm9wXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5hY3Rpb25zLmNyb3AudHlwZSA9PT0gQXQuQVVUT1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3RvZ2dsZUJ1dHRvblwiLCB2YWx1ZTogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHh0KCcuc2xpbS1idG5bZGF0YS1hY3Rpb249XCInICsgdCArICdcIl0nLCBlLCB0aGlzLl9lbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2NsZWFyU3RhdGVcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gW10sIHRoaXMuX3VwZGF0ZVN0YXRlKClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9yZW1vdmVTdGF0ZVwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gdGhpcy5fc3RhdGUuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgIT09IHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl91cGRhdGVTdGF0ZSgpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfYWRkU3RhdGVcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMKHQsIHRoaXMuX3N0YXRlKSB8fCAodGhpcy5fc3RhdGUucHVzaCh0KSwgdGhpcy5fdXBkYXRlU3RhdGUoKSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl91cGRhdGVTdGF0ZVwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudCAmJiB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtc3RhdGVcIiwgdGhpcy5fc3RhdGUuam9pbihcIixcIikpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfcmVzZXREYXRhXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhOiBtdCh0aGlzLl9vcHRpb25zLm1ldGEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiB7ZmllbGQ6IHRoaXMuX2lucHV0UmVmZXJlbmNlLCBuYW1lOiBudWxsLCB0eXBlOiBudWxsLCB3aWR0aDogMCwgaGVpZ2h0OiAwLCBmaWxlOiBudWxsfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IHtpbWFnZTogbnVsbCwgd2lkdGg6IDAsIGhlaWdodDogMH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uczoge3JvdGF0aW9uOiBudWxsLCBjcm9wOiBudWxsLCBzaXplOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5fb3V0cHV0ICYmICh0aGlzLl9vdXRwdXQudmFsdWUgPSBcIlwiKSwgX3QodGhpcy5fZ2V0RmlsZUlucHV0KCkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfaW5pdFwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGlzaW5nID0gITAsIHRoaXMuX2FkZFN0YXRlKFwiZW1wdHlcIiksIEwoXCJpbnB1dFwiLCB0aGlzLl9vcHRpb25zLnBvc3QpICYmICh0aGlzLl9pbnB1dFJlZmVyZW5jZSA9IFwic2xpbV9pbnB1dF9cIiArIHRoaXMuX3VpZCksIHRoaXMuX2lucHV0ID0gdGhpcy5fZ2V0SW5wdXRFbGVtZW50KCksIHRoaXMuX2lucHV0IHx8ICh0aGlzLl9pbnB1dCA9IGsoXCJpbnB1dFwiKSwgdGhpcy5faW5wdXQudHlwZSA9IFwiZmlsZVwiLCB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2lucHV0KSksIHRoaXMuX2lzUmVxdWlyZWQgPSB0aGlzLl9pbnB1dC5yZXF1aXJlZCA9PT0gITAsIHRoaXMuX291dHB1dCA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihcImlucHV0W3R5cGU9aGlkZGVuXVwiKSwgdGhpcy5fb3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBKU09OLnBhcnNlKHRoaXMuX291dHB1dC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbmV3IEltYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnNyYyA9IGUub3V0cHV0LmltYWdlLCBuLnNldEF0dHJpYnV0ZShcImRhdGEtZmlsZW5hbWVcIiwgZS5vdXRwdXQubmFtZSksIHRoaXMuX2VsZW1lbnQuaW5zZXJ0QmVmb3JlKG4sIHRoaXMuX2VsZW1lbnQuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgdGhpcy5fb3V0cHV0ID0gayhcImlucHV0XCIpLCB0aGlzLl9vdXRwdXQudHlwZSA9IFwiaGlkZGVuXCIsIHRoaXMuX291dHB1dC5uYW1lID0gdGhpcy5faW5wdXQubmFtZSB8fCB0aGlzLl9vcHRpb25zLmRlZmF1bHRJbnB1dE5hbWUsIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fb3V0cHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0LnJlbW92ZUF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGsoXCJkaXZcIiwgXCJzbGltLWFyZWFcIiksIGEgPSB0aGlzLl9nZXRJbml0aWFsSW1hZ2UoKSwgciA9IChhIHx8IHt9KS5zcmMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGEgPyBhLmdldEF0dHJpYnV0ZShcImRhdGEtZmlsZW5hbWVcIikgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgciA/IHRoaXMuX2hhc0luaXRpYWxJbWFnZSA9ICEwIDogKHRoaXMuX2luaXRpYWxDcm9wID0gbnVsbCwgdGhpcy5faW5pdGlhbFJvdGF0aW9uID0gbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9ICdcXG5cXHRcXHQ8ZGl2IGNsYXNzPVwic2xpbS1yZXN1bHRcIj5cXG5cXHRcXHRcXHQ8aW1nIGNsYXNzPVwiaW5cIiBzdHlsZT1cIm9wYWNpdHk6MFwiICcgKyAociA/ICdzcmM9XCInICsgciArICdcIicgOiBcIlwiKSArICc+PGltZz48aW1nIHN0eWxlPVwib3BhY2l0eTowXCI+XFxuXFx0XFx0PC9kaXY+JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc0ltYWdlT25seSgpKSBvLmlubmVySFRNTCA9IFwiXFxuXFx0XFx0XFx0XFx0XCIgKyBxdCArIFwiXFxuXFx0XFx0XFx0XFx0XCIgKyBqdCArIFwiXFxuXFx0XFx0XFx0XFx0XCIgKyBoICsgJ1xcblxcdFxcdFxcdFxcdDxkaXYgY2xhc3M9XCJzbGltLXN0YXR1c1wiPjxkaXYgY2xhc3M9XCJzbGltLWxhYmVsLWxvYWRpbmdcIj4nICsgKHRoaXMuX29wdGlvbnMubGFiZWxMb2FkaW5nIHx8IFwiXCIpICsgXCI8L2Rpdj48L2Rpdj5cXG5cXHRcXHRcXHRcIjsgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTChcImlucHV0XCIsIHRoaXMuX29wdGlvbnMucG9zdCkgJiYgKHRoaXMuX2RhdGEuaW5wdXQuZmllbGQgPSB0aGlzLl9pbnB1dFJlZmVyZW5jZSwgdGhpcy5fb3B0aW9ucy5zZXJ2aWNlIHx8ICh0aGlzLl9pbnB1dC5uYW1lID0gdGhpcy5faW5wdXRSZWZlcmVuY2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dC5oYXNBdHRyaWJ1dGUoXCJhY2NlcHRcIikgJiYgXCJpbWFnZS8qXCIgIT09IHRoaXMuX2lucHV0LmdldEF0dHJpYnV0ZShcImFjY2VwdFwiKSA/IHUgPSB0aGlzLl9pbnB1dC5hY2NlcHQuc3BsaXQoXCIsXCIpLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC50cmltKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogKHUgPSBBKCksIHRoaXMuX2lucHV0LnNldEF0dHJpYnV0ZShcImFjY2VwdFwiLCB1LmpvaW4oXCIsXCIpKSksIHRoaXMuX2ltYWdlSG9wcGVyID0gbmV3IEx0LCB0aGlzLl9pbWFnZUhvcHBlci5hY2NlcHQgPSB1LCB0aGlzLl9pbWFnZUhvcHBlci5hbGxvd1VSTHMgPSBcInN0cmluZ1wiID09IHR5cGVvZiB0aGlzLl9vcHRpb25zLmZldGNoZXIsIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5faW1hZ2VIb3BwZXIuZWxlbWVudCksIEh0LmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5faW1hZ2VIb3BwZXIuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGUsIHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG8uaW5uZXJIVE1MID0gXCJcXG5cXHRcXHRcXHRcXHRcIiArIHF0ICsgXCJcXG5cXHRcXHRcXHRcXHRcIiArIGp0ICsgJ1xcblxcdFxcdFxcdFxcdDxkaXYgY2xhc3M9XCJzbGltLWRyaXBcIj48c3Bhbj48c3Bhbj48L3NwYW4+PC9zcGFuPjwvZGl2PlxcblxcdFxcdFxcdFxcdDxkaXYgY2xhc3M9XCJzbGltLXN0YXR1c1wiPjxkaXYgY2xhc3M9XCJzbGltLWxhYmVsXCI+JyArICh0aGlzLl9vcHRpb25zLmxhYmVsIHx8IFwiXCIpICsgJzwvZGl2PjxkaXYgY2xhc3M9XCJzbGltLWxhYmVsLWxvYWRpbmdcIj4nICsgKHRoaXMuX29wdGlvbnMubGFiZWxMb2FkaW5nIHx8IFwiXCIpICsgXCI8L2Rpdj48L2Rpdj5cXG5cXHRcXHRcXHRcXHRcIiArIGggKyBcIlxcblxcdFxcdFxcdFwiLCB0aGlzLl9pbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZChvKSwgdGhpcy5fYnRuR3JvdXAgPSBrKFwiZGl2XCIsIFwic2xpbS1idG4tZ3JvdXBcIiksIHRoaXMuX2J0bkdyb3VwLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIiwgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9idG5Hcm91cCksIEJ0LmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Ll9pc0J1dHRvbkFsbG93ZWQoZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IFIoZSksIG4gPSB0Ll9vcHRpb25zW1wiYnV0dG9uXCIgKyBpICsgXCJMYWJlbFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IHQuX29wdGlvbnNbXCJidXR0b25cIiArIGkgKyBcIlRpdGxlXCJdIHx8IG4sIGEgPSB0Ll9vcHRpb25zW1wiYnV0dG9uXCIgKyBpICsgXCJDbGFzc05hbWVcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBrKFwiYnV0dG9uXCIsIFwic2xpbS1idG4gc2xpbS1idG4tXCIgKyBlICsgKGEgPyBcIiBcIiArIGEgOiBcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5pbm5lckhUTUwgPSBuLCByLnRpdGxlID0gbywgci50eXBlID0gXCJidXR0b25cIiwgci5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdCksIHIuc2V0QXR0cmlidXRlKFwiZGF0YS1hY3Rpb25cIiwgZSksIHQuX2J0bkdyb3VwLmFwcGVuZENoaWxkKHIpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5faXNGaXhlZFJhdGlvKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IHp0KHRoaXMuX29wdGlvbnMucmF0aW8sIFwiOlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yYXRpbyA9IGxbMV0gLyBsWzBdLCB0aGlzLl9zY2FsZURyb3BBcmVhKHRoaXMuX3JhdGlvKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlUHJvZ3Jlc3MoLjUpLCByID8gdGhpcy5fbG9hZChyLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fb25Jbml0KClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHtuYW1lOiBzfSkgOiB0aGlzLl9vbkluaXQoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uSW5pdFwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXNpbmcgPSAhMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX29wdGlvbnMuZGlkSW5pdC5hcHBseSh0LCBbdC5kYXRhLCB0XSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll90aW1lcnMucHVzaChlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuc2F2ZUluaXRpYWxJbWFnZSAmJiB0aGlzLmNvbnRhaW5zSW1hZ2UoKSA/IHRoaXMuX29wdGlvbnMuc2VydmljZSB8fCB0aGlzLl9zYXZlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sICExKSA6ICh0aGlzLl9vcHRpb25zLnNlcnZpY2UgJiYgdGhpcy5jb250YWluc0ltYWdlKCkgJiYgdGhpcy5fdG9nZ2xlQnV0dG9uKFwidXBsb2FkXCIsICExKSwgZSgpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3VwZGF0ZVByb2dyZXNzXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPSBNYXRoLm1pbiguOTk5OTksIHQpLCB0aGlzLl9lbGVtZW50ICYmIHRoaXMuX3Byb2dyZXNzRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLnNsaW0tbG9hZGVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZS5vZmZzZXRXaWR0aCwgbiA9IGUucXVlcnlTZWxlY3RvckFsbChcInBhdGhcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gcGFyc2VJbnQoblswXS5nZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiksIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblswXS5zZXRBdHRyaWJ1dGUoXCJkXCIsIFJ0KC41ICogaSwgLjUgKiBpLCAuNSAqIGkgLSBvLCAuOTk5OSkpLCBuWzFdLnNldEF0dHJpYnV0ZShcImRcIiwgUnQoLjUgKiBpLCAuNSAqIGksIC41ICogaSAtIG8sIHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9zdGFydFByb2dyZXNzXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzc0VuYWJsZWQgPSAhMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zbGltLWxvYWRlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGkuY2hpbGRyZW5bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0b3BQcm9ncmVzc0xvb3AoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5yZW1vdmVBdHRyaWJ1dGUoXCJzdHlsZVwiKSwgbi5yZW1vdmVBdHRyaWJ1dGUoXCJzdHlsZVwiKSwgZS5fcHJvZ3Jlc3NFbmFibGVkID0gITAsIGUuX3VwZGF0ZVByb2dyZXNzKDApLCBlLl9wcm9ncmVzc0VuYWJsZWQgPSAhMSwgdShuLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wYWNpdHk6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMjUwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX3Byb2dyZXNzRW5hYmxlZCA9ICEwLCB0ICYmIHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3N0b3BQcm9ncmVzc1wiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zbGltLWxvYWRlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGUuY2hpbGRyZW5bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVByb2dyZXNzKDEpLCB1KGksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21PcGFjaXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAyNTAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVtb3ZlQXR0cmlidXRlKFwic3R5bGVcIiksIGkucmVtb3ZlQXR0cmlidXRlKFwic3R5bGVcIiksIHQuX3VwZGF0ZVByb2dyZXNzKC41KSwgdC5fcHJvZ3Jlc3NFbmFibGVkID0gITFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfc3RhcnRQcm9ncmVzc0xvb3BcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc2xpbS1sb2FkZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0LmNoaWxkcmVuWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpLCBlLnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpLCB0aGlzLl91cGRhdGVQcm9ncmVzcyguNSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gMWUzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KHQsIFwic3RvcFwiKSwgdSh0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbjogWzAsIDAsIC0oMiAqIE1hdGguUEkpICogaV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXNpbmc6IFwibGluZWFyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMWUzICogaVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdShlLCB7ZnJvbU9wYWNpdHk6IDAsIG9wYWNpdHk6IDEsIGR1cmF0aW9uOiAyNTB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9zdG9wUHJvZ3Jlc3NMb29wXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zbGltLWxvYWRlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGUuY2hpbGRyZW5bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUoaSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wYWNpdHk6IHBhcnNlRmxvYXQoaS5zdHlsZS5vcGFjaXR5KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMjUwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KGUsIFwic3RvcFwiKSwgZS5yZW1vdmVBdHRyaWJ1dGUoXCJzdHlsZVwiKSwgaS5yZW1vdmVBdHRyaWJ1dGUoXCJzdHlsZVwiKSwgdCAmJiB0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfaXNCdXR0b25BbGxvd2VkXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZWRpdFwiID09PSB0ID8gdGhpcy5fb3B0aW9ucy5lZGl0IDogXCJkb3dubG9hZFwiID09PSB0ID8gdGhpcy5fb3B0aW9ucy5kb3dubG9hZCA6IFwidXBsb2FkXCIgPT09IHQgPyAhIXRoaXMuX29wdGlvbnMuc2VydmljZSAmJiAhdGhpcy5fb3B0aW9ucy5wdXNoIDogXCJyZW1vdmVcIiAhPT0gdCB8fCAhdGhpcy5faXNJbWFnZU9ubHkoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2ZhbGxiYWNrXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGsoXCJkaXZcIiwgXCJzbGltLWFyZWFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0LmlubmVySFRNTCA9ICdcXG5cXHRcXHRcXHQ8ZGl2IGNsYXNzPVwic2xpbS1zdGF0dXNcIj48ZGl2IGNsYXNzPVwic2xpbS1sYWJlbFwiPicgKyAodGhpcy5fb3B0aW9ucy5sYWJlbCB8fCBcIlwiKSArIFwiPC9kaXY+PC9kaXY+XFxuXFx0XFx0XCIsIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodCksIHRoaXMuX3Rocm93RXJyb3IodGhpcy5fb3B0aW9ucy5zdGF0dXNOb1N1cHBvcnQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJoYW5kbGVFdmVudFwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiY2xpY2tcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DbGljayh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiY2hhbmdlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJjYW5jZWxcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DYW5jZWwodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcImNvbmZpcm1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25Db25maXJtKHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJmaWxlLW92ZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25GaWxlT3Zlcih0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiZmlsZS1vdXRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25GaWxlT3V0KHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJmaWxlLWRyb3BcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25Ecm9wRmlsZSh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiZmlsZS1pbnZhbGlkXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uSW52YWxpZEZpbGUodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcImZpbGUtaW52YWxpZC1kcm9wXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uSW52YWxpZEZpbGVEcm9wKHQpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfZ2V0SW50cm9cIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc2xpbS1yZXN1bHQgLmluXCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfZ2V0T3V0cm9cIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc2xpbS1yZXN1bHQgLm91dFwiKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2dldEluT3V0XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLnNsaW0tcmVzdWx0IGltZ1wiKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2dldERyaXBcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kcmlwIHx8ICh0aGlzLl9kcmlwID0gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLnNsaW0tZHJpcCA+IHNwYW5cIikpLCB0aGlzLl9kcmlwXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfdGhyb3dFcnJvclwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZFN0YXRlKFwiZXJyb3JcIiksIHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zbGltLWxhYmVsXCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLnNsaW0tZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBlIHx8IChlID0gayhcImRpdlwiLCBcInNsaW0tZXJyb3JcIiksIHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zbGltLXN0YXR1c1wiKS5hcHBlbmRDaGlsZChlKSksIGUuaW5uZXJIVE1MID0gdCwgdGhpcy5fb3B0aW9ucy5kaWRUaHJvd0Vycm9yLmFwcGx5KHRoaXMsIFt0XSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9yZW1vdmVFcnJvclwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlU3RhdGUoXCJlcnJvclwiKSwgdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLnNsaW0tbGFiZWxcIikuc3R5bGUuZGlzcGxheSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zbGltLWVycm9yXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vcGVuRmlsZURpYWxvZ1wiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlRXJyb3IoKSwgdGhpcy5faW5wdXQuY2xpY2soKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uQ2xpY2tcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMsIGkgPSB0LnRhcmdldC5jbGFzc0xpc3QsIG4gPSB0LnRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLmNvbnRhaW5zKFwic2xpbS1maWxlLWhvcHBlclwiKSkgcmV0dXJuIHQucHJldmVudERlZmF1bHQoKSwgdm9pZCB0aGlzLl9vcGVuRmlsZURpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuLmdldEF0dHJpYnV0ZShcImRhdGEtYWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwicmVtb3ZlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMud2lsbFJlbW92ZS5hcHBseSh0aGlzLCBbdGhpcy5kYXRhLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9kb1JlbW92ZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiZWRpdFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kb0VkaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiZG93bmxvYWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZG9Eb3dubG9hZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJ1cGxvYWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZG9VcGxvYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uSW52YWxpZEZpbGVEcm9wXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkludmFsaWRGaWxlKCksIHRoaXMuX3JlbW92ZVN0YXRlKFwiZmlsZS1vdmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLl9nZXREcmlwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1KHQuZmlyc3RDaGlsZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21TY2FsZTogWy41LCAuNV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IFswLCAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tT3BhY2l0eTogLjUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMTUwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHoodC5maXJzdENoaWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfb25JbnZhbGlkRmlsZVwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLl9pbWFnZUhvcHBlci5hY2NlcHQubWFwKEgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0aGlzLl9vcHRpb25zLnN0YXR1c0ZpbGVUeXBlLnJlcGxhY2UoXCIkMFwiLCB0LmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90aHJvd0Vycm9yKGUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfb25JbWFnZVRvb1NtYWxsXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX29wdGlvbnMuc3RhdHVzSW1hZ2VUb29TbWFsbC5yZXBsYWNlKFwiJDBcIiwgdGhpcy5fb3B0aW9ucy5taW5TaXplLndpZHRoICsgXCIgw5cgXCIgKyB0aGlzLl9vcHRpb25zLm1pblNpemUuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rocm93RXJyb3IodClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbk92ZXJXZWlnaHRGaWxlXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX29wdGlvbnMuc3RhdHVzRmlsZVNpemUucmVwbGFjZShcIiQwXCIsIHRoaXMuX29wdGlvbnMubWF4RmlsZVNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGhyb3dFcnJvcih0KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uTG9jYWxVUkxQcm9ibGVtXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGhyb3dFcnJvcih0aGlzLl9vcHRpb25zLnN0YXR1c0xvY2FsVXJsUHJvYmxlbSB8fCB0KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uUmVtb3RlVVJMUHJvYmxlbVwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rocm93RXJyb3IodClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbkZpbGVPdmVyXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkU3RhdGUoXCJmaWxlLW92ZXJcIiksIHRoaXMuX3JlbW92ZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuX2dldERyaXAoKSwgaSA9IHUuY3JlYXRlTWF0cml4KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpLnRyYW5zbGF0ZSh0LmRldGFpbC54LCB0LmRldGFpbC55LCAwKSwgdS5zZXRFbGVtZW50VHJhbnNmb3JtKGUsIGkpLCAxID09IHRoaXMuX2ltYWdlSG9wcGVyLmRyYWdQYXRoLmxlbmd0aCAmJiAoZS5zdHlsZS5vcGFjaXR5ID0gMSwgdShlLmZpcnN0Q2hpbGQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tT3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAuNSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tU2NhbGU6IFswLCAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZTogWy41LCAuNV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDE1MFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfb25GaWxlT3V0XCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlU3RhdGUoXCJmaWxlLW92ZXJcIiksIHRoaXMuX3JlbW92ZVN0YXRlKFwiZmlsZS1pbnZhbGlkXCIpLCB0aGlzLl9yZW1vdmVFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLl9nZXREcmlwKCksIGkgPSB1LmNyZWF0ZU1hdHJpeCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaS50cmFuc2xhdGUodC5kZXRhaWwueCwgdC5kZXRhaWwueSwgMCksIHUuc2V0RWxlbWVudFRyYW5zZm9ybShlLCBpKSwgdShlLmZpcnN0Q2hpbGQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tU2NhbGU6IFsuNSwgLjVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiBbMCwgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wYWNpdHk6IC41LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDE1MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6KGUuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uRHJvcEZpbGVcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVTdGF0ZShcImZpbGUtb3ZlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5fZ2V0RHJpcCgpLCBuID0gdS5jcmVhdGVNYXRyaXgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG4udHJhbnNsYXRlKHQuZGV0YWlsLngsIHQuZGV0YWlsLnksIDApLCB1LnNldEVsZW1lbnRUcmFuc2Zvcm0oaSwgbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHRoaXMuX2ltYWdlSG9wcGVyLmRyYWdQYXRoLmxlbmd0aCwgYSA9IHRoaXMuX2ltYWdlSG9wcGVyLmRyYWdQYXRoW28gLSBNYXRoLm1pbigxMCwgbyldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB0LmRldGFpbC54IC0gYS54LCBzID0gdC5kZXRhaWwueSAtIGEueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHUoaSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21Qb3NpdGlvbjogW3QuZGV0YWlsLngsIHQuZGV0YWlsLnksIDBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBbdC5kZXRhaWwueCArIHIsIHQuZGV0YWlsLnkgKyBzLCAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMjAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSwgdShpLmZpcnN0Q2hpbGQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tU2NhbGU6IFsuNSwgLjVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiBbMiwgMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wYWNpdHk6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMjAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHooaS5maXJzdENoaWxkKSwgZS5fbG9hZCh0LnRhcmdldC5maWxlc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uQ2hhbmdlXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdC50YXJnZXQuZmlsZXMubGVuZ3RoICYmIHRoaXMuX2xvYWQodC50YXJnZXQuZmlsZXNbMF0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfbG9hZFwiLCB2YWx1ZTogZnVuY3Rpb24gKHQsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpcywgbyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gZSA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0JlaW5nRGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGFpbnNJbWFnZSgpKSByZXR1cm4gY2xlYXJUaW1lb3V0KHRoaXMuX3JlcGxhY2VUaW1lb3V0KSwgdm9pZCB0aGlzLl9kb1JlbW92ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uX3JlcGxhY2VUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLl9sb2FkKHQsIGksIG8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVTdGF0ZShcImVtcHR5XCIpLCB0aGlzLl9hZGRTdGF0ZShcImJ1c3lcIiksIHRoaXMuX3N0YXJ0UHJvZ3Jlc3NMb29wKCksIHRoaXMuX2ltYWdlSG9wcGVyICYmICh0aGlzLl9pbWFnZUhvcHBlci5lbmFibGVkID0gITEpLCBjbGVhclRpbWVvdXQodGhpcy5fbG9hZFRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQobi5fbG9hZFRpbWVvdXQpLCBuLl9sb2FkVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5faXNCZWluZ0Rlc3Ryb3llZCB8fCAobi5fYWRkU3RhdGUoXCJsb2FkaW5nXCIpLCB1KG4uX2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zbGltLWxhYmVsLWxvYWRpbmdcIiksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tT3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAyNTBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCA1MDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5faW1hZ2VIb3BwZXIgJiYgKG4uX2ltYWdlSG9wcGVyLmVuYWJsZWQgPSAhMCksIG4uX3JlbW92ZVN0YXRlKFwibG9hZGluZ1wiKSwgbi5fcmVtb3ZlU3RhdGUoXCJidXN5XCIpLCBuLl9hZGRTdGF0ZShcImVtcHR5XCIpLCBuLl9zdG9wUHJvZ3Jlc3NMb29wKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiB0KSByZXR1cm4gdm9pZChYKHQpID8gdGhpcy5fbG9hZChaKHQpLCBpLCBvKSA6IChhKCksIEoodCwgdGhpcy5fb3B0aW9ucy53aWxsTG9hZCwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5fbG9hZCh0LCBpLCBvKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcigpLCBuLl9vbkxvY2FsVVJMUHJvYmxlbShcIjxwPlwiICsgdCArIFwiPC9wPlwiKSwgaSAmJiBpLmFwcGx5KG4sIFtcImxvY2FsLXVybC1wcm9ibGVtXCJdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCA1MDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgdC5yZW1vdGUpIHJldHVybiBYKHQucmVtb3RlKSA/IHZvaWQgdGhpcy5fbG9hZChaKHQucmVtb3RlKSwgaSwgbykgOiB2b2lkKHRoaXMuX29wdGlvbnMuZmV0Y2hlciAmJiBZKHRoaXMuX29wdGlvbnMuZmV0Y2hlciwgdGhpcy5fb3B0aW9ucy53aWxsRmV0Y2gsIHRoaXMuX29wdGlvbnMud2lsbExvYWQsIHQucmVtb3RlLCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKCksIG4uX29uUmVtb3RlVVJMUHJvYmxlbShcIjxwPlwiICsgdCArIFwiPC9wPlwiKSwgaSAmJiBpLmFwcGx5KG4sIFtcInJlbW90ZS11cmwtcHJvYmxlbVwiXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLl9sb2FkKHQsIGksIG8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faW1hZ2VIb3BwZXIgJiYgdGhpcy5faW1hZ2VIb3BwZXIuYWNjZXB0LmluZGV4T2Yocy50eXBlKSA9PT0gLTEpIHJldHVybiByKCksIHRoaXMuX29uSW52YWxpZEZpbGUoKSwgdm9pZChpICYmIGkuYXBwbHkodGhpcywgW1wiZmlsZS1pbnZhbGlkXCJdKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuc2l6ZSAmJiB0aGlzLl9vcHRpb25zLm1heEZpbGVTaXplICYmIEQocy5zaXplKSA+IHRoaXMuX29wdGlvbnMubWF4RmlsZVNpemUpIHJldHVybiByKCksIHRoaXMuX29uT3ZlcldlaWdodEZpbGUoKSwgdm9pZChpICYmIGkuYXBwbHkodGhpcywgW1wiZmlsZS10b28tYmlnXCJdKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW1hZ2VFZGl0b3IgJiYgdGhpcy5faW1hZ2VFZGl0b3IuZGlydHkoKSwgdGhpcy5fZGF0YS5pbnB1dC5uYW1lID0gbyAmJiBvLm5hbWUgPyBvLm5hbWUgOiBxKHMpLCB0aGlzLl9kYXRhLmlucHV0LnR5cGUgPSBqKHMpLCB0aGlzLl9kYXRhLmlucHV0LnNpemUgPSBzLnNpemUsIHRoaXMuX2RhdGEuaW5wdXQuZmlsZSA9IHMsIFEocywgdGhpcy5fb3B0aW9ucy5pbnRlcm5hbENhbnZhc1NpemUsIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5faW1hZ2VIb3BwZXIgJiYgKG4uX2ltYWdlSG9wcGVyLmVuYWJsZWQgPSAhMCksIG4uX3JlbW92ZVN0YXRlKFwibG9hZGluZ1wiKSwgbi5fcmVtb3ZlU3RhdGUoXCJidXN5XCIpLCBuLl9hZGRTdGF0ZShcImVtcHR5XCIpLCBuLl9zdG9wUHJvZ3Jlc3NMb29wKCksIG4uX3Jlc2V0RGF0YSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdCkgcmV0dXJuIGEoKSwgdm9pZChpICYmIGkuYXBwbHkobiwgW1wiZmlsZS1ub3QtZm91bmRcIl0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdCh0LCBuLl9vcHRpb25zLm1pblNpemUpKSByZXR1cm4gYSgpLCBuLl9vbkltYWdlVG9vU21hbGwoKSwgdm9pZChpICYmIGkuYXBwbHkobiwgW1wiaW1hZ2UtdG9vLXNtYWxsXCJdKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbi5fb3B0aW9ucy5kaWRMb2FkLmFwcGx5KG4sIFtzLCB0LCBlLCBuXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyICE9PSAhMCkgcmV0dXJuIGEoKSwgciAhPT0gITEgJiYgbi5fdGhyb3dFcnJvcihyKSwgdm9pZChpICYmIGkuYXBwbHkobiwgW3JdKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uX3JlbW92ZVN0YXRlKFwibG9hZGluZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5faW1hZ2VIb3BwZXIgJiYgbi5fb3B0aW9ucy5kcm9wUmVwbGFjZSAmJiAobi5faW1hZ2VIb3BwZXIuZW5hYmxlZCA9ICEwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbi5fZ2V0SW50cm8oKSwgaSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tU2NhbGU6IFsxLjI1LCAxLjI1XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZTogWzEsIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21PcGFjaXR5OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeihlKSwgZS5zdHlsZS5vcGFjaXR5ID0gMSwgdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uaXNEZXRhY2hlZCgpID8gaS5kdXJhdGlvbiA9IDEgOiAoaS5lYXNpbmcgPSBcInNwcmluZ1wiLCBpLnNwcmluZ0NvbnN0YW50ID0gLjMsIGkuc3ByaW5nRGVjZWxlcmF0aW9uID0gLjcpLCBuLl9jYW5JbnN0YW50RWRpdCgpICYmIChpLmRlbGF5ID0gNTAwLCBpLmR1cmF0aW9uID0gMSwgbi5fZG9FZGl0KCkpLCB1KGUsIGkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uX2xvYWRDYW52YXModCwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uX2FkZFN0YXRlKFwicHJldmlld1wiKSwgaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5fY2FuSW5zdGFudEVkaXQoKSB8fCB0IHx8IG4uX3Nob3dCdXR0b25zKCksIHQgfHwgKG4uX3N0b3BQcm9ncmVzc0xvb3AoKSwgbi5fcmVtb3ZlU3RhdGUoXCJidXN5XCIpKSwgaSAmJiBpLmFwcGx5KG4sIFtudWxsLCBuLmRhdGFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5fY2FuSW5zdGFudEVkaXQoKSB8fCBuLl9zaG93QnV0dG9ucygpLCBuLl9yZW1vdmVTdGF0ZShcImJ1c3lcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge2Jsb2NrUHVzaDogby5ibG9ja1B1c2h9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfbG9hZENhbnZhc1wiLCB2YWx1ZTogZnVuY3Rpb24gKHQsIGUsIGksIG4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuIHx8IChuID0ge30pLCAhdGhpcy5faXNCZWluZ0Rlc3Ryb3llZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGEuaW5wdXQuaW1hZ2UgPSB0LCB0aGlzLl9kYXRhLmlucHV0LndpZHRoID0gdC53aWR0aCwgdGhpcy5fZGF0YS5pbnB1dC5oZWlnaHQgPSB0LmhlaWdodCwgdGhpcy5faW5pdGlhbFJvdGF0aW9uICYmICh0aGlzLl9kYXRhLmFjdGlvbnMucm90YXRpb24gPSB0aGlzLl9pbml0aWFsUm90YXRpb24sIHRoaXMuX2luaXRpYWxSb3RhdGlvbiA9IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdGhpcy5fZGF0YS5hY3Rpb25zLnJvdGF0aW9uICUgMTgwICE9PSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzRml4ZWRSYXRpbygpIHx8ICh0aGlzLl9pbml0aWFsQ3JvcCA/IHRoaXMuX3JhdGlvID0gdGhpcy5faW5pdGlhbENyb3AuaGVpZ2h0IC8gdGhpcy5faW5pdGlhbENyb3Aud2lkdGggOiB0aGlzLl9yYXRpbyA9IGEgPyB0LndpZHRoIC8gdC5oZWlnaHQgOiB0LmhlaWdodCAvIHQud2lkdGgsIHRoaXMuX3NjYWxlRHJvcEFyZWEodGhpcy5fcmF0aW8pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5fb3B0aW9ucy5zaXplICYmIChvLl9kYXRhLmFjdGlvbnMuc2l6ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBvLl9vcHRpb25zLnNpemUud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IG8uX29wdGlvbnMuc2l6ZS5oZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG8uX2FwcGx5VHJhbnNmb3Jtcyh0LCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBvLl9nZXRJbnRybygpLCByID0gYS5vZmZzZXRXaWR0aCAvIHQud2lkdGgsIHMgPSAhMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uX29wdGlvbnMuc2VydmljZSAmJiBvLl9vcHRpb25zLnB1c2ggJiYgIW4uYmxvY2tQdXNoICYmIChvLl9oYXNJbml0aWFsSW1hZ2UgfHwgby5fY2FuSW5zdGFudEVkaXQoKSB8fCAocyA9ICEwLCBvLl9zdG9wUHJvZ3Jlc3NMb29wKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLl9zdGFydFByb2dyZXNzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5fdXBkYXRlUHJvZ3Jlc3MoLjEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSksIG8uX2Nhbkluc3RhbnRFZGl0KCkgfHwgby5fc2F2ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5faXNCZWluZ0Rlc3Ryb3llZCB8fCBzICYmIChvLl9zdG9wUHJvZ3Jlc3MoKSwgaSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IFwiYXV0b1wiID09PSBvLl9vcHRpb25zLmRldmljZVBpeGVsUmF0aW8gPyB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA6IG8uX29wdGlvbnMuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc3JjID0gXCJcIiwgYS5zcmMgPSBodCh0LCByICogaCkudG9EYXRhVVJMKCksIGEub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEub25sb2FkID0gbnVsbCwgby5faXNCZWluZ0Rlc3Ryb3llZCB8fCBlICYmIGUocylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxDcm9wID8gKHRoaXMuX2RhdGEuYWN0aW9ucy5jcm9wID0gbXQodGhpcy5faW5pdGlhbENyb3ApLCB0aGlzLl9kYXRhLmFjdGlvbnMuY3JvcC50eXBlID0gQXQuSU5JVElBTCwgdGhpcy5faW5pdGlhbENyb3AgPSBudWxsLCByKCkpIDogdGhpcy5fb3B0aW9ucy53aWxsQ3JvcEluaXRpYWwuYXBwbHkodGhpcywgW3RoaXMuZGF0YSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA/IChvLl9kYXRhLmFjdGlvbnMuY3JvcCA9IGUsIG8uX2RhdGEuYWN0aW9ucy5jcm9wLnR5cGUgPSBBdC5JTklUSUFMKSA6IChvLl9kYXRhLmFjdGlvbnMuY3JvcCA9IHR0KGEgPyB0LmhlaWdodCA6IHQud2lkdGgsIGEgPyB0LndpZHRoIDogdC5oZWlnaHQsIG8uX3JhdGlvKSwgby5fZGF0YS5hY3Rpb25zLmNyb3AudHlwZSA9IEF0LkFVVE8pLCByKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9hcHBseVRyYW5zZm9ybXNcIiwgdmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMsIG4gPSBtdCh0aGlzLl9kYXRhLmFjdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbi5maWx0ZXJzID0ge3NoYXJwZW46IHRoaXMuX29wdGlvbnMuZmlsdGVyU2hhcnBlbiAvIDEwMH0sIHRoaXMuX29wdGlvbnMuZm9yY2VNaW5TaXplID8gbi5taW5TaXplID0gdGhpcy5fb3B0aW9ucy5taW5TaXplIDogbi5taW5TaXplID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZXQodCwgbiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkuX29wdGlvbnMuZm9yY2VTaXplIHx8IGkuX29wdGlvbnMuc2l6ZSAmJiAxID09IHJ0KGkuX29wdGlvbnMuc2l6ZSwgdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGsoXCJjYW52YXNcIiksIG4ud2lkdGggPSBpLl9vcHRpb25zLnNpemUud2lkdGgsIG4uaGVpZ2h0ID0gaS5fb3B0aW9ucy5zaXplLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBuLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5kcmF3SW1hZ2UodCwgMCwgMCwgaS5fb3B0aW9ucy5zaXplLndpZHRoLCBpLl9vcHRpb25zLnNpemUuaGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS5fb3B0aW9ucy5mb3JjZU1pblNpemUgJiYgaS5fb3B0aW9ucy5zaXplICYmIGkuX29wdGlvbnMubWluU2l6ZS53aWR0aCA9PT0gaS5fb3B0aW9ucy5zaXplLndpZHRoICYmIGkuX29wdGlvbnMubWluU2l6ZS5oZWlnaHQgPT09IGkuX29wdGlvbnMuc2l6ZS5oZWlnaHQgJiYgKG4ud2lkdGggPCBpLl9vcHRpb25zLm1pblNpemUud2lkdGggfHwgbi5oZWlnaHQgPCBpLl9vcHRpb25zLm1pblNpemUuaGVpZ2h0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IE1hdGgubWF4KG4ud2lkdGgsIGkuX29wdGlvbnMubWluU2l6ZS53aWR0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gTWF0aC5tYXgobi5oZWlnaHQsIGkuX29wdGlvbnMubWluU2l6ZS5oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gayhcImNhbnZhc1wiKSwgbi53aWR0aCA9IGEsIG4uaGVpZ2h0ID0gcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBuLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5kcmF3SW1hZ2UodCwgMCwgMCwgYSwgcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkuX29wdGlvbnMuZm9yY2VNaW5TaXplICYmIDEgPT09IGkuX3JhdGlvICYmIChuLndpZHRoIDwgaS5fb3B0aW9ucy5taW5TaXplLndpZHRoIHx8IG4uaGVpZ2h0IDwgaS5fb3B0aW9ucy5taW5TaXplLmhlaWdodCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGsoXCJjYW52YXNcIiksIG4ud2lkdGggPSBpLl9vcHRpb25zLm1pblNpemUud2lkdGgsIG4uaGVpZ2h0ID0gaS5fb3B0aW9ucy5taW5TaXplLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBuLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5kcmF3SW1hZ2UodCwgMCwgMCwgbi53aWR0aCwgbi5oZWlnaHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuX2RhdGEub3V0cHV0LndpZHRoID0gbi53aWR0aCwgaS5fZGF0YS5vdXRwdXQuaGVpZ2h0ID0gbi5oZWlnaHQsIGkuX2RhdGEub3V0cHV0LmltYWdlID0gbiwgaS5fb25UcmFuc2Zvcm1DYW52YXMoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5fZGF0YSA9IHQsIGkuX29wdGlvbnMuZGlkVHJhbnNmb3JtLmFwcGx5KGksIFtpLmRhdGEsIGldKSwgZShpLl9kYXRhLm91dHB1dC5pbWFnZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vblRyYW5zZm9ybUNhbnZhc1wiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMud2lsbFRyYW5zZm9ybS5hcHBseSh0aGlzLCBbdGhpcy5kYXRhLCB0LCB0aGlzXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9hcHBlbmRFZGl0b3JcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ltYWdlRWRpdG9yIHx8ICh0aGlzLl9pbWFnZUVkaXRvciA9IG5ldyBJdChrKFwiZGl2XCIpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluU2l6ZTogdGhpcy5fb3B0aW9ucy5taW5TaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVBpeGVsUmF0aW86IHRoaXMuX29wdGlvbnMuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25Db25maXJtQ2xhc3NOYW1lOiB0aGlzLl9vcHRpb25zLmJ1dHRvbkNvbmZpcm1DbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ2FuY2VsQ2xhc3NOYW1lOiB0aGlzLl9vcHRpb25zLmJ1dHRvbkNhbmNlbENsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25Sb3RhdGVDbGFzc05hbWU6IHRoaXMuX29wdGlvbnMuYnV0dG9uUm90YXRlQ2xhc3NOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNvbmZpcm1MYWJlbDogdGhpcy5fb3B0aW9ucy5idXR0b25Db25maXJtTGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ2FuY2VsTGFiZWw6IHRoaXMuX29wdGlvbnMuYnV0dG9uQ2FuY2VsTGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uUm90YXRlTGFiZWw6IHRoaXMuX29wdGlvbnMuYnV0dG9uUm90YXRlTGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ29uZmlybVRpdGxlOiB0aGlzLl9vcHRpb25zLmJ1dHRvbkNvbmZpcm1UaXRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25DYW5jZWxUaXRsZTogdGhpcy5fb3B0aW9ucy5idXR0b25DYW5jZWxUaXRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25Sb3RhdGVUaXRsZTogdGhpcy5fb3B0aW9ucy5idXR0b25Sb3RhdGVUaXRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSksIE50LmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9pbWFnZUVkaXRvci5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZSwgdClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3NjYWxlRHJvcEFyZWFcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuX2dldFJhdGlvU3BhY2VyRWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiB0aGlzLl9lbGVtZW50ICYmIChlLnN0eWxlLm1hcmdpbkJvdHRvbSA9IDEwMCAqIHQgKyBcIiVcIiwgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXJhdGlvXCIsIFwiMTpcIiArIHQpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uQ2FuY2VsXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlU3RhdGUoXCJlZGl0b3JcIiksIHRoaXMuX29wdGlvbnMuZGlkQ2FuY2VsLmFwcGx5KHRoaXMsIFt0aGlzXSksIHRoaXMuX3Nob3dCdXR0b25zKCksIHRoaXMuX2hpZGVFZGl0b3IoKSwgdGhpcy5fb3B0aW9ucy5pbnN0YW50RWRpdCAmJiAhdGhpcy5faGFzSW5pdGlhbEltYWdlICYmIHRoaXMuX2lzQXV0b0Nyb3AoKSAmJiB0aGlzLl9kb1JlbW92ZSgpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfb25Db25maXJtXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLCBpID0gdGhpcy5fb3B0aW9ucy5zZXJ2aWNlICYmIHRoaXMuX29wdGlvbnMucHVzaDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPyB0aGlzLl9zdGFydFByb2dyZXNzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl91cGRhdGVQcm9ncmVzcyguMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogdGhpcy5fc3RhcnRQcm9ncmVzc0xvb3AoKSwgdGhpcy5fcmVtb3ZlU3RhdGUoXCJlZGl0b3JcIiksIHRoaXMuX2FkZFN0YXRlKFwiYnVzeVwiKSwgdGhpcy5fb3V0cHV0LnZhbHVlID0gXCJcIiwgdGhpcy5fZGF0YS5hY3Rpb25zLnJvdGF0aW9uID0gdC5kZXRhaWwucm90YXRpb24sIHRoaXMuX2RhdGEuYWN0aW9ucy5jcm9wID0gdC5kZXRhaWwuY3JvcCwgdGhpcy5fZGF0YS5hY3Rpb25zLmNyb3AudHlwZSA9IEF0Lk1BTlVBTCwgdGhpcy5fYXBwbHlUcmFuc2Zvcm1zKHRoaXMuX2RhdGEuaW5wdXQuaW1hZ2UsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fb3B0aW9ucy5kaWRDb25maXJtLmFwcGx5KGUsIFtlLmRhdGEsIGVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuX2dldEluT3V0KCksIG8gPSBcIm91dFwiID09PSBuWzBdLmNsYXNzTmFtZSA/IG5bMF0gOiBuWzFdLCBhID0gbyA9PT0gblswXSA/IG5bMV0gOiBuWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY2xhc3NOYW1lID0gXCJpblwiLCBvLnN0eWxlLm9wYWNpdHkgPSBcIjBcIiwgby5zdHlsZS56SW5kZXggPSBcIjJcIiwgYS5jbGFzc05hbWUgPSBcIm91dFwiLCBhLnN0eWxlLnpJbmRleCA9IFwiMVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gXCJhdXRvXCIgPT09IGUuX29wdGlvbnMuZGV2aWNlUGl4ZWxSYXRpbyA/IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIDogZS5fb3B0aW9ucy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uc3JjID0gXCJcIiwgby5zcmMgPSBodCh0LCBvLm9mZnNldFdpZHRoIC8gdC53aWR0aCAqIHIpLnRvRGF0YVVSTCgpLCBvLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5vbmxvYWQgPSBudWxsLCBcImZyZWVcIiA9PT0gZS5fb3B0aW9ucy5yYXRpbyAmJiAoZS5fcmF0aW8gPSBvLm5hdHVyYWxIZWlnaHQgLyBvLm5hdHVyYWxXaWR0aCwgZS5fc2NhbGVEcm9wQXJlYShlLl9yYXRpbykpLCBlLl9oaWRlRWRpdG9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9zaG93UHJldmlldyhvLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fc2F2ZShmdW5jdGlvbiAodCwgbiwgbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl90b2dnbGVCdXR0b24oXCJ1cGxvYWRcIiwgITApLCBpID8gZS5fc3RvcFByb2dyZXNzKCkgOiBlLl9zdG9wUHJvZ3Jlc3NMb29wKCksIGUuX3JlbW92ZVN0YXRlKFwiYnVzeVwiKSwgZS5fc2hvd0J1dHRvbnMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyNTApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl90aW1lcnMucHVzaCh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfY3JvcEF1dG9cIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSBlID8gYXJndW1lbnRzWzBdIDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpID0gdGhpcy5fZGF0YS5hY3Rpb25zLnJvdGF0aW9uICUgMTgwICE9PSAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB0dChpID8gdGhpcy5fZGF0YS5pbnB1dC5pbWFnZS5oZWlnaHQgOiB0aGlzLl9kYXRhLmlucHV0LmltYWdlLndpZHRoLCBpID8gdGhpcy5fZGF0YS5pbnB1dC5pbWFnZS53aWR0aCA6IHRoaXMuX2RhdGEuaW5wdXQuaW1hZ2UuaGVpZ2h0LCB0aGlzLl9yYXRpbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jcm9wKG4ueCwgbi55LCBuLndpZHRoLCBuLmhlaWdodCwgdCwgQXQuQVVUTylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9jcm9wXCIsIHZhbHVlOiBmdW5jdGlvbiAodCwgaSwgbiwgbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IGUgPyBhcmd1bWVudHNbNF0gOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgciA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gZSA/IGFyZ3VtZW50c1s1XSA6IEF0Lk1BTlVBTDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX291dHB1dC52YWx1ZSA9IFwiXCIsIHRoaXMuX2RhdGEuYWN0aW9ucy5jcm9wID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IG9cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuX2RhdGEuYWN0aW9ucy5jcm9wLnR5cGUgPSByLCB0aGlzLl9tYW51YWxUcmFuc2Zvcm0oYSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9tYW51YWxUcmFuc2Zvcm1cIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFByb2dyZXNzTG9vcCgpLCB0aGlzLl9hZGRTdGF0ZShcImJ1c3lcIiksIHRoaXMuX2FwcGx5VHJhbnNmb3Jtcyh0aGlzLl9kYXRhLmlucHV0LmltYWdlLCBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5fZ2V0SW5PdXQoKSwgbyA9IFwib3V0XCIgPT09IG5bMF0uY2xhc3NOYW1lID8gblswXSA6IG5bMV0sIGEgPSBvID09PSBuWzBdID8gblsxXSA6IG5bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgby5jbGFzc05hbWUgPSBcImluXCIsIG8uc3R5bGUub3BhY2l0eSA9IFwiMVwiLCBvLnN0eWxlLnpJbmRleCA9IFwiMlwiLCBhLmNsYXNzTmFtZSA9IFwib3V0XCIsIGEuc3R5bGUuekluZGV4ID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBcImF1dG9cIiA9PT0gZS5fb3B0aW9ucy5kZXZpY2VQaXhlbFJhdGlvID8gd2luZG93LmRldmljZVBpeGVsUmF0aW8gOiBlLl9vcHRpb25zLmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgby5zcmMgPSBcIlwiLCBvLnNyYyA9IGh0KGksIG8ub2Zmc2V0V2lkdGggLyBpLndpZHRoICogcikudG9EYXRhVVJMKCksIG8ub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLm9ubG9hZCA9IG51bGwsIFwiZnJlZVwiID09PSBlLl9vcHRpb25zLnJhdGlvICYmIChlLl9yYXRpbyA9IG8ubmF0dXJhbEhlaWdodCAvIG8ubmF0dXJhbFdpZHRoLCBlLl9zY2FsZURyb3BBcmVhKGUuX3JhdGlvKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZS5fb3B0aW9ucy5zZXJ2aWNlICYmIGUuX29wdGlvbnMucHVzaCwgbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX3NhdmUoZnVuY3Rpb24gKG4sIG8sIGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIHx8IGUuX3N0b3BQcm9ncmVzc0xvb3AoKSwgZS5fcmVtb3ZlU3RhdGUoXCJidXN5XCIpLCB0LmFwcGx5KGUsIFtlLmRhdGFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA/IGUuX3N0YXJ0UHJvZ3Jlc3MobikgOiBuKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3NhdmVcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcywgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gZSA/IGFyZ3VtZW50c1swXSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4gPSAhKGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gZSkgfHwgYXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0JlaW5nRGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB0aGlzLmRhdGFCYXNlNjQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5zZXJ2aWNlIHx8IHRoaXMuX2lzSW5pdGlhbGlzaW5nICYmICF0aGlzLl9pc0ltYWdlT25seSgpIHx8IHRoaXMuX29wdGlvbnMud2lsbFNhdmUuYXBwbHkodGhpcywgW28sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX3N0b3JlKGUpLCB0Ll9vcHRpb25zLmRpZFNhdmUuYXBwbHkodCwgW2UsIHRdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXNdKSwgdGhpcy5faXNCZWluZ0Rlc3Ryb3llZCB8fCAodGhpcy5fb3B0aW9ucy5zZXJ2aWNlICYmIG4gJiYgdGhpcy5fb3B0aW9ucy53aWxsU2F2ZS5hcHBseSh0aGlzLCBbbywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fYWRkU3RhdGUoXCJ1cGxvYWRcIiksIHQuX2ltYWdlSG9wcGVyICYmIHQuX29wdGlvbnMuZHJvcFJlcGxhY2UgJiYgKHQuX2ltYWdlSG9wcGVyLmVuYWJsZWQgPSAhMSksIHQuX3VwbG9hZChlLCBmdW5jdGlvbiAobiwgbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5faW1hZ2VIb3BwZXIgJiYgdC5fb3B0aW9ucy5kcm9wUmVwbGFjZSAmJiAodC5faW1hZ2VIb3BwZXIuZW5hYmxlZCA9ICEwKSwgbiB8fCB0Ll9zdG9yZVNlcnZlclJlc3BvbnNlKG8pLCB0Ll9vcHRpb25zLmRpZFVwbG9hZC5hcHBseSh0LCBbbiwgZSwgbywgdF0pLCB0Ll9yZW1vdmVTdGF0ZShcInVwbG9hZFwiKSwgaShuLCBlLCBvKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXNdKSwgdGhpcy5fb3B0aW9ucy5zZXJ2aWNlICYmIG4gfHwgaSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3N0b3JlU2VydmVyUmVzcG9uc2VcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1JlcXVpcmVkICYmICh0aGlzLl9pbnB1dC5yZXF1aXJlZCA9ICExKSwgdGhpcy5fZGF0YS5zZXJ2ZXIgPSB0LCB0aGlzLl9vdXRwdXQudmFsdWUgPSBcIm9iamVjdFwiID09PSAoXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2YgdCA/IFwidW5kZWZpbmVkXCIgOiBjKHQpKSA/IEpTT04uc3RyaW5naWZ5KHRoaXMuX2RhdGEuc2VydmVyKSA6IHRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9zdG9yZVwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzUmVxdWlyZWQgJiYgKHRoaXMuX2lucHV0LnJlcXVpcmVkID0gITEpLCB0aGlzLl9vdXRwdXQudmFsdWUgPSBKU09OLnN0cmluZ2lmeSh0KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3VwbG9hZFwiLCB2YWx1ZTogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdE91dHB1dChmdW5jdGlvbiAodCwgbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gaS5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLnNsaW0tdXBsb2FkLXN0YXR1c1wiKSwgYSA9IGkuX29wdGlvbnMud2lsbFJlcXVlc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5fdXBkYXRlUHJvZ3Jlc3MoTWF0aC5tYXgoLjEsIHQgLyBlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaS5faXNCZWluZ0Rlc3Ryb3llZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmlubmVySFRNTCA9IGkuX29wdGlvbnMuc3RhdHVzVXBsb2FkU3VjY2Vzcywgby5zZXRBdHRyaWJ1dGUoXCJkYXRhLXN0YXRlXCIsIFwic3VjY2Vzc1wiKSwgby5zdHlsZS5vcGFjaXR5ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uc3R5bGUub3BhY2l0eSA9IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMmUzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5fdGltZXJzLnB1c2godClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyNTApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5fdGltZXJzLnB1c2gobiksIGUobnVsbCwgdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gXCJmaWxlLXRvby1iaWdcIiA9PT0gdCA/IGkuX29wdGlvbnMuc3RhdHVzQ29udGVudExlbmd0aCA6IGkuX29wdGlvbnMuZGlkUmVjZWl2ZVNlcnZlckVycm9yLmFwcGx5KGksIFt0LCBpLl9vcHRpb25zLnN0YXR1c1Vua25vd25SZXNwb25zZSwgaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmlubmVySFRNTCA9IG4sIG8uc2V0QXR0cmlidXRlKFwiZGF0YS1zdGF0ZVwiLCBcImVycm9yXCIpLCBvLnN0eWxlLm9wYWNpdHkgPSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyNTApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5fdGltZXJzLnB1c2goYSksIGUodClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInN0cmluZ1wiID09IHR5cGVvZiBpLl9vcHRpb25zLnNlcnZpY2UgPyBPKGkuX29wdGlvbnMuc2VydmljZSwgaS5fb3B0aW9ucy51cGxvYWRNZXRob2QsIG4sIGEsIHIsIHMsIGgpIDogXCJmdW5jdGlvblwiID09IHR5cGVvZiBpLl9vcHRpb25zLnNlcnZpY2UgJiYgaS5fb3B0aW9ucy5zZXJ2aWNlLmFwcGx5KGksIFtcImZpbGVcIiA9PT0gaS5fb3B0aW9ucy5zZXJ2aWNlRm9ybWF0ID8gdCA6IG4sIHIsIHMsIGgsIGldKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcInJlcXVlc3RPdXRwdXRcIiwgdmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5pbnB1dC5maWxlID8gKGUgfHwgKGUgPSB0aGlzLmRhdGFCYXNlNjQpLCB2b2lkIG4ucGFyc2VNZXRhRGF0YSh0aGlzLl9kYXRhLmlucHV0LmZpbGUsIGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBbXSwgciA9IG5ldyBGb3JtRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTChcImlucHV0XCIsIGkuX29wdGlvbnMucG9zdCkgJiYgKGEucHVzaChpLl9kYXRhLmlucHV0LmZpbGUpLCByLmFwcGVuZChpLl9pbnB1dFJlZmVyZW5jZSwgaS5fZGF0YS5pbnB1dC5maWxlLCBpLl9kYXRhLmlucHV0LmZpbGUubmFtZSkpLCBMKFwib3V0cHV0XCIsIGkuX29wdGlvbnMucG9zdCkgJiYgbnVsbCAhPT0gaS5fZGF0YS5vdXRwdXQuaW1hZ2UgJiYgaS5fb3B0aW9ucy51cGxvYWRCYXNlNjQgPT09ICExKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gWihlLm91dHB1dC5pbWFnZSwgZS5vdXRwdXQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvLmltYWdlSGVhZCAmJiBpLl9vcHRpb25zLmNvcHlJbWFnZUhlYWQpIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gbmV3IEJsb2IoW28uaW1hZ2VIZWFkLCBuLmJsb2JTbGljZS5jYWxsKHMsIDIwKV0sIHt0eXBlOiB3dChlLm91dHB1dC5pbWFnZSl9KSwgcyA9IEcocywgZS5vdXRwdXQubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEucHVzaChzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBcInNsaW1fb3V0cHV0X1wiICsgaS5fdWlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm91dHB1dC5pbWFnZSA9IG51bGwsIGUub3V0cHV0LmZpZWxkID0gdSwgci5hcHBlbmQodSwgcywgZS5vdXRwdXQubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5hcHBlbmQoaS5fb3V0cHV0Lm5hbWUsIEpTT04uc3RyaW5naWZ5KGUpKSwgdChhLCByKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwge21heE1ldGFEYXRhU2l6ZTogMjYyMTQ0LCBkaXNhYmxlSW1hZ2VIZWFkOiAhMX0pKSA6IHZvaWQgdChudWxsLCBudWxsKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3Nob3dFZGl0b3JcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEZ0LmNsYXNzTmFtZSA9IHRoaXMuX29wdGlvbnMucG9wb3ZlckNsYXNzTmFtZSwgRnQuc2hvdygpLCB0aGlzLl9pbWFnZUVkaXRvci5zaG93KClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9oaWRlRWRpdG9yXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbWFnZUVkaXRvci5oaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ0LmhpZGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjUwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpbWVycy5wdXNoKHQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfc2hvd1ByZXZpZXdcIiwgdmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1KHQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tUG9zaXRpb246IFswLCA1MCwgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IFswLCAwLCAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tU2NhbGU6IFsxLjUsIDEuNV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IFsxLCAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tT3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhc2luZzogXCJzcHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbmdDb25zdGFudDogLjMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nRGVjZWxlcmF0aW9uOiAuNyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6KHQpLCBlICYmIGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfaGlkZVJlc3VsdFwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5fZ2V0SW50cm8oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgdShlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVNjYWxlOiBbMSwgMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IFsuNSwgLjVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21PcGFjaXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFzaW5nOiBcInNwcmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmluZ0NvbnN0YW50OiAuMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbmdEZWNlbGVyYXRpb246IC43NSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6KGUpLCB0ICYmIHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfc2hvd0J1dHRvbnNcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fYnRuR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9idG5Hcm91cC5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVNjYWxlOiBbLjUsIC41XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IFsxLCAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVBvc2l0aW9uOiBbMCwgMTAsIDBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogWzAsIDAsIDBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tT3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHoodGhpcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsRG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0RldGFjaGVkKCkgPyBlLmR1cmF0aW9uID0gMSA6IChlLmRlbGF5ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI1MCArIDUwICogdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUuZWFzaW5nID0gXCJzcHJpbmdcIiwgZS5zcHJpbmdDb25zdGFudCA9IC4zLCBlLnNwcmluZ0RlY2VsZXJhdGlvbiA9IC44NSksIHUodGhpcy5fYnRuR3JvdXAuY2hpbGROb2RlcywgZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9oaWRlQnV0dG9uc1wiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9idG5Hcm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tU2NhbGU6IFsxLCAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IFsuODUsIC44NV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21PcGFjaXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxEb25lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9idG5Hcm91cC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCIsIHQgJiYgdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNEZXRhY2hlZCgpID8gaS5kdXJhdGlvbiA9IDEgOiAoaS5lYXNpbmcgPSBcInNwcmluZ1wiLCBpLnNwcmluZ0NvbnN0YW50ID0gLjMsIGkuc3ByaW5nRGVjZWxlcmF0aW9uID0gLjc1KSwgdSh0aGlzLl9idG5Hcm91cC5jaGlsZE5vZGVzLCBpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2hpZGVTdGF0dXNcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLnNsaW0tdXBsb2FkLXN0YXR1c1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQuc3R5bGUub3BhY2l0eSA9IDBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9kb0VkaXRcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGEuaW5wdXQuaW1hZ2UgJiYgKHRoaXMuX2FkZFN0YXRlKFwiZWRpdG9yXCIpLCB0aGlzLl9pbWFnZUVkaXRvciB8fCB0aGlzLl9hcHBlbmRFZGl0b3IoKSwgdGhpcy5faW1hZ2VFZGl0b3Iuc2hvd1JvdGF0ZUJ1dHRvbiA9IHRoaXMuX29wdGlvbnMucm90YXRlQnV0dG9uLCBGdC5pbm5lciA9IHRoaXMuX2ltYWdlRWRpdG9yLmVsZW1lbnQsIHRoaXMuX2ltYWdlRWRpdG9yLm9wZW4oc3QodGhpcy5fZGF0YS5pbnB1dC5pbWFnZSksIFwiZnJlZVwiID09PSB0aGlzLl9vcHRpb25zLnJhdGlvID8gbnVsbCA6IHRoaXMuX3JhdGlvLCB0aGlzLl9kYXRhLmFjdGlvbnMuY3JvcCwgdGhpcy5fZGF0YS5hY3Rpb25zLnJvdGF0aW9uLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fc2hvd0VkaXRvcigpLCB0Ll9oaWRlQnV0dG9ucygpLCB0Ll9oaWRlU3RhdHVzKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2RvUmVtb3ZlXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0ltYWdlT25seSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2xlYXJTdGF0ZSgpLCB0aGlzLl9hZGRTdGF0ZShcImVtcHR5XCIpLCB0aGlzLl9oYXNJbml0aWFsSW1hZ2UgPSAhMSwgdGhpcy5faW1hZ2VIb3BwZXIgJiYgKHRoaXMuX2ltYWdlSG9wcGVyLmVuYWJsZWQgPSAhMCksIHRoaXMuX2lzUmVxdWlyZWQgJiYgKHRoaXMuX2lucHV0LnJlcXVpcmVkID0gITApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5fZ2V0T3V0cm8oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICYmIChpLnN0eWxlLm9wYWNpdHkgPSBcIjBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5faXNCZWluZ0Rlc3Ryb3llZCB8fCAoZS5faGlkZUJ1dHRvbnMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fdG9nZ2xlQnV0dG9uKFwidXBsb2FkXCIsICEwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZS5faGlkZVN0YXR1cygpLCBlLl9oaWRlUmVzdWx0KCksIGUuX29wdGlvbnMuZGlkUmVtb3ZlLmFwcGx5KGUsIFtuLCBlXSksIHQgJiYgdCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuaXNEZXRhY2hlZCgpID8gMCA6IDI1MCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVycy5wdXNoKG8pLCBuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfZG9VcGxvYWRcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRhLmlucHV0LmltYWdlICYmICh0aGlzLl9hZGRTdGF0ZShcInVwbG9hZFwiKSwgdGhpcy5fc3RhcnRQcm9ncmVzcygpLCB0aGlzLl9oaWRlQnV0dG9ucyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fdG9nZ2xlQnV0dG9uKFwidXBsb2FkXCIsICExKSwgZS5fc2F2ZShmdW5jdGlvbiAoaSwgbiwgbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9yZW1vdmVTdGF0ZShcInVwbG9hZFwiKSwgZS5fc3RvcFByb2dyZXNzKCksIHQgJiYgdC5hcHBseShlLCBbaSwgbiwgb10pLCBpICYmIGUuX3RvZ2dsZUJ1dHRvbihcInVwbG9hZFwiLCAhMCksIGUuX3Nob3dCdXR0b25zKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfZG9Eb3dubG9hZFwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLl9kYXRhLm91dHB1dC5pbWFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYga3QodGhpcy5fZGF0YSwgdGhpcy5fb3B0aW9ucy5qcGVnQ29tcHJlc3Npb24sIHRoaXMuX29wdGlvbnMuZm9yY2VUeXBlKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2RvRGVzdHJveVwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgIT09IGUuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lm5hbWUgPT09IGUubmFtZSAmJiB0LnZhbHVlID09PSBlLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQmVpbmdEZXN0cm95ZWQgPSAhMCwgdGhpcy5fdGltZXJzLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl90aW1lcnMgPSBbXSwgdSh0aGlzLl9lbGVtZW50LCBcImRldGFjaFwiKSwgdGhpcy5faW1hZ2VIb3BwZXIgJiYgKEh0LmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9pbWFnZUhvcHBlci5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodCwgZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl9pbWFnZUhvcHBlci5kZXN0cm95KCksIHRoaXMuX2ltYWdlSG9wcGVyID0gbnVsbCksIHRoaXMuX2ltYWdlRWRpdG9yICYmIChOdC5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5faW1hZ2VFZGl0b3IuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHQsIGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5faW1hZ2VFZGl0b3IuZGVzdHJveSgpLCB0aGlzLl9pbWFnZUVkaXRvciA9IG51bGwpLCBTdCh0aGlzLl9idG5Hcm91cC5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5faW5wdXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCB0aGlzKSwgdGhpcy5fZWxlbWVudCAhPT0gdGhpcy5fb3JpZ2luYWxFbGVtZW50ICYmIHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZSAmJiB0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuX29yaWdpbmFsRWxlbWVudCwgdGhpcy5fZWxlbWVudCksIHRoaXMuX29yaWdpbmFsRWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLl9vcmlnaW5hbEVsZW1lbnRJbm5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gXyh0aGlzLl9vcmlnaW5hbEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaS5mb3JFYWNoKGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdChpLCBlLl9vcmlnaW5hbEVsZW1lbnRBdHRyaWJ1dGVzKSB8fCBlLl9vcmlnaW5hbEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGkubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl9vcmlnaW5hbEVsZW1lbnRBdHRyaWJ1dGVzLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KG4sIGkpIHx8IGUuX29yaWdpbmFsRWxlbWVudC5zZXRBdHRyaWJ1dGUobi5uYW1lLCBuLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSksIFd0ID0gTWF0aC5tYXgoMCwgV3QgLSAxKSwgRnQgJiYgMCA9PT0gV3QgJiYgKEZ0LmRlc3Ryb3koKSwgRnQgPSBudWxsKSwgdGhpcy5fb3JpZ2luYWxFbGVtZW50ID0gbnVsbCwgdGhpcy5fZWxlbWVudCA9IG51bGwsIHRoaXMuX2lucHV0ID0gbnVsbCwgdGhpcy5fb3V0cHV0ID0gbnVsbCwgdGhpcy5fYnRuR3JvdXAgPSBudWxsLCB0aGlzLl9vcHRpb25zID0gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZGF0YUJhc2U2NFwiLCBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidCh0aGlzLl9kYXRhLCB0aGlzLl9vcHRpb25zLnBvc3QsIHRoaXMuX29wdGlvbnMuanBlZ0NvbXByZXNzaW9uLCB0aGlzLl9vcHRpb25zLmZvcmNlVHlwZSwgbnVsbCAhPT0gdGhpcy5fb3B0aW9ucy5zZXJ2aWNlKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZGF0YVwiLCBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2dCh0aGlzLl9kYXRhKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZWxlbWVudFwiLCBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJzZXJ2aWNlXCIsIHNldDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuc2VydmljZSA9IHRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcInNpemVcIiwgc2V0OiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTaXplKHQsIG51bGwpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJyb3RhdGlvblwiLCBzZXQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFJvdGF0aW9uKHQsIG51bGwpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJmb3JjZVNpemVcIiwgc2V0OiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRGb3JjZVNpemUodCwgbnVsbClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcInJhdGlvXCIsIHNldDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UmF0aW8odCwgbnVsbClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1dLCBbe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFwib3B0aW9uc1wiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdDogITAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFudEVkaXQ6ICExLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZEJhc2U2NDogITEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YToge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW86IFwiZnJlZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVBpeGVsUmF0aW86IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Q6IFtcIm91dHB1dFwiLCBcImFjdGlvbnNcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRm9ybWF0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclNoYXJwZW46IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaDogITEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdElucHV0TmFtZTogXCJzbGltW11cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5TaXplOiB7d2lkdGg6IDAsIGhlaWdodDogMH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RmlsZVNpemU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ0NvbXByZXNzaW9uOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZE1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWQ6ICExLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVJbml0aWFsSW1hZ2U6ICExLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlVHlwZTogITEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VTaXplOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlTWluU2l6ZTogITAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcFJlcGxhY2U6ICEwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoZXI6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxDYW52YXNTaXplOiB7d2lkdGg6IDQwOTYsIGhlaWdodDogNDA5Nn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weUltYWdlSGVhZDogITEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlQnV0dG9uOiAhMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BvdmVyQ2xhc3NOYW1lOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBcIjxwPkRyb3AgeW91ciBpbWFnZSBoZXJlPC9wPlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsTG9hZGluZzogXCI8cD5Mb2FkaW5nIGltYWdlLi4uPC9wPlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0ZpbGVUeXBlOiBcIjxwPkludmFsaWQgZmlsZSB0eXBlLCBleHBlY3RzOiAkMC48L3A+XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzRmlsZVNpemU6IFwiPHA+RmlsZSBpcyB0b28gYmlnLCBtYXhpbXVtIGZpbGUgc2l6ZTogJDAgTUIuPC9wPlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c05vU3VwcG9ydDogXCI8cD5Zb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBpbWFnZSBjcm9wcGluZy48L3A+XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzSW1hZ2VUb29TbWFsbDogXCI8cD5JbWFnZSBpcyB0b28gc21hbGwsIG1pbmltdW0gc2l6ZSBpczogJDAgcGl4ZWxzLjwvcD5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb250ZW50TGVuZ3RoOiAnPHNwYW4gY2xhc3M9XCJzbGltLXVwbG9hZC1zdGF0dXMtaWNvblwiPjwvc3Bhbj4gVGhlIGZpbGUgaXMgcHJvYmFibHkgdG9vIGJpZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVW5rbm93blJlc3BvbnNlOiAnPHNwYW4gY2xhc3M9XCJzbGltLXVwbG9hZC1zdGF0dXMtaWNvblwiPjwvc3Bhbj4gQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVXBsb2FkU3VjY2VzczogJzxzcGFuIGNsYXNzPVwic2xpbS11cGxvYWQtc3RhdHVzLWljb25cIj48L3NwYW4+IFNhdmVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNMb2NhbFVybFByb2JsZW06IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkSW5pdDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZExvYWQ6IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkU2F2ZTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFVwbG9hZDogZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFJlY2VpdmVTZXJ2ZXJFcnJvcjogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFJlbW92ZTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFRyYW5zZm9ybTogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZENvbmZpcm06IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWRDYW5jZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFRocm93RXJyb3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGxDcm9wSW5pdGlhbDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZShudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbFRyYW5zZm9ybTogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbFNhdmU6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUodClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGxSZW1vdmU6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbFJlcXVlc3Q6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsRmV0Y2g6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsTG9hZDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJ0LmNvbmNhdChJdC5CdXR0b25zKS5jb25jYXQoXCJyb3RhdGVcIikuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gUihlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W1wiYnV0dG9uXCIgKyBpICsgXCJDbGFzc05hbWVcIl0gPSBudWxsLCB0W1wiYnV0dG9uXCIgKyBpICsgXCJMYWJlbFwiXSA9IGksIHRbXCJidXR0b25cIiArIGkgKyBcIlRpdGxlXCJdID0gaVxuICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1dKSwgaVxuICAgICAgICAgICAgfSgpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQgPyBcIjxwPlwiICsgdCArIFwiPC9wPlwiIDogbnVsbFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBlKHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZSA9IHdpbmRvdywgaSA9IHQuc3BsaXQoXCIuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpLmZvckVhY2goZnVuY3Rpb24gKHQsIG4pIHtcbiAgICAgICAgICAgICAgICAgICAgZVtpW25dXSAmJiAoZSA9IGVbaVtuXV0pXG4gICAgICAgICAgICAgICAgfSksIGUgIT09IHdpbmRvdyA/IGUgOiBudWxsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBpID0gW10sIG4gPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwLCBuID0gaS5sZW5ndGg7IGUgPCBuOyBlKyspIGlmIChpW2VdLmlzQXR0YWNoZWRUbyh0KSkgcmV0dXJuIGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xXG4gICAgICAgICAgICB9LCBvID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdFxuICAgICAgICAgICAgfSwgYSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwidHJ1ZVwiID09PSB0XG4gICAgICAgICAgICB9LCByID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIXQgfHwgXCJ0cnVlXCIgPT09IHRcbiAgICAgICAgICAgIH0sIHMgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0KGUpXG4gICAgICAgICAgICB9LCBoID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdCA/IGUodCkgOiBudWxsXG4gICAgICAgICAgICB9LCB1ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHZhciBlID0genQodCwgXCIsXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBlWzBdLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGVbMV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBsID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdCA/IHBhcnNlRmxvYXQodCkgOiBudWxsXG4gICAgICAgICAgICB9LCBwID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdCA/IHBhcnNlSW50KHQsIDEwKSA6IG51bGxcbiAgICAgICAgICAgIH0sIGMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIGlmICghdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSB7fTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5zcGxpdChcIixcIikubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh0LCAxMClcbiAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uICh0LCBpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVbVXRbaV1dID0gdFxuICAgICAgICAgICAgICAgIH0pLCBlXG4gICAgICAgICAgICB9LCBmID0ge1xuICAgICAgICAgICAgICAgIGRvd25sb2FkOiBhLFxuICAgICAgICAgICAgICAgIGVkaXQ6IHIsXG4gICAgICAgICAgICAgICAgaW5zdGFudEVkaXQ6IGEsXG4gICAgICAgICAgICAgICAgbWluU2l6ZTogdSxcbiAgICAgICAgICAgICAgICBzaXplOiB1LFxuICAgICAgICAgICAgICAgIGZvcmNlU2l6ZTogdSxcbiAgICAgICAgICAgICAgICBmb3JjZU1pblNpemU6IHIsXG4gICAgICAgICAgICAgICAgaW50ZXJuYWxDYW52YXNTaXplOiB1LFxuICAgICAgICAgICAgICAgIHNlcnZpY2U6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcInVuZGVmaW5lZFwiID09IHR5cGVvZiB0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBlKHQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSA/IGkgOiB0XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXJ2aWNlRm9ybWF0OiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2YgdCA/IG51bGwgOiB0XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmZXRjaGVyOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2YgdCA/IG51bGwgOiB0XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwdXNoOiBhLFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uOiBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2YgdCA/IG51bGwgOiBwYXJzZUludCh0LCAxMClcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNyb3A6IGMsXG4gICAgICAgICAgICAgICAgcG9zdDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPyB0LnNwbGl0KFwiLFwiKS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnRyaW0oKVxuICAgICAgICAgICAgICAgICAgICB9KSA6IG51bGxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRlZmF1bHRJbnB1dE5hbWU6IG8sXG4gICAgICAgICAgICAgICAgcmF0aW86IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID8gdCA6IG51bGxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1heEZpbGVTaXplOiBsLFxuICAgICAgICAgICAgICAgIGZpbHRlclNoYXJwZW46IHAsXG4gICAgICAgICAgICAgICAganBlZ0NvbXByZXNzaW9uOiBwLFxuICAgICAgICAgICAgICAgIHVwbG9hZEJhc2U2NDogYSxcbiAgICAgICAgICAgICAgICBmb3JjZVR5cGU6IG8sXG4gICAgICAgICAgICAgICAgZHJvcFJlcGxhY2U6IHIsXG4gICAgICAgICAgICAgICAgc2F2ZUluaXRpYWxJbWFnZTogYSxcbiAgICAgICAgICAgICAgICBjb3B5SW1hZ2VIZWFkOiBhLFxuICAgICAgICAgICAgICAgIHJvdGF0ZUJ1dHRvbjogcixcbiAgICAgICAgICAgICAgICBsYWJlbDogcyxcbiAgICAgICAgICAgICAgICBsYWJlbExvYWRpbmc6IHMsXG4gICAgICAgICAgICAgICAgcG9wb3ZlckNsYXNzTmFtZTogbyxcbiAgICAgICAgICAgICAgICBkZXZpY2VQaXhlbFJhdGlvOiBvLFxuICAgICAgICAgICAgICAgIHVwbG9hZE1ldGhvZDogb1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFtcIkZpbGVTaXplXCIsIFwiRmlsZVR5cGVcIiwgXCJOb1N1cHBvcnRcIiwgXCJJbWFnZVRvb1NtYWxsXCJdLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICBmW1wic3RhdHVzXCIgKyB0XSA9IHNcbiAgICAgICAgICAgIH0pLCBbXCJDb250ZW50TGVuZ3RoXCIsIFwiVW5rbm93blJlc3BvbnNlXCIsIFwiVXBsb2FkU3VjY2Vzc1wiLCBcImxvY2FsVXJsUHJvYmxlbVwiXS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgZltcInN0YXR1c1wiICsgdF0gPSBvXG4gICAgICAgICAgICB9KSwgW1wiSW5pdFwiLCBcIkxvYWRcIiwgXCJTYXZlXCIsIFwiVXBsb2FkXCIsIFwiUmVtb3ZlXCIsIFwiVHJhbnNmb3JtXCIsIFwiUmVjZWl2ZVNlcnZlckVycm9yXCIsIFwiQ29uZmlybVwiLCBcIkNhbmNlbFwiLCBcIlRocm93RXJyb3JcIl0uZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIGZbXCJkaWRcIiArIHRdID0gaFxuICAgICAgICAgICAgfSksIFtcIkNyb3BJbml0aWFsXCIsIFwiVHJhbnNmb3JtXCIsIFwiU2F2ZVwiLCBcIlJlbW92ZVwiLCBcIlJlcXVlc3RcIiwgXCJMb2FkXCIsIFwiRmV0Y2hcIl0uZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIGZbXCJ3aWxsXCIgKyB0XSA9IGhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIF8gPSBbXCJDbGFzc05hbWVcIiwgXCJMYWJlbFwiLCBcIlRpdGxlXCJdO1xuICAgICAgICAgICAgQnQuY29uY2F0KEl0LkJ1dHRvbnMpLmNvbmNhdChcInJvdGF0ZVwiKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSBSKHQpO1xuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICBmW1wiYnV0dG9uXCIgKyBlICsgdF0gPSBvXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pLCBHdC5zdXBwb3J0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICEoXCJbb2JqZWN0IE9wZXJhTWluaV1cIiA9PT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdpbmRvdy5vcGVyYW1pbmkpIHx8IFwidW5kZWZpbmVkXCIgPT0gdHlwZW9mIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyIHx8IFwidW5kZWZpbmVkXCIgPT0gdHlwZW9mIHdpbmRvdy5GaWxlUmVhZGVyIHx8ICEoXCJzbGljZVwiIGluIEJsb2IucHJvdG90eXBlKSB8fCBcInVuZGVmaW5lZFwiID09IHR5cGVvZiB3aW5kb3cuVVJMIHx8IFwidW5kZWZpbmVkXCIgPT0gdHlwZW9mIHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKVxuICAgICAgICAgICAgfSgpLCBHdC5wYXJzZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGUsIGksIG4sIG8gPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGUgPSB0LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuc2xpbTpub3QoW2RhdGEtc3RhdGVdKVwiKSwgbiA9IGUubGVuZ3RoOyBuLS07KSBpID0gZVtuXSwgby5wdXNoKEd0LmNyZWF0ZShpLCBHdC5nZXRPcHRpb25zRnJvbUF0dHJpYnV0ZXMoaSkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb1xuICAgICAgICAgICAgfSwgR3QuZ2V0T3B0aW9uc0Zyb21BdHRyaWJ1dGVzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZSA9IGQodCksIGkgPSB7bWV0YToge319O1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGZbbl0sIGEgPSBlW25dO1xuICAgICAgICAgICAgICAgICAgICBvID8gKGEgPSBvKGEpLCBhID0gbnVsbCA9PT0gYSA/IG10KEd0Lm9wdGlvbnMoKVtuXSkgOiBhLCBpW25dID0gYSkgOiAwID09PSBuLmluZGV4T2YoXCJtZXRhXCIpICYmIChpLm1ldGFbTShuLnN1YnN0cig0KSldID0gYSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlcbiAgICAgICAgICAgIH0sIEd0LmZpbmQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHZhciBlID0gaS5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuaXNBdHRhY2hlZFRvKHQpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUgPyBlWzBdIDogbnVsbFxuICAgICAgICAgICAgfSwgR3QuY3JlYXRlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUd0LmZpbmQodCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZSB8fCAoZSA9IEd0LmdldE9wdGlvbnNGcm9tQXR0cmlidXRlcyh0KSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuID0gbmV3IEd0KHQsIGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5wdXNoKG4pLCBuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgR3QuZGVzdHJveSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSBuKHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiAhKGUgPCAwKSAmJiAoaVtlXS5kZXN0cm95KCksIGkuc3BsaWNlKGUsIDEpLCAhMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSgpLCBHdFxuICAgIH0oKSwgdC5TbGltLnN1cHBvcnRlZCkgXCJsb2FkaW5nXCIgIT09IGRvY3VtZW50LnJlYWR5U3RhdGUgPyBpKCkgOiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBpKTsgZWxzZSB7XG4gICAgICAgIHZhciBuID0gdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwic2xpbVwiKSwgbyA9IDAsIGEgPSBuLmxlbmd0aDtcbiAgICAgICAgZm9yIChvID0gMDsgbyA8IGE7IG8rKykgbltvXS5jbGFzc05hbWUgPSBcIlwiXG4gICAgfVxufSh3aW5kb3cpO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLFVBQVVBLENBQUMsRUFBRUMsQ0FBQyxFQUFFO0VBQ2IsU0FBU0MsQ0FBQyxHQUFHO0lBQ1RGLENBQUMsQ0FBQ0csSUFBSSxDQUFDQyxLQUFLLENBQUNDLFFBQVEsQ0FBQztFQUMxQjtFQUVBLElBQUlMLENBQUMsRUFBRSxJQUFJQSxDQUFDLENBQUNHLElBQUksR0FBRyxZQUFZO0lBQzVCLFNBQVNILENBQUMsQ0FBQ0EsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7TUFDYixJQUFJLEVBQUVELENBQUMsWUFBWUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJSyxT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VUFDRnpGLENBQUMsQ0FBQzJFLElBQUksR0FBR25FLENBQUMsQ0FBQ3NFLEtBQUssRUFBRTlFLENBQUMsQ0FBQzhFLEtBQUssR0FBR3RFLENBQUMsQ0FBQ21FLElBQUk7VUFDbEM7UUFDSixLQUFLLENBQUM7VUFDRjNFLENBQUMsQ0FBQzJFLElBQUksR0FBR25FLENBQUMsQ0FBQ3NFLEtBQUssRUFBRTlFLENBQUMsQ0FBQzRFLEdBQUcsR0FBR3BFLENBQUMsQ0FBQ3dFLE1BQU0sRUFBRWhGLENBQUMsQ0FBQzhFLEtBQUssR0FBR3RFLENBQUMsQ0FBQ21FLElBQUksRUFBRTNFLENBQUMsQ0FBQ2dGLE1BQU0sR0FBR3hFLENBQUMsQ0FBQ29FLEdBQUc7VUFDdEU7UUFDSixLQUFLLENBQUM7VUFDRjVFLENBQUMsQ0FBQzRFLEdBQUcsR0FBR3BFLENBQUMsQ0FBQ3dFLE1BQU0sRUFBRWhGLENBQUMsQ0FBQ2dGLE1BQU0sR0FBR3hFLENBQUMsQ0FBQ29FLEdBQUc7VUFDbEM7UUFDSixLQUFLLENBQUM7VUFDRjVFLENBQUMsQ0FBQzJFLElBQUksR0FBR25FLENBQUMsQ0FBQ29FLEdBQUcsRUFBRTVFLENBQUMsQ0FBQzRFLEdBQUcsR0FBR3BFLENBQUMsQ0FBQ21FLElBQUksRUFBRTNFLENBQUMsQ0FBQzhFLEtBQUssR0FBR3RFLENBQUMsQ0FBQ3dFLE1BQU0sRUFBRWhGLENBQUMsQ0FBQ2dGLE1BQU0sR0FBR3hFLENBQUMsQ0FBQ3NFLEtBQUs7VUFDdEU7UUFDSixLQUFLLENBQUM7VUFDRjlFLENBQUMsQ0FBQzJFLElBQUksR0FBR25FLENBQUMsQ0FBQ29FLEdBQUcsRUFBRTVFLENBQUMsQ0FBQzRFLEdBQUcsR0FBR3BFLENBQUMsQ0FBQ3NFLEtBQUssRUFBRTlFLENBQUMsQ0FBQzhFLEtBQUssR0FBR3RFLENBQUMsQ0FBQ3dFLE1BQU0sRUFBRWhGLENBQUMsQ0FBQ2dGLE1BQU0sR0FBR3hFLENBQUMsQ0FBQ21FLElBQUk7VUFDdEU7UUFDSixLQUFLLENBQUM7VUFDRjNFLENBQUMsQ0FBQzJFLElBQUksR0FB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QUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBR0MsQ0FBQyxFQUFFRCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUdFLENBQUMsRUFBRUYsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHTyxDQUFDLEVBQUVQLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1VBQ3hLLENBQUM7VUFBRTBPLENBQUMsR0FBRyxTQUFKQSxDQUFDLENBQWExTyxDQUFDLEVBQUVDLENBQUMsRUFBRTtZQUNuQkQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHYSxJQUFJLENBQUM4TSxHQUFHLENBQUMxTixDQUFDLENBQUMsRUFBRUQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUNhLElBQUksQ0FBQzhOLEdBQUcsQ0FBQzFPLENBQUMsQ0FBQyxFQUFFRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdhLElBQUksQ0FBQzhOLEdBQUcsQ0FBQzFPLENBQUMsQ0FBQyxFQUFFRCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUdhLElBQUksQ0FBQzhNLEdBQUcsQ0FBQzFOLENBQUMsQ0FBQyxFQUFFRCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQztVQUNqTixDQUFDO1VBQUU0TyxDQUFDLEdBQUcsU0FBSkEsQ0FBQyxDQUFhNU8sQ0FBQyxFQUFFQyxDQUFDLEVBQUU7WUFDbkJELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR2EsSUFBSSxDQUFDOE0sR0FBRyxDQUFDMU4sQ0FBQyxDQUFDLEVBQUVELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR2EsSUFBSSxDQUFDOE4sR0FBRyxDQUFDMU8sQ0FBQyxDQUFDLEVBQUVELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDYSxJQUFJLENBQUM4TixHQUFHLENBQUMxTyxDQUFDLENBQUMsRUFBRUQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHYSxJQUFJLENBQUM4TSxHQUFHLENBQUMxTixDQUFDLENBQUMsRUFBRUQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7VUFDak4sQ0FBQztVQUFFNk8sQ0FBQyxHQUFHLFNBQUpBLENBQUMsQ0FBYTdPLENBQUMsRUFBRUMsQ0FBQyxFQUFFO1lBQ25CRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdhLElBQUksQ0FBQzhNLEdBQUcsQ0FBQzFOLENBQUMsQ0FBQyxFQUFFRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQ2EsSUFBSSxDQUFDOE4sR0FBRyxDQUFDMU8sQ0FBQyxDQUFDLEVBQUVELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR2EsSUFBSSxDQUFDOE4sR0FBRyxDQUFDMU8sQ0FBQyxDQUFDLEVBQUVELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR2EsSUFBSSxDQUFDOE0sR0FBRyxDQUFDMU4sQ0FBQyxDQUFDLEVBQUVELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1VBQ2pOLENBQUM7VUFBRThPLENBQUMsR0FBRyxTQUFKQSxDQUFDLENBQWE5TyxDQUFDLEVBQUVDLENBQUMsRUFBRUMsQ0FBQyxFQUFFO1lBQ3RCRixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdhLElBQUksQ0FBQ2tPLEdBQUcsQ0FBQzlPLENBQUMsQ0FBQyxFQUFFRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdhLElBQUksQ0FBQ2tPLEdBQUcsQ0FBQzdPLENBQUMsQ0FBQyxFQUFFRixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQztVQUM1TCxDQUFDO1VBQUVnUCxDQUFDLEdBQUcsU0FBSkEsQ0FBQyxDQUFhaFAsQ0FBQyxFQUFFQyxDQUFDLEVBQUVDLENBQUMsRUFBRTtZQUN0QkYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHQyxDQUFDLEVBQUVELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0UsQ0FBQyxFQUFFRixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQztVQUN4SyxDQUFDO1VBQUVpUCxDQUFDLEdBQUcsU0FBSkEsQ0FBQyxDQUFhalAsQ0FBQyxFQUFFO1lBQ2hCQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQztVQUN4SyxDQUFDO1VBQUVrUCxDQUFDLEdBQUcsU0FBSkEsQ0FBQyxDQUFhbFAsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7WUFDbkJBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdELENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUVDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdELENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUVDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdELENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUVDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUdELENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHRCxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUVDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBR0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUdELENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHRCxDQUFDLENB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RCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUdELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUdELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUdELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUdELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdELENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBR0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdELENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBR0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUdGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUdELENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBR0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUdGLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUdELENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBR0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUdGLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBR0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHRCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUdDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdELENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBR0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUdGLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBR0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHRCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUdDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdELENBQUMsQ0FBQyxFQUFFLENBQUMs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LEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1VBQy92Q0UsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxF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\n//# sourceURL=webpack-internal:///./resources/js/slim.kickstart.min.js\n");
/***/ }),
/***/ "./node_modules/bootstrap/dist/js/bootstrap.js":
/*!*****************************************************!*\
!*** ./node_modules/bootstrap/dist/js/bootstrap.js ***!
\*****************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
eval("/*!\n * Bootstrap v4.6.2 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n(function (global, factory) {\n true ? factory(exports, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"), __webpack_require__(/*! popper.js */ \"./node_modules/popper.js/dist/esm/popper.js\")) :\n 0;\n})(this, (function (exports, $, Popper) { 'use strict';\n\n function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }\n\n var $__default = /*#__PURE__*/_interopDefaultLegacy($);\n var Popper__default = /*#__PURE__*/_interopDefaultLegacy(Popper);\n\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n }\n\n function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n return _extends.apply(this, arguments);\n }\n\n function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n\n _setPrototypeOf(subClass, superClass);\n }\n\n function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n }\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n /**\n * Private TransitionEnd Helpers\n */\n\n var TRANSITION_END = 'transitionend';\n var MAX_UID = 1000000;\n var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n function toType(obj) {\n if (obj === null || typeof obj === 'undefined') {\n return \"\" + obj;\n }\n\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n }\n\n function getSpecialTransitionEndEvent() {\n return {\n bindType: TRANSITION_END,\n delegateType: TRANSITION_END,\n handle: function handle(event) {\n if ($__default[\"default\"](event.target).is(this)) {\n return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\n }\n\n return undefined;\n }\n };\n }\n\n function transitionEndEmulator(duration) {\n var _this = this;\n\n var called = false;\n $__default[\"default\"](this).one(Util.TRANSITION_END, function () {\n called = true;\n });\n setTimeout(function () {\n if (!called) {\n Util.triggerTransitionEnd(_this);\n }\n }, duration);\n return this;\n }\n\n function setTransitionEndSupport() {\n $__default[\"default\"].fn.emulateTransitionEnd = transitionEndEmulator;\n $__default[\"default\"].event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\n }\n /**\n * Public Util API\n */\n\n\n var Util = {\n TRANSITION_END: 'bsTransitionEnd',\n getUID: function getUID(prefix) {\n do {\n // eslint-disable-next-line no-bitwise\n prefix += ~~(Math.random() * MAX_UID); // \"~~\" acts like a faster Math.floor() here\n } while (document.getElementById(prefix));\n\n return prefix;\n },\n getSelectorFromElement: function getSelectorFromElement(element) {\n var selector = element.getAttribute('data-target');\n\n if (!selector || selector === '#') {\n var hrefAttr = element.getAttribute('href');\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';\n }\n\n try {\n return document.querySelector(selector) ? selector : null;\n } catch (_) {\n return null;\n }\n },\n getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {\n if (!element) {\n return 0;\n } // Get transition-duration of the element\n\n\n var transitionDuration = $__default[\"default\"](element).css('transition-duration');\n var transitionDelay = $__default[\"default\"](element).css('transition-delay');\n var floatTransitionDuration = parseFloat(transitionDuration);\n var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found\n\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0;\n } // If multiple durations are defined, take the first\n\n\n transitionDuration = transitionDuration.split(',')[0];\n transitionDelay = transitionDelay.split(',')[0];\n return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n },\n reflow: function reflow(element) {\n return element.offsetHeight;\n },\n triggerTransitionEnd: function triggerTransitionEnd(element) {\n $__default[\"default\"](element).trigger(TRANSITION_END);\n },\n supportsTransitionEnd: function supportsTransitionEnd() {\n return Boolean(TRANSITION_END);\n },\n isElement: function isElement(obj) {\n return (obj[0] || obj).nodeType;\n },\n typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\n for (var property in configTypes) {\n if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n var expectedTypes = configTypes[property];\n var value = config[property];\n var valueType = value && Util.isElement(value) ? 'element' : toType(value);\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new Error(componentName.toUpperCase() + \": \" + (\"Option \\\"\" + property + \"\\\" provided type \\\"\" + valueType + \"\\\" \") + (\"but expected type \\\"\" + expectedTypes + \"\\\".\"));\n }\n }\n }\n },\n findShadowRoot: function findShadowRoot(element) {\n if (!document.documentElement.attachShadow) {\n return null;\n } // Can find the shadow root otherwise it'll return the document\n\n\n if (typeof element.getRootNode === 'function') {\n var root = element.getRootNode();\n return root instanceof ShadowRoot ? root : null;\n }\n\n if (element instanceof ShadowRoot) {\n return element;\n } // when we don't find a shadow root\n\n\n if (!element.parentNode) {\n return null;\n }\n\n return Util.findShadowRoot(element.parentNode);\n },\n jQueryDetection: function jQueryDetection() {\n if (typeof $__default[\"default\"] === 'undefined') {\n throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.');\n }\n\n var version = $__default[\"default\"].fn.jquery.split(' ')[0].split('.');\n var minMajor = 1;\n var ltMajor = 2;\n var minMinor = 9;\n var minPatch = 1;\n var maxMajor = 4;\n\n if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');\n }\n }\n };\n Util.jQueryDetection();\n setTransitionEndSupport();\n\n /**\n * Constants\n */\n\n var NAME$a = 'alert';\n var VERSION$a = '4.6.2';\n var DATA_KEY$a = 'bs.alert';\n var EVENT_KEY$a = \".\" + DATA_KEY$a;\n var DATA_API_KEY$7 = '.data-api';\n var JQUERY_NO_CONFLICT$a = $__default[\"default\"].fn[NAME$a];\n var CLASS_NAME_ALERT = 'alert';\n var CLASS_NAME_FADE$5 = 'fade';\n var CLASS_NAME_SHOW$7 = 'show';\n var EVENT_CLOSE = \"close\" + EVENT_KEY$a;\n var EVENT_CLOSED = \"closed\" + EVENT_KEY$a;\n var EVENT_CLICK_DATA_API$6 = \"click\" + EVENT_KEY$a + DATA_API_KEY$7;\n var SELECTOR_DISMISS = '[data-dismiss=\"alert\"]';\n /**\n * Class definition\n */\n\n var Alert = /*#__PURE__*/function () {\n function Alert(element) {\n this._element = element;\n } // Getters\n\n\n var _proto = Alert.prototype;\n\n // Public\n _proto.close = function close(element) {\n var rootElement = this._element;\n\n if (element) {\n rootElement = this._getRootElement(element);\n }\n\n var customEvent = this._triggerCloseEvent(rootElement);\n\n if (customEvent.isDefaultPrevented()) {\n return;\n }\n\n this._removeElement(rootElement);\n };\n\n _proto.dispose = function dispose() {\n $__default[\"default\"].removeData(this._element, DATA_KEY$a);\n this._element = null;\n } // Private\n ;\n\n _proto._getRootElement = function _getRootElement(element) {\n var selector = Util.getSelectorFromElement(element);\n var parent = false;\n\n if (selector) {\n parent = document.querySelector(selector);\n }\n\n if (!parent) {\n parent = $__default[\"default\"](element).closest(\".\" + CLASS_NAME_ALERT)[0];\n }\n\n return parent;\n };\n\n _proto._triggerCloseEvent = function _triggerCloseEvent(element) {\n var closeEvent = $__default[\"default\"].Event(EVENT_CLOSE);\n $__default[\"default\"](element).trigger(closeEvent);\n return closeEvent;\n };\n\n _proto._removeElement = function _removeElement(element) {\n var _this = this;\n\n $__default[\"default\"](element).removeClass(CLASS_NAME_SHOW$7);\n\n if (!$__default[\"default\"](element).hasClass(CLASS_NAME_FADE$5)) {\n this._destroyElement(element);\n\n return;\n }\n\n var transitionDuration = Util.getTransitionDurationFromElement(element);\n $__default[\"default\"](element).one(Util.TRANSITION_END, function (event) {\n return _this._destroyElement(element, event);\n }).emulateTransitionEnd(transitionDuration);\n };\n\n _proto._destroyElement = function _destroyElement(element) {\n $__default[\"default\"](element).detach().trigger(EVENT_CLOSED).remove();\n } // Static\n ;\n\n Alert._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var $element = $__default[\"default\"](this);\n var data = $element.data(DATA_KEY$a);\n\n if (!data) {\n data = new Alert(this);\n $element.data(DATA_KEY$a, data);\n }\n\n if (config === 'close') {\n data[config](this);\n }\n });\n };\n\n Alert._handleDismiss = function _handleDismiss(alertInstance) {\n return function (event) {\n if (event) {\n event.preventDefault();\n }\n\n alertInstance.close(this);\n };\n };\n\n _createClass(Alert, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION$a;\n }\n }]);\n\n return Alert;\n }();\n /**\n * Data API implementation\n */\n\n\n $__default[\"default\"](document).on(EVENT_CLICK_DATA_API$6, SELECTOR_DISMISS, Alert._handleDismiss(new Alert()));\n /**\n * jQuery\n */\n\n $__default[\"default\"].fn[NAME$a] = Alert._jQueryInterface;\n $__default[\"default\"].fn[NAME$a].Constructor = Alert;\n\n $__default[\"default\"].fn[NAME$a].noConflict = function () {\n $__default[\"default\"].fn[NAME$a] = JQUERY_NO_CONFLICT$a;\n return Alert._jQueryInterface;\n };\n\n /**\n * Constants\n */\n\n var NAME$9 = 'button';\n var VERSION$9 = '4.6.2';\n var DATA_KEY$9 = 'bs.button';\n var EVENT_KEY$9 = \".\" + DATA_KEY$9;\n var DATA_API_KEY$6 = '.data-api';\n var JQUERY_NO_CONFLICT$9 = $__default[\"default\"].fn[NAME$9];\n var CLASS_NAME_ACTIVE$3 = 'active';\n var CLASS_NAME_BUTTON = 'btn';\n var CLASS_NAME_FOCUS = 'focus';\n var EVENT_CLICK_DATA_API$5 = \"click\" + EVENT_KEY$9 + DATA_API_KEY$6;\n var EVENT_FOCUS_BLUR_DATA_API = \"focus\" + EVENT_KEY$9 + DATA_API_KEY$6 + \" \" + (\"blur\" + EVENT_KEY$9 + DATA_API_KEY$6);\n var EVENT_LOAD_DATA_API$2 = \"load\" + EVENT_KEY$9 + DATA_API_KEY$6;\n var SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^=\"button\"]';\n var SELECTOR_DATA_TOGGLES = '[data-toggle=\"buttons\"]';\n var SELECTOR_DATA_TOGGLE$4 = '[data-toggle=\"button\"]';\n var SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle=\"buttons\"] .btn';\n var SELECTOR_INPUT = 'input:not([type=\"hidden\"])';\n var SELECTOR_ACTIVE$2 = '.active';\n var SELECTOR_BUTTON = '.btn';\n /**\n * Class definition\n */\n\n var Button = /*#__PURE__*/function () {\n function Button(element) {\n this._element = element;\n this.shouldAvoidTriggerChange = false;\n } // Getters\n\n\n var _proto = Button.prototype;\n\n // Public\n _proto.toggle = function toggle() {\n var triggerChangeEvent = true;\n var addAriaPressed = true;\n var rootElement = $__default[\"default\"](this._element).closest(SELECTOR_DATA_TOGGLES)[0];\n\n if (rootElement) {\n var input = this._element.querySelector(SELECTOR_INPUT);\n\n if (input) {\n if (input.type === 'radio') {\n if (input.checked && this._element.classList.contains(CLASS_NAME_ACTIVE$3)) {\n triggerChangeEvent = false;\n } else {\n var activeElement = rootElement.querySelector(SELECTOR_ACTIVE$2);\n\n if (activeElement) {\n $__default[\"default\"](activeElement).removeClass(CLASS_NAME_ACTIVE$3);\n }\n }\n }\n\n if (triggerChangeEvent) {\n // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input\n if (input.type === 'checkbox' || input.type === 'radio') {\n input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE$3);\n }\n\n if (!this.shouldAvoidTriggerChange) {\n $__default[\"default\"](input).trigger('change');\n }\n }\n\n input.focus();\n addAriaPressed = false;\n }\n }\n\n if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {\n if (addAriaPressed) {\n this._element.setAttribute('aria-pressed', !this._element.classList.contains(CLASS_NAME_ACTIVE$3));\n }\n\n if (triggerChangeEvent) {\n $__default[\"default\"](this._element).toggleClass(CLASS_NAME_ACTIVE$3);\n }\n }\n };\n\n _proto.dispose = function dispose() {\n $__default[\"default\"].removeData(this._element, DATA_KEY$9);\n this._element = null;\n } // Static\n ;\n\n Button._jQueryInterface = function _jQueryInterface(config, avoidTriggerChange) {\n return this.each(function () {\n var $element = $__default[\"default\"](this);\n var data = $element.data(DATA_KEY$9);\n\n if (!data) {\n data = new Button(this);\n $element.data(DATA_KEY$9, data);\n }\n\n data.shouldAvoidTriggerChange = avoidTriggerChange;\n\n if (config === 'toggle') {\n data[config]();\n }\n });\n };\n\n _createClass(Button, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION$9;\n }\n }]);\n\n return Button;\n }();\n /**\n * Data API implementation\n */\n\n\n $__default[\"default\"](document).on(EVENT_CLICK_DATA_API$5, SELECTOR_DATA_TOGGLE_CARROT, function (event) {\n var button = event.target;\n var initialButton = button;\n\n if (!$__default[\"default\"](button).hasClass(CLASS_NAME_BUTTON)) {\n button = $__default[\"default\"](button).closest(SELECTOR_BUTTON)[0];\n }\n\n if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) {\n event.preventDefault(); // work around Firefox bug #1540995\n } else {\n var inputBtn = button.querySelector(SELECTOR_INPUT);\n\n if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {\n event.preventDefault(); // work around Firefox bug #1540995\n\n return;\n }\n\n if (initialButton.tagName === 'INPUT' || button.tagName !== 'LABEL') {\n Button._jQueryInterface.call($__default[\"default\"](button), 'toggle', initialButton.tagName === 'INPUT');\n }\n }\n }).on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, function (event) {\n var button = $__default[\"default\"](event.target).closest(SELECTOR_BUTTON)[0];\n $__default[\"default\"](button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type));\n });\n $__default[\"default\"](window).on(EVENT_LOAD_DATA_API$2, function () {\n // ensure correct active class is set to match the controls' actual values/states\n // find all checkboxes/readio buttons inside data-toggle groups\n var buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLES_BUTTONS));\n\n for (var i = 0, len = buttons.length; i < len; i++) {\n var button = buttons[i];\n var input = button.querySelector(SELECTOR_INPUT);\n\n if (input.checked || input.hasAttribute('checked')) {\n button.classList.add(CLASS_NAME_ACTIVE$3);\n } else {\n button.classList.remove(CLASS_NAME_ACTIVE$3);\n }\n } // find all button toggles\n\n\n buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$4));\n\n for (var _i = 0, _len = buttons.length; _i < _len; _i++) {\n var _button = buttons[_i];\n\n if (_button.getAttribute('aria-pressed') === 'true') {\n _button.classList.add(CLASS_NAME_ACTIVE$3);\n } else {\n _button.classList.remove(CLASS_NAME_ACTIVE$3);\n }\n }\n });\n /**\n * jQuery\n */\n\n $__default[\"default\"].fn[NAME$9] = Button._jQueryInterface;\n $__default[\"default\"].fn[NAME$9].Constructor = Button;\n\n $__default[\"default\"].fn[NAME$9].noConflict = function () {\n $__default[\"default\"].fn[NAME$9] = JQUERY_NO_CONFLICT$9;\n return Button._jQueryInterface;\n };\n\n /**\n * Constants\n */\n\n var NAME$8 = 'carousel';\n var VERSION$8 = '4.6.2';\n var DATA_KEY$8 = 'bs.carousel';\n var EVENT_KEY$8 = \".\" + DATA_KEY$8;\n var DATA_API_KEY$5 = '.data-api';\n var JQUERY_NO_CONFLICT$8 = $__default[\"default\"].fn[NAME$8];\n var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\n\n var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\n\n var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n var SWIPE_THRESHOLD = 40;\n var CLASS_NAME_CAROUSEL = 'carousel';\n var CLASS_NAME_ACTIVE$2 = 'active';\n var CLASS_NAME_SLIDE = 'slide';\n var CLASS_NAME_RIGHT = 'carousel-item-right';\n var CLASS_NAME_LEFT = 'carousel-item-left';\n var CLASS_NAME_NEXT = 'carousel-item-next';\n var CLASS_NAME_PREV = 'carousel-item-prev';\n var CLASS_NAME_POINTER_EVENT = 'pointer-event';\n var DIRECTION_NEXT = 'next';\n var DIRECTION_PREV = 'prev';\n var DIRECTION_LEFT = 'left';\n var DIRECTION_RIGHT = 'right';\n var EVENT_SLIDE = \"slide\" + EVENT_KEY$8;\n var EVENT_SLID = \"slid\" + EVENT_KEY$8;\n var EVENT_KEYDOWN = \"keydown\" + EVENT_KEY$8;\n var EVENT_MOUSEENTER = \"mouseenter\" + EVENT_KEY$8;\n var EVENT_MOUSELEAVE = \"mouseleave\" + EVENT_KEY$8;\n var EVENT_TOUCHSTART = \"touchstart\" + EVENT_KEY$8;\n var EVENT_TOUCHMOVE = \"touchmove\" + EVENT_KEY$8;\n var EVENT_TOUCHEND = \"touchend\" + EVENT_KEY$8;\n var EVENT_POINTERDOWN = \"pointerdown\" + EVENT_KEY$8;\n var EVENT_POINTERUP = \"pointerup\" + EVENT_KEY$8;\n var EVENT_DRAG_START = \"dragstart\" + EVENT_KEY$8;\n var EVENT_LOAD_DATA_API$1 = \"load\" + EVENT_KEY$8 + DATA_API_KEY$5;\n var EVENT_CLICK_DATA_API$4 = \"click\" + EVENT_KEY$8 + DATA_API_KEY$5;\n var SELECTOR_ACTIVE$1 = '.active';\n var SELECTOR_ACTIVE_ITEM = '.active.carousel-item';\n var SELECTOR_ITEM = '.carousel-item';\n var SELECTOR_ITEM_IMG = '.carousel-item img';\n var SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev';\n var SELECTOR_INDICATORS = '.carousel-indicators';\n var SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]';\n var SELECTOR_DATA_RIDE = '[data-ride=\"carousel\"]';\n var Default$7 = {\n interval: 5000,\n keyboard: true,\n slide: false,\n pause: 'hover',\n wrap: true,\n touch: true\n };\n var DefaultType$7 = {\n interval: '(number|boolean)',\n keyboard: 'boolean',\n slide: '(boolean|string)',\n pause: '(string|boolean)',\n wrap: 'boolean',\n touch: 'boolean'\n };\n var PointerType = {\n TOUCH: 'touch',\n PEN: 'pen'\n };\n /**\n * Class definition\n */\n\n var Carousel = /*#__PURE__*/function () {\n function Carousel(element, config) {\n this._items = null;\n this._interval = null;\n this._activeElement = null;\n this._isPaused = false;\n this._isSliding = false;\n this.touchTimeout = null;\n this.touchStartX = 0;\n this.touchDeltaX = 0;\n this._config = this._getConfig(config);\n this._element = element;\n this._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS);\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);\n\n this._addEventListeners();\n } // Getters\n\n\n var _proto = Carousel.prototype;\n\n // Public\n _proto.next = function next() {\n if (!this._isSliding) {\n this._slide(DIRECTION_NEXT);\n }\n };\n\n _proto.nextWhenVisible = function nextWhenVisible() {\n var $element = $__default[\"default\"](this._element); // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n\n if (!document.hidden && $element.is(':visible') && $element.css('visibility') !== 'hidden') {\n this.next();\n }\n };\n\n _proto.prev = function prev() {\n if (!this._isSliding) {\n this._slide(DIRECTION_PREV);\n }\n };\n\n _proto.pause = function pause(event) {\n if (!event) {\n this._isPaused = true;\n }\n\n if (this._element.querySelector(SELECTOR_NEXT_PREV)) {\n Util.triggerTransitionEnd(this._element);\n this.cycle(true);\n }\n\n clearInterval(this._interval);\n this._interval = null;\n };\n\n _proto.cycle = function cycle(event) {\n if (!event) {\n this._isPaused = false;\n }\n\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n\n if (this._config.interval && !this._isPaused) {\n this._updateInterval();\n\n this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n }\n };\n\n _proto.to = function to(index) {\n var _this = this;\n\n this._activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM);\n\n var activeIndex = this._getItemIndex(this._activeElement);\n\n if (index > this._items.length - 1 || index < 0) {\n return;\n }\n\n if (this._isSliding) {\n $__default[\"default\"](this._element).one(EVENT_SLID, function () {\n return _this.to(index);\n });\n return;\n }\n\n if (activeIndex === index) {\n this.pause();\n this.cycle();\n return;\n }\n\n var direction = index > activeIndex ? DIRECTION_NEXT : DIRECTION_PREV;\n\n this._slide(direction, this._items[index]);\n };\n\n _proto.dispose = function dispose() {\n $__default[\"default\"](this._element).off(EVENT_KEY$8);\n $__default[\"default\"].removeData(this._element, DATA_KEY$8);\n this._items = null;\n this._config = null;\n this._element = null;\n this._interval = null;\n this._isPaused = null;\n this._isSliding = null;\n this._activeElement = null;\n this._indicatorsElement = null;\n } // Private\n ;\n\n _proto._getConfig = function _getConfig(config) {\n config = _extends({}, Default$7, config);\n Util.typeCheckConfig(NAME$8, config, DefaultType$7);\n return config;\n };\n\n _proto._handleSwipe = function _handleSwipe() {\n var absDeltax = Math.abs(this.touchDeltaX);\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return;\n }\n\n var direction = absDeltax / this.touchDeltaX;\n this.touchDeltaX = 0; // swipe left\n\n if (direction > 0) {\n this.prev();\n } // swipe right\n\n\n if (direction < 0) {\n this.next();\n }\n };\n\n _proto._addEventListeners = function _addEventListeners() {\n var _this2 = this;\n\n if (this._config.keyboard) {\n $__default[\"default\"](this._element).on(EVENT_KEYDOWN, function (event) {\n return _this2._keydown(event);\n });\n }\n\n if (this._config.pause === 'hover') {\n $__default[\"default\"](this._element).on(EVENT_MOUSEENTER, function (event) {\n return _this2.pause(event);\n }).on(EVENT_MOUSELEAVE, function (event) {\n return _this2.cycle(event);\n });\n }\n\n if (this._config.touch) {\n this._addTouchEventListeners();\n }\n };\n\n _proto._addTouchEventListeners = function _addTouchEventListeners() {\n var _this3 = this;\n\n if (!this._touchSupported) {\n return;\n }\n\n var start = function start(event) {\n if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n _this3.touchStartX = event.originalEvent.clientX;\n } else if (!_this3._pointerEvent) {\n _this3.touchStartX = event.originalEvent.touches[0].clientX;\n }\n };\n\n var move = function move(event) {\n // ensure swiping with one touch and not pinching\n _this3.touchDeltaX = event.originalEvent.touches && event.originalEvent.touches.length > 1 ? 0 : event.originalEvent.touches[0].clientX - _this3.touchStartX;\n };\n\n var end = function end(event) {\n if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;\n }\n\n _this3._handleSwipe();\n\n if (_this3._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n _this3.pause();\n\n if (_this3.touchTimeout) {\n clearTimeout(_this3.touchTimeout);\n }\n\n _this3.touchTimeout = setTimeout(function (event) {\n return _this3.cycle(event);\n }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);\n }\n };\n\n $__default[\"default\"](this._element.querySelectorAll(SELECTOR_ITEM_IMG)).on(EVENT_DRAG_START, function (e) {\n return e.preventDefault();\n });\n\n if (this._pointerEvent) {\n $__default[\"default\"](this._element).on(EVENT_POINTERDOWN, function (event) {\n return start(event);\n });\n $__default[\"default\"](this._element).on(EVENT_POINTERUP, function (event) {\n return end(event);\n });\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n } else {\n $__default[\"default\"](this._element).on(EVENT_TOUCHSTART, function (event) {\n return start(event);\n });\n $__default[\"default\"](this._element).on(EVENT_TOUCHMOVE, function (event) {\n return move(event);\n });\n $__default[\"default\"](this._element).on(EVENT_TOUCHEND, function (event) {\n return end(event);\n });\n }\n };\n\n _proto._keydown = function _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return;\n }\n\n switch (event.which) {\n case ARROW_LEFT_KEYCODE:\n event.preventDefault();\n this.prev();\n break;\n\n case ARROW_RIGHT_KEYCODE:\n event.preventDefault();\n this.next();\n break;\n }\n };\n\n _proto._getItemIndex = function _getItemIndex(element) {\n this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) : [];\n return this._items.indexOf(element);\n };\n\n _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {\n var isNextDirection = direction === DIRECTION_NEXT;\n var isPrevDirection = direction === DIRECTION_PREV;\n\n var activeIndex = this._getItemIndex(activeElement);\n\n var lastItemIndex = this._items.length - 1;\n var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\n\n if (isGoingToWrap && !this._config.wrap) {\n return activeElement;\n }\n\n var delta = direction === DIRECTION_PREV ? -1 : 1;\n var itemIndex = (activeIndex + delta) % this._items.length;\n return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\n };\n\n _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {\n var targetIndex = this._getItemIndex(relatedTarget);\n\n var fromIndex = this._getItemIndex(this._element.querySelector(SELECTOR_ACTIVE_ITEM));\n\n var slideEvent = $__default[\"default\"].Event(EVENT_SLIDE, {\n relatedTarget: relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n });\n $__default[\"default\"](this._element).trigger(slideEvent);\n return slideEvent;\n };\n\n _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(SELECTOR_ACTIVE$1));\n $__default[\"default\"](indicators).removeClass(CLASS_NAME_ACTIVE$2);\n\n var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\n\n if (nextIndicator) {\n $__default[\"default\"](nextIndicator).addClass(CLASS_NAME_ACTIVE$2);\n }\n }\n };\n\n _proto._updateInterval = function _updateInterval() {\n var element = this._activeElement || this._element.querySelector(SELECTOR_ACTIVE_ITEM);\n\n if (!element) {\n return;\n }\n\n var elementInterval = parseInt(element.getAttribute('data-interval'), 10);\n\n if (elementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval;\n this._config.interval = elementInterval;\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval;\n }\n };\n\n _proto._slide = function _slide(direction, element) {\n var _this4 = this;\n\n var activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM);\n\n var activeElementIndex = this._getItemIndex(activeElement);\n\n var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\n\n var nextElementIndex = this._getItemIndex(nextElement);\n\n var isCycling = Boolean(this._interval);\n var directionalClassName;\n var orderClassName;\n var eventDirectionName;\n\n if (direction === DIRECTION_NEXT) {\n directionalClassName = CLASS_NAME_LEFT;\n orderClassName = CLASS_NAME_NEXT;\n eventDirectionName = DIRECTION_LEFT;\n } else {\n directionalClassName = CLASS_NAME_RIGHT;\n orderClassName = CLASS_NAME_PREV;\n eventDirectionName = DIRECTION_RIGHT;\n }\n\n if (nextElement && $__default[\"default\"](nextElement).hasClass(CLASS_NAME_ACTIVE$2)) {\n this._isSliding = false;\n return;\n }\n\n var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n if (slideEvent.isDefaultPrevented()) {\n return;\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return;\n }\n\n this._isSliding = true;\n\n if (isCycling) {\n this.pause();\n }\n\n this._setActiveIndicatorElement(nextElement);\n\n this._activeElement = nextElement;\n var slidEvent = $__default[\"default\"].Event(EVENT_SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n });\n\n if ($__default[\"default\"](this._element).hasClass(CLASS_NAME_SLIDE)) {\n $__default[\"default\"](nextElement).addClass(orderClassName);\n Util.reflow(nextElement);\n $__default[\"default\"](activeElement).addClass(directionalClassName);\n $__default[\"default\"](nextElement).addClass(directionalClassName);\n var transitionDuration = Util.getTransitionDurationFromElement(activeElement);\n $__default[\"default\"](activeElement).one(Util.TRANSITION_END, function () {\n $__default[\"default\"](nextElement).removeClass(directionalClassName + \" \" + orderClassName).addClass(CLASS_NAME_ACTIVE$2);\n $__default[\"default\"](activeElement).removeClass(CLASS_NAME_ACTIVE$2 + \" \" + orderClassName + \" \" + directionalClassName);\n _this4._isSliding = false;\n setTimeout(function () {\n return $__default[\"default\"](_this4._element).trigger(slidEvent);\n }, 0);\n }).emulateTransitionEnd(transitionDuration);\n } else {\n $__default[\"default\"](activeElement).removeClass(CLASS_NAME_ACTIVE$2);\n $__default[\"default\"](nextElement).addClass(CLASS_NAME_ACTIVE$2);\n this._isSliding = false;\n $__default[\"default\"](this._element).trigger(slidEvent);\n }\n\n if (isCycling) {\n this.cycle();\n }\n } // Static\n ;\n\n Carousel._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $__default[\"default\"](this).data(DATA_KEY$8);\n\n var _config = _extends({}, Default$7, $__default[\"default\"](this).data());\n\n if (typeof config === 'object') {\n _config = _extends({}, _config, config);\n }\n\n var action = typeof config === 'string' ? config : _config.slide;\n\n if (!data) {\n data = new Carousel(this, _config);\n $__default[\"default\"](this).data(DATA_KEY$8, data);\n }\n\n if (typeof config === 'number') {\n data.to(config);\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + action + \"\\\"\");\n }\n\n data[action]();\n } else if (_config.interval && _config.ride) {\n data.pause();\n data.cycle();\n }\n });\n };\n\n Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\n var selector = Util.getSelectorFromElement(this);\n\n if (!selector) {\n return;\n }\n\n var target = $__default[\"default\"](selector)[0];\n\n if (!target || !$__default[\"default\"](target).hasClass(CLASS_NAME_CAROUSEL)) {\n return;\n }\n\n var config = _extends({}, $__default[\"default\"](target).data(), $__default[\"default\"](this).data());\n\n var slideIndex = this.getAttribute('data-slide-to');\n\n if (slideIndex) {\n config.interval = false;\n }\n\n Carousel._jQueryInterface.call($__default[\"default\"](target), config);\n\n if (slideIndex) {\n $__default[\"default\"](target).data(DATA_KEY$8).to(slideIndex);\n }\n\n event.preventDefault();\n };\n\n _createClass(Carousel, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION$8;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default$7;\n }\n }]);\n\n return Carousel;\n }();\n /**\n * Data API implementation\n */\n\n\n $__default[\"default\"](document).on(EVENT_CLICK_DATA_API$4, SELECTOR_DATA_SLIDE, Carousel._dataApiClickHandler);\n $__default[\"default\"](window).on(EVENT_LOAD_DATA_API$1, function () {\n var carousels = [].slice.call(document.querySelectorAll(SELECTOR_DATA_RIDE));\n\n for (var i = 0, len = carousels.length; i < len; i++) {\n var $carousel = $__default[\"default\"](carousels[i]);\n\n Carousel._jQueryInterface.call($carousel, $carousel.data());\n }\n });\n /**\n * jQuery\n */\n\n $__default[\"default\"].fn[NAME$8] = Carousel._jQueryInterface;\n $__default[\"default\"].fn[NAME$8].Constructor = Carousel;\n\n $__default[\"default\"].fn[NAME$8].noConflict = function () {\n $__default[\"default\"].fn[NAME$8] = JQUERY_NO_CONFLICT$8;\n return Carousel._jQueryInterface;\n };\n\n /**\n * Constants\n */\n\n var NAME$7 = 'collapse';\n var VERSION$7 = '4.6.2';\n var DATA_KEY$7 = 'bs.collapse';\n var EVENT_KEY$7 = \".\" + DATA_KEY$7;\n var DATA_API_KEY$4 = '.data-api';\n var JQUERY_NO_CONFLICT$7 = $__default[\"default\"].fn[NAME$7];\n var CLASS_NAME_SHOW$6 = 'show';\n var CLASS_NAME_COLLAPSE = 'collapse';\n var CLASS_NAME_COLLAPSING = 'collapsing';\n var CLASS_NAME_COLLAPSED = 'collapsed';\n var DIMENSION_WIDTH = 'width';\n var DIMENSION_HEIGHT = 'height';\n var EVENT_SHOW$4 = \"show\" + EVENT_KEY$7;\n var EVENT_SHOWN$4 = \"shown\" + EVENT_KEY$7;\n var EVENT_HIDE$4 = \"hide\" + EVENT_KEY$7;\n var EVENT_HIDDEN$4 = \"hidden\" + EVENT_KEY$7;\n var EVENT_CLICK_DATA_API$3 = \"click\" + EVENT_KEY$7 + DATA_API_KEY$4;\n var SELECTOR_ACTIVES = '.show, .collapsing';\n var SELECTOR_DATA_TOGGLE$3 = '[data-toggle=\"collapse\"]';\n var Default$6 = {\n toggle: true,\n parent: ''\n };\n var DefaultType$6 = {\n toggle: 'boolean',\n parent: '(string|element)'\n };\n /**\n * Class definition\n */\n\n var Collapse = /*#__PURE__*/function () {\n function Collapse(element, config) {\n this._isTransitioning = false;\n this._element = element;\n this._config = this._getConfig(config);\n this._triggerArray = [].slice.call(document.querySelectorAll(\"[data-toggle=\\\"collapse\\\"][href=\\\"#\" + element.id + \"\\\"],\" + (\"[data-toggle=\\\"collapse\\\"][data-target=\\\"#\" + element.id + \"\\\"]\")));\n var toggleList = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$3));\n\n for (var i = 0, len = toggleList.length; i < len; i++) {\n var elem = toggleList[i];\n var selector = Util.getSelectorFromElement(elem);\n var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {\n return foundElem === element;\n });\n\n if (selector !== null && filterElement.length > 0) {\n this._selector = selector;\n\n this._triggerArray.push(elem);\n }\n }\n\n this._parent = this._config.parent ? this._getParent() : null;\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._element, this._triggerArray);\n }\n\n if (this._config.toggle) {\n this.toggle();\n }\n } // Getters\n\n\n var _proto = Collapse.prototype;\n\n // Public\n _proto.toggle = function toggle() {\n if ($__default[\"default\"](this._element).hasClass(CLASS_NAME_SHOW$6)) {\n this.hide();\n } else {\n this.show();\n }\n };\n\n _proto.show = function show() {\n var _this = this;\n\n if (this._isTransitioning || $__default[\"default\"](this._element).hasClass(CLASS_NAME_SHOW$6)) {\n return;\n }\n\n var actives;\n var activesData;\n\n if (this._parent) {\n actives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES)).filter(function (elem) {\n if (typeof _this._config.parent === 'string') {\n return elem.getAttribute('data-parent') === _this._config.parent;\n }\n\n return elem.classList.contains(CLASS_NAME_COLLAPSE);\n });\n\n if (actives.length === 0) {\n actives = null;\n }\n }\n\n if (actives) {\n activesData = $__default[\"default\"](actives).not(this._selector).data(DATA_KEY$7);\n\n if (activesData && activesData._isTransitioning) {\n return;\n }\n }\n\n var startEvent = $__default[\"default\"].Event(EVENT_SHOW$4);\n $__default[\"default\"](this._element).trigger(startEvent);\n\n if (startEvent.isDefaultPrevented()) {\n return;\n }\n\n if (actives) {\n Collapse._jQueryInterface.call($__default[\"default\"](actives).not(this._selector), 'hide');\n\n if (!activesData) {\n $__default[\"default\"](actives).data(DATA_KEY$7, null);\n }\n }\n\n var dimension = this._getDimension();\n\n $__default[\"default\"](this._element).removeClass(CLASS_NAME_COLLAPSE).addClass(CLASS_NAME_COLLAPSING);\n this._element.style[dimension] = 0;\n\n if (this._triggerArray.length) {\n $__default[\"default\"](this._triggerArray).removeClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', true);\n }\n\n this.setTransitioning(true);\n\n var complete = function complete() {\n $__default[\"default\"](_this._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE + \" \" + CLASS_NAME_SHOW$6);\n _this._element.style[dimension] = '';\n\n _this.setTransitioning(false);\n\n $__default[\"default\"](_this._element).trigger(EVENT_SHOWN$4);\n };\n\n var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n var scrollSize = \"scroll\" + capitalizedDimension;\n var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n $__default[\"default\"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n this._element.style[dimension] = this._element[scrollSize] + \"px\";\n };\n\n _proto.hide = function hide() {\n var _this2 = this;\n\n if (this._isTransitioning || !$__default[\"default\"](this._element).hasClass(CLASS_NAME_SHOW$6)) {\n return;\n }\n\n var startEvent = $__default[\"default\"].Event(EVENT_HIDE$4);\n $__default[\"default\"](this._element).trigger(startEvent);\n\n if (startEvent.isDefaultPrevented()) {\n return;\n }\n\n var dimension = this._getDimension();\n\n this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + \"px\";\n Util.reflow(this._element);\n $__default[\"default\"](this._element).addClass(CLASS_NAME_COLLAPSING).removeClass(CLASS_NAME_COLLAPSE + \" \" + CLASS_NAME_SHOW$6);\n var triggerArrayLength = this._triggerArray.length;\n\n if (triggerArrayLength > 0) {\n for (var i = 0; i < triggerArrayLength; i++) {\n var trigger = this._triggerArray[i];\n var selector = Util.getSelectorFromElement(trigger);\n\n if (selector !== null) {\n var $elem = $__default[\"default\"]([].slice.call(document.querySelectorAll(selector)));\n\n if (!$elem.hasClass(CLASS_NAME_SHOW$6)) {\n $__default[\"default\"](trigger).addClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', false);\n }\n }\n }\n }\n\n this.setTransitioning(true);\n\n var complete = function complete() {\n _this2.setTransitioning(false);\n\n $__default[\"default\"](_this2._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE).trigger(EVENT_HIDDEN$4);\n };\n\n this._element.style[dimension] = '';\n var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n $__default[\"default\"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n };\n\n _proto.setTransitioning = function setTransitioning(isTransitioning) {\n this._isTransitioning = isTransitioning;\n };\n\n _proto.dispose = function dispose() {\n $__default[\"default\"].removeData(this._element, DATA_KEY$7);\n this._config = null;\n this._parent = null;\n this._element = null;\n this._triggerArray = null;\n this._isTransitioning = null;\n } // Private\n ;\n\n _proto._getConfig = function _getConfig(config) {\n config = _extends({}, Default$6, config);\n config.toggle = Boolean(config.toggle); // Coerce string values\n\n Util.typeCheckConfig(NAME$7, config, DefaultType$6);\n return config;\n };\n\n _proto._getDimension = function _getDimension() {\n var hasWidth = $__default[\"default\"](this._element).hasClass(DIMENSION_WIDTH);\n return hasWidth ? DIMENSION_WIDTH : DIMENSION_HEIGHT;\n };\n\n _proto._getParent = function _getParent() {\n var _this3 = this;\n\n var parent;\n\n if (Util.isElement(this._config.parent)) {\n parent = this._config.parent; // It's a jQuery object\n\n if (typeof this._config.parent.jquery !== 'undefined') {\n parent = this._config.parent[0];\n }\n } else {\n parent = document.querySelector(this._config.parent);\n }\n\n var selector = \"[data-toggle=\\\"collapse\\\"][data-parent=\\\"\" + this._config.parent + \"\\\"]\";\n var children = [].slice.call(parent.querySelectorAll(selector));\n $__default[\"default\"](children).each(function (i, element) {\n _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\n });\n return parent;\n };\n\n _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\n var isOpen = $__default[\"default\"](element).hasClass(CLASS_NAME_SHOW$6);\n\n if (triggerArray.length) {\n $__default[\"default\"](triggerArray).toggleClass(CLASS_NAME_COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\n }\n } // Static\n ;\n\n Collapse._getTargetFromElement = function _getTargetFromElement(element) {\n var selector = Util.getSelectorFromElement(element);\n return selector ? document.querySelector(selector) : null;\n };\n\n Collapse._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var $element = $__default[\"default\"](this);\n var data = $element.data(DATA_KEY$7);\n\n var _config = _extends({}, Default$6, $element.data(), typeof config === 'object' && config ? config : {});\n\n if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false;\n }\n\n if (!data) {\n data = new Collapse(this, _config);\n $element.data(DATA_KEY$7, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n _createClass(Collapse, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION$7;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default$6;\n }\n }]);\n\n return Collapse;\n }();\n /**\n * Data API implementation\n */\n\n\n $__default[\"default\"](document).on(EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.currentTarget.tagName === 'A') {\n event.preventDefault();\n }\n\n var $trigger = $__default[\"default\"](this);\n var selector = Util.getSelectorFromElement(this);\n var selectors = [].slice.call(document.querySelectorAll(selector));\n $__default[\"default\"](selectors).each(function () {\n var $target = $__default[\"default\"](this);\n var data = $target.data(DATA_KEY$7);\n var config = data ? 'toggle' : $trigger.data();\n\n Collapse._jQueryInterface.call($target, config);\n });\n });\n /**\n * jQuery\n */\n\n $__default[\"default\"].fn[NAME$7] = Collapse._jQueryInterface;\n $__default[\"default\"].fn[NAME$7].Constructor = Collapse;\n\n $__default[\"default\"].fn[NAME$7].noConflict = function () {\n $__default[\"default\"].fn[NAME$7] = JQUERY_NO_CONFLICT$7;\n return Collapse._jQueryInterface;\n };\n\n /**\n * Constants\n */\n\n var NAME$6 = 'dropdown';\n var VERSION$6 = '4.6.2';\n var DATA_KEY$6 = 'bs.dropdown';\n var EVENT_KEY$6 = \".\" + DATA_KEY$6;\n var DATA_API_KEY$3 = '.data-api';\n var JQUERY_NO_CONFLICT$6 = $__default[\"default\"].fn[NAME$6];\n var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key\n\n var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key\n\n var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\n\n var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\n\n var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\n\n var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + \"|\" + ARROW_DOWN_KEYCODE + \"|\" + ESCAPE_KEYCODE$1);\n var CLASS_NAME_DISABLED$1 = 'disabled';\n var CLASS_NAME_SHOW$5 = 'show';\n var CLASS_NAME_DROPUP = 'dropup';\n var CLASS_NAME_DROPRIGHT = 'dropright';\n var CLASS_NAME_DROPLEFT = 'dropleft';\n var CLASS_NAME_MENURIGHT = 'dropdown-menu-right';\n var CLASS_NAME_POSITION_STATIC = 'position-static';\n var EVENT_HIDE$3 = \"hide\" + EVENT_KEY$6;\n var EVENT_HIDDEN$3 = \"hidden\" + EVENT_KEY$6;\n var EVENT_SHOW$3 = \"show\" + EVENT_KEY$6;\n var EVENT_SHOWN$3 = \"shown\" + EVENT_KEY$6;\n var EVENT_CLICK = \"click\" + EVENT_KEY$6;\n var EVENT_CLICK_DATA_API$2 = \"click\" + EVENT_KEY$6 + DATA_API_KEY$3;\n var EVENT_KEYDOWN_DATA_API = \"keydown\" + EVENT_KEY$6 + DATA_API_KEY$3;\n var EVENT_KEYUP_DATA_API = \"keyup\" + EVENT_KEY$6 + DATA_API_KEY$3;\n var SELECTOR_DATA_TOGGLE$2 = '[data-toggle=\"dropdown\"]';\n var SELECTOR_FORM_CHILD = '.dropdown form';\n var SELECTOR_MENU = '.dropdown-menu';\n var SELECTOR_NAVBAR_NAV = '.navbar-nav';\n var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\n var PLACEMENT_TOP = 'top-start';\n var PLACEMENT_TOPEND = 'top-end';\n var PLACEMENT_BOTTOM = 'bottom-start';\n var PLACEMENT_BOTTOMEND = 'bottom-end';\n var PLACEMENT_RIGHT = 'right-start';\n var PLACEMENT_LEFT = 'left-start';\n var Default$5 = {\n offset: 0,\n flip: true,\n boundary: 'scrollParent',\n reference: 'toggle',\n display: 'dynamic',\n popperConfig: null\n };\n var DefaultType$5 = {\n offset: '(number|string|function)',\n flip: 'boolean',\n boundary: '(string|element)',\n reference: '(string|element)',\n display: 'string',\n popperConfig: '(null|object)'\n };\n /**\n * Class definition\n */\n\n var Dropdown = /*#__PURE__*/function () {\n function Dropdown(element, config) {\n this._element = element;\n this._popper = null;\n this._config = this._getConfig(config);\n this._menu = this._getMenuElement();\n this._inNavbar = this._detectNavbar();\n\n this._addEventListeners();\n } // Getters\n\n\n var _proto = Dropdown.prototype;\n\n // Public\n _proto.toggle = function toggle() {\n if (this._element.disabled || $__default[\"default\"](this._element).hasClass(CLASS_NAME_DISABLED$1)) {\n return;\n }\n\n var isActive = $__default[\"default\"](this._menu).hasClass(CLASS_NAME_SHOW$5);\n\n Dropdown._clearMenus();\n\n if (isActive) {\n return;\n }\n\n this.show(true);\n };\n\n _proto.show = function show(usePopper) {\n if (usePopper === void 0) {\n usePopper = false;\n }\n\n if (this._element.disabled || $__default[\"default\"](this._element).hasClass(CLASS_NAME_DISABLED$1) || $__default[\"default\"](this._menu).hasClass(CLASS_NAME_SHOW$5)) {\n return;\n }\n\n var relatedTarget = {\n relatedTarget: this._element\n };\n var showEvent = $__default[\"default\"].Event(EVENT_SHOW$3, relatedTarget);\n\n var parent = Dropdown._getParentFromElement(this._element);\n\n $__default[\"default\"](parent).trigger(showEvent);\n\n if (showEvent.isDefaultPrevented()) {\n return;\n } // Totally disable Popper for Dropdowns in Navbar\n\n\n if (!this._inNavbar && usePopper) {\n // Check for Popper dependency\n if (typeof Popper__default[\"default\"] === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n }\n\n var referenceElement = this._element;\n\n if (this._config.reference === 'parent') {\n referenceElement = parent;\n } else if (Util.isElement(this._config.reference)) {\n referenceElement = this._config.reference; // Check if it's jQuery element\n\n if (typeof this._config.reference.jquery !== 'undefined') {\n referenceElement = this._config.reference[0];\n }\n } // If boundary is not `scrollParent`, then set position to `static`\n // to allow the menu to \"escape\" the scroll parent's boundaries\n // https://github.com/twbs/bootstrap/issues/24251\n\n\n if (this._config.boundary !== 'scrollParent') {\n $__default[\"default\"](parent).addClass(CLASS_NAME_POSITION_STATIC);\n }\n\n this._popper = new Popper__default[\"default\"](referenceElement, this._menu, this._getPopperConfig());\n } // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n if ('ontouchstart' in document.documentElement && $__default[\"default\"](parent).closest(SELECTOR_NAVBAR_NAV).length === 0) {\n $__default[\"default\"](document.body).children().on('mouseover', null, $__default[\"default\"].noop);\n }\n\n this._element.focus();\n\n this._element.setAttribute('aria-expanded', true);\n\n $__default[\"default\"](this._menu).toggleClass(CLASS_NAME_SHOW$5);\n $__default[\"default\"](parent).toggleClass(CLASS_NAME_SHOW$5).trigger($__default[\"default\"].Event(EVENT_SHOWN$3, relatedTarget));\n };\n\n _proto.hide = function hide() {\n if (this._element.disabled || $__default[\"default\"](this._element).hasClass(CLASS_NAME_DISABLED$1) || !$__default[\"default\"](this._menu).hasClass(CLASS_NAME_SHOW$5)) {\n return;\n }\n\n var relatedTarget = {\n relatedTarget: this._element\n };\n var hideEvent = $__default[\"default\"].Event(EVENT_HIDE$3, relatedTarget);\n\n var parent = Dropdown._getParentFromElement(this._element);\n\n $__default[\"default\"](parent).trigger(hideEvent);\n\n if (hideEvent.isDefaultPrevented()) {\n return;\n }\n\n if (this._popper) {\n this._popper.destroy();\n }\n\n $__default[\"default\"](this._menu).toggleClass(CLASS_NAME_SHOW$5);\n $__default[\"default\"](parent).toggleClass(CLASS_NAME_SHOW$5).trigger($__default[\"default\"].Event(EVENT_HIDDEN$3, relatedTarget));\n };\n\n _proto.dispose = function dispose() {\n $__default[\"default\"].removeData(this._element, DATA_KEY$6);\n $__default[\"default\"](this._element).off(EVENT_KEY$6);\n this._element = null;\n this._menu = null;\n\n if (this._popper !== null) {\n this._popper.destroy();\n\n this._popper = null;\n }\n };\n\n _proto.update = function update() {\n this._inNavbar = this._detectNavbar();\n\n if (this._popper !== null) {\n this._popper.scheduleUpdate();\n }\n } // Private\n ;\n\n _proto._addEventListeners = function _addEventListeners() {\n var _this = this;\n\n $__default[\"default\"](this._element).on(EVENT_CLICK, function (event) {\n event.preventDefault();\n event.stopPropagation();\n\n _this.toggle();\n });\n };\n\n _proto._getConfig = function _getConfig(config) {\n config = _extends({}, this.constructor.Default, $__default[\"default\"](this._element).data(), config);\n Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType);\n return config;\n };\n\n _proto._getMenuElement = function _getMenuElement() {\n if (!this._menu) {\n var parent = Dropdown._getParentFromElement(this._element);\n\n if (parent) {\n this._menu = parent.querySelector(SELECTOR_MENU);\n }\n }\n\n return this._menu;\n };\n\n _proto._getPlacement = function _getPlacement() {\n var $parentDropdown = $__default[\"default\"](this._element.parentNode);\n var placement = PLACEMENT_BOTTOM; // Handle dropup\n\n if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) {\n placement = $__default[\"default\"](this._menu).hasClass(CLASS_NAME_MENURIGHT) ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n } else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) {\n placement = PLACEMENT_RIGHT;\n } else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) {\n placement = PLACEMENT_LEFT;\n } else if ($__default[\"default\"](this._menu).hasClass(CLASS_NAME_MENURIGHT)) {\n placement = PLACEMENT_BOTTOMEND;\n }\n\n return placement;\n };\n\n _proto._detectNavbar = function _detectNavbar() {\n return $__default[\"default\"](this._element).closest('.navbar').length > 0;\n };\n\n _proto._getOffset = function _getOffset() {\n var _this2 = this;\n\n var offset = {};\n\n if (typeof this._config.offset === 'function') {\n offset.fn = function (data) {\n data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets, _this2._element));\n return data;\n };\n } else {\n offset.offset = this._config.offset;\n }\n\n return offset;\n };\n\n _proto._getPopperConfig = function _getPopperConfig() {\n var popperConfig = {\n placement: this._getPlacement(),\n modifiers: {\n offset: this._getOffset(),\n flip: {\n enabled: this._config.flip\n },\n preventOverflow: {\n boundariesElement: this._config.boundary\n }\n }\n }; // Disable Popper if we have a static display\n\n if (this._config.display === 'static') {\n popperConfig.modifiers.applyStyle = {\n enabled: false\n };\n }\n\n return _extends({}, popperConfig, this._config.popperConfig);\n } // Static\n ;\n\n Dropdown._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $__default[\"default\"](this).data(DATA_KEY$6);\n\n var _config = typeof config === 'object' ? config : null;\n\n if (!data) {\n data = new Dropdown(this, _config);\n $__default[\"default\"](this).data(DATA_KEY$6, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n Dropdown._clearMenus = function _clearMenus(event) {\n if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n return;\n }\n\n var toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$2));\n\n for (var i = 0, len = toggles.length; i < len; i++) {\n var parent = Dropdown._getParentFromElement(toggles[i]);\n\n var context = $__default[\"default\"](toggles[i]).data(DATA_KEY$6);\n var relatedTarget = {\n relatedTarget: toggles[i]\n };\n\n if (event && event.type === 'click') {\n relatedTarget.clickEvent = event;\n }\n\n if (!context) {\n continue;\n }\n\n var dropdownMenu = context._menu;\n\n if (!$__default[\"default\"](parent).hasClass(CLASS_NAME_SHOW$5)) {\n continue;\n }\n\n if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $__default[\"default\"].contains(parent, event.target)) {\n continue;\n }\n\n var hideEvent = $__default[\"default\"].Event(EVENT_HIDE$3, relatedTarget);\n $__default[\"default\"](parent).trigger(hideEvent);\n\n if (hideEvent.isDefaultPrevented()) {\n continue;\n } // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n\n\n if ('ontouchstart' in document.documentElement) {\n $__default[\"default\"](document.body).children().off('mouseover', null, $__default[\"default\"].noop);\n }\n\n toggles[i].setAttribute('aria-expanded', 'false');\n\n if (context._popper) {\n context._popper.destroy();\n }\n\n $__default[\"default\"](dropdownMenu).removeClass(CLASS_NAME_SHOW$5);\n $__default[\"default\"](parent).removeClass(CLASS_NAME_SHOW$5).trigger($__default[\"default\"].Event(EVENT_HIDDEN$3, relatedTarget));\n }\n };\n\n Dropdown._getParentFromElement = function _getParentFromElement(element) {\n var parent;\n var selector = Util.getSelectorFromElement(element);\n\n if (selector) {\n parent = document.querySelector(selector);\n }\n\n return parent || element.parentNode;\n } // eslint-disable-next-line complexity\n ;\n\n Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE$1 && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $__default[\"default\"](event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n return;\n }\n\n if (this.disabled || $__default[\"default\"](this).hasClass(CLASS_NAME_DISABLED$1)) {\n return;\n }\n\n var parent = Dropdown._getParentFromElement(this);\n\n var isActive = $__default[\"default\"](parent).hasClass(CLASS_NAME_SHOW$5);\n\n if (!isActive && event.which === ESCAPE_KEYCODE$1) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n if (!isActive || event.which === ESCAPE_KEYCODE$1 || event.which === SPACE_KEYCODE) {\n if (event.which === ESCAPE_KEYCODE$1) {\n $__default[\"default\"](parent.querySelector(SELECTOR_DATA_TOGGLE$2)).trigger('focus');\n }\n\n $__default[\"default\"](this).trigger('click');\n return;\n }\n\n var items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS)).filter(function (item) {\n return $__default[\"default\"](item).is(':visible');\n });\n\n if (items.length === 0) {\n return;\n }\n\n var index = items.indexOf(event.target);\n\n if (event.which === ARROW_UP_KEYCODE && index > 0) {\n // Up\n index--;\n }\n\n if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\n // Down\n index++;\n }\n\n if (index < 0) {\n index = 0;\n }\n\n items[index].focus();\n };\n\n _createClass(Dropdown, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION$6;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default$5;\n }\n }, {\n key: \"DefaultType\",\n get: function get() {\n return DefaultType$5;\n }\n }]);\n\n return Dropdown;\n }();\n /**\n * Data API implementation\n */\n\n\n $__default[\"default\"](document).on(EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$2, Dropdown._dataApiKeydownHandler).on(EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown._dataApiKeydownHandler).on(EVENT_CLICK_DATA_API$2 + \" \" + EVENT_KEYUP_DATA_API, Dropdown._clearMenus).on(EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n event.preventDefault();\n event.stopPropagation();\n\n Dropdown._jQueryInterface.call($__default[\"default\"](this), 'toggle');\n }).on(EVENT_CLICK_DATA_API$2, SELECTOR_FORM_CHILD, function (e) {\n e.stopPropagation();\n });\n /**\n * jQuery\n */\n\n $__default[\"default\"].fn[NAME$6] = Dropdown._jQueryInterface;\n $__default[\"default\"].fn[NAME$6].Constructor = Dropdown;\n\n $__default[\"default\"].fn[NAME$6].noConflict = function () {\n $__default[\"default\"].fn[NAME$6] = JQUERY_NO_CONFLICT$6;\n return Dropdown._jQueryInterface;\n };\n\n /**\n * Constants\n */\n\n var NAME$5 = 'modal';\n var VERSION$5 = '4.6.2';\n var DATA_KEY$5 = 'bs.modal';\n var EVENT_KEY$5 = \".\" + DATA_KEY$5;\n var DATA_API_KEY$2 = '.data-api';\n var JQUERY_NO_CONFLICT$5 = $__default[\"default\"].fn[NAME$5];\n var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n var CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable';\n var CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure';\n var CLASS_NAME_BACKDROP = 'modal-backdrop';\n var CLASS_NAME_OPEN = 'modal-open';\n var CLASS_NAME_FADE$4 = 'fade';\n var CLASS_NAME_SHOW$4 = 'show';\n var CLASS_NAME_STATIC = 'modal-static';\n var EVENT_HIDE$2 = \"hide\" + EVENT_KEY$5;\n var EVENT_HIDE_PREVENTED = \"hidePrevented\" + EVENT_KEY$5;\n var EVENT_HIDDEN$2 = \"hidden\" + EVENT_KEY$5;\n var EVENT_SHOW$2 = \"show\" + EVENT_KEY$5;\n var EVENT_SHOWN$2 = \"shown\" + EVENT_KEY$5;\n var EVENT_FOCUSIN = \"focusin\" + EVENT_KEY$5;\n var EVENT_RESIZE = \"resize\" + EVENT_KEY$5;\n var EVENT_CLICK_DISMISS$1 = \"click.dismiss\" + EVENT_KEY$5;\n var EVENT_KEYDOWN_DISMISS = \"keydown.dismiss\" + EVENT_KEY$5;\n var EVENT_MOUSEUP_DISMISS = \"mouseup.dismiss\" + EVENT_KEY$5;\n var EVENT_MOUSEDOWN_DISMISS = \"mousedown.dismiss\" + EVENT_KEY$5;\n var EVENT_CLICK_DATA_API$1 = \"click\" + EVENT_KEY$5 + DATA_API_KEY$2;\n var SELECTOR_DIALOG = '.modal-dialog';\n var SELECTOR_MODAL_BODY = '.modal-body';\n var SELECTOR_DATA_TOGGLE$1 = '[data-toggle=\"modal\"]';\n var SELECTOR_DATA_DISMISS$1 = '[data-dismiss=\"modal\"]';\n var SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\n var SELECTOR_STICKY_CONTENT = '.sticky-top';\n var Default$4 = {\n backdrop: true,\n keyboard: true,\n focus: true,\n show: true\n };\n var DefaultType$4 = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n focus: 'boolean',\n show: 'boolean'\n };\n /**\n * Class definition\n */\n\n var Modal = /*#__PURE__*/function () {\n function Modal(element, config) {\n this._config = this._getConfig(config);\n this._element = element;\n this._dialog = element.querySelector(SELECTOR_DIALOG);\n this._backdrop = null;\n this._isShown = false;\n this._isBodyOverflowing = false;\n this._ignoreBackdropClick = false;\n this._isTransitioning = false;\n this._scrollbarWidth = 0;\n } // Getters\n\n\n var _proto = Modal.prototype;\n\n // Public\n _proto.toggle = function toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n };\n\n _proto.show = function show(relatedTarget) {\n var _this = this;\n\n if (this._isShown || this._isTransitioning) {\n return;\n }\n\n var showEvent = $__default[\"default\"].Event(EVENT_SHOW$2, {\n relatedTarget: relatedTarget\n });\n $__default[\"default\"](this._element).trigger(showEvent);\n\n if (showEvent.isDefaultPrevented()) {\n return;\n }\n\n this._isShown = true;\n\n if ($__default[\"default\"](this._element).hasClass(CLASS_NAME_FADE$4)) {\n this._isTransitioning = true;\n }\n\n this._checkScrollbar();\n\n this._setScrollbar();\n\n this._adjustDialog();\n\n this._setEscapeEvent();\n\n this._setResizeEvent();\n\n $__default[\"default\"](this._element).on(EVENT_CLICK_DISMISS$1, SELECTOR_DATA_DISMISS$1, function (event) {\n return _this.hide(event);\n });\n $__default[\"default\"](this._dialog).on(EVENT_MOUSEDOWN_DISMISS, function () {\n $__default[\"default\"](_this._element).one(EVENT_MOUSEUP_DISMISS, function (event) {\n if ($__default[\"default\"](event.target).is(_this._element)) {\n _this._ignoreBackdropClick = true;\n }\n });\n });\n\n this._showBackdrop(function () {\n return _this._showElement(relatedTarget);\n });\n };\n\n _proto.hide = function hide(event) {\n var _this2 = this;\n\n if (event) {\n event.preventDefault();\n }\n\n if (!this._isShown || this._isTransitioning) {\n return;\n }\n\n var hideEvent = $__default[\"default\"].Event(EVENT_HIDE$2);\n $__default[\"default\"](this._element).trigger(hideEvent);\n\n if (!this._isShown || hideEvent.isDefaultPrevented()) {\n return;\n }\n\n this._isShown = false;\n var transition = $__default[\"default\"](this._element).hasClass(CLASS_NAME_FADE$4);\n\n if (transition) {\n this._isTransitioning = true;\n }\n\n this._setEscapeEvent();\n\n this._setResizeEvent();\n\n $__default[\"default\"](document).off(EVENT_FOCUSIN);\n $__default[\"default\"](this._element).removeClass(CLASS_NAME_SHOW$4);\n $__default[\"default\"](this._element).off(EVENT_CLICK_DISMISS$1);\n $__default[\"default\"](this._dialog).off(EVENT_MOUSEDOWN_DISMISS);\n\n if (transition) {\n var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n $__default[\"default\"](this._element).one(Util.TRANSITION_END, function (event) {\n return _this2._hideModal(event);\n }).emulateTransitionEnd(transitionDuration);\n } else {\n this._hideModal();\n }\n };\n\n _proto.dispose = function dispose() {\n [window, this._element, this._dialog].forEach(function (htmlElement) {\n return $__default[\"default\"](htmlElement).off(EVENT_KEY$5);\n });\n /**\n * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`\n * Do not move `document` in `htmlElements` array\n * It will remove `EVENT_CLICK_DATA_API` event that should remain\n */\n\n $__default[\"default\"](document).off(EVENT_FOCUSIN);\n $__default[\"default\"].removeData(this._element, DATA_KEY$5);\n this._config = null;\n this._element = null;\n this._dialog = null;\n this._backdrop = null;\n this._isShown = null;\n this._isBodyOverflowing = null;\n this._ignoreBackdropClick = null;\n this._isTransitioning = null;\n this._scrollbarWidth = null;\n };\n\n _proto.handleUpdate = function handleUpdate() {\n this._adjustDialog();\n } // Private\n ;\n\n _proto._getConfig = function _getConfig(config) {\n config = _extends({}, Default$4, config);\n Util.typeCheckConfig(NAME$5, config, DefaultType$4);\n return config;\n };\n\n _proto._triggerBackdropTransition = function _triggerBackdropTransition() {\n var _this3 = this;\n\n var hideEventPrevented = $__default[\"default\"].Event(EVENT_HIDE_PREVENTED);\n $__default[\"default\"](this._element).trigger(hideEventPrevented);\n\n if (hideEventPrevented.isDefaultPrevented()) {\n return;\n }\n\n var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden';\n }\n\n this._element.classList.add(CLASS_NAME_STATIC);\n\n var modalTransitionDuration = Util.getTransitionDurationFromElement(this._dialog);\n $__default[\"default\"](this._element).off(Util.TRANSITION_END);\n $__default[\"default\"](this._element).one(Util.TRANSITION_END, function () {\n _this3._element.classList.remove(CLASS_NAME_STATIC);\n\n if (!isModalOverflowing) {\n $__default[\"default\"](_this3._element).one(Util.TRANSITION_END, function () {\n _this3._element.style.overflowY = '';\n }).emulateTransitionEnd(_this3._element, modalTransitionDuration);\n }\n }).emulateTransitionEnd(modalTransitionDuration);\n\n this._element.focus();\n };\n\n _proto._showElement = function _showElement(relatedTarget) {\n var _this4 = this;\n\n var transition = $__default[\"default\"](this._element).hasClass(CLASS_NAME_FADE$4);\n var modalBody = this._dialog ? this._dialog.querySelector(SELECTOR_MODAL_BODY) : null;\n\n if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.appendChild(this._element);\n }\n\n this._element.style.display = 'block';\n\n this._element.removeAttribute('aria-hidden');\n\n this._element.setAttribute('aria-modal', true);\n\n this._element.setAttribute('role', 'dialog');\n\n if ($__default[\"default\"](this._dialog).hasClass(CLASS_NAME_SCROLLABLE) && modalBody) {\n modalBody.scrollTop = 0;\n } else {\n this._element.scrollTop = 0;\n }\n\n if (transition) {\n Util.reflow(this._element);\n }\n\n $__default[\"default\"](this._element).addClass(CLASS_NAME_SHOW$4);\n\n if (this._config.focus) {\n this._enforceFocus();\n }\n\n var shownEvent = $__default[\"default\"].Event(EVENT_SHOWN$2, {\n relatedTarget: relatedTarget\n });\n\n var transitionComplete = function transitionComplete() {\n if (_this4._config.focus) {\n _this4._element.focus();\n }\n\n _this4._isTransitioning = false;\n $__default[\"default\"](_this4._element).trigger(shownEvent);\n };\n\n if (transition) {\n var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);\n $__default[\"default\"](this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);\n } else {\n transitionComplete();\n }\n };\n\n _proto._enforceFocus = function _enforceFocus() {\n var _this5 = this;\n\n $__default[\"default\"](document).off(EVENT_FOCUSIN) // Guard against infinite focus loop\n .on(EVENT_FOCUSIN, function (event) {\n if (document !== event.target && _this5._element !== event.target && $__default[\"default\"](_this5._element).has(event.target).length === 0) {\n _this5._element.focus();\n }\n });\n };\n\n _proto._setEscapeEvent = function _setEscapeEvent() {\n var _this6 = this;\n\n if (this._isShown) {\n $__default[\"default\"](this._element).on(EVENT_KEYDOWN_DISMISS, function (event) {\n if (_this6._config.keyboard && event.which === ESCAPE_KEYCODE) {\n event.preventDefault();\n\n _this6.hide();\n } else if (!_this6._config.keyboard && event.which === ESCAPE_KEYCODE) {\n _this6._triggerBackdropTransition();\n }\n });\n } else if (!this._isShown) {\n $__default[\"default\"](this._element).off(EVENT_KEYDOWN_DISMISS);\n }\n };\n\n _proto._setResizeEvent = function _setResizeEvent() {\n var _this7 = this;\n\n if (this._isShown) {\n $__default[\"default\"](window).on(EVENT_RESIZE, function (event) {\n return _this7.handleUpdate(event);\n });\n } else {\n $__default[\"default\"](window).off(EVENT_RESIZE);\n }\n };\n\n _proto._hideModal = function _hideModal() {\n var _this8 = this;\n\n this._element.style.display = 'none';\n\n this._element.setAttribute('aria-hidden', true);\n\n this._element.removeAttribute('aria-modal');\n\n this._element.removeAttribute('role');\n\n this._isTransitioning = false;\n\n this._showBackdrop(function () {\n $__default[\"default\"](document.body).removeClass(CLASS_NAME_OPEN);\n\n _this8._resetAdjustments();\n\n _this8._resetScrollbar();\n\n $__default[\"default\"](_this8._element).trigger(EVENT_HIDDEN$2);\n });\n };\n\n _proto._removeBackdrop = function _removeBackdrop() {\n if (this._backdrop) {\n $__default[\"default\"](this._backdrop).remove();\n this._backdrop = null;\n }\n };\n\n _proto._showBackdrop = function _showBackdrop(callback) {\n var _this9 = this;\n\n var animate = $__default[\"default\"](this._element).hasClass(CLASS_NAME_FADE$4) ? CLASS_NAME_FADE$4 : '';\n\n if (this._isShown && this._config.backdrop) {\n this._backdrop = document.createElement('div');\n this._backdrop.className = CLASS_NAME_BACKDROP;\n\n if (animate) {\n this._backdrop.classList.add(animate);\n }\n\n $__default[\"default\"](this._backdrop).appendTo(document.body);\n $__default[\"default\"](this._element).on(EVENT_CLICK_DISMISS$1, function (event) {\n if (_this9._ignoreBackdropClick) {\n _this9._ignoreBackdropClick = false;\n return;\n }\n\n if (event.target !== event.currentTarget) {\n return;\n }\n\n if (_this9._config.backdrop === 'static') {\n _this9._triggerBackdropTransition();\n } else {\n _this9.hide();\n }\n });\n\n if (animate) {\n Util.reflow(this._backdrop);\n }\n\n $__default[\"default\"](this._backdrop).addClass(CLASS_NAME_SHOW$4);\n\n if (!callback) {\n return;\n }\n\n if (!animate) {\n callback();\n return;\n }\n\n var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n $__default[\"default\"](this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);\n } else if (!this._isShown && this._backdrop) {\n $__default[\"default\"](this._backdrop).removeClass(CLASS_NAME_SHOW$4);\n\n var callbackRemove = function callbackRemove() {\n _this9._removeBackdrop();\n\n if (callback) {\n callback();\n }\n };\n\n if ($__default[\"default\"](this._element).hasClass(CLASS_NAME_FADE$4)) {\n var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n\n $__default[\"default\"](this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);\n } else {\n callbackRemove();\n }\n } else if (callback) {\n callback();\n }\n } // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // todo (fat): these should probably be refactored out of modal.js\n // ----------------------------------------------------------------------\n ;\n\n _proto._adjustDialog = function _adjustDialog() {\n var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n if (!this._isBodyOverflowing && isModalOverflowing) {\n this._element.style.paddingLeft = this._scrollbarWidth + \"px\";\n }\n\n if (this._isBodyOverflowing && !isModalOverflowing) {\n this._element.style.paddingRight = this._scrollbarWidth + \"px\";\n }\n };\n\n _proto._resetAdjustments = function _resetAdjustments() {\n this._element.style.paddingLeft = '';\n this._element.style.paddingRight = '';\n };\n\n _proto._checkScrollbar = function _checkScrollbar() {\n var rect = document.body.getBoundingClientRect();\n this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth;\n this._scrollbarWidth = this._getScrollbarWidth();\n };\n\n _proto._setScrollbar = function _setScrollbar() {\n var _this10 = this;\n\n if (this._isBodyOverflowing) {\n // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT));\n var stickyContent = [].slice.call(document.querySelectorAll(SELECTOR_STICKY_CONTENT)); // Adjust fixed content padding\n\n $__default[\"default\"](fixedContent).each(function (index, element) {\n var actualPadding = element.style.paddingRight;\n var calculatedPadding = $__default[\"default\"](element).css('padding-right');\n $__default[\"default\"](element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + \"px\");\n }); // Adjust sticky content margin\n\n $__default[\"default\"](stickyContent).each(function (index, element) {\n var actualMargin = element.style.marginRight;\n var calculatedMargin = $__default[\"default\"](element).css('margin-right');\n $__default[\"default\"](element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + \"px\");\n }); // Adjust body padding\n\n var actualPadding = document.body.style.paddingRight;\n var calculatedPadding = $__default[\"default\"](document.body).css('padding-right');\n $__default[\"default\"](document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + \"px\");\n }\n\n $__default[\"default\"](document.body).addClass(CLASS_NAME_OPEN);\n };\n\n _proto._resetScrollbar = function _resetScrollbar() {\n // Restore fixed content padding\n var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT));\n $__default[\"default\"](fixedContent).each(function (index, element) {\n var padding = $__default[\"default\"](element).data('padding-right');\n $__default[\"default\"](element).removeData('padding-right');\n element.style.paddingRight = padding ? padding : '';\n }); // Restore sticky content\n\n var elements = [].slice.call(document.querySelectorAll(\"\" + SELECTOR_STICKY_CONTENT));\n $__default[\"default\"](elements).each(function (index, element) {\n var margin = $__default[\"default\"](element).data('margin-right');\n\n if (typeof margin !== 'undefined') {\n $__default[\"default\"](element).css('margin-right', margin).removeData('margin-right');\n }\n }); // Restore body padding\n\n var padding = $__default[\"default\"](document.body).data('padding-right');\n $__default[\"default\"](document.body).removeData('padding-right');\n document.body.style.paddingRight = padding ? padding : '';\n };\n\n _proto._getScrollbarWidth = function _getScrollbarWidth() {\n // thx d.walsh\n var scrollDiv = document.createElement('div');\n scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER;\n document.body.appendChild(scrollDiv);\n var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;\n document.body.removeChild(scrollDiv);\n return scrollbarWidth;\n } // Static\n ;\n\n Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n var data = $__default[\"default\"](this).data(DATA_KEY$5);\n\n var _config = _extends({}, Default$4, $__default[\"default\"](this).data(), typeof config === 'object' && config ? config : {});\n\n if (!data) {\n data = new Modal(this, _config);\n $__default[\"default\"](this).data(DATA_KEY$5, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config](relatedTarget);\n } else if (_config.show) {\n data.show(relatedTarget);\n }\n });\n };\n\n _createClass(Modal, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION$5;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default$4;\n }\n }]);\n\n return Modal;\n }();\n /**\n * Data API implementation\n */\n\n\n $__default[\"default\"](document).on(EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n var _this11 = this;\n\n var target;\n var selector = Util.getSelectorFromElement(this);\n\n if (selector) {\n target = document.querySelector(selector);\n }\n\n var config = $__default[\"default\"](target).data(DATA_KEY$5) ? 'toggle' : _extends({}, $__default[\"default\"](target).data(), $__default[\"default\"](this).data());\n\n if (this.tagName === 'A' || this.tagName === 'AREA') {\n event.preventDefault();\n }\n\n var $target = $__default[\"default\"](target).one(EVENT_SHOW$2, function (showEvent) {\n if (showEvent.isDefaultPrevented()) {\n // Only register focus restorer if modal will actually get shown\n return;\n }\n\n $target.one(EVENT_HIDDEN$2, function () {\n if ($__default[\"default\"](_this11).is(':visible')) {\n _this11.focus();\n }\n });\n });\n\n Modal._jQueryInterface.call($__default[\"default\"](target), config, this);\n });\n /**\n * jQuery\n */\n\n $__default[\"default\"].fn[NAME$5] = Modal._jQueryInterface;\n $__default[\"default\"].fn[NAME$5].Constructor = Modal;\n\n $__default[\"default\"].fn[NAME$5].noConflict = function () {\n $__default[\"default\"].fn[NAME$5] = JQUERY_NO_CONFLICT$5;\n return Modal._jQueryInterface;\n };\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2): tools/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];\n var ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n var DefaultWhitelist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n };\n /**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\n\n var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;\n /**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\n\n var DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i;\n\n function allowedAttribute(attr, allowedAttributeList) {\n var attrName = attr.nodeName.toLowerCase();\n\n if (allowedAttributeList.indexOf(attrName) !== -1) {\n if (uriAttrs.indexOf(attrName) !== -1) {\n return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue));\n }\n\n return true;\n }\n\n var regExp = allowedAttributeList.filter(function (attrRegex) {\n return attrRegex instanceof RegExp;\n }); // Check if a regular expression validates the attribute.\n\n for (var i = 0, len = regExp.length; i < len; i++) {\n if (regExp[i].test(attrName)) {\n return true;\n }\n }\n\n return false;\n }\n\n function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n if (unsafeHtml.length === 0) {\n return unsafeHtml;\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml);\n }\n\n var domParser = new window.DOMParser();\n var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n var whitelistKeys = Object.keys(whiteList);\n var elements = [].slice.call(createdDocument.body.querySelectorAll('*'));\n\n var _loop = function _loop(i, len) {\n var el = elements[i];\n var elName = el.nodeName.toLowerCase();\n\n if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n el.parentNode.removeChild(el);\n return \"continue\";\n }\n\n var attributeList = [].slice.call(el.attributes); // eslint-disable-next-line unicorn/prefer-spread\n\n var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);\n attributeList.forEach(function (attr) {\n if (!allowedAttribute(attr, whitelistedAttributes)) {\n el.removeAttribute(attr.nodeName);\n }\n });\n };\n\n for (var i = 0, len = elements.length; i < len; i++) {\n var _ret = _loop(i);\n\n if (_ret === \"continue\") continue;\n }\n\n return createdDocument.body.innerHTML;\n }\n\n /**\n * Constants\n */\n\n var NAME$4 = 'tooltip';\n var VERSION$4 = '4.6.2';\n var DATA_KEY$4 = 'bs.tooltip';\n var EVENT_KEY$4 = \".\" + DATA_KEY$4;\n var JQUERY_NO_CONFLICT$4 = $__default[\"default\"].fn[NAME$4];\n var CLASS_PREFIX$1 = 'bs-tooltip';\n var BSCLS_PREFIX_REGEX$1 = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX$1 + \"\\\\S+\", 'g');\n var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];\n var CLASS_NAME_FADE$3 = 'fade';\n var CLASS_NAME_SHOW$3 = 'show';\n var HOVER_STATE_SHOW = 'show';\n var HOVER_STATE_OUT = 'out';\n var SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\n var SELECTOR_ARROW = '.arrow';\n var TRIGGER_HOVER = 'hover';\n var TRIGGER_FOCUS = 'focus';\n var TRIGGER_CLICK = 'click';\n var TRIGGER_MANUAL = 'manual';\n var AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: 'right',\n BOTTOM: 'bottom',\n LEFT: 'left'\n };\n var Default$3 = {\n animation: true,\n template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<div class=\"tooltip-inner\"></div></div>',\n trigger: 'hover focus',\n title: '',\n delay: 0,\n html: false,\n selector: false,\n placement: 'top',\n offset: 0,\n container: false,\n fallbackPlacement: 'flip',\n boundary: 'scrollParent',\n customClass: '',\n sanitize: true,\n sanitizeFn: null,\n whiteList: DefaultWhitelist,\n popperConfig: null\n };\n var DefaultType$3 = {\n animation: 'boolean',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string',\n delay: '(number|object)',\n html: 'boolean',\n selector: '(string|boolean)',\n placement: '(string|function)',\n offset: '(number|string|function)',\n container: '(string|element|boolean)',\n fallbackPlacement: '(string|array)',\n boundary: '(string|element)',\n customClass: '(string|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n whiteList: 'object',\n popperConfig: '(null|object)'\n };\n var Event$1 = {\n HIDE: \"hide\" + EVENT_KEY$4,\n HIDDEN: \"hidden\" + EVENT_KEY$4,\n SHOW: \"show\" + EVENT_KEY$4,\n SHOWN: \"shown\" + EVENT_KEY$4,\n INSERTED: \"inserted\" + EVENT_KEY$4,\n CLICK: \"click\" + EVENT_KEY$4,\n FOCUSIN: \"focusin\" + EVENT_KEY$4,\n FOCUSOUT: \"focusout\" + EVENT_KEY$4,\n MOUSEENTER: \"mouseenter\" + EVENT_KEY$4,\n MOUSELEAVE: \"mouseleave\" + EVENT_KEY$4\n };\n /**\n * Class definition\n */\n\n var Tooltip = /*#__PURE__*/function () {\n function Tooltip(element, config) {\n if (typeof Popper__default[\"default\"] === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n } // Private\n\n\n this._isEnabled = true;\n this._timeout = 0;\n this._hoverState = '';\n this._activeTrigger = {};\n this._popper = null; // Protected\n\n this.element = element;\n this.config = this._getConfig(config);\n this.tip = null;\n\n this._setListeners();\n } // Getters\n\n\n var _proto = Tooltip.prototype;\n\n // Public\n _proto.enable = function enable() {\n this._isEnabled = true;\n };\n\n _proto.disable = function disable() {\n this._isEnabled = false;\n };\n\n _proto.toggleEnabled = function toggleEnabled() {\n this._isEnabled = !this._isEnabled;\n };\n\n _proto.toggle = function toggle(event) {\n if (!this._isEnabled) {\n return;\n }\n\n if (event) {\n var dataKey = this.constructor.DATA_KEY;\n var context = $__default[\"default\"](event.currentTarget).data(dataKey);\n\n if (!context) {\n context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n $__default[\"default\"](event.currentTarget).data(dataKey, context);\n }\n\n context._activeTrigger.click = !context._activeTrigger.click;\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context);\n } else {\n context._leave(null, context);\n }\n } else {\n if ($__default[\"default\"](this.getTipElement()).hasClass(CLASS_NAME_SHOW$3)) {\n this._leave(null, this);\n\n return;\n }\n\n this._enter(null, this);\n }\n };\n\n _proto.dispose = function dispose() {\n clearTimeout(this._timeout);\n $__default[\"default\"].removeData(this.element, this.constructor.DATA_KEY);\n $__default[\"default\"](this.element).off(this.constructor.EVENT_KEY);\n $__default[\"default\"](this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler);\n\n if (this.tip) {\n $__default[\"default\"](this.tip).remove();\n }\n\n this._isEnabled = null;\n this._timeout = null;\n this._hoverState = null;\n this._activeTrigger = null;\n\n if (this._popper) {\n this._popper.destroy();\n }\n\n this._popper = null;\n this.element = null;\n this.config = null;\n this.tip = null;\n };\n\n _proto.show = function show() {\n var _this = this;\n\n if ($__default[\"default\"](this.element).css('display') === 'none') {\n throw new Error('Please use show on visible elements');\n }\n\n var showEvent = $__default[\"default\"].Event(this.constructor.Event.SHOW);\n\n if (this.isWithContent() && this._isEnabled) {\n $__default[\"default\"](this.element).trigger(showEvent);\n var shadowRoot = Util.findShadowRoot(this.element);\n var isInTheDom = $__default[\"default\"].contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);\n\n if (showEvent.isDefaultPrevented() || !isInTheDom) {\n return;\n }\n\n var tip = this.getTipElement();\n var tipId = Util.getUID(this.constructor.NAME);\n tip.setAttribute('id', tipId);\n this.element.setAttribute('aria-describedby', tipId);\n this.setContent();\n\n if (this.config.animation) {\n $__default[\"default\"](tip).addClass(CLASS_NAME_FADE$3);\n }\n\n var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\n\n var attachment = this._getAttachment(placement);\n\n this.addAttachmentClass(attachment);\n\n var container = this._getContainer();\n\n $__default[\"default\"](tip).data(this.constructor.DATA_KEY, this);\n\n if (!$__default[\"default\"].contains(this.element.ownerDocument.documentElement, this.tip)) {\n $__default[\"default\"](tip).appendTo(container);\n }\n\n $__default[\"default\"](this.element).trigger(this.constructor.Event.INSERTED);\n this._popper = new Popper__default[\"default\"](this.element, tip, this._getPopperConfig(attachment));\n $__default[\"default\"](tip).addClass(CLASS_NAME_SHOW$3);\n $__default[\"default\"](tip).addClass(this.config.customClass); // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n if ('ontouchstart' in document.documentElement) {\n $__default[\"default\"](document.body).children().on('mouseover', null, $__default[\"default\"].noop);\n }\n\n var complete = function complete() {\n if (_this.config.animation) {\n _this._fixTransition();\n }\n\n var prevHoverState = _this._hoverState;\n _this._hoverState = null;\n $__default[\"default\"](_this.element).trigger(_this.constructor.Event.SHOWN);\n\n if (prevHoverState === HOVER_STATE_OUT) {\n _this._leave(null, _this);\n }\n };\n\n if ($__default[\"default\"](this.tip).hasClass(CLASS_NAME_FADE$3)) {\n var transitionDuration = Util.getTransitionDurationFromElement(this.tip);\n $__default[\"default\"](this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n } else {\n complete();\n }\n }\n };\n\n _proto.hide = function hide(callback) {\n var _this2 = this;\n\n var tip = this.getTipElement();\n var hideEvent = $__default[\"default\"].Event(this.constructor.Event.HIDE);\n\n var complete = function complete() {\n if (_this2._hoverState !== HOVER_STATE_SHOW && tip.parentNode) {\n tip.parentNode.removeChild(tip);\n }\n\n _this2._cleanTipClass();\n\n _this2.element.removeAttribute('aria-describedby');\n\n $__default[\"default\"](_this2.element).trigger(_this2.constructor.Event.HIDDEN);\n\n if (_this2._popper !== null) {\n _this2._popper.destroy();\n }\n\n if (callback) {\n callback();\n }\n };\n\n $__default[\"default\"](this.element).trigger(hideEvent);\n\n if (hideEvent.isDefaultPrevented()) {\n return;\n }\n\n $__default[\"default\"](tip).removeClass(CLASS_NAME_SHOW$3); // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n\n if ('ontouchstart' in document.documentElement) {\n $__default[\"default\"](document.body).children().off('mouseover', null, $__default[\"default\"].noop);\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false;\n this._activeTrigger[TRIGGER_FOCUS] = false;\n this._activeTrigger[TRIGGER_HOVER] = false;\n\n if ($__default[\"default\"](this.tip).hasClass(CLASS_NAME_FADE$3)) {\n var transitionDuration = Util.getTransitionDurationFromElement(tip);\n $__default[\"default\"](tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n } else {\n complete();\n }\n\n this._hoverState = '';\n };\n\n _proto.update = function update() {\n if (this._popper !== null) {\n this._popper.scheduleUpdate();\n }\n } // Protected\n ;\n\n _proto.isWithContent = function isWithContent() {\n return Boolean(this.getTitle());\n };\n\n _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n $__default[\"default\"](this.getTipElement()).addClass(CLASS_PREFIX$1 + \"-\" + attachment);\n };\n\n _proto.getTipElement = function getTipElement() {\n this.tip = this.tip || $__default[\"default\"](this.config.template)[0];\n return this.tip;\n };\n\n _proto.setContent = function setContent() {\n var tip = this.getTipElement();\n this.setElementContent($__default[\"default\"](tip.querySelectorAll(SELECTOR_TOOLTIP_INNER)), this.getTitle());\n $__default[\"default\"](tip).removeClass(CLASS_NAME_FADE$3 + \" \" + CLASS_NAME_SHOW$3);\n };\n\n _proto.setElementContent = function setElementContent($element, content) {\n if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n // Content is a DOM node or a jQuery\n if (this.config.html) {\n if (!$__default[\"default\"](content).parent().is($element)) {\n $element.empty().append(content);\n }\n } else {\n $element.text($__default[\"default\"](content).text());\n }\n\n return;\n }\n\n if (this.config.html) {\n if (this.config.sanitize) {\n content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);\n }\n\n $element.html(content);\n } else {\n $element.text(content);\n }\n };\n\n _proto.getTitle = function getTitle() {\n var title = this.element.getAttribute('data-original-title');\n\n if (!title) {\n title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\n }\n\n return title;\n } // Private\n ;\n\n _proto._getPopperConfig = function _getPopperConfig(attachment) {\n var _this3 = this;\n\n var defaultBsConfig = {\n placement: attachment,\n modifiers: {\n offset: this._getOffset(),\n flip: {\n behavior: this.config.fallbackPlacement\n },\n arrow: {\n element: SELECTOR_ARROW\n },\n preventOverflow: {\n boundariesElement: this.config.boundary\n }\n },\n onCreate: function onCreate(data) {\n if (data.originalPlacement !== data.placement) {\n _this3._handlePopperPlacementChange(data);\n }\n },\n onUpdate: function onUpdate(data) {\n return _this3._handlePopperPlacementChange(data);\n }\n };\n return _extends({}, defaultBsConfig, this.config.popperConfig);\n };\n\n _proto._getOffset = function _getOffset() {\n var _this4 = this;\n\n var offset = {};\n\n if (typeof this.config.offset === 'function') {\n offset.fn = function (data) {\n data.offsets = _extends({}, data.offsets, _this4.config.offset(data.offsets, _this4.element));\n return data;\n };\n } else {\n offset.offset = this.config.offset;\n }\n\n return offset;\n };\n\n _proto._getContainer = function _getContainer() {\n if (this.config.container === false) {\n return document.body;\n }\n\n if (Util.isElement(this.config.container)) {\n return $__default[\"default\"](this.config.container);\n }\n\n return $__default[\"default\"](document).find(this.config.container);\n };\n\n _proto._getAttachment = function _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()];\n };\n\n _proto._setListeners = function _setListeners() {\n var _this5 = this;\n\n var triggers = this.config.trigger.split(' ');\n triggers.forEach(function (trigger) {\n if (trigger === 'click') {\n $__default[\"default\"](_this5.element).on(_this5.constructor.Event.CLICK, _this5.config.selector, function (event) {\n return _this5.toggle(event);\n });\n } else if (trigger !== TRIGGER_MANUAL) {\n var eventIn = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN;\n var eventOut = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT;\n $__default[\"default\"](_this5.element).on(eventIn, _this5.config.selector, function (event) {\n return _this5._enter(event);\n }).on(eventOut, _this5.config.selector, function (event) {\n return _this5._leave(event);\n });\n }\n });\n\n this._hideModalHandler = function () {\n if (_this5.element) {\n _this5.hide();\n }\n };\n\n $__default[\"default\"](this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler);\n\n if (this.config.selector) {\n this.config = _extends({}, this.config, {\n trigger: 'manual',\n selector: ''\n });\n } else {\n this._fixTitle();\n }\n };\n\n _proto._fixTitle = function _fixTitle() {\n var titleType = typeof this.element.getAttribute('data-original-title');\n\n if (this.element.getAttribute('title') || titleType !== 'string') {\n this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\n this.element.setAttribute('title', '');\n }\n };\n\n _proto._enter = function _enter(event, context) {\n var dataKey = this.constructor.DATA_KEY;\n context = context || $__default[\"default\"](event.currentTarget).data(dataKey);\n\n if (!context) {\n context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n $__default[\"default\"](event.currentTarget).data(dataKey, context);\n }\n\n if (event) {\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n }\n\n if ($__default[\"default\"](context.getTipElement()).hasClass(CLASS_NAME_SHOW$3) || context._hoverState === HOVER_STATE_SHOW) {\n context._hoverState = HOVER_STATE_SHOW;\n return;\n }\n\n clearTimeout(context._timeout);\n context._hoverState = HOVER_STATE_SHOW;\n\n if (!context.config.delay || !context.config.delay.show) {\n context.show();\n return;\n }\n\n context._timeout = setTimeout(function () {\n if (context._hoverState === HOVER_STATE_SHOW) {\n context.show();\n }\n }, context.config.delay.show);\n };\n\n _proto._leave = function _leave(event, context) {\n var dataKey = this.constructor.DATA_KEY;\n context = context || $__default[\"default\"](event.currentTarget).data(dataKey);\n\n if (!context) {\n context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n $__default[\"default\"](event.currentTarget).data(dataKey, context);\n }\n\n if (event) {\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = false;\n }\n\n if (context._isWithActiveTrigger()) {\n return;\n }\n\n clearTimeout(context._timeout);\n context._hoverState = HOVER_STATE_OUT;\n\n if (!context.config.delay || !context.config.delay.hide) {\n context.hide();\n return;\n }\n\n context._timeout = setTimeout(function () {\n if (context._hoverState === HOVER_STATE_OUT) {\n context.hide();\n }\n }, context.config.delay.hide);\n };\n\n _proto._isWithActiveTrigger = function _isWithActiveTrigger() {\n for (var trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true;\n }\n }\n\n return false;\n };\n\n _proto._getConfig = function _getConfig(config) {\n var dataAttributes = $__default[\"default\"](this.element).data();\n Object.keys(dataAttributes).forEach(function (dataAttr) {\n if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n delete dataAttributes[dataAttr];\n }\n });\n config = _extends({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n };\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString();\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString();\n }\n\n Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);\n }\n\n return config;\n };\n\n _proto._getDelegateConfig = function _getDelegateConfig() {\n var config = {};\n\n if (this.config) {\n for (var key in this.config) {\n if (this.constructor.Default[key] !== this.config[key]) {\n config[key] = this.config[key];\n }\n }\n }\n\n return config;\n };\n\n _proto._cleanTipClass = function _cleanTipClass() {\n var $tip = $__default[\"default\"](this.getTipElement());\n var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1);\n\n if (tabClass !== null && tabClass.length) {\n $tip.removeClass(tabClass.join(''));\n }\n };\n\n _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {\n this.tip = popperData.instance.popper;\n\n this._cleanTipClass();\n\n this.addAttachmentClass(this._getAttachment(popperData.placement));\n };\n\n _proto._fixTransition = function _fixTransition() {\n var tip = this.getTipElement();\n var initConfigAnimation = this.config.animation;\n\n if (tip.getAttribute('x-placement') !== null) {\n return;\n }\n\n $__default[\"default\"](tip).removeClass(CLASS_NAME_FADE$3);\n this.config.animation = false;\n this.hide();\n this.show();\n this.config.animation = initConfigAnimation;\n } // Static\n ;\n\n Tooltip._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var $element = $__default[\"default\"](this);\n var data = $element.data(DATA_KEY$4);\n\n var _config = typeof config === 'object' && config;\n\n if (!data && /dispose|hide/.test(config)) {\n return;\n }\n\n if (!data) {\n data = new Tooltip(this, _config);\n $element.data(DATA_KEY$4, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n _createClass(Tooltip, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION$4;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default$3;\n }\n }, {\n key: \"NAME\",\n get: function get() {\n return NAME$4;\n }\n }, {\n key: \"DATA_KEY\",\n get: function get() {\n return DATA_KEY$4;\n }\n }, {\n key: \"Event\",\n get: function get() {\n return Event$1;\n }\n }, {\n key: \"EVENT_KEY\",\n get: function get() {\n return EVENT_KEY$4;\n }\n }, {\n key: \"DefaultType\",\n get: function get() {\n return DefaultType$3;\n }\n }]);\n\n return Tooltip;\n }();\n /**\n * jQuery\n */\n\n\n $__default[\"default\"].fn[NAME$4] = Tooltip._jQueryInterface;\n $__default[\"default\"].fn[NAME$4].Constructor = Tooltip;\n\n $__default[\"default\"].fn[NAME$4].noConflict = function () {\n $__default[\"default\"].fn[NAME$4] = JQUERY_NO_CONFLICT$4;\n return Tooltip._jQueryInterface;\n };\n\n /**\n * Constants\n */\n\n var NAME$3 = 'popover';\n var VERSION$3 = '4.6.2';\n var DATA_KEY$3 = 'bs.popover';\n var EVENT_KEY$3 = \".\" + DATA_KEY$3;\n var JQUERY_NO_CONFLICT$3 = $__default[\"default\"].fn[NAME$3];\n var CLASS_PREFIX = 'bs-popover';\n var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n var CLASS_NAME_FADE$2 = 'fade';\n var CLASS_NAME_SHOW$2 = 'show';\n var SELECTOR_TITLE = '.popover-header';\n var SELECTOR_CONTENT = '.popover-body';\n\n var Default$2 = _extends({}, Tooltip.Default, {\n placement: 'right',\n trigger: 'click',\n content: '',\n template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div></div>'\n });\n\n var DefaultType$2 = _extends({}, Tooltip.DefaultType, {\n content: '(string|element|function)'\n });\n\n var Event = {\n HIDE: \"hide\" + EVENT_KEY$3,\n HIDDEN: \"hidden\" + EVENT_KEY$3,\n SHOW: \"show\" + EVENT_KEY$3,\n SHOWN: \"shown\" + EVENT_KEY$3,\n INSERTED: \"inserted\" + EVENT_KEY$3,\n CLICK: \"click\" + EVENT_KEY$3,\n FOCUSIN: \"focusin\" + EVENT_KEY$3,\n FOCUSOUT: \"focusout\" + EVENT_KEY$3,\n MOUSEENTER: \"mouseenter\" + EVENT_KEY$3,\n MOUSELEAVE: \"mouseleave\" + EVENT_KEY$3\n };\n /**\n * Class definition\n */\n\n var Popover = /*#__PURE__*/function (_Tooltip) {\n _inheritsLoose(Popover, _Tooltip);\n\n function Popover() {\n return _Tooltip.apply(this, arguments) || this;\n }\n\n var _proto = Popover.prototype;\n\n // Overrides\n _proto.isWithContent = function isWithContent() {\n return this.getTitle() || this._getContent();\n };\n\n _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n $__default[\"default\"](this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n };\n\n _proto.getTipElement = function getTipElement() {\n this.tip = this.tip || $__default[\"default\"](this.config.template)[0];\n return this.tip;\n };\n\n _proto.setContent = function setContent() {\n var $tip = $__default[\"default\"](this.getTipElement()); // We use append for html objects to maintain js events\n\n this.setElementContent($tip.find(SELECTOR_TITLE), this.getTitle());\n\n var content = this._getContent();\n\n if (typeof content === 'function') {\n content = content.call(this.element);\n }\n\n this.setElementContent($tip.find(SELECTOR_CONTENT), content);\n $tip.removeClass(CLASS_NAME_FADE$2 + \" \" + CLASS_NAME_SHOW$2);\n } // Private\n ;\n\n _proto._getContent = function _getContent() {\n return this.element.getAttribute('data-content') || this.config.content;\n };\n\n _proto._cleanTipClass = function _cleanTipClass() {\n var $tip = $__default[\"default\"](this.getTipElement());\n var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n if (tabClass !== null && tabClass.length > 0) {\n $tip.removeClass(tabClass.join(''));\n }\n } // Static\n ;\n\n Popover._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $__default[\"default\"](this).data(DATA_KEY$3);\n\n var _config = typeof config === 'object' ? config : null;\n\n if (!data && /dispose|hide/.test(config)) {\n return;\n }\n\n if (!data) {\n data = new Popover(this, _config);\n $__default[\"default\"](this).data(DATA_KEY$3, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n _createClass(Popover, null, [{\n key: \"VERSION\",\n get: // Getters\n function get() {\n return VERSION$3;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default$2;\n }\n }, {\n key: \"NAME\",\n get: function get() {\n return NAME$3;\n }\n }, {\n key: \"DATA_KEY\",\n get: function get() {\n return DATA_KEY$3;\n }\n }, {\n key: \"Event\",\n get: function get() {\n return Event;\n }\n }, {\n key: \"EVENT_KEY\",\n get: function get() {\n return EVENT_KEY$3;\n }\n }, {\n key: \"DefaultType\",\n get: function get() {\n return DefaultType$2;\n }\n }]);\n\n return Popover;\n }(Tooltip);\n /**\n * jQuery\n */\n\n\n $__default[\"default\"].fn[NAME$3] = Popover._jQueryInterface;\n $__default[\"default\"].fn[NAME$3].Constructor = Popover;\n\n $__default[\"default\"].fn[NAME$3].noConflict = function () {\n $__default[\"default\"].fn[NAME$3] = JQUERY_NO_CONFLICT$3;\n return Popover._jQueryInterface;\n };\n\n /**\n * Constants\n */\n\n var NAME$2 = 'scrollspy';\n var VERSION$2 = '4.6.2';\n var DATA_KEY$2 = 'bs.scrollspy';\n var EVENT_KEY$2 = \".\" + DATA_KEY$2;\n var DATA_API_KEY$1 = '.data-api';\n var JQUERY_NO_CONFLICT$2 = $__default[\"default\"].fn[NAME$2];\n var CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\n var CLASS_NAME_ACTIVE$1 = 'active';\n var EVENT_ACTIVATE = \"activate\" + EVENT_KEY$2;\n var EVENT_SCROLL = \"scroll\" + EVENT_KEY$2;\n var EVENT_LOAD_DATA_API = \"load\" + EVENT_KEY$2 + DATA_API_KEY$1;\n var METHOD_OFFSET = 'offset';\n var METHOD_POSITION = 'position';\n var SELECTOR_DATA_SPY = '[data-spy=\"scroll\"]';\n var SELECTOR_NAV_LIST_GROUP$1 = '.nav, .list-group';\n var SELECTOR_NAV_LINKS = '.nav-link';\n var SELECTOR_NAV_ITEMS = '.nav-item';\n var SELECTOR_LIST_ITEMS = '.list-group-item';\n var SELECTOR_DROPDOWN$1 = '.dropdown';\n var SELECTOR_DROPDOWN_ITEMS = '.dropdown-item';\n var SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\n var Default$1 = {\n offset: 10,\n method: 'auto',\n target: ''\n };\n var DefaultType$1 = {\n offset: 'number',\n method: 'string',\n target: '(string|element)'\n };\n /**\n * Class definition\n */\n\n var ScrollSpy = /*#__PURE__*/function () {\n function ScrollSpy(element, config) {\n var _this = this;\n\n this._element = element;\n this._scrollElement = element.tagName === 'BODY' ? window : element;\n this._config = this._getConfig(config);\n this._selector = this._config.target + \" \" + SELECTOR_NAV_LINKS + \",\" + (this._config.target + \" \" + SELECTOR_LIST_ITEMS + \",\") + (this._config.target + \" \" + SELECTOR_DROPDOWN_ITEMS);\n this._offsets = [];\n this._targets = [];\n this._activeTarget = null;\n this._scrollHeight = 0;\n $__default[\"default\"](this._scrollElement).on(EVENT_SCROLL, function (event) {\n return _this._process(event);\n });\n this.refresh();\n\n this._process();\n } // Getters\n\n\n var _proto = ScrollSpy.prototype;\n\n // Public\n _proto.refresh = function refresh() {\n var _this2 = this;\n\n var autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;\n var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n var offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;\n this._offsets = [];\n this._targets = [];\n this._scrollHeight = this._getScrollHeight();\n var targets = [].slice.call(document.querySelectorAll(this._selector));\n targets.map(function (element) {\n var target;\n var targetSelector = Util.getSelectorFromElement(element);\n\n if (targetSelector) {\n target = document.querySelector(targetSelector);\n }\n\n if (target) {\n var targetBCR = target.getBoundingClientRect();\n\n if (targetBCR.width || targetBCR.height) {\n // TODO (fat): remove sketch reliance on jQuery position/offset\n return [$__default[\"default\"](target)[offsetMethod]().top + offsetBase, targetSelector];\n }\n }\n\n return null;\n }).filter(Boolean).sort(function (a, b) {\n return a[0] - b[0];\n }).forEach(function (item) {\n _this2._offsets.push(item[0]);\n\n _this2._targets.push(item[1]);\n });\n };\n\n _proto.dispose = function dispose() {\n $__default[\"default\"].removeData(this._element, DATA_KEY$2);\n $__default[\"default\"](this._scrollElement).off(EVENT_KEY$2);\n this._element = null;\n this._scrollElement = null;\n this._config = null;\n this._selector = null;\n this._offsets = null;\n this._targets = null;\n this._activeTarget = null;\n this._scrollHeight = null;\n } // Private\n ;\n\n _proto._getConfig = function _getConfig(config) {\n config = _extends({}, Default$1, typeof config === 'object' && config ? config : {});\n\n if (typeof config.target !== 'string' && Util.isElement(config.target)) {\n var id = $__default[\"default\"](config.target).attr('id');\n\n if (!id) {\n id = Util.getUID(NAME$2);\n $__default[\"default\"](config.target).attr('id', id);\n }\n\n config.target = \"#\" + id;\n }\n\n Util.typeCheckConfig(NAME$2, config, DefaultType$1);\n return config;\n };\n\n _proto._getScrollTop = function _getScrollTop() {\n return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n };\n\n _proto._getScrollHeight = function _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n };\n\n _proto._getOffsetHeight = function _getOffsetHeight() {\n return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n };\n\n _proto._process = function _process() {\n var scrollTop = this._getScrollTop() + this._config.offset;\n\n var scrollHeight = this._getScrollHeight();\n\n var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh();\n }\n\n if (scrollTop >= maxScroll) {\n var target = this._targets[this._targets.length - 1];\n\n if (this._activeTarget !== target) {\n this._activate(target);\n }\n\n return;\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null;\n\n this._clear();\n\n return;\n }\n\n for (var i = this._offsets.length; i--;) {\n var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n if (isActiveTarget) {\n this._activate(this._targets[i]);\n }\n }\n };\n\n _proto._activate = function _activate(target) {\n this._activeTarget = target;\n\n this._clear();\n\n var queries = this._selector.split(',').map(function (selector) {\n return selector + \"[data-target=\\\"\" + target + \"\\\"],\" + selector + \"[href=\\\"\" + target + \"\\\"]\";\n });\n\n var $link = $__default[\"default\"]([].slice.call(document.querySelectorAll(queries.join(','))));\n\n if ($link.hasClass(CLASS_NAME_DROPDOWN_ITEM)) {\n $link.closest(SELECTOR_DROPDOWN$1).find(SELECTOR_DROPDOWN_TOGGLE$1).addClass(CLASS_NAME_ACTIVE$1);\n $link.addClass(CLASS_NAME_ACTIVE$1);\n } else {\n // Set triggered link as active\n $link.addClass(CLASS_NAME_ACTIVE$1); // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n\n $link.parents(SELECTOR_NAV_LIST_GROUP$1).prev(SELECTOR_NAV_LINKS + \", \" + SELECTOR_LIST_ITEMS).addClass(CLASS_NAME_ACTIVE$1); // Handle special case when .nav-link is inside .nav-item\n\n $link.parents(SELECTOR_NAV_LIST_GROUP$1).prev(SELECTOR_NAV_ITEMS).children(SELECTOR_NAV_LINKS).addClass(CLASS_NAME_ACTIVE$1);\n }\n\n $__default[\"default\"](this._scrollElement).trigger(EVENT_ACTIVATE, {\n relatedTarget: target\n });\n };\n\n _proto._clear = function _clear() {\n [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {\n return node.classList.contains(CLASS_NAME_ACTIVE$1);\n }).forEach(function (node) {\n return node.classList.remove(CLASS_NAME_ACTIVE$1);\n });\n } // Static\n ;\n\n ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var data = $__default[\"default\"](this).data(DATA_KEY$2);\n\n var _config = typeof config === 'object' && config;\n\n if (!data) {\n data = new ScrollSpy(this, _config);\n $__default[\"default\"](this).data(DATA_KEY$2, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n _createClass(ScrollSpy, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION$2;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default$1;\n }\n }]);\n\n return ScrollSpy;\n }();\n /**\n * Data API implementation\n */\n\n\n $__default[\"default\"](window).on(EVENT_LOAD_DATA_API, function () {\n var scrollSpys = [].slice.call(document.querySelectorAll(SELECTOR_DATA_SPY));\n var scrollSpysLength = scrollSpys.length;\n\n for (var i = scrollSpysLength; i--;) {\n var $spy = $__default[\"default\"](scrollSpys[i]);\n\n ScrollSpy._jQueryInterface.call($spy, $spy.data());\n }\n });\n /**\n * jQuery\n */\n\n $__default[\"default\"].fn[NAME$2] = ScrollSpy._jQueryInterface;\n $__default[\"default\"].fn[NAME$2].Constructor = ScrollSpy;\n\n $__default[\"default\"].fn[NAME$2].noConflict = function () {\n $__default[\"default\"].fn[NAME$2] = JQUERY_NO_CONFLICT$2;\n return ScrollSpy._jQueryInterface;\n };\n\n /**\n * Constants\n */\n\n var NAME$1 = 'tab';\n var VERSION$1 = '4.6.2';\n var DATA_KEY$1 = 'bs.tab';\n var EVENT_KEY$1 = \".\" + DATA_KEY$1;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT$1 = $__default[\"default\"].fn[NAME$1];\n var CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';\n var CLASS_NAME_ACTIVE = 'active';\n var CLASS_NAME_DISABLED = 'disabled';\n var CLASS_NAME_FADE$1 = 'fade';\n var CLASS_NAME_SHOW$1 = 'show';\n var EVENT_HIDE$1 = \"hide\" + EVENT_KEY$1;\n var EVENT_HIDDEN$1 = \"hidden\" + EVENT_KEY$1;\n var EVENT_SHOW$1 = \"show\" + EVENT_KEY$1;\n var EVENT_SHOWN$1 = \"shown\" + EVENT_KEY$1;\n var EVENT_CLICK_DATA_API = \"click\" + EVENT_KEY$1 + DATA_API_KEY;\n var SELECTOR_DROPDOWN = '.dropdown';\n var SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\n var SELECTOR_ACTIVE = '.active';\n var SELECTOR_ACTIVE_UL = '> li > .active';\n var SELECTOR_DATA_TOGGLE = '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]';\n var SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';\n var SELECTOR_DROPDOWN_ACTIVE_CHILD = '> .dropdown-menu .active';\n /**\n * Class definition\n */\n\n var Tab = /*#__PURE__*/function () {\n function Tab(element) {\n this._element = element;\n } // Getters\n\n\n var _proto = Tab.prototype;\n\n // Public\n _proto.show = function show() {\n var _this = this;\n\n if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $__default[\"default\"](this._element).hasClass(CLASS_NAME_ACTIVE) || $__default[\"default\"](this._element).hasClass(CLASS_NAME_DISABLED) || this._element.hasAttribute('disabled')) {\n return;\n }\n\n var target;\n var previous;\n var listElement = $__default[\"default\"](this._element).closest(SELECTOR_NAV_LIST_GROUP)[0];\n var selector = Util.getSelectorFromElement(this._element);\n\n if (listElement) {\n var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE;\n previous = $__default[\"default\"].makeArray($__default[\"default\"](listElement).find(itemSelector));\n previous = previous[previous.length - 1];\n }\n\n var hideEvent = $__default[\"default\"].Event(EVENT_HIDE$1, {\n relatedTarget: this._element\n });\n var showEvent = $__default[\"default\"].Event(EVENT_SHOW$1, {\n relatedTarget: previous\n });\n\n if (previous) {\n $__default[\"default\"](previous).trigger(hideEvent);\n }\n\n $__default[\"default\"](this._element).trigger(showEvent);\n\n if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\n return;\n }\n\n if (selector) {\n target = document.querySelector(selector);\n }\n\n this._activate(this._element, listElement);\n\n var complete = function complete() {\n var hiddenEvent = $__default[\"default\"].Event(EVENT_HIDDEN$1, {\n relatedTarget: _this._element\n });\n var shownEvent = $__default[\"default\"].Event(EVENT_SHOWN$1, {\n relatedTarget: previous\n });\n $__default[\"default\"](previous).trigger(hiddenEvent);\n $__default[\"default\"](_this._element).trigger(shownEvent);\n };\n\n if (target) {\n this._activate(target, target.parentNode, complete);\n } else {\n complete();\n }\n };\n\n _proto.dispose = function dispose() {\n $__default[\"default\"].removeData(this._element, DATA_KEY$1);\n this._element = null;\n } // Private\n ;\n\n _proto._activate = function _activate(element, container, callback) {\n var _this2 = this;\n\n var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $__default[\"default\"](container).find(SELECTOR_ACTIVE_UL) : $__default[\"default\"](container).children(SELECTOR_ACTIVE);\n var active = activeElements[0];\n var isTransitioning = callback && active && $__default[\"default\"](active).hasClass(CLASS_NAME_FADE$1);\n\n var complete = function complete() {\n return _this2._transitionComplete(element, active, callback);\n };\n\n if (active && isTransitioning) {\n var transitionDuration = Util.getTransitionDurationFromElement(active);\n $__default[\"default\"](active).removeClass(CLASS_NAME_SHOW$1).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n } else {\n complete();\n }\n };\n\n _proto._transitionComplete = function _transitionComplete(element, active, callback) {\n if (active) {\n $__default[\"default\"](active).removeClass(CLASS_NAME_ACTIVE);\n var dropdownChild = $__default[\"default\"](active.parentNode).find(SELECTOR_DROPDOWN_ACTIVE_CHILD)[0];\n\n if (dropdownChild) {\n $__default[\"default\"](dropdownChild).removeClass(CLASS_NAME_ACTIVE);\n }\n\n if (active.getAttribute('role') === 'tab') {\n active.setAttribute('aria-selected', false);\n }\n }\n\n $__default[\"default\"](element).addClass(CLASS_NAME_ACTIVE);\n\n if (element.getAttribute('role') === 'tab') {\n element.setAttribute('aria-selected', true);\n }\n\n Util.reflow(element);\n\n if (element.classList.contains(CLASS_NAME_FADE$1)) {\n element.classList.add(CLASS_NAME_SHOW$1);\n }\n\n var parent = element.parentNode;\n\n if (parent && parent.nodeName === 'LI') {\n parent = parent.parentNode;\n }\n\n if (parent && $__default[\"default\"](parent).hasClass(CLASS_NAME_DROPDOWN_MENU)) {\n var dropdownElement = $__default[\"default\"](element).closest(SELECTOR_DROPDOWN)[0];\n\n if (dropdownElement) {\n var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(SELECTOR_DROPDOWN_TOGGLE));\n $__default[\"default\"](dropdownToggleList).addClass(CLASS_NAME_ACTIVE);\n }\n\n element.setAttribute('aria-expanded', true);\n }\n\n if (callback) {\n callback();\n }\n } // Static\n ;\n\n Tab._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var $this = $__default[\"default\"](this);\n var data = $this.data(DATA_KEY$1);\n\n if (!data) {\n data = new Tab(this);\n $this.data(DATA_KEY$1, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config]();\n }\n });\n };\n\n _createClass(Tab, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION$1;\n }\n }]);\n\n return Tab;\n }();\n /**\n * Data API implementation\n */\n\n\n $__default[\"default\"](document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault();\n\n Tab._jQueryInterface.call($__default[\"default\"](this), 'show');\n });\n /**\n * jQuery\n */\n\n $__default[\"default\"].fn[NAME$1] = Tab._jQueryInterface;\n $__default[\"default\"].fn[NAME$1].Constructor = Tab;\n\n $__default[\"default\"].fn[NAME$1].noConflict = function () {\n $__default[\"default\"].fn[NAME$1] = JQUERY_NO_CONFLICT$1;\n return Tab._jQueryInterface;\n };\n\n /**\n * Constants\n */\n\n var NAME = 'toast';\n var VERSION = '4.6.2';\n var DATA_KEY = 'bs.toast';\n var EVENT_KEY = \".\" + DATA_KEY;\n var JQUERY_NO_CONFLICT = $__default[\"default\"].fn[NAME];\n var CLASS_NAME_FADE = 'fade';\n var CLASS_NAME_HIDE = 'hide';\n var CLASS_NAME_SHOW = 'show';\n var CLASS_NAME_SHOWING = 'showing';\n var EVENT_CLICK_DISMISS = \"click.dismiss\" + EVENT_KEY;\n var EVENT_HIDE = \"hide\" + EVENT_KEY;\n var EVENT_HIDDEN = \"hidden\" + EVENT_KEY;\n var EVENT_SHOW = \"show\" + EVENT_KEY;\n var EVENT_SHOWN = \"shown\" + EVENT_KEY;\n var SELECTOR_DATA_DISMISS = '[data-dismiss=\"toast\"]';\n var Default = {\n animation: true,\n autohide: true,\n delay: 500\n };\n var DefaultType = {\n animation: 'boolean',\n autohide: 'boolean',\n delay: 'number'\n };\n /**\n * Class definition\n */\n\n var Toast = /*#__PURE__*/function () {\n function Toast(element, config) {\n this._element = element;\n this._config = this._getConfig(config);\n this._timeout = null;\n\n this._setListeners();\n } // Getters\n\n\n var _proto = Toast.prototype;\n\n // Public\n _proto.show = function show() {\n var _this = this;\n\n var showEvent = $__default[\"default\"].Event(EVENT_SHOW);\n $__default[\"default\"](this._element).trigger(showEvent);\n\n if (showEvent.isDefaultPrevented()) {\n return;\n }\n\n this._clearTimeout();\n\n if (this._config.animation) {\n this._element.classList.add(CLASS_NAME_FADE);\n }\n\n var complete = function complete() {\n _this._element.classList.remove(CLASS_NAME_SHOWING);\n\n _this._element.classList.add(CLASS_NAME_SHOW);\n\n $__default[\"default\"](_this._element).trigger(EVENT_SHOWN);\n\n if (_this._config.autohide) {\n _this._timeout = setTimeout(function () {\n _this.hide();\n }, _this._config.delay);\n }\n };\n\n this._element.classList.remove(CLASS_NAME_HIDE);\n\n Util.reflow(this._element);\n\n this._element.classList.add(CLASS_NAME_SHOWING);\n\n if (this._config.animation) {\n var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n $__default[\"default\"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n } else {\n complete();\n }\n };\n\n _proto.hide = function hide() {\n if (!this._element.classList.contains(CLASS_NAME_SHOW)) {\n return;\n }\n\n var hideEvent = $__default[\"default\"].Event(EVENT_HIDE);\n $__default[\"default\"](this._element).trigger(hideEvent);\n\n if (hideEvent.isDefaultPrevented()) {\n return;\n }\n\n this._close();\n };\n\n _proto.dispose = function dispose() {\n this._clearTimeout();\n\n if (this._element.classList.contains(CLASS_NAME_SHOW)) {\n this._element.classList.remove(CLASS_NAME_SHOW);\n }\n\n $__default[\"default\"](this._element).off(EVENT_CLICK_DISMISS);\n $__default[\"default\"].removeData(this._element, DATA_KEY);\n this._element = null;\n this._config = null;\n } // Private\n ;\n\n _proto._getConfig = function _getConfig(config) {\n config = _extends({}, Default, $__default[\"default\"](this._element).data(), typeof config === 'object' && config ? config : {});\n Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);\n return config;\n };\n\n _proto._setListeners = function _setListeners() {\n var _this2 = this;\n\n $__default[\"default\"](this._element).on(EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, function () {\n return _this2.hide();\n });\n };\n\n _proto._close = function _close() {\n var _this3 = this;\n\n var complete = function complete() {\n _this3._element.classList.add(CLASS_NAME_HIDE);\n\n $__default[\"default\"](_this3._element).trigger(EVENT_HIDDEN);\n };\n\n this._element.classList.remove(CLASS_NAME_SHOW);\n\n if (this._config.animation) {\n var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n $__default[\"default\"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n } else {\n complete();\n }\n };\n\n _proto._clearTimeout = function _clearTimeout() {\n clearTimeout(this._timeout);\n this._timeout = null;\n } // Static\n ;\n\n Toast._jQueryInterface = function _jQueryInterface(config) {\n return this.each(function () {\n var $element = $__default[\"default\"](this);\n var data = $element.data(DATA_KEY);\n\n var _config = typeof config === 'object' && config;\n\n if (!data) {\n data = new Toast(this, _config);\n $element.data(DATA_KEY, data);\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n }\n\n data[config](this);\n }\n });\n };\n\n _createClass(Toast, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION;\n }\n }, {\n key: \"DefaultType\",\n get: function get() {\n return DefaultType;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default;\n }\n }]);\n\n return Toast;\n }();\n /**\n * jQuery\n */\n\n\n $__default[\"default\"].fn[NAME] = Toast._jQueryInterface;\n $__default[\"default\"].fn[NAME].Constructor = Toast;\n\n $__default[\"default\"].fn[NAME].noConflict = function () {\n $__default[\"default\"].fn[NAME] = JQUERY_NO_CONFLICT;\n return Toast._jQueryInterface;\n };\n\n exports.Alert = Alert;\n exports.Button = Button;\n exports.Carousel = Carousel;\n exports.Collapse = Collapse;\n exports.Dropdown = Dropdown;\n exports.Modal = Modal;\n exports.Popover = Popover;\n exports.Scrollspy = ScrollSpy;\n exports.Tab = Tab;\n exports.Toast = Toast;\n exports.Tooltip = Tooltip;\n exports.Util = Util;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=bootstrap.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2Rpc3QvanMvYm9vdHN0cmFwLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsS0FBNEQsb0JBQW9CLG1CQUFPLENBQUMsb0RBQVEsR0FBRyxtQkFBTyxDQUFDLDhEQUFXO0FBQ3hILEVBQUUsQ0FDd0k7QUFDMUksQ0FBQyx5Q0FBeUM7O0FBRTFDLHVDQUF1Qyw0REFBNEQ7O0FBRW5HO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCLHNCQUFzQjtBQUM1Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRUFBaUU7QUFDakU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQyxRQUFROztBQUVSO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RDs7QUFFOUQ7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEI7QUFDOUIsTUFBTTtBQUNOOztBQUVBO0FBQ0EsZ0NBQWdDOztBQUVoQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMENBQTBDLFNBQVM7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjs7QUFFQSw0Q0FBNEMsV0FBVztBQUN2RDs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCOztBQUUvQixnQ0FBZ0M7O0FBRWhDLG9DQUFvQzs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJEQUEyRDtBQUMzRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEI7O0FBRTVCO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlDQUFpQzs7QUFFakM7QUFDQSwrQkFBK0I7QUFDL0I7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEI7O0FBRTlCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQSw0Q0FBNEMsU0FBUztBQUNyRDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0NBQStDLFNBQVM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLHdCQUF3QjtBQUNoRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUIsOENBQThDOztBQUU5QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUMsZ0ZBQWdGOztBQUVqSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7O0FBRTdCLDBCQUEwQjs7QUFFMUIsdUJBQXVCOztBQUV2Qiw2QkFBNkI7O0FBRTdCLCtCQUErQjs7QUFFL0Isb0NBQW9DOztBQUVwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YscURBQXFEOztBQUVyRDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDOztBQUV4QztBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3QjtBQUN4QixNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsNENBQTRDLFNBQVM7QUFDckQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTzs7QUFFUDtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPOztBQUVQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrRkFBK0Y7O0FBRS9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxHQUFHOztBQUVaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxHQUFHOztBQUVaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLEdBQUc7O0FBRVY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sR0FBRzs7QUFFVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUMsbUdBQW1HOztBQUVwSTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx3RkFBd0Y7O0FBRXhGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVJQUF1STs7QUFFdkk7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLLEdBQUc7O0FBRVIseUNBQXlDLFNBQVM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdEQUF3RDs7QUFFeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQSwyQ0FBMkMsU0FBUztBQUNwRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOzs7QUFHTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRTtBQUN0RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsaUVBQWlFO0FBQ2pFOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4Qjs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsMEJBQTBCLDhGQUE4Rjs7QUFFeEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVILGlDQUFpQztBQUNqQztBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUE4RDs7QUFFOUQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSxNQUFNOzs7QUFHTjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0EsMEJBQTBCLCtEQUErRDs7QUFFekY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSx5Q0FBeUMsSUFBSTtBQUM3Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE9BQU87O0FBRVA7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsNkNBQTZDO0FBQzdDOztBQUVBLHNJQUFzSTs7QUFFdEk7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUEsbUNBQW1DLElBQUk7QUFDdkM7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7O0FBR047O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBLDBCQUEwQiwwR0FBMEc7QUFDcEk7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaURBQWlELGFBQWE7O0FBRTlELENBQUM7QUFDRCIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvZGlzdC9qcy9ib290c3RyYXAuanM/OTA5NSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAgKiBCb290c3RyYXAgdjQuNi4yIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjIgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cywgcmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ3BvcHBlci5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnLCAnanF1ZXJ5JywgJ3BvcHBlci5qcyddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGZhY3RvcnkoZ2xvYmFsLmJvb3RzdHJhcCA9IHt9LCBnbG9iYWwualF1ZXJ5LCBnbG9iYWwuUG9wcGVyKSk7XG59KSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMsICQsIFBvcHBlcikgeyAndXNlIHN0cmljdCc7XG5cbiAgZnVuY3Rpb24gX2ludGVyb3BEZWZhdWx0TGVnYWN5IChlKSB7IHJldHVybiBlICYmIHR5cGVvZiBlID09PSAnb2JqZWN0JyAmJiAnZGVmYXVsdCcgaW4gZSA/IGUgOiB7ICdkZWZhdWx0JzogZSB9OyB9XG5cbiAgdmFyICRfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0TGVnYWN5KCQpO1xuICB2YXIgUG9wcGVyX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdExlZ2FjeShQb3BwZXIpO1xuXG4gIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwge1xuICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgfSk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9XG5cbiAgZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gICAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9O1xuICAgIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcblxuICAgIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG4gIH1cblxuICBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICAgIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICAgICAgby5fX3Byb3RvX18gPSBwO1xuICAgICAgcmV0dXJuIG87XG4gICAgfTtcbiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xuICB9XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuNi4yKTogdXRpbC5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG4gIC8qKlxuICAgKiBQcml2YXRlIFRyYW5zaXRpb25FbmQgSGVscGVyc1xuICAgKi9cblxuICB2YXIgVFJBTlNJVElPTl9FTkQgPSAndHJhbnNpdGlvbmVuZCc7XG4gIHZhciBNQVhfVUlEID0gMTAwMDAwMDtcbiAgdmFyIE1JTExJU0VDT05EU19NVUxUSVBMSUVSID0gMTAwMDsgLy8gU2hvdXRvdXQgQW5ndXNDcm9sbCAoaHR0cHM6Ly9nb28uZ2wvcHh3UUdwKVxuXG4gIGZ1bmN0aW9uIHRvVHlwZShvYmopIHtcbiAgICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gXCJcIiArIG9iajtcbiAgICB9XG5cbiAgICByZXR1cm4ge30udG9TdHJpbmcuY2FsbChvYmopLm1hdGNoKC9cXHMoW2Etel0rKS9pKVsxXS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U3BlY2lhbFRyYW5zaXRpb25FbmRFdmVudCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmluZFR5cGU6IFRSQU5TSVRJT05fRU5ELFxuICAgICAgZGVsZWdhdGVUeXBlOiBUUkFOU0lUSU9OX0VORCxcbiAgICAgIGhhbmRsZTogZnVuY3Rpb24gaGFuZGxlKGV2ZW50KSB7XG4gICAgICAgIGlmICgkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShldmVudC50YXJnZXQpLmlzKHRoaXMpKSB7XG4gICAgICAgICAgcmV0dXJuIGV2ZW50LmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2l0aW9uRW5kRW11bGF0b3IoZHVyYXRpb24pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgVXRpbC50cmlnZ2VyVHJhbnNpdGlvbkVuZChfdGhpcyk7XG4gICAgICB9XG4gICAgfSwgZHVyYXRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0VHJhbnNpdGlvbkVuZFN1cHBvcnQoKSB7XG4gICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uZm4uZW11bGF0ZVRyYW5zaXRpb25FbmQgPSB0cmFuc2l0aW9uRW5kRW11bGF0b3I7XG4gICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uZXZlbnQuc3BlY2lhbFtVdGlsLlRSQU5TSVRJT05fRU5EXSA9IGdldFNwZWNpYWxUcmFuc2l0aW9uRW5kRXZlbnQoKTtcbiAgfVxuICAvKipcbiAgICogUHVibGljIFV0aWwgQVBJXG4gICAqL1xuXG5cbiAgdmFyIFV0aWwgPSB7XG4gICAgVFJBTlNJVElPTl9FTkQ6ICdic1RyYW5zaXRpb25FbmQnLFxuICAgIGdldFVJRDogZnVuY3Rpb24gZ2V0VUlEKHByZWZpeCkge1xuICAgICAgZG8ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgICAgICBwcmVmaXggKz0gfn4oTWF0aC5yYW5kb20oKSAqIE1BWF9VSUQpOyAvLyBcIn5+XCIgYWN0cyBsaWtlIGEgZmFzdGVyIE1hdGguZmxvb3IoKSBoZXJlXG4gICAgICB9IHdoaWxlIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwcmVmaXgpKTtcblxuICAgICAgcmV0dXJuIHByZWZpeDtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yRnJvbUVsZW1lbnQ6IGZ1bmN0aW9uIGdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGFyZ2V0Jyk7XG5cbiAgICAgIGlmICghc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09ICcjJykge1xuICAgICAgICB2YXIgaHJlZkF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgICAgICBzZWxlY3RvciA9IGhyZWZBdHRyICYmIGhyZWZBdHRyICE9PSAnIycgPyBocmVmQXR0ci50cmltKCkgOiAnJztcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpID8gc2VsZWN0b3IgOiBudWxsO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50OiBmdW5jdGlvbiBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9IC8vIEdldCB0cmFuc2l0aW9uLWR1cmF0aW9uIG9mIHRoZSBlbGVtZW50XG5cblxuICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGVsZW1lbnQpLmNzcygndHJhbnNpdGlvbi1kdXJhdGlvbicpO1xuICAgICAgdmFyIHRyYW5zaXRpb25EZWxheSA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGVsZW1lbnQpLmNzcygndHJhbnNpdGlvbi1kZWxheScpO1xuICAgICAgdmFyIGZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uID0gcGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgdmFyIGZsb2F0VHJhbnNpdGlvbkRlbGF5ID0gcGFyc2VGbG9hdCh0cmFuc2l0aW9uRGVsYXkpOyAvLyBSZXR1cm4gMCBpZiBlbGVtZW50IG9yIHRyYW5zaXRpb24gZHVyYXRpb24gaXMgbm90IGZvdW5kXG5cbiAgICAgIGlmICghZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gJiYgIWZsb2F0VHJhbnNpdGlvbkRlbGF5KSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSAvLyBJZiBtdWx0aXBsZSBkdXJhdGlvbnMgYXJlIGRlZmluZWQsIHRha2UgdGhlIGZpcnN0XG5cblxuICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uID0gdHJhbnNpdGlvbkR1cmF0aW9uLnNwbGl0KCcsJylbMF07XG4gICAgICB0cmFuc2l0aW9uRGVsYXkgPSB0cmFuc2l0aW9uRGVsYXkuc3BsaXQoJywnKVswXTtcbiAgICAgIHJldHVybiAocGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pICsgcGFyc2VGbG9hdCh0cmFuc2l0aW9uRGVsYXkpKSAqIE1JTExJU0VDT05EU19NVUxUSVBMSUVSO1xuICAgIH0sXG4gICAgcmVmbG93OiBmdW5jdGlvbiByZWZsb3coZWxlbWVudCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIH0sXG4gICAgdHJpZ2dlclRyYW5zaXRpb25FbmQ6IGZ1bmN0aW9uIHRyaWdnZXJUcmFuc2l0aW9uRW5kKGVsZW1lbnQpIHtcbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGVsZW1lbnQpLnRyaWdnZXIoVFJBTlNJVElPTl9FTkQpO1xuICAgIH0sXG4gICAgc3VwcG9ydHNUcmFuc2l0aW9uRW5kOiBmdW5jdGlvbiBzdXBwb3J0c1RyYW5zaXRpb25FbmQoKSB7XG4gICAgICByZXR1cm4gQm9vbGVhbihUUkFOU0lUSU9OX0VORCk7XG4gICAgfSxcbiAgICBpc0VsZW1lbnQ6IGZ1bmN0aW9uIGlzRWxlbWVudChvYmopIHtcbiAgICAgIHJldHVybiAob2JqWzBdIHx8IG9iaikubm9kZVR5cGU7XG4gICAgfSxcbiAgICB0eXBlQ2hlY2tDb25maWc6IGZ1bmN0aW9uIHR5cGVDaGVja0NvbmZpZyhjb21wb25lbnROYW1lLCBjb25maWcsIGNvbmZpZ1R5cGVzKSB7XG4gICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBjb25maWdUeXBlcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZ1R5cGVzLCBwcm9wZXJ0eSkpIHtcbiAgICAgICAgICB2YXIgZXhwZWN0ZWRUeXBlcyA9IGNvbmZpZ1R5cGVzW3Byb3BlcnR5XTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBjb25maWdbcHJvcGVydHldO1xuICAgICAgICAgIHZhciB2YWx1ZVR5cGUgPSB2YWx1ZSAmJiBVdGlsLmlzRWxlbWVudCh2YWx1ZSkgPyAnZWxlbWVudCcgOiB0b1R5cGUodmFsdWUpO1xuXG4gICAgICAgICAgaWYgKCFuZXcgUmVnRXhwKGV4cGVjdGVkVHlwZXMpLnRlc3QodmFsdWVUeXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbXBvbmVudE5hbWUudG9VcHBlckNhc2UoKSArIFwiOiBcIiArIChcIk9wdGlvbiBcXFwiXCIgKyBwcm9wZXJ0eSArIFwiXFxcIiBwcm92aWRlZCB0eXBlIFxcXCJcIiArIHZhbHVlVHlwZSArIFwiXFxcIiBcIikgKyAoXCJidXQgZXhwZWN0ZWQgdHlwZSBcXFwiXCIgKyBleHBlY3RlZFR5cGVzICsgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBmaW5kU2hhZG93Um9vdDogZnVuY3Rpb24gZmluZFNoYWRvd1Jvb3QoZWxlbWVudCkge1xuICAgICAgaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoU2hhZG93KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSAvLyBDYW4gZmluZCB0aGUgc2hhZG93IHJvb3Qgb3RoZXJ3aXNlIGl0J2xsIHJldHVybiB0aGUgZG9jdW1lbnRcblxuXG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQuZ2V0Um9vdE5vZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIHJldHVybiByb290IGluc3RhbmNlb2YgU2hhZG93Um9vdCA/IHJvb3QgOiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICB9IC8vIHdoZW4gd2UgZG9uJ3QgZmluZCBhIHNoYWRvdyByb290XG5cblxuICAgICAgaWYgKCFlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBVdGlsLmZpbmRTaGFkb3dSb290KGVsZW1lbnQucGFyZW50Tm9kZSk7XG4gICAgfSxcbiAgICBqUXVlcnlEZXRlY3Rpb246IGZ1bmN0aW9uIGpRdWVyeURldGVjdGlvbigpIHtcbiAgICAgIGlmICh0eXBlb2YgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Jvb3RzdHJhcFxcJ3MgSmF2YVNjcmlwdCByZXF1aXJlcyBqUXVlcnkuIGpRdWVyeSBtdXN0IGJlIGluY2x1ZGVkIGJlZm9yZSBCb290c3RyYXBcXCdzIEphdmFTY3JpcHQuJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciB2ZXJzaW9uID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uZm4uanF1ZXJ5LnNwbGl0KCcgJylbMF0uc3BsaXQoJy4nKTtcbiAgICAgIHZhciBtaW5NYWpvciA9IDE7XG4gICAgICB2YXIgbHRNYWpvciA9IDI7XG4gICAgICB2YXIgbWluTWlub3IgPSA5O1xuICAgICAgdmFyIG1pblBhdGNoID0gMTtcbiAgICAgIHZhciBtYXhNYWpvciA9IDQ7XG5cbiAgICAgIGlmICh2ZXJzaW9uWzBdIDwgbHRNYWpvciAmJiB2ZXJzaW9uWzFdIDwgbWluTWlub3IgfHwgdmVyc2lvblswXSA9PT0gbWluTWFqb3IgJiYgdmVyc2lvblsxXSA9PT0gbWluTWlub3IgJiYgdmVyc2lvblsyXSA8IG1pblBhdGNoIHx8IHZlcnNpb25bMF0gPj0gbWF4TWFqb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCb290c3RyYXBcXCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgYXQgbGVhc3QgalF1ZXJ5IHYxLjkuMSBidXQgbGVzcyB0aGFuIHY0LjAuMCcpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgVXRpbC5qUXVlcnlEZXRlY3Rpb24oKTtcbiAgc2V0VHJhbnNpdGlvbkVuZFN1cHBvcnQoKTtcblxuICAvKipcbiAgICogQ29uc3RhbnRzXG4gICAqL1xuXG4gIHZhciBOQU1FJGEgPSAnYWxlcnQnO1xuICB2YXIgVkVSU0lPTiRhID0gJzQuNi4yJztcbiAgdmFyIERBVEFfS0VZJGEgPSAnYnMuYWxlcnQnO1xuICB2YXIgRVZFTlRfS0VZJGEgPSBcIi5cIiArIERBVEFfS0VZJGE7XG4gIHZhciBEQVRBX0FQSV9LRVkkNyA9ICcuZGF0YS1hcGknO1xuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJGEgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJGFdO1xuICB2YXIgQ0xBU1NfTkFNRV9BTEVSVCA9ICdhbGVydCc7XG4gIHZhciBDTEFTU19OQU1FX0ZBREUkNSA9ICdmYWRlJztcbiAgdmFyIENMQVNTX05BTUVfU0hPVyQ3ID0gJ3Nob3cnO1xuICB2YXIgRVZFTlRfQ0xPU0UgPSBcImNsb3NlXCIgKyBFVkVOVF9LRVkkYTtcbiAgdmFyIEVWRU5UX0NMT1NFRCA9IFwiY2xvc2VkXCIgKyBFVkVOVF9LRVkkYTtcbiAgdmFyIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDYgPSBcImNsaWNrXCIgKyBFVkVOVF9LRVkkYSArIERBVEFfQVBJX0tFWSQ3O1xuICB2YXIgU0VMRUNUT1JfRElTTUlTUyA9ICdbZGF0YS1kaXNtaXNzPVwiYWxlcnRcIl0nO1xuICAvKipcbiAgICogQ2xhc3MgZGVmaW5pdGlvblxuICAgKi9cblxuICB2YXIgQWxlcnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFsZXJ0KGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICB2YXIgX3Byb3RvID0gQWxlcnQucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLmNsb3NlID0gZnVuY3Rpb24gY2xvc2UoZWxlbWVudCkge1xuICAgICAgdmFyIHJvb3RFbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcblxuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgcm9vdEVsZW1lbnQgPSB0aGlzLl9nZXRSb290RWxlbWVudChlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGN1c3RvbUV2ZW50ID0gdGhpcy5fdHJpZ2dlckNsb3NlRXZlbnQocm9vdEVsZW1lbnQpO1xuXG4gICAgICBpZiAoY3VzdG9tRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9yZW1vdmVFbGVtZW50KHJvb3RFbGVtZW50KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0ucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSRhKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fZ2V0Um9vdEVsZW1lbnQgPSBmdW5jdGlvbiBfZ2V0Um9vdEVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW1lbnQpO1xuICAgICAgdmFyIHBhcmVudCA9IGZhbHNlO1xuXG4gICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgcGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG5cbiAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgIHBhcmVudCA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGVsZW1lbnQpLmNsb3Nlc3QoXCIuXCIgKyBDTEFTU19OQU1FX0FMRVJUKVswXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl90cmlnZ2VyQ2xvc2VFdmVudCA9IGZ1bmN0aW9uIF90cmlnZ2VyQ2xvc2VFdmVudChlbGVtZW50KSB7XG4gICAgICB2YXIgY2xvc2VFdmVudCA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLkV2ZW50KEVWRU5UX0NMT1NFKTtcbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGVsZW1lbnQpLnRyaWdnZXIoY2xvc2VFdmVudCk7XG4gICAgICByZXR1cm4gY2xvc2VFdmVudDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9yZW1vdmVFbGVtZW50ID0gZnVuY3Rpb24gX3JlbW92ZUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZWxlbWVudCkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDcpO1xuXG4gICAgICBpZiAoISRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGVsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRkFERSQ1KSkge1xuICAgICAgICB0aGlzLl9kZXN0cm95RWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KGVsZW1lbnQpO1xuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuX2Rlc3Ryb3lFbGVtZW50KGVsZW1lbnQsIGV2ZW50KTtcbiAgICAgIH0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgfTtcblxuICAgIF9wcm90by5fZGVzdHJveUVsZW1lbnQgPSBmdW5jdGlvbiBfZGVzdHJveUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZWxlbWVudCkuZGV0YWNoKCkudHJpZ2dlcihFVkVOVF9DTE9TRUQpLnJlbW92ZSgpO1xuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgQWxlcnQuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICRlbGVtZW50ID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcyk7XG4gICAgICAgIHZhciBkYXRhID0gJGVsZW1lbnQuZGF0YShEQVRBX0tFWSRhKTtcblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IEFsZXJ0KHRoaXMpO1xuICAgICAgICAgICRlbGVtZW50LmRhdGEoREFUQV9LRVkkYSwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnID09PSAnY2xvc2UnKSB7XG4gICAgICAgICAgZGF0YVtjb25maWddKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgQWxlcnQuX2hhbmRsZURpc21pc3MgPSBmdW5jdGlvbiBfaGFuZGxlRGlzbWlzcyhhbGVydEluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBhbGVydEluc3RhbmNlLmNsb3NlKHRoaXMpO1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKEFsZXJ0LCBudWxsLCBbe1xuICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVkVSU0lPTiRhO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBBbGVydDtcbiAgfSgpO1xuICAvKipcbiAgICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAgICovXG5cblxuICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShkb2N1bWVudCkub24oRVZFTlRfQ0xJQ0tfREFUQV9BUEkkNiwgU0VMRUNUT1JfRElTTUlTUywgQWxlcnQuX2hhbmRsZURpc21pc3MobmV3IEFsZXJ0KCkpKTtcbiAgLyoqXG4gICAqIGpRdWVyeVxuICAgKi9cblxuICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJGFdID0gQWxlcnQuX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uZm5bTkFNRSRhXS5Db25zdHJ1Y3RvciA9IEFsZXJ0O1xuXG4gICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkYV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJGFdID0gSlFVRVJZX05PX0NPTkZMSUNUJGE7XG4gICAgcmV0dXJuIEFsZXJ0Ll9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICB2YXIgTkFNRSQ5ID0gJ2J1dHRvbic7XG4gIHZhciBWRVJTSU9OJDkgPSAnNC42LjInO1xuICB2YXIgREFUQV9LRVkkOSA9ICdicy5idXR0b24nO1xuICB2YXIgRVZFTlRfS0VZJDkgPSBcIi5cIiArIERBVEFfS0VZJDk7XG4gIHZhciBEQVRBX0FQSV9LRVkkNiA9ICcuZGF0YS1hcGknO1xuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJDkgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJDldO1xuICB2YXIgQ0xBU1NfTkFNRV9BQ1RJVkUkMyA9ICdhY3RpdmUnO1xuICB2YXIgQ0xBU1NfTkFNRV9CVVRUT04gPSAnYnRuJztcbiAgdmFyIENMQVNTX05BTUVfRk9DVVMgPSAnZm9jdXMnO1xuICB2YXIgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkNSA9IFwiY2xpY2tcIiArIEVWRU5UX0tFWSQ5ICsgREFUQV9BUElfS0VZJDY7XG4gIHZhciBFVkVOVF9GT0NVU19CTFVSX0RBVEFfQVBJID0gXCJmb2N1c1wiICsgRVZFTlRfS0VZJDkgKyBEQVRBX0FQSV9LRVkkNiArIFwiIFwiICsgKFwiYmx1clwiICsgRVZFTlRfS0VZJDkgKyBEQVRBX0FQSV9LRVkkNik7XG4gIHZhciBFVkVOVF9MT0FEX0RBVEFfQVBJJDIgPSBcImxvYWRcIiArIEVWRU5UX0tFWSQ5ICsgREFUQV9BUElfS0VZJDY7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9DQVJST1QgPSAnW2RhdGEtdG9nZ2xlXj1cImJ1dHRvblwiXSc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRVMgPSAnW2RhdGEtdG9nZ2xlPVwiYnV0dG9uc1wiXSc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQ0ID0gJ1tkYXRhLXRvZ2dsZT1cImJ1dHRvblwiXSc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRVNfQlVUVE9OUyA9ICdbZGF0YS10b2dnbGU9XCJidXR0b25zXCJdIC5idG4nO1xuICB2YXIgU0VMRUNUT1JfSU5QVVQgPSAnaW5wdXQ6bm90KFt0eXBlPVwiaGlkZGVuXCJdKSc7XG4gIHZhciBTRUxFQ1RPUl9BQ1RJVkUkMiA9ICcuYWN0aXZlJztcbiAgdmFyIFNFTEVDVE9SX0JVVFRPTiA9ICcuYnRuJztcbiAgLyoqXG4gICAqIENsYXNzIGRlZmluaXRpb25cbiAgICovXG5cbiAgdmFyIEJ1dHRvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQnV0dG9uKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgdGhpcy5zaG91bGRBdm9pZFRyaWdnZXJDaGFuZ2UgPSBmYWxzZTtcbiAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgdmFyIF9wcm90byA9IEJ1dHRvbi5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8udG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgICAgdmFyIHRyaWdnZXJDaGFuZ2VFdmVudCA9IHRydWU7XG4gICAgICB2YXIgYWRkQXJpYVByZXNzZWQgPSB0cnVlO1xuICAgICAgdmFyIHJvb3RFbGVtZW50ID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZWxlbWVudCkuY2xvc2VzdChTRUxFQ1RPUl9EQVRBX1RPR0dMRVMpWzBdO1xuXG4gICAgICBpZiAocm9vdEVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SX0lOUFVUKTtcblxuICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICBpZiAoaW5wdXQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICAgICAgaWYgKGlucHV0LmNoZWNrZWQgJiYgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9BQ1RJVkUkMykpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckNoYW5nZUV2ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgYWN0aXZlRWxlbWVudCA9IHJvb3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfQUNUSVZFJDIpO1xuXG4gICAgICAgICAgICAgIGlmIChhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oYWN0aXZlRWxlbWVudCkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgICAvLyBpZiBpdCdzIG5vdCBhIHJhZGlvIGJ1dHRvbiBvciBjaGVja2JveCBkb24ndCBhZGQgYSBwb2ludGxlc3MvaW52YWxpZCBjaGVja2VkIHByb3BlcnR5IHRvIHRoZSBpbnB1dFxuICAgICAgICAgICAgaWYgKGlucHV0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgaW5wdXQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gIXRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQUNUSVZFJDMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkQXZvaWRUcmlnZ2VyQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGlucHV0KS50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICAgIGFkZEFyaWFQcmVzc2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCEodGhpcy5fZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgfHwgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpKSB7XG4gICAgICAgIGlmIChhZGRBcmlhUHJlc3NlZCkge1xuICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAhdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9BQ1RJVkUkMykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRyaWdnZXJDaGFuZ2VFdmVudCkge1xuICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLnRvZ2dsZUNsYXNzKENMQVNTX05BTUVfQUNUSVZFJDMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkkOSk7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIEJ1dHRvbi5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcsIGF2b2lkVHJpZ2dlckNoYW5nZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkZWxlbWVudCA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMpO1xuICAgICAgICB2YXIgZGF0YSA9ICRlbGVtZW50LmRhdGEoREFUQV9LRVkkOSk7XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBCdXR0b24odGhpcyk7XG4gICAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0tFWSQ5LCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEuc2hvdWxkQXZvaWRUcmlnZ2VyQ2hhbmdlID0gYXZvaWRUcmlnZ2VyQ2hhbmdlO1xuXG4gICAgICAgIGlmIChjb25maWcgPT09ICd0b2dnbGUnKSB7XG4gICAgICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoQnV0dG9uLCBudWxsLCBbe1xuICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVkVSU0lPTiQ5O1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBCdXR0b247XG4gIH0oKTtcbiAgLyoqXG4gICAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gICAqL1xuXG5cbiAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZG9jdW1lbnQpLm9uKEVWRU5UX0NMSUNLX0RBVEFfQVBJJDUsIFNFTEVDVE9SX0RBVEFfVE9HR0xFX0NBUlJPVCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIGJ1dHRvbiA9IGV2ZW50LnRhcmdldDtcbiAgICB2YXIgaW5pdGlhbEJ1dHRvbiA9IGJ1dHRvbjtcblxuICAgIGlmICghJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oYnV0dG9uKS5oYXNDbGFzcyhDTEFTU19OQU1FX0JVVFRPTikpIHtcbiAgICAgIGJ1dHRvbiA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGJ1dHRvbikuY2xvc2VzdChTRUxFQ1RPUl9CVVRUT04pWzBdO1xuICAgIH1cblxuICAgIGlmICghYnV0dG9uIHx8IGJ1dHRvbi5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgfHwgYnV0dG9uLmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gd29yayBhcm91bmQgRmlyZWZveCBidWcgIzE1NDA5OTVcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGlucHV0QnRuID0gYnV0dG9uLnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfSU5QVVQpO1xuXG4gICAgICBpZiAoaW5wdXRCdG4gJiYgKGlucHV0QnRuLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCBpbnB1dEJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIHdvcmsgYXJvdW5kIEZpcmVmb3ggYnVnICMxNTQwOTk1XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5pdGlhbEJ1dHRvbi50YWdOYW1lID09PSAnSU5QVVQnIHx8IGJ1dHRvbi50YWdOYW1lICE9PSAnTEFCRUwnKSB7XG4gICAgICAgIEJ1dHRvbi5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oYnV0dG9uKSwgJ3RvZ2dsZScsIGluaXRpYWxCdXR0b24udGFnTmFtZSA9PT0gJ0lOUFVUJyk7XG4gICAgICB9XG4gICAgfVxuICB9KS5vbihFVkVOVF9GT0NVU19CTFVSX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9DQVJST1QsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBidXR0b24gPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShldmVudC50YXJnZXQpLmNsb3Nlc3QoU0VMRUNUT1JfQlVUVE9OKVswXTtcbiAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShidXR0b24pLnRvZ2dsZUNsYXNzKENMQVNTX05BTUVfRk9DVVMsIC9eZm9jdXMoaW4pPyQvLnRlc3QoZXZlbnQudHlwZSkpO1xuICB9KTtcbiAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0od2luZG93KS5vbihFVkVOVF9MT0FEX0RBVEFfQVBJJDIsIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlbnN1cmUgY29ycmVjdCBhY3RpdmUgY2xhc3MgaXMgc2V0IHRvIG1hdGNoIHRoZSBjb250cm9scycgYWN0dWFsIHZhbHVlcy9zdGF0ZXNcbiAgICAvLyBmaW5kIGFsbCBjaGVja2JveGVzL3JlYWRpbyBidXR0b25zIGluc2lkZSBkYXRhLXRvZ2dsZSBncm91cHNcbiAgICB2YXIgYnV0dG9ucyA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9EQVRBX1RPR0dMRVNfQlVUVE9OUykpO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGJ1dHRvbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhciBidXR0b24gPSBidXR0b25zW2ldO1xuICAgICAgdmFyIGlucHV0ID0gYnV0dG9uLnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfSU5QVVQpO1xuXG4gICAgICBpZiAoaW5wdXQuY2hlY2tlZCB8fCBpbnB1dC5oYXNBdHRyaWJ1dGUoJ2NoZWNrZWQnKSkge1xuICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSQzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFJDMpO1xuICAgICAgfVxuICAgIH0gLy8gZmluZCBhbGwgYnV0dG9uIHRvZ2dsZXNcblxuXG4gICAgYnV0dG9ucyA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9EQVRBX1RPR0dMRSQ0KSk7XG5cbiAgICBmb3IgKHZhciBfaSA9IDAsIF9sZW4gPSBidXR0b25zLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICB2YXIgX2J1dHRvbiA9IGJ1dHRvbnNbX2ldO1xuXG4gICAgICBpZiAoX2J1dHRvbi5nZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcpID09PSAndHJ1ZScpIHtcbiAgICAgICAgX2J1dHRvbi5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFJDMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFJDMpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiBqUXVlcnlcbiAgICovXG5cbiAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uZm5bTkFNRSQ5XSA9IEJ1dHRvbi5falF1ZXJ5SW50ZXJmYWNlO1xuICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJDldLkNvbnN0cnVjdG9yID0gQnV0dG9uO1xuXG4gICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkOV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJDldID0gSlFVRVJZX05PX0NPTkZMSUNUJDk7XG4gICAgcmV0dXJuIEJ1dHRvbi5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDb25zdGFudHNcbiAgICovXG5cbiAgdmFyIE5BTUUkOCA9ICdjYXJvdXNlbCc7XG4gIHZhciBWRVJTSU9OJDggPSAnNC42LjInO1xuICB2YXIgREFUQV9LRVkkOCA9ICdicy5jYXJvdXNlbCc7XG4gIHZhciBFVkVOVF9LRVkkOCA9IFwiLlwiICsgREFUQV9LRVkkODtcbiAgdmFyIERBVEFfQVBJX0tFWSQ1ID0gJy5kYXRhLWFwaSc7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkOCA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkOF07XG4gIHZhciBBUlJPV19MRUZUX0tFWUNPREUgPSAzNzsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3IgbGVmdCBhcnJvdyBrZXlcblxuICB2YXIgQVJST1dfUklHSFRfS0VZQ09ERSA9IDM5OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciByaWdodCBhcnJvdyBrZXlcblxuICB2YXIgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCA9IDUwMDsgLy8gVGltZSBmb3IgbW91c2UgY29tcGF0IGV2ZW50cyB0byBmaXJlIGFmdGVyIHRvdWNoXG5cbiAgdmFyIFNXSVBFX1RIUkVTSE9MRCA9IDQwO1xuICB2YXIgQ0xBU1NfTkFNRV9DQVJPVVNFTCA9ICdjYXJvdXNlbCc7XG4gIHZhciBDTEFTU19OQU1FX0FDVElWRSQyID0gJ2FjdGl2ZSc7XG4gIHZhciBDTEFTU19OQU1FX1NMSURFID0gJ3NsaWRlJztcbiAgdmFyIENMQVNTX05BTUVfUklHSFQgPSAnY2Fyb3VzZWwtaXRlbS1yaWdodCc7XG4gIHZhciBDTEFTU19OQU1FX0xFRlQgPSAnY2Fyb3VzZWwtaXRlbS1sZWZ0JztcbiAgdmFyIENMQVNTX05BTUVfTkVYVCA9ICdjYXJvdXNlbC1pdGVtLW5leHQnO1xuICB2YXIgQ0xBU1NfTkFNRV9QUkVWID0gJ2Nhcm91c2VsLWl0ZW0tcHJldic7XG4gIHZhciBDTEFTU19OQU1FX1BPSU5URVJfRVZFTlQgPSAncG9pbnRlci1ldmVudCc7XG4gIHZhciBESVJFQ1RJT05fTkVYVCA9ICduZXh0JztcbiAgdmFyIERJUkVDVElPTl9QUkVWID0gJ3ByZXYnO1xuICB2YXIgRElSRUNUSU9OX0xFRlQgPSAnbGVmdCc7XG4gIHZhciBESVJFQ1RJT05fUklHSFQgPSAncmlnaHQnO1xuICB2YXIgRVZFTlRfU0xJREUgPSBcInNsaWRlXCIgKyBFVkVOVF9LRVkkODtcbiAgdmFyIEVWRU5UX1NMSUQgPSBcInNsaWRcIiArIEVWRU5UX0tFWSQ4O1xuICB2YXIgRVZFTlRfS0VZRE9XTiA9IFwia2V5ZG93blwiICsgRVZFTlRfS0VZJDg7XG4gIHZhciBFVkVOVF9NT1VTRUVOVEVSID0gXCJtb3VzZWVudGVyXCIgKyBFVkVOVF9LRVkkODtcbiAgdmFyIEVWRU5UX01PVVNFTEVBVkUgPSBcIm1vdXNlbGVhdmVcIiArIEVWRU5UX0tFWSQ4O1xuICB2YXIgRVZFTlRfVE9VQ0hTVEFSVCA9IFwidG91Y2hzdGFydFwiICsgRVZFTlRfS0VZJDg7XG4gIHZhciBFVkVOVF9UT1VDSE1PVkUgPSBcInRvdWNobW92ZVwiICsgRVZFTlRfS0VZJDg7XG4gIHZhciBFVkVOVF9UT1VDSEVORCA9IFwidG91Y2hlbmRcIiArIEVWRU5UX0tFWSQ4O1xuICB2YXIgRVZFTlRfUE9JTlRFUkRPV04gPSBcInBvaW50ZXJkb3duXCIgKyBFVkVOVF9LRVkkODtcbiAgdmFyIEVWRU5UX1BPSU5URVJVUCA9IFwicG9pbnRlcnVwXCIgKyBFVkVOVF9LRVkkODtcbiAgdmFyIEVWRU5UX0RSQUdfU1RBUlQgPSBcImRyYWdzdGFydFwiICsgRVZFTlRfS0VZJDg7XG4gIHZhciBFVkVOVF9MT0FEX0RBVEFfQVBJJDEgPSBcImxvYWRcIiArIEVWRU5UX0tFWSQ4ICsgREFUQV9BUElfS0VZJDU7XG4gIHZhciBFVkVOVF9DTElDS19EQVRBX0FQSSQ0ID0gXCJjbGlja1wiICsgRVZFTlRfS0VZJDggKyBEQVRBX0FQSV9LRVkkNTtcbiAgdmFyIFNFTEVDVE9SX0FDVElWRSQxID0gJy5hY3RpdmUnO1xuICB2YXIgU0VMRUNUT1JfQUNUSVZFX0lURU0gPSAnLmFjdGl2ZS5jYXJvdXNlbC1pdGVtJztcbiAgdmFyIFNFTEVDVE9SX0lURU0gPSAnLmNhcm91c2VsLWl0ZW0nO1xuICB2YXIgU0VMRUNUT1JfSVRFTV9JTUcgPSAnLmNhcm91c2VsLWl0ZW0gaW1nJztcbiAgdmFyIFNFTEVDVE9SX05FWFRfUFJFViA9ICcuY2Fyb3VzZWwtaXRlbS1uZXh0LCAuY2Fyb3VzZWwtaXRlbS1wcmV2JztcbiAgdmFyIFNFTEVDVE9SX0lORElDQVRPUlMgPSAnLmNhcm91c2VsLWluZGljYXRvcnMnO1xuICB2YXIgU0VMRUNUT1JfREFUQV9TTElERSA9ICdbZGF0YS1zbGlkZV0sIFtkYXRhLXNsaWRlLXRvXSc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1JJREUgPSAnW2RhdGEtcmlkZT1cImNhcm91c2VsXCJdJztcbiAgdmFyIERlZmF1bHQkNyA9IHtcbiAgICBpbnRlcnZhbDogNTAwMCxcbiAgICBrZXlib2FyZDogdHJ1ZSxcbiAgICBzbGlkZTogZmFsc2UsXG4gICAgcGF1c2U6ICdob3ZlcicsXG4gICAgd3JhcDogdHJ1ZSxcbiAgICB0b3VjaDogdHJ1ZVxuICB9O1xuICB2YXIgRGVmYXVsdFR5cGUkNyA9IHtcbiAgICBpbnRlcnZhbDogJyhudW1iZXJ8Ym9vbGVhbiknLFxuICAgIGtleWJvYXJkOiAnYm9vbGVhbicsXG4gICAgc2xpZGU6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgICBwYXVzZTogJyhzdHJpbmd8Ym9vbGVhbiknLFxuICAgIHdyYXA6ICdib29sZWFuJyxcbiAgICB0b3VjaDogJ2Jvb2xlYW4nXG4gIH07XG4gIHZhciBQb2ludGVyVHlwZSA9IHtcbiAgICBUT1VDSDogJ3RvdWNoJyxcbiAgICBQRU46ICdwZW4nXG4gIH07XG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIHZhciBDYXJvdXNlbCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2Fyb3VzZWwoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICB0aGlzLl9pdGVtcyA9IG51bGw7XG4gICAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX2lzUGF1c2VkID0gZmFsc2U7XG4gICAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMudG91Y2hUaW1lb3V0ID0gbnVsbDtcbiAgICAgIHRoaXMudG91Y2hTdGFydFggPSAwO1xuICAgICAgdGhpcy50b3VjaERlbHRhWCA9IDA7XG4gICAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQgPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfSU5ESUNBVE9SUyk7XG4gICAgICB0aGlzLl90b3VjaFN1cHBvcnRlZCA9ICdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwO1xuICAgICAgdGhpcy5fcG9pbnRlckV2ZW50ID0gQm9vbGVhbih3aW5kb3cuUG9pbnRlckV2ZW50IHx8IHdpbmRvdy5NU1BvaW50ZXJFdmVudCk7XG5cbiAgICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgIHZhciBfcHJvdG8gPSBDYXJvdXNlbC5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8ubmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBpZiAoIXRoaXMuX2lzU2xpZGluZykge1xuICAgICAgICB0aGlzLl9zbGlkZShESVJFQ1RJT05fTkVYVCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5uZXh0V2hlblZpc2libGUgPSBmdW5jdGlvbiBuZXh0V2hlblZpc2libGUoKSB7XG4gICAgICB2YXIgJGVsZW1lbnQgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KTsgLy8gRG9uJ3QgY2FsbCBuZXh0IHdoZW4gdGhlIHBhZ2UgaXNuJ3QgdmlzaWJsZVxuICAgICAgLy8gb3IgdGhlIGNhcm91c2VsIG9yIGl0cyBwYXJlbnQgaXNuJ3QgdmlzaWJsZVxuXG4gICAgICBpZiAoIWRvY3VtZW50LmhpZGRlbiAmJiAkZWxlbWVudC5pcygnOnZpc2libGUnKSAmJiAkZWxlbWVudC5jc3MoJ3Zpc2liaWxpdHknKSAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5wcmV2ID0gZnVuY3Rpb24gcHJldigpIHtcbiAgICAgIGlmICghdGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICAgIHRoaXMuX3NsaWRlKERJUkVDVElPTl9QUkVWKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLnBhdXNlID0gZnVuY3Rpb24gcGF1c2UoZXZlbnQpIHtcbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgdGhpcy5faXNQYXVzZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SX05FWFRfUFJFVikpIHtcbiAgICAgICAgVXRpbC50cmlnZ2VyVHJhbnNpdGlvbkVuZCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgdGhpcy5jeWNsZSh0cnVlKTtcbiAgICAgIH1cblxuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCk7XG4gICAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgfTtcblxuICAgIF9wcm90by5jeWNsZSA9IGZ1bmN0aW9uIGN5Y2xlKGV2ZW50KSB7XG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHRoaXMuX2lzUGF1c2VkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9pbnRlcnZhbCkge1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKTtcbiAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmludGVydmFsICYmICF0aGlzLl9pc1BhdXNlZCkge1xuICAgICAgICB0aGlzLl91cGRhdGVJbnRlcnZhbCgpO1xuXG4gICAgICAgIHRoaXMuX2ludGVydmFsID0gc2V0SW50ZXJ2YWwoKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA/IHRoaXMubmV4dFdoZW5WaXNpYmxlIDogdGhpcy5uZXh0KS5iaW5kKHRoaXMpLCB0aGlzLl9jb25maWcuaW50ZXJ2YWwpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8udG8gPSBmdW5jdGlvbiB0byhpbmRleCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdGhpcy5fYWN0aXZlRWxlbWVudCA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9BQ1RJVkVfSVRFTSk7XG5cbiAgICAgIHZhciBhY3RpdmVJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleCh0aGlzLl9hY3RpdmVFbGVtZW50KTtcblxuICAgICAgaWYgKGluZGV4ID4gdGhpcy5faXRlbXMubGVuZ3RoIC0gMSB8fCBpbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLm9uZShFVkVOVF9TTElELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLnRvKGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGl2ZUluZGV4ID09PSBpbmRleCkge1xuICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgICAgIHRoaXMuY3ljbGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGlyZWN0aW9uID0gaW5kZXggPiBhY3RpdmVJbmRleCA/IERJUkVDVElPTl9ORVhUIDogRElSRUNUSU9OX1BSRVY7XG5cbiAgICAgIHRoaXMuX3NsaWRlKGRpcmVjdGlvbiwgdGhpcy5faXRlbXNbaW5kZXhdKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZWxlbWVudCkub2ZmKEVWRU5UX0tFWSQ4KTtcbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkkOCk7XG4gICAgICB0aGlzLl9pdGVtcyA9IG51bGw7XG4gICAgICB0aGlzLl9jb25maWcgPSBudWxsO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgICB0aGlzLl9pc1BhdXNlZCA9IG51bGw7XG4gICAgICB0aGlzLl9pc1NsaWRpbmcgPSBudWxsO1xuICAgICAgdGhpcy5fYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCA9IG51bGw7XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgY29uZmlnID0gX2V4dGVuZHMoe30sIERlZmF1bHQkNywgY29uZmlnKTtcbiAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUkOCwgY29uZmlnLCBEZWZhdWx0VHlwZSQ3KTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5faGFuZGxlU3dpcGUgPSBmdW5jdGlvbiBfaGFuZGxlU3dpcGUoKSB7XG4gICAgICB2YXIgYWJzRGVsdGF4ID0gTWF0aC5hYnModGhpcy50b3VjaERlbHRhWCk7XG5cbiAgICAgIGlmIChhYnNEZWx0YXggPD0gU1dJUEVfVEhSRVNIT0xEKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGRpcmVjdGlvbiA9IGFic0RlbHRheCAvIHRoaXMudG91Y2hEZWx0YVg7XG4gICAgICB0aGlzLnRvdWNoRGVsdGFYID0gMDsgLy8gc3dpcGUgbGVmdFxuXG4gICAgICBpZiAoZGlyZWN0aW9uID4gMCkge1xuICAgICAgICB0aGlzLnByZXYoKTtcbiAgICAgIH0gLy8gc3dpcGUgcmlnaHRcblxuXG4gICAgICBpZiAoZGlyZWN0aW9uIDwgMCkge1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9hZGRFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLm9uKEVWRU5UX0tFWURPV04sIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIuX2tleWRvd24oZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5wYXVzZSA9PT0gJ2hvdmVyJykge1xuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9NT1VTRUVOVEVSLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLnBhdXNlKGV2ZW50KTtcbiAgICAgICAgfSkub24oRVZFTlRfTU9VU0VMRUFWRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5jeWNsZShldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLnRvdWNoKSB7XG4gICAgICAgIHRoaXMuX2FkZFRvdWNoRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzID0gZnVuY3Rpb24gX2FkZFRvdWNoRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLl90b3VjaFN1cHBvcnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBzdGFydCA9IGZ1bmN0aW9uIHN0YXJ0KGV2ZW50KSB7XG4gICAgICAgIGlmIChfdGhpczMuX3BvaW50ZXJFdmVudCAmJiBQb2ludGVyVHlwZVtldmVudC5vcmlnaW5hbEV2ZW50LnBvaW50ZXJUeXBlLnRvVXBwZXJDYXNlKCldKSB7XG4gICAgICAgICAgX3RoaXMzLnRvdWNoU3RhcnRYID0gZXZlbnQub3JpZ2luYWxFdmVudC5jbGllbnRYO1xuICAgICAgICB9IGVsc2UgaWYgKCFfdGhpczMuX3BvaW50ZXJFdmVudCkge1xuICAgICAgICAgIF90aGlzMy50b3VjaFN0YXJ0WCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2YXIgbW92ZSA9IGZ1bmN0aW9uIG1vdmUoZXZlbnQpIHtcbiAgICAgICAgLy8gZW5zdXJlIHN3aXBpbmcgd2l0aCBvbmUgdG91Y2ggYW5kIG5vdCBwaW5jaGluZ1xuICAgICAgICBfdGhpczMudG91Y2hEZWx0YVggPSBldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXMgJiYgZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzLmxlbmd0aCA+IDEgPyAwIDogZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFggLSBfdGhpczMudG91Y2hTdGFydFg7XG4gICAgICB9O1xuXG4gICAgICB2YXIgZW5kID0gZnVuY3Rpb24gZW5kKGV2ZW50KSB7XG4gICAgICAgIGlmIChfdGhpczMuX3BvaW50ZXJFdmVudCAmJiBQb2ludGVyVHlwZVtldmVudC5vcmlnaW5hbEV2ZW50LnBvaW50ZXJUeXBlLnRvVXBwZXJDYXNlKCldKSB7XG4gICAgICAgICAgX3RoaXMzLnRvdWNoRGVsdGFYID0gZXZlbnQub3JpZ2luYWxFdmVudC5jbGllbnRYIC0gX3RoaXMzLnRvdWNoU3RhcnRYO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMzLl9oYW5kbGVTd2lwZSgpO1xuXG4gICAgICAgIGlmIChfdGhpczMuX2NvbmZpZy5wYXVzZSA9PT0gJ2hvdmVyJykge1xuICAgICAgICAgIC8vIElmIGl0J3MgYSB0b3VjaC1lbmFibGVkIGRldmljZSwgbW91c2VlbnRlci9sZWF2ZSBhcmUgZmlyZWQgYXNcbiAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBtb3VzZSBjb21wYXRpYmlsaXR5IGV2ZW50cyBvbiBmaXJzdCB0YXAgLSB0aGUgY2Fyb3VzZWxcbiAgICAgICAgICAvLyB3b3VsZCBzdG9wIGN5Y2xpbmcgdW50aWwgdXNlciB0YXBwZWQgb3V0IG9mIGl0O1xuICAgICAgICAgIC8vIGhlcmUsIHdlIGxpc3RlbiBmb3IgdG91Y2hlbmQsIGV4cGxpY2l0bHkgcGF1c2UgdGhlIGNhcm91c2VsXG4gICAgICAgICAgLy8gKGFzIGlmIGl0J3MgdGhlIHNlY29uZCB0aW1lIHdlIHRhcCBvbiBpdCwgbW91c2VlbnRlciBjb21wYXQgZXZlbnRcbiAgICAgICAgICAvLyBpcyBOT1QgZmlyZWQpIGFuZCBhZnRlciBhIHRpbWVvdXQgKHRvIGFsbG93IGZvciBtb3VzZSBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgLy8gZXZlbnRzIHRvIGZpcmUpIHdlIGV4cGxpY2l0bHkgcmVzdGFydCBjeWNsaW5nXG4gICAgICAgICAgX3RoaXMzLnBhdXNlKCk7XG5cbiAgICAgICAgICBpZiAoX3RoaXMzLnRvdWNoVGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzMy50b3VjaFRpbWVvdXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMy50b3VjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5jeWNsZShldmVudCk7XG4gICAgICAgICAgfSwgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCArIF90aGlzMy5fY29uZmlnLmludGVydmFsKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0lURU1fSU1HKSkub24oRVZFTlRfRFJBR19TVEFSVCwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5fcG9pbnRlckV2ZW50KSB7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLm9uKEVWRU5UX1BPSU5URVJET1dOLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gc3RhcnQoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZWxlbWVudCkub24oRVZFTlRfUE9JTlRFUlVQLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gZW5kKGV2ZW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfUE9JTlRFUl9FVkVOVCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9UT1VDSFNUQVJULCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gc3RhcnQoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZWxlbWVudCkub24oRVZFTlRfVE9VQ0hNT1ZFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gbW92ZShldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9UT1VDSEVORCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGVuZChldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX2tleWRvd24gPSBmdW5jdGlvbiBfa2V5ZG93bihldmVudCkge1xuICAgICAgaWYgKC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChldmVudC53aGljaCkge1xuICAgICAgICBjYXNlIEFSUk9XX0xFRlRfS0VZQ09ERTpcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMucHJldigpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgQVJST1dfUklHSFRfS0VZQ09ERTpcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldEl0ZW1JbmRleCA9IGZ1bmN0aW9uIF9nZXRJdGVtSW5kZXgoZWxlbWVudCkge1xuICAgICAgdGhpcy5faXRlbXMgPSBlbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSA/IFtdLnNsaWNlLmNhbGwoZWxlbWVudC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfSVRFTSkpIDogW107XG4gICAgICByZXR1cm4gdGhpcy5faXRlbXMuaW5kZXhPZihlbGVtZW50KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRJdGVtQnlEaXJlY3Rpb24gPSBmdW5jdGlvbiBfZ2V0SXRlbUJ5RGlyZWN0aW9uKGRpcmVjdGlvbiwgYWN0aXZlRWxlbWVudCkge1xuICAgICAgdmFyIGlzTmV4dERpcmVjdGlvbiA9IGRpcmVjdGlvbiA9PT0gRElSRUNUSU9OX05FWFQ7XG4gICAgICB2YXIgaXNQcmV2RGlyZWN0aW9uID0gZGlyZWN0aW9uID09PSBESVJFQ1RJT05fUFJFVjtcblxuICAgICAgdmFyIGFjdGl2ZUluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KGFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgICB2YXIgbGFzdEl0ZW1JbmRleCA9IHRoaXMuX2l0ZW1zLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgaXNHb2luZ1RvV3JhcCA9IGlzUHJldkRpcmVjdGlvbiAmJiBhY3RpdmVJbmRleCA9PT0gMCB8fCBpc05leHREaXJlY3Rpb24gJiYgYWN0aXZlSW5kZXggPT09IGxhc3RJdGVtSW5kZXg7XG5cbiAgICAgIGlmIChpc0dvaW5nVG9XcmFwICYmICF0aGlzLl9jb25maWcud3JhcCkge1xuICAgICAgICByZXR1cm4gYWN0aXZlRWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgdmFyIGRlbHRhID0gZGlyZWN0aW9uID09PSBESVJFQ1RJT05fUFJFViA/IC0xIDogMTtcbiAgICAgIHZhciBpdGVtSW5kZXggPSAoYWN0aXZlSW5kZXggKyBkZWx0YSkgJSB0aGlzLl9pdGVtcy5sZW5ndGg7XG4gICAgICByZXR1cm4gaXRlbUluZGV4ID09PSAtMSA/IHRoaXMuX2l0ZW1zW3RoaXMuX2l0ZW1zLmxlbmd0aCAtIDFdIDogdGhpcy5faXRlbXNbaXRlbUluZGV4XTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl90cmlnZ2VyU2xpZGVFdmVudCA9IGZ1bmN0aW9uIF90cmlnZ2VyU2xpZGVFdmVudChyZWxhdGVkVGFyZ2V0LCBldmVudERpcmVjdGlvbk5hbWUpIHtcbiAgICAgIHZhciB0YXJnZXRJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleChyZWxhdGVkVGFyZ2V0KTtcblxuICAgICAgdmFyIGZyb21JbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleCh0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfQUNUSVZFX0lURU0pKTtcblxuICAgICAgdmFyIHNsaWRlRXZlbnQgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5FdmVudChFVkVOVF9TTElERSwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiByZWxhdGVkVGFyZ2V0LFxuICAgICAgICBkaXJlY3Rpb246IGV2ZW50RGlyZWN0aW9uTmFtZSxcbiAgICAgICAgZnJvbTogZnJvbUluZGV4LFxuICAgICAgICB0bzogdGFyZ2V0SW5kZXhcbiAgICAgIH0pO1xuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZWxlbWVudCkudHJpZ2dlcihzbGlkZUV2ZW50KTtcbiAgICAgIHJldHVybiBzbGlkZUV2ZW50O1xuICAgIH07XG5cbiAgICBfcHJvdG8uX3NldEFjdGl2ZUluZGljYXRvckVsZW1lbnQgPSBmdW5jdGlvbiBfc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChlbGVtZW50KSB7XG4gICAgICBpZiAodGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpIHtcbiAgICAgICAgdmFyIGluZGljYXRvcnMgPSBbXS5zbGljZS5jYWxsKHRoaXMuX2luZGljYXRvcnNFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfQUNUSVZFJDEpKTtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oaW5kaWNhdG9ycykucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMik7XG5cbiAgICAgICAgdmFyIG5leHRJbmRpY2F0b3IgPSB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudC5jaGlsZHJlblt0aGlzLl9nZXRJdGVtSW5kZXgoZWxlbWVudCldO1xuXG4gICAgICAgIGlmIChuZXh0SW5kaWNhdG9yKSB7XG4gICAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0obmV4dEluZGljYXRvcikuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl91cGRhdGVJbnRlcnZhbCA9IGZ1bmN0aW9uIF91cGRhdGVJbnRlcnZhbCgpIHtcbiAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5fYWN0aXZlRWxlbWVudCB8fCB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfQUNUSVZFX0lURU0pO1xuXG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZWxlbWVudEludGVydmFsID0gcGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaW50ZXJ2YWwnKSwgMTApO1xuXG4gICAgICBpZiAoZWxlbWVudEludGVydmFsKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWwgPSB0aGlzLl9jb25maWcuZGVmYXVsdEludGVydmFsIHx8IHRoaXMuX2NvbmZpZy5pbnRlcnZhbDtcbiAgICAgICAgdGhpcy5fY29uZmlnLmludGVydmFsID0gZWxlbWVudEludGVydmFsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY29uZmlnLmludGVydmFsID0gdGhpcy5fY29uZmlnLmRlZmF1bHRJbnRlcnZhbCB8fCB0aGlzLl9jb25maWcuaW50ZXJ2YWw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fc2xpZGUgPSBmdW5jdGlvbiBfc2xpZGUoZGlyZWN0aW9uLCBlbGVtZW50KSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfQUNUSVZFX0lURU0pO1xuXG4gICAgICB2YXIgYWN0aXZlRWxlbWVudEluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KGFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgICB2YXIgbmV4dEVsZW1lbnQgPSBlbGVtZW50IHx8IGFjdGl2ZUVsZW1lbnQgJiYgdGhpcy5fZ2V0SXRlbUJ5RGlyZWN0aW9uKGRpcmVjdGlvbiwgYWN0aXZlRWxlbWVudCk7XG5cbiAgICAgIHZhciBuZXh0RWxlbWVudEluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KG5leHRFbGVtZW50KTtcblxuICAgICAgdmFyIGlzQ3ljbGluZyA9IEJvb2xlYW4odGhpcy5faW50ZXJ2YWwpO1xuICAgICAgdmFyIGRpcmVjdGlvbmFsQ2xhc3NOYW1lO1xuICAgICAgdmFyIG9yZGVyQ2xhc3NOYW1lO1xuICAgICAgdmFyIGV2ZW50RGlyZWN0aW9uTmFtZTtcblxuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gRElSRUNUSU9OX05FWFQpIHtcbiAgICAgICAgZGlyZWN0aW9uYWxDbGFzc05hbWUgPSBDTEFTU19OQU1FX0xFRlQ7XG4gICAgICAgIG9yZGVyQ2xhc3NOYW1lID0gQ0xBU1NfTkFNRV9ORVhUO1xuICAgICAgICBldmVudERpcmVjdGlvbk5hbWUgPSBESVJFQ1RJT05fTEVGVDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpcmVjdGlvbmFsQ2xhc3NOYW1lID0gQ0xBU1NfTkFNRV9SSUdIVDtcbiAgICAgICAgb3JkZXJDbGFzc05hbWUgPSBDTEFTU19OQU1FX1BSRVY7XG4gICAgICAgIGV2ZW50RGlyZWN0aW9uTmFtZSA9IERJUkVDVElPTl9SSUdIVDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5leHRFbGVtZW50ICYmICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKG5leHRFbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQyKSkge1xuICAgICAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2xpZGVFdmVudCA9IHRoaXMuX3RyaWdnZXJTbGlkZUV2ZW50KG5leHRFbGVtZW50LCBldmVudERpcmVjdGlvbk5hbWUpO1xuXG4gICAgICBpZiAoc2xpZGVFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCAhbmV4dEVsZW1lbnQpIHtcbiAgICAgICAgLy8gU29tZSB3ZWlyZG5lc3MgaXMgaGFwcGVuaW5nLCBzbyB3ZSBiYWlsXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faXNTbGlkaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKGlzQ3ljbGluZykge1xuICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3NldEFjdGl2ZUluZGljYXRvckVsZW1lbnQobmV4dEVsZW1lbnQpO1xuXG4gICAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG4gICAgICB2YXIgc2xpZEV2ZW50ID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uRXZlbnQoRVZFTlRfU0xJRCwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiBuZXh0RWxlbWVudCxcbiAgICAgICAgZGlyZWN0aW9uOiBldmVudERpcmVjdGlvbk5hbWUsXG4gICAgICAgIGZyb206IGFjdGl2ZUVsZW1lbnRJbmRleCxcbiAgICAgICAgdG86IG5leHRFbGVtZW50SW5kZXhcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TTElERSkpIHtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0obmV4dEVsZW1lbnQpLmFkZENsYXNzKG9yZGVyQ2xhc3NOYW1lKTtcbiAgICAgICAgVXRpbC5yZWZsb3cobmV4dEVsZW1lbnQpO1xuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShhY3RpdmVFbGVtZW50KS5hZGRDbGFzcyhkaXJlY3Rpb25hbENsYXNzTmFtZSk7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKG5leHRFbGVtZW50KS5hZGRDbGFzcyhkaXJlY3Rpb25hbENsYXNzTmFtZSk7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KGFjdGl2ZUVsZW1lbnQpO1xuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShhY3RpdmVFbGVtZW50KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKG5leHRFbGVtZW50KS5yZW1vdmVDbGFzcyhkaXJlY3Rpb25hbENsYXNzTmFtZSArIFwiIFwiICsgb3JkZXJDbGFzc05hbWUpLmFkZENsYXNzKENMQVNTX05BTUVfQUNUSVZFJDIpO1xuICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGFjdGl2ZUVsZW1lbnQpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQUNUSVZFJDIgKyBcIiBcIiArIG9yZGVyQ2xhc3NOYW1lICsgXCIgXCIgKyBkaXJlY3Rpb25hbENsYXNzTmFtZSk7XG4gICAgICAgICAgX3RoaXM0Ll9pc1NsaWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShfdGhpczQuX2VsZW1lbnQpLnRyaWdnZXIoc2xpZEV2ZW50KTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGFjdGl2ZUVsZW1lbnQpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQUNUSVZFJDIpO1xuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShuZXh0RWxlbWVudCkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMik7XG4gICAgICAgIHRoaXMuX2lzU2xpZGluZyA9IGZhbHNlO1xuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNsaWRFdmVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0N5Y2xpbmcpIHtcbiAgICAgICAgdGhpcy5jeWNsZSgpO1xuICAgICAgfVxuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgQ2Fyb3VzZWwuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzKS5kYXRhKERBVEFfS0VZJDgpO1xuXG4gICAgICAgIHZhciBfY29uZmlnID0gX2V4dGVuZHMoe30sIERlZmF1bHQkNywgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcykuZGF0YSgpKTtcblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBfY29uZmlnID0gX2V4dGVuZHMoe30sIF9jb25maWcsIGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYWN0aW9uID0gdHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycgPyBjb25maWcgOiBfY29uZmlnLnNsaWRlO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgQ2Fyb3VzZWwodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcykuZGF0YShEQVRBX0tFWSQ4LCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIGRhdGEudG8oY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVthY3Rpb25dID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcXFwiXCIgKyBhY3Rpb24gKyBcIlxcXCJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVthY3Rpb25dKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoX2NvbmZpZy5pbnRlcnZhbCAmJiBfY29uZmlnLnJpZGUpIHtcbiAgICAgICAgICBkYXRhLnBhdXNlKCk7XG4gICAgICAgICAgZGF0YS5jeWNsZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgQ2Fyb3VzZWwuX2RhdGFBcGlDbGlja0hhbmRsZXIgPSBmdW5jdGlvbiBfZGF0YUFwaUNsaWNrSGFuZGxlcihldmVudCkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMpO1xuXG4gICAgICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHRhcmdldCA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHNlbGVjdG9yKVswXTtcblxuICAgICAgaWYgKCF0YXJnZXQgfHwgISRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRhcmdldCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9DQVJPVVNFTCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29uZmlnID0gX2V4dGVuZHMoe30sICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRhcmdldCkuZGF0YSgpLCAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzKS5kYXRhKCkpO1xuXG4gICAgICB2YXIgc2xpZGVJbmRleCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLXNsaWRlLXRvJyk7XG5cbiAgICAgIGlmIChzbGlkZUluZGV4KSB7XG4gICAgICAgIGNvbmZpZy5pbnRlcnZhbCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBDYXJvdXNlbC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGFyZ2V0KSwgY29uZmlnKTtcblxuICAgICAgaWYgKHNsaWRlSW5kZXgpIHtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGFyZ2V0KS5kYXRhKERBVEFfS0VZJDgpLnRvKHNsaWRlSW5kZXgpO1xuICAgICAgfVxuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoQ2Fyb3VzZWwsIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OJDg7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdCQ3O1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBDYXJvdXNlbDtcbiAgfSgpO1xuICAvKipcbiAgICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAgICovXG5cblxuICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShkb2N1bWVudCkub24oRVZFTlRfQ0xJQ0tfREFUQV9BUEkkNCwgU0VMRUNUT1JfREFUQV9TTElERSwgQ2Fyb3VzZWwuX2RhdGFBcGlDbGlja0hhbmRsZXIpO1xuICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh3aW5kb3cpLm9uKEVWRU5UX0xPQURfREFUQV9BUEkkMSwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBjYXJvdXNlbHMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfREFUQV9SSURFKSk7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY2Fyb3VzZWxzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgJGNhcm91c2VsID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oY2Fyb3VzZWxzW2ldKTtcblxuICAgICAgQ2Fyb3VzZWwuX2pRdWVyeUludGVyZmFjZS5jYWxsKCRjYXJvdXNlbCwgJGNhcm91c2VsLmRhdGEoKSk7XG4gICAgfVxuICB9KTtcbiAgLyoqXG4gICAqIGpRdWVyeVxuICAgKi9cblxuICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJDhdID0gQ2Fyb3VzZWwuX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uZm5bTkFNRSQ4XS5Db25zdHJ1Y3RvciA9IENhcm91c2VsO1xuXG4gICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkOF0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJDhdID0gSlFVRVJZX05PX0NPTkZMSUNUJDg7XG4gICAgcmV0dXJuIENhcm91c2VsLl9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICB2YXIgTkFNRSQ3ID0gJ2NvbGxhcHNlJztcbiAgdmFyIFZFUlNJT04kNyA9ICc0LjYuMic7XG4gIHZhciBEQVRBX0tFWSQ3ID0gJ2JzLmNvbGxhcHNlJztcbiAgdmFyIEVWRU5UX0tFWSQ3ID0gXCIuXCIgKyBEQVRBX0tFWSQ3O1xuICB2YXIgREFUQV9BUElfS0VZJDQgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCQ3ID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uZm5bTkFNRSQ3XTtcbiAgdmFyIENMQVNTX05BTUVfU0hPVyQ2ID0gJ3Nob3cnO1xuICB2YXIgQ0xBU1NfTkFNRV9DT0xMQVBTRSA9ICdjb2xsYXBzZSc7XG4gIHZhciBDTEFTU19OQU1FX0NPTExBUFNJTkcgPSAnY29sbGFwc2luZyc7XG4gIHZhciBDTEFTU19OQU1FX0NPTExBUFNFRCA9ICdjb2xsYXBzZWQnO1xuICB2YXIgRElNRU5TSU9OX1dJRFRIID0gJ3dpZHRoJztcbiAgdmFyIERJTUVOU0lPTl9IRUlHSFQgPSAnaGVpZ2h0JztcbiAgdmFyIEVWRU5UX1NIT1ckNCA9IFwic2hvd1wiICsgRVZFTlRfS0VZJDc7XG4gIHZhciBFVkVOVF9TSE9XTiQ0ID0gXCJzaG93blwiICsgRVZFTlRfS0VZJDc7XG4gIHZhciBFVkVOVF9ISURFJDQgPSBcImhpZGVcIiArIEVWRU5UX0tFWSQ3O1xuICB2YXIgRVZFTlRfSElEREVOJDQgPSBcImhpZGRlblwiICsgRVZFTlRfS0VZJDc7XG4gIHZhciBFVkVOVF9DTElDS19EQVRBX0FQSSQzID0gXCJjbGlja1wiICsgRVZFTlRfS0VZJDcgKyBEQVRBX0FQSV9LRVkkNDtcbiAgdmFyIFNFTEVDVE9SX0FDVElWRVMgPSAnLnNob3csIC5jb2xsYXBzaW5nJztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDMgPSAnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nO1xuICB2YXIgRGVmYXVsdCQ2ID0ge1xuICAgIHRvZ2dsZTogdHJ1ZSxcbiAgICBwYXJlbnQ6ICcnXG4gIH07XG4gIHZhciBEZWZhdWx0VHlwZSQ2ID0ge1xuICAgIHRvZ2dsZTogJ2Jvb2xlYW4nLFxuICAgIHBhcmVudDogJyhzdHJpbmd8ZWxlbWVudCknXG4gIH07XG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIHZhciBDb2xsYXBzZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29sbGFwc2UoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLl90cmlnZ2VyQXJyYXkgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS10b2dnbGU9XFxcImNvbGxhcHNlXFxcIl1baHJlZj1cXFwiI1wiICsgZWxlbWVudC5pZCArIFwiXFxcIl0sXCIgKyAoXCJbZGF0YS10b2dnbGU9XFxcImNvbGxhcHNlXFxcIl1bZGF0YS10YXJnZXQ9XFxcIiNcIiArIGVsZW1lbnQuaWQgKyBcIlxcXCJdXCIpKSk7XG4gICAgICB2YXIgdG9nZ2xlTGlzdCA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzKSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0b2dnbGVMaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBlbGVtID0gdG9nZ2xlTGlzdFtpXTtcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW0pO1xuICAgICAgICB2YXIgZmlsdGVyRWxlbWVudCA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpLmZpbHRlcihmdW5jdGlvbiAoZm91bmRFbGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGZvdW5kRWxlbSA9PT0gZWxlbWVudDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHNlbGVjdG9yICE9PSBudWxsICYmIGZpbHRlckVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuX3NlbGVjdG9yID0gc2VsZWN0b3I7XG5cbiAgICAgICAgICB0aGlzLl90cmlnZ2VyQXJyYXkucHVzaChlbGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9wYXJlbnQgPSB0aGlzLl9jb25maWcucGFyZW50ID8gdGhpcy5fZ2V0UGFyZW50KCkgOiBudWxsO1xuXG4gICAgICBpZiAoIXRoaXMuX2NvbmZpZy5wYXJlbnQpIHtcbiAgICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX2VsZW1lbnQsIHRoaXMuX3RyaWdnZXJBcnJheSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcudG9nZ2xlKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICB9XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgIHZhciBfcHJvdG8gPSBDb2xsYXBzZS5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8udG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgICAgaWYgKCRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfU0hPVyQ2KSkge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uc2hvdyA9IGZ1bmN0aW9uIHNob3coKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfU0hPVyQ2KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBhY3RpdmVzO1xuICAgICAgdmFyIGFjdGl2ZXNEYXRhO1xuXG4gICAgICBpZiAodGhpcy5fcGFyZW50KSB7XG4gICAgICAgIGFjdGl2ZXMgPSBbXS5zbGljZS5jYWxsKHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0FDVElWRVMpKS5maWx0ZXIoZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgICAgICBpZiAodHlwZW9mIF90aGlzLl9jb25maWcucGFyZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXBhcmVudCcpID09PSBfdGhpcy5fY29uZmlnLnBhcmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9DT0xMQVBTRSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhY3RpdmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGFjdGl2ZXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3RpdmVzKSB7XG4gICAgICAgIGFjdGl2ZXNEYXRhID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oYWN0aXZlcykubm90KHRoaXMuX3NlbGVjdG9yKS5kYXRhKERBVEFfS0VZJDcpO1xuXG4gICAgICAgIGlmIChhY3RpdmVzRGF0YSAmJiBhY3RpdmVzRGF0YS5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBzdGFydEV2ZW50ID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uRXZlbnQoRVZFTlRfU0hPVyQ0KTtcbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoc3RhcnRFdmVudCk7XG5cbiAgICAgIGlmIChzdGFydEV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGl2ZXMpIHtcbiAgICAgICAgQ29sbGFwc2UuX2pRdWVyeUludGVyZmFjZS5jYWxsKCRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGFjdGl2ZXMpLm5vdCh0aGlzLl9zZWxlY3RvciksICdoaWRlJyk7XG5cbiAgICAgICAgaWYgKCFhY3RpdmVzRGF0YSkge1xuICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGFjdGl2ZXMpLmRhdGEoREFUQV9LRVkkNywgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuX2dldERpbWVuc2lvbigpO1xuXG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNFKS5hZGRDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNJTkcpO1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gMDtcblxuICAgICAgaWYgKHRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fdHJpZ2dlckFycmF5KS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNFRCkuYXR0cignYXJpYS1leHBhbmRlZCcsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcodHJ1ZSk7XG5cbiAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShfdGhpcy5fZWxlbWVudCkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKS5hZGRDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNFICsgXCIgXCIgKyBDTEFTU19OQU1FX1NIT1ckNik7XG4gICAgICAgIF90aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAnJztcblxuICAgICAgICBfdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcblxuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShfdGhpcy5fZWxlbWVudCkudHJpZ2dlcihFVkVOVF9TSE9XTiQ0KTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBjYXBpdGFsaXplZERpbWVuc2lvbiA9IGRpbWVuc2lvblswXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKDEpO1xuICAgICAgdmFyIHNjcm9sbFNpemUgPSBcInNjcm9sbFwiICsgY2FwaXRhbGl6ZWREaW1lbnNpb247XG4gICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjb21wbGV0ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IHRoaXMuX2VsZW1lbnRbc2Nyb2xsU2l6ZV0gKyBcInB4XCI7XG4gICAgfTtcblxuICAgIF9wcm90by5oaWRlID0gZnVuY3Rpb24gaGlkZSgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICEkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX1NIT1ckNikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RhcnRFdmVudCA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLkV2ZW50KEVWRU5UX0hJREUkNCk7XG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHN0YXJ0RXZlbnQpO1xuXG4gICAgICBpZiAoc3RhcnRFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLl9nZXREaW1lbnNpb24oKTtcblxuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gdGhpcy5fZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkaW1lbnNpb25dICsgXCJweFwiO1xuICAgICAgVXRpbC5yZWZsb3codGhpcy5fZWxlbWVudCk7XG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS5hZGRDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNJTkcpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQ09MTEFQU0UgKyBcIiBcIiArIENMQVNTX05BTUVfU0hPVyQ2KTtcbiAgICAgIHZhciB0cmlnZ2VyQXJyYXlMZW5ndGggPSB0aGlzLl90cmlnZ2VyQXJyYXkubGVuZ3RoO1xuXG4gICAgICBpZiAodHJpZ2dlckFycmF5TGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyaWdnZXJBcnJheUxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHRyaWdnZXIgPSB0aGlzLl90cmlnZ2VyQXJyYXlbaV07XG4gICAgICAgICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRyaWdnZXIpO1xuXG4gICAgICAgICAgaWYgKHNlbGVjdG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgJGVsZW0gPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKSk7XG5cbiAgICAgICAgICAgIGlmICghJGVsZW0uaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDYpKSB7XG4gICAgICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRyaWdnZXIpLmFkZENsYXNzKENMQVNTX05BTUVfQ09MTEFQU0VEKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcodHJ1ZSk7XG5cbiAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgICAgICBfdGhpczIuc2V0VHJhbnNpdGlvbmluZyhmYWxzZSk7XG5cbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oX3RoaXMyLl9lbGVtZW50KS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNJTkcpLmFkZENsYXNzKENMQVNTX05BTUVfQ09MTEFQU0UpLnRyaWdnZXIoRVZFTlRfSElEREVOJDQpO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gJyc7XG4gICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjb21wbGV0ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnNldFRyYW5zaXRpb25pbmcgPSBmdW5jdGlvbiBzZXRUcmFuc2l0aW9uaW5nKGlzVHJhbnNpdGlvbmluZykge1xuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gaXNUcmFuc2l0aW9uaW5nO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsIERBVEFfS0VZJDcpO1xuICAgICAgdGhpcy5fY29uZmlnID0gbnVsbDtcbiAgICAgIHRoaXMuX3BhcmVudCA9IG51bGw7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX3RyaWdnZXJBcnJheSA9IG51bGw7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBudWxsO1xuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fZ2V0Q29uZmlnID0gZnVuY3Rpb24gX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgIGNvbmZpZyA9IF9leHRlbmRzKHt9LCBEZWZhdWx0JDYsIGNvbmZpZyk7XG4gICAgICBjb25maWcudG9nZ2xlID0gQm9vbGVhbihjb25maWcudG9nZ2xlKTsgLy8gQ29lcmNlIHN0cmluZyB2YWx1ZXNcblxuICAgICAgVXRpbC50eXBlQ2hlY2tDb25maWcoTkFNRSQ3LCBjb25maWcsIERlZmF1bHRUeXBlJDYpO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXREaW1lbnNpb24gPSBmdW5jdGlvbiBfZ2V0RGltZW5zaW9uKCkge1xuICAgICAgdmFyIGhhc1dpZHRoID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoRElNRU5TSU9OX1dJRFRIKTtcbiAgICAgIHJldHVybiBoYXNXaWR0aCA/IERJTUVOU0lPTl9XSURUSCA6IERJTUVOU0lPTl9IRUlHSFQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0UGFyZW50ID0gZnVuY3Rpb24gX2dldFBhcmVudCgpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgcGFyZW50O1xuXG4gICAgICBpZiAoVXRpbC5pc0VsZW1lbnQodGhpcy5fY29uZmlnLnBhcmVudCkpIHtcbiAgICAgICAgcGFyZW50ID0gdGhpcy5fY29uZmlnLnBhcmVudDsgLy8gSXQncyBhIGpRdWVyeSBvYmplY3RcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2NvbmZpZy5wYXJlbnQuanF1ZXJ5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHBhcmVudCA9IHRoaXMuX2NvbmZpZy5wYXJlbnRbMF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5fY29uZmlnLnBhcmVudCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzZWxlY3RvciA9IFwiW2RhdGEtdG9nZ2xlPVxcXCJjb2xsYXBzZVxcXCJdW2RhdGEtcGFyZW50PVxcXCJcIiArIHRoaXMuX2NvbmZpZy5wYXJlbnQgKyBcIlxcXCJdXCI7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBbXS5zbGljZS5jYWxsKHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7XG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShjaGlsZHJlbikuZWFjaChmdW5jdGlvbiAoaSwgZWxlbWVudCkge1xuICAgICAgICBfdGhpczMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhDb2xsYXBzZS5fZ2V0VGFyZ2V0RnJvbUVsZW1lbnQoZWxlbWVudCksIFtlbGVtZW50XSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzID0gZnVuY3Rpb24gX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhlbGVtZW50LCB0cmlnZ2VyQXJyYXkpIHtcbiAgICAgIHZhciBpc09wZW4gPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShlbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX1NIT1ckNik7XG5cbiAgICAgIGlmICh0cmlnZ2VyQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRyaWdnZXJBcnJheSkudG9nZ2xlQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRUQsICFpc09wZW4pLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBpc09wZW4pO1xuICAgICAgfVxuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgQ29sbGFwc2UuX2dldFRhcmdldEZyb21FbGVtZW50ID0gZnVuY3Rpb24gX2dldFRhcmdldEZyb21FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KTtcbiAgICAgIHJldHVybiBzZWxlY3RvciA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpIDogbnVsbDtcbiAgICB9O1xuXG4gICAgQ29sbGFwc2UuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICRlbGVtZW50ID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcyk7XG4gICAgICAgIHZhciBkYXRhID0gJGVsZW1lbnQuZGF0YShEQVRBX0tFWSQ3KTtcblxuICAgICAgICB2YXIgX2NvbmZpZyA9IF9leHRlbmRzKHt9LCBEZWZhdWx0JDYsICRlbGVtZW50LmRhdGEoKSwgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnID8gY29uZmlnIDoge30pO1xuXG4gICAgICAgIGlmICghZGF0YSAmJiBfY29uZmlnLnRvZ2dsZSAmJiB0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJyAmJiAvc2hvd3xoaWRlLy50ZXN0KGNvbmZpZykpIHtcbiAgICAgICAgICBfY29uZmlnLnRvZ2dsZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBDb2xsYXBzZSh0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAkZWxlbWVudC5kYXRhKERBVEFfS0VZJDcsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTm8gbWV0aG9kIG5hbWVkIFxcXCJcIiArIGNvbmZpZyArIFwiXFxcIlwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9jcmVhdGVDbGFzcyhDb2xsYXBzZSwgbnVsbCwgW3tcbiAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFZFUlNJT04kNztcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0JDY7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIENvbGxhcHNlO1xuICB9KCk7XG4gIC8qKlxuICAgKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICAgKi9cblxuXG4gICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGRvY3VtZW50KS5vbihFVkVOVF9DTElDS19EQVRBX0FQSSQzLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBwcmV2ZW50RGVmYXVsdCBvbmx5IGZvciA8YT4gZWxlbWVudHMgKHdoaWNoIGNoYW5nZSB0aGUgVVJMKSBub3QgaW5zaWRlIHRoZSBjb2xsYXBzaWJsZSBlbGVtZW50XG4gICAgaWYgKGV2ZW50LmN1cnJlbnRUYXJnZXQudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHZhciAkdHJpZ2dlciA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMpO1xuICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzKTtcbiAgICB2YXIgc2VsZWN0b3JzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7XG4gICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oc2VsZWN0b3JzKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkdGFyZ2V0ID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcyk7XG4gICAgICB2YXIgZGF0YSA9ICR0YXJnZXQuZGF0YShEQVRBX0tFWSQ3KTtcbiAgICAgIHZhciBjb25maWcgPSBkYXRhID8gJ3RvZ2dsZScgOiAkdHJpZ2dlci5kYXRhKCk7XG5cbiAgICAgIENvbGxhcHNlLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkdGFyZ2V0LCBjb25maWcpO1xuICAgIH0pO1xuICB9KTtcbiAgLyoqXG4gICAqIGpRdWVyeVxuICAgKi9cblxuICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJDddID0gQ29sbGFwc2UuX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uZm5bTkFNRSQ3XS5Db25zdHJ1Y3RvciA9IENvbGxhcHNlO1xuXG4gICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkN10ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJDddID0gSlFVRVJZX05PX0NPTkZMSUNUJDc7XG4gICAgcmV0dXJuIENvbGxhcHNlLl9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICB2YXIgTkFNRSQ2ID0gJ2Ryb3Bkb3duJztcbiAgdmFyIFZFUlNJT04kNiA9ICc0LjYuMic7XG4gIHZhciBEQVRBX0tFWSQ2ID0gJ2JzLmRyb3Bkb3duJztcbiAgdmFyIEVWRU5UX0tFWSQ2ID0gXCIuXCIgKyBEQVRBX0tFWSQ2O1xuICB2YXIgREFUQV9BUElfS0VZJDMgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCQ2ID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uZm5bTkFNRSQ2XTtcbiAgdmFyIEVTQ0FQRV9LRVlDT0RFJDEgPSAyNzsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3IgRXNjYXBlIChFc2MpIGtleVxuXG4gIHZhciBTUEFDRV9LRVlDT0RFID0gMzI7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIHNwYWNlIGtleVxuXG4gIHZhciBUQUJfS0VZQ09ERSA9IDk7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIHRhYiBrZXlcblxuICB2YXIgQVJST1dfVVBfS0VZQ09ERSA9IDM4OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciB1cCBhcnJvdyBrZXlcblxuICB2YXIgQVJST1dfRE9XTl9LRVlDT0RFID0gNDA7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIGRvd24gYXJyb3cga2V5XG5cbiAgdmFyIFJJR0hUX01PVVNFX0JVVFRPTl9XSElDSCA9IDM7IC8vIE1vdXNlRXZlbnQud2hpY2ggdmFsdWUgZm9yIHRoZSByaWdodCBidXR0b24gKGFzc3VtaW5nIGEgcmlnaHQtaGFuZGVkIG1vdXNlKVxuXG4gIHZhciBSRUdFWFBfS0VZRE9XTiA9IG5ldyBSZWdFeHAoQVJST1dfVVBfS0VZQ09ERSArIFwifFwiICsgQVJST1dfRE9XTl9LRVlDT0RFICsgXCJ8XCIgKyBFU0NBUEVfS0VZQ09ERSQxKTtcbiAgdmFyIENMQVNTX05BTUVfRElTQUJMRUQkMSA9ICdkaXNhYmxlZCc7XG4gIHZhciBDTEFTU19OQU1FX1NIT1ckNSA9ICdzaG93JztcbiAgdmFyIENMQVNTX05BTUVfRFJPUFVQID0gJ2Ryb3B1cCc7XG4gIHZhciBDTEFTU19OQU1FX0RST1BSSUdIVCA9ICdkcm9wcmlnaHQnO1xuICB2YXIgQ0xBU1NfTkFNRV9EUk9QTEVGVCA9ICdkcm9wbGVmdCc7XG4gIHZhciBDTEFTU19OQU1FX01FTlVSSUdIVCA9ICdkcm9wZG93bi1tZW51LXJpZ2h0JztcbiAgdmFyIENMQVNTX05BTUVfUE9TSVRJT05fU1RBVElDID0gJ3Bvc2l0aW9uLXN0YXRpYyc7XG4gIHZhciBFVkVOVF9ISURFJDMgPSBcImhpZGVcIiArIEVWRU5UX0tFWSQ2O1xuICB2YXIgRVZFTlRfSElEREVOJDMgPSBcImhpZGRlblwiICsgRVZFTlRfS0VZJDY7XG4gIHZhciBFVkVOVF9TSE9XJDMgPSBcInNob3dcIiArIEVWRU5UX0tFWSQ2O1xuICB2YXIgRVZFTlRfU0hPV04kMyA9IFwic2hvd25cIiArIEVWRU5UX0tFWSQ2O1xuICB2YXIgRVZFTlRfQ0xJQ0sgPSBcImNsaWNrXCIgKyBFVkVOVF9LRVkkNjtcbiAgdmFyIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDIgPSBcImNsaWNrXCIgKyBFVkVOVF9LRVkkNiArIERBVEFfQVBJX0tFWSQzO1xuICB2YXIgRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSA9IFwia2V5ZG93blwiICsgRVZFTlRfS0VZJDYgKyBEQVRBX0FQSV9LRVkkMztcbiAgdmFyIEVWRU5UX0tFWVVQX0RBVEFfQVBJID0gXCJrZXl1cFwiICsgRVZFTlRfS0VZJDYgKyBEQVRBX0FQSV9LRVkkMztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDIgPSAnW2RhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIl0nO1xuICB2YXIgU0VMRUNUT1JfRk9STV9DSElMRCA9ICcuZHJvcGRvd24gZm9ybSc7XG4gIHZhciBTRUxFQ1RPUl9NRU5VID0gJy5kcm9wZG93bi1tZW51JztcbiAgdmFyIFNFTEVDVE9SX05BVkJBUl9OQVYgPSAnLm5hdmJhci1uYXYnO1xuICB2YXIgU0VMRUNUT1JfVklTSUJMRV9JVEVNUyA9ICcuZHJvcGRvd24tbWVudSAuZHJvcGRvd24taXRlbTpub3QoLmRpc2FibGVkKTpub3QoOmRpc2FibGVkKSc7XG4gIHZhciBQTEFDRU1FTlRfVE9QID0gJ3RvcC1zdGFydCc7XG4gIHZhciBQTEFDRU1FTlRfVE9QRU5EID0gJ3RvcC1lbmQnO1xuICB2YXIgUExBQ0VNRU5UX0JPVFRPTSA9ICdib3R0b20tc3RhcnQnO1xuICB2YXIgUExBQ0VNRU5UX0JPVFRPTUVORCA9ICdib3R0b20tZW5kJztcbiAgdmFyIFBMQUNFTUVOVF9SSUdIVCA9ICdyaWdodC1zdGFydCc7XG4gIHZhciBQTEFDRU1FTlRfTEVGVCA9ICdsZWZ0LXN0YXJ0JztcbiAgdmFyIERlZmF1bHQkNSA9IHtcbiAgICBvZmZzZXQ6IDAsXG4gICAgZmxpcDogdHJ1ZSxcbiAgICBib3VuZGFyeTogJ3Njcm9sbFBhcmVudCcsXG4gICAgcmVmZXJlbmNlOiAndG9nZ2xlJyxcbiAgICBkaXNwbGF5OiAnZHluYW1pYycsXG4gICAgcG9wcGVyQ29uZmlnOiBudWxsXG4gIH07XG4gIHZhciBEZWZhdWx0VHlwZSQ1ID0ge1xuICAgIG9mZnNldDogJyhudW1iZXJ8c3RyaW5nfGZ1bmN0aW9uKScsXG4gICAgZmxpcDogJ2Jvb2xlYW4nLFxuICAgIGJvdW5kYXJ5OiAnKHN0cmluZ3xlbGVtZW50KScsXG4gICAgcmVmZXJlbmNlOiAnKHN0cmluZ3xlbGVtZW50KScsXG4gICAgZGlzcGxheTogJ3N0cmluZycsXG4gICAgcG9wcGVyQ29uZmlnOiAnKG51bGx8b2JqZWN0KSdcbiAgfTtcbiAgLyoqXG4gICAqIENsYXNzIGRlZmluaXRpb25cbiAgICovXG5cbiAgdmFyIERyb3Bkb3duID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEcm9wZG93bihlbGVtZW50LCBjb25maWcpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbDtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgdGhpcy5fbWVudSA9IHRoaXMuX2dldE1lbnVFbGVtZW50KCk7XG4gICAgICB0aGlzLl9pbk5hdmJhciA9IHRoaXMuX2RldGVjdE5hdmJhcigpO1xuXG4gICAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpO1xuICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICB2YXIgX3Byb3RvID0gRHJvcGRvd24ucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcbiAgICAgIGlmICh0aGlzLl9lbGVtZW50LmRpc2FibGVkIHx8ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRElTQUJMRUQkMSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNBY3RpdmUgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9tZW51KS5oYXNDbGFzcyhDTEFTU19OQU1FX1NIT1ckNSk7XG5cbiAgICAgIERyb3Bkb3duLl9jbGVhck1lbnVzKCk7XG5cbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2hvdyh0cnVlKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnNob3cgPSBmdW5jdGlvbiBzaG93KHVzZVBvcHBlcikge1xuICAgICAgaWYgKHVzZVBvcHBlciA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHVzZVBvcHBlciA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fZWxlbWVudC5kaXNhYmxlZCB8fCAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX0RJU0FCTEVEJDEpIHx8ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX21lbnUpLmhhc0NsYXNzKENMQVNTX05BTUVfU0hPVyQ1KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiB0aGlzLl9lbGVtZW50XG4gICAgICB9O1xuICAgICAgdmFyIHNob3dFdmVudCA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLkV2ZW50KEVWRU5UX1NIT1ckMywgcmVsYXRlZFRhcmdldCk7XG5cbiAgICAgIHZhciBwYXJlbnQgPSBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7XG5cbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHBhcmVudCkudHJpZ2dlcihzaG93RXZlbnQpO1xuXG4gICAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gVG90YWxseSBkaXNhYmxlIFBvcHBlciBmb3IgRHJvcGRvd25zIGluIE5hdmJhclxuXG5cbiAgICAgIGlmICghdGhpcy5faW5OYXZiYXIgJiYgdXNlUG9wcGVyKSB7XG4gICAgICAgIC8vIENoZWNrIGZvciBQb3BwZXIgZGVwZW5kZW5jeVxuICAgICAgICBpZiAodHlwZW9mIFBvcHBlcl9fZGVmYXVsdFtcImRlZmF1bHRcIl0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwXFwncyBkcm9wZG93bnMgcmVxdWlyZSBQb3BwZXIgKGh0dHBzOi8vcG9wcGVyLmpzLm9yZyknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcblxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLnJlZmVyZW5jZSA9PT0gJ3BhcmVudCcpIHtcbiAgICAgICAgICByZWZlcmVuY2VFbGVtZW50ID0gcGFyZW50O1xuICAgICAgICB9IGVsc2UgaWYgKFV0aWwuaXNFbGVtZW50KHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UpKSB7XG4gICAgICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IHRoaXMuX2NvbmZpZy5yZWZlcmVuY2U7IC8vIENoZWNrIGlmIGl0J3MgalF1ZXJ5IGVsZW1lbnRcblxuICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fY29uZmlnLnJlZmVyZW5jZS5qcXVlcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fY29uZmlnLnJlZmVyZW5jZVswXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gSWYgYm91bmRhcnkgaXMgbm90IGBzY3JvbGxQYXJlbnRgLCB0aGVuIHNldCBwb3NpdGlvbiB0byBgc3RhdGljYFxuICAgICAgICAvLyB0byBhbGxvdyB0aGUgbWVudSB0byBcImVzY2FwZVwiIHRoZSBzY3JvbGwgcGFyZW50J3MgYm91bmRhcmllc1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzI0MjUxXG5cblxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmJvdW5kYXJ5ICE9PSAnc2Nyb2xsUGFyZW50Jykge1xuICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHBhcmVudCkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9QT1NJVElPTl9TVEFUSUMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcG9wcGVyID0gbmV3IFBvcHBlcl9fZGVmYXVsdFtcImRlZmF1bHRcIl0ocmVmZXJlbmNlRWxlbWVudCwgdGhpcy5fbWVudSwgdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKCkpO1xuICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgYWRkIGV4dHJhXG4gICAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHRvIHRoZSBib2R5J3MgaW1tZWRpYXRlIGNoaWxkcmVuO1xuICAgICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAgIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxNC8wMi9tb3VzZV9ldmVudF9idWIuaHRtbFxuXG5cbiAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0ocGFyZW50KS5jbG9zZXN0KFNFTEVDVE9SX05BVkJBUl9OQVYpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShkb2N1bWVudC5ib2R5KS5jaGlsZHJlbigpLm9uKCdtb3VzZW92ZXInLCBudWxsLCAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5ub29wKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZWxlbWVudC5mb2N1cygpO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIHRydWUpO1xuXG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9tZW51KS50b2dnbGVDbGFzcyhDTEFTU19OQU1FX1NIT1ckNSk7XG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShwYXJlbnQpLnRvZ2dsZUNsYXNzKENMQVNTX05BTUVfU0hPVyQ1KS50cmlnZ2VyKCRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLkV2ZW50KEVWRU5UX1NIT1dOJDMsIHJlbGF0ZWRUYXJnZXQpKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmhpZGUgPSBmdW5jdGlvbiBoaWRlKCkge1xuICAgICAgaWYgKHRoaXMuX2VsZW1lbnQuZGlzYWJsZWQgfHwgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9ESVNBQkxFRCQxKSB8fCAhJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fbWVudSkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlbGF0ZWRUYXJnZXQgPSB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICAgIH07XG4gICAgICB2YXIgaGlkZUV2ZW50ID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uRXZlbnQoRVZFTlRfSElERSQzLCByZWxhdGVkVGFyZ2V0KTtcblxuICAgICAgdmFyIHBhcmVudCA9IERyb3Bkb3duLl9nZXRQYXJlbnRGcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcblxuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0ocGFyZW50KS50cmlnZ2VyKGhpZGVFdmVudCk7XG5cbiAgICAgIGlmIChoaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICAgIHRoaXMuX3BvcHBlci5kZXN0cm95KCk7XG4gICAgICB9XG5cbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX21lbnUpLnRvZ2dsZUNsYXNzKENMQVNTX05BTUVfU0hPVyQ1KTtcbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHBhcmVudCkudG9nZ2xlQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDUpLnRyaWdnZXIoJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uRXZlbnQoRVZFTlRfSElEREVOJDMsIHJlbGF0ZWRUYXJnZXQpKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0ucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSQ2KTtcbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLm9mZihFVkVOVF9LRVkkNik7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX21lbnUgPSBudWxsO1xuXG4gICAgICBpZiAodGhpcy5fcG9wcGVyICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3BvcHBlci5kZXN0cm95KCk7XG5cbiAgICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgIHRoaXMuX2luTmF2YmFyID0gdGhpcy5fZGV0ZWN0TmF2YmFyKCk7XG5cbiAgICAgIGlmICh0aGlzLl9wb3BwZXIgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fcG9wcGVyLnNjaGVkdWxlVXBkYXRlKCk7XG4gICAgICB9XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9hZGRFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLm9uKEVWRU5UX0NMSUNLLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgX3RoaXMudG9nZ2xlKCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgY29uZmlnID0gX2V4dGVuZHMoe30sIHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdCwgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZWxlbWVudCkuZGF0YSgpLCBjb25maWcpO1xuICAgICAgVXRpbC50eXBlQ2hlY2tDb25maWcoTkFNRSQ2LCBjb25maWcsIHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRNZW51RWxlbWVudCA9IGZ1bmN0aW9uIF9nZXRNZW51RWxlbWVudCgpIHtcbiAgICAgIGlmICghdGhpcy5fbWVudSkge1xuICAgICAgICB2YXIgcGFyZW50ID0gRHJvcGRvd24uX2dldFBhcmVudEZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuXG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICB0aGlzLl9tZW51ID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfTUVOVSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX21lbnU7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0UGxhY2VtZW50ID0gZnVuY3Rpb24gX2dldFBsYWNlbWVudCgpIHtcbiAgICAgIHZhciAkcGFyZW50RHJvcGRvd24gPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUpO1xuICAgICAgdmFyIHBsYWNlbWVudCA9IFBMQUNFTUVOVF9CT1RUT007IC8vIEhhbmRsZSBkcm9wdXBcblxuICAgICAgaWYgKCRwYXJlbnREcm9wZG93bi5oYXNDbGFzcyhDTEFTU19OQU1FX0RST1BVUCkpIHtcbiAgICAgICAgcGxhY2VtZW50ID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fbWVudSkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9NRU5VUklHSFQpID8gUExBQ0VNRU5UX1RPUEVORCA6IFBMQUNFTUVOVF9UT1A7XG4gICAgICB9IGVsc2UgaWYgKCRwYXJlbnREcm9wZG93bi5oYXNDbGFzcyhDTEFTU19OQU1FX0RST1BSSUdIVCkpIHtcbiAgICAgICAgcGxhY2VtZW50ID0gUExBQ0VNRU5UX1JJR0hUO1xuICAgICAgfSBlbHNlIGlmICgkcGFyZW50RHJvcGRvd24uaGFzQ2xhc3MoQ0xBU1NfTkFNRV9EUk9QTEVGVCkpIHtcbiAgICAgICAgcGxhY2VtZW50ID0gUExBQ0VNRU5UX0xFRlQ7XG4gICAgICB9IGVsc2UgaWYgKCRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX21lbnUpLmhhc0NsYXNzKENMQVNTX05BTUVfTUVOVVJJR0hUKSkge1xuICAgICAgICBwbGFjZW1lbnQgPSBQTEFDRU1FTlRfQk9UVE9NRU5EO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGxhY2VtZW50O1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2RldGVjdE5hdmJhciA9IGZ1bmN0aW9uIF9kZXRlY3ROYXZiYXIoKSB7XG4gICAgICByZXR1cm4gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZWxlbWVudCkuY2xvc2VzdCgnLm5hdmJhcicpLmxlbmd0aCA+IDA7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0T2Zmc2V0ID0gZnVuY3Rpb24gX2dldE9mZnNldCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgb2Zmc2V0ID0ge307XG5cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fY29uZmlnLm9mZnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvZmZzZXQuZm4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIGRhdGEub2Zmc2V0cyA9IF9leHRlbmRzKHt9LCBkYXRhLm9mZnNldHMsIF90aGlzMi5fY29uZmlnLm9mZnNldChkYXRhLm9mZnNldHMsIF90aGlzMi5fZWxlbWVudCkpO1xuICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2Zmc2V0Lm9mZnNldCA9IHRoaXMuX2NvbmZpZy5vZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0UG9wcGVyQ29uZmlnID0gZnVuY3Rpb24gX2dldFBvcHBlckNvbmZpZygpIHtcbiAgICAgIHZhciBwb3BwZXJDb25maWcgPSB7XG4gICAgICAgIHBsYWNlbWVudDogdGhpcy5fZ2V0UGxhY2VtZW50KCksXG4gICAgICAgIG1vZGlmaWVyczoge1xuICAgICAgICAgIG9mZnNldDogdGhpcy5fZ2V0T2Zmc2V0KCksXG4gICAgICAgICAgZmxpcDoge1xuICAgICAgICAgICAgZW5hYmxlZDogdGhpcy5fY29uZmlnLmZsaXBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByZXZlbnRPdmVyZmxvdzoge1xuICAgICAgICAgICAgYm91bmRhcmllc0VsZW1lbnQ6IHRoaXMuX2NvbmZpZy5ib3VuZGFyeVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTsgLy8gRGlzYWJsZSBQb3BwZXIgaWYgd2UgaGF2ZSBhIHN0YXRpYyBkaXNwbGF5XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcuZGlzcGxheSA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgcG9wcGVyQ29uZmlnLm1vZGlmaWVycy5hcHBseVN0eWxlID0ge1xuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgcG9wcGVyQ29uZmlnLCB0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnKTtcbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIERyb3Bkb3duLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYXRhID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcykuZGF0YShEQVRBX0tFWSQ2KTtcblxuICAgICAgICB2YXIgX2NvbmZpZyA9IHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDogbnVsbDtcblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IERyb3Bkb3duKHRoaXMsIF9jb25maWcpO1xuICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMpLmRhdGEoREFUQV9LRVkkNiwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgRHJvcGRvd24uX2NsZWFyTWVudXMgPSBmdW5jdGlvbiBfY2xlYXJNZW51cyhldmVudCkge1xuICAgICAgaWYgKGV2ZW50ICYmIChldmVudC53aGljaCA9PT0gUklHSFRfTU9VU0VfQlVUVE9OX1dISUNIIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcgJiYgZXZlbnQud2hpY2ggIT09IFRBQl9LRVlDT0RFKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB0b2dnbGVzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0RBVEFfVE9HR0xFJDIpKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRvZ2dsZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IERyb3Bkb3duLl9nZXRQYXJlbnRGcm9tRWxlbWVudCh0b2dnbGVzW2ldKTtcblxuICAgICAgICB2YXIgY29udGV4dCA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRvZ2dsZXNbaV0pLmRhdGEoREFUQV9LRVkkNik7XG4gICAgICAgIHZhciByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRvZ2dsZXNbaV1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICAgIHJlbGF0ZWRUYXJnZXQuY2xpY2tFdmVudCA9IGV2ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZHJvcGRvd25NZW51ID0gY29udGV4dC5fbWVudTtcblxuICAgICAgICBpZiAoISRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHBhcmVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQgJiYgKGV2ZW50LnR5cGUgPT09ICdjbGljaycgJiYgL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC53aGljaCA9PT0gVEFCX0tFWUNPREUpICYmICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmNvbnRhaW5zKHBhcmVudCwgZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGhpZGVFdmVudCA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLkV2ZW50KEVWRU5UX0hJREUkMywgcmVsYXRlZFRhcmdldCk7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHBhcmVudCkudHJpZ2dlcihoaWRlRXZlbnQpO1xuXG4gICAgICAgIGlmIChoaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgICAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHdlIGFkZGVkIGZvciBpT1Mgc3VwcG9ydFxuXG5cbiAgICAgICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGRvY3VtZW50LmJvZHkpLmNoaWxkcmVuKCkub2ZmKCdtb3VzZW92ZXInLCBudWxsLCAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5ub29wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRvZ2dsZXNbaV0uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG5cbiAgICAgICAgaWYgKGNvbnRleHQuX3BvcHBlcikge1xuICAgICAgICAgIGNvbnRleHQuX3BvcHBlci5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShkcm9wZG93bk1lbnUpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfU0hPVyQ1KTtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0ocGFyZW50KS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX1NIT1ckNSkudHJpZ2dlcigkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5FdmVudChFVkVOVF9ISURERU4kMywgcmVsYXRlZFRhcmdldCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQgPSBmdW5jdGlvbiBfZ2V0UGFyZW50RnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIHBhcmVudDtcbiAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgIHBhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyZW50IHx8IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gICAgO1xuXG4gICAgRHJvcGRvd24uX2RhdGFBcGlLZXlkb3duSGFuZGxlciA9IGZ1bmN0aW9uIF9kYXRhQXBpS2V5ZG93bkhhbmRsZXIoZXZlbnQpIHtcbiAgICAgIC8vIElmIG5vdCBpbnB1dC90ZXh0YXJlYTpcbiAgICAgIC8vICAtIEFuZCBub3QgYSBrZXkgaW4gUkVHRVhQX0tFWURPV04gPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuICAgICAgLy8gSWYgaW5wdXQvdGV4dGFyZWE6XG4gICAgICAvLyAgLSBJZiBzcGFjZSBrZXkgPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuICAgICAgLy8gIC0gSWYga2V5IGlzIG90aGVyIHRoYW4gZXNjYXBlXG4gICAgICAvLyAgICAtIElmIGtleSBpcyBub3QgdXAgb3IgZG93biA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgICAvLyAgICAtIElmIHRyaWdnZXIgaW5zaWRlIHRoZSBtZW51ID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcbiAgICAgIGlmICgvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKSA/IGV2ZW50LndoaWNoID09PSBTUEFDRV9LRVlDT0RFIHx8IGV2ZW50LndoaWNoICE9PSBFU0NBUEVfS0VZQ09ERSQxICYmIChldmVudC53aGljaCAhPT0gQVJST1dfRE9XTl9LRVlDT0RFICYmIGV2ZW50LndoaWNoICE9PSBBUlJPV19VUF9LRVlDT0RFIHx8ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGV2ZW50LnRhcmdldCkuY2xvc2VzdChTRUxFQ1RPUl9NRU5VKS5sZW5ndGgpIDogIVJFR0VYUF9LRVlET1dOLnRlc3QoZXZlbnQud2hpY2gpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcykuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9ESVNBQkxFRCQxKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBwYXJlbnQgPSBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcyk7XG5cbiAgICAgIHZhciBpc0FjdGl2ZSA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHBhcmVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDUpO1xuXG4gICAgICBpZiAoIWlzQWN0aXZlICYmIGV2ZW50LndoaWNoID09PSBFU0NBUEVfS0VZQ09ERSQxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBpZiAoIWlzQWN0aXZlIHx8IGV2ZW50LndoaWNoID09PSBFU0NBUEVfS0VZQ09ERSQxIHx8IGV2ZW50LndoaWNoID09PSBTUEFDRV9LRVlDT0RFKSB7XG4gICAgICAgIGlmIChldmVudC53aGljaCA9PT0gRVNDQVBFX0tFWUNPREUkMSkge1xuICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHBhcmVudC5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SX0RBVEFfVE9HR0xFJDIpKS50cmlnZ2VyKCdmb2N1cycpO1xuICAgICAgICB9XG5cbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcykudHJpZ2dlcignY2xpY2snKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaXRlbXMgPSBbXS5zbGljZS5jYWxsKHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX1ZJU0lCTEVfSVRFTVMpKS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGl0ZW0pLmlzKCc6dmlzaWJsZScpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5kZXggPSBpdGVtcy5pbmRleE9mKGV2ZW50LnRhcmdldCk7XG5cbiAgICAgIGlmIChldmVudC53aGljaCA9PT0gQVJST1dfVVBfS0VZQ09ERSAmJiBpbmRleCA+IDApIHtcbiAgICAgICAgLy8gVXBcbiAgICAgICAgaW5kZXgtLTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LndoaWNoID09PSBBUlJPV19ET1dOX0tFWUNPREUgJiYgaW5kZXggPCBpdGVtcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIC8vIERvd25cbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IDA7XG4gICAgICB9XG5cbiAgICAgIGl0ZW1zW2luZGV4XS5mb2N1cygpO1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoRHJvcGRvd24sIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OJDY7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdCQ1O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0VHlwZVwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0VHlwZSQ1O1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBEcm9wZG93bjtcbiAgfSgpO1xuICAvKipcbiAgICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAgICovXG5cblxuICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShkb2N1bWVudCkub24oRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUkMiwgRHJvcGRvd24uX2RhdGFBcGlLZXlkb3duSGFuZGxlcikub24oRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSwgU0VMRUNUT1JfTUVOVSwgRHJvcGRvd24uX2RhdGFBcGlLZXlkb3duSGFuZGxlcikub24oRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMiArIFwiIFwiICsgRVZFTlRfS0VZVVBfREFUQV9BUEksIERyb3Bkb3duLl9jbGVhck1lbnVzKS5vbihFVkVOVF9DTElDS19EQVRBX0FQSSQyLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQyLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgRHJvcGRvd24uX2pRdWVyeUludGVyZmFjZS5jYWxsKCRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMpLCAndG9nZ2xlJyk7XG4gIH0pLm9uKEVWRU5UX0NMSUNLX0RBVEFfQVBJJDIsIFNFTEVDVE9SX0ZPUk1fQ0hJTEQsIGZ1bmN0aW9uIChlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSk7XG4gIC8qKlxuICAgKiBqUXVlcnlcbiAgICovXG5cbiAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uZm5bTkFNRSQ2XSA9IERyb3Bkb3duLl9qUXVlcnlJbnRlcmZhY2U7XG4gICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkNl0uQ29uc3RydWN0b3IgPSBEcm9wZG93bjtcblxuICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJDZdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uZm5bTkFNRSQ2XSA9IEpRVUVSWV9OT19DT05GTElDVCQ2O1xuICAgIHJldHVybiBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDb25zdGFudHNcbiAgICovXG5cbiAgdmFyIE5BTUUkNSA9ICdtb2RhbCc7XG4gIHZhciBWRVJTSU9OJDUgPSAnNC42LjInO1xuICB2YXIgREFUQV9LRVkkNSA9ICdicy5tb2RhbCc7XG4gIHZhciBFVkVOVF9LRVkkNSA9IFwiLlwiICsgREFUQV9LRVkkNTtcbiAgdmFyIERBVEFfQVBJX0tFWSQyID0gJy5kYXRhLWFwaSc7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkNSA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkNV07XG4gIHZhciBFU0NBUEVfS0VZQ09ERSA9IDI3OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciBFc2NhcGUgKEVzYykga2V5XG5cbiAgdmFyIENMQVNTX05BTUVfU0NST0xMQUJMRSA9ICdtb2RhbC1kaWFsb2ctc2Nyb2xsYWJsZSc7XG4gIHZhciBDTEFTU19OQU1FX1NDUk9MTEJBUl9NRUFTVVJFUiA9ICdtb2RhbC1zY3JvbGxiYXItbWVhc3VyZSc7XG4gIHZhciBDTEFTU19OQU1FX0JBQ0tEUk9QID0gJ21vZGFsLWJhY2tkcm9wJztcbiAgdmFyIENMQVNTX05BTUVfT1BFTiA9ICdtb2RhbC1vcGVuJztcbiAgdmFyIENMQVNTX05BTUVfRkFERSQ0ID0gJ2ZhZGUnO1xuICB2YXIgQ0xBU1NfTkFNRV9TSE9XJDQgPSAnc2hvdyc7XG4gIHZhciBDTEFTU19OQU1FX1NUQVRJQyA9ICdtb2RhbC1zdGF0aWMnO1xuICB2YXIgRVZFTlRfSElERSQyID0gXCJoaWRlXCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX0hJREVfUFJFVkVOVEVEID0gXCJoaWRlUHJldmVudGVkXCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX0hJRERFTiQyID0gXCJoaWRkZW5cIiArIEVWRU5UX0tFWSQ1O1xuICB2YXIgRVZFTlRfU0hPVyQyID0gXCJzaG93XCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX1NIT1dOJDIgPSBcInNob3duXCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX0ZPQ1VTSU4gPSBcImZvY3VzaW5cIiArIEVWRU5UX0tFWSQ1O1xuICB2YXIgRVZFTlRfUkVTSVpFID0gXCJyZXNpemVcIiArIEVWRU5UX0tFWSQ1O1xuICB2YXIgRVZFTlRfQ0xJQ0tfRElTTUlTUyQxID0gXCJjbGljay5kaXNtaXNzXCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX0tFWURPV05fRElTTUlTUyA9IFwia2V5ZG93bi5kaXNtaXNzXCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX01PVVNFVVBfRElTTUlTUyA9IFwibW91c2V1cC5kaXNtaXNzXCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX01PVVNFRE9XTl9ESVNNSVNTID0gXCJtb3VzZWRvd24uZGlzbWlzc1wiICsgRVZFTlRfS0VZJDU7XG4gIHZhciBFVkVOVF9DTElDS19EQVRBX0FQSSQxID0gXCJjbGlja1wiICsgRVZFTlRfS0VZJDUgKyBEQVRBX0FQSV9LRVkkMjtcbiAgdmFyIFNFTEVDVE9SX0RJQUxPRyA9ICcubW9kYWwtZGlhbG9nJztcbiAgdmFyIFNFTEVDVE9SX01PREFMX0JPRFkgPSAnLm1vZGFsLWJvZHknO1xuICB2YXIgU0VMRUNUT1JfREFUQV9UT0dHTEUkMSA9ICdbZGF0YS10b2dnbGU9XCJtb2RhbFwiXSc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX0RJU01JU1MkMSA9ICdbZGF0YS1kaXNtaXNzPVwibW9kYWxcIl0nO1xuICB2YXIgU0VMRUNUT1JfRklYRURfQ09OVEVOVCA9ICcuZml4ZWQtdG9wLCAuZml4ZWQtYm90dG9tLCAuaXMtZml4ZWQsIC5zdGlja3ktdG9wJztcbiAgdmFyIFNFTEVDVE9SX1NUSUNLWV9DT05URU5UID0gJy5zdGlja3ktdG9wJztcbiAgdmFyIERlZmF1bHQkNCA9IHtcbiAgICBiYWNrZHJvcDogdHJ1ZSxcbiAgICBrZXlib2FyZDogdHJ1ZSxcbiAgICBmb2N1czogdHJ1ZSxcbiAgICBzaG93OiB0cnVlXG4gIH07XG4gIHZhciBEZWZhdWx0VHlwZSQ0ID0ge1xuICAgIGJhY2tkcm9wOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gICAga2V5Ym9hcmQ6ICdib29sZWFuJyxcbiAgICBmb2N1czogJ2Jvb2xlYW4nLFxuICAgIHNob3c6ICdib29sZWFuJ1xuICB9O1xuICAvKipcbiAgICogQ2xhc3MgZGVmaW5pdGlvblxuICAgKi9cblxuICB2YXIgTW9kYWwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1vZGFsKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHRoaXMuX2RpYWxvZyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9ESUFMT0cpO1xuICAgICAgdGhpcy5fYmFja2Ryb3AgPSBudWxsO1xuICAgICAgdGhpcy5faXNTaG93biA9IGZhbHNlO1xuICAgICAgdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2lnbm9yZUJhY2tkcm9wQ2xpY2sgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5fc2Nyb2xsYmFyV2lkdGggPSAwO1xuICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICB2YXIgX3Byb3RvID0gTW9kYWwucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5faXNTaG93biA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KHJlbGF0ZWRUYXJnZXQpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uc2hvdyA9IGZ1bmN0aW9uIHNob3cocmVsYXRlZFRhcmdldCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX2lzU2hvd24gfHwgdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHNob3dFdmVudCA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLkV2ZW50KEVWRU5UX1NIT1ckMiwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiByZWxhdGVkVGFyZ2V0XG4gICAgICB9KTtcbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoc2hvd0V2ZW50KTtcblxuICAgICAgaWYgKHNob3dFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzU2hvd24gPSB0cnVlO1xuXG4gICAgICBpZiAoJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GQURFJDQpKSB7XG4gICAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2NoZWNrU2Nyb2xsYmFyKCk7XG5cbiAgICAgIHRoaXMuX3NldFNjcm9sbGJhcigpO1xuXG4gICAgICB0aGlzLl9hZGp1c3REaWFsb2coKTtcblxuICAgICAgdGhpcy5fc2V0RXNjYXBlRXZlbnQoKTtcblxuICAgICAgdGhpcy5fc2V0UmVzaXplRXZlbnQoKTtcblxuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZWxlbWVudCkub24oRVZFTlRfQ0xJQ0tfRElTTUlTUyQxLCBTRUxFQ1RPUl9EQVRBX0RJU01JU1MkMSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5oaWRlKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZGlhbG9nKS5vbihFVkVOVF9NT1VTRURPV05fRElTTUlTUywgZnVuY3Rpb24gKCkge1xuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShfdGhpcy5fZWxlbWVudCkub25lKEVWRU5UX01PVVNFVVBfRElTTUlTUywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgaWYgKCRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGV2ZW50LnRhcmdldCkuaXMoX3RoaXMuX2VsZW1lbnQpKSB7XG4gICAgICAgICAgICBfdGhpcy5faWdub3JlQmFja2Ryb3BDbGljayA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9zaG93QmFja2Ryb3AoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuX3Nob3dFbGVtZW50KHJlbGF0ZWRUYXJnZXQpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5oaWRlID0gZnVuY3Rpb24gaGlkZShldmVudCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuX2lzU2hvd24gfHwgdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGhpZGVFdmVudCA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLkV2ZW50KEVWRU5UX0hJREUkMik7XG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKGhpZGVFdmVudCk7XG5cbiAgICAgIGlmICghdGhpcy5faXNTaG93biB8fCBoaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgICB2YXIgdHJhbnNpdGlvbiA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRkFERSQ0KTtcblxuICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2V0RXNjYXBlRXZlbnQoKTtcblxuICAgICAgdGhpcy5fc2V0UmVzaXplRXZlbnQoKTtcblxuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZG9jdW1lbnQpLm9mZihFVkVOVF9GT0NVU0lOKTtcbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfU0hPVyQ0KTtcbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLm9mZihFVkVOVF9DTElDS19ESVNNSVNTJDEpO1xuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZGlhbG9nKS5vZmYoRVZFTlRfTU9VU0VET1dOX0RJU01JU1MpO1xuXG4gICAgICBpZiAodHJhbnNpdGlvbikge1xuICAgICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIuX2hpZGVNb2RhbChldmVudCk7XG4gICAgICAgIH0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9oaWRlTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgW3dpbmRvdywgdGhpcy5fZWxlbWVudCwgdGhpcy5fZGlhbG9nXS5mb3JFYWNoKGZ1bmN0aW9uIChodG1sRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oaHRtbEVsZW1lbnQpLm9mZihFVkVOVF9LRVkkNSk7XG4gICAgICB9KTtcbiAgICAgIC8qKlxuICAgICAgICogYGRvY3VtZW50YCBoYXMgMiBldmVudHMgYEVWRU5UX0ZPQ1VTSU5gIGFuZCBgRVZFTlRfQ0xJQ0tfREFUQV9BUElgXG4gICAgICAgKiBEbyBub3QgbW92ZSBgZG9jdW1lbnRgIGluIGBodG1sRWxlbWVudHNgIGFycmF5XG4gICAgICAgKiBJdCB3aWxsIHJlbW92ZSBgRVZFTlRfQ0xJQ0tfREFUQV9BUElgIGV2ZW50IHRoYXQgc2hvdWxkIHJlbWFpblxuICAgICAgICovXG5cbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGRvY3VtZW50KS5vZmYoRVZFTlRfRk9DVVNJTik7XG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsIERBVEFfS0VZJDUpO1xuICAgICAgdGhpcy5fY29uZmlnID0gbnVsbDtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5fZGlhbG9nID0gbnVsbDtcbiAgICAgIHRoaXMuX2JhY2tkcm9wID0gbnVsbDtcbiAgICAgIHRoaXMuX2lzU2hvd24gPSBudWxsO1xuICAgICAgdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcgPSBudWxsO1xuICAgICAgdGhpcy5faWdub3JlQmFja2Ryb3BDbGljayA9IG51bGw7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBudWxsO1xuICAgICAgdGhpcy5fc2Nyb2xsYmFyV2lkdGggPSBudWxsO1xuICAgIH07XG5cbiAgICBfcHJvdG8uaGFuZGxlVXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlVXBkYXRlKCkge1xuICAgICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgY29uZmlnID0gX2V4dGVuZHMoe30sIERlZmF1bHQkNCwgY29uZmlnKTtcbiAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUkNSwgY29uZmlnLCBEZWZhdWx0VHlwZSQ0KTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5fdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbiA9IGZ1bmN0aW9uIF90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBoaWRlRXZlbnRQcmV2ZW50ZWQgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5FdmVudChFVkVOVF9ISURFX1BSRVZFTlRFRCk7XG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKGhpZGVFdmVudFByZXZlbnRlZCk7XG5cbiAgICAgIGlmIChoaWRlRXZlbnRQcmV2ZW50ZWQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNNb2RhbE92ZXJmbG93aW5nID0gdGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuXG4gICAgICBpZiAoIWlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TVEFUSUMpO1xuXG4gICAgICB2YXIgbW9kYWxUcmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2RpYWxvZyk7XG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS5vZmYoVXRpbC5UUkFOU0lUSU9OX0VORCk7XG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NUQVRJQyk7XG5cbiAgICAgICAgaWYgKCFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShfdGhpczMuX2VsZW1lbnQpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpczMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gJyc7XG4gICAgICAgICAgfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoX3RoaXMzLl9lbGVtZW50LCBtb2RhbFRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKG1vZGFsVHJhbnNpdGlvbkR1cmF0aW9uKTtcblxuICAgICAgdGhpcy5fZWxlbWVudC5mb2N1cygpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX3Nob3dFbGVtZW50ID0gZnVuY3Rpb24gX3Nob3dFbGVtZW50KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICB2YXIgdHJhbnNpdGlvbiA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRkFERSQ0KTtcbiAgICAgIHZhciBtb2RhbEJvZHkgPSB0aGlzLl9kaWFsb2cgPyB0aGlzLl9kaWFsb2cucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9NT0RBTF9CT0RZKSA6IG51bGw7XG5cbiAgICAgIGlmICghdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlIHx8IHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgLy8gRG9uJ3QgbW92ZSBtb2RhbCdzIERPTSBwb3NpdGlvblxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKTtcblxuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCB0cnVlKTtcblxuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZGlhbG9nJyk7XG5cbiAgICAgIGlmICgkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9kaWFsb2cpLmhhc0NsYXNzKENMQVNTX05BTUVfU0NST0xMQUJMRSkgJiYgbW9kYWxCb2R5KSB7XG4gICAgICAgIG1vZGFsQm9keS5zY3JvbGxUb3AgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAodHJhbnNpdGlvbikge1xuICAgICAgICBVdGlsLnJlZmxvdyh0aGlzLl9lbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZWxlbWVudCkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDQpO1xuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmZvY3VzKSB7XG4gICAgICAgIHRoaXMuX2VuZm9yY2VGb2N1cygpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2hvd25FdmVudCA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLkV2ZW50KEVWRU5UX1NIT1dOJDIsIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogcmVsYXRlZFRhcmdldFxuICAgICAgfSk7XG5cbiAgICAgIHZhciB0cmFuc2l0aW9uQ29tcGxldGUgPSBmdW5jdGlvbiB0cmFuc2l0aW9uQ29tcGxldGUoKSB7XG4gICAgICAgIGlmIChfdGhpczQuX2NvbmZpZy5mb2N1cykge1xuICAgICAgICAgIF90aGlzNC5fZWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXM0Ll9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oX3RoaXM0Ll9lbGVtZW50KS50cmlnZ2VyKHNob3duRXZlbnQpO1xuICAgICAgfTtcblxuICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fZGlhbG9nKTtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZGlhbG9nKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgdHJhbnNpdGlvbkNvbXBsZXRlKS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNpdGlvbkNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fZW5mb3JjZUZvY3VzID0gZnVuY3Rpb24gX2VuZm9yY2VGb2N1cygpIHtcbiAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShkb2N1bWVudCkub2ZmKEVWRU5UX0ZPQ1VTSU4pIC8vIEd1YXJkIGFnYWluc3QgaW5maW5pdGUgZm9jdXMgbG9vcFxuICAgICAgLm9uKEVWRU5UX0ZPQ1VTSU4sIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAoZG9jdW1lbnQgIT09IGV2ZW50LnRhcmdldCAmJiBfdGhpczUuX2VsZW1lbnQgIT09IGV2ZW50LnRhcmdldCAmJiAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShfdGhpczUuX2VsZW1lbnQpLmhhcyhldmVudC50YXJnZXQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIF90aGlzNS5fZWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9zZXRFc2NhcGVFdmVudCA9IGZ1bmN0aW9uIF9zZXRFc2NhcGVFdmVudCgpIHtcbiAgICAgIHZhciBfdGhpczYgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNTaG93bikge1xuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9LRVlET1dOX0RJU01JU1MsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGlmIChfdGhpczYuX2NvbmZpZy5rZXlib2FyZCAmJiBldmVudC53aGljaCA9PT0gRVNDQVBFX0tFWUNPREUpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIF90aGlzNi5oaWRlKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICghX3RoaXM2Ll9jb25maWcua2V5Ym9hcmQgJiYgZXZlbnQud2hpY2ggPT09IEVTQ0FQRV9LRVlDT0RFKSB7XG4gICAgICAgICAgICBfdGhpczYuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5faXNTaG93bikge1xuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS5vZmYoRVZFTlRfS0VZRE9XTl9ESVNNSVNTKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9zZXRSZXNpemVFdmVudCA9IGZ1bmN0aW9uIF9zZXRSZXNpemVFdmVudCgpIHtcbiAgICAgIHZhciBfdGhpczcgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNTaG93bikge1xuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh3aW5kb3cpLm9uKEVWRU5UX1JFU0laRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzNy5oYW5kbGVVcGRhdGUoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHdpbmRvdykub2ZmKEVWRU5UX1JFU0laRSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5faGlkZU1vZGFsID0gZnVuY3Rpb24gX2hpZGVNb2RhbCgpIHtcbiAgICAgIHZhciBfdGhpczggPSB0aGlzO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIHRydWUpO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcpO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgncm9sZScpO1xuXG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcblxuICAgICAgdGhpcy5fc2hvd0JhY2tkcm9wKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZG9jdW1lbnQuYm9keSkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9PUEVOKTtcblxuICAgICAgICBfdGhpczguX3Jlc2V0QWRqdXN0bWVudHMoKTtcblxuICAgICAgICBfdGhpczguX3Jlc2V0U2Nyb2xsYmFyKCk7XG5cbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oX3RoaXM4Ll9lbGVtZW50KS50cmlnZ2VyKEVWRU5UX0hJRERFTiQyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX3JlbW92ZUJhY2tkcm9wID0gZnVuY3Rpb24gX3JlbW92ZUJhY2tkcm9wKCkge1xuICAgICAgaWYgKHRoaXMuX2JhY2tkcm9wKSB7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2JhY2tkcm9wKS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5fYmFja2Ryb3AgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX3Nob3dCYWNrZHJvcCA9IGZ1bmN0aW9uIF9zaG93QmFja2Ryb3AoY2FsbGJhY2spIHtcbiAgICAgIHZhciBfdGhpczkgPSB0aGlzO1xuXG4gICAgICB2YXIgYW5pbWF0ZSA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRkFERSQ0KSA/IENMQVNTX05BTUVfRkFERSQ0IDogJyc7XG5cbiAgICAgIGlmICh0aGlzLl9pc1Nob3duICYmIHRoaXMuX2NvbmZpZy5iYWNrZHJvcCkge1xuICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSBDTEFTU19OQU1FX0JBQ0tEUk9QO1xuXG4gICAgICAgIGlmIChhbmltYXRlKSB7XG4gICAgICAgICAgdGhpcy5fYmFja2Ryb3AuY2xhc3NMaXN0LmFkZChhbmltYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2JhY2tkcm9wKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZWxlbWVudCkub24oRVZFTlRfQ0xJQ0tfRElTTUlTUyQxLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoX3RoaXM5Ll9pZ25vcmVCYWNrZHJvcENsaWNrKSB7XG4gICAgICAgICAgICBfdGhpczkuX2lnbm9yZUJhY2tkcm9wQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSBldmVudC5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF90aGlzOS5fY29uZmlnLmJhY2tkcm9wID09PSAnc3RhdGljJykge1xuICAgICAgICAgICAgX3RoaXM5Ll90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzOS5oaWRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYW5pbWF0ZSkge1xuICAgICAgICAgIFV0aWwucmVmbG93KHRoaXMuX2JhY2tkcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2JhY2tkcm9wKS5hZGRDbGFzcyhDTEFTU19OQU1FX1NIT1ckNCk7XG5cbiAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYW5pbWF0ZSkge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJhY2tkcm9wVHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9iYWNrZHJvcCk7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2JhY2tkcm9wKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY2FsbGJhY2spLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGJhY2tkcm9wVHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzU2hvd24gJiYgdGhpcy5fYmFja2Ryb3ApIHtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fYmFja2Ryb3ApLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfU0hPVyQ0KTtcblxuICAgICAgICB2YXIgY2FsbGJhY2tSZW1vdmUgPSBmdW5jdGlvbiBjYWxsYmFja1JlbW92ZSgpIHtcbiAgICAgICAgICBfdGhpczkuX3JlbW92ZUJhY2tkcm9wKCk7XG5cbiAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICgkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZBREUkNCkpIHtcbiAgICAgICAgICB2YXIgX2JhY2tkcm9wVHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9iYWNrZHJvcCk7XG5cbiAgICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9iYWNrZHJvcCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNhbGxiYWNrUmVtb3ZlKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChfYmFja2Ryb3BUcmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrUmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHVzZWQgdG8gaGFuZGxlIG92ZXJmbG93aW5nIG1vZGFsc1xuICAgIC8vIHRvZG8gKGZhdCk6IHRoZXNlIHNob3VsZCBwcm9iYWJseSBiZSByZWZhY3RvcmVkIG91dCBvZiBtb2RhbC5qc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICA7XG5cbiAgICBfcHJvdG8uX2FkanVzdERpYWxvZyA9IGZ1bmN0aW9uIF9hZGp1c3REaWFsb2coKSB7XG4gICAgICB2YXIgaXNNb2RhbE92ZXJmbG93aW5nID0gdGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuXG4gICAgICBpZiAoIXRoaXMuX2lzQm9keU92ZXJmbG93aW5nICYmIGlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0ID0gdGhpcy5fc2Nyb2xsYmFyV2lkdGggKyBcInB4XCI7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9pc0JvZHlPdmVyZmxvd2luZyAmJiAhaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gdGhpcy5fc2Nyb2xsYmFyV2lkdGggKyBcInB4XCI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fcmVzZXRBZGp1c3RtZW50cyA9IGZ1bmN0aW9uIF9yZXNldEFkanVzdG1lbnRzKCkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCA9ICcnO1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnJztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9jaGVja1Njcm9sbGJhciA9IGZ1bmN0aW9uIF9jaGVja1Njcm9sbGJhcigpIHtcbiAgICAgIHZhciByZWN0ID0gZG9jdW1lbnQuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMuX2lzQm9keU92ZXJmbG93aW5nID0gTWF0aC5yb3VuZChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSA8IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgdGhpcy5fc2Nyb2xsYmFyV2lkdGggPSB0aGlzLl9nZXRTY3JvbGxiYXJXaWR0aCgpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX3NldFNjcm9sbGJhciA9IGZ1bmN0aW9uIF9zZXRTY3JvbGxiYXIoKSB7XG4gICAgICB2YXIgX3RoaXMxMCA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLl9pc0JvZHlPdmVyZmxvd2luZykge1xuICAgICAgICAvLyBOb3RlOiBET01Ob2RlLnN0eWxlLnBhZGRpbmdSaWdodCByZXR1cm5zIHRoZSBhY3R1YWwgdmFsdWUgb3IgJycgaWYgbm90IHNldFxuICAgICAgICAvLyAgIHdoaWxlICQoRE9NTm9kZSkuY3NzKCdwYWRkaW5nLXJpZ2h0JykgcmV0dXJucyB0aGUgY2FsY3VsYXRlZCB2YWx1ZSBvciAwIGlmIG5vdCBzZXRcbiAgICAgICAgdmFyIGZpeGVkQ29udGVudCA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9GSVhFRF9DT05URU5UKSk7XG4gICAgICAgIHZhciBzdGlja3lDb250ZW50ID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX1NUSUNLWV9DT05URU5UKSk7IC8vIEFkanVzdCBmaXhlZCBjb250ZW50IHBhZGRpbmdcblxuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShmaXhlZENvbnRlbnQpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7XG4gICAgICAgICAgdmFyIGFjdHVhbFBhZGRpbmcgPSBlbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodDtcbiAgICAgICAgICB2YXIgY2FsY3VsYXRlZFBhZGRpbmcgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShlbGVtZW50KS5jc3MoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShlbGVtZW50KS5kYXRhKCdwYWRkaW5nLXJpZ2h0JywgYWN0dWFsUGFkZGluZykuY3NzKCdwYWRkaW5nLXJpZ2h0JywgcGFyc2VGbG9hdChjYWxjdWxhdGVkUGFkZGluZykgKyBfdGhpczEwLl9zY3JvbGxiYXJXaWR0aCArIFwicHhcIik7XG4gICAgICAgIH0pOyAvLyBBZGp1c3Qgc3RpY2t5IGNvbnRlbnQgbWFyZ2luXG5cbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oc3RpY2t5Q29udGVudCkuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgYWN0dWFsTWFyZ2luID0gZWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodDtcbiAgICAgICAgICB2YXIgY2FsY3VsYXRlZE1hcmdpbiA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGVsZW1lbnQpLmNzcygnbWFyZ2luLXJpZ2h0Jyk7XG4gICAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZWxlbWVudCkuZGF0YSgnbWFyZ2luLXJpZ2h0JywgYWN0dWFsTWFyZ2luKS5jc3MoJ21hcmdpbi1yaWdodCcsIHBhcnNlRmxvYXQoY2FsY3VsYXRlZE1hcmdpbikgLSBfdGhpczEwLl9zY3JvbGxiYXJXaWR0aCArIFwicHhcIik7XG4gICAgICAgIH0pOyAvLyBBZGp1c3QgYm9keSBwYWRkaW5nXG5cbiAgICAgICAgdmFyIGFjdHVhbFBhZGRpbmcgPSBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodDtcbiAgICAgICAgdmFyIGNhbGN1bGF0ZWRQYWRkaW5nID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZG9jdW1lbnQuYm9keSkuY3NzKCdwYWRkaW5nLXJpZ2h0Jyk7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGRvY3VtZW50LmJvZHkpLmRhdGEoJ3BhZGRpbmctcmlnaHQnLCBhY3R1YWxQYWRkaW5nKS5jc3MoJ3BhZGRpbmctcmlnaHQnLCBwYXJzZUZsb2F0KGNhbGN1bGF0ZWRQYWRkaW5nKSArIHRoaXMuX3Njcm9sbGJhcldpZHRoICsgXCJweFwiKTtcbiAgICAgIH1cblxuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9PUEVOKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9yZXNldFNjcm9sbGJhciA9IGZ1bmN0aW9uIF9yZXNldFNjcm9sbGJhcigpIHtcbiAgICAgIC8vIFJlc3RvcmUgZml4ZWQgY29udGVudCBwYWRkaW5nXG4gICAgICB2YXIgZml4ZWRDb250ZW50ID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQpKTtcbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGZpeGVkQ29udGVudCkuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShlbGVtZW50KS5kYXRhKCdwYWRkaW5nLXJpZ2h0Jyk7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGVsZW1lbnQpLnJlbW92ZURhdGEoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSBwYWRkaW5nID8gcGFkZGluZyA6ICcnO1xuICAgICAgfSk7IC8vIFJlc3RvcmUgc3RpY2t5IGNvbnRlbnRcblxuICAgICAgdmFyIGVsZW1lbnRzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiXCIgKyBTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCkpO1xuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZWxlbWVudHMpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7XG4gICAgICAgIHZhciBtYXJnaW4gPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShlbGVtZW50KS5kYXRhKCdtYXJnaW4tcmlnaHQnKTtcblxuICAgICAgICBpZiAodHlwZW9mIG1hcmdpbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShlbGVtZW50KS5jc3MoJ21hcmdpbi1yaWdodCcsIG1hcmdpbikucmVtb3ZlRGF0YSgnbWFyZ2luLXJpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0pOyAvLyBSZXN0b3JlIGJvZHkgcGFkZGluZ1xuXG4gICAgICB2YXIgcGFkZGluZyA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGRvY3VtZW50LmJvZHkpLmRhdGEoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGRvY3VtZW50LmJvZHkpLnJlbW92ZURhdGEoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gcGFkZGluZyA/IHBhZGRpbmcgOiAnJztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRTY3JvbGxiYXJXaWR0aCA9IGZ1bmN0aW9uIF9nZXRTY3JvbGxiYXJXaWR0aCgpIHtcbiAgICAgIC8vIHRoeCBkLndhbHNoXG4gICAgICB2YXIgc2Nyb2xsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzY3JvbGxEaXYuY2xhc3NOYW1lID0gQ0xBU1NfTkFNRV9TQ1JPTExCQVJfTUVBU1VSRVI7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcm9sbERpdik7XG4gICAgICB2YXIgc2Nyb2xsYmFyV2lkdGggPSBzY3JvbGxEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSBzY3JvbGxEaXYuY2xpZW50V2lkdGg7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNjcm9sbERpdik7XG4gICAgICByZXR1cm4gc2Nyb2xsYmFyV2lkdGg7XG4gICAgfSAvLyBTdGF0aWNcbiAgICA7XG5cbiAgICBNb2RhbC5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcsIHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGF0YSA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMpLmRhdGEoREFUQV9LRVkkNSk7XG5cbiAgICAgICAgdmFyIF9jb25maWcgPSBfZXh0ZW5kcyh7fSwgRGVmYXVsdCQ0LCAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzKS5kYXRhKCksIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZyA/IGNvbmZpZyA6IHt9KTtcblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IE1vZGFsKHRoaXMsIF9jb25maWcpO1xuICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMpLmRhdGEoREFUQV9LRVkkNSwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGFbY29uZmlnXShyZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgfSBlbHNlIGlmIChfY29uZmlnLnNob3cpIHtcbiAgICAgICAgICBkYXRhLnNob3cocmVsYXRlZFRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoTW9kYWwsIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OJDU7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdCQ0O1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBNb2RhbDtcbiAgfSgpO1xuICAvKipcbiAgICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAgICovXG5cblxuICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShkb2N1bWVudCkub24oRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMSwgU0VMRUNUT1JfREFUQV9UT0dHTEUkMSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIF90aGlzMTEgPSB0aGlzO1xuXG4gICAgdmFyIHRhcmdldDtcbiAgICB2YXIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodGhpcyk7XG5cbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgIHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIH1cblxuICAgIHZhciBjb25maWcgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0YXJnZXQpLmRhdGEoREFUQV9LRVkkNSkgPyAndG9nZ2xlJyA6IF9leHRlbmRzKHt9LCAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0YXJnZXQpLmRhdGEoKSwgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcykuZGF0YSgpKTtcblxuICAgIGlmICh0aGlzLnRhZ05hbWUgPT09ICdBJyB8fCB0aGlzLnRhZ05hbWUgPT09ICdBUkVBJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICB2YXIgJHRhcmdldCA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRhcmdldCkub25lKEVWRU5UX1NIT1ckMiwgZnVuY3Rpb24gKHNob3dFdmVudCkge1xuICAgICAgaWYgKHNob3dFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAvLyBPbmx5IHJlZ2lzdGVyIGZvY3VzIHJlc3RvcmVyIGlmIG1vZGFsIHdpbGwgYWN0dWFsbHkgZ2V0IHNob3duXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgJHRhcmdldC5vbmUoRVZFTlRfSElEREVOJDIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKF90aGlzMTEpLmlzKCc6dmlzaWJsZScpKSB7XG4gICAgICAgICAgX3RoaXMxMS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIE1vZGFsLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0YXJnZXQpLCBjb25maWcsIHRoaXMpO1xuICB9KTtcbiAgLyoqXG4gICAqIGpRdWVyeVxuICAgKi9cblxuICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJDVdID0gTW9kYWwuX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uZm5bTkFNRSQ1XS5Db25zdHJ1Y3RvciA9IE1vZGFsO1xuXG4gICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkNV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJDVdID0gSlFVRVJZX05PX0NPTkZMSUNUJDU7XG4gICAgcmV0dXJuIE1vZGFsLl9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuNi4yKTogdG9vbHMvc2FuaXRpemVyLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cbiAgdmFyIHVyaUF0dHJzID0gWydiYWNrZ3JvdW5kJywgJ2NpdGUnLCAnaHJlZicsICdpdGVtdHlwZScsICdsb25nZGVzYycsICdwb3N0ZXInLCAnc3JjJywgJ3hsaW5rOmhyZWYnXTtcbiAgdmFyIEFSSUFfQVRUUklCVVRFX1BBVFRFUk4gPSAvXmFyaWEtW1xcdy1dKiQvaTtcbiAgdmFyIERlZmF1bHRXaGl0ZWxpc3QgPSB7XG4gICAgLy8gR2xvYmFsIGF0dHJpYnV0ZXMgYWxsb3dlZCBvbiBhbnkgc3VwcGxpZWQgZWxlbWVudCBiZWxvdy5cbiAgICAnKic6IFsnY2xhc3MnLCAnZGlyJywgJ2lkJywgJ2xhbmcnLCAncm9sZScsIEFSSUFfQVRUUklCVVRFX1BBVFRFUk5dLFxuICAgIGE6IFsndGFyZ2V0JywgJ2hyZWYnLCAndGl0bGUnLCAncmVsJ10sXG4gICAgYXJlYTogW10sXG4gICAgYjogW10sXG4gICAgYnI6IFtdLFxuICAgIGNvbDogW10sXG4gICAgY29kZTogW10sXG4gICAgZGl2OiBbXSxcbiAgICBlbTogW10sXG4gICAgaHI6IFtdLFxuICAgIGgxOiBbXSxcbiAgICBoMjogW10sXG4gICAgaDM6IFtdLFxuICAgIGg0OiBbXSxcbiAgICBoNTogW10sXG4gICAgaDY6IFtdLFxuICAgIGk6IFtdLFxuICAgIGltZzogWydzcmMnLCAnc3Jjc2V0JywgJ2FsdCcsICd0aXRsZScsICd3aWR0aCcsICdoZWlnaHQnXSxcbiAgICBsaTogW10sXG4gICAgb2w6IFtdLFxuICAgIHA6IFtdLFxuICAgIHByZTogW10sXG4gICAgczogW10sXG4gICAgc21hbGw6IFtdLFxuICAgIHNwYW46IFtdLFxuICAgIHN1YjogW10sXG4gICAgc3VwOiBbXSxcbiAgICBzdHJvbmc6IFtdLFxuICAgIHU6IFtdLFxuICAgIHVsOiBbXVxuICB9O1xuICAvKipcbiAgICogQSBwYXR0ZXJuIHRoYXQgcmVjb2duaXplcyBhIGNvbW1vbmx5IHVzZWZ1bCBzdWJzZXQgb2YgVVJMcyB0aGF0IGFyZSBzYWZlLlxuICAgKlxuICAgKiBTaG91dG91dCB0byBBbmd1bGFyIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi8xMi4yLngvcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3VybF9zYW5pdGl6ZXIudHNcbiAgICovXG5cbiAgdmFyIFNBRkVfVVJMX1BBVFRFUk4gPSAvXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwfHRlbHxmaWxlfHNtcyk6fFteIyYvOj9dKig/OlsjLz9dfCQpKS9pO1xuICAvKipcbiAgICogQSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBzYWZlIGRhdGEgVVJMcy4gT25seSBtYXRjaGVzIGltYWdlLCB2aWRlbyBhbmQgYXVkaW8gdHlwZXMuXG4gICAqXG4gICAqIFNob3V0b3V0IHRvIEFuZ3VsYXIgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iLzEyLjIueC9wYWNrYWdlcy9jb3JlL3NyYy9zYW5pdGl6YXRpb24vdXJsX3Nhbml0aXplci50c1xuICAgKi9cblxuICB2YXIgREFUQV9VUkxfUEFUVEVSTiA9IC9eZGF0YTooPzppbWFnZVxcLyg/OmJtcHxnaWZ8anBlZ3xqcGd8cG5nfHRpZmZ8d2VicCl8dmlkZW9cXC8oPzptcGVnfG1wNHxvZ2d8d2VibSl8YXVkaW9cXC8oPzptcDN8b2dhfG9nZ3xvcHVzKSk7YmFzZTY0LFtcXGQrL2Etel0rPSokL2k7XG5cbiAgZnVuY3Rpb24gYWxsb3dlZEF0dHJpYnV0ZShhdHRyLCBhbGxvd2VkQXR0cmlidXRlTGlzdCkge1xuICAgIHZhciBhdHRyTmFtZSA9IGF0dHIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChhbGxvd2VkQXR0cmlidXRlTGlzdC5pbmRleE9mKGF0dHJOYW1lKSAhPT0gLTEpIHtcbiAgICAgIGlmICh1cmlBdHRycy5pbmRleE9mKGF0dHJOYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oU0FGRV9VUkxfUEFUVEVSTi50ZXN0KGF0dHIubm9kZVZhbHVlKSB8fCBEQVRBX1VSTF9QQVRURVJOLnRlc3QoYXR0ci5ub2RlVmFsdWUpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHJlZ0V4cCA9IGFsbG93ZWRBdHRyaWJ1dGVMaXN0LmZpbHRlcihmdW5jdGlvbiAoYXR0clJlZ2V4KSB7XG4gICAgICByZXR1cm4gYXR0clJlZ2V4IGluc3RhbmNlb2YgUmVnRXhwO1xuICAgIH0pOyAvLyBDaGVjayBpZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB2YWxpZGF0ZXMgdGhlIGF0dHJpYnV0ZS5cblxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSByZWdFeHAubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmIChyZWdFeHBbaV0udGVzdChhdHRyTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gc2FuaXRpemVIdG1sKHVuc2FmZUh0bWwsIHdoaXRlTGlzdCwgc2FuaXRpemVGbikge1xuICAgIGlmICh1bnNhZmVIdG1sLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuc2FmZUh0bWw7XG4gICAgfVxuXG4gICAgaWYgKHNhbml0aXplRm4gJiYgdHlwZW9mIHNhbml0aXplRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBzYW5pdGl6ZUZuKHVuc2FmZUh0bWwpO1xuICAgIH1cblxuICAgIHZhciBkb21QYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuICAgIHZhciBjcmVhdGVkRG9jdW1lbnQgPSBkb21QYXJzZXIucGFyc2VGcm9tU3RyaW5nKHVuc2FmZUh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgICB2YXIgd2hpdGVsaXN0S2V5cyA9IE9iamVjdC5rZXlzKHdoaXRlTGlzdCk7XG4gICAgdmFyIGVsZW1lbnRzID0gW10uc2xpY2UuY2FsbChjcmVhdGVkRG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCcqJykpO1xuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoaSwgbGVuKSB7XG4gICAgICB2YXIgZWwgPSBlbGVtZW50c1tpXTtcbiAgICAgIHZhciBlbE5hbWUgPSBlbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAod2hpdGVsaXN0S2V5cy5pbmRleE9mKGVsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpID09PSAtMSkge1xuICAgICAgICBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgIH1cblxuICAgICAgdmFyIGF0dHJpYnV0ZUxpc3QgPSBbXS5zbGljZS5jYWxsKGVsLmF0dHJpYnV0ZXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItc3ByZWFkXG5cbiAgICAgIHZhciB3aGl0ZWxpc3RlZEF0dHJpYnV0ZXMgPSBbXS5jb25jYXQod2hpdGVMaXN0WycqJ10gfHwgW10sIHdoaXRlTGlzdFtlbE5hbWVdIHx8IFtdKTtcbiAgICAgIGF0dHJpYnV0ZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoYXR0cikge1xuICAgICAgICBpZiAoIWFsbG93ZWRBdHRyaWJ1dGUoYXR0ciwgd2hpdGVsaXN0ZWRBdHRyaWJ1dGVzKSkge1xuICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5vZGVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgdmFyIF9yZXQgPSBfbG9vcChpKTtcblxuICAgICAgaWYgKF9yZXQgPT09IFwiY29udGludWVcIikgY29udGludWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZWREb2N1bWVudC5ib2R5LmlubmVySFRNTDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdGFudHNcbiAgICovXG5cbiAgdmFyIE5BTUUkNCA9ICd0b29sdGlwJztcbiAgdmFyIFZFUlNJT04kNCA9ICc0LjYuMic7XG4gIHZhciBEQVRBX0tFWSQ0ID0gJ2JzLnRvb2x0aXAnO1xuICB2YXIgRVZFTlRfS0VZJDQgPSBcIi5cIiArIERBVEFfS0VZJDQ7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkNCA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkNF07XG4gIHZhciBDTEFTU19QUkVGSVgkMSA9ICdicy10b29sdGlwJztcbiAgdmFyIEJTQ0xTX1BSRUZJWF9SRUdFWCQxID0gbmV3IFJlZ0V4cChcIihefFxcXFxzKVwiICsgQ0xBU1NfUFJFRklYJDEgKyBcIlxcXFxTK1wiLCAnZycpO1xuICB2YXIgRElTQUxMT1dFRF9BVFRSSUJVVEVTID0gWydzYW5pdGl6ZScsICd3aGl0ZUxpc3QnLCAnc2FuaXRpemVGbiddO1xuICB2YXIgQ0xBU1NfTkFNRV9GQURFJDMgPSAnZmFkZSc7XG4gIHZhciBDTEFTU19OQU1FX1NIT1ckMyA9ICdzaG93JztcbiAgdmFyIEhPVkVSX1NUQVRFX1NIT1cgPSAnc2hvdyc7XG4gIHZhciBIT1ZFUl9TVEFURV9PVVQgPSAnb3V0JztcbiAgdmFyIFNFTEVDVE9SX1RPT0xUSVBfSU5ORVIgPSAnLnRvb2x0aXAtaW5uZXInO1xuICB2YXIgU0VMRUNUT1JfQVJST1cgPSAnLmFycm93JztcbiAgdmFyIFRSSUdHRVJfSE9WRVIgPSAnaG92ZXInO1xuICB2YXIgVFJJR0dFUl9GT0NVUyA9ICdmb2N1cyc7XG4gIHZhciBUUklHR0VSX0NMSUNLID0gJ2NsaWNrJztcbiAgdmFyIFRSSUdHRVJfTUFOVUFMID0gJ21hbnVhbCc7XG4gIHZhciBBdHRhY2htZW50TWFwID0ge1xuICAgIEFVVE86ICdhdXRvJyxcbiAgICBUT1A6ICd0b3AnLFxuICAgIFJJR0hUOiAncmlnaHQnLFxuICAgIEJPVFRPTTogJ2JvdHRvbScsXG4gICAgTEVGVDogJ2xlZnQnXG4gIH07XG4gIHZhciBEZWZhdWx0JDMgPSB7XG4gICAgYW5pbWF0aW9uOiB0cnVlLFxuICAgIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPicgKyAnPGRpdiBjbGFzcz1cImFycm93XCI+PC9kaXY+JyArICc8ZGl2IGNsYXNzPVwidG9vbHRpcC1pbm5lclwiPjwvZGl2PjwvZGl2PicsXG4gICAgdHJpZ2dlcjogJ2hvdmVyIGZvY3VzJyxcbiAgICB0aXRsZTogJycsXG4gICAgZGVsYXk6IDAsXG4gICAgaHRtbDogZmFsc2UsXG4gICAgc2VsZWN0b3I6IGZhbHNlLFxuICAgIHBsYWNlbWVudDogJ3RvcCcsXG4gICAgb2Zmc2V0OiAwLFxuICAgIGNvbnRhaW5lcjogZmFsc2UsXG4gICAgZmFsbGJhY2tQbGFjZW1lbnQ6ICdmbGlwJyxcbiAgICBib3VuZGFyeTogJ3Njcm9sbFBhcmVudCcsXG4gICAgY3VzdG9tQ2xhc3M6ICcnLFxuICAgIHNhbml0aXplOiB0cnVlLFxuICAgIHNhbml0aXplRm46IG51bGwsXG4gICAgd2hpdGVMaXN0OiBEZWZhdWx0V2hpdGVsaXN0LFxuICAgIHBvcHBlckNvbmZpZzogbnVsbFxuICB9O1xuICB2YXIgRGVmYXVsdFR5cGUkMyA9IHtcbiAgICBhbmltYXRpb246ICdib29sZWFuJyxcbiAgICB0ZW1wbGF0ZTogJ3N0cmluZycsXG4gICAgdGl0bGU6ICcoc3RyaW5nfGVsZW1lbnR8ZnVuY3Rpb24pJyxcbiAgICB0cmlnZ2VyOiAnc3RyaW5nJyxcbiAgICBkZWxheTogJyhudW1iZXJ8b2JqZWN0KScsXG4gICAgaHRtbDogJ2Jvb2xlYW4nLFxuICAgIHNlbGVjdG9yOiAnKHN0cmluZ3xib29sZWFuKScsXG4gICAgcGxhY2VtZW50OiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICAgIG9mZnNldDogJyhudW1iZXJ8c3RyaW5nfGZ1bmN0aW9uKScsXG4gICAgY29udGFpbmVyOiAnKHN0cmluZ3xlbGVtZW50fGJvb2xlYW4pJyxcbiAgICBmYWxsYmFja1BsYWNlbWVudDogJyhzdHJpbmd8YXJyYXkpJyxcbiAgICBib3VuZGFyeTogJyhzdHJpbmd8ZWxlbWVudCknLFxuICAgIGN1c3RvbUNsYXNzOiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICAgIHNhbml0aXplOiAnYm9vbGVhbicsXG4gICAgc2FuaXRpemVGbjogJyhudWxsfGZ1bmN0aW9uKScsXG4gICAgd2hpdGVMaXN0OiAnb2JqZWN0JyxcbiAgICBwb3BwZXJDb25maWc6ICcobnVsbHxvYmplY3QpJ1xuICB9O1xuICB2YXIgRXZlbnQkMSA9IHtcbiAgICBISURFOiBcImhpZGVcIiArIEVWRU5UX0tFWSQ0LFxuICAgIEhJRERFTjogXCJoaWRkZW5cIiArIEVWRU5UX0tFWSQ0LFxuICAgIFNIT1c6IFwic2hvd1wiICsgRVZFTlRfS0VZJDQsXG4gICAgU0hPV046IFwic2hvd25cIiArIEVWRU5UX0tFWSQ0LFxuICAgIElOU0VSVEVEOiBcImluc2VydGVkXCIgKyBFVkVOVF9LRVkkNCxcbiAgICBDTElDSzogXCJjbGlja1wiICsgRVZFTlRfS0VZJDQsXG4gICAgRk9DVVNJTjogXCJmb2N1c2luXCIgKyBFVkVOVF9LRVkkNCxcbiAgICBGT0NVU09VVDogXCJmb2N1c291dFwiICsgRVZFTlRfS0VZJDQsXG4gICAgTU9VU0VFTlRFUjogXCJtb3VzZWVudGVyXCIgKyBFVkVOVF9LRVkkNCxcbiAgICBNT1VTRUxFQVZFOiBcIm1vdXNlbGVhdmVcIiArIEVWRU5UX0tFWSQ0XG4gIH07XG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIHZhciBUb29sdGlwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUb29sdGlwKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgaWYgKHR5cGVvZiBQb3BwZXJfX2RlZmF1bHRbXCJkZWZhdWx0XCJdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIHRvb2x0aXBzIHJlcXVpcmUgUG9wcGVyIChodHRwczovL3BvcHBlci5qcy5vcmcpJyk7XG4gICAgICB9IC8vIFByaXZhdGVcblxuXG4gICAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fdGltZW91dCA9IDA7XG4gICAgICB0aGlzLl9ob3ZlclN0YXRlID0gJyc7XG4gICAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyID0ge307XG4gICAgICB0aGlzLl9wb3BwZXIgPSBudWxsOyAvLyBQcm90ZWN0ZWRcblxuICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHRoaXMuY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLnRpcCA9IG51bGw7XG5cbiAgICAgIHRoaXMuX3NldExpc3RlbmVycygpO1xuICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICB2YXIgX3Byb3RvID0gVG9vbHRpcC5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8uZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgICAgdGhpcy5faXNFbmFibGVkID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc2FibGUgPSBmdW5jdGlvbiBkaXNhYmxlKCkge1xuICAgICAgdGhpcy5faXNFbmFibGVkID0gZmFsc2U7XG4gICAgfTtcblxuICAgIF9wcm90by50b2dnbGVFbmFibGVkID0gZnVuY3Rpb24gdG9nZ2xlRW5hYmxlZCgpIHtcbiAgICAgIHRoaXMuX2lzRW5hYmxlZCA9ICF0aGlzLl9pc0VuYWJsZWQ7XG4gICAgfTtcblxuICAgIF9wcm90by50b2dnbGUgPSBmdW5jdGlvbiB0b2dnbGUoZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5faXNFbmFibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIHZhciBkYXRhS2V5ID0gdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXkpO1xuXG4gICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgIGNvbnRleHQgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihldmVudC5jdXJyZW50VGFyZ2V0LCB0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKTtcbiAgICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXksIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlci5jbGljayA9ICFjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyLmNsaWNrO1xuXG4gICAgICAgIGlmIChjb250ZXh0Ll9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgICAgICBjb250ZXh0Ll9lbnRlcihudWxsLCBjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0Ll9sZWF2ZShudWxsLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuZ2V0VGlwRWxlbWVudCgpKS5oYXNDbGFzcyhDTEFTU19OQU1FX1NIT1ckMykpIHtcbiAgICAgICAgICB0aGlzLl9sZWF2ZShudWxsLCB0aGlzKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2VudGVyKG51bGwsIHRoaXMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5yZW1vdmVEYXRhKHRoaXMuZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSk7XG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLmVsZW1lbnQpLm9mZih0aGlzLmNvbnN0cnVjdG9yLkVWRU5UX0tFWSk7XG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLmVsZW1lbnQpLmNsb3Nlc3QoJy5tb2RhbCcpLm9mZignaGlkZS5icy5tb2RhbCcsIHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpO1xuXG4gICAgICBpZiAodGhpcy50aXApIHtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy50aXApLnJlbW92ZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pc0VuYWJsZWQgPSBudWxsO1xuICAgICAgdGhpcy5fdGltZW91dCA9IG51bGw7XG4gICAgICB0aGlzLl9ob3ZlclN0YXRlID0gbnVsbDtcbiAgICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXIgPSBudWxsO1xuXG4gICAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICAgIHRoaXMuX3BvcHBlci5kZXN0cm95KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3BvcHBlciA9IG51bGw7XG4gICAgICB0aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5jb25maWcgPSBudWxsO1xuICAgICAgdGhpcy50aXAgPSBudWxsO1xuICAgIH07XG5cbiAgICBfcHJvdG8uc2hvdyA9IGZ1bmN0aW9uIHNob3coKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAoJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5lbGVtZW50KS5jc3MoJ2Rpc3BsYXknKSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHVzZSBzaG93IG9uIHZpc2libGUgZWxlbWVudHMnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNob3dFdmVudCA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLkV2ZW50KHRoaXMuY29uc3RydWN0b3IuRXZlbnQuU0hPVyk7XG5cbiAgICAgIGlmICh0aGlzLmlzV2l0aENvbnRlbnQoKSAmJiB0aGlzLl9pc0VuYWJsZWQpIHtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5lbGVtZW50KS50cmlnZ2VyKHNob3dFdmVudCk7XG4gICAgICAgIHZhciBzaGFkb3dSb290ID0gVXRpbC5maW5kU2hhZG93Um9vdCh0aGlzLmVsZW1lbnQpO1xuICAgICAgICB2YXIgaXNJblRoZURvbSA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmNvbnRhaW5zKHNoYWRvd1Jvb3QgIT09IG51bGwgPyBzaGFkb3dSb290IDogdGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB0aGlzLmVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgfHwgIWlzSW5UaGVEb20pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdGlwID0gdGhpcy5nZXRUaXBFbGVtZW50KCk7XG4gICAgICAgIHZhciB0aXBJZCA9IFV0aWwuZ2V0VUlEKHRoaXMuY29uc3RydWN0b3IuTkFNRSk7XG4gICAgICAgIHRpcC5zZXRBdHRyaWJ1dGUoJ2lkJywgdGlwSWQpO1xuICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5JywgdGlwSWQpO1xuICAgICAgICB0aGlzLnNldENvbnRlbnQoKTtcblxuICAgICAgICBpZiAodGhpcy5jb25maWcuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGlwKS5hZGRDbGFzcyhDTEFTU19OQU1FX0ZBREUkMyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGxhY2VtZW50ID0gdHlwZW9mIHRoaXMuY29uZmlnLnBsYWNlbWVudCA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuY29uZmlnLnBsYWNlbWVudC5jYWxsKHRoaXMsIHRpcCwgdGhpcy5lbGVtZW50KSA6IHRoaXMuY29uZmlnLnBsYWNlbWVudDtcblxuICAgICAgICB2YXIgYXR0YWNobWVudCA9IHRoaXMuX2dldEF0dGFjaG1lbnQocGxhY2VtZW50KTtcblxuICAgICAgICB0aGlzLmFkZEF0dGFjaG1lbnRDbGFzcyhhdHRhY2htZW50KTtcblxuICAgICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fZ2V0Q29udGFpbmVyKCk7XG5cbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGlwKS5kYXRhKHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVksIHRoaXMpO1xuXG4gICAgICAgIGlmICghJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uY29udGFpbnModGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB0aGlzLnRpcCkpIHtcbiAgICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aXApLmFwcGVuZFRvKGNvbnRhaW5lcik7XG4gICAgICAgIH1cblxuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLmVsZW1lbnQpLnRyaWdnZXIodGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5JTlNFUlRFRCk7XG4gICAgICAgIHRoaXMuX3BvcHBlciA9IG5ldyBQb3BwZXJfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuZWxlbWVudCwgdGlwLCB0aGlzLl9nZXRQb3BwZXJDb25maWcoYXR0YWNobWVudCkpO1xuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aXApLmFkZENsYXNzKENMQVNTX05BTUVfU0hPVyQzKTtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGlwKS5hZGRDbGFzcyh0aGlzLmNvbmZpZy5jdXN0b21DbGFzcyk7IC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSBhZGQgZXh0cmFcbiAgICAgICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB0byB0aGUgYm9keSdzIGltbWVkaWF0ZSBjaGlsZHJlbjtcbiAgICAgICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDE0LzAyL21vdXNlX2V2ZW50X2J1Yi5odG1sXG5cbiAgICAgICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGRvY3VtZW50LmJvZHkpLmNoaWxkcmVuKCkub24oJ21vdXNlb3ZlcicsIG51bGwsICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLm5vb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgICAgaWYgKF90aGlzLmNvbmZpZy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgIF90aGlzLl9maXhUcmFuc2l0aW9uKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHByZXZIb3ZlclN0YXRlID0gX3RoaXMuX2hvdmVyU3RhdGU7XG4gICAgICAgICAgX3RoaXMuX2hvdmVyU3RhdGUgPSBudWxsO1xuICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKF90aGlzLmVsZW1lbnQpLnRyaWdnZXIoX3RoaXMuY29uc3RydWN0b3IuRXZlbnQuU0hPV04pO1xuXG4gICAgICAgICAgaWYgKHByZXZIb3ZlclN0YXRlID09PSBIT1ZFUl9TVEFURV9PVVQpIHtcbiAgICAgICAgICAgIF90aGlzLl9sZWF2ZShudWxsLCBfdGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICgkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLnRpcCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GQURFJDMpKSB7XG4gICAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy50aXApO1xuICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMudGlwKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uaGlkZSA9IGZ1bmN0aW9uIGhpZGUoY2FsbGJhY2spIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgdGlwID0gdGhpcy5nZXRUaXBFbGVtZW50KCk7XG4gICAgICB2YXIgaGlkZUV2ZW50ID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uRXZlbnQodGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5ISURFKTtcblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgIGlmIChfdGhpczIuX2hvdmVyU3RhdGUgIT09IEhPVkVSX1NUQVRFX1NIT1cgJiYgdGlwLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICB0aXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aXApO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMyLl9jbGVhblRpcENsYXNzKCk7XG5cbiAgICAgICAgX3RoaXMyLmVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5Jyk7XG5cbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oX3RoaXMyLmVsZW1lbnQpLnRyaWdnZXIoX3RoaXMyLmNvbnN0cnVjdG9yLkV2ZW50LkhJRERFTik7XG5cbiAgICAgICAgaWYgKF90aGlzMi5fcG9wcGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgX3RoaXMyLl9wb3BwZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5lbGVtZW50KS50cmlnZ2VyKGhpZGVFdmVudCk7XG5cbiAgICAgIGlmIChoaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aXApLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfU0hPVyQzKTsgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIHJlbW92ZSB0aGUgZXh0cmFcbiAgICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgd2UgYWRkZWQgZm9yIGlPUyBzdXBwb3J0XG5cbiAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vZmYoJ21vdXNlb3ZlcicsIG51bGwsICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLm5vb3ApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyW1RSSUdHRVJfQ0xJQ0tdID0gZmFsc2U7XG4gICAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyW1RSSUdHRVJfRk9DVVNdID0gZmFsc2U7XG4gICAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyW1RSSUdHRVJfSE9WRVJdID0gZmFsc2U7XG5cbiAgICAgIGlmICgkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLnRpcCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GQURFJDMpKSB7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRpcCk7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRpcCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNvbXBsZXRlKS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faG92ZXJTdGF0ZSA9ICcnO1xuICAgIH07XG5cbiAgICBfcHJvdG8udXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgaWYgKHRoaXMuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9wb3BwZXIuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAgIH1cbiAgICB9IC8vIFByb3RlY3RlZFxuICAgIDtcblxuICAgIF9wcm90by5pc1dpdGhDb250ZW50ID0gZnVuY3Rpb24gaXNXaXRoQ29udGVudCgpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuZ2V0VGl0bGUoKSk7XG4gICAgfTtcblxuICAgIF9wcm90by5hZGRBdHRhY2htZW50Q2xhc3MgPSBmdW5jdGlvbiBhZGRBdHRhY2htZW50Q2xhc3MoYXR0YWNobWVudCkge1xuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5nZXRUaXBFbGVtZW50KCkpLmFkZENsYXNzKENMQVNTX1BSRUZJWCQxICsgXCItXCIgKyBhdHRhY2htZW50KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmdldFRpcEVsZW1lbnQgPSBmdW5jdGlvbiBnZXRUaXBFbGVtZW50KCkge1xuICAgICAgdGhpcy50aXAgPSB0aGlzLnRpcCB8fCAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLmNvbmZpZy50ZW1wbGF0ZSlbMF07XG4gICAgICByZXR1cm4gdGhpcy50aXA7XG4gICAgfTtcblxuICAgIF9wcm90by5zZXRDb250ZW50ID0gZnVuY3Rpb24gc2V0Q29udGVudCgpIHtcbiAgICAgIHZhciB0aXAgPSB0aGlzLmdldFRpcEVsZW1lbnQoKTtcbiAgICAgIHRoaXMuc2V0RWxlbWVudENvbnRlbnQoJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGlwLnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfVE9PTFRJUF9JTk5FUikpLCB0aGlzLmdldFRpdGxlKCkpO1xuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGlwKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0ZBREUkMyArIFwiIFwiICsgQ0xBU1NfTkFNRV9TSE9XJDMpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uc2V0RWxlbWVudENvbnRlbnQgPSBmdW5jdGlvbiBzZXRFbGVtZW50Q29udGVudCgkZWxlbWVudCwgY29udGVudCkge1xuICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnb2JqZWN0JyAmJiAoY29udGVudC5ub2RlVHlwZSB8fCBjb250ZW50LmpxdWVyeSkpIHtcbiAgICAgICAgLy8gQ29udGVudCBpcyBhIERPTSBub2RlIG9yIGEgalF1ZXJ5XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5odG1sKSB7XG4gICAgICAgICAgaWYgKCEkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShjb250ZW50KS5wYXJlbnQoKS5pcygkZWxlbWVudCkpIHtcbiAgICAgICAgICAgICRlbGVtZW50LmVtcHR5KCkuYXBwZW5kKGNvbnRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkZWxlbWVudC50ZXh0KCRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGNvbnRlbnQpLnRleHQoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZy5odG1sKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5zYW5pdGl6ZSkge1xuICAgICAgICAgIGNvbnRlbnQgPSBzYW5pdGl6ZUh0bWwoY29udGVudCwgdGhpcy5jb25maWcud2hpdGVMaXN0LCB0aGlzLmNvbmZpZy5zYW5pdGl6ZUZuKTtcbiAgICAgICAgfVxuXG4gICAgICAgICRlbGVtZW50Lmh0bWwoY29udGVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkZWxlbWVudC50ZXh0KGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uZ2V0VGl0bGUgPSBmdW5jdGlvbiBnZXRUaXRsZSgpIHtcbiAgICAgIHZhciB0aXRsZSA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnKTtcblxuICAgICAgaWYgKCF0aXRsZSkge1xuICAgICAgICB0aXRsZSA9IHR5cGVvZiB0aGlzLmNvbmZpZy50aXRsZSA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuY29uZmlnLnRpdGxlLmNhbGwodGhpcy5lbGVtZW50KSA6IHRoaXMuY29uZmlnLnRpdGxlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGl0bGU7XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9nZXRQb3BwZXJDb25maWcgPSBmdW5jdGlvbiBfZ2V0UG9wcGVyQ29uZmlnKGF0dGFjaG1lbnQpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgZGVmYXVsdEJzQ29uZmlnID0ge1xuICAgICAgICBwbGFjZW1lbnQ6IGF0dGFjaG1lbnQsXG4gICAgICAgIG1vZGlmaWVyczoge1xuICAgICAgICAgIG9mZnNldDogdGhpcy5fZ2V0T2Zmc2V0KCksXG4gICAgICAgICAgZmxpcDoge1xuICAgICAgICAgICAgYmVoYXZpb3I6IHRoaXMuY29uZmlnLmZhbGxiYWNrUGxhY2VtZW50XG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcnJvdzoge1xuICAgICAgICAgICAgZWxlbWVudDogU0VMRUNUT1JfQVJST1dcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByZXZlbnRPdmVyZmxvdzoge1xuICAgICAgICAgICAgYm91bmRhcmllc0VsZW1lbnQ6IHRoaXMuY29uZmlnLmJvdW5kYXJ5XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkNyZWF0ZTogZnVuY3Rpb24gb25DcmVhdGUoZGF0YSkge1xuICAgICAgICAgIGlmIChkYXRhLm9yaWdpbmFsUGxhY2VtZW50ICE9PSBkYXRhLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgX3RoaXMzLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UoZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvblVwZGF0ZTogZnVuY3Rpb24gb25VcGRhdGUoZGF0YSkge1xuICAgICAgICAgIHJldHVybiBfdGhpczMuX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgZGVmYXVsdEJzQ29uZmlnLCB0aGlzLmNvbmZpZy5wb3BwZXJDb25maWcpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldE9mZnNldCA9IGZ1bmN0aW9uIF9nZXRPZmZzZXQoKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdmFyIG9mZnNldCA9IHt9O1xuXG4gICAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnLm9mZnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvZmZzZXQuZm4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIGRhdGEub2Zmc2V0cyA9IF9leHRlbmRzKHt9LCBkYXRhLm9mZnNldHMsIF90aGlzNC5jb25maWcub2Zmc2V0KGRhdGEub2Zmc2V0cywgX3RoaXM0LmVsZW1lbnQpKTtcbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9mZnNldC5vZmZzZXQgPSB0aGlzLmNvbmZpZy5vZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0Q29udGFpbmVyID0gZnVuY3Rpb24gX2dldENvbnRhaW5lcigpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5jb250YWluZXIgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICAgICAgfVxuXG4gICAgICBpZiAoVXRpbC5pc0VsZW1lbnQodGhpcy5jb25maWcuY29udGFpbmVyKSkge1xuICAgICAgICByZXR1cm4gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5jb25maWcuY29udGFpbmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGRvY3VtZW50KS5maW5kKHRoaXMuY29uZmlnLmNvbnRhaW5lcik7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0QXR0YWNobWVudCA9IGZ1bmN0aW9uIF9nZXRBdHRhY2htZW50KHBsYWNlbWVudCkge1xuICAgICAgcmV0dXJuIEF0dGFjaG1lbnRNYXBbcGxhY2VtZW50LnRvVXBwZXJDYXNlKCldO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX3NldExpc3RlbmVycyA9IGZ1bmN0aW9uIF9zZXRMaXN0ZW5lcnMoKSB7XG4gICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgdmFyIHRyaWdnZXJzID0gdGhpcy5jb25maWcudHJpZ2dlci5zcGxpdCgnICcpO1xuICAgICAgdHJpZ2dlcnMuZm9yRWFjaChmdW5jdGlvbiAodHJpZ2dlcikge1xuICAgICAgICBpZiAodHJpZ2dlciA9PT0gJ2NsaWNrJykge1xuICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKF90aGlzNS5lbGVtZW50KS5vbihfdGhpczUuY29uc3RydWN0b3IuRXZlbnQuQ0xJQ0ssIF90aGlzNS5jb25maWcuc2VsZWN0b3IsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzNS50b2dnbGUoZXZlbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXIgIT09IFRSSUdHRVJfTUFOVUFMKSB7XG4gICAgICAgICAgdmFyIGV2ZW50SW4gPSB0cmlnZ2VyID09PSBUUklHR0VSX0hPVkVSID8gX3RoaXM1LmNvbnN0cnVjdG9yLkV2ZW50Lk1PVVNFRU5URVIgOiBfdGhpczUuY29uc3RydWN0b3IuRXZlbnQuRk9DVVNJTjtcbiAgICAgICAgICB2YXIgZXZlbnRPdXQgPSB0cmlnZ2VyID09PSBUUklHR0VSX0hPVkVSID8gX3RoaXM1LmNvbnN0cnVjdG9yLkV2ZW50Lk1PVVNFTEVBVkUgOiBfdGhpczUuY29uc3RydWN0b3IuRXZlbnQuRk9DVVNPVVQ7XG4gICAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oX3RoaXM1LmVsZW1lbnQpLm9uKGV2ZW50SW4sIF90aGlzNS5jb25maWcuc2VsZWN0b3IsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzNS5fZW50ZXIoZXZlbnQpO1xuICAgICAgICAgIH0pLm9uKGV2ZW50T3V0LCBfdGhpczUuY29uZmlnLnNlbGVjdG9yLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczUuX2xlYXZlKGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpczUuZWxlbWVudCkge1xuICAgICAgICAgIF90aGlzNS5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuZWxlbWVudCkuY2xvc2VzdCgnLm1vZGFsJykub24oJ2hpZGUuYnMubW9kYWwnLCB0aGlzLl9oaWRlTW9kYWxIYW5kbGVyKTtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnLnNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gX2V4dGVuZHMoe30sIHRoaXMuY29uZmlnLCB7XG4gICAgICAgICAgdHJpZ2dlcjogJ21hbnVhbCcsXG4gICAgICAgICAgc2VsZWN0b3I6ICcnXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZml4VGl0bGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9maXhUaXRsZSA9IGZ1bmN0aW9uIF9maXhUaXRsZSgpIHtcbiAgICAgIHZhciB0aXRsZVR5cGUgPSB0eXBlb2YgdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnaW5hbC10aXRsZScpO1xuXG4gICAgICBpZiAodGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgndGl0bGUnKSB8fCB0aXRsZVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnLCB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpIHx8ICcnKTtcbiAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fZW50ZXIgPSBmdW5jdGlvbiBfZW50ZXIoZXZlbnQsIGNvbnRleHQpIHtcbiAgICAgIHZhciBkYXRhS2V5ID0gdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTtcbiAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmRhdGEoZGF0YUtleSk7XG5cbiAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICBjb250ZXh0ID0gbmV3IHRoaXMuY29uc3RydWN0b3IoZXZlbnQuY3VycmVudFRhcmdldCwgdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSk7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmRhdGEoZGF0YUtleSwgY29udGV4dCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW2V2ZW50LnR5cGUgPT09ICdmb2N1c2luJyA/IFRSSUdHRVJfRk9DVVMgOiBUUklHR0VSX0hPVkVSXSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShjb250ZXh0LmdldFRpcEVsZW1lbnQoKSkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDMpIHx8IGNvbnRleHQuX2hvdmVyU3RhdGUgPT09IEhPVkVSX1NUQVRFX1NIT1cpIHtcbiAgICAgICAgY29udGV4dC5faG92ZXJTdGF0ZSA9IEhPVkVSX1NUQVRFX1NIT1c7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2xlYXJUaW1lb3V0KGNvbnRleHQuX3RpbWVvdXQpO1xuICAgICAgY29udGV4dC5faG92ZXJTdGF0ZSA9IEhPVkVSX1NUQVRFX1NIT1c7XG5cbiAgICAgIGlmICghY29udGV4dC5jb25maWcuZGVsYXkgfHwgIWNvbnRleHQuY29uZmlnLmRlbGF5LnNob3cpIHtcbiAgICAgICAgY29udGV4dC5zaG93KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY29udGV4dC5faG92ZXJTdGF0ZSA9PT0gSE9WRVJfU1RBVEVfU0hPVykge1xuICAgICAgICAgIGNvbnRleHQuc2hvdygpO1xuICAgICAgICB9XG4gICAgICB9LCBjb250ZXh0LmNvbmZpZy5kZWxheS5zaG93KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9sZWF2ZSA9IGZ1bmN0aW9uIF9sZWF2ZShldmVudCwgY29udGV4dCkge1xuICAgICAgdmFyIGRhdGFLZXkgPSB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZO1xuICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShkYXRhS2V5KTtcblxuICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihldmVudC5jdXJyZW50VGFyZ2V0LCB0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKTtcbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShkYXRhS2V5LCBjb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXJbZXZlbnQudHlwZSA9PT0gJ2ZvY3Vzb3V0JyA/IFRSSUdHRVJfRk9DVVMgOiBUUklHR0VSX0hPVkVSXSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29udGV4dC5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2xlYXJUaW1lb3V0KGNvbnRleHQuX3RpbWVvdXQpO1xuICAgICAgY29udGV4dC5faG92ZXJTdGF0ZSA9IEhPVkVSX1NUQVRFX09VVDtcblxuICAgICAgaWYgKCFjb250ZXh0LmNvbmZpZy5kZWxheSB8fCAhY29udGV4dC5jb25maWcuZGVsYXkuaGlkZSkge1xuICAgICAgICBjb250ZXh0LmhpZGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Ll90aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChjb250ZXh0Ll9ob3ZlclN0YXRlID09PSBIT1ZFUl9TVEFURV9PVVQpIHtcbiAgICAgICAgICBjb250ZXh0LmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgfSwgY29udGV4dC5jb25maWcuZGVsYXkuaGlkZSk7XG4gICAgfTtcblxuICAgIF9wcm90by5faXNXaXRoQWN0aXZlVHJpZ2dlciA9IGZ1bmN0aW9uIF9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkge1xuICAgICAgZm9yICh2YXIgdHJpZ2dlciBpbiB0aGlzLl9hY3RpdmVUcmlnZ2VyKSB7XG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmVUcmlnZ2VyW3RyaWdnZXJdKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldENvbmZpZyA9IGZ1bmN0aW9uIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgICB2YXIgZGF0YUF0dHJpYnV0ZXMgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLmVsZW1lbnQpLmRhdGEoKTtcbiAgICAgIE9iamVjdC5rZXlzKGRhdGFBdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhQXR0cikge1xuICAgICAgICBpZiAoRElTQUxMT1dFRF9BVFRSSUJVVEVTLmluZGV4T2YoZGF0YUF0dHIpICE9PSAtMSkge1xuICAgICAgICAgIGRlbGV0ZSBkYXRhQXR0cmlidXRlc1tkYXRhQXR0cl07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uZmlnID0gX2V4dGVuZHMoe30sIHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdCwgZGF0YUF0dHJpYnV0ZXMsIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZyA/IGNvbmZpZyA6IHt9KTtcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcuZGVsYXkgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbmZpZy5kZWxheSA9IHtcbiAgICAgICAgICBzaG93OiBjb25maWcuZGVsYXksXG4gICAgICAgICAgaGlkZTogY29uZmlnLmRlbGF5XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnLnRpdGxlID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25maWcudGl0bGUgPSBjb25maWcudGl0bGUudG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcuY29udGVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uZmlnLmNvbnRlbnQgPSBjb25maWcuY29udGVudC50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBVdGlsLnR5cGVDaGVja0NvbmZpZyhOQU1FJDQsIGNvbmZpZywgdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0VHlwZSk7XG5cbiAgICAgIGlmIChjb25maWcuc2FuaXRpemUpIHtcbiAgICAgICAgY29uZmlnLnRlbXBsYXRlID0gc2FuaXRpemVIdG1sKGNvbmZpZy50ZW1wbGF0ZSwgY29uZmlnLndoaXRlTGlzdCwgY29uZmlnLnNhbml0aXplRm4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldERlbGVnYXRlQ29uZmlnID0gZnVuY3Rpb24gX2dldERlbGVnYXRlQ29uZmlnKCkge1xuICAgICAgdmFyIGNvbmZpZyA9IHt9O1xuXG4gICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuY29uZmlnKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtrZXldICE9PSB0aGlzLmNvbmZpZ1trZXldKSB7XG4gICAgICAgICAgICBjb25maWdba2V5XSA9IHRoaXMuY29uZmlnW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5fY2xlYW5UaXBDbGFzcyA9IGZ1bmN0aW9uIF9jbGVhblRpcENsYXNzKCkge1xuICAgICAgdmFyICR0aXAgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLmdldFRpcEVsZW1lbnQoKSk7XG4gICAgICB2YXIgdGFiQ2xhc3MgPSAkdGlwLmF0dHIoJ2NsYXNzJykubWF0Y2goQlNDTFNfUFJFRklYX1JFR0VYJDEpO1xuXG4gICAgICBpZiAodGFiQ2xhc3MgIT09IG51bGwgJiYgdGFiQ2xhc3MubGVuZ3RoKSB7XG4gICAgICAgICR0aXAucmVtb3ZlQ2xhc3ModGFiQ2xhc3Muam9pbignJykpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZSA9IGZ1bmN0aW9uIF9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UocG9wcGVyRGF0YSkge1xuICAgICAgdGhpcy50aXAgPSBwb3BwZXJEYXRhLmluc3RhbmNlLnBvcHBlcjtcblxuICAgICAgdGhpcy5fY2xlYW5UaXBDbGFzcygpO1xuXG4gICAgICB0aGlzLmFkZEF0dGFjaG1lbnRDbGFzcyh0aGlzLl9nZXRBdHRhY2htZW50KHBvcHBlckRhdGEucGxhY2VtZW50KSk7XG4gICAgfTtcblxuICAgIF9wcm90by5fZml4VHJhbnNpdGlvbiA9IGZ1bmN0aW9uIF9maXhUcmFuc2l0aW9uKCkge1xuICAgICAgdmFyIHRpcCA9IHRoaXMuZ2V0VGlwRWxlbWVudCgpO1xuICAgICAgdmFyIGluaXRDb25maWdBbmltYXRpb24gPSB0aGlzLmNvbmZpZy5hbmltYXRpb247XG5cbiAgICAgIGlmICh0aXAuZ2V0QXR0cmlidXRlKCd4LXBsYWNlbWVudCcpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGlwKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0ZBREUkMyk7XG4gICAgICB0aGlzLmNvbmZpZy5hbmltYXRpb24gPSBmYWxzZTtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB0aGlzLmNvbmZpZy5hbmltYXRpb24gPSBpbml0Q29uZmlnQW5pbWF0aW9uO1xuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgVG9vbHRpcC5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJGVsZW1lbnQgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzKTtcbiAgICAgICAgdmFyIGRhdGEgPSAkZWxlbWVudC5kYXRhKERBVEFfS0VZJDQpO1xuXG4gICAgICAgIHZhciBfY29uZmlnID0gdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnO1xuXG4gICAgICAgIGlmICghZGF0YSAmJiAvZGlzcG9zZXxoaWRlLy50ZXN0KGNvbmZpZykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IFRvb2x0aXAodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0tFWSQ0LCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcXFwiXCIgKyBjb25maWcgKyBcIlxcXCJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoVG9vbHRpcCwgbnVsbCwgW3tcbiAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFZFUlNJT04kNDtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0JDM7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIk5BTUVcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gTkFNRSQ0O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEQVRBX0tFWVwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEQVRBX0tFWSQ0O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJFdmVudFwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBFdmVudCQxO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJFVkVOVF9LRVlcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRVZFTlRfS0VZJDQ7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRUeXBlXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHRUeXBlJDM7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIFRvb2x0aXA7XG4gIH0oKTtcbiAgLyoqXG4gICAqIGpRdWVyeVxuICAgKi9cblxuXG4gICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkNF0gPSBUb29sdGlwLl9qUXVlcnlJbnRlcmZhY2U7XG4gICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkNF0uQ29uc3RydWN0b3IgPSBUb29sdGlwO1xuXG4gICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkNF0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJDRdID0gSlFVRVJZX05PX0NPTkZMSUNUJDQ7XG4gICAgcmV0dXJuIFRvb2x0aXAuX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogQ29uc3RhbnRzXG4gICAqL1xuXG4gIHZhciBOQU1FJDMgPSAncG9wb3Zlcic7XG4gIHZhciBWRVJTSU9OJDMgPSAnNC42LjInO1xuICB2YXIgREFUQV9LRVkkMyA9ICdicy5wb3BvdmVyJztcbiAgdmFyIEVWRU5UX0tFWSQzID0gXCIuXCIgKyBEQVRBX0tFWSQzO1xuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJDMgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJDNdO1xuICB2YXIgQ0xBU1NfUFJFRklYID0gJ2JzLXBvcG92ZXInO1xuICB2YXIgQlNDTFNfUFJFRklYX1JFR0VYID0gbmV3IFJlZ0V4cChcIihefFxcXFxzKVwiICsgQ0xBU1NfUFJFRklYICsgXCJcXFxcUytcIiwgJ2cnKTtcbiAgdmFyIENMQVNTX05BTUVfRkFERSQyID0gJ2ZhZGUnO1xuICB2YXIgQ0xBU1NfTkFNRV9TSE9XJDIgPSAnc2hvdyc7XG4gIHZhciBTRUxFQ1RPUl9USVRMRSA9ICcucG9wb3Zlci1oZWFkZXInO1xuICB2YXIgU0VMRUNUT1JfQ09OVEVOVCA9ICcucG9wb3Zlci1ib2R5JztcblxuICB2YXIgRGVmYXVsdCQyID0gX2V4dGVuZHMoe30sIFRvb2x0aXAuRGVmYXVsdCwge1xuICAgIHBsYWNlbWVudDogJ3JpZ2h0JyxcbiAgICB0cmlnZ2VyOiAnY2xpY2snLFxuICAgIGNvbnRlbnQ6ICcnLFxuICAgIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInBvcG92ZXJcIiByb2xlPVwidG9vbHRpcFwiPicgKyAnPGRpdiBjbGFzcz1cImFycm93XCI+PC9kaXY+JyArICc8aDMgY2xhc3M9XCJwb3BvdmVyLWhlYWRlclwiPjwvaDM+JyArICc8ZGl2IGNsYXNzPVwicG9wb3Zlci1ib2R5XCI+PC9kaXY+PC9kaXY+J1xuICB9KTtcblxuICB2YXIgRGVmYXVsdFR5cGUkMiA9IF9leHRlbmRzKHt9LCBUb29sdGlwLkRlZmF1bHRUeXBlLCB7XG4gICAgY29udGVudDogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbiknXG4gIH0pO1xuXG4gIHZhciBFdmVudCA9IHtcbiAgICBISURFOiBcImhpZGVcIiArIEVWRU5UX0tFWSQzLFxuICAgIEhJRERFTjogXCJoaWRkZW5cIiArIEVWRU5UX0tFWSQzLFxuICAgIFNIT1c6IFwic2hvd1wiICsgRVZFTlRfS0VZJDMsXG4gICAgU0hPV046IFwic2hvd25cIiArIEVWRU5UX0tFWSQzLFxuICAgIElOU0VSVEVEOiBcImluc2VydGVkXCIgKyBFVkVOVF9LRVkkMyxcbiAgICBDTElDSzogXCJjbGlja1wiICsgRVZFTlRfS0VZJDMsXG4gICAgRk9DVVNJTjogXCJmb2N1c2luXCIgKyBFVkVOVF9LRVkkMyxcbiAgICBGT0NVU09VVDogXCJmb2N1c291dFwiICsgRVZFTlRfS0VZJDMsXG4gICAgTU9VU0VFTlRFUjogXCJtb3VzZWVudGVyXCIgKyBFVkVOVF9LRVkkMyxcbiAgICBNT1VTRUxFQVZFOiBcIm1vdXNlbGVhdmVcIiArIEVWRU5UX0tFWSQzXG4gIH07XG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIHZhciBQb3BvdmVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfVG9vbHRpcCkge1xuICAgIF9pbmhlcml0c0xvb3NlKFBvcG92ZXIsIF9Ub29sdGlwKTtcblxuICAgIGZ1bmN0aW9uIFBvcG92ZXIoKSB7XG4gICAgICByZXR1cm4gX1Rvb2x0aXAuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cblxuICAgIHZhciBfcHJvdG8gPSBQb3BvdmVyLnByb3RvdHlwZTtcblxuICAgIC8vIE92ZXJyaWRlc1xuICAgIF9wcm90by5pc1dpdGhDb250ZW50ID0gZnVuY3Rpb24gaXNXaXRoQ29udGVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFRpdGxlKCkgfHwgdGhpcy5fZ2V0Q29udGVudCgpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uYWRkQXR0YWNobWVudENsYXNzID0gZnVuY3Rpb24gYWRkQXR0YWNobWVudENsYXNzKGF0dGFjaG1lbnQpIHtcbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuZ2V0VGlwRWxlbWVudCgpKS5hZGRDbGFzcyhDTEFTU19QUkVGSVggKyBcIi1cIiArIGF0dGFjaG1lbnQpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZ2V0VGlwRWxlbWVudCA9IGZ1bmN0aW9uIGdldFRpcEVsZW1lbnQoKSB7XG4gICAgICB0aGlzLnRpcCA9IHRoaXMudGlwIHx8ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuY29uZmlnLnRlbXBsYXRlKVswXTtcbiAgICAgIHJldHVybiB0aGlzLnRpcDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnNldENvbnRlbnQgPSBmdW5jdGlvbiBzZXRDb250ZW50KCkge1xuICAgICAgdmFyICR0aXAgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLmdldFRpcEVsZW1lbnQoKSk7IC8vIFdlIHVzZSBhcHBlbmQgZm9yIGh0bWwgb2JqZWN0cyB0byBtYWludGFpbiBqcyBldmVudHNcblxuICAgICAgdGhpcy5zZXRFbGVtZW50Q29udGVudCgkdGlwLmZpbmQoU0VMRUNUT1JfVElUTEUpLCB0aGlzLmdldFRpdGxlKCkpO1xuXG4gICAgICB2YXIgY29udGVudCA9IHRoaXMuX2dldENvbnRlbnQoKTtcblxuICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LmNhbGwodGhpcy5lbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRFbGVtZW50Q29udGVudCgkdGlwLmZpbmQoU0VMRUNUT1JfQ09OVEVOVCksIGNvbnRlbnQpO1xuICAgICAgJHRpcC5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0ZBREUkMiArIFwiIFwiICsgQ0xBU1NfTkFNRV9TSE9XJDIpO1xuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fZ2V0Q29udGVudCA9IGZ1bmN0aW9uIF9nZXRDb250ZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29udGVudCcpIHx8IHRoaXMuY29uZmlnLmNvbnRlbnQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fY2xlYW5UaXBDbGFzcyA9IGZ1bmN0aW9uIF9jbGVhblRpcENsYXNzKCkge1xuICAgICAgdmFyICR0aXAgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLmdldFRpcEVsZW1lbnQoKSk7XG4gICAgICB2YXIgdGFiQ2xhc3MgPSAkdGlwLmF0dHIoJ2NsYXNzJykubWF0Y2goQlNDTFNfUFJFRklYX1JFR0VYKTtcblxuICAgICAgaWYgKHRhYkNsYXNzICE9PSBudWxsICYmIHRhYkNsYXNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgJHRpcC5yZW1vdmVDbGFzcyh0YWJDbGFzcy5qb2luKCcnKSk7XG4gICAgICB9XG4gICAgfSAvLyBTdGF0aWNcbiAgICA7XG5cbiAgICBQb3BvdmVyLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYXRhID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcykuZGF0YShEQVRBX0tFWSQzKTtcblxuICAgICAgICB2YXIgX2NvbmZpZyA9IHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDogbnVsbDtcblxuICAgICAgICBpZiAoIWRhdGEgJiYgL2Rpc3Bvc2V8aGlkZS8udGVzdChjb25maWcpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBQb3BvdmVyKHRoaXMsIF9jb25maWcpO1xuICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMpLmRhdGEoREFUQV9LRVkkMywgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKFBvcG92ZXIsIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiAvLyBHZXR0ZXJzXG4gICAgICBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OJDM7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdCQyO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJOQU1FXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIE5BTUUkMztcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiREFUQV9LRVlcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gREFUQV9LRVkkMztcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRXZlbnRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRXZlbnQ7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkVWRU5UX0tFWVwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBFVkVOVF9LRVkkMztcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFR5cGVcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdFR5cGUkMjtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gUG9wb3ZlcjtcbiAgfShUb29sdGlwKTtcbiAgLyoqXG4gICAqIGpRdWVyeVxuICAgKi9cblxuXG4gICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkM10gPSBQb3BvdmVyLl9qUXVlcnlJbnRlcmZhY2U7XG4gICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkM10uQ29uc3RydWN0b3IgPSBQb3BvdmVyO1xuXG4gICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkM10ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJDNdID0gSlFVRVJZX05PX0NPTkZMSUNUJDM7XG4gICAgcmV0dXJuIFBvcG92ZXIuX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogQ29uc3RhbnRzXG4gICAqL1xuXG4gIHZhciBOQU1FJDIgPSAnc2Nyb2xsc3B5JztcbiAgdmFyIFZFUlNJT04kMiA9ICc0LjYuMic7XG4gIHZhciBEQVRBX0tFWSQyID0gJ2JzLnNjcm9sbHNweSc7XG4gIHZhciBFVkVOVF9LRVkkMiA9IFwiLlwiICsgREFUQV9LRVkkMjtcbiAgdmFyIERBVEFfQVBJX0tFWSQxID0gJy5kYXRhLWFwaSc7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkMiA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkMl07XG4gIHZhciBDTEFTU19OQU1FX0RST1BET1dOX0lURU0gPSAnZHJvcGRvd24taXRlbSc7XG4gIHZhciBDTEFTU19OQU1FX0FDVElWRSQxID0gJ2FjdGl2ZSc7XG4gIHZhciBFVkVOVF9BQ1RJVkFURSA9IFwiYWN0aXZhdGVcIiArIEVWRU5UX0tFWSQyO1xuICB2YXIgRVZFTlRfU0NST0xMID0gXCJzY3JvbGxcIiArIEVWRU5UX0tFWSQyO1xuICB2YXIgRVZFTlRfTE9BRF9EQVRBX0FQSSA9IFwibG9hZFwiICsgRVZFTlRfS0VZJDIgKyBEQVRBX0FQSV9LRVkkMTtcbiAgdmFyIE1FVEhPRF9PRkZTRVQgPSAnb2Zmc2V0JztcbiAgdmFyIE1FVEhPRF9QT1NJVElPTiA9ICdwb3NpdGlvbic7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1NQWSA9ICdbZGF0YS1zcHk9XCJzY3JvbGxcIl0nO1xuICB2YXIgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVAkMSA9ICcubmF2LCAubGlzdC1ncm91cCc7XG4gIHZhciBTRUxFQ1RPUl9OQVZfTElOS1MgPSAnLm5hdi1saW5rJztcbiAgdmFyIFNFTEVDVE9SX05BVl9JVEVNUyA9ICcubmF2LWl0ZW0nO1xuICB2YXIgU0VMRUNUT1JfTElTVF9JVEVNUyA9ICcubGlzdC1ncm91cC1pdGVtJztcbiAgdmFyIFNFTEVDVE9SX0RST1BET1dOJDEgPSAnLmRyb3Bkb3duJztcbiAgdmFyIFNFTEVDVE9SX0RST1BET1dOX0lURU1TID0gJy5kcm9wZG93bi1pdGVtJztcbiAgdmFyIFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSQxID0gJy5kcm9wZG93bi10b2dnbGUnO1xuICB2YXIgRGVmYXVsdCQxID0ge1xuICAgIG9mZnNldDogMTAsXG4gICAgbWV0aG9kOiAnYXV0bycsXG4gICAgdGFyZ2V0OiAnJ1xuICB9O1xuICB2YXIgRGVmYXVsdFR5cGUkMSA9IHtcbiAgICBvZmZzZXQ6ICdudW1iZXInLFxuICAgIG1ldGhvZDogJ3N0cmluZycsXG4gICAgdGFyZ2V0OiAnKHN0cmluZ3xlbGVtZW50KSdcbiAgfTtcbiAgLyoqXG4gICAqIENsYXNzIGRlZmluaXRpb25cbiAgICovXG5cbiAgdmFyIFNjcm9sbFNweSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2Nyb2xsU3B5KGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLl9zY3JvbGxFbGVtZW50ID0gZWxlbWVudC50YWdOYW1lID09PSAnQk9EWScgPyB3aW5kb3cgOiBlbGVtZW50O1xuICAgICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLl9zZWxlY3RvciA9IHRoaXMuX2NvbmZpZy50YXJnZXQgKyBcIiBcIiArIFNFTEVDVE9SX05BVl9MSU5LUyArIFwiLFwiICsgKHRoaXMuX2NvbmZpZy50YXJnZXQgKyBcIiBcIiArIFNFTEVDVE9SX0xJU1RfSVRFTVMgKyBcIixcIikgKyAodGhpcy5fY29uZmlnLnRhcmdldCArIFwiIFwiICsgU0VMRUNUT1JfRFJPUERPV05fSVRFTVMpO1xuICAgICAgdGhpcy5fb2Zmc2V0cyA9IFtdO1xuICAgICAgdGhpcy5fdGFyZ2V0cyA9IFtdO1xuICAgICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbDtcbiAgICAgIHRoaXMuX3Njcm9sbEhlaWdodCA9IDA7XG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9zY3JvbGxFbGVtZW50KS5vbihFVkVOVF9TQ1JPTEwsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuX3Byb2Nlc3MoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcblxuICAgICAgdGhpcy5fcHJvY2VzcygpO1xuICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICB2YXIgX3Byb3RvID0gU2Nyb2xsU3B5LnByb3RvdHlwZTtcblxuICAgIC8vIFB1YmxpY1xuICAgIF9wcm90by5yZWZyZXNoID0gZnVuY3Rpb24gcmVmcmVzaCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgYXV0b01ldGhvZCA9IHRoaXMuX3Njcm9sbEVsZW1lbnQgPT09IHRoaXMuX3Njcm9sbEVsZW1lbnQud2luZG93ID8gTUVUSE9EX09GRlNFVCA6IE1FVEhPRF9QT1NJVElPTjtcbiAgICAgIHZhciBvZmZzZXRNZXRob2QgPSB0aGlzLl9jb25maWcubWV0aG9kID09PSAnYXV0bycgPyBhdXRvTWV0aG9kIDogdGhpcy5fY29uZmlnLm1ldGhvZDtcbiAgICAgIHZhciBvZmZzZXRCYXNlID0gb2Zmc2V0TWV0aG9kID09PSBNRVRIT0RfUE9TSVRJT04gPyB0aGlzLl9nZXRTY3JvbGxUb3AoKSA6IDA7XG4gICAgICB0aGlzLl9vZmZzZXRzID0gW107XG4gICAgICB0aGlzLl90YXJnZXRzID0gW107XG4gICAgICB0aGlzLl9zY3JvbGxIZWlnaHQgPSB0aGlzLl9nZXRTY3JvbGxIZWlnaHQoKTtcbiAgICAgIHZhciB0YXJnZXRzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuX3NlbGVjdG9yKSk7XG4gICAgICB0YXJnZXRzLm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICB2YXIgdGFyZ2V0O1xuICAgICAgICB2YXIgdGFyZ2V0U2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFNlbGVjdG9yKSB7XG4gICAgICAgICAgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXRTZWxlY3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgdmFyIHRhcmdldEJDUiA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgIGlmICh0YXJnZXRCQ1Iud2lkdGggfHwgdGFyZ2V0QkNSLmhlaWdodCkge1xuICAgICAgICAgICAgLy8gVE9ETyAoZmF0KTogcmVtb3ZlIHNrZXRjaCByZWxpYW5jZSBvbiBqUXVlcnkgcG9zaXRpb24vb2Zmc2V0XG4gICAgICAgICAgICByZXR1cm4gWyRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRhcmdldClbb2Zmc2V0TWV0aG9kXSgpLnRvcCArIG9mZnNldEJhc2UsIHRhcmdldFNlbGVjdG9yXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pLmZpbHRlcihCb29sZWFuKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhWzBdIC0gYlswXTtcbiAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgX3RoaXMyLl9vZmZzZXRzLnB1c2goaXRlbVswXSk7XG5cbiAgICAgICAgX3RoaXMyLl90YXJnZXRzLnB1c2goaXRlbVsxXSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0ucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSQyKTtcbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX3Njcm9sbEVsZW1lbnQpLm9mZihFVkVOVF9LRVkkMik7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX3Njcm9sbEVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5fY29uZmlnID0gbnVsbDtcbiAgICAgIHRoaXMuX3NlbGVjdG9yID0gbnVsbDtcbiAgICAgIHRoaXMuX29mZnNldHMgPSBudWxsO1xuICAgICAgdGhpcy5fdGFyZ2V0cyA9IG51bGw7XG4gICAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSBudWxsO1xuICAgICAgdGhpcy5fc2Nyb2xsSGVpZ2h0ID0gbnVsbDtcbiAgICB9IC8vIFByaXZhdGVcbiAgICA7XG5cbiAgICBfcHJvdG8uX2dldENvbmZpZyA9IGZ1bmN0aW9uIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgICBjb25maWcgPSBfZXh0ZW5kcyh7fSwgRGVmYXVsdCQxLCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWcgPyBjb25maWcgOiB7fSk7XG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnLnRhcmdldCAhPT0gJ3N0cmluZycgJiYgVXRpbC5pc0VsZW1lbnQoY29uZmlnLnRhcmdldCkpIHtcbiAgICAgICAgdmFyIGlkID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oY29uZmlnLnRhcmdldCkuYXR0cignaWQnKTtcblxuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgaWQgPSBVdGlsLmdldFVJRChOQU1FJDIpO1xuICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGNvbmZpZy50YXJnZXQpLmF0dHIoJ2lkJywgaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnLnRhcmdldCA9IFwiI1wiICsgaWQ7XG4gICAgICB9XG5cbiAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUkMiwgY29uZmlnLCBEZWZhdWx0VHlwZSQxKTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24gX2dldFNjcm9sbFRvcCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxFbGVtZW50ID09PSB3aW5kb3cgPyB0aGlzLl9zY3JvbGxFbGVtZW50LnBhZ2VZT2Zmc2V0IDogdGhpcy5fc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0U2Nyb2xsSGVpZ2h0ID0gZnVuY3Rpb24gX2dldFNjcm9sbEhlaWdodCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxFbGVtZW50LnNjcm9sbEhlaWdodCB8fCBNYXRoLm1heChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCk7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0T2Zmc2V0SGVpZ2h0ID0gZnVuY3Rpb24gX2dldE9mZnNldEhlaWdodCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxFbGVtZW50ID09PSB3aW5kb3cgPyB3aW5kb3cuaW5uZXJIZWlnaHQgOiB0aGlzLl9zY3JvbGxFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9wcm9jZXNzID0gZnVuY3Rpb24gX3Byb2Nlc3MoKSB7XG4gICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy5fZ2V0U2Nyb2xsVG9wKCkgKyB0aGlzLl9jb25maWcub2Zmc2V0O1xuXG4gICAgICB2YXIgc2Nyb2xsSGVpZ2h0ID0gdGhpcy5fZ2V0U2Nyb2xsSGVpZ2h0KCk7XG5cbiAgICAgIHZhciBtYXhTY3JvbGwgPSB0aGlzLl9jb25maWcub2Zmc2V0ICsgc2Nyb2xsSGVpZ2h0IC0gdGhpcy5fZ2V0T2Zmc2V0SGVpZ2h0KCk7XG5cbiAgICAgIGlmICh0aGlzLl9zY3JvbGxIZWlnaHQgIT09IHNjcm9sbEhlaWdodCkge1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjcm9sbFRvcCA+PSBtYXhTY3JvbGwpIHtcbiAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMuX3RhcmdldHNbdGhpcy5fdGFyZ2V0cy5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAodGhpcy5fYWN0aXZlVGFyZ2V0ICE9PSB0YXJnZXQpIHtcbiAgICAgICAgICB0aGlzLl9hY3RpdmF0ZSh0YXJnZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fYWN0aXZlVGFyZ2V0ICYmIHNjcm9sbFRvcCA8IHRoaXMuX29mZnNldHNbMF0gJiYgdGhpcy5fb2Zmc2V0c1swXSA+IDApIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9jbGVhcigpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMuX29mZnNldHMubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgIHZhciBpc0FjdGl2ZVRhcmdldCA9IHRoaXMuX2FjdGl2ZVRhcmdldCAhPT0gdGhpcy5fdGFyZ2V0c1tpXSAmJiBzY3JvbGxUb3AgPj0gdGhpcy5fb2Zmc2V0c1tpXSAmJiAodHlwZW9mIHRoaXMuX29mZnNldHNbaSArIDFdID09PSAndW5kZWZpbmVkJyB8fCBzY3JvbGxUb3AgPCB0aGlzLl9vZmZzZXRzW2kgKyAxXSk7XG5cbiAgICAgICAgaWYgKGlzQWN0aXZlVGFyZ2V0KSB7XG4gICAgICAgICAgdGhpcy5fYWN0aXZhdGUodGhpcy5fdGFyZ2V0c1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9hY3RpdmF0ZSA9IGZ1bmN0aW9uIF9hY3RpdmF0ZSh0YXJnZXQpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IHRhcmdldDtcblxuICAgICAgdGhpcy5fY2xlYXIoKTtcblxuICAgICAgdmFyIHF1ZXJpZXMgPSB0aGlzLl9zZWxlY3Rvci5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yICsgXCJbZGF0YS10YXJnZXQ9XFxcIlwiICsgdGFyZ2V0ICsgXCJcXFwiXSxcIiArIHNlbGVjdG9yICsgXCJbaHJlZj1cXFwiXCIgKyB0YXJnZXQgKyBcIlxcXCJdXCI7XG4gICAgICB9KTtcblxuICAgICAgdmFyICRsaW5rID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJpZXMuam9pbignLCcpKSkpO1xuXG4gICAgICBpZiAoJGxpbmsuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9EUk9QRE9XTl9JVEVNKSkge1xuICAgICAgICAkbGluay5jbG9zZXN0KFNFTEVDVE9SX0RST1BET1dOJDEpLmZpbmQoU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFJDEpLmFkZENsYXNzKENMQVNTX05BTUVfQUNUSVZFJDEpO1xuICAgICAgICAkbGluay5hZGRDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNldCB0cmlnZ2VyZWQgbGluayBhcyBhY3RpdmVcbiAgICAgICAgJGxpbmsuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMSk7IC8vIFNldCB0cmlnZ2VyZWQgbGlua3MgcGFyZW50cyBhcyBhY3RpdmVcbiAgICAgICAgLy8gV2l0aCBib3RoIDx1bD4gYW5kIDxuYXY+IG1hcmt1cCBhIHBhcmVudCBpcyB0aGUgcHJldmlvdXMgc2libGluZyBvZiBhbnkgbmF2IGFuY2VzdG9yXG5cbiAgICAgICAgJGxpbmsucGFyZW50cyhTRUxFQ1RPUl9OQVZfTElTVF9HUk9VUCQxKS5wcmV2KFNFTEVDVE9SX05BVl9MSU5LUyArIFwiLCBcIiArIFNFTEVDVE9SX0xJU1RfSVRFTVMpLmFkZENsYXNzKENMQVNTX05BTUVfQUNUSVZFJDEpOyAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlIHdoZW4gLm5hdi1saW5rIGlzIGluc2lkZSAubmF2LWl0ZW1cblxuICAgICAgICAkbGluay5wYXJlbnRzKFNFTEVDVE9SX05BVl9MSVNUX0dST1VQJDEpLnByZXYoU0VMRUNUT1JfTkFWX0lURU1TKS5jaGlsZHJlbihTRUxFQ1RPUl9OQVZfTElOS1MpLmFkZENsYXNzKENMQVNTX05BTUVfQUNUSVZFJDEpO1xuICAgICAgfVxuXG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9zY3JvbGxFbGVtZW50KS50cmlnZ2VyKEVWRU5UX0FDVElWQVRFLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRhcmdldFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5fY2xlYXIgPSBmdW5jdGlvbiBfY2xlYXIoKSB7XG4gICAgICBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5fc2VsZWN0b3IpKS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQUNUSVZFJDEpO1xuICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFJDEpO1xuICAgICAgfSk7XG4gICAgfSAvLyBTdGF0aWNcbiAgICA7XG5cbiAgICBTY3JvbGxTcHkuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzKS5kYXRhKERBVEFfS0VZJDIpO1xuXG4gICAgICAgIHZhciBfY29uZmlnID0gdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgU2Nyb2xsU3B5KHRoaXMsIF9jb25maWcpO1xuICAgICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMpLmRhdGEoREFUQV9LRVkkMiwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKFNjcm9sbFNweSwgbnVsbCwgW3tcbiAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFZFUlNJT04kMjtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0JDE7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIFNjcm9sbFNweTtcbiAgfSgpO1xuICAvKipcbiAgICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAgICovXG5cblxuICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh3aW5kb3cpLm9uKEVWRU5UX0xPQURfREFUQV9BUEksIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2Nyb2xsU3B5cyA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9EQVRBX1NQWSkpO1xuICAgIHZhciBzY3JvbGxTcHlzTGVuZ3RoID0gc2Nyb2xsU3B5cy5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gc2Nyb2xsU3B5c0xlbmd0aDsgaS0tOykge1xuICAgICAgdmFyICRzcHkgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShzY3JvbGxTcHlzW2ldKTtcblxuICAgICAgU2Nyb2xsU3B5Ll9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkc3B5LCAkc3B5LmRhdGEoKSk7XG4gICAgfVxuICB9KTtcbiAgLyoqXG4gICAqIGpRdWVyeVxuICAgKi9cblxuICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJDJdID0gU2Nyb2xsU3B5Ll9qUXVlcnlJbnRlcmZhY2U7XG4gICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkMl0uQ29uc3RydWN0b3IgPSBTY3JvbGxTcHk7XG5cbiAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uZm5bTkFNRSQyXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkMl0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkMjtcbiAgICByZXR1cm4gU2Nyb2xsU3B5Ll9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICB2YXIgTkFNRSQxID0gJ3RhYic7XG4gIHZhciBWRVJTSU9OJDEgPSAnNC42LjInO1xuICB2YXIgREFUQV9LRVkkMSA9ICdicy50YWInO1xuICB2YXIgRVZFTlRfS0VZJDEgPSBcIi5cIiArIERBVEFfS0VZJDE7XG4gIHZhciBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCQxID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uZm5bTkFNRSQxXTtcbiAgdmFyIENMQVNTX05BTUVfRFJPUERPV05fTUVOVSA9ICdkcm9wZG93bi1tZW51JztcbiAgdmFyIENMQVNTX05BTUVfQUNUSVZFID0gJ2FjdGl2ZSc7XG4gIHZhciBDTEFTU19OQU1FX0RJU0FCTEVEID0gJ2Rpc2FibGVkJztcbiAgdmFyIENMQVNTX05BTUVfRkFERSQxID0gJ2ZhZGUnO1xuICB2YXIgQ0xBU1NfTkFNRV9TSE9XJDEgPSAnc2hvdyc7XG4gIHZhciBFVkVOVF9ISURFJDEgPSBcImhpZGVcIiArIEVWRU5UX0tFWSQxO1xuICB2YXIgRVZFTlRfSElEREVOJDEgPSBcImhpZGRlblwiICsgRVZFTlRfS0VZJDE7XG4gIHZhciBFVkVOVF9TSE9XJDEgPSBcInNob3dcIiArIEVWRU5UX0tFWSQxO1xuICB2YXIgRVZFTlRfU0hPV04kMSA9IFwic2hvd25cIiArIEVWRU5UX0tFWSQxO1xuICB2YXIgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBcImNsaWNrXCIgKyBFVkVOVF9LRVkkMSArIERBVEFfQVBJX0tFWTtcbiAgdmFyIFNFTEVDVE9SX0RST1BET1dOID0gJy5kcm9wZG93bic7XG4gIHZhciBTRUxFQ1RPUl9OQVZfTElTVF9HUk9VUCA9ICcubmF2LCAubGlzdC1ncm91cCc7XG4gIHZhciBTRUxFQ1RPUl9BQ1RJVkUgPSAnLmFjdGl2ZSc7XG4gIHZhciBTRUxFQ1RPUl9BQ1RJVkVfVUwgPSAnPiBsaSA+IC5hY3RpdmUnO1xuICB2YXIgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtdG9nZ2xlPVwidGFiXCJdLCBbZGF0YS10b2dnbGU9XCJwaWxsXCJdLCBbZGF0YS10b2dnbGU9XCJsaXN0XCJdJztcbiAgdmFyIFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9ICcuZHJvcGRvd24tdG9nZ2xlJztcbiAgdmFyIFNFTEVDVE9SX0RST1BET1dOX0FDVElWRV9DSElMRCA9ICc+IC5kcm9wZG93bi1tZW51IC5hY3RpdmUnO1xuICAvKipcbiAgICogQ2xhc3MgZGVmaW5pdGlvblxuICAgKi9cblxuICB2YXIgVGFiID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUYWIoZWxlbWVudCkge1xuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgIHZhciBfcHJvdG8gPSBUYWIucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLnNob3cgPSBmdW5jdGlvbiBzaG93KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZSAmJiB0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfQUNUSVZFKSB8fCAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX0RJU0FCTEVEKSB8fCB0aGlzLl9lbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB0YXJnZXQ7XG4gICAgICB2YXIgcHJldmlvdXM7XG4gICAgICB2YXIgbGlzdEVsZW1lbnQgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS5jbG9zZXN0KFNFTEVDVE9SX05BVl9MSVNUX0dST1VQKVswXTtcbiAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcblxuICAgICAgaWYgKGxpc3RFbGVtZW50KSB7XG4gICAgICAgIHZhciBpdGVtU2VsZWN0b3IgPSBsaXN0RWxlbWVudC5ub2RlTmFtZSA9PT0gJ1VMJyB8fCBsaXN0RWxlbWVudC5ub2RlTmFtZSA9PT0gJ09MJyA/IFNFTEVDVE9SX0FDVElWRV9VTCA6IFNFTEVDVE9SX0FDVElWRTtcbiAgICAgICAgcHJldmlvdXMgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5tYWtlQXJyYXkoJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0obGlzdEVsZW1lbnQpLmZpbmQoaXRlbVNlbGVjdG9yKSk7XG4gICAgICAgIHByZXZpb3VzID0gcHJldmlvdXNbcHJldmlvdXMubGVuZ3RoIC0gMV07XG4gICAgICB9XG5cbiAgICAgIHZhciBoaWRlRXZlbnQgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5FdmVudChFVkVOVF9ISURFJDEsIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgICAgfSk7XG4gICAgICB2YXIgc2hvd0V2ZW50ID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uRXZlbnQoRVZFTlRfU0hPVyQxLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHByZXZpb3VzXG4gICAgICB9KTtcblxuICAgICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHByZXZpb3VzKS50cmlnZ2VyKGhpZGVFdmVudCk7XG4gICAgICB9XG5cbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoc2hvd0V2ZW50KTtcblxuICAgICAgaWYgKHNob3dFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSB8fCBoaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2FjdGl2YXRlKHRoaXMuX2VsZW1lbnQsIGxpc3RFbGVtZW50KTtcblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgIHZhciBoaWRkZW5FdmVudCA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLkV2ZW50KEVWRU5UX0hJRERFTiQxLCB7XG4gICAgICAgICAgcmVsYXRlZFRhcmdldDogX3RoaXMuX2VsZW1lbnRcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBzaG93bkV2ZW50ID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uRXZlbnQoRVZFTlRfU0hPV04kMSwge1xuICAgICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHByZXZpb3VzXG4gICAgICAgIH0pO1xuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShwcmV2aW91cykudHJpZ2dlcihoaWRkZW5FdmVudCk7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKF90aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNob3duRXZlbnQpO1xuICAgICAgfTtcblxuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICB0aGlzLl9hY3RpdmF0ZSh0YXJnZXQsIHRhcmdldC5wYXJlbnROb2RlLCBjb21wbGV0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsIERBVEFfS0VZJDEpO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9hY3RpdmF0ZSA9IGZ1bmN0aW9uIF9hY3RpdmF0ZShlbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGFjdGl2ZUVsZW1lbnRzID0gY29udGFpbmVyICYmIChjb250YWluZXIubm9kZU5hbWUgPT09ICdVTCcgfHwgY29udGFpbmVyLm5vZGVOYW1lID09PSAnT0wnKSA/ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGNvbnRhaW5lcikuZmluZChTRUxFQ1RPUl9BQ1RJVkVfVUwpIDogJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oY29udGFpbmVyKS5jaGlsZHJlbihTRUxFQ1RPUl9BQ1RJVkUpO1xuICAgICAgdmFyIGFjdGl2ZSA9IGFjdGl2ZUVsZW1lbnRzWzBdO1xuICAgICAgdmFyIGlzVHJhbnNpdGlvbmluZyA9IGNhbGxiYWNrICYmIGFjdGl2ZSAmJiAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShhY3RpdmUpLmhhc0NsYXNzKENMQVNTX05BTUVfRkFERSQxKTtcblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuX3RyYW5zaXRpb25Db21wbGV0ZShlbGVtZW50LCBhY3RpdmUsIGNhbGxiYWNrKTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChhY3RpdmUgJiYgaXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KGFjdGl2ZSk7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGFjdGl2ZSkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDEpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjb21wbGV0ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fdHJhbnNpdGlvbkNvbXBsZXRlID0gZnVuY3Rpb24gX3RyYW5zaXRpb25Db21wbGV0ZShlbGVtZW50LCBhY3RpdmUsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGFjdGl2ZSkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUpO1xuICAgICAgICB2YXIgZHJvcGRvd25DaGlsZCA9ICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGFjdGl2ZS5wYXJlbnROb2RlKS5maW5kKFNFTEVDVE9SX0RST1BET1dOX0FDVElWRV9DSElMRClbMF07XG5cbiAgICAgICAgaWYgKGRyb3Bkb3duQ2hpbGQpIHtcbiAgICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShkcm9wZG93bkNoaWxkKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWN0aXZlLmdldEF0dHJpYnV0ZSgncm9sZScpID09PSAndGFiJykge1xuICAgICAgICAgIGFjdGl2ZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZWxlbWVudCkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUpO1xuXG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ3RhYicpIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgVXRpbC5yZWZsb3coZWxlbWVudCk7XG5cbiAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUkMSkpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyQxKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcblxuICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQubm9kZU5hbWUgPT09ICdMSScpIHtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJlbnQgJiYgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0ocGFyZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX0RST1BET1dOX01FTlUpKSB7XG4gICAgICAgIHZhciBkcm9wZG93bkVsZW1lbnQgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXShlbGVtZW50KS5jbG9zZXN0KFNFTEVDVE9SX0RST1BET1dOKVswXTtcblxuICAgICAgICBpZiAoZHJvcGRvd25FbGVtZW50KSB7XG4gICAgICAgICAgdmFyIGRyb3Bkb3duVG9nZ2xlTGlzdCA9IFtdLnNsaWNlLmNhbGwoZHJvcGRvd25FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFKSk7XG4gICAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oZHJvcGRvd25Ub2dnbGVMaXN0KS5hZGRDbGFzcyhDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIFRhYi5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJHRoaXMgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzKTtcbiAgICAgICAgdmFyIGRhdGEgPSAkdGhpcy5kYXRhKERBVEFfS0VZJDEpO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgVGFiKHRoaXMpO1xuICAgICAgICAgICR0aGlzLmRhdGEoREFUQV9LRVkkMSwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKFRhYiwgbnVsbCwgW3tcbiAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFZFUlNJT04kMTtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gVGFiO1xuICB9KCk7XG4gIC8qKlxuICAgKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICAgKi9cblxuXG4gICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKGRvY3VtZW50KS5vbihFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBUYWIuX2pRdWVyeUludGVyZmFjZS5jYWxsKCRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMpLCAnc2hvdycpO1xuICB9KTtcbiAgLyoqXG4gICAqIGpRdWVyeVxuICAgKi9cblxuICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FJDFdID0gVGFiLl9qUXVlcnlJbnRlcmZhY2U7XG4gICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkMV0uQ29uc3RydWN0b3IgPSBUYWI7XG5cbiAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uZm5bTkFNRSQxXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUUkMV0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkMTtcbiAgICByZXR1cm4gVGFiLl9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICB2YXIgTkFNRSA9ICd0b2FzdCc7XG4gIHZhciBWRVJTSU9OID0gJzQuNi4yJztcbiAgdmFyIERBVEFfS0VZID0gJ2JzLnRvYXN0JztcbiAgdmFyIEVWRU5UX0tFWSA9IFwiLlwiICsgREFUQV9LRVk7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QgPSAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FXTtcbiAgdmFyIENMQVNTX05BTUVfRkFERSA9ICdmYWRlJztcbiAgdmFyIENMQVNTX05BTUVfSElERSA9ICdoaWRlJztcbiAgdmFyIENMQVNTX05BTUVfU0hPVyA9ICdzaG93JztcbiAgdmFyIENMQVNTX05BTUVfU0hPV0lORyA9ICdzaG93aW5nJztcbiAgdmFyIEVWRU5UX0NMSUNLX0RJU01JU1MgPSBcImNsaWNrLmRpc21pc3NcIiArIEVWRU5UX0tFWTtcbiAgdmFyIEVWRU5UX0hJREUgPSBcImhpZGVcIiArIEVWRU5UX0tFWTtcbiAgdmFyIEVWRU5UX0hJRERFTiA9IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVk7XG4gIHZhciBFVkVOVF9TSE9XID0gXCJzaG93XCIgKyBFVkVOVF9LRVk7XG4gIHZhciBFVkVOVF9TSE9XTiA9IFwic2hvd25cIiArIEVWRU5UX0tFWTtcbiAgdmFyIFNFTEVDVE9SX0RBVEFfRElTTUlTUyA9ICdbZGF0YS1kaXNtaXNzPVwidG9hc3RcIl0nO1xuICB2YXIgRGVmYXVsdCA9IHtcbiAgICBhbmltYXRpb246IHRydWUsXG4gICAgYXV0b2hpZGU6IHRydWUsXG4gICAgZGVsYXk6IDUwMFxuICB9O1xuICB2YXIgRGVmYXVsdFR5cGUgPSB7XG4gICAgYW5pbWF0aW9uOiAnYm9vbGVhbicsXG4gICAgYXV0b2hpZGU6ICdib29sZWFuJyxcbiAgICBkZWxheTogJ251bWJlcidcbiAgfTtcbiAgLyoqXG4gICAqIENsYXNzIGRlZmluaXRpb25cbiAgICovXG5cbiAgdmFyIFRvYXN0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUb2FzdChlbGVtZW50LCBjb25maWcpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcblxuICAgICAgdGhpcy5fc2V0TGlzdGVuZXJzKCk7XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgIHZhciBfcHJvdG8gPSBUb2FzdC5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8uc2hvdyA9IGZ1bmN0aW9uIHNob3coKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgc2hvd0V2ZW50ID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uRXZlbnQoRVZFTlRfU0hPVyk7XG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNob3dFdmVudCk7XG5cbiAgICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jbGVhclRpbWVvdXQoKTtcblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5hbmltYXRpb24pIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgICAgICBfdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPV0lORyk7XG5cbiAgICAgICAgX3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpO1xuXG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKF90aGlzLl9lbGVtZW50KS50cmlnZ2VyKEVWRU5UX1NIT1dOKTtcblxuICAgICAgICBpZiAoX3RoaXMuX2NvbmZpZy5hdXRvaGlkZSkge1xuICAgICAgICAgIF90aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5oaWRlKCk7XG4gICAgICAgICAgfSwgX3RoaXMuX2NvbmZpZy5kZWxheSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0hJREUpO1xuXG4gICAgICBVdGlsLnJlZmxvdyh0aGlzLl9lbGVtZW50KTtcblxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPV0lORyk7XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcuYW5pbWF0aW9uKSB7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uaGlkZSA9IGZ1bmN0aW9uIGhpZGUoKSB7XG4gICAgICBpZiAoIXRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGlkZUV2ZW50ID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uRXZlbnQoRVZFTlRfSElERSk7XG4gICAgICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKGhpZGVFdmVudCk7XG5cbiAgICAgIGlmIChoaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jbG9zZSgpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVvdXQoKTtcblxuICAgICAgaWYgKHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVykpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyk7XG4gICAgICB9XG5cbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLm9mZihFVkVOVF9DTElDS19ESVNNSVNTKTtcbiAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkpO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9jb25maWcgPSBudWxsO1xuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fZ2V0Q29uZmlnID0gZnVuY3Rpb24gX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgIGNvbmZpZyA9IF9leHRlbmRzKHt9LCBEZWZhdWx0LCAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXSh0aGlzLl9lbGVtZW50KS5kYXRhKCksIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZyA/IGNvbmZpZyA6IHt9KTtcbiAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUsIGNvbmZpZywgdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0VHlwZSk7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX3NldExpc3RlbmVycyA9IGZ1bmN0aW9uIF9zZXRMaXN0ZW5lcnMoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcy5fZWxlbWVudCkub24oRVZFTlRfQ0xJQ0tfRElTTUlTUywgU0VMRUNUT1JfREFUQV9ESVNNSVNTLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuaGlkZSgpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5fY2xvc2UgPSBmdW5jdGlvbiBfY2xvc2UoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgIF90aGlzMy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfSElERSk7XG5cbiAgICAgICAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0oX3RoaXMzLl9lbGVtZW50KS50cmlnZ2VyKEVWRU5UX0hJRERFTik7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKTtcblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5hbmltYXRpb24pIHtcbiAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7XG4gICAgICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdKHRoaXMuX2VsZW1lbnQpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjb21wbGV0ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fY2xlYXJUaW1lb3V0ID0gZnVuY3Rpb24gX2NsZWFyVGltZW91dCgpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcbiAgICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgVG9hc3QuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICRlbGVtZW50ID0gJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0odGhpcyk7XG4gICAgICAgIHZhciBkYXRhID0gJGVsZW1lbnQuZGF0YShEQVRBX0tFWSk7XG5cbiAgICAgICAgdmFyIF9jb25maWcgPSB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWc7XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBUb2FzdCh0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAkZWxlbWVudC5kYXRhKERBVEFfS0VZLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcXFwiXCIgKyBjb25maWcgKyBcIlxcXCJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVtjb25maWddKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKFRvYXN0LCBudWxsLCBbe1xuICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVkVSU0lPTjtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFR5cGVcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdFR5cGU7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdDtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gVG9hc3Q7XG4gIH0oKTtcbiAgLyoqXG4gICAqIGpRdWVyeVxuICAgKi9cblxuXG4gICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUVdID0gVG9hc3QuX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFtcImRlZmF1bHRcIl0uZm5bTkFNRV0uQ29uc3RydWN0b3IgPSBUb2FzdDtcblxuICAkX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5mbltOQU1FXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICRfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmZuW05BTUVdID0gSlFVRVJZX05PX0NPTkZMSUNUO1xuICAgIHJldHVybiBUb2FzdC5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIGV4cG9ydHMuQWxlcnQgPSBBbGVydDtcbiAgZXhwb3J0cy5CdXR0b24gPSBCdXR0b247XG4gIGV4cG9ydHMuQ2Fyb3VzZWwgPSBDYXJvdXNlbDtcbiAgZXhwb3J0cy5Db2xsYXBzZSA9IENvbGxhcHNlO1xuICBleHBvcnRzLkRyb3Bkb3duID0gRHJvcGRvd247XG4gIGV4cG9ydHMuTW9kYWwgPSBNb2RhbDtcbiAgZXhwb3J0cy5Qb3BvdmVyID0gUG9wb3ZlcjtcbiAgZXhwb3J0cy5TY3JvbGxzcHkgPSBTY3JvbGxTcHk7XG4gIGV4cG9ydHMuVGFiID0gVGFiO1xuICBleHBvcnRzLlRvYXN0ID0gVG9hc3Q7XG4gIGV4cG9ydHMuVG9vbHRpcCA9IFRvb2x0aXA7XG4gIGV4cG9ydHMuVXRpbCA9IFV0aWw7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Ym9vdHN0cmFwLmpzLm1hcFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/bootstrap/dist/js/bootstrap.js\n");
/***/ }),
/***/ "./node_modules/jquery/dist/jquery.js":
/*!********************************************!*\
!*** ./node_modules/jquery/dist/jquery.js ***!
\********************************************/
/***/ (function(module, exports) {
eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * jQuery JavaScript Library v3.6.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2022-08-26T17:52Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( true && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket trac-14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML <object> elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.6.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.6\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2021-02-16\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem && elem.namespaceURI,\n\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t) );\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( ( b = b.parentNode ) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a == document || a.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b == document || b.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\treturn a == document ? -1 :\n\t\t\t\tb == document ? 1 :\n\t\t\t\t/* eslint-enable eqeqeq */\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[ i ] === bp[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[ i ], bp[ i ] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\tap[ i ] == preferredDoc ? -1 :\n\t\t\tbp[ i ] == preferredDoc ? 1 :\n\t\t\t/* eslint-enable eqeqeq */\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t// fragment in IE 9\n\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] ||\n\t\t\t\tmatch[ 5 ] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" ) );\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr[ \"CHILD\" ].test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace +\n\t\t\t\t\t\")\" + className + \"(\" + whitespace + \"|$)\" ) ) && classCache(\n\t\t\t\t\t\tclassName, function( elem ) {\n\t\t\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\t/* eslint-disable max-len */\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t\t/* eslint-enable max-len */\n\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\t\"has\": markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\t\"contains\": markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement &&\n\t\t\t\t( !document.hasFocus || document.hasFocus() ) &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn ( nodeName === \"input\" && !!elem.checked ) ||\n\t\t\t\t( nodeName === \"option\" && !!elem.selected );\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[ \"empty\" ]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\t\"last\": createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\t\"eq\": createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\t\"even\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"odd\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"lt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"gt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos[ \"nth\" ] = Expr.pseudos[ \"eq\" ];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rcombinators.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] ||\n\t\t\t\t\t\t\t( outerCache[ elem.uniqueID ] = {} );\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = uniqueCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts(\n\t\t\t\tselector || \"*\",\n\t\t\t\tcontext.nodeType ? [ context ] : context,\n\t\t\t\t[]\n\t\t\t),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\ttokens\n\t\t\t\t\t\t.slice( 0, i - 1 )\n\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[ \"TAG\" ]( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache(\n\t\t\tselector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers )\n\t\t);\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find[ \"ID\" ]( token.matches[ 0 ]\n\t\t\t\t.replace( runescape, funescape ), context ) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[ \"needsContext\" ].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert( function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute( \"href\" ) === \"#\";\n} ) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert( function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n} ) ) {\n\taddHandle( \"value\", function( elem, _name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert( function( el ) {\n\treturn el.getAttribute( \"disabled\" ) == null;\n} ) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\t\tnull;\n\t\t}\n\t} );\n}\n\nreturn Sizzle;\n\n} )( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n}\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)\n\t// Strict HTML recognition (trac-11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the primary Deferred\n\t\t\tprimary = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tprimary.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( primary.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn primary.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );\n\t\t}\n\n\t\treturn primary.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See trac-6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\t\tvalue :\n\t\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (trac-9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see trac-8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (trac-14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (trac-11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (trac-14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (trac-13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (trac-12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (trac-13208)\n\t\t\t\t// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (trac-13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Support: Chrome 86+\n\t\t\t\t\t\t// In Chrome, if an element having a focusout handler is blurred by\n\t\t\t\t\t\t// clicking outside of it, it invokes the handler synchronously. If\n\t\t\t\t\t\t// that handler calls `.remove()` on the element, the data is cleared,\n\t\t\t\t\t\t// leaving `result` undefined. We need to guard against this.\n\t\t\t\t\t\treturn result && result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (trac-504, trac-13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\t// Suppress native focus or blur if we're currently inside\n\t\t// a leveraged native-event stack\n\t\t_default: function( event ) {\n\t\t\treturn dataPriv.get( event.target, type );\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\n\trcleanScript = /^\\s*<!\\[CDATA\\[|\\]\\]>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (trac-8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase() !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Unwrap a CDATA section containing script contents. This shouldn't be\n\t\t\t\t\t\t\t// needed as in XML documents they're already not visible when\n\t\t\t\t\t\t\t// inspecting element contents and in HTML documents they have no\n\t\t\t\t\t\t\t// meaning but we're preserving that logic for backwards compatibility.\n\t\t\t\t\t\t\t// This will be removed completely in 4.0. See gh-4904.\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar rcustomProp = /^--/;\n\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\nvar whitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\";\n\n\nvar rtrimCSS = new RegExp(\n\t\"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\",\n\t\"g\"\n);\n\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (trac-8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is display: block\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tisCustomProp = rcustomProp.test( name ),\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css('filter') (IE 9 only, trac-12537)\n\t// .css('--customProperty) (gh-3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\t// trim whitespace for custom property (issue gh-4926)\n\t\tif ( isCustomProp ) {\n\n\t\t\t// rtrim treats U+000D CARRIAGE RETURN and U+000C FORM FEED\n\t\t\t// as whitespace while CSS does not, but this is not a problem\n\t\t\t// because CSS preprocessing replaces them with U+000A LINE FEED\n\t\t\t// (which *is* CSS whitespace)\n\t\t\t// https://www.w3.org/TR/css-syntax-3/#input-preprocessing\n\t\t\tret = ret.replace( rtrimCSS, \"$1\" );\n\t\t}\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (trac-7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug trac-9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (trac-7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// Use proper attribute retrieval (trac-12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + className + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += className + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + className + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + className + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar classNames, className, i, self,\n\t\t\ttype = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\treturn this.each( function() {\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\tself = jQuery( this );\n\n\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (trac-14686, trac-14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (trac-2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (trac-9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (trac-6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// trac-7653, trac-8125, trac-8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes trac-9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (trac-10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket trac-12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// trac-9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (trac-11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// trac-1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see trac-8605, trac-14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// trac-14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t// documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( {\n\t\tpadding: \"inner\" + name,\n\t\tcontent: type,\n\t\t\"\": \"outer\" + name\n\t}, function( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\njQuery.each(\n\t( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t}\n);\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\n// Require that the \"whitespace run\" starts from a non-whitespace\n// to avoid O(N^2) behavior when the engine would try matching \"\\s+$\" at each space position.\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|([^\\s\\uFEFF\\xA0])[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"$1\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( true ) {\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n\t\treturn jQuery;\n\t}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (trac-13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvanF1ZXJ5L2Rpc3QvanF1ZXJ5LmpzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsTUFBTSxLQUEwQjs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOzs7QUFHQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsWUFBWTs7QUFFckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGLG9CQUFvQjs7QUFFcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUYsOENBQThDO0FBQzlDO0FBQ0E7QUFDQSxtQkFBbUIsaUNBQWlDO0FBQ3BELEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLFNBQVM7QUFDbkI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVLFlBQVk7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxTQUFTO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGtDQUFrQyxJQUFJO0FBQ3RDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLDJCQUEyQjtBQUMzQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQSxnQkFBZ0IsSUFBSTs7QUFFcEI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsMENBQTBDLElBQUk7QUFDOUM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0YsVUFBVTs7QUFFVjtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSwwQkFBMEI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsU0FBUztBQUNwQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFNBQVMsNkJBQTZCO0FBQ2pEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxpQkFBaUI7QUFDNUIsYUFBYSx3QkFBd0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxnQkFBZ0I7QUFDM0IsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsZ0JBQWdCO0FBQzNCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxlQUFlO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0EsaUNBQWlDLE1BQU07QUFDdkM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBLGVBQWU7O0FBRWYsU0FBUzs7QUFFVDtBQUNBLFNBQVMsZ0NBQWdDO0FBQ3pDLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMscUNBQXFDO0FBQzlDLFNBQVM7QUFDVCxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDhEQUE4RDs7QUFFOUQ7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxRQUFROztBQUVSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtEQUErRDs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBO0FBQ0EsK0NBQStDOztBQUUvQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFF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OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsNkRBQTZEOztBQUU3RDtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7O0FBRTFDO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTs7QUFFQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFNBQVM7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsU0FBUztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSixTQUFTLFNBQVM7QUFDbEI7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZLFNBQVM7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGlEQUFpRDtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQsV0FBVyw0Q0FBNEM7QUFDdkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGlCQUFpQjtBQUM1QjtBQUNBLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBLEVBQUU7Ozs7QUFJRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQSxTQUFTLEdBQUc7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTs7OztBQUlBOztBQUVBOztBQUVBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTs7QUFFQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsTUFBTTtBQUNOOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQiwyQkFBMkIsd0JBQXdCOztBQUVuRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQSwyQ0FBMkM7QUFDM0MsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEseUNBQXlDLHFDQUFxQztBQUM5RSxxQ0FBcUMsc0NBQXNDO0FBQzNFLHFDQUFxQyxxQ0FBcUM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7O0FBRVo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7O0FBRVo7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQztBQUNyQyxzQ0FBc0M7QUFDdEMscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7Ozs7O0FBS0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0IsYUFBYTtBQUNyQyxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixTQUFTO0FBQzdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBOzs7QUFHQTs7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsZUFBZTs7QUFFZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUyxnQkFBZ0I7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsRUFBRTtBQUNGOztBQUVBOztBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsR0FBRztBQUNIOztBQUVBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTLE9BQU87QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLHNCQUFzQjs7QUFFdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsT0FBTztBQUNoQjs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXOztBQUVYOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGVBQWUsc0JBQXNCO0FBQ3JDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGdFQUFnRTtBQUNoRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVcsY0FBYzs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixtQkFBbUI7QUFDckM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQix1Q0FBdUM7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHVEQUF1RDtBQUMvRTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsSUFBSTtBQUNKLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLCtDQUErQztBQUNyRDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQsZUFBZSxvQ0FBb0M7QUFDbkQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLEVBQUU7OztBQUdGOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEMsT0FBTztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCOztBQUVBO0FB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QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsOERBQThEO0FBQzNFO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsT0FBTzs7QUFFaEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBLElBQUk7O0FBRUo7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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LE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLGtEQUFrRCwwQkFBMEI7QUFDNUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXLGdCQUFnQjtBQUMzQjtBQUNBOztBQUVB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OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7Ozs7QUFLRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7Ozs7O0FBS0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsdUJBQXVCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsdUJBQXVCO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsdUJBQXVCO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOzs7OztBQUtGOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUEsa0NBQWtDO0FBQ2xDO0FBQ0E7O0FBRUEsS0FBSztBQUNMOztBQUVBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBLFlBQVksU0FBUztBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7Ozs7QUFLRjs7O0FBR0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLEVBQUU7O0FBRUY7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0NBQW9DOztBQUVwRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUEsY0FBYzs7QUFFZDs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUosR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZCxNQUFNO0FBQ047O0FBRUEsWUFBWTtBQUNaLElBQUk7QUFDSjtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCOztBQUVoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCOztBQUVoQixxREFBcUQ7QUFDckQ7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUJBQW1CO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVTtBQUNWOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUI7QUFDakIsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDs7QUFFbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7O0FBRTNCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQ0FBa0M7O0FBRWxDO0FBQ0Esc0JBQXNCO0FBQ3RCLDJCQUEyQjs7QUFFM0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJO0FBQ0osRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWOztBQUVBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksdUJBQXVCO0FBQ25DLFlBQVksd0JBQXdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7OztBQUtGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDLGNBQWMsdUNBQXVDO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7Ozs7O0FBS0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7OztBQUtGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjs7QUFFQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHFEQUFxRDtBQUNyRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0I7O0FBRXBCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQSxFQUFFOztBQUVGO0FBQ0EsZUFBZSxxREFBcUQ7QUFDcEU7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQSxlQUFlLGtDQUFrQztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLEdBQUc7QUFDSCxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7Ozs7QUFLRjs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLLElBQTBDO0FBQy9DLENBQUMsaUNBQWtCLEVBQUUsbUNBQUU7QUFDdkI7QUFDQSxFQUFFO0FBQUEsa0dBQUU7QUFDSjs7Ozs7QUFLQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0EsRUFBRSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9qcXVlcnkvZGlzdC9qcXVlcnkuanM/ODI2MiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuNi4xXG4gKiBodHRwczovL2pxdWVyeS5jb20vXG4gKlxuICogSW5jbHVkZXMgU2l6emxlLmpzXG4gKiBodHRwczovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZVxuICpcbiAqIERhdGU6IDIwMjItMDgtMjZUMTc6NTJaXG4gKi9cbiggZnVuY3Rpb24oIGdsb2JhbCwgZmFjdG9yeSApIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblxuXHRpZiAoIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gRm9yIENvbW1vbkpTIGFuZCBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB3aGVyZSBhIHByb3BlciBgd2luZG93YFxuXHRcdC8vIGlzIHByZXNlbnQsIGV4ZWN1dGUgdGhlIGZhY3RvcnkgYW5kIGdldCBqUXVlcnkuXG5cdFx0Ly8gRm9yIGVudmlyb25tZW50cyB0aGF0IGRvIG5vdCBoYXZlIGEgYHdpbmRvd2Agd2l0aCBhIGBkb2N1bWVudGBcblx0XHQvLyAoc3VjaCBhcyBOb2RlLmpzKSwgZXhwb3NlIGEgZmFjdG9yeSBhcyBtb2R1bGUuZXhwb3J0cy5cblx0XHQvLyBUaGlzIGFjY2VudHVhdGVzIHRoZSBuZWVkIGZvciB0aGUgY3JlYXRpb24gb2YgYSByZWFsIGB3aW5kb3dgLlxuXHRcdC8vIGUuZy4gdmFyIGpRdWVyeSA9IHJlcXVpcmUoXCJqcXVlcnlcIikod2luZG93KTtcblx0XHQvLyBTZWUgdGlja2V0IHRyYWMtMTQ1NDkgZm9yIG1vcmUgaW5mby5cblx0XHRtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/XG5cdFx0XHRmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6XG5cdFx0XHRmdW5jdGlvbiggdyApIHtcblx0XHRcdFx0aWYgKCAhdy5kb2N1bWVudCApIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIFwialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoIHcgKTtcblx0XHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0ZmFjdG9yeSggZ2xvYmFsICk7XG5cdH1cblxuLy8gUGFzcyB0aGlzIGlmIHdpbmRvdyBpcyBub3QgZGVmaW5lZCB5ZXRcbn0gKSggdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFsICkge1xuXG4vLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjFcbi8vIHRocm93IGV4Y2VwdGlvbnMgd2hlbiBub24tc3RyaWN0IGNvZGUgKGUuZy4sIEFTUC5ORVQgNC41KSBhY2Nlc3NlcyBzdHJpY3QgbW9kZVxuLy8gYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIgKHRyYWMtMTMzMzUpLiBCdXQgYXMgb2YgalF1ZXJ5IDMuMCAoMjAxNiksIHN0cmljdCBtb2RlIHNob3VsZCBiZSBjb21tb25cbi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLlxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnIgPSBbXTtcblxudmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuXG52YXIgc2xpY2UgPSBhcnIuc2xpY2U7XG5cbnZhciBmbGF0ID0gYXJyLmZsYXQgPyBmdW5jdGlvbiggYXJyYXkgKSB7XG5cdHJldHVybiBhcnIuZmxhdC5jYWxsKCBhcnJheSApO1xufSA6IGZ1bmN0aW9uKCBhcnJheSApIHtcblx0cmV0dXJuIGFyci5jb25jYXQuYXBwbHkoIFtdLCBhcnJheSApO1xufTtcblxuXG52YXIgcHVzaCA9IGFyci5wdXNoO1xuXG52YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mO1xuXG52YXIgY2xhc3MydHlwZSA9IHt9O1xuXG52YXIgdG9TdHJpbmcgPSBjbGFzczJ0eXBlLnRvU3RyaW5nO1xuXG52YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGZuVG9TdHJpbmcgPSBoYXNPd24udG9TdHJpbmc7XG5cbnZhciBPYmplY3RGdW5jdGlvblN0cmluZyA9IGZuVG9TdHJpbmcuY2FsbCggT2JqZWN0ICk7XG5cbnZhciBzdXBwb3J0ID0ge307XG5cbnZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gaXNGdW5jdGlvbiggb2JqICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9NTcsIEZpcmVmb3ggPD01MlxuXHRcdC8vIEluIHNvbWUgYnJvd3NlcnMsIHR5cGVvZiByZXR1cm5zIFwiZnVuY3Rpb25cIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50c1xuXHRcdC8vIChpLmUuLCBgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib2JqZWN0XCIgKSA9PT0gXCJmdW5jdGlvblwiYCkuXG5cdFx0Ly8gV2UgZG9uJ3Qgd2FudCB0byBjbGFzc2lmeSAqYW55KiBET00gbm9kZSBhcyBhIGZ1bmN0aW9uLlxuXHRcdC8vIFN1cHBvcnQ6IFF0V2ViIDw9My44LjUsIFdlYktpdCA8PTUzNC4zNCwgd2todG1sdG9wZGYgdG9vbCA8PTAuMTIuNVxuXHRcdC8vIFBsdXMgZm9yIG9sZCBXZWJLaXQsIHR5cGVvZiByZXR1cm5zIFwiZnVuY3Rpb25cIiBmb3IgSFRNTCBjb2xsZWN0aW9uc1xuXHRcdC8vIChlLmcuLCBgdHlwZW9mIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZGl2XCIpID09PSBcImZ1bmN0aW9uXCJgKS4gKGdoLTQ3NTYpXG5cdFx0cmV0dXJuIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2Ygb2JqLm5vZGVUeXBlICE9PSBcIm51bWJlclwiICYmXG5cdFx0XHR0eXBlb2Ygb2JqLml0ZW0gIT09IFwiZnVuY3Rpb25cIjtcblx0fTtcblxuXG52YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkge1xuXHRcdHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7XG5cdH07XG5cblxudmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuXG5cblxuXHR2YXIgcHJlc2VydmVkU2NyaXB0QXR0cmlidXRlcyA9IHtcblx0XHR0eXBlOiB0cnVlLFxuXHRcdHNyYzogdHJ1ZSxcblx0XHRub25jZTogdHJ1ZSxcblx0XHRub01vZHVsZTogdHJ1ZVxuXHR9O1xuXG5cdGZ1bmN0aW9uIERPTUV2YWwoIGNvZGUsIG5vZGUsIGRvYyApIHtcblx0XHRkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7XG5cblx0XHR2YXIgaSwgdmFsLFxuXHRcdFx0c2NyaXB0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoIFwic2NyaXB0XCIgKTtcblxuXHRcdHNjcmlwdC50ZXh0ID0gY29kZTtcblx0XHRpZiAoIG5vZGUgKSB7XG5cdFx0XHRmb3IgKCBpIGluIHByZXNlcnZlZFNjcmlwdEF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA2NCssIEVkZ2UgMTgrXG5cdFx0XHRcdC8vIFNvbWUgYnJvd3NlcnMgZG9uJ3Qgc3VwcG9ydCB0aGUgXCJub25jZVwiIHByb3BlcnR5IG9uIHNjcmlwdHMuXG5cdFx0XHRcdC8vIE9uIHRoZSBvdGhlciBoYW5kLCBqdXN0IHVzaW5nIGBnZXRBdHRyaWJ1dGVgIGlzIG5vdCBlbm91Z2ggYXNcblx0XHRcdFx0Ly8gdGhlIGBub25jZWAgYXR0cmlidXRlIGlzIHJlc2V0IHRvIGFuIGVtcHR5IHN0cmluZyB3aGVuZXZlciBpdFxuXHRcdFx0XHQvLyBiZWNvbWVzIGJyb3dzaW5nLWNvbnRleHQgY29ubmVjdGVkLlxuXHRcdFx0XHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy9odG1sL2lzc3Vlcy8yMzY5XG5cdFx0XHRcdC8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNub25jZS1hdHRyaWJ1dGVzXG5cdFx0XHRcdC8vIFRoZSBgbm9kZS5nZXRBdHRyaWJ1dGVgIGNoZWNrIHdhcyBhZGRlZCBmb3IgdGhlIHNha2Ugb2Zcblx0XHRcdFx0Ly8gYGpRdWVyeS5nbG9iYWxFdmFsYCBzbyB0aGF0IGl0IGNhbiBmYWtlIGEgbm9uY2UtY29udGFpbmluZyBub2RlXG5cdFx0XHRcdC8vIHZpYSBhbiBvYmplY3QuXG5cdFx0XHRcdHZhbCA9IG5vZGVbIGkgXSB8fCBub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZSggaSApO1xuXHRcdFx0XHRpZiAoIHZhbCApIHtcblx0XHRcdFx0XHRzY3JpcHQuc2V0QXR0cmlidXRlKCBpLCB2YWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRkb2MuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0ICkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggc2NyaXB0ICk7XG5cdH1cblxuXG5mdW5jdGlvbiB0b1R5cGUoIG9iaiApIHtcblx0aWYgKCBvYmogPT0gbnVsbCApIHtcblx0XHRyZXR1cm4gb2JqICsgXCJcIjtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD0yLjMgb25seSAoZnVuY3Rpb25pc2ggUmVnRXhwKVxuXHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgP1xuXHRcdGNsYXNzMnR5cGVbIHRvU3RyaW5nLmNhbGwoIG9iaiApIF0gfHwgXCJvYmplY3RcIiA6XG5cdFx0dHlwZW9mIG9iajtcbn1cbi8qIGdsb2JhbCBTeW1ib2wgKi9cbi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5lc2xpbnRyYy5qc29uIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsXG4vLyB1bmd1YXJkZWQgaW4gYW5vdGhlciBwbGFjZSwgaXQgc2VlbXMgc2FmZXIgdG8gZGVmaW5lIGdsb2JhbCBvbmx5IGZvciB0aGlzIG1vZHVsZVxuXG5cblxudmFyXG5cdHZlcnNpb24gPSBcIjMuNi4xXCIsXG5cblx0Ly8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnlcblx0alF1ZXJ5ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXG5cdFx0Ly8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnXG5cdFx0Ly8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZClcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApO1xuXHR9O1xuXG5qUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0ge1xuXG5cdC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWRcblx0anF1ZXJ5OiB2ZXJzaW9uLFxuXG5cdGNvbnN0cnVjdG9yOiBqUXVlcnksXG5cblx0Ly8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwXG5cdGxlbmd0aDogMCxcblxuXHR0b0FycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1Jcblx0Ly8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXlcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xuXG5cdFx0Ly8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBjbGVhbiBhcnJheVxuXHRcdGlmICggbnVtID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiBqdXN0IHRoZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBzZXRcblx0XHRyZXR1cm4gbnVtIDwgMCA/IHRoaXNbIG51bSArIHRoaXMubGVuZ3RoIF0gOiB0aGlzWyBudW0gXTtcblx0fSxcblxuXHQvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrXG5cdC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KVxuXHRwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblxuXHRcdC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0XG5cdFx0dmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApO1xuXG5cdFx0Ly8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSlcblx0XHRyZXQucHJldk9iamVjdCA9IHRoaXM7XG5cblx0XHQvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldFxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0Ly8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC5cblx0ZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2sgKTtcblx0fSxcblxuXHRtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRzbGljZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIDAgKTtcblx0fSxcblxuXHRsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcblx0fSxcblxuXHRldmVuOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5ncmVwKCB0aGlzLCBmdW5jdGlvbiggX2VsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gKCBpICsgMSApICUgMjtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRvZGQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LmdyZXAoIHRoaXMsIGZ1bmN0aW9uKCBfZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiBpICUgMjtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzWyBqIF0gXSA6IFtdICk7XG5cdH0sXG5cblx0ZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0b3IoKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLlxuXHRwdXNoOiBwdXNoLFxuXHRzb3J0OiBhcnIuc29ydCxcblx0c3BsaWNlOiBhcnIuc3BsaWNlXG59O1xuXG5qUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyAwIF0gfHwge30sXG5cdFx0aSA9IDEsXG5cdFx0bGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcblx0XHRkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cblx0XHQvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307XG5cdFx0aSsrO1xuXHR9XG5cblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG5cdGlmICggdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHQvLyBFeHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWRcblx0aWYgKCBpID09PSBsZW5ndGggKSB7XG5cdFx0dGFyZ2V0ID0gdGhpcztcblx0XHRpLS07XG5cdH1cblxuXHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblxuXHRcdC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXNcblx0XHRpZiAoICggb3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdICkgIT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdFx0XHRjb3B5ID0gb3B0aW9uc1sgbmFtZSBdO1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgT2JqZWN0LnByb3RvdHlwZSBwb2xsdXRpb25cblx0XHRcdFx0Ly8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcFxuXHRcdFx0XHRpZiAoIG5hbWUgPT09IFwiX19wcm90b19fXCIgfHwgdGFyZ2V0ID09PSBjb3B5ICkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzXG5cdFx0XHRcdGlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvcHkgKSB8fFxuXHRcdFx0XHRcdCggY29weUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KCBjb3B5ICkgKSApICkge1xuXHRcdFx0XHRcdHNyYyA9IHRhcmdldFsgbmFtZSBdO1xuXG5cdFx0XHRcdFx0Ly8gRW5zdXJlIHByb3BlciB0eXBlIGZvciB0aGUgc291cmNlIHZhbHVlXG5cdFx0XHRcdFx0aWYgKCBjb3B5SXNBcnJheSAmJiAhQXJyYXkuaXNBcnJheSggc3JjICkgKSB7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IFtdO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoICFjb3B5SXNBcnJheSAmJiAhalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHNyYyApICkge1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSB7fTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XG5cblx0XHRcdFx0XHQvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW1cblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlc1xuXHRcdFx0XHR9IGVsc2UgaWYgKCBjb3B5ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0dGFyZ2V0WyBuYW1lIF0gPSBjb3B5O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBtb2RpZmllZCBvYmplY3Rcblx0cmV0dXJuIHRhcmdldDtcbn07XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2Vcblx0ZXhwYW5kbzogXCJqUXVlcnlcIiArICggdmVyc2lvbiArIE1hdGgucmFuZG9tKCkgKS5yZXBsYWNlKCAvXFxEL2csIFwiXCIgKSxcblxuXHQvLyBBc3N1bWUgalF1ZXJ5IGlzIHJlYWR5IHdpdGhvdXQgdGhlIHJlYWR5IG1vZHVsZVxuXHRpc1JlYWR5OiB0cnVlLFxuXG5cdGVycm9yOiBmdW5jdGlvbiggbXNnICkge1xuXHRcdHRocm93IG5ldyBFcnJvciggbXNnICk7XG5cdH0sXG5cblx0bm9vcDogZnVuY3Rpb24oKSB7fSxcblxuXHRpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHZhciBwcm90bywgQ3RvcjtcblxuXHRcdC8vIERldGVjdCBvYnZpb3VzIG5lZ2F0aXZlc1xuXHRcdC8vIFVzZSB0b1N0cmluZyBpbnN0ZWFkIG9mIGpRdWVyeS50eXBlIHRvIGNhdGNoIGhvc3Qgb2JqZWN0c1xuXHRcdGlmICggIW9iaiB8fCB0b1N0cmluZy5jYWxsKCBvYmogKSAhPT0gXCJbb2JqZWN0IE9iamVjdF1cIiApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRwcm90byA9IGdldFByb3RvKCBvYmogKTtcblxuXHRcdC8vIE9iamVjdHMgd2l0aCBubyBwcm90b3R5cGUgKGUuZy4sIGBPYmplY3QuY3JlYXRlKCBudWxsIClgKSBhcmUgcGxhaW5cblx0XHRpZiAoICFwcm90byApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIE9iamVjdHMgd2l0aCBwcm90b3R5cGUgYXJlIHBsYWluIGlmZiB0aGV5IHdlcmUgY29uc3RydWN0ZWQgYnkgYSBnbG9iYWwgT2JqZWN0IGZ1bmN0aW9uXG5cdFx0Q3RvciA9IGhhc093bi5jYWxsKCBwcm90bywgXCJjb25zdHJ1Y3RvclwiICkgJiYgcHJvdG8uY29uc3RydWN0b3I7XG5cdFx0cmV0dXJuIHR5cGVvZiBDdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgZm5Ub1N0cmluZy5jYWxsKCBDdG9yICkgPT09IE9iamVjdEZ1bmN0aW9uU3RyaW5nO1xuXHR9LFxuXG5cdGlzRW1wdHlPYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIG5hbWU7XG5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0Ly8gRXZhbHVhdGVzIGEgc2NyaXB0IGluIGEgcHJvdmlkZWQgY29udGV4dDsgZmFsbHMgYmFjayB0byB0aGUgZ2xvYmFsIG9uZVxuXHQvLyBpZiBub3Qgc3BlY2lmaWVkLlxuXHRnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSwgb3B0aW9ucywgZG9jICkge1xuXHRcdERPTUV2YWwoIGNvZGUsIHsgbm9uY2U6IG9wdGlvbnMgJiYgb3B0aW9ucy5ub25jZSB9LCBkb2MgKTtcblx0fSxcblxuXHRlYWNoOiBmdW5jdGlvbiggb2JqLCBjYWxsYmFjayApIHtcblx0XHR2YXIgbGVuZ3RoLCBpID0gMDtcblxuXHRcdGlmICggaXNBcnJheUxpa2UoIG9iaiApICkge1xuXHRcdFx0bGVuZ3RoID0gb2JqLmxlbmd0aDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKCBpIGluIG9iaiApIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqO1xuXHR9LFxuXG5cdC8vIHJlc3VsdHMgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkge1xuXHRcdHZhciByZXQgPSByZXN1bHRzIHx8IFtdO1xuXG5cdFx0aWYgKCBhcnIgIT0gbnVsbCApIHtcblx0XHRcdGlmICggaXNBcnJheUxpa2UoIE9iamVjdCggYXJyICkgKSApIHtcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCByZXQsXG5cdFx0XHRcdFx0dHlwZW9mIGFyciA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0XHRbIGFyciBdIDogYXJyXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmNhbGwoIHJldCwgYXJyICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHRpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyLCBpICkge1xuXHRcdHJldHVybiBhcnIgPT0gbnVsbCA/IC0xIDogaW5kZXhPZi5jYWxsKCBhcnIsIGVsZW0sIGkgKTtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRtZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7XG5cdFx0dmFyIGxlbiA9ICtzZWNvbmQubGVuZ3RoLFxuXHRcdFx0aiA9IDAsXG5cdFx0XHRpID0gZmlyc3QubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTtcblx0XHR9XG5cblx0XHRmaXJzdC5sZW5ndGggPSBpO1xuXG5cdFx0cmV0dXJuIGZpcnN0O1xuXHR9LFxuXG5cdGdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludmVydCApIHtcblx0XHR2YXIgY2FsbGJhY2tJbnZlcnNlLFxuXHRcdFx0bWF0Y2hlcyA9IFtdLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXG5cdFx0XHRjYWxsYmFja0V4cGVjdCA9ICFpbnZlcnQ7XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zXG5cdFx0Ly8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb25cblx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdGNhbGxiYWNrSW52ZXJzZSA9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApO1xuXHRcdFx0aWYgKCBjYWxsYmFja0ludmVyc2UgIT09IGNhbGxiYWNrRXhwZWN0ICkge1xuXHRcdFx0XHRtYXRjaGVzLnB1c2goIGVsZW1zWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlcztcblx0fSxcblxuXHQvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7XG5cdFx0dmFyIGxlbmd0aCwgdmFsdWUsXG5cdFx0XHRpID0gMCxcblx0XHRcdHJldCA9IFtdO1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyIG5ldyB2YWx1ZXNcblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBlbGVtcyApICkge1xuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCxcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBlbGVtcyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRcdHJldHVybiBmbGF0KCByZXQgKTtcblx0fSxcblxuXHQvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHNcblx0Z3VpZDogMSxcblxuXHQvLyBqUXVlcnkuc3VwcG9ydCBpcyBub3QgdXNlZCBpbiBDb3JlIGJ1dCBvdGhlciBwcm9qZWN0cyBhdHRhY2ggdGhlaXJcblx0Ly8gcHJvcGVydGllcyB0byBpdCBzbyBpdCBuZWVkcyB0byBleGlzdC5cblx0c3VwcG9ydDogc3VwcG9ydFxufSApO1xuXG5pZiAoIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiApIHtcblx0alF1ZXJ5LmZuWyBTeW1ib2wuaXRlcmF0b3IgXSA9IGFyclsgU3ltYm9sLml0ZXJhdG9yIF07XG59XG5cbi8vIFBvcHVsYXRlIHRoZSBjbGFzczJ0eXBlIG1hcFxualF1ZXJ5LmVhY2goIFwiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2xcIi5zcGxpdCggXCIgXCIgKSxcblx0ZnVuY3Rpb24oIF9pLCBuYW1lICkge1xuXHRcdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHR9ICk7XG5cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKCBvYmogKSB7XG5cblx0Ly8gU3VwcG9ydDogcmVhbCBpT1MgOC4yIG9ubHkgKG5vdCByZXByb2R1Y2libGUgaW4gc2ltdWxhdG9yKVxuXHQvLyBgaW5gIGNoZWNrIHVzZWQgdG8gcHJldmVudCBKSVQgZXJyb3IgKGdoLTIxNDUpXG5cdC8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlc1xuXHQvLyByZWdhcmRpbmcgTm9kZWxpc3QgbGVuZ3RoIGluIElFXG5cdHZhciBsZW5ndGggPSAhIW9iaiAmJiBcImxlbmd0aFwiIGluIG9iaiAmJiBvYmoubGVuZ3RoLFxuXHRcdHR5cGUgPSB0b1R5cGUoIG9iaiApO1xuXG5cdGlmICggaXNGdW5jdGlvbiggb2JqICkgfHwgaXNXaW5kb3coIG9iaiApICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB0eXBlID09PSBcImFycmF5XCIgfHwgbGVuZ3RoID09PSAwIHx8XG5cdFx0dHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajtcbn1cbnZhciBTaXp6bGUgPVxuLyohXG4gKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2Mi4zLjZcbiAqIGh0dHBzOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cHM6Ly9qcy5mb3VuZGF0aW9uL1xuICpcbiAqIERhdGU6IDIwMjEtMDItMTZcbiAqL1xuKCBmdW5jdGlvbiggd2luZG93ICkge1xudmFyIGksXG5cdHN1cHBvcnQsXG5cdEV4cHIsXG5cdGdldFRleHQsXG5cdGlzWE1MLFxuXHR0b2tlbml6ZSxcblx0Y29tcGlsZSxcblx0c2VsZWN0LFxuXHRvdXRlcm1vc3RDb250ZXh0LFxuXHRzb3J0SW5wdXQsXG5cdGhhc0R1cGxpY2F0ZSxcblxuXHQvLyBMb2NhbCBkb2N1bWVudCB2YXJzXG5cdHNldERvY3VtZW50LFxuXHRkb2N1bWVudCxcblx0ZG9jRWxlbSxcblx0ZG9jdW1lbnRJc0hUTUwsXG5cdHJidWdneVFTQSxcblx0cmJ1Z2d5TWF0Y2hlcyxcblx0bWF0Y2hlcyxcblx0Y29udGFpbnMsXG5cblx0Ly8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YVxuXHRleHBhbmRvID0gXCJzaXp6bGVcIiArIDEgKiBuZXcgRGF0ZSgpLFxuXHRwcmVmZXJyZWREb2MgPSB3aW5kb3cuZG9jdW1lbnQsXG5cdGRpcnJ1bnMgPSAwLFxuXHRkb25lID0gMCxcblx0Y2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRjb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0bm9ubmF0aXZlU2VsZWN0b3JDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9LFxuXG5cdC8vIEluc3RhbmNlIG1ldGhvZHNcblx0aGFzT3duID0gKCB7fSApLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaE5hdGl2ZSA9IGFyci5wdXNoLFxuXHRwdXNoID0gYXJyLnB1c2gsXG5cdHNsaWNlID0gYXJyLnNsaWNlLFxuXG5cdC8vIFVzZSBhIHN0cmlwcGVkLWRvd24gaW5kZXhPZiBhcyBpdCdzIGZhc3RlciB0aGFuIG5hdGl2ZVxuXHQvLyBodHRwczovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81XG5cdGluZGV4T2YgPSBmdW5jdGlvbiggbGlzdCwgZWxlbSApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRsZW4gPSBsaXN0Lmxlbmd0aDtcblx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGlmICggbGlzdFsgaSBdID09PSBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9LFxuXG5cdGJvb2xlYW5zID0gXCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58XCIgK1xuXHRcdFwiaXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLFxuXG5cdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZVxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxuXG5cdC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3Mtc3ludGF4LTMvI2lkZW50LXRva2VuLWRpYWdyYW1cblx0aWRlbnRpZmllciA9IFwiKD86XFxcXFxcXFxbXFxcXGRhLWZBLUZdezEsNn1cIiArIHdoaXRlc3BhY2UgK1xuXHRcdFwiP3xcXFxcXFxcXFteXFxcXHJcXFxcblxcXFxmXXxbXFxcXHctXXxbXlxcMC1cXFxceDdmXSkrXCIsXG5cblx0Ly8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzXG5cdGF0dHJpYnV0ZXMgPSBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKFwiICsgaWRlbnRpZmllciArIFwiKSg/OlwiICsgd2hpdGVzcGFjZSArXG5cblx0XHQvLyBPcGVyYXRvciAoY2FwdHVyZSAyKVxuXHRcdFwiKihbKl4kfCF+XT89KVwiICsgd2hpdGVzcGFjZSArXG5cblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV1cblx0XHQvLyBvciBzdHJpbmdzIFtjYXB0dXJlIDMgb3IgY2FwdHVyZSA0XVwiXG5cdFx0XCIqKD86JygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwifChcIiArIGlkZW50aWZpZXIgKyBcIikpfClcIiArXG5cdFx0d2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsXG5cblx0cHNldWRvcyA9IFwiOihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcXFxcKChcIiArXG5cblx0XHQvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgcHJlRmlsdGVyLCBwcmVmZXIgYXJndW1lbnRzOlxuXHRcdC8vIDEuIHF1b3RlZCAoY2FwdHVyZSAzOyBjYXB0dXJlIDQgb3IgY2FwdHVyZSA1KVxuXHRcdFwiKCcoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcIil8XCIgK1xuXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXG5cdFx0Ly8gMy4gYW55dGhpbmcgZWxzZSAoY2FwdHVyZSAyKVxuXHRcdFwiLipcIiArXG5cdFx0XCIpXFxcXCl8KVwiLFxuXG5cdC8vIExlYWRpbmcgYW5kIG5vbi1lc2NhcGVkIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGNhcHR1cmluZyBzb21lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMgcHJlY2VkaW5nIHRoZSBsYXR0ZXJcblx0cndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgXCIrXCIsIFwiZ1wiICksXG5cdHJ0cmltID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIrfCgoPzpefFteXFxcXFxcXFxdKSg/OlxcXFxcXFxcLikqKVwiICtcblx0XHR3aGl0ZXNwYWNlICsgXCIrJFwiLCBcImdcIiApLFxuXG5cdHJjb21tYSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKixcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXHRyY29tYmluYXRvcnMgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiooWz4rfl18XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcIiApLFxuXHRyZGVzY2VuZCA9IG5ldyBSZWdFeHAoIHdoaXRlc3BhY2UgKyBcInw+XCIgKSxcblxuXHRycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLFxuXHRyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoIFwiXlwiICsgaWRlbnRpZmllciArIFwiJFwiICksXG5cblx0bWF0Y2hFeHByID0ge1xuXHRcdFwiSURcIjogbmV3IFJlZ0V4cCggXCJeIyhcIiArIGlkZW50aWZpZXIgKyBcIilcIiApLFxuXHRcdFwiQ0xBU1NcIjogbmV3IFJlZ0V4cCggXCJeXFxcXC4oXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIlRBR1wiOiBuZXcgUmVnRXhwKCBcIl4oXCIgKyBpZGVudGlmaWVyICsgXCJ8WypdKVwiICksXG5cdFx0XCJBVFRSXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgYXR0cmlidXRlcyApLFxuXHRcdFwiUFNFVURPXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgcHNldWRvcyApLFxuXHRcdFwiQ0hJTERcIjogbmV3IFJlZ0V4cCggXCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXFxcKFwiICtcblx0XHRcdHdoaXRlc3BhY2UgKyBcIiooZXZlbnxvZGR8KChbKy1dfCkoXFxcXGQqKW58KVwiICsgd2hpdGVzcGFjZSArIFwiKig/OihbKy1dfClcIiArXG5cdFx0XHR3aGl0ZXNwYWNlICsgXCIqKFxcXFxkKyl8KSlcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpXCIsIFwiaVwiICksXG5cdFx0XCJib29sXCI6IG5ldyBSZWdFeHAoIFwiXig/OlwiICsgYm9vbGVhbnMgKyBcIikkXCIsIFwiaVwiICksXG5cblx0XHQvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKClcblx0XHQvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgXG5cdFx0XCJuZWVkc0NvbnRleHRcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKCg/Oi1cXFxcZCk/XFxcXGQqKVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFwpfCkoPz1bXi1dfCQpXCIsIFwiaVwiIClcblx0fSxcblxuXHRyaHRtbCA9IC9IVE1MJC9pLFxuXHRyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxcblx0cmhlYWRlciA9IC9eaFxcZCQvaSxcblxuXHRybmF0aXZlID0gL15bXntdK1xce1xccypcXFtuYXRpdmUgXFx3LyxcblxuXHQvLyBFYXNpbHktcGFyc2VhYmxlL3JldHJpZXZhYmxlIElEIG9yIFRBRyBvciBDTEFTUyBzZWxlY3RvcnNcblx0cnF1aWNrRXhwciA9IC9eKD86IyhbXFx3LV0rKXwoXFx3Kyl8XFwuKFtcXHctXSspKSQvLFxuXG5cdHJzaWJsaW5nID0gL1srfl0vLFxuXG5cdC8vIENTUyBlc2NhcGVzXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnNcblx0cnVuZXNjYXBlID0gbmV3IFJlZ0V4cCggXCJcXFxcXFxcXFtcXFxcZGEtZkEtRl17MSw2fVwiICsgd2hpdGVzcGFjZSArIFwiP3xcXFxcXFxcXChbXlxcXFxyXFxcXG5cXFxcZl0pXCIsIFwiZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBlc2NhcGUsIG5vbkhleCApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZS5zbGljZSggMSApIC0gMHgxMDAwMDtcblxuXHRcdHJldHVybiBub25IZXggP1xuXG5cdFx0XHQvLyBTdHJpcCB0aGUgYmFja3NsYXNoIHByZWZpeCBmcm9tIGEgbm9uLWhleCBlc2NhcGUgc2VxdWVuY2Vcblx0XHRcdG5vbkhleCA6XG5cblx0XHRcdC8vIFJlcGxhY2UgYSBoZXhhZGVjaW1hbCBlc2NhcGUgc2VxdWVuY2Ugd2l0aCB0aGUgZW5jb2RlZCBVbmljb2RlIGNvZGUgcG9pbnRcblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTErXG5cdFx0XHQvLyBGb3IgdmFsdWVzIG91dHNpZGUgdGhlIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSAoQk1QKSwgbWFudWFsbHkgY29uc3RydWN0IGFcblx0XHRcdC8vIHN1cnJvZ2F0ZSBwYWlyXG5cdFx0XHRoaWdoIDwgMCA/XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoID4+IDEwIHwgMHhEODAwLCBoaWdoICYgMHgzRkYgfCAweERDMDAgKTtcblx0fSxcblxuXHQvLyBDU1Mgc3RyaW5nL2lkZW50aWZpZXIgc2VyaWFsaXphdGlvblxuXHQvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI2NvbW1vbi1zZXJpYWxpemluZy1pZGlvbXNcblx0cmNzc2VzY2FwZSA9IC8oW1xcMC1cXHgxZlxceDdmXXxeLT9cXGQpfF4tJHxbXlxcMC1cXHgxZlxceDdmLVxcdUZGRkZcXHctXS9nLFxuXHRmY3NzZXNjYXBlID0gZnVuY3Rpb24oIGNoLCBhc0NvZGVQb2ludCApIHtcblx0XHRpZiAoIGFzQ29kZVBvaW50ICkge1xuXG5cdFx0XHQvLyBVKzAwMDAgTlVMTCBiZWNvbWVzIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVJcblx0XHRcdGlmICggY2ggPT09IFwiXFwwXCIgKSB7XG5cdFx0XHRcdHJldHVybiBcIlxcdUZGRkRcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udHJvbCBjaGFyYWN0ZXJzIGFuZCAoZGVwZW5kZW50IHVwb24gcG9zaXRpb24pIG51bWJlcnMgZ2V0IGVzY2FwZWQgYXMgY29kZSBwb2ludHNcblx0XHRcdHJldHVybiBjaC5zbGljZSggMCwgLTEgKSArIFwiXFxcXFwiICtcblx0XHRcdFx0Y2guY2hhckNvZGVBdCggY2gubGVuZ3RoIC0gMSApLnRvU3RyaW5nKCAxNiApICsgXCIgXCI7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXIgcG90ZW50aWFsbHktc3BlY2lhbCBBU0NJSSBjaGFyYWN0ZXJzIGdldCBiYWNrc2xhc2gtZXNjYXBlZFxuXHRcdHJldHVybiBcIlxcXFxcIiArIGNoO1xuXHR9LFxuXG5cdC8vIFVzZWQgZm9yIGlmcmFtZXNcblx0Ly8gU2VlIHNldERvY3VtZW50KClcblx0Ly8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgXCJQZXJtaXNzaW9uIERlbmllZFwiXG5cdC8vIGVycm9yIGluIElFXG5cdHVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcblx0XHRzZXREb2N1bWVudCgpO1xuXHR9LFxuXG5cdGluRGlzYWJsZWRGaWVsZHNldCA9IGFkZENvbWJpbmF0b3IoXG5cdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiZmllbGRzZXRcIjtcblx0XHR9LFxuXHRcdHsgZGlyOiBcInBhcmVudE5vZGVcIiwgbmV4dDogXCJsZWdlbmRcIiB9XG5cdCk7XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdCggYXJyID0gc2xpY2UuY2FsbCggcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMgKSApLFxuXHRcdHByZWZlcnJlZERvYy5jaGlsZE5vZGVzXG5cdCk7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjBcblx0Ly8gRGV0ZWN0IHNpbGVudGx5IGZhaWxpbmcgcHVzaC5hcHBseVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoTmF0aXZlLmFwcGx5KCB0YXJnZXQsIHNsaWNlLmNhbGwoIGVscyApICk7XG5cdFx0fSA6XG5cblx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0Ly8gT3RoZXJ3aXNlIGFwcGVuZCBkaXJlY3RseVxuXHRcdGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHtcblx0XHRcdHZhciBqID0gdGFyZ2V0Lmxlbmd0aCxcblx0XHRcdFx0aSA9IDA7XG5cblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAoIHRhcmdldFsgaisrIF0gPSBlbHNbIGkrKyBdICkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbWF0Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsXG5cdFx0bmV3Q29udGV4dCA9IGNvbnRleHQgJiYgY29udGV4dC5vd25lckRvY3VtZW50LFxuXG5cdFx0Ly8gbm9kZVR5cGUgZGVmYXVsdHMgdG8gOSwgc2luY2UgY29udGV4dCBkZWZhdWx0cyB0byBkb2N1bWVudFxuXHRcdG5vZGVUeXBlID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5O1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFJldHVybiBlYXJseSBmcm9tIGNhbGxzIHdpdGggaW52YWxpZCBzZWxlY3RvciBvciBjb250ZXh0XG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0Ly8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50c1xuXHRpZiAoICFzZWVkICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdFx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XG5cblx0XHRpZiAoIGRvY3VtZW50SXNIVE1MICkge1xuXG5cdFx0XHQvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgXCJnZXQqQnkqXCIgRE9NIG1ldGhvZFxuXHRcdFx0Ly8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KVxuXHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMTEgJiYgKCBtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSApICkge1xuXG5cdFx0XHRcdC8vIElEIHNlbGVjdG9yXG5cdFx0XHRcdGlmICggKCBtID0gbWF0Y2hbIDEgXSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRG9jdW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdGlmICggbm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSApICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHRcdC8vIGdldEVsZW1lbnRCeUlkIGNhbiBtYXRjaCBlbGVtZW50cyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdFx0aWYgKCBlbGVtLmlkID09PSBtICkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEVsZW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHQvLyBUT0RPOiBpZGVudGlmeSB2ZXJzaW9uc1xuXHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0aWYgKCBuZXdDb250ZXh0ICYmICggZWxlbSA9IG5ld0NvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSApICYmXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbS5pZCA9PT0gbSApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFR5cGUgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbIDIgXSApIHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBzZWxlY3RvciApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdFx0Ly8gQ2xhc3Mgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggKCBtID0gbWF0Y2hbIDMgXSApICYmIHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJlxuXHRcdFx0XHRcdGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGFrZSBhZHZhbnRhZ2Ugb2YgcXVlcnlTZWxlY3RvckFsbFxuXHRcdFx0aWYgKCBzdXBwb3J0LnFzYSAmJlxuXHRcdFx0XHQhbm9ubmF0aXZlU2VsZWN0b3JDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdICYmXG5cdFx0XHRcdCggIXJidWdneVFTQSB8fCAhcmJ1Z2d5UVNBLnRlc3QoIHNlbGVjdG9yICkgKSAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDggb25seVxuXHRcdFx0XHQvLyBFeGNsdWRlIG9iamVjdCBlbGVtZW50c1xuXHRcdFx0XHQoIG5vZGVUeXBlICE9PSAxIHx8IGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJvYmplY3RcIiApICkge1xuXG5cdFx0XHRcdG5ld1NlbGVjdG9yID0gc2VsZWN0b3I7XG5cdFx0XHRcdG5ld0NvbnRleHQgPSBjb250ZXh0O1xuXG5cdFx0XHRcdC8vIHFTQSBjb25zaWRlcnMgZWxlbWVudHMgb3V0c2lkZSBhIHNjb3Bpbmcgcm9vdCB3aGVuIGV2YWx1YXRpbmcgY2hpbGQgb3Jcblx0XHRcdFx0Ly8gZGVzY2VuZGFudCBjb21iaW5hdG9ycywgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudC5cblx0XHRcdFx0Ly8gSW4gc3VjaCBjYXNlcywgd2Ugd29yayBhcm91bmQgdGhlIGJlaGF2aW9yIGJ5IHByZWZpeGluZyBldmVyeSBzZWxlY3RvciBpbiB0aGVcblx0XHRcdFx0Ly8gbGlzdCB3aXRoIGFuIElEIHNlbGVjdG9yIHJlZmVyZW5jaW5nIHRoZSBzY29wZSBjb250ZXh0LlxuXHRcdFx0XHQvLyBUaGUgdGVjaG5pcXVlIGhhcyB0byBiZSB1c2VkIGFzIHdlbGwgd2hlbiBhIGxlYWRpbmcgY29tYmluYXRvciBpcyB1c2VkXG5cdFx0XHRcdC8vIGFzIHN1Y2ggc2VsZWN0b3JzIGFyZSBub3QgcmVjb2duaXplZCBieSBxdWVyeVNlbGVjdG9yQWxsLlxuXHRcdFx0XHQvLyBUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhpcyB0ZWNobmlxdWUuXG5cdFx0XHRcdGlmICggbm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHQoIHJkZXNjZW5kLnRlc3QoIHNlbGVjdG9yICkgfHwgcmNvbWJpbmF0b3JzLnRlc3QoIHNlbGVjdG9yICkgKSApIHtcblxuXHRcdFx0XHRcdC8vIEV4cGFuZCBjb250ZXh0IGZvciBzaWJsaW5nIHNlbGVjdG9yc1xuXHRcdFx0XHRcdG5ld0NvbnRleHQgPSByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fFxuXHRcdFx0XHRcdFx0Y29udGV4dDtcblxuXHRcdFx0XHRcdC8vIFdlIGNhbiB1c2UgOnNjb3BlIGluc3RlYWQgb2YgdGhlIElEIGhhY2sgaWYgdGhlIGJyb3dzZXJcblx0XHRcdFx0XHQvLyBzdXBwb3J0cyBpdCAmIGlmIHdlJ3JlIG5vdCBjaGFuZ2luZyB0aGUgY29udGV4dC5cblx0XHRcdFx0XHRpZiAoIG5ld0NvbnRleHQgIT09IGNvbnRleHQgfHwgIXN1cHBvcnQuc2NvcGUgKSB7XG5cblx0XHRcdFx0XHRcdC8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0XHRpZiAoICggbmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoIFwiaWRcIiApICkgKSB7XG5cdFx0XHRcdFx0XHRcdG5pZCA9IG5pZC5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0LnNldEF0dHJpYnV0ZSggXCJpZFwiLCAoIG5pZCA9IGV4cGFuZG8gKSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZWZpeCBldmVyeSBzZWxlY3RvciBpbiB0aGUgbGlzdFxuXHRcdFx0XHRcdGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdFx0XHRcdGkgPSBncm91cHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0Z3JvdXBzWyBpIF0gPSAoIG5pZCA/IFwiI1wiICsgbmlkIDogXCI6c2NvcGVcIiApICsgXCIgXCIgK1xuXHRcdFx0XHRcdFx0XHR0b1NlbGVjdG9yKCBncm91cHNbIGkgXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCBcIixcIiApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0bmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0fSBjYXRjaCAoIHFzYUVycm9yICkge1xuXHRcdFx0XHRcdG5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGUoIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0aWYgKCBuaWQgPT09IGV4cGFuZG8gKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cblx0XHQvLyBVc2UgKGtleSArIFwiIFwiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KVxuXHRcdGlmICgga2V5cy5wdXNoKCBrZXkgKyBcIiBcIiApID4gRXhwci5jYWNoZUxlbmd0aCApIHtcblxuXHRcdFx0Ly8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVzXG5cdFx0XHRkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdO1xuXHRcdH1cblx0XHRyZXR1cm4gKCBjYWNoZVsga2V5ICsgXCIgXCIgXSA9IHZhbHVlICk7XG5cdH1cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZmllbGRzZXRcIiApO1xuXG5cdHRyeSB7XG5cdFx0cmV0dXJuICEhZm4oIGVsICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBmaW5hbGx5IHtcblxuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZWwucGFyZW50Tm9kZSApIHtcblx0XHRcdGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsICk7XG5cdFx0fVxuXG5cdFx0Ly8gcmVsZWFzZSBtZW1vcnkgaW4gSUVcblx0XHRlbCA9IG51bGw7XG5cdH1cbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBzYW1lIGhhbmRsZXIgZm9yIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGF0dHJzXG4gKiBAcGFyYW0ge1N0cmluZ30gYXR0cnMgUGlwZS1zZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWRcbiAqL1xuZnVuY3Rpb24gYWRkSGFuZGxlKCBhdHRycywgaGFuZGxlciApIHtcblx0dmFyIGFyciA9IGF0dHJzLnNwbGl0KCBcInxcIiApLFxuXHRcdGkgPSBhcnIubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdEV4cHIuYXR0ckhhbmRsZVsgYXJyWyBpIF0gXSA9IGhhbmRsZXI7XG5cdH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZG9jdW1lbnQgb3JkZXIgb2YgdHdvIHNpYmxpbmdzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGFcbiAqIEBwYXJhbSB7RWxlbWVudH0gYlxuICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBsZXNzIHRoYW4gMCBpZiBhIHByZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9sbG93cyBiXG4gKi9cbmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHtcblx0dmFyIGN1ciA9IGIgJiYgYSxcblx0XHRkaWZmID0gY3VyICYmIGEubm9kZVR5cGUgPT09IDEgJiYgYi5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0YS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7XG5cblx0Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzXG5cdGlmICggZGlmZiApIHtcblx0XHRyZXR1cm4gZGlmZjtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGIgZm9sbG93cyBhXG5cdGlmICggY3VyICkge1xuXHRcdHdoaWxlICggKCBjdXIgPSBjdXIubmV4dFNpYmxpbmcgKSApIHtcblx0XHRcdGlmICggY3VyID09PSBiICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGEgPyAxIDogLTE7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHJldHVybiAoIG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiICkgJiYgZWxlbS50eXBlID09PSB0eXBlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRpc2FibGVkIHRydWUgZm9yIDpkaXNhYmxlZDsgZmFsc2UgZm9yIDplbmFibGVkXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHtcblxuXHQvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGVcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkXG5cdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWRcblx0XHRpZiAoIFwiZm9ybVwiIGluIGVsZW0gKSB7XG5cblx0XHRcdC8vIENoZWNrIGZvciBpbmhlcml0ZWQgZGlzYWJsZWRuZXNzIG9uIHJlbGV2YW50IG5vbi1kaXNhYmxlZCBlbGVtZW50czpcblx0XHRcdC8vICogbGlzdGVkIGZvcm0tYXNzb2NpYXRlZCBlbGVtZW50cyBpbiBhIGRpc2FibGVkIGZpZWxkc2V0XG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1mZS1kaXNhYmxlZFxuXHRcdFx0Ly8gKiBvcHRpb24gZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0Ly8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkXG5cdFx0XHQvLyBBbGwgc3VjaCBlbGVtZW50cyBoYXZlIGEgXCJmb3JtXCIgcHJvcGVydHkuXG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSAmJiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHQvLyBPcHRpb24gZWxlbWVudHMgZGVmZXIgdG8gYSBwYXJlbnQgb3B0Z3JvdXAgaWYgcHJlc2VudFxuXHRcdFx0XHRpZiAoIFwibGFiZWxcIiBpbiBlbGVtICkge1xuXHRcdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLnBhcmVudE5vZGUuZGlzYWJsZWQgPT09IGRpc2FibGVkO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDExXG5cdFx0XHRcdC8vIFVzZSB0aGUgaXNEaXNhYmxlZCBzaG9ydGN1dCBwcm9wZXJ0eSB0byBjaGVjayBmb3IgZGlzYWJsZWQgZmllbGRzZXQgYW5jZXN0b3JzXG5cdFx0XHRcdHJldHVybiBlbGVtLmlzRGlzYWJsZWQgPT09IGRpc2FibGVkIHx8XG5cblx0XHRcdFx0XHQvLyBXaGVyZSB0aGVyZSBpcyBubyBpc0Rpc2FibGVkLCBjaGVjayBtYW51YWxseVxuXHRcdFx0XHRcdC8qIGpzaGludCAtVzAxOCAqL1xuXHRcdFx0XHRcdGVsZW0uaXNEaXNhYmxlZCAhPT0gIWRpc2FibGVkICYmXG5cdFx0XHRcdFx0aW5EaXNhYmxlZEZpZWxkc2V0KCBlbGVtICkgPT09IGRpc2FibGVkO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cblx0XHQvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuXG5cdFx0Ly8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0XG5cdFx0Ly8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuXG5cdFx0fSBlbHNlIGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVtYWluaW5nIGVsZW1lbnRzIGFyZSBuZWl0aGVyIDplbmFibGVkIG5vciA6ZGlzYWJsZWRcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFsc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBhcmd1bWVudCApIHtcblx0XHRhcmd1bWVudCA9ICthcmd1bWVudDtcblx0XHRyZXR1cm4gbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoIGogPSBtYXRjaEluZGV4ZXNbIGkgXSApIF0gKSB7XG5cdFx0XHRcdFx0c2VlZFsgaiBdID0gISggbWF0Y2hlc1sgaiBdID0gc2VlZFsgaiBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0gKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgYSBub2RlIGZvciB2YWxpZGl0eSBhcyBhIFNpenpsZSBjb250ZXh0XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dFxuICogQHJldHVybnMge0VsZW1lbnR8T2JqZWN0fEJvb2xlYW59IFRoZSBpbnB1dCBub2RlIGlmIGFjY2VwdGFibGUsIG90aGVyd2lzZSBhIGZhbHN5IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkge1xuXHRyZXR1cm4gY29udGV4dCAmJiB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb250ZXh0O1xufVxuXG4vLyBFeHBvc2Ugc3VwcG9ydCB2YXJzIGZvciBjb252ZW5pZW5jZVxuc3VwcG9ydCA9IFNpenpsZS5zdXBwb3J0ID0ge307XG5cbi8qKlxuICogRGV0ZWN0cyBYTUwgbm9kZXNcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50XG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZmYgZWxlbSBpcyBhIG5vbi1IVE1MIFhNTCBub2RlXG4gKi9cbmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBuYW1lc3BhY2UgPSBlbGVtICYmIGVsZW0ubmFtZXNwYWNlVVJJLFxuXHRcdGRvY0VsZW0gPSBlbGVtICYmICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKS5kb2N1bWVudEVsZW1lbnQ7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD04XG5cdC8vIEFzc3VtZSBIVE1MIHdoZW4gZG9jdW1lbnRFbGVtZW50IGRvZXNuJ3QgeWV0IGV4aXN0LCBzdWNoIGFzIGluc2lkZSBsb2FkaW5nIGlmcmFtZXNcblx0Ly8gaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzQ4MzNcblx0cmV0dXJuICFyaHRtbC50ZXN0KCBuYW1lc3BhY2UgfHwgZG9jRWxlbSAmJiBkb2NFbGVtLm5vZGVOYW1lIHx8IFwiSFRNTFwiICk7XG59O1xuXG4vKipcbiAqIFNldHMgZG9jdW1lbnQtcmVsYXRlZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gW2RvY10gQW4gZWxlbWVudCBvciBkb2N1bWVudCBvYmplY3QgdG8gdXNlIHRvIHNldCB0aGUgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAqL1xuc2V0RG9jdW1lbnQgPSBTaXp6bGUuc2V0RG9jdW1lbnQgPSBmdW5jdGlvbiggbm9kZSApIHtcblx0dmFyIGhhc0NvbXBhcmUsIHN1YldpbmRvdyxcblx0XHRkb2MgPSBub2RlID8gbm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUgOiBwcmVmZXJyZWREb2M7XG5cblx0Ly8gUmV0dXJuIGVhcmx5IGlmIGRvYyBpcyBpbnZhbGlkIG9yIGFscmVhZHkgc2VsZWN0ZWRcblx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0aWYgKCBkb2MgPT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFVwZGF0ZSBnbG9iYWwgdmFyaWFibGVzXG5cdGRvY3VtZW50ID0gZG9jO1xuXHRkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXHRkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jdW1lbnQgKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErLCBFZGdlIDEyIC0gMTgrXG5cdC8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgXCJwZXJtaXNzaW9uIGRlbmllZFwiIGVycm9ycyAoalF1ZXJ5ICMxMzkzNilcblx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0aWYgKCBwcmVmZXJyZWREb2MgIT0gZG9jdW1lbnQgJiZcblx0XHQoIHN1YldpbmRvdyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3ICkgJiYgc3ViV2luZG93LnRvcCAhPT0gc3ViV2luZG93ICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgMTEsIEVkZ2Vcblx0XHRpZiAoIHN1YldpbmRvdy5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0c3ViV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIFwidW5sb2FkXCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTAgb25seVxuXHRcdH0gZWxzZSBpZiAoIHN1YldpbmRvdy5hdHRhY2hFdmVudCApIHtcblx0XHRcdHN1YldpbmRvdy5hdHRhY2hFdmVudCggXCJvbnVubG9hZFwiLCB1bmxvYWRIYW5kbGVyICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUUgOCAtIDExKywgRWRnZSAxMiAtIDE4KywgQ2hyb21lIDw9MTYgLSAyNSBvbmx5LCBGaXJlZm94IDw9My42IC0gMzEgb25seSxcblx0Ly8gU2FmYXJpIDQgLSA1IG9ubHksIE9wZXJhIDw9MTEuNiAtIDEyLnggb25seVxuXHQvLyBJRS9FZGdlICYgb2xkZXIgYnJvd3NlcnMgZG9uJ3Qgc3VwcG9ydCB0aGUgOnNjb3BlIHBzZXVkby1jbGFzcy5cblx0Ly8gU3VwcG9ydDogU2FmYXJpIDYuMCBvbmx5XG5cdC8vIFNhZmFyaSA2LjAgc3VwcG9ydHMgOnNjb3BlIGJ1dCBpdCdzIGFuIGFsaWFzIG9mIDpyb290IHRoZXJlLlxuXHRzdXBwb3J0LnNjb3BlID0gYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cdFx0ZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICk7XG5cdFx0cmV0dXJuIHR5cGVvZiBlbC5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHQhZWwucXVlcnlTZWxlY3RvckFsbCggXCI6c2NvcGUgZmllbGRzZXQgZGl2XCIgKS5sZW5ndGg7XG5cdH0gKTtcblxuXHQvKiBBdHRyaWJ1dGVzXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBTdXBwb3J0OiBJRTw4XG5cdC8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllc1xuXHQvLyAoZXhjZXB0aW5nIElFOCBib29sZWFucylcblx0c3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cdFx0ZWwuY2xhc3NOYW1lID0gXCJpXCI7XG5cdFx0cmV0dXJuICFlbC5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NOYW1lXCIgKTtcblx0fSApO1xuXG5cdC8qIGdldEVsZW1lbnQocylCeSpcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSByZXR1cm5zIG9ubHkgZWxlbWVudHNcblx0c3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA9IGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRcdGVsLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCBcIlwiICkgKTtcblx0XHRyZXR1cm4gIWVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcIipcIiApLmxlbmd0aDtcblx0fSApO1xuXG5cdC8vIFN1cHBvcnQ6IElFPDlcblx0c3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICk7XG5cblx0Ly8gU3VwcG9ydDogSUU8MTBcblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lXG5cdC8vIFRoZSBicm9rZW4gZ2V0RWxlbWVudEJ5SWQgbWV0aG9kcyBkb24ndCBwaWNrIHVwIHByb2dyYW1tYXRpY2FsbHktc2V0IG5hbWVzLFxuXHQvLyBzbyB1c2UgYSByb3VuZGFib3V0IGdldEVsZW1lbnRzQnlOYW1lIHRlc3Rcblx0c3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cdFx0ZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5pZCA9IGV4cGFuZG87XG5cdFx0cmV0dXJuICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSB8fCAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIGV4cGFuZG8gKS5sZW5ndGg7XG5cdH0gKTtcblxuXHQvLyBJRCBmaWx0ZXIgYW5kIGZpbmRcblx0aWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7XG5cdFx0RXhwci5maWx0ZXJbIFwiSURcIiBdID0gZnVuY3Rpb24oIGlkICkge1xuXHRcdFx0dmFyIGF0dHJJZCA9IGlkLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggXCJpZFwiICkgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblx0XHRFeHByLmZpbmRbIFwiSURcIiBdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHRyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRFeHByLmZpbHRlclsgXCJJRFwiIF0gPSAgZnVuY3Rpb24oIGlkICkge1xuXHRcdFx0dmFyIGF0dHJJZCA9IGlkLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciBub2RlID0gdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuXHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggXCJpZFwiICk7XG5cdFx0XHRcdHJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDYgLSA3IG9ubHlcblx0XHQvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0XG5cdFx0RXhwci5maW5kWyBcIklEXCIgXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBub2RlLCBpLCBlbGVtcyxcblx0XHRcdFx0XHRlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHQvLyBWZXJpZnkgdGhlIGlkIGF0dHJpYnV0ZVxuXHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIFwiaWRcIiApO1xuXHRcdFx0XHRcdGlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHtcblx0XHRcdFx0XHRcdHJldHVybiBbIGVsZW0gXTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBGYWxsIGJhY2sgb24gZ2V0RWxlbWVudHNCeU5hbWVcblx0XHRcdFx0XHRlbGVtcyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUoIGlkICk7XG5cdFx0XHRcdFx0aSA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGVsZW0gPSBlbGVtc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIFwiaWRcIiApO1xuXHRcdFx0XHRcdFx0aWYgKCBub2RlICYmIG5vZGUudmFsdWUgPT09IGlkICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gWyBlbGVtIF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIFtdO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHQvLyBUYWdcblx0RXhwci5maW5kWyBcIlRBR1wiIF0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID9cblx0XHRmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBEb2N1bWVudEZyYWdtZW50IG5vZGVzIGRvbid0IGhhdmUgZ0VCVE5cblx0XHRcdH0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgKTtcblx0XHRcdH1cblx0XHR9IDpcblxuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0dG1wID0gW10sXG5cdFx0XHRcdGkgPSAwLFxuXG5cdFx0XHRcdC8vIEJ5IGhhcHB5IGNvaW5jaWRlbmNlLCBhIChicm9rZW4pIGdFQlROIGFwcGVhcnMgb24gRG9jdW1lbnRGcmFnbWVudCBub2RlcyB0b29cblx0XHRcdFx0cmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzXG5cdFx0XHRpZiAoIHRhZyA9PT0gXCIqXCIgKSB7XG5cdFx0XHRcdHdoaWxlICggKCBlbGVtID0gcmVzdWx0c1sgaSsrIF0gKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHR0bXAucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0bXA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHR9O1xuXG5cdC8vIENsYXNzXG5cdEV4cHIuZmluZFsgXCJDTEFTU1wiIF0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwgY29udGV4dCApIHtcblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTtcblx0XHR9XG5cdH07XG5cblx0LyogUVNBL21hdGNoZXNTZWxlY3RvclxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydFxuXG5cdC8vIG1hdGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJhIDExLjUpXG5cdHJidWdneU1hdGNoZXMgPSBbXTtcblxuXHQvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKVxuXHQvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3Jcblx0Ly8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZVxuXHQvLyBTbywgd2UgYWxsb3cgOmZvY3VzIHRvIHBhc3MgdGhyb3VnaCBRU0EgYWxsIHRoZSB0aW1lIHRvIGF2b2lkIHRoZSBJRSBlcnJvclxuXHQvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4XG5cdHJidWdneVFTQSA9IFtdO1xuXG5cdGlmICggKCBzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApICkgKSB7XG5cblx0XHQvLyBCdWlsZCBRU0EgcmVnZXhcblx0XHQvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pXG5cdFx0YXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cblx0XHRcdHZhciBpbnB1dDtcblxuXHRcdFx0Ly8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZVxuXHRcdFx0Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5XG5cdFx0XHQvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSxcblx0XHRcdC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoXG5cdFx0XHQvLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTlcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaW5uZXJIVE1MID0gXCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBpZD0nXCIgKyBleHBhbmRvICsgXCItXFxyXFxcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+XCIgK1xuXHRcdFx0XHRcIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTZcblx0XHRcdC8vIE5vdGhpbmcgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gZW1wdHkgc3RyaW5ncyBmb2xsb3cgXj0gb3IgJD0gb3IgKj1cblx0XHRcdC8vIFRoZSB0ZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHVua25vd24gaW4gT3BlcmEgYnV0IFwic2FmZVwiIGZvciBXaW5SVFxuXHRcdFx0Ly8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW21zYWxsb3djYXB0dXJlXj0nJ11cIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiWypeJF09XCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86Jyd8XFxcIlxcXCIpXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kIFwidmFsdWVcIiBhcmUgbm90IHRyZWF0ZWQgY29ycmVjdGx5XG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIltzZWxlY3RlZF1cIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooPzp2YWx1ZXxcIiArIGJvb2xlYW5zICsgXCIpXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lPDI5LCBBbmRyb2lkPDQuNCwgU2FmYXJpPDcuMCssIGlPUzw3LjArLCBQaGFudG9tSlM8MS45LjgrXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIltpZH49XCIgKyBleHBhbmRvICsgXCItXVwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJ+PVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNSAtIDE4K1xuXHRcdFx0Ly8gSUUgMTEvRWRnZSBkb24ndCBmaW5kIGVsZW1lbnRzIG9uIGEgYFtuYW1lPScnXWAgcXVlcnkgaW4gc29tZSBjYXNlcy5cblx0XHRcdC8vIEFkZGluZyBhIHRlbXBvcmFyeSBhdHRyaWJ1dGUgdG8gdGhlIGRvY3VtZW50IGJlZm9yZSB0aGUgc2VsZWN0aW9uIHdvcmtzXG5cdFx0XHQvLyBhcm91bmQgdGhlIGlzc3VlLlxuXHRcdFx0Ly8gSW50ZXJlc3RpbmdseSwgSUUgMTAgJiBvbGRlciBkb24ndCBzZWVtIHRvIGhhdmUgdGhlIGlzc3VlLlxuXHRcdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwiXCIgKTtcblx0XHRcdGVsLmFwcGVuZENoaWxkKCBpbnB1dCApO1xuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCJbbmFtZT0nJ11cIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIipuYW1lXCIgKyB3aGl0ZXNwYWNlICsgXCIqPVwiICtcblx0XHRcdFx0XHR3aGl0ZXNwYWNlICsgXCIqKD86Jyd8XFxcIlxcXCIpXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gV2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHNcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkXG5cdFx0XHQvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgYW5kIHdpbGwgbm90IHNlZSBsYXRlciB0ZXN0c1xuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCI6Y2hlY2tlZFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCI6Y2hlY2tlZFwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA4KywgaU9TIDgrXG5cdFx0XHQvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM2ODUxXG5cdFx0XHQvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcImEjXCIgKyBleHBhbmRvICsgXCIrKlwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCIuIy4rWyt+XVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD0zLjYgLSA1IG9ubHlcblx0XHRcdC8vIE9sZCBGaXJlZm94IGRvZXNuJ3QgdGhyb3cgb24gYSBiYWRseS1lc2NhcGVkIGlkZW50aWZpZXIuXG5cdFx0XHRlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIlxcXFxcXGZcIiApO1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiW1xcXFxyXFxcXG5cXFxcZl1cIiApO1xuXHRcdH0gKTtcblxuXHRcdGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0ZWwuaW5uZXJIVE1MID0gXCI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPlwiICtcblx0XHRcdFx0XCI8c2VsZWN0IGRpc2FibGVkPSdkaXNhYmxlZCc+PG9wdGlvbi8+PC9zZWxlY3Q+XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFdpbmRvd3MgOCBOYXRpdmUgQXBwc1xuXHRcdFx0Ly8gVGhlIHR5cGUgYW5kIG5hbWUgYXR0cmlidXRlcyBhcmUgcmVzdHJpY3RlZCBkdXJpbmcgLmlubmVySFRNTCBhc3NpZ25tZW50XG5cdFx0XHR2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwiaGlkZGVuXCIgKTtcblx0XHRcdGVsLmFwcGVuZENoaWxkKCBpbnB1dCApLnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwiRFwiICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gRW5mb3JjZSBjYXNlLXNlbnNpdGl2aXR5IG9mIG5hbWUgYXR0cmlidXRlXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW25hbWU9ZF1cIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwibmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKlsqXiR8IX5dPz1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKVxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbCggXCI6ZW5hYmxlZFwiICkubGVuZ3RoICE9PSAyICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCI6ZW5hYmxlZFwiLCBcIjpkaXNhYmxlZFwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0XHRcdC8vIElFJ3MgOmRpc2FibGVkIHNlbGVjdG9yIGRvZXMgbm90IHBpY2sgdXAgdGhlIGNoaWxkcmVuIG9mIGRpc2FibGVkIGZpZWxkc2V0c1xuXHRcdFx0ZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5kaXNhYmxlZCA9IHRydWU7XG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiOmRpc2FibGVkXCIgKS5sZW5ndGggIT09IDIgKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjplbmFibGVkXCIsIFwiOmRpc2FibGVkXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogT3BlcmEgMTAgLSAxMSBvbmx5XG5cdFx0XHQvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJvdyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvc1xuXHRcdFx0ZWwucXVlcnlTZWxlY3RvckFsbCggXCIqLDp4XCIgKTtcblx0XHRcdHJidWdneVFTQS5wdXNoKCBcIiwuKjpcIiApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggKCBzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKCBtYXRjaGVzID0gZG9jRWxlbS5tYXRjaGVzIHx8XG5cdFx0ZG9jRWxlbS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ub01hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubXNNYXRjaGVzU2VsZWN0b3IgKSApICkgKSB7XG5cblx0XHRhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblxuXHRcdFx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdFx0XHQvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KVxuXHRcdFx0c3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZWwsIFwiKlwiICk7XG5cblx0XHRcdC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb25cblx0XHRcdC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWRcblx0XHRcdG1hdGNoZXMuY2FsbCggZWwsIFwiW3MhPScnXTp4XCIgKTtcblx0XHRcdHJidWdneU1hdGNoZXMucHVzaCggXCIhPVwiLCBwc2V1ZG9zICk7XG5cdFx0fSApO1xuXHR9XG5cblx0cmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbiggXCJ8XCIgKSApO1xuXHRyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKCBcInxcIiApICk7XG5cblx0LyogQ29udGFpbnNcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXHRoYXNDb21wYXJlID0gcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICk7XG5cblx0Ly8gRWxlbWVudCBjb250YWlucyBhbm90aGVyXG5cdC8vIFB1cnBvc2VmdWxseSBzZWxmLWV4Y2x1c2l2ZVxuXHQvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZlxuXHRjb250YWlucyA9IGhhc0NvbXBhcmUgfHwgcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbnRhaW5zICkgP1xuXHRcdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0dmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSxcblx0XHRcdFx0YnVwID0gYiAmJiBiLnBhcmVudE5vZGU7XG5cdFx0XHRyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmIChcblx0XHRcdFx0YWRvd24uY29udGFpbnMgP1xuXHRcdFx0XHRcdGFkb3duLmNvbnRhaW5zKCBidXAgKSA6XG5cdFx0XHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBidXAgKSAmIDE2XG5cdFx0XHQpICk7XG5cdFx0fSA6XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHRpZiAoIGIgKSB7XG5cdFx0XHRcdHdoaWxlICggKCBiID0gYi5wYXJlbnROb2RlICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBiID09PSBhICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHQvKiBTb3J0aW5nXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBEb2N1bWVudCBvcmRlciBzb3J0aW5nXG5cdHNvcnRPcmRlciA9IGhhc0NvbXBhcmUgP1xuXHRmdW5jdGlvbiggYSwgYiApIHtcblxuXHRcdC8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsXG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdC8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb25cblx0XHR2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247XG5cdFx0aWYgKCBjb21wYXJlICkge1xuXHRcdFx0cmV0dXJuIGNvbXBhcmU7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsY3VsYXRlIHBvc2l0aW9uIGlmIGJvdGggaW5wdXRzIGJlbG9uZyB0byB0aGUgc2FtZSBkb2N1bWVudFxuXHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0Y29tcGFyZSA9ICggYS5vd25lckRvY3VtZW50IHx8IGEgKSA9PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgP1xuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkXG5cdFx0XHQxO1xuXG5cdFx0Ly8gRGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0aWYgKCBjb21wYXJlICYgMSB8fFxuXHRcdFx0KCAhc3VwcG9ydC5zb3J0RGV0YWNoZWQgJiYgYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYSApID09PSBjb21wYXJlICkgKSB7XG5cblx0XHRcdC8vIENob29zZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIHJlbGF0ZWQgdG8gb3VyIHByZWZlcnJlZCBkb2N1bWVudFxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdGlmICggYSA9PSBkb2N1bWVudCB8fCBhLm93bmVyRG9jdW1lbnQgPT0gcHJlZmVycmVkRG9jICYmXG5cdFx0XHRcdGNvbnRhaW5zKCBwcmVmZXJyZWREb2MsIGEgKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdFx0aWYgKCBiID09IGRvY3VtZW50IHx8IGIub3duZXJEb2N1bWVudCA9PSBwcmVmZXJyZWREb2MgJiZcblx0XHRcdFx0Y29udGFpbnMoIHByZWZlcnJlZERvYywgYiApICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxO1xuXHR9IDpcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cblx0XHQvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsXG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGF1cCA9IGEucGFyZW50Tm9kZSxcblx0XHRcdGJ1cCA9IGIucGFyZW50Tm9kZSxcblx0XHRcdGFwID0gWyBhIF0sXG5cdFx0XHRicCA9IFsgYiBdO1xuXG5cdFx0Ly8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWRcblx0XHRpZiAoICFhdXAgfHwgIWJ1cCApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdC8qIGVzbGludC1kaXNhYmxlIGVxZXFlcSAqL1xuXHRcdFx0cmV0dXJuIGEgPT0gZG9jdW1lbnQgPyAtMSA6XG5cdFx0XHRcdGIgPT0gZG9jdW1lbnQgPyAxIDpcblx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBlcWVxZXEgKi9cblx0XHRcdFx0YXVwID8gLTEgOlxuXHRcdFx0XHRidXAgPyAxIDpcblx0XHRcdFx0c29ydElucHV0ID9cblx0XHRcdFx0KCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2YoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXG5cdFx0Ly8gSWYgdGhlIG5vZGVzIGFyZSBzaWJsaW5ncywgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2tcblx0XHR9IGVsc2UgaWYgKCBhdXAgPT09IGJ1cCApIHtcblx0XHRcdHJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2Ugd2UgbmVlZCBmdWxsIGxpc3RzIG9mIHRoZWlyIGFuY2VzdG9ycyBmb3IgY29tcGFyaXNvblxuXHRcdGN1ciA9IGE7XG5cdFx0d2hpbGUgKCAoIGN1ciA9IGN1ci5wYXJlbnROb2RlICkgKSB7XG5cdFx0XHRhcC51bnNoaWZ0KCBjdXIgKTtcblx0XHR9XG5cdFx0Y3VyID0gYjtcblx0XHR3aGlsZSAoICggY3VyID0gY3VyLnBhcmVudE5vZGUgKSApIHtcblx0XHRcdGJwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblxuXHRcdC8vIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5XG5cdFx0d2hpbGUgKCBhcFsgaSBdID09PSBicFsgaSBdICkge1xuXHRcdFx0aSsrO1xuXHRcdH1cblxuXHRcdHJldHVybiBpID9cblxuXHRcdFx0Ly8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yXG5cdFx0XHRzaWJsaW5nQ2hlY2soIGFwWyBpIF0sIGJwWyBpIF0gKSA6XG5cblx0XHRcdC8vIE90aGVyd2lzZSBub2RlcyBpbiBvdXIgZG9jdW1lbnQgc29ydCBmaXJzdFxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdC8qIGVzbGludC1kaXNhYmxlIGVxZXFlcSAqL1xuXHRcdFx0YXBbIGkgXSA9PSBwcmVmZXJyZWREb2MgPyAtMSA6XG5cdFx0XHRicFsgaSBdID09IHByZWZlcnJlZERvYyA/IDEgOlxuXHRcdFx0LyogZXNsaW50LWVuYWJsZSBlcWVxZXEgKi9cblx0XHRcdDA7XG5cdH07XG5cblx0cmV0dXJuIGRvY3VtZW50O1xufTtcblxuU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgZWxlbWVudHMgKSB7XG5cdHJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7XG59O1xuXG5TaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7XG5cdHNldERvY3VtZW50KCBlbGVtICk7XG5cblx0aWYgKCBzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciAmJiBkb2N1bWVudElzSFRNTCAmJlxuXHRcdCFub25uYXRpdmVTZWxlY3RvckNhY2hlWyBleHByICsgXCIgXCIgXSAmJlxuXHRcdCggIXJidWdneU1hdGNoZXMgfHwgIXJidWdneU1hdGNoZXMudGVzdCggZXhwciApICkgJiZcblx0XHQoICFyYnVnZ3lRU0EgICAgIHx8ICFyYnVnZ3lRU0EudGVzdCggZXhwciApICkgKSB7XG5cblx0XHR0cnkge1xuXHRcdFx0dmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApO1xuXG5cdFx0XHQvLyBJRSA5J3MgbWF0Y2hlc1NlbGVjdG9yIHJldHVybnMgZmFsc2Ugb24gZGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0XHRpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8XG5cblx0XHRcdFx0Ly8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnRcblx0XHRcdFx0Ly8gZnJhZ21lbnQgaW4gSUUgOVxuXHRcdFx0XHRlbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0bm9ubmF0aXZlU2VsZWN0b3JDYWNoZSggZXhwciwgdHJ1ZSApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7XG59O1xuXG5TaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggY29udGV4dCwgZWxlbSApIHtcblxuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0aWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXHRyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTtcbn07XG5cblNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdH1cblxuXHR2YXIgZm4gPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUudG9Mb3dlckNhc2UoKSBdLFxuXG5cdFx0Ly8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgP1xuXHRcdHZhbCA6XG5cdFx0c3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDpcblx0XHRcdCggdmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkgKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0dmFsLnZhbHVlIDpcblx0XHRcdFx0bnVsbDtcbn07XG5cblNpenpsZS5lc2NhcGUgPSBmdW5jdGlvbiggc2VsICkge1xuXHRyZXR1cm4gKCBzZWwgKyBcIlwiICkucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApO1xufTtcblxuU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcblx0dGhyb3cgbmV3IEVycm9yKCBcIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246IFwiICsgbXNnICk7XG59O1xuXG4vKipcbiAqIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzXG4gKi9cblNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7XG5cdHZhciBlbGVtLFxuXHRcdGR1cGxpY2F0ZXMgPSBbXSxcblx0XHRqID0gMCxcblx0XHRpID0gMDtcblxuXHQvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlXG5cdGhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7XG5cdHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApO1xuXHRyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApO1xuXG5cdGlmICggaGFzRHVwbGljYXRlICkge1xuXHRcdHdoaWxlICggKCBlbGVtID0gcmVzdWx0c1sgaSsrIF0gKSApIHtcblx0XHRcdGlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkge1xuXHRcdFx0XHRqID0gZHVwbGljYXRlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0cmVzdWx0cy5zcGxpY2UoIGR1cGxpY2F0ZXNbIGogXSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdC8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzXG5cdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9wdWxsLzIyNVxuXHRzb3J0SW5wdXQgPSBudWxsO1xuXG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZXRyaWV2aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2Rlc1xuICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtXG4gKi9cbmdldFRleHQgPSBTaXp6bGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHR2YXIgbm9kZSxcblx0XHRyZXQgPSBcIlwiLFxuXHRcdGkgPSAwLFxuXHRcdG5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRpZiAoICFub2RlVHlwZSApIHtcblxuXHRcdC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XG5cdFx0d2hpbGUgKCAoIG5vZGUgPSBlbGVtWyBpKysgXSApICkge1xuXG5cdFx0XHQvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2Rlc1xuXHRcdFx0cmV0ICs9IGdldFRleHQoIG5vZGUgKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHtcblxuXHRcdC8vIFVzZSB0ZXh0Q29udGVudCBmb3IgZWxlbWVudHNcblx0XHQvLyBpbm5lclRleHQgdXNhZ2UgcmVtb3ZlZCBmb3IgY29uc2lzdGVuY3kgb2YgbmV3IGxpbmVzIChqUXVlcnkgIzExMTUzKVxuXHRcdGlmICggdHlwZW9mIGVsZW0udGV4dENvbnRlbnQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS50ZXh0Q29udGVudDtcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBUcmF2ZXJzZSBpdHMgY2hpbGRyZW5cblx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xuXHRcdFx0XHRyZXQgKz0gZ2V0VGV4dCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVZhbHVlO1xuXHR9XG5cblx0Ly8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzXG5cblx0cmV0dXJuIHJldDtcbn07XG5cbkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaFsgMSBdID0gbWF0Y2hbIDEgXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHQvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZFxuXHRcdFx0bWF0Y2hbIDMgXSA9ICggbWF0Y2hbIDMgXSB8fCBtYXRjaFsgNCBdIHx8XG5cdFx0XHRcdG1hdGNoWyA1IF0gfHwgXCJcIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbIDIgXSA9PT0gXCJ+PVwiICkge1xuXHRcdFx0XHRtYXRjaFsgMyBdID0gXCIgXCIgKyBtYXRjaFsgMyBdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblxuXHRcdFx0LyogbWF0Y2hlcyBmcm9tIG1hdGNoRXhwcltcIkNISUxEXCJdXG5cdFx0XHRcdDEgdHlwZSAob25seXxudGh8Li4uKVxuXHRcdFx0XHQyIHdoYXQgKGNoaWxkfG9mLXR5cGUpXG5cdFx0XHRcdDMgYXJndW1lbnQgKGV2ZW58b2RkfFxcZCp8XFxkKm4oWystXVxcZCspP3wuLi4pXG5cdFx0XHRcdDQgeG4tY29tcG9uZW50IG9mIHhuK3kgYXJndW1lbnQgKFsrLV0/XFxkKm58KVxuXHRcdFx0XHQ1IHNpZ24gb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDYgeCBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NyBzaWduIG9mIHktY29tcG9uZW50XG5cdFx0XHRcdDggeSBvZiB5LWNvbXBvbmVudFxuXHRcdFx0Ki9cblx0XHRcdG1hdGNoWyAxIF0gPSBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdGlmICggbWF0Y2hbIDEgXS5zbGljZSggMCwgMyApID09PSBcIm50aFwiICkge1xuXG5cdFx0XHRcdC8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50XG5cdFx0XHRcdGlmICggIW1hdGNoWyAzIF0gKSB7XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFsgMCBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBudW1lcmljIHggYW5kIHkgcGFyYW1ldGVycyBmb3IgRXhwci5maWx0ZXIuQ0hJTERcblx0XHRcdFx0Ly8gcmVtZW1iZXIgdGhhdCBmYWxzZS90cnVlIGNhc3QgcmVzcGVjdGl2ZWx5IHRvIDAvMVxuXHRcdFx0XHRtYXRjaFsgNCBdID0gKyggbWF0Y2hbIDQgXSA/XG5cdFx0XHRcdFx0bWF0Y2hbIDUgXSArICggbWF0Y2hbIDYgXSB8fCAxICkgOlxuXHRcdFx0XHRcdDIgKiAoIG1hdGNoWyAzIF0gPT09IFwiZXZlblwiIHx8IG1hdGNoWyAzIF0gPT09IFwib2RkXCIgKSApO1xuXHRcdFx0XHRtYXRjaFsgNSBdID0gKyggKCBtYXRjaFsgNyBdICsgbWF0Y2hbIDggXSApIHx8IG1hdGNoWyAzIF0gPT09IFwib2RkXCIgKTtcblxuXHRcdFx0XHQvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWyAzIF0gKSB7XG5cdFx0XHRcdFNpenpsZS5lcnJvciggbWF0Y2hbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdHZhciBleGNlc3MsXG5cdFx0XHRcdHVucXVvdGVkID0gIW1hdGNoWyA2IF0gJiYgbWF0Y2hbIDIgXTtcblxuXHRcdFx0aWYgKCBtYXRjaEV4cHJbIFwiQ0hJTERcIiBdLnRlc3QoIG1hdGNoWyAwIF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWyAzIF0gKSB7XG5cdFx0XHRcdG1hdGNoWyAyIF0gPSBtYXRjaFsgNCBdIHx8IG1hdGNoWyA1IF0gfHwgXCJcIjtcblxuXHRcdFx0Ly8gU3RyaXAgZXhjZXNzIGNoYXJhY3RlcnMgZnJvbSB1bnF1b3RlZCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJlxuXG5cdFx0XHRcdC8vIEdldCBleGNlc3MgZnJvbSB0b2tlbml6ZSAocmVjdXJzaXZlbHkpXG5cdFx0XHRcdCggZXhjZXNzID0gdG9rZW5pemUoIHVucXVvdGVkLCB0cnVlICkgKSAmJlxuXG5cdFx0XHRcdC8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpc1xuXHRcdFx0XHQoIGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCApICkge1xuXG5cdFx0XHRcdC8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4XG5cdFx0XHRcdG1hdGNoWyAwIF0gPSBtYXRjaFsgMCBdLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdFx0bWF0Y2hbIDIgXSA9IHVucXVvdGVkLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmlsdGVyIG1ldGhvZCAodHlwZSBhbmQgYXJndW1lbnQpXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDMgKTtcblx0XHR9XG5cdH0sXG5cblx0ZmlsdGVyOiB7XG5cblx0XHRcIlRBR1wiOiBmdW5jdGlvbiggbm9kZU5hbWVTZWxlY3RvciApIHtcblx0XHRcdHZhciBub2RlTmFtZSA9IG5vZGVOYW1lU2VsZWN0b3IucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09IFwiKlwiID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0gOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNMQVNTXCI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7XG5cdFx0XHR2YXIgcGF0dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArIFwiIFwiIF07XG5cblx0XHRcdHJldHVybiBwYXR0ZXJuIHx8XG5cdFx0XHRcdCggcGF0dGVybiA9IG5ldyBSZWdFeHAoIFwiKF58XCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFx0XHRcIilcIiArIGNsYXNzTmFtZSArIFwiKFwiICsgd2hpdGVzcGFjZSArIFwifCQpXCIgKSApICYmIGNsYXNzQ2FjaGUoXG5cdFx0XHRcdFx0XHRjbGFzc05hbWUsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KFxuXHRcdFx0XHRcdFx0XHRcdHR5cGVvZiBlbGVtLmNsYXNzTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBlbGVtLmNsYXNzTmFtZSB8fFxuXHRcdFx0XHRcdFx0XHRcdHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8XG5cdFx0XHRcdFx0XHRcdFx0XCJcIlxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9ICk7XG5cdFx0fSxcblxuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbmFtZSwgb3BlcmF0b3IsIGNoZWNrICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gU2l6emxlLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0XHRpZiAoIHJlc3VsdCA9PSBudWxsICkge1xuXHRcdFx0XHRcdHJldHVybiBvcGVyYXRvciA9PT0gXCIhPVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggIW9wZXJhdG9yICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0ICs9IFwiXCI7XG5cblx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuXG5cdFx0XHRcdHJldHVybiBvcGVyYXRvciA9PT0gXCI9XCIgPyByZXN1bHQgPT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIhPVwiID8gcmVzdWx0ICE9PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiXj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID09PSAwIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIqPVwiID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiJD1cIiA/IGNoZWNrICYmIHJlc3VsdC5zbGljZSggLWNoZWNrLmxlbmd0aCApID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwifj1cIiA/ICggXCIgXCIgKyByZXN1bHQucmVwbGFjZSggcndoaXRlc3BhY2UsIFwiIFwiICkgKyBcIiBcIiApLmluZGV4T2YoIGNoZWNrICkgPiAtMSA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwifD1cIiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgXCItXCIgOlxuXHRcdFx0XHRcdGZhbHNlO1xuXHRcdFx0XHQvKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cblxuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgX2FyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHtcblx0XHRcdHZhciBzaW1wbGUgPSB0eXBlLnNsaWNlKCAwLCAzICkgIT09IFwibnRoXCIsXG5cdFx0XHRcdGZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSBcImxhc3RcIixcblx0XHRcdFx0b2ZUeXBlID0gd2hhdCA9PT0gXCJvZi10eXBlXCI7XG5cblx0XHRcdHJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID9cblxuXHRcdFx0XHQvLyBTaG9ydGN1dCBmb3IgOm50aC0qKG4pXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiAhIWVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0fSA6XG5cblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIF9jb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGNhY2hlLCB1bmlxdWVDYWNoZSwgb3V0ZXJDYWNoZSwgbm9kZSwgbm9kZUluZGV4LCBzdGFydCxcblx0XHRcdFx0XHRcdGRpciA9IHNpbXBsZSAhPT0gZm9yd2FyZCA/IFwibmV4dFNpYmxpbmdcIiA6IFwicHJldmlvdXNTaWJsaW5nXCIsXG5cdFx0XHRcdFx0XHRwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGUsXG5cdFx0XHRcdFx0XHRuYW1lID0gb2ZUeXBlICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxcblx0XHRcdFx0XHRcdHVzZUNhY2hlID0gIXhtbCAmJiAhb2ZUeXBlLFxuXHRcdFx0XHRcdFx0ZGlmZiA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIDooZmlyc3R8bGFzdHxvbmx5KS0oY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0XHRcdGlmICggc2ltcGxlICkge1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoIGRpciApIHtcblx0XHRcdFx0XHRcdFx0XHRub2RlID0gZWxlbTtcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoICggbm9kZSA9IG5vZGVbIGRpciBdICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdC8vIFJldmVyc2UgZGlyZWN0aW9uIGZvciA6b25seS0qIChpZiB3ZSBoYXZlbid0IHlldCBkb25lIHNvKVxuXHRcdFx0XHRcdFx0XHRcdHN0YXJ0ID0gZGlyID0gdHlwZSA9PT0gXCJvbmx5XCIgJiYgIXN0YXJ0ICYmIFwibmV4dFNpYmxpbmdcIjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0c3RhcnQgPSBbIGZvcndhcmQgPyBwYXJlbnQuZmlyc3RDaGlsZCA6IHBhcmVudC5sYXN0Q2hpbGQgXTtcblxuXHRcdFx0XHRcdFx0Ly8gbm9uLXhtbCA6bnRoLWNoaWxkKC4uLikgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGBcblx0XHRcdFx0XHRcdGlmICggZm9yd2FyZCAmJiB1c2VDYWNoZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBTZWVrIGBlbGVtYCBmcm9tIGEgcHJldmlvdXNseS1jYWNoZWQgaW5kZXhcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBwYXJlbnQ7XG5cdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHwgKCBub2RlWyBleHBhbmRvIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0KCBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4ICYmIGNhY2hlWyAyIF07XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHQoIGRpZmYgPSBub2RlSW5kZXggPSAwICkgfHwgc3RhcnQucG9wKCkgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFdoZW4gZm91bmQsIGNhY2hlIGluZGV4ZXMgb24gYHBhcmVudGAgYW5kIGJyZWFrXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBub2RlLm5vZGVUeXBlID09PSAxICYmICsrZGlmZiAmJiBub2RlID09PSBlbGVtICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVucywgbm9kZUluZGV4LCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBVc2UgcHJldmlvdXNseS1jYWNoZWQgZWxlbWVudCBpbmRleCBpZiBhdmFpbGFibGVcblx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXlcblx0XHRcdFx0XHRcdFx0XHRub2RlID0gZWxlbTtcblx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8ICggbm9kZVsgZXhwYW5kbyBdID0ge30gKTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KCBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHRcdFx0Y2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4O1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8geG1sIDpudGgtY2hpbGQoLi4uKVxuXHRcdFx0XHRcdFx0XHQvLyBvciA6bnRoLWxhc3QtY2hpbGQoLi4uKSBvciA6bnRoKC1sYXN0KT8tb2YtdHlwZSguLi4pXG5cdFx0XHRcdFx0XHRcdGlmICggZGlmZiA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKCBub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KCBkaWZmID0gbm9kZUluZGV4ID0gMCApIHx8IHN0YXJ0LnBvcCgpICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICggKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0KytkaWZmICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQoIG5vZGVbIGV4cGFuZG8gXSA9IHt9ICk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCggb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30gKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggbm9kZSA9PT0gZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZVxuXHRcdFx0XHRcdFx0ZGlmZiAtPSBsYXN0O1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRpZmYgPT09IGZpcnN0IHx8ICggZGlmZiAlIGZpcnN0ID09PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAwICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIlBTRVVET1wiOiBmdW5jdGlvbiggcHNldWRvLCBhcmd1bWVudCApIHtcblxuXHRcdFx0Ly8gcHNldWRvLWNsYXNzIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI3BzZXVkby1jbGFzc2VzXG5cdFx0XHQvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVyc1xuXHRcdFx0Ly8gUmVtZW1iZXIgdGhhdCBzZXRGaWx0ZXJzIGluaGVyaXRzIGZyb20gcHNldWRvc1xuXHRcdFx0dmFyIGFyZ3MsXG5cdFx0XHRcdGZuID0gRXhwci5wc2V1ZG9zWyBwc2V1ZG8gXSB8fCBFeHByLnNldEZpbHRlcnNbIHBzZXVkby50b0xvd2VyQ2FzZSgpIF0gfHxcblx0XHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgcHNldWRvOiBcIiArIHBzZXVkbyApO1xuXG5cdFx0XHQvLyBUaGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0XG5cdFx0XHQvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvblxuXHRcdFx0Ly8ganVzdCBhcyBTaXp6bGUgZG9lc1xuXHRcdFx0aWYgKCBmblsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRyZXR1cm4gZm4oIGFyZ3VtZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEJ1dCBtYWludGFpbiBzdXBwb3J0IGZvciBvbGQgc2lnbmF0dXJlc1xuXHRcdFx0aWYgKCBmbi5sZW5ndGggPiAxICkge1xuXHRcdFx0XHRhcmdzID0gWyBwc2V1ZG8sIHBzZXVkbywgXCJcIiwgYXJndW1lbnQgXTtcblx0XHRcdFx0cmV0dXJuIEV4cHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSggcHNldWRvLnRvTG93ZXJDYXNlKCkgKSA/XG5cdFx0XHRcdFx0bWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdFx0XHRcdHZhciBpZHgsXG5cdFx0XHRcdFx0XHRcdG1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSxcblx0XHRcdFx0XHRcdFx0aSA9IG1hdGNoZWQubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlkeCA9IGluZGV4T2YoIHNlZWQsIG1hdGNoZWRbIGkgXSApO1xuXHRcdFx0XHRcdFx0XHRzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFsgaSBdICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSApIDpcblx0XHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBmbiggZWxlbSwgMCwgYXJncyApO1xuXHRcdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmbjtcblx0XHR9XG5cdH0sXG5cblx0cHNldWRvczoge1xuXG5cdFx0Ly8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zXG5cdFx0XCJub3RcIjogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cblx0XHRcdC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlXG5cdFx0XHQvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuXHRcdFx0Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzXG5cdFx0XHR2YXIgaW5wdXQgPSBbXSxcblx0XHRcdFx0cmVzdWx0cyA9IFtdLFxuXHRcdFx0XHRtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApICk7XG5cblx0XHRcdHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gP1xuXHRcdFx0XHRtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzLCBfY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHRcdFx0dW5tYXRjaGVkID0gbWF0Y2hlciggc2VlZCwgbnVsbCwgeG1sLCBbXSApLFxuXHRcdFx0XHRcdFx0aSA9IHNlZWQubGVuZ3RoO1xuXG5cdFx0XHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYFxuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSB1bm1hdGNoZWRbIGkgXSApICkge1xuXHRcdFx0XHRcdFx0XHRzZWVkWyBpIF0gPSAhKCBtYXRjaGVzWyBpIF0gPSBlbGVtICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgX2NvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHRpbnB1dFsgMCBdID0gZWxlbTtcblx0XHRcdFx0XHRtYXRjaGVyKCBpbnB1dCwgbnVsbCwgeG1sLCByZXN1bHRzICk7XG5cblx0XHRcdFx0XHQvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0XHRcdGlucHV0WyAwIF0gPSBudWxsO1xuXHRcdFx0XHRcdHJldHVybiAhcmVzdWx0cy5wb3AoKTtcblx0XHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHRcImhhc1wiOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwO1xuXHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHRcImNvbnRhaW5zXCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGdldFRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xO1xuXHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHQvLyBcIldoZXRoZXIgYW4gZWxlbWVudCBpcyByZXByZXNlbnRlZCBieSBhIDpsYW5nKCkgc2VsZWN0b3Jcblx0XHQvLyBpcyBiYXNlZCBzb2xlbHkgb24gdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZVxuXHRcdC8vIGJlaW5nIGVxdWFsIHRvIHRoZSBpZGVudGlmaWVyIEMsXG5cdFx0Ly8gb3IgYmVnaW5uaW5nIHdpdGggdGhlIGlkZW50aWZpZXIgQyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBcIi1cIi5cblx0XHQvLyBUaGUgbWF0Y2hpbmcgb2YgQyBhZ2FpbnN0IHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUgaXMgcGVyZm9ybWVkIGNhc2UtaW5zZW5zaXRpdmVseS5cblx0XHQvLyBUaGUgaWRlbnRpZmllciBDIGRvZXMgbm90IGhhdmUgdG8gYmUgYSB2YWxpZCBsYW5ndWFnZSBuYW1lLlwiXG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNsYW5nLXBzZXVkb1xuXHRcdFwibGFuZ1wiOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBsYW5nICkge1xuXG5cdFx0XHQvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyXG5cdFx0XHRpZiAoICFyaWRlbnRpZmllci50ZXN0KCBsYW5nIHx8IFwiXCIgKSApIHtcblx0XHRcdFx0U2l6emxlLmVycm9yKCBcInVuc3VwcG9ydGVkIGxhbmc6IFwiICsgbGFuZyApO1xuXHRcdFx0fVxuXHRcdFx0bGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgZWxlbUxhbmc7XG5cdFx0XHRcdGRvIHtcblx0XHRcdFx0XHRpZiAoICggZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRcdFx0XHRlbGVtLmxhbmcgOlxuXHRcdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoIFwieG1sOmxhbmdcIiApIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCBcImxhbmdcIiApICkgKSB7XG5cblx0XHRcdFx0XHRcdGVsZW1MYW5nID0gZWxlbUxhbmcudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtTGFuZyA9PT0gbGFuZyB8fCBlbGVtTGFuZy5pbmRleE9mKCBsYW5nICsgXCItXCIgKSA9PT0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gd2hpbGUgKCAoIGVsZW0gPSBlbGVtLnBhcmVudE5vZGUgKSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH07XG5cdFx0fSApLFxuXG5cdFx0Ly8gTWlzY2VsbGFuZW91c1xuXHRcdFwidGFyZ2V0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhhc2g7XG5cdFx0XHRyZXR1cm4gaGFzaCAmJiBoYXNoLnNsaWNlKCAxICkgPT09IGVsZW0uaWQ7XG5cdFx0fSxcblxuXHRcdFwicm9vdFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2NFbGVtO1xuXHRcdH0sXG5cblx0XHRcImZvY3VzXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiZcblx0XHRcdFx0KCAhZG9jdW1lbnQuaGFzRm9jdXMgfHwgZG9jdW1lbnQuaGFzRm9jdXMoKSApICYmXG5cdFx0XHRcdCEhKCBlbGVtLnR5cGUgfHwgZWxlbS5ocmVmIHx8IH5lbGVtLnRhYkluZGV4ICk7XG5cdFx0fSxcblxuXHRcdC8vIEJvb2xlYW4gcHJvcGVydGllc1xuXHRcdFwiZW5hYmxlZFwiOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggZmFsc2UgKSxcblx0XHRcImRpc2FibGVkXCI6IGNyZWF0ZURpc2FibGVkUHNldWRvKCB0cnVlICksXG5cblx0XHRcImNoZWNrZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8vIEluIENTUzMsIDpjaGVja2VkIHNob3VsZCByZXR1cm4gYm90aCBjaGVja2VkIGFuZCBzZWxlY3RlZCBlbGVtZW50c1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgISFlbGVtLmNoZWNrZWQgKSB8fFxuXHRcdFx0XHQoIG5vZGVOYW1lID09PSBcIm9wdGlvblwiICYmICEhZWxlbS5zZWxlY3RlZCApO1xuXHRcdH0sXG5cblx0XHRcInNlbGVjdGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0XG5cdFx0XHQvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5XG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHRcdFx0XHRlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdC8vIENvbnRlbnRzXG5cdFx0XCJlbXB0eVwiOiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG9cblx0XHRcdC8vIDplbXB0eSBpcyBuZWdhdGVkIGJ5IGVsZW1lbnQgKDEpIG9yIGNvbnRlbnQgbm9kZXMgKHRleHQ6IDM7IGNkYXRhOiA0OyBlbnRpdHkgcmVmOiA1KSxcblx0XHRcdC8vICAgYnV0IG5vdCBieSBvdGhlcnMgKGNvbW1lbnQ6IDg7IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246IDc7IGV0Yy4pXG5cdFx0XHQvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRcInBhcmVudFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAhRXhwci5wc2V1ZG9zWyBcImVtcHR5XCIgXSggZWxlbSApO1xuXHRcdH0sXG5cblx0XHQvLyBFbGVtZW50L2lucHV0IHR5cGVzXG5cdFx0XCJoZWFkZXJcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmhlYWRlci50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdFwiaW5wdXRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmlucHV0cy50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdFwiYnV0dG9uXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gXCJidXR0b25cIiB8fCBuYW1lID09PSBcImJ1dHRvblwiO1xuXHRcdH0sXG5cblx0XHRcInRleHRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgYXR0cjtcblx0XHRcdHJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiAmJlxuXHRcdFx0XHRlbGVtLnR5cGUgPT09IFwidGV4dFwiICYmXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUU8OFxuXHRcdFx0XHQvLyBOZXcgSFRNTDUgYXR0cmlidXRlIHZhbHVlcyAoZS5nLiwgXCJzZWFyY2hcIikgYXBwZWFyIHdpdGggZWxlbS50eXBlID09PSBcInRleHRcIlxuXHRcdFx0XHQoICggYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCBcInR5cGVcIiApICkgPT0gbnVsbCB8fFxuXHRcdFx0XHRcdGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCIgKTtcblx0XHR9LFxuXG5cdFx0Ly8gUG9zaXRpb24taW4tY29sbGVjdGlvblxuXHRcdFwiZmlyc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gWyAwIF07XG5cdFx0fSApLFxuXG5cdFx0XCJsYXN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBfbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gWyBsZW5ndGggLSAxIF07XG5cdFx0fSApLFxuXG5cdFx0XCJlcVwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggX21hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTtcblx0XHR9ICksXG5cblx0XHRcImV2ZW5cIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAwO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0gKSxcblxuXHRcdFwib2RkXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMTtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9ICksXG5cblx0XHRcImx0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/XG5cdFx0XHRcdGFyZ3VtZW50ICsgbGVuZ3RoIDpcblx0XHRcdFx0YXJndW1lbnQgPiBsZW5ndGggP1xuXHRcdFx0XHRcdGxlbmd0aCA6XG5cdFx0XHRcdFx0YXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7IC0taSA+PSAwOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSApLFxuXG5cdFx0XCJndFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyArK2kgPCBsZW5ndGg7ICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9IClcblx0fVxufTtcblxuRXhwci5wc2V1ZG9zWyBcIm50aFwiIF0gPSBFeHByLnBzZXVkb3NbIFwiZXFcIiBdO1xuXG4vLyBBZGQgYnV0dG9uL2lucHV0IHR5cGUgcHNldWRvc1xuZm9yICggaSBpbiB7IHJhZGlvOiB0cnVlLCBjaGVja2JveDogdHJ1ZSwgZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUsIGltYWdlOiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkgKTtcbn1cbmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlQnV0dG9uUHNldWRvKCBpICk7XG59XG5cbi8vIEVhc3kgQVBJIGZvciBjcmVhdGluZyBuZXcgc2V0RmlsdGVyc1xuZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9XG5zZXRGaWx0ZXJzLnByb3RvdHlwZSA9IEV4cHIuZmlsdGVycyA9IEV4cHIucHNldWRvcztcbkV4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRGaWx0ZXJzKCk7XG5cbnRva2VuaXplID0gU2l6emxlLnRva2VuaXplID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBwYXJzZU9ubHkgKSB7XG5cdHZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLFxuXHRcdHNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsXG5cdFx0Y2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggY2FjaGVkICkge1xuXHRcdHJldHVybiBwYXJzZU9ubHkgPyAwIDogY2FjaGVkLnNsaWNlKCAwICk7XG5cdH1cblxuXHRzb0ZhciA9IHNlbGVjdG9yO1xuXHRncm91cHMgPSBbXTtcblx0cHJlRmlsdGVycyA9IEV4cHIucHJlRmlsdGVyO1xuXG5cdHdoaWxlICggc29GYXIgKSB7XG5cblx0XHQvLyBDb21tYSBhbmQgZmlyc3QgcnVuXG5cdFx0aWYgKCAhbWF0Y2hlZCB8fCAoIG1hdGNoID0gcmNvbW1hLmV4ZWMoIHNvRmFyICkgKSApIHtcblx0XHRcdGlmICggbWF0Y2ggKSB7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgY29uc3VtZSB0cmFpbGluZyBjb21tYXMgYXMgdmFsaWRcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbIDAgXS5sZW5ndGggKSB8fCBzb0Zhcjtcblx0XHRcdH1cblx0XHRcdGdyb3Vwcy5wdXNoKCAoIHRva2VucyA9IFtdICkgKTtcblx0XHR9XG5cblx0XHRtYXRjaGVkID0gZmFsc2U7XG5cblx0XHQvLyBDb21iaW5hdG9yc1xuXHRcdGlmICggKCBtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApICkgKSB7XG5cdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdHRva2Vucy5wdXNoKCB7XG5cdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXG5cdFx0XHRcdC8vIENhc3QgZGVzY2VuZGFudCBjb21iaW5hdG9ycyB0byBzcGFjZVxuXHRcdFx0XHR0eXBlOiBtYXRjaFsgMCBdLnJlcGxhY2UoIHJ0cmltLCBcIiBcIiApXG5cdFx0XHR9ICk7XG5cdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZpbHRlcnNcblx0XHRmb3IgKCB0eXBlIGluIEV4cHIuZmlsdGVyICkge1xuXHRcdFx0aWYgKCAoIG1hdGNoID0gbWF0Y2hFeHByWyB0eXBlIF0uZXhlYyggc29GYXIgKSApICYmICggIXByZUZpbHRlcnNbIHR5cGUgXSB8fFxuXHRcdFx0XHQoIG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApICkgKSApIHtcblx0XHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHRcdHRva2Vucy5wdXNoKCB7XG5cdFx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0XHRtYXRjaGVzOiBtYXRjaFxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCAhbWF0Y2hlZCApIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlkIGV4Y2Vzc1xuXHQvLyBpZiB3ZSdyZSBqdXN0IHBhcnNpbmdcblx0Ly8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zXG5cdHJldHVybiBwYXJzZU9ubHkgP1xuXHRcdHNvRmFyLmxlbmd0aCA6XG5cdFx0c29GYXIgP1xuXHRcdFx0U2l6emxlLmVycm9yKCBzZWxlY3RvciApIDpcblxuXHRcdFx0Ly8gQ2FjaGUgdGhlIHRva2Vuc1xuXHRcdFx0dG9rZW5DYWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7XG59O1xuXG5mdW5jdGlvbiB0b1NlbGVjdG9yKCB0b2tlbnMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdHNlbGVjdG9yID0gXCJcIjtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0c2VsZWN0b3IgKz0gdG9rZW5zWyBpIF0udmFsdWU7XG5cdH1cblx0cmV0dXJuIHNlbGVjdG9yO1xufVxuXG5mdW5jdGlvbiBhZGRDb21iaW5hdG9yKCBtYXRjaGVyLCBjb21iaW5hdG9yLCBiYXNlICkge1xuXHR2YXIgZGlyID0gY29tYmluYXRvci5kaXIsXG5cdFx0c2tpcCA9IGNvbWJpbmF0b3IubmV4dCxcblx0XHRrZXkgPSBza2lwIHx8IGRpcixcblx0XHRjaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBrZXkgPT09IFwicGFyZW50Tm9kZVwiLFxuXHRcdGRvbmVOYW1lID0gZG9uZSsrO1xuXG5cdHJldHVybiBjb21iaW5hdG9yLmZpcnN0ID9cblxuXHRcdC8vIENoZWNrIGFnYWluc3QgY2xvc2VzdCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudFxuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gOlxuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsXG5cdFx0XHRcdG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdO1xuXG5cdFx0XHQvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBjb21iaW5hdG9yIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKCBlbGVtWyBleHBhbmRvIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdCggb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdID0ge30gKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBza2lwICYmIHNraXAgPT09IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSApIHtcblx0XHRcdFx0XHRcdFx0ZWxlbSA9IGVsZW1bIGRpciBdIHx8IGVsZW07XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCAoIG9sZENhY2hlID0gdW5pcXVlQ2FjaGVbIGtleSBdICkgJiZcblx0XHRcdFx0XHRcdFx0b2xkQ2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBvbGRDYWNoZVsgMSBdID09PSBkb25lTmFtZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBc3NpZ24gdG8gbmV3Q2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKCBuZXdDYWNoZVsgMiBdID0gb2xkQ2FjaGVbIDIgXSApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBSZXVzZSBuZXdjYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlWyBrZXkgXSA9IG5ld0NhY2hlO1xuXG5cdFx0XHRcdFx0XHRcdC8vIEEgbWF0Y2ggbWVhbnMgd2UncmUgZG9uZTsgYSBmYWlsIG1lYW5zIHdlIGhhdmUgdG8ga2VlcCBjaGVja2luZ1xuXHRcdFx0XHRcdFx0XHRpZiAoICggbmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xufVxuXG5mdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7XG5cdHJldHVybiBtYXRjaGVycy5sZW5ndGggPiAxID9cblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCAhbWF0Y2hlcnNbIGkgXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IDpcblx0XHRtYXRjaGVyc1sgMCBdO1xufVxuXG5mdW5jdGlvbiBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciwgY29udGV4dHMsIHJlc3VsdHMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSBjb250ZXh0cy5sZW5ndGg7XG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHRzWyBpIF0sIHJlc3VsdHMgKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHtcblx0dmFyIGVsZW0sXG5cdFx0bmV3VW5tYXRjaGVkID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bGVuID0gdW5tYXRjaGVkLmxlbmd0aCxcblx0XHRtYXBwZWQgPSBtYXAgIT0gbnVsbDtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoICggZWxlbSA9IHVubWF0Y2hlZFsgaSBdICkgKSB7XG5cdFx0XHRpZiAoICFmaWx0ZXIgfHwgZmlsdGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0bmV3VW5tYXRjaGVkLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0aWYgKCBtYXBwZWQgKSB7XG5cdFx0XHRcdFx0bWFwLnB1c2goIGkgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBuZXdVbm1hdGNoZWQ7XG59XG5cbmZ1bmN0aW9uIHNldE1hdGNoZXIoIHByZUZpbHRlciwgc2VsZWN0b3IsIG1hdGNoZXIsIHBvc3RGaWx0ZXIsIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApIHtcblx0aWYgKCBwb3N0RmlsdGVyICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTtcblx0fVxuXHRpZiAoIHBvc3RGaW5kZXIgJiYgIXBvc3RGaW5kZXJbIGV4cGFuZG8gXSApIHtcblx0XHRwb3N0RmluZGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICk7XG5cdH1cblx0cmV0dXJuIG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHtcblx0XHR2YXIgdGVtcCwgaSwgZWxlbSxcblx0XHRcdHByZU1hcCA9IFtdLFxuXHRcdFx0cG9zdE1hcCA9IFtdLFxuXHRcdFx0cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHRcblx0XHRcdGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKFxuXHRcdFx0XHRzZWxlY3RvciB8fCBcIipcIixcblx0XHRcdFx0Y29udGV4dC5ub2RlVHlwZSA/IFsgY29udGV4dCBdIDogY29udGV4dCxcblx0XHRcdFx0W11cblx0XHRcdCksXG5cblx0XHRcdC8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvblxuXHRcdFx0bWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGNvbmRlbnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0ZWxlbXMsXG5cblx0XHRcdG1hdGNoZXJPdXQgPSBtYXRjaGVyID9cblxuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0XHRwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/XG5cblx0XHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRbXSA6XG5cblx0XHRcdFx0XHQvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHlcblx0XHRcdFx0XHRyZXN1bHRzIDpcblx0XHRcdFx0bWF0Y2hlckluO1xuXG5cdFx0Ly8gRmluZCBwcmltYXJ5IG1hdGNoZXNcblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cdFx0XHRtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHBvc3RGaWx0ZXJcblx0XHRpZiAoIHBvc3RGaWx0ZXIgKSB7XG5cdFx0XHR0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTtcblx0XHRcdHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTtcblxuXHRcdFx0Ly8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJblxuXHRcdFx0aSA9IHRlbXAubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggKCBlbGVtID0gdGVtcFsgaSBdICkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlck91dFsgcG9zdE1hcFsgaSBdIF0gPSAhKCBtYXRjaGVySW5bIHBvc3RNYXBbIGkgXSBdID0gZWxlbSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHtcblx0XHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzXG5cdFx0XHRcdFx0dGVtcCA9IFtdO1xuXHRcdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKCBlbGVtID0gbWF0Y2hlck91dFsgaSBdICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2hcblx0XHRcdFx0XHRcdFx0dGVtcC5wdXNoKCAoIG1hdGNoZXJJblsgaSBdID0gZWxlbSApICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBvc3RGaW5kZXIoIG51bGwsICggbWF0Y2hlck91dCA9IFtdICksIHRlbXAsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWRcblx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRpZiAoICggZWxlbSA9IG1hdGNoZXJPdXRbIGkgXSApICYmXG5cdFx0XHRcdFx0XHQoIHRlbXAgPSBwb3N0RmluZGVyID8gaW5kZXhPZiggc2VlZCwgZWxlbSApIDogcHJlTWFwWyBpIF0gKSA+IC0xICkge1xuXG5cdFx0XHRcdFx0XHRzZWVkWyB0ZW1wIF0gPSAhKCByZXN1bHRzWyB0ZW1wIF0gPSBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBBZGQgZWxlbWVudHMgdG8gcmVzdWx0cywgdGhyb3VnaCBwb3N0RmluZGVyIGlmIGRlZmluZWRcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlck91dCA9IGNvbmRlbnNlKFxuXHRcdFx0XHRtYXRjaGVyT3V0ID09PSByZXN1bHRzID9cblx0XHRcdFx0XHRtYXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3RpbmcsIG1hdGNoZXJPdXQubGVuZ3RoICkgOlxuXHRcdFx0XHRcdG1hdGNoZXJPdXRcblx0XHRcdCk7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdHBvc3RGaW5kZXIoIG51bGwsIHJlc3VsdHMsIG1hdGNoZXJPdXQsIHhtbCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgbWF0Y2hlck91dCApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSApO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWyAwIF0udHlwZSBdLFxuXHRcdGltcGxpY2l0UmVsYXRpdmUgPSBsZWFkaW5nUmVsYXRpdmUgfHwgRXhwci5yZWxhdGl2ZVsgXCIgXCIgXSxcblx0XHRpID0gbGVhZGluZ1JlbGF0aXZlID8gMSA6IDAsXG5cblx0XHQvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKVxuXHRcdG1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hBbnlDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZiggY2hlY2tDb250ZXh0LCBlbGVtICkgPiAtMTtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8IChcblx0XHRcdFx0KCBjaGVja0NvbnRleHQgPSBjb250ZXh0ICkubm9kZVR5cGUgP1xuXHRcdFx0XHRcdG1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRcdG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTtcblxuXHRcdFx0Ly8gQXZvaWQgaGFuZ2luZyBvbnRvIGVsZW1lbnQgKGlzc3VlICMyOTkpXG5cdFx0XHRjaGVja0NvbnRleHQgPSBudWxsO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9IF07XG5cblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0aWYgKCAoIG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbIGkgXS50eXBlIF0gKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKCBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlciApIF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXIgPSBFeHByLmZpbHRlclsgdG9rZW5zWyBpIF0udHlwZSBdLmFwcGx5KCBudWxsLCB0b2tlbnNbIGkgXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblxuXHRcdFx0XHQvLyBGaW5kIHRoZSBuZXh0IHJlbGF0aXZlIG9wZXJhdG9yIChpZiBhbnkpIGZvciBwcm9wZXIgaGFuZGxpbmdcblx0XHRcdFx0aiA9ICsraTtcblx0XHRcdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBFeHByLnJlbGF0aXZlWyB0b2tlbnNbIGogXS50eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNldE1hdGNoZXIoXG5cdFx0XHRcdFx0aSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksXG5cdFx0XHRcdFx0aSA+IDEgJiYgdG9TZWxlY3RvcihcblxuXHRcdFx0XHRcdC8vIElmIHRoZSBwcmVjZWRpbmcgdG9rZW4gd2FzIGEgZGVzY2VuZGFudCBjb21iaW5hdG9yLCBpbnNlcnQgYW4gaW1wbGljaXQgYW55LWVsZW1lbnQgYCpgXG5cdFx0XHRcdFx0dG9rZW5zXG5cdFx0XHRcdFx0XHQuc2xpY2UoIDAsIGkgLSAxIClcblx0XHRcdFx0XHRcdC5jb25jYXQoIHsgdmFsdWU6IHRva2Vuc1sgaSAtIDIgXS50eXBlID09PSBcIiBcIiA/IFwiKlwiIDogXCJcIiB9IClcblx0XHRcdFx0XHQpLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSxcblx0XHRcdFx0XHRtYXRjaGVyLFxuXHRcdFx0XHRcdGkgPCBqICYmIG1hdGNoZXJGcm9tVG9rZW5zKCB0b2tlbnMuc2xpY2UoIGksIGogKSApLFxuXHRcdFx0XHRcdGogPCBsZW4gJiYgbWF0Y2hlckZyb21Ub2tlbnMoICggdG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkgKSApLFxuXHRcdFx0XHRcdGogPCBsZW4gJiYgdG9TZWxlY3RvciggdG9rZW5zIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG1hdGNoZXJzLnB1c2goIG1hdGNoZXIgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApIHtcblx0dmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7XG5cdFx0XHR2YXIgZWxlbSwgaiwgbWF0Y2hlcixcblx0XHRcdFx0bWF0Y2hlZENvdW50ID0gMCxcblx0XHRcdFx0aSA9IFwiMFwiLFxuXHRcdFx0XHR1bm1hdGNoZWQgPSBzZWVkICYmIFtdLFxuXHRcdFx0XHRzZXRNYXRjaGVkID0gW10sXG5cdFx0XHRcdGNvbnRleHRCYWNrdXAgPSBvdXRlcm1vc3RDb250ZXh0LFxuXG5cdFx0XHRcdC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3Igb3V0ZXJtb3N0IGNvbnRleHRcblx0XHRcdFx0ZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbIFwiVEFHXCIgXSggXCIqXCIsIG91dGVybW9zdCApLFxuXG5cdFx0XHRcdC8vIFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyXG5cdFx0XHRcdGRpcnJ1bnNVbmlxdWUgPSAoIGRpcnJ1bnMgKz0gY29udGV4dEJhY2t1cCA9PSBudWxsID8gMSA6IE1hdGgucmFuZG9tKCkgfHwgMC4xICksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdFx0b3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHQgPT0gZG9jdW1lbnQgfHwgY29udGV4dCB8fCBvdXRlcm1vc3Q7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBlbGVtZW50cyBwYXNzaW5nIGVsZW1lbnRNYXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRzXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTw5LCBTYWZhcmlcblx0XHRcdC8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiBcImxlbmd0aFwiOyBTYWZhcmk6IDxudW1iZXI+KSBtYXRjaGluZyBlbGVtZW50cyBieSBpZFxuXHRcdFx0Zm9yICggOyBpICE9PSBsZW4gJiYgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHtcblx0XHRcdFx0XHRqID0gMDtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHRcdFx0aWYgKCAhY29udGV4dCAmJiBlbGVtLm93bmVyRG9jdW1lbnQgIT0gZG9jdW1lbnQgKSB7XG5cdFx0XHRcdFx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHRcdFx0XHRcdFx0eG1sID0gIWRvY3VtZW50SXNIVE1MO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR3aGlsZSAoICggbWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1sgaisrIF0gKSApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCB8fCBkb2N1bWVudCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdFx0XHRkaXJydW5zID0gZGlycnVuc1VuaXF1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUcmFjayB1bm1hdGNoZWQgZWxlbWVudHMgZm9yIHNldCBmaWx0ZXJzXG5cdFx0XHRcdGlmICggYnlTZXQgKSB7XG5cblx0XHRcdFx0XHQvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzXG5cdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtICkgKSB7XG5cdFx0XHRcdFx0XHRtYXRjaGVkQ291bnQtLTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90XG5cdFx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdFx0dW5tYXRjaGVkLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gYGlgIGlzIG5vdyB0aGUgY291bnQgb2YgZWxlbWVudHMgdmlzaXRlZCBhYm92ZSwgYW5kIGFkZGluZyBpdCB0byBgbWF0Y2hlZENvdW50YFxuXHRcdFx0Ly8gbWFrZXMgdGhlIGxhdHRlciBub25uZWdhdGl2ZS5cblx0XHRcdG1hdGNoZWRDb3VudCArPSBpO1xuXG5cdFx0XHQvLyBBcHBseSBzZXQgZmlsdGVycyB0byB1bm1hdGNoZWQgZWxlbWVudHNcblx0XHRcdC8vIE5PVEU6IFRoaXMgY2FuIGJlIHNraXBwZWQgaWYgdGhlcmUgYXJlIG5vIHVubWF0Y2hlZCBlbGVtZW50cyAoaS5lLiwgYG1hdGNoZWRDb3VudGBcblx0XHRcdC8vIGVxdWFscyBgaWApLCB1bmxlc3Mgd2UgZGlkbid0IHZpc2l0IF9hbnlfIGVsZW1lbnRzIGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGF2ZVxuXHRcdFx0Ly8gbm8gZWxlbWVudCBtYXRjaGVycyBhbmQgbm8gc2VlZC5cblx0XHRcdC8vIEluY3JlbWVudGluZyBhbiBpbml0aWFsbHktc3RyaW5nIFwiMFwiIGBpYCBhbGxvd3MgYGlgIHRvIHJlbWFpbiBhIHN0cmluZyBvbmx5IGluIHRoYXRcblx0XHRcdC8vIGNhc2UsIHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgXCIwMFwiIGBtYXRjaGVkQ291bnRgIHRoYXQgZGlmZmVycyBmcm9tIGBpYCBidXQgaXMgYWxzb1xuXHRcdFx0Ly8gbnVtZXJpY2FsbHkgemVyby5cblx0XHRcdGlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkge1xuXHRcdFx0XHRqID0gMDtcblx0XHRcdFx0d2hpbGUgKCAoIG1hdGNoZXIgPSBzZXRNYXRjaGVyc1sgaisrIF0gKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzZWVkICkge1xuXG5cdFx0XHRcdFx0Ly8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZ1xuXHRcdFx0XHRcdGlmICggbWF0Y2hlZENvdW50ID4gMCApIHtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoICEoIHVubWF0Y2hlZFsgaSBdIHx8IHNldE1hdGNoZWRbIGkgXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHNldE1hdGNoZWRbIGkgXSA9IHBvcC5jYWxsKCByZXN1bHRzICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlc1xuXHRcdFx0XHRcdHNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQWRkIG1hdGNoZXMgdG8gcmVzdWx0c1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZXRNYXRjaGVkICk7XG5cblx0XHRcdFx0Ly8gU2VlZGxlc3Mgc2V0IG1hdGNoZXMgc3VjY2VlZGluZyBtdWx0aXBsZSBzdWNjZXNzZnVsIG1hdGNoZXJzIHN0aXB1bGF0ZSBzb3J0aW5nXG5cdFx0XHRcdGlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdCggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkge1xuXG5cdFx0XHRcdFx0U2l6emxlLnVuaXF1ZVNvcnQoIHJlc3VsdHMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnNcblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRkaXJydW5zID0gZGlycnVuc1VuaXF1ZTtcblx0XHRcdFx0b3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHRCYWNrdXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB1bm1hdGNoZWQ7XG5cdFx0fTtcblxuXHRyZXR1cm4gYnlTZXQgP1xuXHRcdG1hcmtGdW5jdGlvbiggc3VwZXJNYXRjaGVyICkgOlxuXHRcdHN1cGVyTWF0Y2hlcjtcbn1cblxuY29tcGlsZSA9IFNpenpsZS5jb21waWxlID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBtYXRjaCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHtcblx0dmFyIGksXG5cdFx0c2V0TWF0Y2hlcnMgPSBbXSxcblx0XHRlbGVtZW50TWF0Y2hlcnMgPSBbXSxcblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCAhY2FjaGVkICkge1xuXG5cdFx0Ly8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50XG5cdFx0aWYgKCAhbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdH1cblx0XHRpID0gbWF0Y2gubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0Y2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIG1hdGNoWyBpIF0gKTtcblx0XHRcdGlmICggY2FjaGVkWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhY2hlIHRoZSBjb21waWxlZCBmdW5jdGlvblxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGUoXG5cdFx0XHRzZWxlY3Rvcixcblx0XHRcdG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApXG5cdFx0KTtcblxuXHRcdC8vIFNhdmUgc2VsZWN0b3IgYW5kIHRva2VuaXphdGlvblxuXHRcdGNhY2hlZC5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHR9XG5cdHJldHVybiBjYWNoZWQ7XG59O1xuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbnNlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKCBzZWxlY3RvciA9IGNvbXBpbGVkLnNlbGVjdG9yIHx8IHNlbGVjdG9yICkgKTtcblxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblxuXHQvLyBUcnkgdG8gbWluaW1pemUgb3BlcmF0aW9ucyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBzZWxlY3RvciBpbiB0aGUgbGlzdCBhbmQgbm8gc2VlZFxuXHQvLyAodGhlIGxhdHRlciBvZiB3aGljaCBndWFyYW50ZWVzIHVzIGNvbnRleHQpXG5cdGlmICggbWF0Y2gubGVuZ3RoID09PSAxICkge1xuXG5cdFx0Ly8gUmVkdWNlIGNvbnRleHQgaWYgdGhlIGxlYWRpbmcgY29tcG91bmQgc2VsZWN0b3IgaXMgYW4gSURcblx0XHR0b2tlbnMgPSBtYXRjaFsgMCBdID0gbWF0Y2hbIDAgXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKCB0b2tlbiA9IHRva2Vuc1sgMCBdICkudHlwZSA9PT0gXCJJRFwiICYmXG5cdFx0XHRjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmIGRvY3VtZW50SXNIVE1MICYmIEV4cHIucmVsYXRpdmVbIHRva2Vuc1sgMSBdLnR5cGUgXSApIHtcblxuXHRcdFx0Y29udGV4dCA9ICggRXhwci5maW5kWyBcIklEXCIgXSggdG9rZW4ubWF0Y2hlc1sgMCBdXG5cdFx0XHRcdC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLCBjb250ZXh0ICkgfHwgW10gKVsgMCBdO1xuXHRcdFx0aWYgKCAhY29udGV4dCApIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdC8vIFByZWNvbXBpbGVkIG1hdGNoZXJzIHdpbGwgc3RpbGwgdmVyaWZ5IGFuY2VzdHJ5LCBzbyBzdGVwIHVwIGEgbGV2ZWxcblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBpbGVkICkge1xuXHRcdFx0XHRjb250ZXh0ID0gY29udGV4dC5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS52YWx1ZS5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGZXRjaCBhIHNlZWQgc2V0IGZvciByaWdodC10by1sZWZ0IG1hdGNoaW5nXG5cdFx0aSA9IG1hdGNoRXhwclsgXCJuZWVkc0NvbnRleHRcIiBdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRva2VuID0gdG9rZW5zWyBpIF07XG5cblx0XHRcdC8vIEFib3J0IGlmIHdlIGhpdCBhIGNvbWJpbmF0b3Jcblx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgKCB0eXBlID0gdG9rZW4udHlwZSApIF0gKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAoIGZpbmQgPSBFeHByLmZpbmRbIHR5cGUgXSApICkge1xuXG5cdFx0XHRcdC8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9yc1xuXHRcdFx0XHRpZiAoICggc2VlZCA9IGZpbmQoXG5cdFx0XHRcdFx0dG9rZW4ubWF0Y2hlc1sgMCBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICksXG5cdFx0XHRcdFx0cnNpYmxpbmcudGVzdCggdG9rZW5zWyAwIF0udHlwZSApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fFxuXHRcdFx0XHRcdFx0Y29udGV4dFxuXHRcdFx0XHQpICkgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHlcblx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTtcblx0XHRcdFx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNlZWQgKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbiBpZiBvbmUgaXMgbm90IHByb3ZpZGVkXG5cdC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmVcblx0KCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKFxuXHRcdHNlZWQsXG5cdFx0Y29udGV4dCxcblx0XHQhZG9jdW1lbnRJc0hUTUwsXG5cdFx0cmVzdWx0cyxcblx0XHQhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdCk7XG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLy8gT25lLXRpbWUgYXNzaWdubWVudHNcblxuLy8gU29ydCBzdGFiaWxpdHlcbnN1cHBvcnQuc29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoIFwiXCIgKS5zb3J0KCBzb3J0T3JkZXIgKS5qb2luKCBcIlwiICkgPT09IGV4cGFuZG87XG5cbi8vIFN1cHBvcnQ6IENocm9tZSAxNC0zNStcbi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25cbnN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9ICEhaGFzRHVwbGljYXRlO1xuXG4vLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnRcbnNldERvY3VtZW50KCk7XG5cbi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpXG4vLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFjaCBvdGhlcipcbnN1cHBvcnQuc29ydERldGFjaGVkID0gYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cblx0Ly8gU2hvdWxkIHJldHVybiAxLCBidXQgcmV0dXJucyA0IChmb2xsb3dpbmcpXG5cdHJldHVybiBlbC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJmaWVsZHNldFwiICkgKSAmIDE7XG59ICk7XG5cbi8vIFN1cHBvcnQ6IElFPDhcbi8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5IFwiaW50ZXJwb2xhdGlvblwiXG4vLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweFxuaWYgKCAhYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cdGVsLmlubmVySFRNTCA9IFwiPGEgaHJlZj0nIyc+PC9hPlwiO1xuXHRyZXR1cm4gZWwuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoIFwiaHJlZlwiICkgPT09IFwiI1wiO1xufSApICkge1xuXHRhZGRIYW5kbGUoIFwidHlwZXxocmVmfGhlaWdodHx3aWR0aFwiLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0eXBlXCIgPyAxIDogMiApO1xuXHRcdH1cblx0fSApO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZGVmYXVsdFZhbHVlIGluIHBsYWNlIG9mIGdldEF0dHJpYnV0ZShcInZhbHVlXCIpXG5pZiAoICFzdXBwb3J0LmF0dHJpYnV0ZXMgfHwgIWFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxpbnB1dC8+XCI7XG5cdGVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCBcInZhbHVlXCIsIFwiXCIgKTtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gXCJcIjtcbn0gKSApIHtcblx0YWRkSGFuZGxlKCBcInZhbHVlXCIsIGZ1bmN0aW9uKCBlbGVtLCBfbmFtZSwgaXNYTUwgKSB7XG5cdFx0aWYgKCAhaXNYTUwgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kZWZhdWx0VmFsdWU7XG5cdFx0fVxuXHR9ICk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXNcbmlmICggIWFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRyZXR1cm4gZWwuZ2V0QXR0cmlidXRlKCBcImRpc2FibGVkXCIgKSA9PSBudWxsO1xufSApICkge1xuXHRhZGRIYW5kbGUoIGJvb2xlYW5zLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0dmFyIHZhbDtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtWyBuYW1lIF0gPT09IHRydWUgPyBuYW1lLnRvTG93ZXJDYXNlKCkgOlxuXHRcdFx0XHQoIHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApICkgJiYgdmFsLnNwZWNpZmllZCA/XG5cdFx0XHRcdFx0dmFsLnZhbHVlIDpcblx0XHRcdFx0XHRudWxsO1xuXHRcdH1cblx0fSApO1xufVxuXG5yZXR1cm4gU2l6emxlO1xuXG59ICkoIHdpbmRvdyApO1xuXG5cblxualF1ZXJ5LmZpbmQgPSBTaXp6bGU7XG5qUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7XG5cbi8vIERlcHJlY2F0ZWRcbmpRdWVyeS5leHByWyBcIjpcIiBdID0galF1ZXJ5LmV4cHIucHNldWRvcztcbmpRdWVyeS51bmlxdWVTb3J0ID0galF1ZXJ5LnVuaXF1ZSA9IFNpenpsZS51bmlxdWVTb3J0O1xualF1ZXJ5LnRleHQgPSBTaXp6bGUuZ2V0VGV4dDtcbmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDtcbmpRdWVyeS5jb250YWlucyA9IFNpenpsZS5jb250YWlucztcbmpRdWVyeS5lc2NhcGVTZWxlY3RvciA9IFNpenpsZS5lc2NhcGU7XG5cblxuXG5cbnZhciBkaXIgPSBmdW5jdGlvbiggZWxlbSwgZGlyLCB1bnRpbCApIHtcblx0dmFyIG1hdGNoZWQgPSBbXSxcblx0XHR0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7XG5cblx0d2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7XG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0aWYgKCB0cnVuY2F0ZSAmJiBqUXVlcnkoIGVsZW0gKS5pcyggdW50aWwgKSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRtYXRjaGVkLnB1c2goIGVsZW0gKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1hdGNoZWQ7XG59O1xuXG5cbnZhciBzaWJsaW5ncyA9IGZ1bmN0aW9uKCBuLCBlbGVtICkge1xuXHR2YXIgbWF0Y2hlZCA9IFtdO1xuXG5cdGZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7XG5cdFx0aWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7XG5cdFx0XHRtYXRjaGVkLnB1c2goIG4gKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbWF0Y2hlZDtcbn07XG5cblxudmFyIHJuZWVkc0NvbnRleHQgPSBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7XG5cblxuXG5mdW5jdGlvbiBub2RlTmFtZSggZWxlbSwgbmFtZSApIHtcblxuXHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKTtcblxufVxudmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXFwvXFwwPjpcXHgyMFxcdFxcclxcblxcZl0qKVtcXHgyMFxcdFxcclxcblxcZl0qXFwvPz4oPzo8XFwvXFwxPnwpJC9pICk7XG5cblxuXG4vLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdFxuZnVuY3Rpb24gd2lubm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBub3QgKSB7XG5cdGlmICggaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gU2luZ2xlIGVsZW1lbnRcblx0aWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KVxuXHRpZiAoIHR5cGVvZiBxdWFsaWZpZXIgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID4gLTEgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEZpbHRlcmVkIGRpcmVjdGx5IGZvciBib3RoIHNpbXBsZSBhbmQgY29tcGxleCBzZWxlY3RvcnNcblx0cmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApO1xufVxuXG5qUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7XG5cdHZhciBlbGVtID0gZWxlbXNbIDAgXTtcblxuXHRpZiAoIG5vdCApIHtcblx0XHRleHByID0gXCI6bm90KFwiICsgZXhwciArIFwiKVwiO1xuXHR9XG5cblx0aWYgKCBlbGVtcy5sZW5ndGggPT09IDEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBleHByICkgPyBbIGVsZW0gXSA6IFtdO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXMoIGV4cHIsIGpRdWVyeS5ncmVwKCBlbGVtcywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7XG5cdH0gKSApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGksIHJldCxcblx0XHRcdGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0c2VsZiA9IHRoaXM7XG5cblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHNlbGZbIGkgXSwgdGhpcyApICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cblx0XHRyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRqUXVlcnkuZmluZCggc2VsZWN0b3IsIHNlbGZbIGkgXSwgcmV0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7XG5cdH0sXG5cdGZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgZmFsc2UgKSApO1xuXHR9LFxuXHRub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyggdGhpcywgc2VsZWN0b3IgfHwgW10sIHRydWUgKSApO1xuXHR9LFxuXHRpczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiAhIXdpbm5vdyhcblx0XHRcdHRoaXMsXG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXRcblx0XHRcdC8vIHNvICQoXCJwOmZpcnN0XCIpLmlzKFwicDpsYXN0XCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRoIHR3byBcInBcIi5cblx0XHRcdHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiAmJiBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgP1xuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9yICkgOlxuXHRcdFx0XHRzZWxlY3RvciB8fCBbXSxcblx0XHRcdGZhbHNlXG5cdFx0KS5sZW5ndGg7XG5cdH1cbn0gKTtcblxuXG4vLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdFxuXG5cbi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KVxudmFyIHJvb3RqUXVlcnksXG5cblx0Ly8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Ncblx0Ly8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKHRyYWMtOTUyMSlcblx0Ly8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKHRyYWMtMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHQvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkXG5cdHJxdWlja0V4cHIgPSAvXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0rKSkkLyxcblxuXHRpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7XG5cdFx0dmFyIG1hdGNoLCBlbGVtO1xuXG5cdFx0Ly8gSEFORExFOiAkKFwiXCIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpXG5cdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHQvLyBNZXRob2QgaW5pdCgpIGFjY2VwdHMgYW4gYWx0ZXJuYXRlIHJvb3RqUXVlcnlcblx0XHQvLyBzbyBtaWdyYXRlIGNhbiBzdXBwb3J0IGpRdWVyeS5zdWIgKGdoLTIxMDEpXG5cdFx0cm9vdCA9IHJvb3QgfHwgcm9vdGpRdWVyeTtcblxuXHRcdC8vIEhhbmRsZSBIVE1MIHN0cmluZ3Ncblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGlmICggc2VsZWN0b3JbIDAgXSA9PT0gXCI8XCIgJiZcblx0XHRcdFx0c2VsZWN0b3JbIHNlbGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gXCI+XCIgJiZcblx0XHRcdFx0c2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XG5cblx0XHRcdFx0Ly8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2tcblx0XHRcdFx0bWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkXG5cdFx0XHRpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkge1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KVxuXHRcdFx0XHRpZiAoIG1hdGNoWyAxIF0gKSB7XG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZXh0WyAwIF0gOiBjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoXG5cdFx0XHRcdFx0XHRtYXRjaFsgMSBdLFxuXHRcdFx0XHRcdFx0Y29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpICk7XG5cblx0XHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWyAxIF0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkge1xuXHRcdFx0XHRcdFx0Zm9yICggbWF0Y2ggaW4gY29udGV4dCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTtcblxuXHRcdFx0XHRcdGlmICggZWxlbSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3Rcblx0XHRcdFx0XHRcdHRoaXNbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpc1sgMCBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkge1xuXHRcdFx0cmV0dXJuIHJvb3QucmVhZHkgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHJvb3QucmVhZHkoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0c2VsZWN0b3IoIGpRdWVyeSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xuXHR9O1xuXG4vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uXG5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcblxuLy8gSW5pdGlhbGl6ZSBjZW50cmFsIHJlZmVyZW5jZVxucm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTtcblxuXG52YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXG5cblx0Ly8gTWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXRcblx0Z3VhcmFudGVlZFVuaXF1ZSA9IHtcblx0XHRjaGlsZHJlbjogdHJ1ZSxcblx0XHRjb250ZW50czogdHJ1ZSxcblx0XHRuZXh0OiB0cnVlLFxuXHRcdHByZXY6IHRydWVcblx0fTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRoYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0dmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLFxuXHRcdFx0bCA9IHRhcmdldHMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHRhcmdldHNbIGkgXSApICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7XG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0bWF0Y2hlZCA9IFtdLFxuXHRcdFx0dGFyZ2V0cyA9IHR5cGVvZiBzZWxlY3RvcnMgIT09IFwic3RyaW5nXCIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTtcblxuXHRcdC8vIFBvc2l0aW9uYWwgc2VsZWN0b3JzIG5ldmVyIG1hdGNoLCBzaW5jZSB0aGVyZSdzIG5vIF9zZWxlY3Rpb25fIGNvbnRleHRcblx0XHRpZiAoICFybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9ycyApICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmb3IgKCBjdXIgPSB0aGlzWyBpIF07IGN1ciAmJiBjdXIgIT09IGNvbnRleHQ7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXG5cdFx0XHRcdFx0Ly8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAoIHRhcmdldHMgP1xuXHRcdFx0XHRcdFx0dGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IHBhc3Mgbm9uLWVsZW1lbnRzIHRvIFNpenpsZVxuXHRcdFx0XHRcdFx0Y3VyLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggY3VyLCBzZWxlY3RvcnMgKSApICkge1xuXG5cdFx0XHRcdFx0XHRtYXRjaGVkLnB1c2goIGN1ciApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApO1xuXHR9LFxuXG5cdC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhlIHNldFxuXHRpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudFxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7XG5cdFx0fVxuXG5cdFx0Ly8gSW5kZXggaW4gc2VsZWN0b3Jcblx0XHRpZiAoIHR5cGVvZiBlbGVtID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNbIDAgXSApO1xuXHRcdH1cblxuXHRcdC8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudFxuXHRcdHJldHVybiBpbmRleE9mLmNhbGwoIHRoaXMsXG5cblx0XHRcdC8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZFxuXHRcdFx0ZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBlbGVtXG5cdFx0KTtcblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soXG5cdFx0XHRqUXVlcnkudW5pcXVlU29ydChcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLmdldCgpLCBqUXVlcnkoIHNlbGVjdG9yLCBjb250ZXh0ICkgKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkQmFjazogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLmFkZCggc2VsZWN0b3IgPT0gbnVsbCA/XG5cdFx0XHR0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKCBzZWxlY3RvciApXG5cdFx0KTtcblx0fVxufSApO1xuXG5mdW5jdGlvbiBzaWJsaW5nKCBjdXIsIGRpciApIHtcblx0d2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fVxuXHRyZXR1cm4gY3VyO1xufVxuXG5qUXVlcnkuZWFjaCgge1xuXHRwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0cmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDtcblx0fSxcblx0cGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIgKTtcblx0fSxcblx0cGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgX2ksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiLCB1bnRpbCApO1xuXHR9LFxuXHRuZXh0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXY6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIF9pLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHByZXZVbnRpbDogZnVuY3Rpb24oIGVsZW0sIF9pLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTtcblx0fSxcblx0Y2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7XG5cdH0sXG5cdGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRpZiAoIGVsZW0uY29udGVudERvY3VtZW50ICE9IG51bGwgJiZcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErXG5cdFx0XHQvLyA8b2JqZWN0PiBlbGVtZW50cyB3aXRoIG5vIGBkYXRhYCBhdHRyaWJ1dGUgaGFzIGFuIG9iamVjdFxuXHRcdFx0Ly8gYGNvbnRlbnREb2N1bWVudGAgd2l0aCBhIGBudWxsYCBwcm90b3R5cGUuXG5cdFx0XHRnZXRQcm90byggZWxlbS5jb250ZW50RG9jdW1lbnQgKSApIHtcblxuXHRcdFx0cmV0dXJuIGVsZW0uY29udGVudERvY3VtZW50O1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5LCBpT1MgNyBvbmx5LCBBbmRyb2lkIEJyb3dzZXIgPD00LjMgb25seVxuXHRcdC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdFxuXHRcdC8vIGRvbid0IHN1cHBvcnQgaXQuXG5cdFx0aWYgKCBub2RlTmFtZSggZWxlbSwgXCJ0ZW1wbGF0ZVwiICkgKSB7XG5cdFx0XHRlbGVtID0gZWxlbS5jb250ZW50IHx8IGVsZW07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpRdWVyeS5tZXJnZSggW10sIGVsZW0uY2hpbGROb2RlcyApO1xuXHR9XG59LCBmdW5jdGlvbiggbmFtZSwgZm4gKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHtcblx0XHR2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApO1xuXG5cdFx0aWYgKCBuYW1lLnNsaWNlKCAtNSApICE9PSBcIlVudGlsXCIgKSB7XG5cdFx0XHRzZWxlY3RvciA9IHVudGlsO1xuXHRcdH1cblxuXHRcdGlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0bWF0Y2hlZCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBtYXRjaGVkICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGVzXG5cdFx0XHRpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS51bmlxdWVTb3J0KCBtYXRjaGVkICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldmVyc2Ugb3JkZXIgZm9yIHBhcmVudHMqIGFuZCBwcmV2LWRlcml2YXRpdmVzXG5cdFx0XHRpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7XG5cdFx0XHRcdG1hdGNoZWQucmV2ZXJzZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZCApO1xuXHR9O1xufSApO1xudmFyIHJub3RodG1sd2hpdGUgPSAoIC9bXlxceDIwXFx0XFxyXFxuXFxmXSsvZyApO1xuXG5cblxuLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXNcbmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7XG5cdHZhciBvYmplY3QgPSB7fTtcblx0alF1ZXJ5LmVhY2goIG9wdGlvbnMubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSwgZnVuY3Rpb24oIF8sIGZsYWcgKSB7XG5cdFx0b2JqZWN0WyBmbGFnIF0gPSB0cnVlO1xuXHR9ICk7XG5cdHJldHVybiBvYmplY3Q7XG59XG5cbi8qXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczpcbiAqXG4gKlx0b3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvd1xuICpcdFx0XHR0aGUgY2FsbGJhY2sgbGlzdCBiZWhhdmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBvcHRpb24gb2JqZWN0XG4gKlxuICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmVcbiAqIFwiZmlyZWRcIiBtdWx0aXBsZSB0aW1lcy5cbiAqXG4gKiBQb3NzaWJsZSBvcHRpb25zOlxuICpcbiAqXHRvbmNlOlx0XHRcdHdpbGwgZW5zdXJlIHRoZSBjYWxsYmFjayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2UgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0bWVtb3J5Olx0XHRcdHdpbGwga2VlcCB0cmFjayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdpbGwgY2FsbCBhbnkgY2FsbGJhY2sgYWRkZWRcbiAqXHRcdFx0XHRcdGFmdGVyIHRoZSBsaXN0IGhhcyBiZWVuIGZpcmVkIHJpZ2h0IGF3YXkgd2l0aCB0aGUgbGF0ZXN0IFwibWVtb3JpemVkXCJcbiAqXHRcdFx0XHRcdHZhbHVlcyAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHR1bmlxdWU6XHRcdFx0d2lsbCBlbnN1cmUgYSBjYWxsYmFjayBjYW4gb25seSBiZSBhZGRlZCBvbmNlIChubyBkdXBsaWNhdGUgaW4gdGhlIGxpc3QpXG4gKlxuICpcdHN0b3BPbkZhbHNlOlx0aW50ZXJydXB0IGNhbGxpbmdzIHdoZW4gYSBjYWxsYmFjayByZXR1cm5zIGZhbHNlXG4gKlxuICovXG5qUXVlcnkuQ2FsbGJhY2tzID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0Ly8gQ29udmVydCBvcHRpb25zIGZyb20gU3RyaW5nLWZvcm1hdHRlZCB0byBPYmplY3QtZm9ybWF0dGVkIGlmIG5lZWRlZFxuXHQvLyAod2UgY2hlY2sgaW4gY2FjaGUgZmlyc3QpXG5cdG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0Y3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIDpcblx0XHRqUXVlcnkuZXh0ZW5kKCB7fSwgb3B0aW9ucyApO1xuXG5cdHZhciAvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nXG5cdFx0ZmlyaW5nLFxuXG5cdFx0Ly8gTGFzdCBmaXJlIHZhbHVlIGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHNcblx0XHRtZW1vcnksXG5cblx0XHQvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCB3YXMgYWxyZWFkeSBmaXJlZFxuXHRcdGZpcmVkLFxuXG5cdFx0Ly8gRmxhZyB0byBwcmV2ZW50IGZpcmluZ1xuXHRcdGxvY2tlZCxcblxuXHRcdC8vIEFjdHVhbCBjYWxsYmFjayBsaXN0XG5cdFx0bGlzdCA9IFtdLFxuXG5cdFx0Ly8gUXVldWUgb2YgZXhlY3V0aW9uIGRhdGEgZm9yIHJlcGVhdGFibGUgbGlzdHNcblx0XHRxdWV1ZSA9IFtdLFxuXG5cdFx0Ly8gSW5kZXggb2YgY3VycmVudGx5IGZpcmluZyBjYWxsYmFjayAobW9kaWZpZWQgYnkgYWRkL3JlbW92ZSBhcyBuZWVkZWQpXG5cdFx0ZmlyaW5nSW5kZXggPSAtMSxcblxuXHRcdC8vIEZpcmUgY2FsbGJhY2tzXG5cdFx0ZmlyZSA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBFbmZvcmNlIHNpbmdsZS1maXJpbmdcblx0XHRcdGxvY2tlZCA9IGxvY2tlZCB8fCBvcHRpb25zLm9uY2U7XG5cblx0XHRcdC8vIEV4ZWN1dGUgY2FsbGJhY2tzIGZvciBhbGwgcGVuZGluZyBleGVjdXRpb25zLFxuXHRcdFx0Ly8gcmVzcGVjdGluZyBmaXJpbmdJbmRleCBvdmVycmlkZXMgYW5kIHJ1bnRpbWUgY2hhbmdlc1xuXHRcdFx0ZmlyZWQgPSBmaXJpbmcgPSB0cnVlO1xuXHRcdFx0Zm9yICggOyBxdWV1ZS5sZW5ndGg7IGZpcmluZ0luZGV4ID0gLTEgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRcdHdoaWxlICggKytmaXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0Ly8gUnVuIGNhbGxiYWNrIGFuZCBjaGVjayBmb3IgZWFybHkgdGVybWluYXRpb25cblx0XHRcdFx0XHRpZiAoIGxpc3RbIGZpcmluZ0luZGV4IF0uYXBwbHkoIG1lbW9yeVsgMCBdLCBtZW1vcnlbIDEgXSApID09PSBmYWxzZSAmJlxuXHRcdFx0XHRcdFx0b3B0aW9ucy5zdG9wT25GYWxzZSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSnVtcCB0byBlbmQgYW5kIGZvcmdldCB0aGUgZGF0YSBzbyAuYWRkIGRvZXNuJ3QgcmUtZmlyZVxuXHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXggPSBsaXN0Lmxlbmd0aDtcblx0XHRcdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBGb3JnZXQgdGhlIGRhdGEgaWYgd2UncmUgZG9uZSB3aXRoIGl0XG5cdFx0XHRpZiAoICFvcHRpb25zLm1lbW9yeSApIHtcblx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGZpcmluZyA9IGZhbHNlO1xuXG5cdFx0XHQvLyBDbGVhbiB1cCBpZiB3ZSdyZSBkb25lIGZpcmluZyBmb3IgZ29vZFxuXHRcdFx0aWYgKCBsb2NrZWQgKSB7XG5cblx0XHRcdFx0Ly8gS2VlcCBhbiBlbXB0eSBsaXN0IGlmIHdlIGhhdmUgZGF0YSBmb3IgZnV0dXJlIGFkZCBjYWxsc1xuXHRcdFx0XHRpZiAoIG1lbW9yeSApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCB0aGlzIG9iamVjdCBpcyBzcGVudFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGxpc3QgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0XG5cdFx0c2VsZiA9IHtcblxuXHRcdFx0Ly8gQWRkIGEgY2FsbGJhY2sgb3IgYSBjb2xsZWN0aW9uIG9mIGNhbGxiYWNrcyB0byB0aGUgbGlzdFxuXHRcdFx0YWRkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBtZW1vcnkgZnJvbSBhIHBhc3QgcnVuLCB3ZSBzaG91bGQgZmlyZSBhZnRlciBhZGRpbmdcblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXggPSBsaXN0Lmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBtZW1vcnkgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQoIGZ1bmN0aW9uIGFkZCggYXJncyApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIGlzRnVuY3Rpb24oIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsaXN0LnB1c2goIGFyZyApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdG9UeXBlKCBhcmcgKSAhPT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIEluc3BlY3QgcmVjdXJzaXZlbHlcblx0XHRcdFx0XHRcdFx0XHRhZGQoIGFyZyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0fSApKCBhcmd1bWVudHMgKTtcblxuXHRcdFx0XHRcdGlmICggbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdFxuXHRcdFx0cmVtb3ZlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHR2YXIgaW5kZXg7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7XG5cdFx0XHRcdFx0XHRsaXN0LnNwbGljZSggaW5kZXgsIDEgKTtcblxuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGZpcmluZyBpbmRleGVzXG5cdFx0XHRcdFx0XHRpZiAoIGluZGV4IDw9IGZpcmluZ0luZGV4ICkge1xuXHRcdFx0XHRcdFx0XHRmaXJpbmdJbmRleC0tO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIENoZWNrIGlmIGEgZ2l2ZW4gY2FsbGJhY2sgaXMgaW4gdGhlIGxpc3QuXG5cdFx0XHQvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC5cblx0XHRcdGhhczogZnVuY3Rpb24oIGZuICkge1xuXHRcdFx0XHRyZXR1cm4gZm4gP1xuXHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTEgOlxuXHRcdFx0XHRcdGxpc3QubGVuZ3RoID4gMDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3Rcblx0XHRcdGVtcHR5OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmUgYW5kIC5hZGRcblx0XHRcdC8vIEFib3J0IGFueSBjdXJyZW50L3BlbmRpbmcgZXhlY3V0aW9uc1xuXHRcdFx0Ly8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzXG5cdFx0XHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gcXVldWUgPSBbXTtcblx0XHRcdFx0bGlzdCA9IG1lbW9yeSA9IFwiXCI7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdGRpc2FibGVkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICFsaXN0O1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRGlzYWJsZSAuZmlyZVxuXHRcdFx0Ly8gQWxzbyBkaXNhYmxlIC5hZGQgdW5sZXNzIHdlIGhhdmUgbWVtb3J5IChzaW5jZSBpdCB3b3VsZCBoYXZlIG5vIGVmZmVjdClcblx0XHRcdC8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdGxvY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsb2NrZWQgPSBxdWV1ZSA9IFtdO1xuXHRcdFx0XHRpZiAoICFtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRsaXN0ID0gbWVtb3J5ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHRsb2NrZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFsb2NrZWQ7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzXG5cdFx0XHRmaXJlV2l0aDogZnVuY3Rpb24oIGNvbnRleHQsIGFyZ3MgKSB7XG5cdFx0XHRcdGlmICggIWxvY2tlZCApIHtcblx0XHRcdFx0XHRhcmdzID0gYXJncyB8fCBbXTtcblx0XHRcdFx0XHRhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdO1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGFyZ3MgKTtcblx0XHRcdFx0XHRpZiAoICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2FsbCBhbGwgdGhlIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHNcblx0XHRcdGZpcmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRzZWxmLmZpcmVXaXRoKCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBUbyBrbm93IGlmIHRoZSBjYWxsYmFja3MgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2Vcblx0XHRcdGZpcmVkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhZmlyZWQ7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRyZXR1cm4gc2VsZjtcbn07XG5cblxuZnVuY3Rpb24gSWRlbnRpdHkoIHYgKSB7XG5cdHJldHVybiB2O1xufVxuZnVuY3Rpb24gVGhyb3dlciggZXggKSB7XG5cdHRocm93IGV4O1xufVxuXG5mdW5jdGlvbiBhZG9wdFZhbHVlKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0LCBub1ZhbHVlICkge1xuXHR2YXIgbWV0aG9kO1xuXG5cdHRyeSB7XG5cblx0XHQvLyBDaGVjayBmb3IgcHJvbWlzZSBhc3BlY3QgZmlyc3QgdG8gcHJpdmlsZWdlIHN5bmNocm9ub3VzIGJlaGF2aW9yXG5cdFx0aWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnByb21pc2UgKSApICkge1xuXHRcdFx0bWV0aG9kLmNhbGwoIHZhbHVlICkuZG9uZSggcmVzb2x2ZSApLmZhaWwoIHJlamVjdCApO1xuXG5cdFx0Ly8gT3RoZXIgdGhlbmFibGVzXG5cdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgaXNGdW5jdGlvbiggKCBtZXRob2QgPSB2YWx1ZS50aGVuICkgKSApIHtcblx0XHRcdG1ldGhvZC5jYWxsKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0ICk7XG5cblx0XHQvLyBPdGhlciBub24tdGhlbmFibGVzXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gQ29udHJvbCBgcmVzb2x2ZWAgYXJndW1lbnRzIGJ5IGxldHRpbmcgQXJyYXkjc2xpY2UgY2FzdCBib29sZWFuIGBub1ZhbHVlYCB0byBpbnRlZ2VyOlxuXHRcdFx0Ly8gKiBmYWxzZTogWyB2YWx1ZSBdLnNsaWNlKCAwICkgPT4gcmVzb2x2ZSggdmFsdWUgKVxuXHRcdFx0Ly8gKiB0cnVlOiBbIHZhbHVlIF0uc2xpY2UoIDEgKSA9PiByZXNvbHZlKClcblx0XHRcdHJlc29sdmUuYXBwbHkoIHVuZGVmaW5lZCwgWyB2YWx1ZSBdLnNsaWNlKCBub1ZhbHVlICkgKTtcblx0XHR9XG5cblx0Ly8gRm9yIFByb21pc2VzL0ErLCBjb252ZXJ0IGV4Y2VwdGlvbnMgaW50byByZWplY3Rpb25zXG5cdC8vIFNpbmNlIGpRdWVyeS53aGVuIGRvZXNuJ3QgdW53cmFwIHRoZW5hYmxlcywgd2UgY2FuIHNraXAgdGhlIGV4dHJhIGNoZWNrcyBhcHBlYXJpbmcgaW5cblx0Ly8gRGVmZXJyZWQjdGhlbiB0byBjb25kaXRpb25hbGx5IHN1cHByZXNzIHJlamVjdGlvbi5cblx0fSBjYXRjaCAoIHZhbHVlICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAgb25seVxuXHRcdC8vIFN0cmljdCBtb2RlIGZ1bmN0aW9ucyBpbnZva2VkIHdpdGhvdXQgLmNhbGwvLmFwcGx5IGdldCBnbG9iYWwtb2JqZWN0IGNvbnRleHRcblx0XHRyZWplY3QuYXBwbHkoIHVuZGVmaW5lZCwgWyB2YWx1ZSBdICk7XG5cdH1cbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdERlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHtcblx0XHR2YXIgdHVwbGVzID0gW1xuXG5cdFx0XHRcdC8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBjYWxsYmFja3MsXG5cdFx0XHRcdC8vIC4uLiAudGhlbiBoYW5kbGVycywgYXJndW1lbnQgaW5kZXgsIFtmaW5hbCBzdGF0ZV1cblx0XHRcdFx0WyBcIm5vdGlmeVwiLCBcInByb2dyZXNzXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwibWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm1lbW9yeVwiICksIDIgXSxcblx0XHRcdFx0WyBcInJlc29sdmVcIiwgXCJkb25lXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCAwLCBcInJlc29sdmVkXCIgXSxcblx0XHRcdFx0WyBcInJlamVjdFwiLCBcImZhaWxcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksIDEsIFwicmVqZWN0ZWRcIiBdXG5cdFx0XHRdLFxuXHRcdFx0c3RhdGUgPSBcInBlbmRpbmdcIixcblx0XHRcdHByb21pc2UgPSB7XG5cdFx0XHRcdHN0YXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gc3RhdGU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFsd2F5czogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQuZG9uZSggYXJndW1lbnRzICkuZmFpbCggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwiY2F0Y2hcIjogZnVuY3Rpb24oIGZuICkge1xuXHRcdFx0XHRcdHJldHVybiBwcm9taXNlLnRoZW4oIG51bGwsIGZuICk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gS2VlcCBwaXBlIGZvciBiYWNrLWNvbXBhdFxuXHRcdFx0XHRwaXBlOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7XG5cdFx0XHRcdFx0dmFyIGZucyA9IGFyZ3VtZW50cztcblxuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBfaSwgdHVwbGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpXG5cdFx0XHRcdFx0XHRcdHZhciBmbiA9IGlzRnVuY3Rpb24oIGZuc1sgdHVwbGVbIDQgXSBdICkgJiYgZm5zWyB0dXBsZVsgNCBdIF07XG5cblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQucHJvZ3Jlc3MoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIubm90aWZ5IH0pXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLmRvbmUoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIucmVzb2x2ZSB9KVxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KVxuXHRcdFx0XHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDEgXSBdKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQgPSBmbiAmJiBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCAmJiBpc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC5wcm9taXNlKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmbiA/IFsgcmV0dXJuZWQgXSA6IGFyZ3VtZW50c1xuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdGZucyA9IG51bGw7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBvblByb2dyZXNzICkge1xuXHRcdFx0XHRcdHZhciBtYXhEZXB0aCA9IDA7XG5cdFx0XHRcdFx0ZnVuY3Rpb24gcmVzb2x2ZSggZGVwdGgsIGRlZmVycmVkLCBoYW5kbGVyLCBzcGVjaWFsICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdGhhdCA9IHRoaXMsXG5cdFx0XHRcdFx0XHRcdFx0YXJncyA9IGFyZ3VtZW50cyxcblx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQsIHRoZW47XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy4zXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01OVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoIDwgbWF4RGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjFcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkID09PSBkZWZlcnJlZC5wcm9taXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoIFwiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uXCIgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbnMgMi4zLjMuMSwgMy41XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNzVcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFJldHJpZXZlIGB0aGVuYCBvbmx5IG9uY2Vcblx0XHRcdFx0XHRcdFx0XHRcdHRoZW4gPSByZXR1cm5lZCAmJlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBjaGVjayBvYmplY3RzIGFuZCBmdW5jdGlvbnMgZm9yIHRoZW5hYmlsaXR5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCggdHlwZW9mIHJldHVybmVkID09PSBcIm9iamVjdFwiIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHJldHVybmVkID09PSBcImZ1bmN0aW9uXCIgKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC50aGVuO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgYSByZXR1cm5lZCB0aGVuYWJsZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWwgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlbi5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIFRocm93ZXIsIHNwZWNpYWwgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gTm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGFsc28gaG9vayBpbnRvIHByb2dyZXNzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgZGlzcmVnYXJkIG9sZGVyIHJlc29sdXRpb24gdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWF4RGVwdGgrKztcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoZW4uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBhbGwgb3RoZXIgcmV0dXJuZWQgdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgc3Vic3RpdHV0ZSBoYW5kbGVycyBwYXNzIG9uIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhhdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gWyByZXR1cm5lZCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gUHJvY2VzcyB0aGUgdmFsdWUocylcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmYXVsdCBwcm9jZXNzIGlzIHJlc29sdmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0KCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBub3JtYWwgcHJvY2Vzc29ycyAocmVzb2x2ZSkgY2F0Y2ggYW5kIHJlamVjdCBleGNlcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcyA9IHNwZWNpYWwgP1xuXHRcdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rKCBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzLnN0YWNrVHJhY2UgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuNC4xXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBJZ25vcmUgcG9zdC1yZXNvbHV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICsgMSA+PSBtYXhEZXB0aCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGhhbmRsZXIgIT09IFRocm93ZXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBbIGUgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMVxuXHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01N1xuXHRcdFx0XHRcdFx0XHQvLyBSZS1yZXNvbHZlIHByb21pc2VzIGltbWVkaWF0ZWx5IHRvIGRvZGdlIGZhbHNlIHJlamVjdGlvbiBmcm9tXG5cdFx0XHRcdFx0XHRcdC8vIHN1YnNlcXVlbnQgZXJyb3JzXG5cdFx0XHRcdFx0XHRcdGlmICggZGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcygpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ2FsbCBhbiBvcHRpb25hbCBob29rIHRvIHJlY29yZCB0aGUgc3RhY2ssIGluIGNhc2Ugb2YgZXhjZXB0aW9uXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc2luY2UgaXQncyBvdGhlcndpc2UgbG9zdCB3aGVuIGV4ZWN1dGlvbiBnb2VzIGFzeW5jXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZ2V0U3RhY2tIb29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5zdGFja1RyYWNlID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25Qcm9ncmVzcyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRJZGVudGl0eSxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlci5ub3RpZnlXaXRoXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5hZGQoIC4uLiApXG5cdFx0XHRcdFx0XHR0dXBsZXNbIDEgXVsgMyBdLmFkZChcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLFxuXHRcdFx0XHRcdFx0XHRcdGlzRnVuY3Rpb24oIG9uRnVsZmlsbGVkICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25GdWxmaWxsZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0SWRlbnRpdHlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAyIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvblJlamVjdGVkICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25SZWplY3RlZCA6XG5cdFx0XHRcdFx0XHRcdFx0XHRUaHJvd2VyXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkXG5cdFx0XHRcdC8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3Rcblx0XHRcdFx0cHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqICE9IG51bGwgPyBqUXVlcnkuZXh0ZW5kKCBvYmosIHByb21pc2UgKSA6IHByb21pc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWZlcnJlZCA9IHt9O1xuXG5cdFx0Ly8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kc1xuXHRcdGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHtcblx0XHRcdHZhciBsaXN0ID0gdHVwbGVbIDIgXSxcblx0XHRcdFx0c3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdO1xuXG5cdFx0XHQvLyBwcm9taXNlLnByb2dyZXNzID0gbGlzdC5hZGRcblx0XHRcdC8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkXG5cdFx0XHQvLyBwcm9taXNlLmZhaWwgPSBsaXN0LmFkZFxuXHRcdFx0cHJvbWlzZVsgdHVwbGVbIDEgXSBdID0gbGlzdC5hZGQ7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZVxuXHRcdFx0aWYgKCBzdGF0ZVN0cmluZyApIHtcblx0XHRcdFx0bGlzdC5hZGQoXG5cdFx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHRcdC8vIHN0YXRlID0gXCJyZXNvbHZlZFwiIChpLmUuLCBmdWxmaWxsZWQpXG5cdFx0XHRcdFx0XHQvLyBzdGF0ZSA9IFwicmVqZWN0ZWRcIlxuXHRcdFx0XHRcdFx0c3RhdGUgPSBzdGF0ZVN0cmluZztcblx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfY2FsbGJhY2tzLmRpc2FibGVcblx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfY2FsbGJhY2tzLmRpc2FibGVcblx0XHRcdFx0XHR0dXBsZXNbIDMgLSBpIF1bIDIgXS5kaXNhYmxlLFxuXG5cdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZGlzYWJsZVxuXHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5kaXNhYmxlXG5cdFx0XHRcdFx0dHVwbGVzWyAzIC0gaSBdWyAzIF0uZGlzYWJsZSxcblxuXHRcdFx0XHRcdC8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrXG5cdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDIgXS5sb2NrLFxuXG5cdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAzIF0ubG9ja1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlXG5cdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0bGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApO1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnkgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQubm90aWZ5V2l0aCguLi4pIH1cblx0XHRcdC8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3QgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVqZWN0V2l0aCguLi4pIH1cblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH07XG5cblx0XHRcdC8vIGRlZmVycmVkLm5vdGlmeVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGhcblx0XHRcdC8vIGRlZmVycmVkLnJlamVjdFdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0gPSBsaXN0LmZpcmVXaXRoO1xuXHRcdH0gKTtcblxuXHRcdC8vIE1ha2UgdGhlIGRlZmVycmVkIGEgcHJvbWlzZVxuXHRcdHByb21pc2UucHJvbWlzZSggZGVmZXJyZWQgKTtcblxuXHRcdC8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnlcblx0XHRpZiAoIGZ1bmMgKSB7XG5cdFx0XHRmdW5jLmNhbGwoIGRlZmVycmVkLCBkZWZlcnJlZCApO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBkb25lIVxuXHRcdHJldHVybiBkZWZlcnJlZDtcblx0fSxcblxuXHQvLyBEZWZlcnJlZCBoZWxwZXJcblx0d2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkge1xuXHRcdHZhclxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bmNvbXBsZXRlZCBzdWJvcmRpbmF0ZXNcblx0XHRcdHJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cblx0XHRcdC8vIGNvdW50IG9mIHVucHJvY2Vzc2VkIGFyZ3VtZW50c1xuXHRcdFx0aSA9IHJlbWFpbmluZyxcblxuXHRcdFx0Ly8gc3Vib3JkaW5hdGUgZnVsZmlsbG1lbnQgZGF0YVxuXHRcdFx0cmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSxcblx0XHRcdHJlc29sdmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcblxuXHRcdFx0Ly8gdGhlIHByaW1hcnkgRGVmZXJyZWRcblx0XHRcdHByaW1hcnkgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblxuXHRcdFx0Ly8gc3Vib3JkaW5hdGUgY2FsbGJhY2sgZmFjdG9yeVxuXHRcdFx0dXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdHJlc29sdmVDb250ZXh0c1sgaSBdID0gdGhpcztcblx0XHRcdFx0XHRyZXNvbHZlVmFsdWVzWyBpIF0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApIDogdmFsdWU7XG5cdFx0XHRcdFx0aWYgKCAhKCAtLXJlbWFpbmluZyApICkge1xuXHRcdFx0XHRcdFx0cHJpbWFyeS5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdC8vIFNpbmdsZS0gYW5kIGVtcHR5IGFyZ3VtZW50cyBhcmUgYWRvcHRlZCBsaWtlIFByb21pc2UucmVzb2x2ZVxuXHRcdGlmICggcmVtYWluaW5nIDw9IDEgKSB7XG5cdFx0XHRhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgcHJpbWFyeS5kb25lKCB1cGRhdGVGdW5jKCBpICkgKS5yZXNvbHZlLCBwcmltYXJ5LnJlamVjdCxcblx0XHRcdFx0IXJlbWFpbmluZyApO1xuXG5cdFx0XHQvLyBVc2UgLnRoZW4oKSB0byB1bndyYXAgc2Vjb25kYXJ5IHRoZW5hYmxlcyAoY2YuIGdoLTMwMDApXG5cdFx0XHRpZiAoIHByaW1hcnkuc3RhdGUoKSA9PT0gXCJwZW5kaW5nXCIgfHxcblx0XHRcdFx0aXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHByaW1hcnkudGhlbigpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgYWdncmVnYXRlZCBsaWtlIFByb21pc2UuYWxsIGFycmF5IGVsZW1lbnRzXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRhZG9wdFZhbHVlKCByZXNvbHZlVmFsdWVzWyBpIF0sIHVwZGF0ZUZ1bmMoIGkgKSwgcHJpbWFyeS5yZWplY3QgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJpbWFyeS5wcm9taXNlKCk7XG5cdH1cbn0gKTtcblxuXG4vLyBUaGVzZSB1c3VhbGx5IGluZGljYXRlIGEgcHJvZ3JhbW1lciBtaXN0YWtlIGR1cmluZyBkZXZlbG9wbWVudCxcbi8vIHdhcm4gYWJvdXQgdGhlbSBBU0FQIHJhdGhlciB0aGFuIHN3YWxsb3dpbmcgdGhlbSBieSBkZWZhdWx0LlxudmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87XG5cbmpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rID0gZnVuY3Rpb24oIGVycm9yLCBzdGFjayApIHtcblxuXHQvLyBTdXBwb3J0OiBJRSA4IC0gOSBvbmx5XG5cdC8vIENvbnNvbGUgZXhpc3RzIHdoZW4gZGV2IHRvb2xzIGFyZSBvcGVuLCB3aGljaCBjYW4gaGFwcGVuIGF0IGFueSB0aW1lXG5cdGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7XG5cdFx0d2luZG93LmNvbnNvbGUud2FybiggXCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiBcIiArIGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrLCBzdGFjayApO1xuXHR9XG59O1xuXG5cblxuXG5qUXVlcnkucmVhZHlFeGNlcHRpb24gPSBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHR0aHJvdyBlcnJvcjtcblx0fSApO1xufTtcblxuXG5cblxuLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5XG52YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cbmpRdWVyeS5mbi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHtcblxuXHRyZWFkeUxpc3Rcblx0XHQudGhlbiggZm4gKVxuXG5cdFx0Ly8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXBcblx0XHQvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2tcblx0XHQvLyByZWdpc3RyYXRpb24uXG5cdFx0LmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlFeGNlcHRpb24oIGVycm9yICk7XG5cdFx0fSApO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuXG5cdGlzUmVhZHk6IGZhbHNlLFxuXG5cdC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmVcblx0Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgdHJhYy02NzgxXG5cdHJlYWR5V2FpdDogMSxcblxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XG5cdHJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHtcblxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcblx0XHRpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHlcblx0XHRqUXVlcnkuaXNSZWFkeSA9IHRydWU7XG5cblx0XHQvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZVxuXHRcdGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcblx0XHRyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjtcblxuLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2RcbmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHtcblx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCApO1xuXHRqUXVlcnkucmVhZHkoKTtcbn1cblxuLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWRcbi8vIGFmdGVyIHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLlxuLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seVxuLy8gT2xkZXIgSUUgc29tZXRpbWVzIHNpZ25hbHMgXCJpbnRlcmFjdGl2ZVwiIHRvbyBzb29uXG5pZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIiB8fFxuXHQoIGRvY3VtZW50LnJlYWR5U3RhdGUgIT09IFwibG9hZGluZ1wiICYmICFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgKSApIHtcblxuXHQvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHlcblx0d2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApO1xuXG59IGVsc2Uge1xuXG5cdC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2tcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXG5cdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG59XG5cblxuXG5cbi8vIE11bHRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlvblxuLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uXG52YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGJ1bGsgPSBrZXkgPT0gbnVsbDtcblxuXHQvLyBTZXRzIG1hbnkgdmFsdWVzXG5cdGlmICggdG9UeXBlKCBrZXkgKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXHRcdGZvciAoIGkgaW4ga2V5ICkge1xuXHRcdFx0YWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVsgaSBdLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7XG5cdFx0fVxuXG5cdC8vIFNldHMgb25lIHZhbHVlXG5cdH0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblxuXHRcdGlmICggIWlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyYXcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICggYnVsayApIHtcblxuXHRcdFx0Ly8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0XG5cdFx0XHRpZiAoIHJhdyApIHtcblx0XHRcdFx0Zm4uY2FsbCggZWxlbXMsIHZhbHVlICk7XG5cdFx0XHRcdGZuID0gbnVsbDtcblxuXHRcdFx0Ly8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnVsayA9IGZuO1xuXHRcdFx0XHRmbiA9IGZ1bmN0aW9uKCBlbGVtLCBfa2V5LCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdGZuKFxuXHRcdFx0XHRcdGVsZW1zWyBpIF0sIGtleSwgcmF3ID9cblx0XHRcdFx0XHRcdHZhbHVlIDpcblx0XHRcdFx0XHRcdHZhbHVlLmNhbGwoIGVsZW1zWyBpIF0sIGksIGZuKCBlbGVtc1sgaSBdLCBrZXkgKSApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBjaGFpbmFibGUgKSB7XG5cdFx0cmV0dXJuIGVsZW1zO1xuXHR9XG5cblx0Ly8gR2V0c1xuXHRpZiAoIGJ1bGsgKSB7XG5cdFx0cmV0dXJuIGZuLmNhbGwoIGVsZW1zICk7XG5cdH1cblxuXHRyZXR1cm4gbGVuID8gZm4oIGVsZW1zWyAwIF0sIGtleSApIDogZW1wdHlHZXQ7XG59O1xuXG5cbi8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZ1xudmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sXG5cdHJkYXNoQWxwaGEgPSAvLShbYS16XSkvZztcblxuLy8gVXNlZCBieSBjYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5mdW5jdGlvbiBmY2FtZWxDYXNlKCBfYWxsLCBsZXR0ZXIgKSB7XG5cdHJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTtcbn1cblxuLy8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxDYXNlOyB1c2VkIGJ5IHRoZSBjc3MgYW5kIGRhdGEgbW9kdWxlc1xuLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNVxuLy8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKHRyYWMtOTU3MilcbmZ1bmN0aW9uIGNhbWVsQ2FzZSggc3RyaW5nICkge1xuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHJtc1ByZWZpeCwgXCJtcy1cIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTtcbn1cbnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkge1xuXG5cdC8vIEFjY2VwdHMgb25seTpcblx0Ly8gIC0gTm9kZVxuXHQvLyAgICAtIE5vZGUuRUxFTUVOVF9OT0RFXG5cdC8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFXG5cdC8vICAtIE9iamVjdFxuXHQvLyAgICAtIEFueVxuXHRyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7XG59O1xuXG5cblxuXG5mdW5jdGlvbiBEYXRhKCkge1xuXHR0aGlzLmV4cGFuZG8gPSBqUXVlcnkuZXhwYW5kbyArIERhdGEudWlkKys7XG59XG5cbkRhdGEudWlkID0gMTtcblxuRGF0YS5wcm90b3R5cGUgPSB7XG5cblx0Y2FjaGU6IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHRcdC8vIENoZWNrIGlmIHRoZSBvd25lciBvYmplY3QgYWxyZWFkeSBoYXMgYSBjYWNoZVxuXHRcdHZhciB2YWx1ZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblxuXHRcdC8vIElmIG5vdCwgY3JlYXRlIG9uZVxuXHRcdGlmICggIXZhbHVlICkge1xuXHRcdFx0dmFsdWUgPSB7fTtcblxuXHRcdFx0Ly8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsXG5cdFx0XHQvLyBidXQgd2Ugc2hvdWxkIG5vdCwgc2VlIHRyYWMtODMzNS5cblx0XHRcdC8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LlxuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBvd25lciApICkge1xuXG5cdFx0XHRcdC8vIElmIGl0IGlzIGEgbm9kZSB1bmxpa2VseSB0byBiZSBzdHJpbmdpZnktZWQgb3IgbG9vcGVkIG92ZXJcblx0XHRcdFx0Ly8gdXNlIHBsYWluIGFzc2lnbm1lbnRcblx0XHRcdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB2YWx1ZTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2Ugc2VjdXJlIGl0IGluIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHlcblx0XHRcdFx0Ly8gY29uZmlndXJhYmxlIG11c3QgYmUgdHJ1ZSB0byBhbGxvdyB0aGUgcHJvcGVydHkgdG8gYmVcblx0XHRcdFx0Ly8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggb3duZXIsIHRoaXMuZXhwYW5kbywge1xuXHRcdFx0XHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7XG5cdFx0dmFyIHByb3AsXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGUoIG93bmVyICk7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwgdmFsdWUgXSBhcmdzXG5cdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBkYXRhICkgXSA9IHZhbHVlO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3Ncblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUgdG8gdGhlIGNhY2hlIG9iamVjdFxuXHRcdFx0Zm9yICggcHJvcCBpbiBkYXRhICkge1xuXHRcdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBwcm9wICkgXSA9IGRhdGFbIHByb3AgXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNhY2hlO1xuXHR9LFxuXHRnZXQ6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzLmNhY2hlKCBvd25lciApIDpcblxuXHRcdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdICYmIG93bmVyWyB0aGlzLmV4cGFuZG8gXVsgY2FtZWxDYXNlKCBrZXkgKSBdO1xuXHR9LFxuXHRhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHtcblxuXHRcdC8vIEluIGNhc2VzIHdoZXJlIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gTm8ga2V5IHdhcyBzcGVjaWZpZWRcblx0XHQvLyAgIDIuIEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBidXQgbm8gdmFsdWUgcHJvdmlkZWRcblx0XHQvL1xuXHRcdC8vIFRha2UgdGhlIFwicmVhZFwiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZVxuXHRcdC8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3Rcblx0XHQvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5XG5cdFx0Ly9cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdCggKCBrZXkgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiApICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2hlbiB0aGUga2V5IGlzIG5vdCBhIHN0cmluZywgb3IgYm90aCBhIGtleSBhbmQgdmFsdWVcblx0XHQvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gQW4gb2JqZWN0IG9mIHByb3BlcnRpZXNcblx0XHQvLyAgIDIuIEEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vXG5cdFx0dGhpcy5zZXQoIG93bmVyLCBrZXksIHZhbHVlICk7XG5cblx0XHQvLyBTaW5jZSB0aGUgXCJzZXRcIiBwYXRoIGNhbiBoYXZlIHR3byBwb3NzaWJsZSBlbnRyeSBwb2ludHNcblx0XHQvLyByZXR1cm4gdGhlIGV4cGVjdGVkIGRhdGEgYmFzZWQgb24gd2hpY2ggcGF0aCB3YXMgdGFrZW5bKl1cblx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5O1xuXHR9LFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHZhciBpLFxuXHRcdFx0Y2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHRpZiAoIGNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydCBhcnJheSBvciBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGtleXNcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHNldCBjYW1lbENhc2Uga2V5cywgc28gcmVtb3ZlIHRoYXQuXG5cdFx0XHRcdGtleSA9IGtleS5tYXAoIGNhbWVsQ2FzZSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0a2V5ID0gY2FtZWxDYXNlKCBrZXkgKTtcblxuXHRcdFx0XHQvLyBJZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlXG5cdFx0XHRcdGtleSA9IGtleSBpbiBjYWNoZSA/XG5cdFx0XHRcdFx0WyBrZXkgXSA6XG5cdFx0XHRcdFx0KCBrZXkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpID0ga2V5Lmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgdGhlcmUncyBubyBtb3JlIGRhdGFcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1XG5cdFx0XHQvLyBXZWJraXQgJiBCbGluayBwZXJmb3JtYW5jZSBzdWZmZXJzIHdoZW4gZGVsZXRpbmcgcHJvcGVydGllc1xuXHRcdFx0Ly8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZFxuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzc4NjA3IChidWcgcmVzdHJpY3RlZClcblx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRoYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0dmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdHJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTtcblx0fVxufTtcbnZhciBkYXRhUHJpdiA9IG5ldyBEYXRhKCk7XG5cbnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7XG5cblxuXG4vL1x0SW1wbGVtZW50YXRpb24gU3VtbWFyeVxuLy9cbi8vXHQxLiBFbmZvcmNlIEFQSSBzdXJmYWNlIGFuZCBzZW1hbnRpYyBjb21wYXRpYmlsaXR5IHdpdGggMS45LnggYnJhbmNoXG4vL1x0Mi4gSW1wcm92ZSB0aGUgbW9kdWxlJ3MgbWFpbnRhaW5hYmlsaXR5IGJ5IHJlZHVjaW5nIHRoZSBzdG9yYWdlXG4vL1x0XHRwYXRocyB0byBhIHNpbmdsZSBtZWNoYW5pc20uXG4vL1x0My4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBcInByaXZhdGVcIiBhbmQgXCJ1c2VyXCIgZGF0YS5cbi8vXHQ0LiBfTmV2ZXJfIGV4cG9zZSBcInByaXZhdGVcIiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpXG4vL1x0NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvbiB1c2VyIG9iamVjdHMgKGVnLiBleHBhbmRvIHByb3BlcnRpZXMpXG4vL1x0Ni4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0XG5cbnZhciByYnJhY2UgPSAvXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sXG5cdHJtdWx0aURhc2ggPSAvW0EtWl0vZztcblxuZnVuY3Rpb24gZ2V0RGF0YSggZGF0YSApIHtcblx0aWYgKCBkYXRhID09PSBcInRydWVcIiApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJmYWxzZVwiICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJudWxsXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xuXHRpZiAoIGRhdGEgPT09ICtkYXRhICsgXCJcIiApIHtcblx0XHRyZXR1cm4gK2RhdGE7XG5cdH1cblxuXHRpZiAoIHJicmFjZS50ZXN0KCBkYXRhICkgKSB7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKTtcblx0fVxuXG5cdHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkge1xuXHR2YXIgbmFtZTtcblxuXHQvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55XG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxuXHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJCZcIiApLnRvTG93ZXJDYXNlKCk7XG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGdldERhdGEoIGRhdGEgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge31cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRkYXRhVXNlci5zZXQoIGVsZW0sIGtleSwgZGF0YSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZGF0YTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTtcblx0fSxcblxuXHRkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVVzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH0sXG5cblx0Ly8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWRcblx0Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YVByaXYgbWV0aG9kcywgdGhlc2UgY2FuIGJlIGRlcHJlY2F0ZWQuXG5cdF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0X3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGRhdGEsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0YXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlcztcblxuXHRcdC8vIEdldHMgYWxsIHZhbHVlc1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHRoaXMubGVuZ3RoICkge1xuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhUHJpdi5nZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIgKSApIHtcblx0XHRcdFx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKHRyYWMtMTQ4OTQpXG5cdFx0XHRcdFx0XHRpZiAoIGF0dHJzWyBpIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7XG5cdFx0XHRcdFx0XHRcdGlmICggbmFtZS5pbmRleE9mKCBcImRhdGEtXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHRuYW1lID0gY2FtZWxDYXNlKCBuYW1lLnNsaWNlKCA1ICkgKTtcblx0XHRcdFx0XHRcdFx0XHRkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0cyBtdWx0aXBsZSB2YWx1ZXNcblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZGF0YTtcblxuXHRcdFx0Ly8gVGhlIGNhbGxpbmcgalF1ZXJ5IG9iamVjdCAoZWxlbWVudCBtYXRjaGVzKSBpcyBub3QgZW1wdHlcblx0XHRcdC8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlXG5cdFx0XHQvLyBgdmFsdWVgIHBhcmFtZXRlciB3YXMgbm90IHVuZGVmaW5lZC4gQW4gZW1wdHkgalF1ZXJ5IG9iamVjdFxuXHRcdFx0Ly8gd2lsbCByZXN1bHQgaW4gYHVuZGVmaW5lZGAgZm9yIGVsZW0gPSB0aGlzWyAwIF0gd2hpY2ggd2lsbFxuXHRcdFx0Ly8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS5cblx0XHRcdGlmICggZWxlbSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGVcblx0XHRcdFx0Ly8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGFcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBcImRpc2NvdmVyXCIgdGhlIGRhdGEgaW5cblx0XHRcdFx0Ly8gSFRNTDUgY3VzdG9tIGRhdGEtKiBhdHRyc1xuXHRcdFx0XHRkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApO1xuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdlIHRyaWVkIHJlYWxseSBoYXJkLCBidXQgdGhlIGRhdGEgZG9lc24ndCBleGlzdC5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgdGhlIGRhdGEuLi5cblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHN0b3JlIHRoZSBjYW1lbENhc2VkIGtleVxuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTtcblx0XHRcdH0gKTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGF0YVVzZXIucmVtb3ZlKCB0aGlzLCBrZXkgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgcXVldWU7XG5cblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHR0eXBlID0gKCB0eXBlIHx8IFwiZnhcIiApICsgXCJxdWV1ZVwiO1xuXHRcdFx0cXVldWUgPSBkYXRhUHJpdi5nZXQoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0Ly8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cFxuXHRcdFx0aWYgKCBkYXRhICkge1xuXHRcdFx0XHRpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7XG5cdFx0XHRcdFx0cXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGRhdGEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHF1ZXVlIHx8IFtdO1xuXHRcdH1cblx0fSxcblxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSxcblx0XHRcdHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLFxuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpLFxuXHRcdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSxcblx0XHRcdG5leHQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTtcblx0XHRcdH07XG5cblx0XHQvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsXG5cdFx0aWYgKCBmbiA9PT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRzdGFydExlbmd0aC0tO1xuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cblx0XHRcdC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmdcblx0XHRcdC8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWRcblx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICkge1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KCBcImlucHJvZ3Jlc3NcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uXG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdGZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhc3RhcnRMZW5ndGggJiYgaG9va3MgKSB7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIE5vdCBwdWJsaWMgLSBnZW5lcmF0ZSBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm4gdGhlIGN1cnJlbnQgb25lXG5cdF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR2YXIga2V5ID0gdHlwZSArIFwicXVldWVIb29rc1wiO1xuXHRcdHJldHVybiBkYXRhUHJpdi5nZXQoIGVsZW0sIGtleSApIHx8IGRhdGFQcml2LmFjY2VzcyggZWxlbSwga2V5LCB7XG5cdFx0XHRlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICkuYWRkKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBbIHR5cGUgKyBcInF1ZXVlXCIsIGtleSBdICk7XG5cdFx0XHR9IClcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHNldHRlciA9IDI7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZGF0YSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gXCJmeFwiO1xuXHRcdFx0c2V0dGVyLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzIDpcblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICYmIHF1ZXVlWyAwIF0gIT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0fSxcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdH0gKTtcblx0fSxcblx0Y2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHR9LFxuXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcblx0Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpXG5cdHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7XG5cdFx0dmFyIHRtcCxcblx0XHRcdGNvdW50ID0gMSxcblx0XHRcdGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXG5cdFx0XHRpID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXNvbHZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xuXHRcdFx0XHRcdGRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b2JqID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG1wID0gZGF0YVByaXYuZ2V0KCBlbGVtZW50c1sgaSBdLCB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgKTtcblx0XHRcdGlmICggdG1wICYmIHRtcC5lbXB0eSApIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXNvbHZlKCk7XG5cdFx0cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApO1xuXHR9XG59ICk7XG52YXIgcG51bSA9ICggL1srLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KS8gKS5zb3VyY2U7XG5cbnZhciByY3NzTnVtID0gbmV3IFJlZ0V4cCggXCJeKD86KFsrLV0pPXwpKFwiICsgcG51bSArIFwiKShbYS16JV0qKSRcIiwgXCJpXCIgKTtcblxuXG52YXIgY3NzRXhwYW5kID0gWyBcIlRvcFwiLCBcIlJpZ2h0XCIsIFwiQm90dG9tXCIsIFwiTGVmdFwiIF07XG5cbnZhciBkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblxuXG5cdHZhciBpc0F0dGFjaGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblx0XHR9LFxuXHRcdGNvbXBvc2VkID0geyBjb21wb3NlZDogdHJ1ZSB9O1xuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTIgLSAxOCssIGlPUyAxMC4wIC0gMTAuMiBvbmx5XG5cdC8vIENoZWNrIGF0dGFjaG1lbnQgYWNyb3NzIHNoYWRvdyBET00gYm91bmRhcmllcyB3aGVuIHBvc3NpYmxlIChnaC0zNTA0KVxuXHQvLyBTdXBwb3J0OiBpT1MgMTAuMC0xMC4yIG9ubHlcblx0Ly8gRWFybHkgaU9TIDEwIHZlcnNpb25zIHN1cHBvcnQgYGF0dGFjaFNoYWRvd2AgYnV0IG5vdCBgZ2V0Um9vdE5vZGVgLFxuXHQvLyBsZWFkaW5nIHRvIGVycm9ycy4gV2UgbmVlZCB0byBjaGVjayBmb3IgYGdldFJvb3ROb2RlYC5cblx0aWYgKCBkb2N1bWVudEVsZW1lbnQuZ2V0Um9vdE5vZGUgKSB7XG5cdFx0aXNBdHRhY2hlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgfHxcblx0XHRcdFx0ZWxlbS5nZXRSb290Tm9kZSggY29tcG9zZWQgKSA9PT0gZWxlbS5vd25lckRvY3VtZW50O1xuXHRcdH07XG5cdH1cbnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7XG5cblx0XHQvLyBpc0hpZGRlbldpdGhpblRyZWUgbWlnaHQgYmUgY2FsbGVkIGZyb20galF1ZXJ5I2ZpbHRlciBmdW5jdGlvbjtcblx0XHQvLyBpbiB0aGF0IGNhc2UsIGVsZW1lbnQgd2lsbCBiZSBzZWNvbmQgYXJndW1lbnRcblx0XHRlbGVtID0gZWwgfHwgZWxlbTtcblxuXHRcdC8vIElubGluZSBzdHlsZSB0cnVtcHMgYWxsXG5cdFx0cmV0dXJuIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgfHxcblx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJlxuXG5cdFx0XHQvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlXG5cdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDMgLSA0NVxuXHRcdFx0Ly8gRGlzY29ubmVjdGVkIGVsZW1lbnRzIGNhbiBoYXZlIGNvbXB1dGVkIGRpc3BsYXk6IG5vbmUsIHNvIGZpcnN0IGNvbmZpcm0gdGhhdCBlbGVtIGlzXG5cdFx0XHQvLyBpbiB0aGUgZG9jdW1lbnQuXG5cdFx0XHRpc0F0dGFjaGVkKCBlbGVtICkgJiZcblxuXHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSA9PT0gXCJub25lXCI7XG5cdH07XG5cblxuXG5mdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkge1xuXHR2YXIgYWRqdXN0ZWQsIHNjYWxlLFxuXHRcdG1heEl0ZXJhdGlvbnMgPSAyMCxcblx0XHRjdXJyZW50VmFsdWUgPSB0d2VlbiA/XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmN1cigpO1xuXHRcdFx0fSA6XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsIFwiXCIgKTtcblx0XHRcdH0sXG5cdFx0aW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLFxuXHRcdHVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKSxcblxuXHRcdC8vIFN0YXJ0aW5nIHZhbHVlIGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBwb3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzXG5cdFx0aW5pdGlhbEluVW5pdCA9IGVsZW0ubm9kZVR5cGUgJiZcblx0XHRcdCggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdIHx8IHVuaXQgIT09IFwicHhcIiAmJiAraW5pdGlhbCApICYmXG5cdFx0XHRyY3NzTnVtLmV4ZWMoIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AgKSApO1xuXG5cdGlmICggaW5pdGlhbEluVW5pdCAmJiBpbml0aWFsSW5Vbml0WyAzIF0gIT09IHVuaXQgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTRcblx0XHQvLyBIYWx2ZSB0aGUgaXRlcmF0aW9uIHRhcmdldCB2YWx1ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZSBmcm9tIENTUyB1cHBlciBib3VuZHMgKGdoLTIxNDQpXG5cdFx0aW5pdGlhbCA9IGluaXRpYWwgLyAyO1xuXG5cdFx0Ly8gVHJ1c3QgdW5pdHMgcmVwb3J0ZWQgYnkgalF1ZXJ5LmNzc1xuXHRcdHVuaXQgPSB1bml0IHx8IGluaXRpYWxJblVuaXRbIDMgXTtcblxuXHRcdC8vIEl0ZXJhdGl2ZWx5IGFwcHJveGltYXRlIGZyb20gYSBub256ZXJvIHN0YXJ0aW5nIHBvaW50XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsIHx8IDE7XG5cblx0XHR3aGlsZSAoIG1heEl0ZXJhdGlvbnMtLSApIHtcblxuXHRcdFx0Ly8gRXZhbHVhdGUgYW5kIHVwZGF0ZSBvdXIgYmVzdCBndWVzcyAoZG91YmxpbmcgZ3Vlc3NlcyB0aGF0IHplcm8gb3V0KS5cblx0XHRcdC8vIEZpbmlzaCBpZiB0aGUgc2NhbGUgZXF1YWxzIG9yIGNyb3NzZXMgMSAobWFraW5nIHRoZSBvbGQqbmV3IHByb2R1Y3Qgbm9uLXBvc2l0aXZlKS5cblx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTtcblx0XHRcdGlmICggKCAxIC0gc2NhbGUgKSAqICggMSAtICggc2NhbGUgPSBjdXJyZW50VmFsdWUoKSAvIGluaXRpYWwgfHwgMC41ICkgKSA8PSAwICkge1xuXHRcdFx0XHRtYXhJdGVyYXRpb25zID0gMDtcblx0XHRcdH1cblx0XHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7XG5cblx0XHR9XG5cblx0XHRpbml0aWFsSW5Vbml0ID0gaW5pdGlhbEluVW5pdCAqIDI7XG5cdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvblxuXHRcdHZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdO1xuXHR9XG5cblx0aWYgKCB2YWx1ZVBhcnRzICkge1xuXHRcdGluaXRpYWxJblVuaXQgPSAraW5pdGlhbEluVW5pdCB8fCAraW5pdGlhbCB8fCAwO1xuXG5cdFx0Ly8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkXG5cdFx0YWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gP1xuXHRcdFx0aW5pdGlhbEluVW5pdCArICggdmFsdWVQYXJ0c1sgMSBdICsgMSApICogdmFsdWVQYXJ0c1sgMiBdIDpcblx0XHRcdCt2YWx1ZVBhcnRzWyAyIF07XG5cdFx0aWYgKCB0d2VlbiApIHtcblx0XHRcdHR3ZWVuLnVuaXQgPSB1bml0O1xuXHRcdFx0dHdlZW4uc3RhcnQgPSBpbml0aWFsSW5Vbml0O1xuXHRcdFx0dHdlZW4uZW5kID0gYWRqdXN0ZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBhZGp1c3RlZDtcbn1cblxuXG52YXIgZGVmYXVsdERpc3BsYXlNYXAgPSB7fTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKSB7XG5cdHZhciB0ZW1wLFxuXHRcdGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCxcblx0XHRub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUsXG5cdFx0ZGlzcGxheSA9IGRlZmF1bHREaXNwbGF5TWFwWyBub2RlTmFtZSBdO1xuXG5cdGlmICggZGlzcGxheSApIHtcblx0XHRyZXR1cm4gZGlzcGxheTtcblx0fVxuXG5cdHRlbXAgPSBkb2MuYm9keS5hcHBlbmRDaGlsZCggZG9jLmNyZWF0ZUVsZW1lbnQoIG5vZGVOYW1lICkgKTtcblx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRlbXAsIFwiZGlzcGxheVwiICk7XG5cblx0dGVtcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0ZW1wICk7XG5cblx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRkaXNwbGF5ID0gXCJibG9ja1wiO1xuXHR9XG5cdGRlZmF1bHREaXNwbGF5TWFwWyBub2RlTmFtZSBdID0gZGlzcGxheTtcblxuXHRyZXR1cm4gZGlzcGxheTtcbn1cblxuZnVuY3Rpb24gc2hvd0hpZGUoIGVsZW1lbnRzLCBzaG93ICkge1xuXHR2YXIgZGlzcGxheSwgZWxlbSxcblx0XHR2YWx1ZXMgPSBbXSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoO1xuXG5cdC8vIERldGVybWluZSBuZXcgZGlzcGxheSB2YWx1ZSBmb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZVxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTtcblx0XHRpZiAoICFlbGVtLnN0eWxlICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0ZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTtcblx0XHRpZiAoIHNob3cgKSB7XG5cblx0XHRcdC8vIFNpbmNlIHdlIGZvcmNlIHZpc2liaWxpdHkgdXBvbiBjYXNjYWRlLWhpZGRlbiBlbGVtZW50cywgYW4gaW1tZWRpYXRlIChhbmQgc2xvdylcblx0XHRcdC8vIGNoZWNrIGlzIHJlcXVpcmVkIGluIHRoaXMgZmlyc3QgbG9vcCB1bmxlc3Mgd2UgaGF2ZSBhIG5vbmVtcHR5IGRpc3BsYXkgdmFsdWUgKGVpdGhlclxuXHRcdFx0Ly8gaW5saW5lIG9yIGFib3V0LXRvLWJlLXJlc3RvcmVkKVxuXHRcdFx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApIHx8IG51bGw7XG5cdFx0XHRcdGlmICggIXZhbHVlc1sgaW5kZXggXSApIHtcblx0XHRcdFx0XHRlbGVtLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJiBpc0hpZGRlbldpdGhpblRyZWUoIGVsZW0gKSApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCBkaXNwbGF5ICE9PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gXCJub25lXCI7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgd2hhdCB3ZSdyZSBvdmVyd3JpdGluZ1xuXHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiZGlzcGxheVwiLCBkaXNwbGF5ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wIHRvIGF2b2lkIGNvbnN0YW50IHJlZmxvd1xuXHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGlmICggdmFsdWVzWyBpbmRleCBdICE9IG51bGwgKSB7XG5cdFx0XHRlbGVtZW50c1sgaW5kZXggXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWVzWyBpbmRleCBdO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50cztcbn1cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMsIHRydWUgKTtcblx0fSxcblx0aGlkZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzICk7XG5cdH0sXG5cdHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkge1xuXHRcdGlmICggdHlwZW9mIHN0YXRlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGlzSGlkZGVuV2l0aGluVHJlZSggdGhpcyApICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5zaG93KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG59ICk7XG52YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7XG5cbnZhciBydGFnTmFtZSA9ICggLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pICk7XG5cbnZhciByc2NyaXB0VHlwZSA9ICggL14kfF5tb2R1bGUkfFxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApO1xuXG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdGRpdiA9IGZyYWdtZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKSxcblx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHlcblx0Ly8gQ2hlY2sgc3RhdGUgbG9zdCBpZiB0aGUgbmFtZSBpcyBzZXQgKHRyYWMtMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICh0cmFjLTE0OTAxKVxuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcInJhZGlvXCIgKTtcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcImNoZWNrZWRcIiwgXCJjaGVja2VkXCIgKTtcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJ0XCIgKTtcblxuXHRkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMSBvbmx5XG5cdC8vIE9sZGVyIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50c1xuXHRzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIE1ha2Ugc3VyZSB0ZXh0YXJlYSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUgaXMgcHJvcGVybHkgY2xvbmVkXG5cdGRpdi5pbm5lckhUTUwgPSBcIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT5cIjtcblx0c3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCA9ICEhZGl2LmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWU7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0Ly8gSUUgPD05IHJlcGxhY2VzIDxvcHRpb24+IHRhZ3Mgd2l0aCB0aGVpciBjb250ZW50cyB3aGVuIGluc2VydGVkIG91dHNpZGUgb2Zcblx0Ly8gdGhlIHNlbGVjdCBlbGVtZW50LlxuXHRkaXYuaW5uZXJIVE1MID0gXCI8b3B0aW9uPjwvb3B0aW9uPlwiO1xuXHRzdXBwb3J0Lm9wdGlvbiA9ICEhZGl2Lmxhc3RDaGlsZDtcbn0gKSgpO1xuXG5cbi8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICh0cmFjLTEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBlbGVtZW50cyBpbiB0aGVcblx0Ly8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlblxuXHQvLyB0aGlzIGJ5IG9taXR0aW5nIDx0Ym9keT4gb3Igb3RoZXIgcmVxdWlyZWQgZWxlbWVudHMuXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG59O1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cbi8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5pZiAoICFzdXBwb3J0Lm9wdGlvbiApIHtcblx0d3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uID0gWyAxLCBcIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz5cIiwgXCI8L3NlbGVjdD5cIiBdO1xufVxuXG5cbmZ1bmN0aW9uIGdldEFsbCggY29udGV4dCwgdGFnICkge1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0Ly8gVXNlIHR5cGVvZiB0byBhdm9pZCB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBpbnZvY2F0aW9uIG9uIGhvc3Qgb2JqZWN0cyAodHJhYy0xNTE1MSlcblx0dmFyIHJldDtcblxuXHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCBcIipcIiApO1xuXG5cdH0gZWxzZSBpZiAoIHR5cGVvZiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0cmV0ID0gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2Uge1xuXHRcdHJldCA9IFtdO1xuXHR9XG5cblx0aWYgKCB0YWcgPT09IHVuZGVmaW5lZCB8fCB0YWcgJiYgbm9kZU5hbWUoIGNvbnRleHQsIHRhZyApICkge1xuXHRcdHJldHVybiBqUXVlcnkubWVyZ2UoIFsgY29udGV4dCBdLCByZXQgKTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59XG5cblxuLy8gTWFyayBzY3JpcHRzIGFzIGhhdmluZyBhbHJlYWR5IGJlZW4gZXZhbHVhdGVkXG5mdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRkYXRhUHJpdi5zZXQoXG5cdFx0XHRlbGVtc1sgaSBdLFxuXHRcdFx0XCJnbG9iYWxFdmFsXCIsXG5cdFx0XHQhcmVmRWxlbWVudHMgfHwgZGF0YVByaXYuZ2V0KCByZWZFbGVtZW50c1sgaSBdLCBcImdsb2JhbEV2YWxcIiApXG5cdFx0KTtcblx0fVxufVxuXG5cbnZhciByaHRtbCA9IC88fCYjP1xcdys7LztcblxuZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHtcblx0dmFyIGVsZW0sIHRtcCwgdGFnLCB3cmFwLCBhdHRhY2hlZCwgaixcblx0XHRmcmFnbWVudCA9IGNvbnRleHQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdG5vZGVzID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1zWyBpIF07XG5cblx0XHRpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHtcblxuXHRcdFx0Ly8gQWRkIG5vZGVzIGRpcmVjdGx5XG5cdFx0XHRpZiAoIHRvVHlwZSggZWxlbSApID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTtcblxuXHRcdFx0Ly8gQ29udmVydCBub24taHRtbCBpbnRvIGEgdGV4dCBub2RlXG5cdFx0XHR9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkge1xuXHRcdFx0XHRub2Rlcy5wdXNoKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtICkgKTtcblxuXHRcdFx0Ly8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0bXAgPSB0bXAgfHwgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGNvbnRleHQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICk7XG5cblx0XHRcdFx0Ly8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvblxuXHRcdFx0XHR0YWcgPSAoIHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0d3JhcCA9IHdyYXBNYXBbIHRhZyBdIHx8IHdyYXBNYXAuX2RlZmF1bHQ7XG5cdFx0XHRcdHRtcC5pbm5lckhUTUwgPSB3cmFwWyAxIF0gKyBqUXVlcnkuaHRtbFByZWZpbHRlciggZWxlbSApICsgd3JhcFsgMiBdO1xuXG5cdFx0XHRcdC8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVudFxuXHRcdFx0XHRqID0gd3JhcFsgMCBdO1xuXHRcdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0XHR0bXAgPSB0bXAubGFzdENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBub2RlcywgdG1wLmNoaWxkTm9kZXMgKTtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB0aGUgdG9wLWxldmVsIGNvbnRhaW5lclxuXHRcdFx0XHR0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSB0aGUgY3JlYXRlZCBub2RlcyBhcmUgb3JwaGFuZWQgKHRyYWMtMTIzOTIpXG5cdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRmcmFnbWVudC50ZXh0Q29udGVudCA9IFwiXCI7XG5cblx0aSA9IDA7XG5cdHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7XG5cblx0XHQvLyBTa2lwIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgY29sbGVjdGlvbiAodHJhYy00MDg3KVxuXHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSA+IC0xICkge1xuXHRcdFx0aWYgKCBpZ25vcmVkICkge1xuXHRcdFx0XHRpZ25vcmVkLnB1c2goIGVsZW0gKTtcblx0XHRcdH1cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGF0dGFjaGVkID0gaXNBdHRhY2hlZCggZWxlbSApO1xuXG5cdFx0Ly8gQXBwZW5kIHRvIGZyYWdtZW50XG5cdFx0dG1wID0gZ2V0QWxsKCBmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApLCBcInNjcmlwdFwiICk7XG5cblx0XHQvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5XG5cdFx0aWYgKCBhdHRhY2hlZCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIHRtcCApO1xuXHRcdH1cblxuXHRcdC8vIENhcHR1cmUgZXhlY3V0YWJsZXNcblx0XHRpZiAoIHNjcmlwdHMgKSB7XG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdG1wWyBqKysgXSApICkge1xuXHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSB8fCBcIlwiICkgKSB7XG5cdFx0XHRcdFx0c2NyaXB0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZnJhZ21lbnQ7XG59XG5cblxudmFyIHJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XFwuKC4rKXwpLztcblxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJldHVybkZhbHNlKCkge1xuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8vIFN1cHBvcnQ6IElFIDw9OSAtIDExK1xuLy8gZm9jdXMoKSBhbmQgYmx1cigpIGFyZSBhc3luY2hyb25vdXMsIGV4Y2VwdCB3aGVuIHRoZXkgYXJlIG5vLW9wLlxuLy8gU28gZXhwZWN0IGZvY3VzIHRvIGJlIHN5bmNocm9ub3VzIHdoZW4gdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBhY3RpdmUsXG4vLyBhbmQgYmx1ciB0byBiZSBzeW5jaHJvbm91cyB3aGVuIHRoZSBlbGVtZW50IGlzIG5vdCBhbHJlYWR5IGFjdGl2ZS5cbi8vIChmb2N1cyBhbmQgYmx1ciBhcmUgYWx3YXlzIHN5bmNocm9ub3VzIGluIG90aGVyIHN1cHBvcnRlZCBicm93c2Vycyxcbi8vIHRoaXMganVzdCBkZWZpbmVzIHdoZW4gd2UgY2FuIGNvdW50IG9uIGl0KS5cbmZ1bmN0aW9uIGV4cGVjdFN5bmMoIGVsZW0sIHR5cGUgKSB7XG5cdHJldHVybiAoIGVsZW0gPT09IHNhZmVBY3RpdmVFbGVtZW50KCkgKSA9PT0gKCB0eXBlID09PSBcImZvY3VzXCIgKTtcbn1cblxuLy8gU3VwcG9ydDogSUUgPD05IG9ubHlcbi8vIEFjY2Vzc2luZyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGNhbiB0aHJvdyB1bmV4cGVjdGVkbHlcbi8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMzM5M1xuZnVuY3Rpb24gc2FmZUFjdGl2ZUVsZW1lbnQoKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cdH0gY2F0Y2ggKCBlcnIgKSB7IH1cbn1cblxuZnVuY3Rpb24gb24oIGVsZW0sIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIG9uZSApIHtcblx0dmFyIG9yaWdGbiwgdHlwZTtcblxuXHQvLyBUeXBlcyBjYW4gYmUgYSBtYXAgb2YgdHlwZXMvaGFuZGxlcnNcblx0aWYgKCB0eXBlb2YgdHlwZXMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyAoIHR5cGVzLU9iamVjdCwgc2VsZWN0b3IsIGRhdGEgKVxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLU9iamVjdCwgZGF0YSApXG5cdFx0XHRkYXRhID0gZGF0YSB8fCBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRmb3IgKCB0eXBlIGluIHR5cGVzICkge1xuXHRcdFx0b24oIGVsZW0sIHR5cGUsIHNlbGVjdG9yLCBkYXRhLCB0eXBlc1sgdHlwZSBdLCBvbmUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIGRhdGEgPT0gbnVsbCAmJiBmbiA9PSBudWxsICkge1xuXG5cdFx0Ly8gKCB0eXBlcywgZm4gKVxuXHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0ZGF0YSA9IHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKCBmbiA9PSBudWxsICkge1xuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLCBzZWxlY3RvciwgZm4gKVxuXHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyAoIHR5cGVzLCBkYXRhLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0fSBlbHNlIGlmICggIWZuICkge1xuXHRcdHJldHVybiBlbGVtO1xuXHR9XG5cblx0aWYgKCBvbmUgPT09IDEgKSB7XG5cdFx0b3JpZ0ZuID0gZm47XG5cdFx0Zm4gPSBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdC8vIENhbiB1c2UgYW4gZW1wdHkgc2V0LCBzaW5jZSBldmVudCBjb250YWlucyB0aGUgaW5mb1xuXHRcdFx0alF1ZXJ5KCkub2ZmKCBldmVudCApO1xuXHRcdFx0cmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fTtcblxuXHRcdC8vIFVzZSBzYW1lIGd1aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuXG5cdFx0Zm4uZ3VpZCA9IG9yaWdGbi5ndWlkIHx8ICggb3JpZ0ZuLmd1aWQgPSBqUXVlcnkuZ3VpZCsrICk7XG5cdH1cblx0cmV0dXJuIGVsZW0uZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0alF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZXMsIGZuLCBkYXRhLCBzZWxlY3RvciApO1xuXHR9ICk7XG59XG5cbi8qXG4gKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBldmVudHMgLS0gbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UuXG4gKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLlxuICovXG5qUXVlcnkuZXZlbnQgPSB7XG5cblx0Z2xvYmFsOiB7fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSwgc2VsZWN0b3IgKSB7XG5cblx0XHR2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsXG5cdFx0XHRldmVudHMsIHQsIGhhbmRsZU9iaixcblx0XHRcdHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSxcblx0XHRcdGVsZW1EYXRhID0gZGF0YVByaXYuZ2V0KCBlbGVtICk7XG5cblx0XHQvLyBPbmx5IGF0dGFjaCBldmVudHMgdG8gb2JqZWN0cyB0aGF0IGFjY2VwdCBkYXRhXG5cdFx0aWYgKCAhYWNjZXB0RGF0YSggZWxlbSApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlclxuXHRcdGlmICggaGFuZGxlci5oYW5kbGVyICkge1xuXHRcdFx0aGFuZGxlT2JqSW4gPSBoYW5kbGVyO1xuXHRcdFx0aGFuZGxlciA9IGhhbmRsZU9iakluLmhhbmRsZXI7XG5cdFx0XHRzZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yO1xuXHRcdH1cblxuXHRcdC8vIEVuc3VyZSB0aGF0IGludmFsaWQgc2VsZWN0b3JzIHRocm93IGV4Y2VwdGlvbnMgYXQgYXR0YWNoIHRpbWVcblx0XHQvLyBFdmFsdWF0ZSBhZ2FpbnN0IGRvY3VtZW50RWxlbWVudCBpbiBjYXNlIGVsZW0gaXMgYSBub24tZWxlbWVudCBub2RlIChlLmcuLCBkb2N1bWVudClcblx0XHRpZiAoIHNlbGVjdG9yICkge1xuXHRcdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBkb2N1bWVudEVsZW1lbnQsIHNlbGVjdG9yICk7XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyXG5cdFx0aWYgKCAhaGFuZGxlci5ndWlkICkge1xuXHRcdFx0aGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKztcblx0XHR9XG5cblx0XHQvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlmIHRoaXMgaXMgdGhlIGZpcnN0XG5cdFx0aWYgKCAhKCBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgKSApIHtcblx0XHRcdGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IE9iamVjdC5jcmVhdGUoIG51bGwgKTtcblx0XHR9XG5cdFx0aWYgKCAhKCBldmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSApICkge1xuXHRcdFx0ZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgPSBmdW5jdGlvbiggZSApIHtcblxuXHRcdFx0XHQvLyBEaXNjYXJkIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSBqUXVlcnkuZXZlbnQudHJpZ2dlcigpIGFuZFxuXHRcdFx0XHQvLyB3aGVuIGFuIGV2ZW50IGlzIGNhbGxlZCBhZnRlciBhIHBhZ2UgaGFzIHVubG9hZGVkXG5cdFx0XHRcdHJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSBcInVuZGVmaW5lZFwiICYmIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUudHlwZSA/XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmFwcGx5KCBlbGVtLCBhcmd1bWVudHMgKSA6IHVuZGVmaW5lZDtcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZVxuXHRcdHR5cGVzID0gKCB0eXBlcyB8fCBcIlwiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbIFwiXCIgXTtcblx0XHR0ID0gdHlwZXMubGVuZ3RoO1xuXHRcdHdoaWxlICggdC0tICkge1xuXHRcdFx0dG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdO1xuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG1wWyAxIF07XG5cdFx0XHRuYW1lc3BhY2VzID0gKCB0bXBbIDIgXSB8fCBcIlwiICkuc3BsaXQoIFwiLlwiICkuc29ydCgpO1xuXG5cdFx0XHQvLyBUaGVyZSAqbXVzdCogYmUgYSB0eXBlLCBubyBhdHRhY2hpbmcgbmFtZXNwYWNlLW9ubHkgaGFuZGxlcnNcblx0XHRcdGlmICggIXR5cGUgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0eXBlLCB1c2UgdGhlIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBJZiBzZWxlY3RvciBkZWZpbmVkLCBkZXRlcm1pbmUgc3BlY2lhbCBldmVudCBhcGkgdHlwZSwgb3RoZXJ3aXNlIGdpdmVuIHR5cGVcblx0XHRcdHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcblxuXHRcdFx0Ly8gVXBkYXRlIHNwZWNpYWwgYmFzZWQgb24gbmV3bHkgcmVzZXQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIGhhbmRsZU9iaiBpcyBwYXNzZWQgdG8gYWxsIGV2ZW50IGhhbmRsZXJzXG5cdFx0XHRoYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdG9yaWdUeXBlOiBvcmlnVHlwZSxcblx0XHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdFx0aGFuZGxlcjogaGFuZGxlcixcblx0XHRcdFx0Z3VpZDogaGFuZGxlci5ndWlkLFxuXHRcdFx0XHRzZWxlY3Rvcjogc2VsZWN0b3IsXG5cdFx0XHRcdG5lZWRzQ29udGV4dDogc2VsZWN0b3IgJiYgalF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICksXG5cdFx0XHRcdG5hbWVzcGFjZTogbmFtZXNwYWNlcy5qb2luKCBcIi5cIiApXG5cdFx0XHR9LCBoYW5kbGVPYmpJbiApO1xuXG5cdFx0XHQvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdFxuXHRcdFx0aWYgKCAhKCBoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdICkgKSB7XG5cdFx0XHRcdGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTtcblx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudCA9IDA7XG5cblx0XHRcdFx0Ly8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lciBpZiB0aGUgc3BlY2lhbCBldmVudHMgaGFuZGxlciByZXR1cm5zIGZhbHNlXG5cdFx0XHRcdGlmICggIXNwZWNpYWwuc2V0dXAgfHxcblx0XHRcdFx0XHRzcGVjaWFsLnNldHVwLmNhbGwoIGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0aWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggc3BlY2lhbC5hZGQgKSB7XG5cdFx0XHRcdHNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApO1xuXG5cdFx0XHRcdGlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCA9IGhhbmRsZXIuZ3VpZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udFxuXHRcdFx0aWYgKCBzZWxlY3RvciApIHtcblx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb25cblx0XHRcdGpRdWVyeS5ldmVudC5nbG9iYWxbIHR5cGUgXSA9IHRydWU7XG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50XG5cdHJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7XG5cblx0XHR2YXIgaiwgb3JpZ0NvdW50LCB0bXAsXG5cdFx0XHRldmVudHMsIHQsIGhhbmRsZU9iaixcblx0XHRcdHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSxcblx0XHRcdGVsZW1EYXRhID0gZGF0YVByaXYuaGFzRGF0YSggZWxlbSApICYmIGRhdGFQcml2LmdldCggZWxlbSApO1xuXG5cdFx0aWYgKCAhZWxlbURhdGEgfHwgISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gT25jZSBmb3IgZWFjaCB0eXBlLm5hbWVzcGFjZSBpbiB0eXBlczsgdHlwZSBtYXkgYmUgb21pdHRlZFxuXHRcdHR5cGVzID0gKCB0eXBlcyB8fCBcIlwiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbIFwiXCIgXTtcblx0XHR0ID0gdHlwZXMubGVuZ3RoO1xuXHRcdHdoaWxlICggdC0tICkge1xuXHRcdFx0dG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdO1xuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG1wWyAxIF07XG5cdFx0XHRuYW1lc3BhY2VzID0gKCB0bXBbIDIgXSB8fCBcIlwiICkuc3BsaXQoIFwiLlwiICkuc29ydCgpO1xuXG5cdFx0XHQvLyBVbmJpbmQgYWxsIGV2ZW50cyAob24gdGhpcyBuYW1lc3BhY2UsIGlmIHByb3ZpZGVkKSBmb3IgdGhlIGVsZW1lbnRcblx0XHRcdGlmICggIXR5cGUgKSB7XG5cdFx0XHRcdGZvciAoIHR5cGUgaW4gZXZlbnRzICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKyB0eXBlc1sgdCBdLCBoYW5kbGVyLCBzZWxlY3RvciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblx0XHRcdHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcblx0XHRcdGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gfHwgW107XG5cdFx0XHR0bXAgPSB0bXBbIDIgXSAmJlxuXHRcdFx0XHRuZXcgUmVnRXhwKCBcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5qb2luKCBcIlxcXFwuKD86LipcXFxcLnwpXCIgKSArIFwiKFxcXFwufCQpXCIgKTtcblxuXHRcdFx0Ly8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50c1xuXHRcdFx0b3JpZ0NvdW50ID0gaiA9IGhhbmRsZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0XHRoYW5kbGVPYmogPSBoYW5kbGVyc1sgaiBdO1xuXG5cdFx0XHRcdGlmICggKCBtYXBwZWRUeXBlcyB8fCBvcmlnVHlwZSA9PT0gaGFuZGxlT2JqLm9yaWdUeXBlICkgJiZcblx0XHRcdFx0XHQoICFoYW5kbGVyIHx8IGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAmJlxuXHRcdFx0XHRcdCggIXRtcCB8fCB0bXAudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgJiZcblx0XHRcdFx0XHQoICFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gaGFuZGxlT2JqLnNlbGVjdG9yIHx8XG5cdFx0XHRcdFx0XHRzZWxlY3RvciA9PT0gXCIqKlwiICYmIGhhbmRsZU9iai5zZWxlY3RvciApICkge1xuXHRcdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaiwgMSApO1xuXG5cdFx0XHRcdFx0aWYgKCBoYW5kbGVPYmouc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggc3BlY2lhbC5yZW1vdmUgKSB7XG5cdFx0XHRcdFx0XHRzcGVjaWFsLnJlbW92ZS5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdFxuXHRcdFx0Ly8gKGF2b2lkcyBwb3RlbnRpYWwgZm9yIGVuZGxlc3MgcmVjdXJzaW9uIGR1cmluZyByZW1vdmFsIG9mIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMpXG5cdFx0XHRpZiAoIG9yaWdDb3VudCAmJiAhaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnRlYXJkb3duIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC50ZWFyZG93bi5jYWxsKCBlbGVtLCBuYW1lc3BhY2VzLCBlbGVtRGF0YS5oYW5kbGUgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGVsZW1EYXRhLmhhbmRsZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGVsZXRlIGV2ZW50c1sgdHlwZSBdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSBkYXRhIGFuZCB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkXG5cdFx0aWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7XG5cdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiaGFuZGxlIGV2ZW50c1wiICk7XG5cdFx0fVxuXHR9LFxuXG5cdGRpc3BhdGNoOiBmdW5jdGlvbiggbmF0aXZlRXZlbnQgKSB7XG5cblx0XHR2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosIGhhbmRsZXJRdWV1ZSxcblx0XHRcdGFyZ3MgPSBuZXcgQXJyYXkoIGFyZ3VtZW50cy5sZW5ndGggKSxcblxuXHRcdFx0Ly8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0XG5cdFx0XHRldmVudCA9IGpRdWVyeS5ldmVudC5maXgoIG5hdGl2ZUV2ZW50ICksXG5cblx0XHRcdGhhbmRsZXJzID0gKFxuXHRcdFx0XHRkYXRhUHJpdi5nZXQoIHRoaXMsIFwiZXZlbnRzXCIgKSB8fCBPYmplY3QuY3JlYXRlKCBudWxsIClcblx0XHRcdClbIGV2ZW50LnR5cGUgXSB8fCBbXSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9O1xuXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcblx0XHRhcmdzWyAwIF0gPSBldmVudDtcblxuXHRcdGZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0YXJnc1sgaSBdID0gYXJndW1lbnRzWyBpIF07XG5cdFx0fVxuXG5cdFx0ZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzO1xuXG5cdFx0Ly8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZFxuXHRcdGlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBoYW5kbGVyc1xuXHRcdGhhbmRsZXJRdWV1ZSA9IGpRdWVyeS5ldmVudC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTtcblxuXHRcdC8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtO1xuXG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBoYW5kbGVPYmogPSBtYXRjaGVkLmhhbmRsZXJzWyBqKysgXSApICYmXG5cdFx0XHRcdCFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRcdC8vIElmIHRoZSBldmVudCBpcyBuYW1lc3BhY2VkLCB0aGVuIGVhY2ggaGFuZGxlciBpcyBvbmx5IGludm9rZWQgaWYgaXQgaXNcblx0XHRcdFx0Ly8gc3BlY2lhbGx5IHVuaXZlcnNhbCBvciBpdHMgbmFtZXNwYWNlcyBhcmUgYSBzdXBlcnNldCBvZiB0aGUgZXZlbnQncy5cblx0XHRcdFx0aWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBoYW5kbGVPYmoubmFtZXNwYWNlID09PSBmYWxzZSB8fFxuXHRcdFx0XHRcdGV2ZW50LnJuYW1lc3BhY2UudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkge1xuXG5cdFx0XHRcdFx0ZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqO1xuXHRcdFx0XHRcdGV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTtcblxuXHRcdFx0XHRcdHJldCA9ICggKCBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgaGFuZGxlT2JqLm9yaWdUeXBlIF0gfHwge30gKS5oYW5kbGUgfHxcblx0XHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyICkuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApO1xuXG5cdFx0XHRcdFx0aWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRcdGlmICggKCBldmVudC5yZXN1bHQgPSByZXQgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGwgdGhlIHBvc3REaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGVcblx0XHRpZiAoIHNwZWNpYWwucG9zdERpc3BhdGNoICkge1xuXHRcdFx0c3BlY2lhbC5wb3N0RGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQucmVzdWx0O1xuXHR9LFxuXG5cdGhhbmRsZXJzOiBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXJzICkge1xuXHRcdHZhciBpLCBoYW5kbGVPYmosIHNlbCwgbWF0Y2hlZEhhbmRsZXJzLCBtYXRjaGVkU2VsZWN0b3JzLFxuXHRcdFx0aGFuZGxlclF1ZXVlID0gW10sXG5cdFx0XHRkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCxcblx0XHRcdGN1ciA9IGV2ZW50LnRhcmdldDtcblxuXHRcdC8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnNcblx0XHRpZiAoIGRlbGVnYXRlQ291bnQgJiZcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05XG5cdFx0XHQvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAodHJhYy0xMzE4MClcblx0XHRcdGN1ci5ub2RlVHlwZSAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDJcblx0XHRcdC8vIFN1cHByZXNzIHNwZWMtdmlvbGF0aW5nIGNsaWNrcyBpbmRpY2F0aW5nIGEgbm9uLXByaW1hcnkgcG9pbnRlciBidXR0b24gKHRyYWMtMzg2MSlcblx0XHRcdC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2V2ZW50LXR5cGUtY2xpY2tcblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExIG9ubHlcblx0XHRcdC8vIC4uLmJ1dCBub3QgYXJyb3cga2V5IFwiY2xpY2tzXCIgb2YgcmFkaW8gaW5wdXRzLCB3aGljaCBjYW4gaGF2ZSBgYnV0dG9uYCAtMSAoZ2gtMjM0Mylcblx0XHRcdCEoIGV2ZW50LnR5cGUgPT09IFwiY2xpY2tcIiAmJiBldmVudC5idXR0b24gPj0gMSApICkge1xuXG5cdFx0XHRmb3IgKCA7IGN1ciAhPT0gdGhpczsgY3VyID0gY3VyLnBhcmVudE5vZGUgfHwgdGhpcyApIHtcblxuXHRcdFx0XHQvLyBEb24ndCBjaGVjayBub24tZWxlbWVudHMgKHRyYWMtMTMyMDgpXG5cdFx0XHRcdC8vIERvbid0IHByb2Nlc3MgY2xpY2tzIG9uIGRpc2FibGVkIGVsZW1lbnRzICh0cmFjLTY5MTEsIHRyYWMtODE2NSwgdHJhYy0xMTM4MiwgdHJhYy0xMTc2NClcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPT09IDEgJiYgISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGN1ci5kaXNhYmxlZCA9PT0gdHJ1ZSApICkge1xuXHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycyA9IFtdO1xuXHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnMgPSB7fTtcblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHtcblx0XHRcdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICh0cmFjLTEzMjAzKVxuXHRcdFx0XHRcdFx0c2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgXCIgXCI7XG5cblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID9cblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+IC0xIDpcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSApIHtcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZEhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRIYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVkSGFuZGxlcnMgfSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFkZCB0aGUgcmVtYWluaW5nIChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnNcblx0XHRjdXIgPSB0aGlzO1xuXHRcdGlmICggZGVsZWdhdGVDb3VudCA8IGhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IGN1ciwgaGFuZGxlcnM6IGhhbmRsZXJzLnNsaWNlKCBkZWxlZ2F0ZUNvdW50ICkgfSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBoYW5kbGVyUXVldWU7XG5cdH0sXG5cblx0YWRkUHJvcDogZnVuY3Rpb24oIG5hbWUsIGhvb2sgKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBqUXVlcnkuRXZlbnQucHJvdG90eXBlLCBuYW1lLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXG5cdFx0XHRnZXQ6IGlzRnVuY3Rpb24oIGhvb2sgKSA/XG5cdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGhvb2soIHRoaXMub3JpZ2luYWxFdmVudCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwge1xuXHRcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGZpeDogZnVuY3Rpb24oIG9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0cmV0dXJuIG9yaWdpbmFsRXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gP1xuXHRcdFx0b3JpZ2luYWxFdmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7XG5cdH0sXG5cblx0c3BlY2lhbDoge1xuXHRcdGxvYWQ6IHtcblxuXHRcdFx0Ly8gUHJldmVudCB0cmlnZ2VyZWQgaW1hZ2UubG9hZCBldmVudHMgZnJvbSBidWJibGluZyB0byB3aW5kb3cubG9hZFxuXHRcdFx0bm9CdWJibGU6IHRydWVcblx0XHR9LFxuXHRcdGNsaWNrOiB7XG5cblx0XHRcdC8vIFV0aWxpemUgbmF0aXZlIGV2ZW50IHRvIGVuc3VyZSBjb3JyZWN0IHN0YXRlIGZvciBjaGVja2FibGUgaW5wdXRzXG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oIGRhdGEgKSB7XG5cblx0XHRcdFx0Ly8gRm9yIG11dHVhbCBjb21wcmVzc2liaWxpdHkgd2l0aCBfZGVmYXVsdCwgcmVwbGFjZSBgdGhpc2AgYWNjZXNzIHdpdGggYSBsb2NhbCB2YXIuXG5cdFx0XHRcdC8vIGB8fCBkYXRhYCBpcyBkZWFkIGNvZGUgbWVhbnQgb25seSB0byBwcmVzZXJ2ZSB0aGUgdmFyaWFibGUgdGhyb3VnaCBtaW5pZmljYXRpb24uXG5cdFx0XHRcdHZhciBlbCA9IHRoaXMgfHwgZGF0YTtcblxuXHRcdFx0XHQvLyBDbGFpbSB0aGUgZmlyc3QgaGFuZGxlclxuXHRcdFx0XHRpZiAoIHJjaGVja2FibGVUeXBlLnRlc3QoIGVsLnR5cGUgKSAmJlxuXHRcdFx0XHRcdGVsLmNsaWNrICYmIG5vZGVOYW1lKCBlbCwgXCJpbnB1dFwiICkgKSB7XG5cblx0XHRcdFx0XHQvLyBkYXRhUHJpdi5zZXQoIGVsLCBcImNsaWNrXCIsIC4uLiApXG5cdFx0XHRcdFx0bGV2ZXJhZ2VOYXRpdmUoIGVsLCBcImNsaWNrXCIsIHJldHVyblRydWUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJldHVybiBmYWxzZSB0byBhbGxvdyBub3JtYWwgcHJvY2Vzc2luZyBpbiB0aGUgY2FsbGVyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbiggZGF0YSApIHtcblxuXHRcdFx0XHQvLyBGb3IgbXV0dWFsIGNvbXByZXNzaWJpbGl0eSB3aXRoIF9kZWZhdWx0LCByZXBsYWNlIGB0aGlzYCBhY2Nlc3Mgd2l0aCBhIGxvY2FsIHZhci5cblx0XHRcdFx0Ly8gYHx8IGRhdGFgIGlzIGRlYWQgY29kZSBtZWFudCBvbmx5IHRvIHByZXNlcnZlIHRoZSB2YXJpYWJsZSB0aHJvdWdoIG1pbmlmaWNhdGlvbi5cblx0XHRcdFx0dmFyIGVsID0gdGhpcyB8fCBkYXRhO1xuXG5cdFx0XHRcdC8vIEZvcmNlIHNldHVwIGJlZm9yZSB0cmlnZ2VyaW5nIGEgY2xpY2tcblx0XHRcdFx0aWYgKCByY2hlY2thYmxlVHlwZS50ZXN0KCBlbC50eXBlICkgJiZcblx0XHRcdFx0XHRlbC5jbGljayAmJiBub2RlTmFtZSggZWwsIFwiaW5wdXRcIiApICkge1xuXG5cdFx0XHRcdFx0bGV2ZXJhZ2VOYXRpdmUoIGVsLCBcImNsaWNrXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJldHVybiBub24tZmFsc2UgdG8gYWxsb3cgbm9ybWFsIGV2ZW50LXBhdGggcHJvcGFnYXRpb25cblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBGb3IgY3Jvc3MtYnJvd3NlciBjb25zaXN0ZW5jeSwgc3VwcHJlc3MgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzXG5cdFx0XHQvLyBBbHNvIHByZXZlbnQgaXQgaWYgd2UncmUgY3VycmVudGx5IGluc2lkZSBhIGxldmVyYWdlZCBuYXRpdmUtZXZlbnQgc3RhY2tcblx0XHRcdF9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG5cdFx0XHRcdHJldHVybiByY2hlY2thYmxlVHlwZS50ZXN0KCB0YXJnZXQudHlwZSApICYmXG5cdFx0XHRcdFx0dGFyZ2V0LmNsaWNrICYmIG5vZGVOYW1lKCB0YXJnZXQsIFwiaW5wdXRcIiApICYmXG5cdFx0XHRcdFx0ZGF0YVByaXYuZ2V0KCB0YXJnZXQsIFwiY2xpY2tcIiApIHx8XG5cdFx0XHRcdFx0bm9kZU5hbWUoIHRhcmdldCwgXCJhXCIgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0YmVmb3JldW5sb2FkOiB7XG5cdFx0XHRwb3N0RGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDIwK1xuXHRcdFx0XHQvLyBGaXJlZm94IGRvZXNuJ3QgYWxlcnQgaWYgdGhlIHJldHVyblZhbHVlIGZpZWxkIGlzIG5vdCBzZXQuXG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG4vLyBFbnN1cmUgdGhlIHByZXNlbmNlIG9mIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgaGFuZGxlcyBtYW51YWxseS10cmlnZ2VyZWRcbi8vIHN5bnRoZXRpYyBldmVudHMgYnkgaW50ZXJydXB0aW5nIHByb2dyZXNzIHVudGlsIHJlaW52b2tlZCBpbiByZXNwb25zZSB0b1xuLy8gKm5hdGl2ZSogZXZlbnRzIHRoYXQgaXQgZmlyZXMgZGlyZWN0bHksIGVuc3VyaW5nIHRoYXQgc3RhdGUgY2hhbmdlcyBoYXZlXG4vLyBhbHJlYWR5IG9jY3VycmVkIGJlZm9yZSBvdGhlciBsaXN0ZW5lcnMgYXJlIGludm9rZWQuXG5mdW5jdGlvbiBsZXZlcmFnZU5hdGl2ZSggZWwsIHR5cGUsIGV4cGVjdFN5bmMgKSB7XG5cblx0Ly8gTWlzc2luZyBleHBlY3RTeW5jIGluZGljYXRlcyBhIHRyaWdnZXIgY2FsbCwgd2hpY2ggbXVzdCBmb3JjZSBzZXR1cCB0aHJvdWdoIGpRdWVyeS5ldmVudC5hZGRcblx0aWYgKCAhZXhwZWN0U3luYyApIHtcblx0XHRpZiAoIGRhdGFQcml2LmdldCggZWwsIHR5cGUgKSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZWwsIHR5cGUsIHJldHVyblRydWUgKTtcblx0XHR9XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVnaXN0ZXIgdGhlIGNvbnRyb2xsZXIgYXMgYSBzcGVjaWFsIHVuaXZlcnNhbCBoYW5kbGVyIGZvciBhbGwgZXZlbnQgbmFtZXNwYWNlc1xuXHRkYXRhUHJpdi5zZXQoIGVsLCB0eXBlLCBmYWxzZSApO1xuXHRqUXVlcnkuZXZlbnQuYWRkKCBlbCwgdHlwZSwge1xuXHRcdG5hbWVzcGFjZTogZmFsc2UsXG5cdFx0aGFuZGxlcjogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIG5vdEFzeW5jLCByZXN1bHQsXG5cdFx0XHRcdHNhdmVkID0gZGF0YVByaXYuZ2V0KCB0aGlzLCB0eXBlICk7XG5cblx0XHRcdGlmICggKCBldmVudC5pc1RyaWdnZXIgJiAxICkgJiYgdGhpc1sgdHlwZSBdICkge1xuXG5cdFx0XHRcdC8vIEludGVycnVwdCBwcm9jZXNzaW5nIG9mIHRoZSBvdXRlciBzeW50aGV0aWMgLnRyaWdnZXIoKWVkIGV2ZW50XG5cdFx0XHRcdC8vIFNhdmVkIGRhdGEgc2hvdWxkIGJlIGZhbHNlIGluIHN1Y2ggY2FzZXMsIGJ1dCBtaWdodCBiZSBhIGxlZnRvdmVyIGNhcHR1cmUgb2JqZWN0XG5cdFx0XHRcdC8vIGZyb20gYW4gYXN5bmMgbmF0aXZlIGhhbmRsZXIgKGdoLTQzNTApXG5cdFx0XHRcdGlmICggIXNhdmVkLmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdC8vIFN0b3JlIGFyZ3VtZW50cyBmb3IgdXNlIHdoZW4gaGFuZGxpbmcgdGhlIGlubmVyIG5hdGl2ZSBldmVudFxuXHRcdFx0XHRcdC8vIFRoZXJlIHdpbGwgYWx3YXlzIGJlIGF0IGxlYXN0IG9uZSBhcmd1bWVudCAoYW4gZXZlbnQgb2JqZWN0KSwgc28gdGhpcyBhcnJheVxuXHRcdFx0XHRcdC8vIHdpbGwgbm90IGJlIGNvbmZ1c2VkIHdpdGggYSBsZWZ0b3ZlciBjYXB0dXJlIG9iamVjdC5cblx0XHRcdFx0XHRzYXZlZCA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgdHlwZSwgc2F2ZWQgKTtcblxuXHRcdFx0XHRcdC8vIFRyaWdnZXIgdGhlIG5hdGl2ZSBldmVudCBhbmQgY2FwdHVyZSBpdHMgcmVzdWx0XG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTErXG5cdFx0XHRcdFx0Ly8gZm9jdXMoKSBhbmQgYmx1cigpIGFyZSBhc3luY2hyb25vdXNcblx0XHRcdFx0XHRub3RBc3luYyA9IGV4cGVjdFN5bmMoIHRoaXMsIHR5cGUgKTtcblx0XHRcdFx0XHR0aGlzWyB0eXBlIF0oKTtcblx0XHRcdFx0XHRyZXN1bHQgPSBkYXRhUHJpdi5nZXQoIHRoaXMsIHR5cGUgKTtcblx0XHRcdFx0XHRpZiAoIHNhdmVkICE9PSByZXN1bHQgfHwgbm90QXN5bmMgKSB7XG5cdFx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIHR5cGUsIGZhbHNlICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlc3VsdCA9IHt9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNhdmVkICE9PSByZXN1bHQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIENhbmNlbCB0aGUgb3V0ZXIgc3ludGhldGljIGV2ZW50XG5cdFx0XHRcdFx0XHRldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA4Nitcblx0XHRcdFx0XHRcdC8vIEluIENocm9tZSwgaWYgYW4gZWxlbWVudCBoYXZpbmcgYSBmb2N1c291dCBoYW5kbGVyIGlzIGJsdXJyZWQgYnlcblx0XHRcdFx0XHRcdC8vIGNsaWNraW5nIG91dHNpZGUgb2YgaXQsIGl0IGludm9rZXMgdGhlIGhhbmRsZXIgc3luY2hyb25vdXNseS4gSWZcblx0XHRcdFx0XHRcdC8vIHRoYXQgaGFuZGxlciBjYWxscyBgLnJlbW92ZSgpYCBvbiB0aGUgZWxlbWVudCwgdGhlIGRhdGEgaXMgY2xlYXJlZCxcblx0XHRcdFx0XHRcdC8vIGxlYXZpbmcgYHJlc3VsdGAgdW5kZWZpbmVkLiBXZSBuZWVkIHRvIGd1YXJkIGFnYWluc3QgdGhpcy5cblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHQgJiYgcmVzdWx0LnZhbHVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGlzIGlzIGFuIGlubmVyIHN5bnRoZXRpYyBldmVudCBmb3IgYW4gZXZlbnQgd2l0aCBhIGJ1YmJsaW5nIHN1cnJvZ2F0ZVxuXHRcdFx0XHQvLyAoZm9jdXMgb3IgYmx1ciksIGFzc3VtZSB0aGF0IHRoZSBzdXJyb2dhdGUgYWxyZWFkeSBwcm9wYWdhdGVkIGZyb20gdHJpZ2dlcmluZyB0aGVcblx0XHRcdFx0Ly8gbmF0aXZlIGV2ZW50IGFuZCBwcmV2ZW50IHRoYXQgZnJvbSBoYXBwZW5pbmcgYWdhaW4gaGVyZS5cblx0XHRcdFx0Ly8gVGhpcyB0ZWNobmljYWxseSBnZXRzIHRoZSBvcmRlcmluZyB3cm9uZyB3LnIudC4gdG8gYC50cmlnZ2VyKClgIChpbiB3aGljaCB0aGVcblx0XHRcdFx0Ly8gYnViYmxpbmcgc3Vycm9nYXRlIHByb3BhZ2F0ZXMgKmFmdGVyKiB0aGUgbm9uLWJ1YmJsaW5nIGJhc2UpLCBidXQgdGhhdCBzZWVtc1xuXHRcdFx0XHQvLyBsZXNzIGJhZCB0aGFuIGR1cGxpY2F0aW9uLlxuXHRcdFx0XHR9IGVsc2UgaWYgKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge30gKS5kZWxlZ2F0ZVR5cGUgKSB7XG5cdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgdGhpcyBpcyBhIG5hdGl2ZSBldmVudCB0cmlnZ2VyZWQgYWJvdmUsIGV2ZXJ5dGhpbmcgaXMgbm93IGluIG9yZGVyXG5cdFx0XHQvLyBGaXJlIGFuIGlubmVyIHN5bnRoZXRpYyBldmVudCB3aXRoIHRoZSBvcmlnaW5hbCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIHNhdmVkLmxlbmd0aCApIHtcblxuXHRcdFx0XHQvLyAuLi5hbmQgY2FwdHVyZSB0aGUgcmVzdWx0XG5cdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgdHlwZSwge1xuXHRcdFx0XHRcdHZhbHVlOiBqUXVlcnkuZXZlbnQudHJpZ2dlcihcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTErXG5cdFx0XHRcdFx0XHQvLyBFeHRlbmQgd2l0aCB0aGUgcHJvdG90eXBlIHRvIHJlc2V0IHRoZSBhYm92ZSBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuXHRcdFx0XHRcdFx0alF1ZXJ5LmV4dGVuZCggc2F2ZWRbIDAgXSwgalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSApLFxuXHRcdFx0XHRcdFx0c2F2ZWQuc2xpY2UoIDEgKSxcblx0XHRcdFx0XHRcdHRoaXNcblx0XHRcdFx0XHQpXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQvLyBBYm9ydCBoYW5kbGluZyBvZiB0aGUgbmF0aXZlIGV2ZW50XG5cdFx0XHRcdGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSApO1xufVxuXG5qUXVlcnkucmVtb3ZlRXZlbnQgPSBmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkge1xuXG5cdC8vIFRoaXMgXCJpZlwiIGlzIG5lZWRlZCBmb3IgcGxhaW4gb2JqZWN0c1xuXHRpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHtcblx0XHRlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApO1xuXHR9XG59O1xuXG5qUXVlcnkuRXZlbnQgPSBmdW5jdGlvbiggc3JjLCBwcm9wcyApIHtcblxuXHQvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgdGhlICduZXcnIGtleXdvcmRcblx0aWYgKCAhKCB0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2ZW50ICkgKSB7XG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuRXZlbnQoIHNyYywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIEV2ZW50IG9iamVjdFxuXHRpZiAoIHNyYyAmJiBzcmMudHlwZSApIHtcblx0XHR0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7XG5cdFx0dGhpcy50eXBlID0gc3JjLnR5cGU7XG5cblx0XHQvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZFxuXHRcdC8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLlxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHxcblx0XHRcdFx0c3JjLmRlZmF1bHRQcmV2ZW50ZWQgPT09IHVuZGVmaW5lZCAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD0yLjMgb25seVxuXHRcdFx0XHRzcmMucmV0dXJuVmFsdWUgPT09IGZhbHNlID9cblx0XHRcdHJldHVyblRydWUgOlxuXHRcdFx0cmV0dXJuRmFsc2U7XG5cblx0XHQvLyBDcmVhdGUgdGFyZ2V0IHByb3BlcnRpZXNcblx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgPD02IC0gNyBvbmx5XG5cdFx0Ly8gVGFyZ2V0IHNob3VsZCBub3QgYmUgYSB0ZXh0IG5vZGUgKHRyYWMtNTA0LCB0cmFjLTEzMTQzKVxuXHRcdHRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/XG5cdFx0XHRzcmMudGFyZ2V0LnBhcmVudE5vZGUgOlxuXHRcdFx0c3JjLnRhcmdldDtcblxuXHRcdHRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0O1xuXHRcdHRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0O1xuXG5cdC8vIEV2ZW50IHR5cGVcblx0fSBlbHNlIHtcblx0XHR0aGlzLnR5cGUgPSBzcmM7XG5cdH1cblxuXHQvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuXHRpZiAoIHByb3BzICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZVxuXHR0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG5cblx0Ly8gTWFyayBpdCBhcyBmaXhlZFxuXHR0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTtcbn07XG5cbi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZ1xuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbFxualF1ZXJ5LkV2ZW50LnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IGpRdWVyeS5FdmVudCxcblx0aXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSxcblx0aXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXHRpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzU2ltdWxhdGVkOiBmYWxzZSxcblxuXHRwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH1cblx0fSxcblx0c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cblx0XHR0aGlzLnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9XG59O1xuXG4vLyBJbmNsdWRlcyBhbGwgY29tbW9uIGV2ZW50IHByb3BzIGluY2x1ZGluZyBLZXlFdmVudCBhbmQgTW91c2VFdmVudCBzcGVjaWZpYyBwcm9wc1xualF1ZXJ5LmVhY2goIHtcblx0YWx0S2V5OiB0cnVlLFxuXHRidWJibGVzOiB0cnVlLFxuXHRjYW5jZWxhYmxlOiB0cnVlLFxuXHRjaGFuZ2VkVG91Y2hlczogdHJ1ZSxcblx0Y3RybEtleTogdHJ1ZSxcblx0ZGV0YWlsOiB0cnVlLFxuXHRldmVudFBoYXNlOiB0cnVlLFxuXHRtZXRhS2V5OiB0cnVlLFxuXHRwYWdlWDogdHJ1ZSxcblx0cGFnZVk6IHRydWUsXG5cdHNoaWZ0S2V5OiB0cnVlLFxuXHR2aWV3OiB0cnVlLFxuXHRcImNoYXJcIjogdHJ1ZSxcblx0Y29kZTogdHJ1ZSxcblx0Y2hhckNvZGU6IHRydWUsXG5cdGtleTogdHJ1ZSxcblx0a2V5Q29kZTogdHJ1ZSxcblx0YnV0dG9uOiB0cnVlLFxuXHRidXR0b25zOiB0cnVlLFxuXHRjbGllbnRYOiB0cnVlLFxuXHRjbGllbnRZOiB0cnVlLFxuXHRvZmZzZXRYOiB0cnVlLFxuXHRvZmZzZXRZOiB0cnVlLFxuXHRwb2ludGVySWQ6IHRydWUsXG5cdHBvaW50ZXJUeXBlOiB0cnVlLFxuXHRzY3JlZW5YOiB0cnVlLFxuXHRzY3JlZW5ZOiB0cnVlLFxuXHR0YXJnZXRUb3VjaGVzOiB0cnVlLFxuXHR0b0VsZW1lbnQ6IHRydWUsXG5cdHRvdWNoZXM6IHRydWUsXG5cdHdoaWNoOiB0cnVlXG59LCBqUXVlcnkuZXZlbnQuYWRkUHJvcCApO1xuXG5qUXVlcnkuZWFjaCggeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggdHlwZSwgZGVsZWdhdGVUeXBlICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdID0ge1xuXG5cdFx0Ly8gVXRpbGl6ZSBuYXRpdmUgZXZlbnQgaWYgcG9zc2libGUgc28gYmx1ci9mb2N1cyBzZXF1ZW5jZSBpcyBjb3JyZWN0XG5cdFx0c2V0dXA6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBDbGFpbSB0aGUgZmlyc3QgaGFuZGxlclxuXHRcdFx0Ly8gZGF0YVByaXYuc2V0KCB0aGlzLCBcImZvY3VzXCIsIC4uLiApXG5cdFx0XHQvLyBkYXRhUHJpdi5zZXQoIHRoaXMsIFwiYmx1clwiLCAuLi4gKVxuXHRcdFx0bGV2ZXJhZ2VOYXRpdmUoIHRoaXMsIHR5cGUsIGV4cGVjdFN5bmMgKTtcblxuXHRcdFx0Ly8gUmV0dXJuIGZhbHNlIHRvIGFsbG93IG5vcm1hbCBwcm9jZXNzaW5nIGluIHRoZSBjYWxsZXJcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBGb3JjZSBzZXR1cCBiZWZvcmUgdHJpZ2dlclxuXHRcdFx0bGV2ZXJhZ2VOYXRpdmUoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0Ly8gUmV0dXJuIG5vbi1mYWxzZSB0byBhbGxvdyBub3JtYWwgZXZlbnQtcGF0aCBwcm9wYWdhdGlvblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdC8vIFN1cHByZXNzIG5hdGl2ZSBmb2N1cyBvciBibHVyIGlmIHdlJ3JlIGN1cnJlbnRseSBpbnNpZGVcblx0XHQvLyBhIGxldmVyYWdlZCBuYXRpdmUtZXZlbnQgc3RhY2tcblx0XHRfZGVmYXVsdDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0cmV0dXJuIGRhdGFQcml2LmdldCggZXZlbnQudGFyZ2V0LCB0eXBlICk7XG5cdFx0fSxcblxuXHRcdGRlbGVnYXRlVHlwZTogZGVsZWdhdGVUeXBlXG5cdH07XG59ICk7XG5cbi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrc1xuLy8gc28gdGhhdCBldmVudCBkZWxlZ2F0aW9uIHdvcmtzIGluIGpRdWVyeS5cbi8vIERvIHRoZSBzYW1lIGZvciBwb2ludGVyZW50ZXIvcG9pbnRlcmxlYXZlIGFuZCBwb2ludGVyb3Zlci9wb2ludGVyb3V0XG4vL1xuLy8gU3VwcG9ydDogU2FmYXJpIDcgb25seVxuLy8gU2FmYXJpIHNlbmRzIG1vdXNlZW50ZXIgdG9vIG9mdGVuOyBzZWU6XG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNThcbi8vIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGJ1ZyAoaXQgZXhpc3RlZCBpbiBvbGRlciBDaHJvbWUgdmVyc2lvbnMgYXMgd2VsbCkuXG5qUXVlcnkuZWFjaCgge1xuXHRtb3VzZWVudGVyOiBcIm1vdXNlb3ZlclwiLFxuXHRtb3VzZWxlYXZlOiBcIm1vdXNlb3V0XCIsXG5cdHBvaW50ZXJlbnRlcjogXCJwb2ludGVyb3ZlclwiLFxuXHRwb2ludGVybGVhdmU6IFwicG9pbnRlcm91dFwiXG59LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0ge1xuXHRcdGRlbGVnYXRlVHlwZTogZml4LFxuXHRcdGJpbmRUeXBlOiBmaXgsXG5cblx0XHRoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciByZXQsXG5cdFx0XHRcdHRhcmdldCA9IHRoaXMsXG5cdFx0XHRcdHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LFxuXHRcdFx0XHRoYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmo7XG5cblx0XHRcdC8vIEZvciBtb3VzZWVudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuXG5cdFx0XHQvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvd1xuXHRcdFx0aWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkge1xuXHRcdFx0XHRldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlO1xuXHRcdFx0XHRyZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBmaXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0b25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTtcblx0fSxcblx0b2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHtcblx0XHR2YXIgaGFuZGxlT2JqLCB0eXBlO1xuXHRcdGlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkge1xuXG5cdFx0XHQvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50XG5cdFx0XHRoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7XG5cdFx0XHRqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKFxuXHRcdFx0XHRoYW5kbGVPYmoubmFtZXNwYWNlID9cblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUgKyBcIi5cIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOlxuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSxcblx0XHRcdFx0aGFuZGxlT2JqLnNlbGVjdG9yLFxuXHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdIClcblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzIFssIGZuXSApXG5cdFx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cblxudmFyXG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMCAtIDExLCBFZGdlIDEyIC0gMTMgb25seVxuXHQvLyBJbiBJRS9FZGdlIHVzaW5nIHJlZ2V4IGdyb3VwcyBoZXJlIGNhdXNlcyBzZXZlcmUgc2xvd2Rvd25zLlxuXHQvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyL1xuXHRybm9Jbm5lcmh0bWwgPSAvPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxcblxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcblx0cmNoZWNrZWQgPSAvY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLFxuXG5cdHJjbGVhblNjcmlwdCA9IC9eXFxzKjwhXFxbQ0RBVEFcXFt8XFxdXFxdPlxccyokL2c7XG5cbi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93c1xuZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkge1xuXHRpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRhYmxlXCIgKSAmJlxuXHRcdG5vZGVOYW1lKCBjb250ZW50Lm5vZGVUeXBlICE9PSAxMSA/IGNvbnRlbnQgOiBjb250ZW50LmZpcnN0Q2hpbGQsIFwidHJcIiApICkge1xuXG5cdFx0cmV0dXJuIGpRdWVyeSggZWxlbSApLmNoaWxkcmVuKCBcInRib2R5XCIgKVsgMCBdIHx8IGVsZW07XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvblxuZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSApIHtcblx0ZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggXCJ0eXBlXCIgKSAhPT0gbnVsbCApICsgXCIvXCIgKyBlbGVtLnR5cGU7XG5cdHJldHVybiBlbGVtO1xufVxuZnVuY3Rpb24gcmVzdG9yZVNjcmlwdCggZWxlbSApIHtcblx0aWYgKCAoIGVsZW0udHlwZSB8fCBcIlwiICkuc2xpY2UoIDAsIDUgKSA9PT0gXCJ0cnVlL1wiICkge1xuXHRcdGVsZW0udHlwZSA9IGVsZW0udHlwZS5zbGljZSggNSApO1xuXHR9IGVsc2Uge1xuXHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBcInR5cGVcIiApO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBpLCBsLCB0eXBlLCBwZGF0YU9sZCwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7XG5cblx0aWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIDEuIENvcHkgcHJpdmF0ZSBkYXRhOiBldmVudHMsIGhhbmRsZXJzLCBldGMuXG5cdGlmICggZGF0YVByaXYuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0cGRhdGFPbGQgPSBkYXRhUHJpdi5nZXQoIHNyYyApO1xuXHRcdGV2ZW50cyA9IHBkYXRhT2xkLmV2ZW50cztcblxuXHRcdGlmICggZXZlbnRzICkge1xuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBkZXN0LCBcImhhbmRsZSBldmVudHNcIiApO1xuXG5cdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBldmVudHNbIHR5cGUgXS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gMi4gQ29weSB1c2VyIGRhdGFcblx0aWYgKCBkYXRhVXNlci5oYXNEYXRhKCBzcmMgKSApIHtcblx0XHR1ZGF0YU9sZCA9IGRhdGFVc2VyLmFjY2Vzcyggc3JjICk7XG5cdFx0dWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTtcblxuXHRcdGRhdGFVc2VyLnNldCggZGVzdCwgdWRhdGFDdXIgKTtcblx0fVxufVxuXG4vLyBGaXggSUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHNcbmZ1bmN0aW9uIGZpeElucHV0KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuXHQvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi5cblx0aWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIHJjaGVja2FibGVUeXBlLnRlc3QoIHNyYy50eXBlICkgKSB7XG5cdFx0ZGVzdC5jaGVja2VkID0gc3JjLmNoZWNrZWQ7XG5cblx0Ly8gRmFpbHMgdG8gcmV0dXJuIHRoZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQgc3RhdGUgd2hlbiBjbG9uaW5nIG9wdGlvbnNcblx0fSBlbHNlIGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiB8fCBub2RlTmFtZSA9PT0gXCJ0ZXh0YXJlYVwiICkge1xuXHRcdGRlc3QuZGVmYXVsdFZhbHVlID0gc3JjLmRlZmF1bHRWYWx1ZTtcblx0fVxufVxuXG5mdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7XG5cblx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRhcmdzID0gZmxhdCggYXJncyApO1xuXG5cdHZhciBmcmFnbWVudCwgZmlyc3QsIHNjcmlwdHMsIGhhc1NjcmlwdHMsIG5vZGUsIGRvYyxcblx0XHRpID0gMCxcblx0XHRsID0gY29sbGVjdGlvbi5sZW5ndGgsXG5cdFx0aU5vQ2xvbmUgPSBsIC0gMSxcblx0XHR2YWx1ZSA9IGFyZ3NbIDAgXSxcblx0XHR2YWx1ZUlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCB2YWx1ZSApO1xuXG5cdC8vIFdlIGNhbid0IGNsb25lTm9kZSBmcmFnbWVudHMgdGhhdCBjb250YWluIGNoZWNrZWQsIGluIFdlYktpdFxuXHRpZiAoIHZhbHVlSXNGdW5jdGlvbiB8fFxuXHRcdFx0KCBsID4gMSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7XG5cdFx0cmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkge1xuXHRcdFx0dmFyIHNlbGYgPSBjb2xsZWN0aW9uLmVxKCBpbmRleCApO1xuXHRcdFx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdGFyZ3NbIDAgXSA9IHZhbHVlLmNhbGwoIHRoaXMsIGluZGV4LCBzZWxmLmh0bWwoKSApO1xuXHRcdFx0fVxuXHRcdFx0ZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7XG5cdFx0fSApO1xuXHR9XG5cblx0aWYgKCBsICkge1xuXHRcdGZyYWdtZW50ID0gYnVpbGRGcmFnbWVudCggYXJncywgY29sbGVjdGlvblsgMCBdLm93bmVyRG9jdW1lbnQsIGZhbHNlLCBjb2xsZWN0aW9uLCBpZ25vcmVkICk7XG5cdFx0Zmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0aWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHtcblx0XHRcdGZyYWdtZW50ID0gZmlyc3Q7XG5cdFx0fVxuXG5cdFx0Ly8gUmVxdWlyZSBlaXRoZXIgbmV3IGNvbnRlbnQgb3IgYW4gaW50ZXJlc3QgaW4gaWdub3JlZCBlbGVtZW50cyB0byBpbnZva2UgdGhlIGNhbGxiYWNrXG5cdFx0aWYgKCBmaXJzdCB8fCBpZ25vcmVkICkge1xuXHRcdFx0c2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsIFwic2NyaXB0XCIgKSwgZGlzYWJsZVNjcmlwdCApO1xuXHRcdFx0aGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoO1xuXG5cdFx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50IGZvciB0aGUgbGFzdCBpdGVtXG5cdFx0XHQvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXBcblx0XHRcdC8vIGJlaW5nIGVtcHRpZWQgaW5jb3JyZWN0bHkgaW4gY2VydGFpbiBzaXR1YXRpb25zICh0cmFjLTgwNzApLlxuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRub2RlID0gZnJhZ21lbnQ7XG5cblx0XHRcdFx0aWYgKCBpICE9PSBpTm9DbG9uZSApIHtcblx0XHRcdFx0XHRub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHQvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYWxsYmFjay5jYWxsKCBjb2xsZWN0aW9uWyBpIF0sIG5vZGUsIGkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXHRcdFx0XHRkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRcdC8vIFJlZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0alF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApO1xuXG5cdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IHNjcmlwdHNbIGkgXTtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdCFkYXRhUHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggbm9kZS5zcmMgJiYgKCBub2RlLnR5cGUgfHwgXCJcIiApLnRvTG93ZXJDYXNlKCkgICE9PSBcIm1vZHVsZVwiICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5Ll9ldmFsVXJsICYmICFub2RlLm5vTW9kdWxlICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5fZXZhbFVybCggbm9kZS5zcmMsIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5vbmNlOiBub2RlLm5vbmNlIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCBcIm5vbmNlXCIgKVxuXHRcdFx0XHRcdFx0XHRcdH0sIGRvYyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFVud3JhcCBhIENEQVRBIHNlY3Rpb24gY29udGFpbmluZyBzY3JpcHQgY29udGVudHMuIFRoaXMgc2hvdWxkbid0IGJlXG5cdFx0XHRcdFx0XHRcdC8vIG5lZWRlZCBhcyBpbiBYTUwgZG9jdW1lbnRzIHRoZXkncmUgYWxyZWFkeSBub3QgdmlzaWJsZSB3aGVuXG5cdFx0XHRcdFx0XHRcdC8vIGluc3BlY3RpbmcgZWxlbWVudCBjb250ZW50cyBhbmQgaW4gSFRNTCBkb2N1bWVudHMgdGhleSBoYXZlIG5vXG5cdFx0XHRcdFx0XHRcdC8vIG1lYW5pbmcgYnV0IHdlJ3JlIHByZXNlcnZpbmcgdGhhdCBsb2dpYyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgd2lsbCBiZSByZW1vdmVkIGNvbXBsZXRlbHkgaW4gNC4wLiBTZWUgZ2gtNDkwNC5cblx0XHRcdFx0XHRcdFx0RE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsIFwiXCIgKSwgbm9kZSwgZG9jICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSggZWxlbSwgc2VsZWN0b3IsIGtlZXBEYXRhICkge1xuXHR2YXIgbm9kZSxcblx0XHRub2RlcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIGVsZW0gKSA6IGVsZW0sXG5cdFx0aSA9IDA7XG5cblx0Zm9yICggOyAoIG5vZGUgPSBub2Rlc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdGlmICggIWtlZXBEYXRhICYmIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIG5vZGUgKSApO1xuXHRcdH1cblxuXHRcdGlmICggbm9kZS5wYXJlbnROb2RlICkge1xuXHRcdFx0aWYgKCBrZWVwRGF0YSAmJiBpc0F0dGFjaGVkKCBub2RlICkgKSB7XG5cdFx0XHRcdHNldEdsb2JhbEV2YWwoIGdldEFsbCggbm9kZSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHR9XG5cdFx0XHRub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRodG1sUHJlZmlsdGVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRyZXR1cm4gaHRtbDtcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGVsZW0sIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdHZhciBpLCBsLCBzcmNFbGVtZW50cywgZGVzdEVsZW1lbnRzLFxuXHRcdFx0Y2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLFxuXHRcdFx0aW5QYWdlID0gaXNBdHRhY2hlZCggZWxlbSApO1xuXG5cdFx0Ly8gRml4IElFIGNsb25pbmcgaXNzdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCAmJiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgZWxlbS5ub2RlVHlwZSA9PT0gMTEgKSAmJlxuXHRcdFx0XHQhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIFdlIGVzY2hldyBTaXp6bGUgaGVyZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczogaHR0cHM6Ly9qc3BlcmYuY29tL2dldGFsbC12cy1zaXp6bGUvMlxuXHRcdFx0ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApO1xuXHRcdFx0c3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGZpeElucHV0KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvcHkgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgY2xvbmVcblx0XHRpZiAoIGRhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRpZiAoIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdFx0XHRzcmNFbGVtZW50cyA9IHNyY0VsZW1lbnRzIHx8IGdldEFsbCggZWxlbSApO1xuXHRcdFx0XHRkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjbG9uZUNvcHlFdmVudCggZWxlbSwgY2xvbmUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5XG5cdFx0ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSwgXCJzY3JpcHRcIiApO1xuXHRcdGlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCBkZXN0RWxlbWVudHMsICFpblBhZ2UgJiYgZ2V0QWxsKCBlbGVtLCBcInNjcmlwdFwiICkgKTtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXRcblx0XHRyZXR1cm4gY2xvbmU7XG5cdH0sXG5cblx0Y2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cdFx0dmFyIGRhdGEsIGVsZW0sIHR5cGUsXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWwsXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9PSB1bmRlZmluZWQ7IGkrKyApIHtcblx0XHRcdGlmICggYWNjZXB0RGF0YSggZWxlbSApICkge1xuXHRcdFx0XHRpZiAoICggZGF0YSA9IGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSApICkge1xuXHRcdFx0XHRcdGlmICggZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRmb3IgKCB0eXBlIGluIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZFxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrXG5cdFx0XHRcdFx0Ly8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlXG5cdFx0XHRcdFx0ZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdICkge1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NStcblx0XHRcdFx0XHQvLyBBc3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmVcblx0XHRcdFx0XHRlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yICk7XG5cdH0sXG5cblx0dGV4dDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnRleHQoIHRoaXMgKSA6XG5cdFx0XHRcdHRoaXMuZW1wdHkoKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRcdHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdGFwcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0LmFwcGVuZENoaWxkKCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdHByZXBlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGJlZm9yZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YWZ0ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGVtcHR5OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSB0aGlzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gUHJldmVudCBtZW1vcnkgbGVha3Ncblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7XG5cblx0XHRcdFx0Ly8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXNcblx0XHRcdFx0ZWxlbS50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHRkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzO1xuXHRcdGRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50cztcblxuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApO1xuXHRcdH0gKTtcblx0fSxcblxuXHRodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHRsID0gdGhpcy5sZW5ndGg7XG5cblx0XHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5pbm5lckhUTUw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNlZSBpZiB3ZSBjYW4gdGFrZSBhIHNob3J0Y3V0IGFuZCBqdXN0IHVzZSBpbm5lckhUTUxcblx0XHRcdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICFybm9Jbm5lcmh0bWwudGVzdCggdmFsdWUgKSAmJlxuXHRcdFx0XHQhd3JhcE1hcFsgKCBydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsgXCJcIiwgXCJcIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpIF0gKSB7XG5cblx0XHRcdFx0dmFsdWUgPSBqUXVlcnkuaHRtbFByZWZpbHRlciggdmFsdWUgKTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRcdGVsZW0gPSB0aGlzWyBpIF0gfHwge307XG5cblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblx0XHRcdFx0XHRcdFx0ZWxlbS5pbm5lckhUTUwgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtID0gMDtcblxuXHRcdFx0XHQvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2Rcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRcdHRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7XG5cdFx0XHR9XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fSxcblxuXHRyZXBsYWNlV2l0aDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlnbm9yZWQgPSBbXTtcblxuXHRcdC8vIE1ha2UgdGhlIGNoYW5nZXMsIHJlcGxhY2luZyBlYWNoIG5vbi1pZ25vcmVkIGNvbnRleHQgZWxlbWVudCB3aXRoIHRoZSBuZXcgY29udGVudFxuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG5cblx0XHRcdGlmICggalF1ZXJ5LmluQXJyYXkoIHRoaXMsIGlnbm9yZWQgKSA8IDAgKSB7XG5cdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggdGhpcyApICk7XG5cdFx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRcdHBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gRm9yY2UgY2FsbGJhY2sgaW52b2NhdGlvblxuXHRcdH0sIGlnbm9yZWQgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCgge1xuXHRhcHBlbmRUbzogXCJhcHBlbmRcIixcblx0cHJlcGVuZFRvOiBcInByZXBlbmRcIixcblx0aW5zZXJ0QmVmb3JlOiBcImJlZm9yZVwiLFxuXHRpbnNlcnRBZnRlcjogXCJhZnRlclwiLFxuXHRyZXBsYWNlQWxsOiBcInJlcGxhY2VXaXRoXCJcbn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGVsZW1zLFxuXHRcdFx0cmV0ID0gW10sXG5cdFx0XHRpbnNlcnQgPSBqUXVlcnkoIHNlbGVjdG9yICksXG5cdFx0XHRsYXN0ID0gaW5zZXJ0Lmxlbmd0aCAtIDEsXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgaSA8PSBsYXN0OyBpKysgKSB7XG5cdFx0XHRlbGVtcyA9IGkgPT09IGxhc3QgPyB0aGlzIDogdGhpcy5jbG9uZSggdHJ1ZSApO1xuXHRcdFx0alF1ZXJ5KCBpbnNlcnRbIGkgXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdC8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdHB1c2guYXBwbHkoIHJldCwgZWxlbXMuZ2V0KCkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCApO1xuXHR9O1xufSApO1xudmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoIFwiXihcIiArIHBudW0gKyBcIikoPyFweClbYS16JV0rJFwiLCBcImlcIiApO1xuXG52YXIgcmN1c3RvbVByb3AgPSAvXi0tLztcblxuXG52YXIgZ2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAodHJhYy0xNTA5OCwgdHJhYy0xNDE1MClcblx0XHQvLyBJRSB0aHJvd3Mgb24gZWxlbWVudHMgY3JlYXRlZCBpbiBwb3B1cHNcblx0XHQvLyBGRiBtZWFud2hpbGUgdGhyb3dzIG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggXCJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlXCJcblx0XHR2YXIgdmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcblxuXHRcdGlmICggIXZpZXcgfHwgIXZpZXcub3BlbmVyICkge1xuXHRcdFx0dmlldyA9IHdpbmRvdztcblx0XHR9XG5cblx0XHRyZXR1cm4gdmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG5cdH07XG5cbnZhciBzd2FwID0gZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrICkge1xuXHR2YXIgcmV0LCBuYW1lLFxuXHRcdG9sZCA9IHt9O1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0b2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdO1xuXHR9XG5cblx0cmV0ID0gY2FsbGJhY2suY2FsbCggZWxlbSApO1xuXG5cdC8vIFJldmVydCB0aGUgb2xkIHZhbHVlc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xkWyBuYW1lIF07XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufTtcblxuXG52YXIgcmJveFN0eWxlID0gbmV3IFJlZ0V4cCggY3NzRXhwYW5kLmpvaW4oIFwifFwiICksIFwiaVwiICk7XG5cbnZhciB3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiO1xuXG5cbnZhciBydHJpbUNTUyA9IG5ldyBSZWdFeHAoXG5cdFwiXlwiICsgd2hpdGVzcGFjZSArIFwiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIiArIHdoaXRlc3BhY2UgKyBcIiskXCIsXG5cdFwiZ1wiXG4pO1xuXG5cblxuXG4oIGZ1bmN0aW9uKCkge1xuXG5cdC8vIEV4ZWN1dGluZyBib3RoIHBpeGVsUG9zaXRpb24gJiBib3hTaXppbmdSZWxpYWJsZSB0ZXN0cyByZXF1aXJlIG9ubHkgb25lIGxheW91dFxuXHQvLyBzbyB0aGV5J3JlIGV4ZWN1dGVkIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSB0aGUgc2Vjb25kIGNvbXB1dGF0aW9uLlxuXHRmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHtcblxuXHRcdC8vIFRoaXMgaXMgYSBzaW5nbGV0b24sIHdlIG5lZWQgdG8gZXhlY3V0ZSBpdCBvbmx5IG9uY2Vcblx0XHRpZiAoICFkaXYgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDtcIiArXG5cdFx0XHRcIm1hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MFwiO1xuXHRcdGRpdi5zdHlsZS5jc3NUZXh0ID1cblx0XHRcdFwicG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO1wiICtcblx0XHRcdFwibWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDtcIiArXG5cdFx0XHRcIndpZHRoOjYwJTt0b3A6MSVcIjtcblx0XHRkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApLmFwcGVuZENoaWxkKCBkaXYgKTtcblxuXHRcdHZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTtcblx0XHRwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSBcIjElXCI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0XG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5tYXJnaW5MZWZ0ICkgPT09IDEyO1xuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAgLSA0LjMgb25seSwgU2FmYXJpIDw9OS4xIC0gMTAuMSwgaU9TIDw9Ny4wIC0gOS4zXG5cdFx0Ly8gU29tZSBzdHlsZXMgY29tZSBiYWNrIHdpdGggcGVyY2VudGFnZSB2YWx1ZXMsIGV2ZW4gdGhvdWdoIHRoZXkgc2hvdWxkbid0XG5cdFx0ZGl2LnN0eWxlLnJpZ2h0ID0gXCI2MCVcIjtcblx0XHRwaXhlbEJveFN0eWxlc1ZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUucmlnaHQgKSA9PT0gMzY7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seVxuXHRcdC8vIERldGVjdCBtaXNyZXBvcnRpbmcgb2YgY29udGVudCBkaW1lbnNpb25zIGZvciBib3gtc2l6aW5nOmJvcmRlci1ib3ggZWxlbWVudHNcblx0XHRib3hTaXppbmdSZWxpYWJsZVZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUud2lkdGggKSA9PT0gMzY7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHQvLyBEZXRlY3Qgb3ZlcmZsb3c6c2Nyb2xsIHNjcmV3aW5lc3MgKGdoLTM2OTkpXG5cdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9NjRcblx0XHQvLyBEb24ndCBnZXQgdHJpY2tlZCB3aGVuIHpvb20gYWZmZWN0cyBvZmZzZXRXaWR0aCAoZ2gtNDAyOSlcblx0XHRkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0c2Nyb2xsYm94U2l6ZVZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2Lm9mZnNldFdpZHRoIC8gMyApID09PSAxMjtcblxuXHRcdGRvY3VtZW50RWxlbWVudC5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7XG5cblx0XHQvLyBOdWxsaWZ5IHRoZSBkaXYgc28gaXQgd291bGRuJ3QgYmUgc3RvcmVkIGluIHRoZSBtZW1vcnkgYW5kXG5cdFx0Ly8gaXQgd2lsbCBhbHNvIGJlIGEgc2lnbiB0aGF0IGNoZWNrcyBhbHJlYWR5IHBlcmZvcm1lZFxuXHRcdGRpdiA9IG51bGw7XG5cdH1cblxuXHRmdW5jdGlvbiByb3VuZFBpeGVsTWVhc3VyZXMoIG1lYXN1cmUgKSB7XG5cdFx0cmV0dXJuIE1hdGgucm91bmQoIHBhcnNlRmxvYXQoIG1lYXN1cmUgKSApO1xuXHR9XG5cblx0dmFyIHBpeGVsUG9zaXRpb25WYWwsIGJveFNpemluZ1JlbGlhYmxlVmFsLCBzY3JvbGxib3hTaXplVmFsLCBwaXhlbEJveFN0eWxlc1ZhbCxcblx0XHRyZWxpYWJsZVRyRGltZW5zaW9uc1ZhbCwgcmVsaWFibGVNYXJnaW5MZWZ0VmFsLFxuXHRcdGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSxcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0Ly8gRmluaXNoIGVhcmx5IGluIGxpbWl0ZWQgKG5vbi1icm93c2VyKSBlbnZpcm9ubWVudHNcblx0aWYgKCAhZGl2LnN0eWxlICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0Ly8gU3R5bGUgb2YgY2xvbmVkIGVsZW1lbnQgYWZmZWN0cyBzb3VyY2UgZWxlbWVudCBjbG9uZWQgKHRyYWMtODkwOClcblx0ZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJjb250ZW50LWJveFwiO1xuXHRkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcIlwiO1xuXHRzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSA9IGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9PT0gXCJjb250ZW50LWJveFwiO1xuXG5cdGpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHtcblx0XHRib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIGJveFNpemluZ1JlbGlhYmxlVmFsO1xuXHRcdH0sXG5cdFx0cGl4ZWxCb3hTdHlsZXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbEJveFN0eWxlc1ZhbDtcblx0XHR9LFxuXHRcdHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbFBvc2l0aW9uVmFsO1xuXHRcdH0sXG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcmVsaWFibGVNYXJnaW5MZWZ0VmFsO1xuXHRcdH0sXG5cdFx0c2Nyb2xsYm94U2l6ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHNjcm9sbGJveFNpemVWYWw7XG5cdFx0fSxcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTUgLSAxOCtcblx0XHQvLyBJRS9FZGdlIG1pc3JlcG9ydCBgZ2V0Q29tcHV0ZWRTdHlsZWAgb2YgdGFibGUgcm93cyB3aXRoIHdpZHRoL2hlaWdodFxuXHRcdC8vIHNldCBpbiBDU1Mgd2hpbGUgYG9mZnNldCpgIHByb3BlcnRpZXMgcmVwb3J0IGNvcnJlY3QgdmFsdWVzLlxuXHRcdC8vIEJlaGF2aW9yIGluIElFIDkgaXMgbW9yZSBzdWJ0bGUgdGhhbiBpbiBuZXdlciB2ZXJzaW9ucyAmIGl0IHBhc3Nlc1xuXHRcdC8vIHNvbWUgdmVyc2lvbnMgb2YgdGhpcyB0ZXN0OyBtYWtlIHN1cmUgbm90IHRvIG1ha2UgaXQgcGFzcyB0aGVyZSFcblx0XHQvL1xuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggNzArXG5cdFx0Ly8gT25seSBGaXJlZm94IGluY2x1ZGVzIGJvcmRlciB3aWR0aHNcblx0XHQvLyBpbiBjb21wdXRlZCBkaW1lbnNpb25zLiAoZ2gtNDUyOSlcblx0XHRyZWxpYWJsZVRyRGltZW5zaW9uczogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdGFibGUsIHRyLCB0ckNoaWxkLCB0clN0eWxlO1xuXHRcdFx0aWYgKCByZWxpYWJsZVRyRGltZW5zaW9uc1ZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwidGFibGVcIiApO1xuXHRcdFx0XHR0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwidHJcIiApO1xuXHRcdFx0XHR0ckNoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXG5cdFx0XHRcdHRhYmxlLnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7Ym9yZGVyLWNvbGxhcHNlOnNlcGFyYXRlXCI7XG5cdFx0XHRcdHRyLnN0eWxlLmNzc1RleHQgPSBcImJvcmRlcjoxcHggc29saWRcIjtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgODYrXG5cdFx0XHRcdC8vIEhlaWdodCBzZXQgdGhyb3VnaCBjc3NUZXh0IGRvZXMgbm90IGdldCBhcHBsaWVkLlxuXHRcdFx0XHQvLyBDb21wdXRlZCBoZWlnaHQgdGhlbiBjb21lcyBiYWNrIGFzIDAuXG5cdFx0XHRcdHRyLnN0eWxlLmhlaWdodCA9IFwiMXB4XCI7XG5cdFx0XHRcdHRyQ2hpbGQuc3R5bGUuaGVpZ2h0ID0gXCI5cHhcIjtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDggQ2hyb21lIDg2K1xuXHRcdFx0XHQvLyBJbiBvdXIgYm9keUJhY2tncm91bmQuaHRtbCBpZnJhbWUsXG5cdFx0XHRcdC8vIGRpc3BsYXkgZm9yIGFsbCBkaXYgZWxlbWVudHMgaXMgc2V0IHRvIFwiaW5saW5lXCIsXG5cdFx0XHRcdC8vIHdoaWNoIGNhdXNlcyBhIHByb2JsZW0gb25seSBpbiBBbmRyb2lkIDggQ2hyb21lIDg2LlxuXHRcdFx0XHQvLyBFbnN1cmluZyB0aGUgZGl2IGlzIGRpc3BsYXk6IGJsb2NrXG5cdFx0XHRcdC8vIGdldHMgYXJvdW5kIHRoaXMgaXNzdWUuXG5cdFx0XHRcdHRyQ2hpbGQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblxuXHRcdFx0XHRkb2N1bWVudEVsZW1lbnRcblx0XHRcdFx0XHQuYXBwZW5kQ2hpbGQoIHRhYmxlIClcblx0XHRcdFx0XHQuYXBwZW5kQ2hpbGQoIHRyIClcblx0XHRcdFx0XHQuYXBwZW5kQ2hpbGQoIHRyQ2hpbGQgKTtcblxuXHRcdFx0XHR0clN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIHRyICk7XG5cdFx0XHRcdHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsID0gKCBwYXJzZUludCggdHJTdHlsZS5oZWlnaHQsIDEwICkgK1xuXHRcdFx0XHRcdHBhcnNlSW50KCB0clN0eWxlLmJvcmRlclRvcFdpZHRoLCAxMCApICtcblx0XHRcdFx0XHRwYXJzZUludCggdHJTdHlsZS5ib3JkZXJCb3R0b21XaWR0aCwgMTAgKSApID09PSB0ci5vZmZzZXRIZWlnaHQ7XG5cblx0XHRcdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCB0YWJsZSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsO1xuXHRcdH1cblx0fSApO1xufSApKCk7XG5cblxuZnVuY3Rpb24gY3VyQ1NTKCBlbGVtLCBuYW1lLCBjb21wdXRlZCApIHtcblx0dmFyIHdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgsIHJldCxcblx0XHRpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksXG5cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDUxK1xuXHRcdC8vIFJldHJpZXZpbmcgc3R5bGUgYmVmb3JlIGNvbXB1dGVkIHNvbWVob3dcblx0XHQvLyBmaXhlcyBhbiBpc3N1ZSB3aXRoIGdldHRpbmcgd3JvbmcgdmFsdWVzXG5cdFx0Ly8gb24gZGV0YWNoZWQgZWxlbWVudHNcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0Y29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTtcblxuXHQvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG5lZWRlZCBmb3I6XG5cdC8vICAgLmNzcygnZmlsdGVyJykgKElFIDkgb25seSwgdHJhYy0xMjUzNylcblx0Ly8gICAuY3NzKCctLWN1c3RvbVByb3BlcnR5KSAoZ2gtMzE0NClcblx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRyZXQgPSBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXTtcblxuXHRcdC8vIHRyaW0gd2hpdGVzcGFjZSBmb3IgY3VzdG9tIHByb3BlcnR5IChpc3N1ZSBnaC00OTI2KVxuXHRcdGlmICggaXNDdXN0b21Qcm9wICkge1xuXG5cdFx0XHQvLyBydHJpbSB0cmVhdHMgVSswMDBEIENBUlJJQUdFIFJFVFVSTiBhbmQgVSswMDBDIEZPUk0gRkVFRFxuXHRcdFx0Ly8gYXMgd2hpdGVzcGFjZSB3aGlsZSBDU1MgZG9lcyBub3QsIGJ1dCB0aGlzIGlzIG5vdCBhIHByb2JsZW1cblx0XHRcdC8vIGJlY2F1c2UgQ1NTIHByZXByb2Nlc3NpbmcgcmVwbGFjZXMgdGhlbSB3aXRoIFUrMDAwQSBMSU5FIEZFRURcblx0XHRcdC8vICh3aGljaCAqaXMqIENTUyB3aGl0ZXNwYWNlKVxuXHRcdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1zeW50YXgtMy8jaW5wdXQtcHJlcHJvY2Vzc2luZ1xuXHRcdFx0cmV0ID0gcmV0LnJlcGxhY2UoIHJ0cmltQ1NTLCBcIiQxXCIgKTtcblx0XHR9XG5cblx0XHRpZiAoIHJldCA9PT0gXCJcIiAmJiAhaXNBdHRhY2hlZCggZWxlbSApICkge1xuXHRcdFx0cmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gQSB0cmlidXRlIHRvIHRoZSBcImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHNcIlxuXHRcdC8vIEFuZHJvaWQgQnJvd3NlciByZXR1cm5zIHBlcmNlbnRhZ2UgZm9yIHNvbWUgdmFsdWVzLFxuXHRcdC8vIGJ1dCB3aWR0aCBzZWVtcyB0byBiZSByZWxpYWJseSBwaXhlbHMuXG5cdFx0Ly8gVGhpcyBpcyBhZ2FpbnN0IHRoZSBDU1NPTSBkcmFmdCBzcGVjOlxuXHRcdC8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3NvbS8jcmVzb2x2ZWQtdmFsdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5waXhlbEJveFN0eWxlcygpICYmIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiByYm94U3R5bGUudGVzdCggbmFtZSApICkge1xuXG5cdFx0XHQvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzXG5cdFx0XHR3aWR0aCA9IHN0eWxlLndpZHRoO1xuXHRcdFx0bWluV2lkdGggPSBzdHlsZS5taW5XaWR0aDtcblx0XHRcdG1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7XG5cblx0XHRcdC8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXRcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDtcblx0XHRcdHJldCA9IGNvbXB1dGVkLndpZHRoO1xuXG5cdFx0XHQvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzXG5cdFx0XHRzdHlsZS53aWR0aCA9IHdpZHRoO1xuXHRcdFx0c3R5bGUubWluV2lkdGggPSBtaW5XaWR0aDtcblx0XHRcdHN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJldCAhPT0gdW5kZWZpbmVkID9cblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0XHQvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLlxuXHRcdHJldCArIFwiXCIgOlxuXHRcdHJldDtcbn1cblxuXG5mdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7XG5cblx0Ly8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBjb25kaXRpb25GbigpICkge1xuXG5cdFx0XHRcdC8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZVxuXHRcdFx0XHQvLyB0byBtaXNzaW5nIGRlcGVuZGVuY3kpLCByZW1vdmUgaXQuXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmdldDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi5cblx0XHRcdHJldHVybiAoIHRoaXMuZ2V0ID0gaG9va0ZuICkuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0fTtcbn1cblxuXG52YXIgY3NzUHJlZml4ZXMgPSBbIFwiV2Via2l0XCIsIFwiTW96XCIsIFwibXNcIiBdLFxuXHRlbXB0eVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLnN0eWxlLFxuXHR2ZW5kb3JQcm9wcyA9IHt9O1xuXG4vLyBSZXR1cm4gYSB2ZW5kb3ItcHJlZml4ZWQgcHJvcGVydHkgb3IgdW5kZWZpbmVkXG5mdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHtcblxuXHQvLyBDaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzXG5cdHZhciBjYXBOYW1lID0gbmFtZVsgMCBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKCAxICksXG5cdFx0aSA9IGNzc1ByZWZpeGVzLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRuYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7XG5cdFx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0XHRyZXR1cm4gbmFtZTtcblx0XHR9XG5cdH1cbn1cblxuLy8gUmV0dXJuIGEgcG90ZW50aWFsbHktbWFwcGVkIGpRdWVyeS5jc3NQcm9wcyBvciB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHlcbmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7XG5cdHZhciBmaW5hbCA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdIHx8IHZlbmRvclByb3BzWyBuYW1lIF07XG5cblx0aWYgKCBmaW5hbCApIHtcblx0XHRyZXR1cm4gZmluYWw7XG5cdH1cblx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cblx0cmV0dXJuIHZlbmRvclByb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7XG59XG5cblxudmFyXG5cblx0Ly8gU3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZVxuXHQvLyBleGNlcHQgXCJ0YWJsZVwiLCBcInRhYmxlLWNlbGxcIiwgb3IgXCJ0YWJsZS1jYXB0aW9uXCJcblx0Ly8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5XG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcblx0Y3NzU2hvdyA9IHsgcG9zaXRpb246IFwiYWJzb2x1dGVcIiwgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiwgZGlzcGxheTogXCJibG9ja1wiIH0sXG5cdGNzc05vcm1hbFRyYW5zZm9ybSA9IHtcblx0XHRsZXR0ZXJTcGFjaW5nOiBcIjBcIixcblx0XHRmb250V2VpZ2h0OiBcIjQwMFwiXG5cdH07XG5cbmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBfZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkge1xuXG5cdC8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW5cblx0Ly8gbm9ybWFsaXplZCBhdCB0aGlzIHBvaW50XG5cdHZhciBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApO1xuXHRyZXR1cm4gbWF0Y2hlcyA/XG5cblx0XHQvLyBHdWFyZCBhZ2FpbnN0IHVuZGVmaW5lZCBcInN1YnRyYWN0XCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rc1xuXHRcdE1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgOlxuXHRcdHZhbHVlO1xufVxuXG5mdW5jdGlvbiBib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgYm94LCBpc0JvcmRlckJveCwgc3R5bGVzLCBjb21wdXRlZFZhbCApIHtcblx0dmFyIGkgPSBkaW1lbnNpb24gPT09IFwid2lkdGhcIiA/IDEgOiAwLFxuXHRcdGV4dHJhID0gMCxcblx0XHRkZWx0YSA9IDA7XG5cblx0Ly8gQWRqdXN0bWVudCBtYXkgbm90IGJlIG5lY2Vzc2FyeVxuXHRpZiAoIGJveCA9PT0gKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApICkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Zm9yICggOyBpIDwgNDsgaSArPSAyICkge1xuXG5cdFx0Ly8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luXG5cdFx0aWYgKCBib3ggPT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBib3ggKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgd2UgZ2V0IGhlcmUgd2l0aCBhIGNvbnRlbnQtYm94LCB3ZSdyZSBzZWVraW5nIFwicGFkZGluZ1wiIG9yIFwiYm9yZGVyXCIgb3IgXCJtYXJnaW5cIlxuXHRcdGlmICggIWlzQm9yZGVyQm94ICkge1xuXG5cdFx0XHQvLyBBZGQgcGFkZGluZ1xuXHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIEZvciBcImJvcmRlclwiIG9yIFwibWFyZ2luXCIsIGFkZCBib3JkZXJcblx0XHRcdGlmICggYm94ICE9PSBcInBhZGRpbmdcIiApIHtcblx0XHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblxuXHRcdFx0Ly8gQnV0IHN0aWxsIGtlZXAgdHJhY2sgb2YgaXQgb3RoZXJ3aXNlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRleHRyYSArPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXG5cdFx0Ly8gSWYgd2UgZ2V0IGhlcmUgd2l0aCBhIGJvcmRlci1ib3ggKGNvbnRlbnQgKyBwYWRkaW5nICsgYm9yZGVyKSwgd2UncmUgc2Vla2luZyBcImNvbnRlbnRcIiBvclxuXHRcdC8vIFwicGFkZGluZ1wiIG9yIFwibWFyZ2luXCJcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBGb3IgXCJjb250ZW50XCIsIHN1YnRyYWN0IHBhZGRpbmdcblx0XHRcdGlmICggYm94ID09PSBcImNvbnRlbnRcIiApIHtcblx0XHRcdFx0ZGVsdGEgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciBcImNvbnRlbnRcIiBvciBcInBhZGRpbmdcIiwgc3VidHJhY3QgYm9yZGVyXG5cdFx0XHRpZiAoIGJveCAhPT0gXCJtYXJnaW5cIiApIHtcblx0XHRcdFx0ZGVsdGEgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBBY2NvdW50IGZvciBwb3NpdGl2ZSBjb250ZW50LWJveCBzY3JvbGwgZ3V0dGVyIHdoZW4gcmVxdWVzdGVkIGJ5IHByb3ZpZGluZyBjb21wdXRlZFZhbFxuXHRpZiAoICFpc0JvcmRlckJveCAmJiBjb21wdXRlZFZhbCA+PSAwICkge1xuXG5cdFx0Ly8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGlzIGEgcm91bmRlZCBzdW0gb2YgY29udGVudCwgcGFkZGluZywgc2Nyb2xsIGd1dHRlciwgYW5kIGJvcmRlclxuXHRcdC8vIEFzc3VtaW5nIGludGVnZXIgc2Nyb2xsIGd1dHRlciwgc3VidHJhY3QgdGhlIHJlc3QgYW5kIHJvdW5kIGRvd25cblx0XHRkZWx0YSArPSBNYXRoLm1heCggMCwgTWF0aC5jZWlsKFxuXHRcdFx0ZWxlbVsgXCJvZmZzZXRcIiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdIC1cblx0XHRcdGNvbXB1dGVkVmFsIC1cblx0XHRcdGRlbHRhIC1cblx0XHRcdGV4dHJhIC1cblx0XHRcdDAuNVxuXG5cdFx0Ly8gSWYgb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGlzIHVua25vd24sIHRoZW4gd2UgY2FuJ3QgZGV0ZXJtaW5lIGNvbnRlbnQtYm94IHNjcm9sbCBndXR0ZXJcblx0XHQvLyBVc2UgYW4gZXhwbGljaXQgemVybyB0byBhdm9pZCBOYU4gKGdoLTM5NjQpXG5cdFx0KSApIHx8IDA7XG5cdH1cblxuXHRyZXR1cm4gZGVsdGE7XG59XG5cbmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZVxuXHR2YXIgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cblx0XHQvLyBUbyBhdm9pZCBmb3JjaW5nIGEgcmVmbG93LCBvbmx5IGZldGNoIGJveFNpemluZyBpZiB3ZSBuZWVkIGl0IChnaC00MzIyKS5cblx0XHQvLyBGYWtlIGNvbnRlbnQtYm94IHVudGlsIHdlIGtub3cgaXQncyBuZWVkZWQgdG8ga25vdyB0aGUgdHJ1ZSB2YWx1ZS5cblx0XHRib3hTaXppbmdOZWVkZWQgPSAhc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpIHx8IGV4dHJhLFxuXHRcdGlzQm9yZGVyQm94ID0gYm94U2l6aW5nTmVlZGVkICYmXG5cdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiLFxuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCxcblxuXHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgZGltZW5zaW9uLCBzdHlsZXMgKSxcblx0XHRvZmZzZXRQcm9wID0gXCJvZmZzZXRcIiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKTtcblxuXHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTRcblx0Ly8gUmV0dXJuIGEgY29uZm91bmRpbmcgbm9uLXBpeGVsIHZhbHVlIG9yIGZlaWduIGlnbm9yYW5jZSwgYXMgYXBwcm9wcmlhdGUuXG5cdGlmICggcm51bW5vbnB4LnRlc3QoIHZhbCApICkge1xuXHRcdGlmICggIWV4dHJhICkge1xuXHRcdFx0cmV0dXJuIHZhbDtcblx0XHR9XG5cdFx0dmFsID0gXCJhdXRvXCI7XG5cdH1cblxuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdC8vIFVzZSBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgZm9yIHdoZW4gYm94IHNpemluZyBpcyB1bnJlbGlhYmxlLlxuXHQvLyBJbiB0aG9zZSBjYXNlcywgdGhlIGNvbXB1dGVkIHZhbHVlIGNhbiBiZSB0cnVzdGVkIHRvIGJlIGJvcmRlci1ib3guXG5cdGlmICggKCAhc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpICYmIGlzQm9yZGVyQm94IHx8XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMCAtIDExKywgRWRnZSAxNSAtIDE4K1xuXHRcdC8vIElFL0VkZ2UgbWlzcmVwb3J0IGBnZXRDb21wdXRlZFN0eWxlYCBvZiB0YWJsZSByb3dzIHdpdGggd2lkdGgvaGVpZ2h0XG5cdFx0Ly8gc2V0IGluIENTUyB3aGlsZSBgb2Zmc2V0KmAgcHJvcGVydGllcyByZXBvcnQgY29ycmVjdCB2YWx1ZXMuXG5cdFx0Ly8gSW50ZXJlc3RpbmdseSwgaW4gc29tZSBjYXNlcyBJRSA5IGRvZXNuJ3Qgc3VmZmVyIGZyb20gdGhpcyBpc3N1ZS5cblx0XHQhc3VwcG9ydC5yZWxpYWJsZVRyRGltZW5zaW9ucygpICYmIG5vZGVOYW1lKCBlbGVtLCBcInRyXCIgKSB8fFxuXG5cdFx0Ly8gRmFsbCBiYWNrIHRvIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCB3aGVuIHZhbHVlIGlzIFwiYXV0b1wiXG5cdFx0Ly8gVGhpcyBoYXBwZW5zIGZvciBpbmxpbmUgZWxlbWVudHMgd2l0aCBubyBleHBsaWNpdCBzZXR0aW5nIChnaC0zNTcxKVxuXHRcdHZhbCA9PT0gXCJhdXRvXCIgfHxcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgLSA0LjMgb25seVxuXHRcdC8vIEFsc28gdXNlIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBmb3IgbWlzcmVwb3J0ZWQgaW5saW5lIGRpbWVuc2lvbnMgKGdoLTM2MDIpXG5cdFx0IXBhcnNlRmxvYXQoIHZhbCApICYmIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiaW5saW5lXCIgKSAmJlxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIHZpc2libGUgJiBjb25uZWN0ZWRcblx0XHRlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICkge1xuXG5cdFx0aXNCb3JkZXJCb3ggPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiO1xuXG5cdFx0Ly8gV2hlcmUgYXZhaWxhYmxlLCBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgYXBwcm94aW1hdGUgYm9yZGVyIGJveCBkaW1lbnNpb25zLlxuXHRcdC8vIFdoZXJlIG5vdCBhdmFpbGFibGUgKGUuZy4sIFNWRyksIGFzc3VtZSB1bnJlbGlhYmxlIGJveC1zaXppbmcgYW5kIGludGVycHJldCB0aGVcblx0XHQvLyByZXRyaWV2ZWQgdmFsdWUgYXMgYSBjb250ZW50IGJveCBkaW1lbnNpb24uXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IG9mZnNldFByb3AgaW4gZWxlbTtcblx0XHRpZiAoIHZhbHVlSXNCb3JkZXJCb3ggKSB7XG5cdFx0XHR2YWwgPSBlbGVtWyBvZmZzZXRQcm9wIF07XG5cdFx0fVxuXHR9XG5cblx0Ly8gTm9ybWFsaXplIFwiXCIgYW5kIGF1dG9cblx0dmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDtcblxuXHQvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsXG5cdHJldHVybiAoIHZhbCArXG5cdFx0Ym94TW9kZWxBZGp1c3RtZW50KFxuXHRcdFx0ZWxlbSxcblx0XHRcdGRpbWVuc2lvbixcblx0XHRcdGV4dHJhIHx8ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSxcblx0XHRcdHZhbHVlSXNCb3JkZXJCb3gsXG5cdFx0XHRzdHlsZXMsXG5cblx0XHRcdC8vIFByb3ZpZGUgdGhlIGN1cnJlbnQgY29tcHV0ZWQgc2l6ZSB0byByZXF1ZXN0IHNjcm9sbCBndXR0ZXIgY2FsY3VsYXRpb24gKGdoLTM1ODkpXG5cdFx0XHR2YWxcblx0XHQpXG5cdCkgKyBcInB4XCI7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XG5cdGNzc0hvb2tzOiB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eVxuXHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIFwib3BhY2l0eVwiICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkIFwicHhcIiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzXG5cdGNzc051bWJlcjoge1xuXHRcdFwiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnRcIjogdHJ1ZSxcblx0XHRcImNvbHVtbkNvdW50XCI6IHRydWUsXG5cdFx0XCJmaWxsT3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwiZmxleEdyb3dcIjogdHJ1ZSxcblx0XHRcImZsZXhTaHJpbmtcIjogdHJ1ZSxcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcblx0XHRcImdyaWRBcmVhXCI6IHRydWUsXG5cdFx0XCJncmlkQ29sdW1uXCI6IHRydWUsXG5cdFx0XCJncmlkQ29sdW1uRW5kXCI6IHRydWUsXG5cdFx0XCJncmlkQ29sdW1uU3RhcnRcIjogdHJ1ZSxcblx0XHRcImdyaWRSb3dcIjogdHJ1ZSxcblx0XHRcImdyaWRSb3dFbmRcIjogdHJ1ZSxcblx0XHRcImdyaWRSb3dTdGFydFwiOiB0cnVlLFxuXHRcdFwibGluZUhlaWdodFwiOiB0cnVlLFxuXHRcdFwib3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwib3JkZXJcIjogdHJ1ZSxcblx0XHRcIm9ycGhhbnNcIjogdHJ1ZSxcblx0XHRcIndpZG93c1wiOiB0cnVlLFxuXHRcdFwiekluZGV4XCI6IHRydWUsXG5cdFx0XCJ6b29tXCI6IHRydWVcblx0fSxcblxuXHQvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlXG5cdC8vIHNldHRpbmcgb3IgZ2V0dGluZyB0aGUgdmFsdWVcblx0Y3NzUHJvcHM6IHt9LFxuXG5cdC8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlXG5cdHN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIGV4dHJhICkge1xuXG5cdFx0Ly8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lXG5cdFx0dmFyIHJldCwgdHlwZSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApLFxuXHRcdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gcXVlcnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eVxuXHRcdC8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC5cblx0XHRpZiAoICFpc0N1c3RvbVByb3AgKSB7XG5cdFx0XHRuYW1lID0gZmluYWxQcm9wTmFtZSggb3JpZ05hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBHZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uLCB0aGVuIHVucHJlZml4ZWQgdmVyc2lvblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuXHRcdFx0Ly8gQ29udmVydCBcIis9XCIgb3IgXCItPVwiIHRvIHJlbGF0aXZlIG51bWJlcnMgKHRyYWMtNzM0NSlcblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAoIHJldCA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmIHJldFsgMSBdICkge1xuXHRcdFx0XHR2YWx1ZSA9IGFkanVzdENTUyggZWxlbSwgbmFtZSwgcmV0ICk7XG5cblx0XHRcdFx0Ly8gRml4ZXMgYnVnIHRyYWMtOTIzN1xuXHRcdFx0XHR0eXBlID0gXCJudW1iZXJcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICh0cmFjLTcxMTYpXG5cdFx0XHRpZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgbnVtYmVyIHdhcyBwYXNzZWQgaW4sIGFkZCB0aGUgdW5pdCAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKVxuXHRcdFx0Ly8gVGhlIGlzQ3VzdG9tUHJvcCBjaGVjayBjYW4gYmUgcmVtb3ZlZCBpbiBqUXVlcnkgNC4wIHdoZW4gd2Ugb25seSBhdXRvLWFwcGVuZFxuXHRcdFx0Ly8gXCJweFwiIHRvIGEgZmV3IGhhcmRjb2RlZCB2YWx1ZXMuXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwibnVtYmVyXCIgJiYgIWlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdFx0dmFsdWUgKz0gcmV0ICYmIHJldFsgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBvcmlnaW5hbCBjbG9uZSdzIHZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09IFwiXCIgJiYgbmFtZS5pbmRleE9mKCBcImJhY2tncm91bmRcIiApID09PSAwICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gXCJpbmhlcml0XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZVxuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8XG5cdFx0XHRcdCggdmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdFx0XHRzdHlsZS5zZXRQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3Rcblx0XHRcdHJldHVybiBzdHlsZVsgbmFtZSBdO1xuXHRcdH1cblx0fSxcblxuXHRjc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBleHRyYSwgc3R5bGVzICkge1xuXHRcdHZhciB2YWwsIG51bSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gbW9kaWZ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gVHJ5IHByZWZpeGVkIG5hbWUgZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgbmFtZVxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXRcblx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IFwibm9ybWFsXCIgdG8gY29tcHV0ZWQgdmFsdWVcblx0XHRpZiAoIHZhbCA9PT0gXCJub3JtYWxcIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHtcblx0XHRcdHZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdO1xuXHRcdH1cblxuXHRcdC8vIE1ha2UgbnVtZXJpYyBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpY1xuXHRcdGlmICggZXh0cmEgPT09IFwiXCIgfHwgZXh0cmEgKSB7XG5cdFx0XHRudW0gPSBwYXJzZUZsb2F0KCB2YWwgKTtcblx0XHRcdHJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggX2ksIGRpbWVuc2lvbiApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBkaW1lbnNpb24gXSA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdC8vIENlcnRhaW4gZWxlbWVudHMgY2FuIGhhdmUgZGltZW5zaW9uIGluZm8gaWYgd2UgaW52aXNpYmx5IHNob3cgdGhlbVxuXHRcdFx0XHQvLyBidXQgaXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQgd291bGQgYmVuZWZpdFxuXHRcdFx0XHRyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgKSAmJlxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDgrXG5cdFx0XHRcdFx0Ly8gVGFibGUgY29sdW1ucyBpbiBTYWZhcmkgaGF2ZSBub24temVybyBvZmZzZXRXaWR0aCAmIHplcm9cblx0XHRcdFx0XHQvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB1bmxlc3MgZGlzcGxheSBpcyBjaGFuZ2VkLlxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHRcdFx0XHRcdC8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGEgZGlzY29ubmVjdGVkIG5vZGVcblx0XHRcdFx0XHQvLyBpbiBJRSB0aHJvd3MgYW4gZXJyb3IuXG5cdFx0XHRcdFx0KCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCB8fCAhZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCApID9cblx0XHRcdFx0XHRzd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7XG5cdFx0XHRcdFx0fSApIDpcblx0XHRcdFx0XHRnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBleHRyYSApIHtcblx0XHRcdHZhciBtYXRjaGVzLFxuXHRcdFx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSxcblxuXHRcdFx0XHQvLyBPbmx5IHJlYWQgc3R5bGVzLnBvc2l0aW9uIGlmIHRoZSB0ZXN0IGhhcyBhIGNoYW5jZSB0byBmYWlsXG5cdFx0XHRcdC8vIHRvIGF2b2lkIGZvcmNpbmcgYSByZWZsb3cuXG5cdFx0XHRcdHNjcm9sbGJveFNpemVCdWdneSA9ICFzdXBwb3J0LnNjcm9sbGJveFNpemUoKSAmJlxuXHRcdFx0XHRcdHN0eWxlcy5wb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiLFxuXG5cdFx0XHRcdC8vIFRvIGF2b2lkIGZvcmNpbmcgYSByZWZsb3csIG9ubHkgZmV0Y2ggYm94U2l6aW5nIGlmIHdlIG5lZWQgaXQgKGdoLTM5OTEpXG5cdFx0XHRcdGJveFNpemluZ05lZWRlZCA9IHNjcm9sbGJveFNpemVCdWdneSB8fCBleHRyYSxcblx0XHRcdFx0aXNCb3JkZXJCb3ggPSBib3hTaXppbmdOZWVkZWQgJiZcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiLFxuXHRcdFx0XHRzdWJ0cmFjdCA9IGV4dHJhID9cblx0XHRcdFx0XHRib3hNb2RlbEFkanVzdG1lbnQoXG5cdFx0XHRcdFx0XHRlbGVtLFxuXHRcdFx0XHRcdFx0ZGltZW5zaW9uLFxuXHRcdFx0XHRcdFx0ZXh0cmEsXG5cdFx0XHRcdFx0XHRpc0JvcmRlckJveCxcblx0XHRcdFx0XHRcdHN0eWxlc1xuXHRcdFx0XHRcdCkgOlxuXHRcdFx0XHRcdDA7XG5cblx0XHRcdC8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZFxuXHRcdFx0Ly8gZmFraW5nIGEgY29udGVudC1ib3ggdG8gZ2V0IGJvcmRlciBhbmQgcGFkZGluZyAoZ2gtMzY5OSlcblx0XHRcdGlmICggaXNCb3JkZXJCb3ggJiYgc2Nyb2xsYm94U2l6ZUJ1Z2d5ICkge1xuXHRcdFx0XHRzdWJ0cmFjdCAtPSBNYXRoLmNlaWwoXG5cdFx0XHRcdFx0ZWxlbVsgXCJvZmZzZXRcIiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdIC1cblx0XHRcdFx0XHRwYXJzZUZsb2F0KCBzdHlsZXNbIGRpbWVuc2lvbiBdICkgLVxuXHRcdFx0XHRcdGJveE1vZGVsQWRqdXN0bWVudCggZWxlbSwgZGltZW5zaW9uLCBcImJvcmRlclwiLCBmYWxzZSwgc3R5bGVzICkgLVxuXHRcdFx0XHRcdDAuNVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZFxuXHRcdFx0aWYgKCBzdWJ0cmFjdCAmJiAoIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJlxuXHRcdFx0XHQoIG1hdGNoZXNbIDMgXSB8fCBcInB4XCIgKSAhPT0gXCJweFwiICkge1xuXG5cdFx0XHRcdGVsZW0uc3R5bGVbIGRpbWVuc2lvbiBdID0gdmFsdWU7XG5cdFx0XHRcdHZhbHVlID0galF1ZXJ5LmNzcyggZWxlbSwgZGltZW5zaW9uICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7XG5cdFx0fVxuXHR9O1xufSApO1xuXG5qUXVlcnkuY3NzSG9va3MubWFyZ2luTGVmdCA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5yZWxpYWJsZU1hcmdpbkxlZnQsXG5cdGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0cmV0dXJuICggcGFyc2VGbG9hdCggY3VyQ1NTKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiApICkgfHxcblx0XHRcdFx0ZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC1cblx0XHRcdFx0XHRzd2FwKCBlbGVtLCB7IG1hcmdpbkxlZnQ6IDAgfSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuXHRcdFx0XHRcdH0gKVxuXHRcdFx0KSArIFwicHhcIjtcblx0XHR9XG5cdH1cbik7XG5cbi8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXNcbmpRdWVyeS5lYWNoKCB7XG5cdG1hcmdpbjogXCJcIixcblx0cGFkZGluZzogXCJcIixcblx0Ym9yZGVyOiBcIldpZHRoXCJcbn0sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1ZmZpeCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHtcblx0XHRleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBpID0gMCxcblx0XHRcdFx0ZXhwYW5kZWQgPSB7fSxcblxuXHRcdFx0XHQvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmdcblx0XHRcdFx0cGFydHMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS5zcGxpdCggXCIgXCIgKSA6IFsgdmFsdWUgXTtcblxuXHRcdFx0Zm9yICggOyBpIDwgNDsgaSsrICkge1xuXHRcdFx0XHRleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9XG5cdFx0XHRcdFx0cGFydHNbIGkgXSB8fCBwYXJ0c1sgaSAtIDIgXSB8fCBwYXJ0c1sgMCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXhwYW5kZWQ7XG5cdFx0fVxuXHR9O1xuXG5cdGlmICggcHJlZml4ICE9PSBcIm1hcmdpblwiICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgc3R5bGVzLCBsZW4sXG5cdFx0XHRcdG1hcCA9IHt9LFxuXHRcdFx0XHRpID0gMDtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0XHRsZW4gPSBuYW1lLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWFwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XG5cdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHR9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fVxufSApO1xuXG5cbmZ1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHtcblx0cmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKTtcbn1cbmpRdWVyeS5Ud2VlbiA9IFR3ZWVuO1xuXG5Ud2Vlbi5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBUd2Vlbixcblx0aW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkge1xuXHRcdHRoaXMuZWxlbSA9IGVsZW07XG5cdFx0dGhpcy5wcm9wID0gcHJvcDtcblx0XHR0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0O1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApO1xuXHR9LFxuXHRjdXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cblx0XHRcdGhvb2tzLmdldCggdGhpcyApIDpcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTtcblx0fSxcblx0cnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHtcblx0XHR2YXIgZWFzZWQsXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxuXHRcdFx0XHRwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50O1xuXHRcdH1cblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xuXHRcdFx0aG9va3Muc2V0KCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcblxuVHdlZW4ucHJvcEhvb2tzID0ge1xuXHRfZGVmYXVsdDoge1xuXHRcdGdldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0dmFyIHJlc3VsdDtcblxuXHRcdFx0Ly8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCxcblx0XHRcdC8vIG9yIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc3R5bGUgcHJvcGVydHkgdGhhdCBleGlzdHMuXG5cdFx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgIT09IDEgfHxcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07XG5cdFx0XHR9XG5cblx0XHRcdC8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseVxuXHRcdFx0Ly8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlscy5cblx0XHRcdC8vIFNpbXBsZSB2YWx1ZXMgc3VjaCBhcyBcIjEwcHhcIiBhcmUgcGFyc2VkIHRvIEZsb2F0O1xuXHRcdFx0Ly8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyBcInJvdGF0ZSgxcmFkKVwiIGFyZSByZXR1cm5lZCBhcy1pcy5cblx0XHRcdHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIFwiXCIgKTtcblxuXHRcdFx0Ly8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCBcImF1dG9cIiBhcmUgY29udmVydGVkIHRvIDAuXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXG5cdFx0XHQvLyBVc2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdC5cblx0XHRcdC8vIFVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZS5cblx0XHRcdC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlID09PSAxICYmIChcblx0XHRcdFx0alF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gfHxcblx0XHRcdFx0XHR0d2Vlbi5lbGVtLnN0eWxlWyBmaW5hbFByb3BOYW1lKCB0d2Vlbi5wcm9wICkgXSAhPSBudWxsICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gU3VwcG9ydDogSUUgPD05IG9ubHlcbi8vIFBhbmljIGJhc2VkIGFwcHJvYWNoIHRvIHNldHRpbmcgdGhpbmdzIG9uIGRpc2Nvbm5lY3RlZCBub2Rlc1xuVHdlZW4ucHJvcEhvb2tzLnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0ID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgJiYgdHdlZW4uZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmVhc2luZyA9IHtcblx0bGluZWFyOiBmdW5jdGlvbiggcCApIHtcblx0XHRyZXR1cm4gcDtcblx0fSxcblx0c3dpbmc6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiAwLjUgLSBNYXRoLmNvcyggcCAqIE1hdGguUEkgKSAvIDI7XG5cdH0sXG5cdF9kZWZhdWx0OiBcInN3aW5nXCJcbn07XG5cbmpRdWVyeS5meCA9IFR3ZWVuLnByb3RvdHlwZS5pbml0O1xuXG4vLyBCYWNrIGNvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludFxualF1ZXJ5LmZ4LnN0ZXAgPSB7fTtcblxuXG5cblxudmFyXG5cdGZ4Tm93LCBpblByb2dyZXNzLFxuXHRyZnh0eXBlcyA9IC9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxcblx0cnJ1biA9IC9xdWV1ZUhvb2tzJC87XG5cbmZ1bmN0aW9uIHNjaGVkdWxlKCkge1xuXHRpZiAoIGluUHJvZ3Jlc3MgKSB7XG5cdFx0aWYgKCBkb2N1bWVudC5oaWRkZW4gPT09IGZhbHNlICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgKSB7XG5cdFx0XHR3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBzY2hlZHVsZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dCggc2NoZWR1bGUsIGpRdWVyeS5meC5pbnRlcnZhbCApO1xuXHRcdH1cblxuXHRcdGpRdWVyeS5meC50aWNrKCk7XG5cdH1cbn1cblxuLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseVxuZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRmeE5vdyA9IHVuZGVmaW5lZDtcblx0fSApO1xuXHRyZXR1cm4gKCBmeE5vdyA9IERhdGUubm93KCkgKTtcbn1cblxuLy8gR2VuZXJhdGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSBzdGFuZGFyZCBhbmltYXRpb25cbmZ1bmN0aW9uIGdlbkZ4KCB0eXBlLCBpbmNsdWRlV2lkdGggKSB7XG5cdHZhciB3aGljaCxcblx0XHRpID0gMCxcblx0XHRhdHRycyA9IHsgaGVpZ2h0OiB0eXBlIH07XG5cblx0Ly8gSWYgd2UgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAxIHRvIGRvIGFsbCBjc3NFeHBhbmQgdmFsdWVzLFxuXHQvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodFxuXHRpbmNsdWRlV2lkdGggPSBpbmNsdWRlV2lkdGggPyAxIDogMDtcblx0Zm9yICggOyBpIDwgNDsgaSArPSAyIC0gaW5jbHVkZVdpZHRoICkge1xuXHRcdHdoaWNoID0gY3NzRXhwYW5kWyBpIF07XG5cdFx0YXR0cnNbIFwibWFyZ2luXCIgKyB3aGljaCBdID0gYXR0cnNbIFwicGFkZGluZ1wiICsgd2hpY2ggXSA9IHR5cGU7XG5cdH1cblxuXHRpZiAoIGluY2x1ZGVXaWR0aCApIHtcblx0XHRhdHRycy5vcGFjaXR5ID0gYXR0cnMud2lkdGggPSB0eXBlO1xuXHR9XG5cblx0cmV0dXJuIGF0dHJzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHtcblx0dmFyIHR3ZWVuLFxuXHRcdGNvbGxlY3Rpb24gPSAoIEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdICkuY29uY2F0KCBBbmltYXRpb24udHdlZW5lcnNbIFwiKlwiIF0gKSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCAoIHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSApIHtcblxuXHRcdFx0Ly8gV2UncmUgZG9uZSB3aXRoIHRoaXMgcHJvcGVydHlcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlciggZWxlbSwgcHJvcHMsIG9wdHMgKSB7XG5cdHZhciBwcm9wLCB2YWx1ZSwgdG9nZ2xlLCBob29rcywgb2xkZmlyZSwgcHJvcFR3ZWVuLCByZXN0b3JlRGlzcGxheSwgZGlzcGxheSxcblx0XHRpc0JveCA9IFwid2lkdGhcIiBpbiBwcm9wcyB8fCBcImhlaWdodFwiIGluIHByb3BzLFxuXHRcdGFuaW0gPSB0aGlzLFxuXHRcdG9yaWcgPSB7fSxcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGUsXG5cdFx0aGlkZGVuID0gZWxlbS5ub2RlVHlwZSAmJiBpc0hpZGRlbldpdGhpblRyZWUoIGVsZW0gKSxcblx0XHRkYXRhU2hvdyA9IGRhdGFQcml2LmdldCggZWxlbSwgXCJmeHNob3dcIiApO1xuXG5cdC8vIFF1ZXVlLXNraXBwaW5nIGFuaW1hdGlvbnMgaGlqYWNrIHRoZSBmeCBob29rc1xuXHRpZiAoICFvcHRzLnF1ZXVlICkge1xuXHRcdGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCBcImZ4XCIgKTtcblx0XHRpZiAoIGhvb2tzLnVucXVldWVkID09IG51bGwgKSB7XG5cdFx0XHRob29rcy51bnF1ZXVlZCA9IDA7XG5cdFx0XHRvbGRmaXJlID0gaG9va3MuZW1wdHkuZmlyZTtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhaG9va3MudW5xdWV1ZWQgKSB7XG5cdFx0XHRcdFx0b2xkZmlyZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRob29rcy51bnF1ZXVlZCsrO1xuXG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBFbnN1cmUgdGhlIGNvbXBsZXRlIGhhbmRsZXIgaXMgY2FsbGVkIGJlZm9yZSB0aGlzIGNvbXBsZXRlc1xuXHRcdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRob29rcy51bnF1ZXVlZC0tO1xuXHRcdFx0XHRpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sIFwiZnhcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBEZXRlY3Qgc2hvdy9oaWRlIGFuaW1hdGlvbnNcblx0Zm9yICggcHJvcCBpbiBwcm9wcyApIHtcblx0XHR2YWx1ZSA9IHByb3BzWyBwcm9wIF07XG5cdFx0aWYgKCByZnh0eXBlcy50ZXN0KCB2YWx1ZSApICkge1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBwcm9wIF07XG5cdFx0XHR0b2dnbGUgPSB0b2dnbGUgfHwgdmFsdWUgPT09IFwidG9nZ2xlXCI7XG5cdFx0XHRpZiAoIHZhbHVlID09PSAoIGhpZGRlbiA/IFwiaGlkZVwiIDogXCJzaG93XCIgKSApIHtcblxuXHRcdFx0XHQvLyBQcmV0ZW5kIHRvIGJlIGhpZGRlbiBpZiB0aGlzIGlzIGEgXCJzaG93XCIgYW5kXG5cdFx0XHRcdC8vIHRoZXJlIGlzIHN0aWxsIGRhdGEgZnJvbSBhIHN0b3BwZWQgc2hvdy9oaWRlXG5cdFx0XHRcdGlmICggdmFsdWUgPT09IFwic2hvd1wiICYmIGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSB0cnVlO1xuXG5cdFx0XHRcdC8vIElnbm9yZSBhbGwgb3RoZXIgbm8tb3Agc2hvdy9oaWRlIGRhdGFcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0b3JpZ1sgcHJvcCBdID0gZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBCYWlsIG91dCBpZiB0aGlzIGlzIGEgbm8tb3AgbGlrZSAuaGlkZSgpLmhpZGUoKVxuXHRwcm9wVHdlZW4gPSAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3BzICk7XG5cdGlmICggIXByb3BUd2VlbiAmJiBqUXVlcnkuaXNFbXB0eU9iamVjdCggb3JpZyApICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFJlc3RyaWN0IFwib3ZlcmZsb3dcIiBhbmQgXCJkaXNwbGF5XCIgc3R5bGVzIGR1cmluZyBib3ggYW5pbWF0aW9uc1xuXHRpZiAoIGlzQm94ICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSwgRWRnZSAxMiAtIDE1XG5cdFx0Ly8gUmVjb3JkIGFsbCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRSBkb2VzIG5vdCBpbmZlciB0aGUgc2hvcnRoYW5kXG5cdFx0Ly8gZnJvbSBpZGVudGljYWxseS12YWx1ZWQgb3ZlcmZsb3dYIGFuZCBvdmVyZmxvd1kgYW5kIEVkZ2UganVzdCBtaXJyb3JzXG5cdFx0Ly8gdGhlIG92ZXJmbG93WCB2YWx1ZSB0aGVyZS5cblx0XHRvcHRzLm92ZXJmbG93ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTtcblxuXHRcdC8vIElkZW50aWZ5IGEgZGlzcGxheSB0eXBlLCBwcmVmZXJyaW5nIG9sZCBzaG93L2hpZGUgZGF0YSBvdmVyIHRoZSBDU1MgY2FzY2FkZVxuXHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVNob3cgJiYgZGF0YVNob3cuZGlzcGxheTtcblx0XHRpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7XG5cdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRhdGFQcml2LmdldCggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHR9XG5cdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRcdGlmICggcmVzdG9yZURpc3BsYXkgKSB7XG5cdFx0XHRcdGRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gR2V0IG5vbmVtcHR5IHZhbHVlKHMpIGJ5IHRlbXBvcmFyaWx5IGZvcmNpbmcgdmlzaWJpbGl0eVxuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdFx0cmVzdG9yZURpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXkgfHwgcmVzdG9yZURpc3BsYXk7XG5cdFx0XHRcdGRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBbmltYXRlIGlubGluZSBlbGVtZW50cyBhcyBpbmxpbmUtYmxvY2tcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwiaW5saW5lXCIgfHwgZGlzcGxheSA9PT0gXCJpbmxpbmUtYmxvY2tcIiAmJiByZXN0b3JlRGlzcGxheSAhPSBudWxsICkge1xuXHRcdFx0aWYgKCBqUXVlcnkuY3NzKCBlbGVtLCBcImZsb2F0XCIgKSA9PT0gXCJub25lXCIgKSB7XG5cblx0XHRcdFx0Ly8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgZGlzcGxheSB2YWx1ZSBhdCB0aGUgZW5kIG9mIHB1cmUgc2hvdy9oaWRlIGFuaW1hdGlvbnNcblx0XHRcdFx0aWYgKCAhcHJvcFR3ZWVuICkge1xuXHRcdFx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRzdHlsZS5kaXNwbGF5ID0gcmVzdG9yZURpc3BsYXk7XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRcdGRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5O1xuXHRcdFx0XHRcdFx0cmVzdG9yZURpc3BsYXkgPSBkaXNwbGF5ID09PSBcIm5vbmVcIiA/IFwiXCIgOiBkaXNwbGF5O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRzdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoIG9wdHMub3ZlcmZsb3cgKSB7XG5cdFx0c3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuXHRcdGFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHtcblx0XHRcdHN0eWxlLm92ZXJmbG93ID0gb3B0cy5vdmVyZmxvd1sgMCBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dZID0gb3B0cy5vdmVyZmxvd1sgMiBdO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEltcGxlbWVudCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRwcm9wVHdlZW4gPSBmYWxzZTtcblx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXG5cdFx0Ly8gR2VuZXJhbCBzaG93L2hpZGUgc2V0dXAgZm9yIHRoaXMgZWxlbWVudCBhbmltYXRpb25cblx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRpZiAoIGRhdGFTaG93ICkge1xuXHRcdFx0XHRpZiAoIFwiaGlkZGVuXCIgaW4gZGF0YVNob3cgKSB7XG5cdFx0XHRcdFx0aGlkZGVuID0gZGF0YVNob3cuaGlkZGVuO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkYXRhU2hvdyA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgXCJmeHNob3dcIiwgeyBkaXNwbGF5OiByZXN0b3JlRGlzcGxheSB9ICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0b3JlIGhpZGRlbi92aXNpYmxlIGZvciB0b2dnbGUgc28gYC5zdG9wKCkudG9nZ2xlKClgIFwicmV2ZXJzZXNcIlxuXHRcdFx0aWYgKCB0b2dnbGUgKSB7XG5cdFx0XHRcdGRhdGFTaG93LmhpZGRlbiA9ICFoaWRkZW47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNob3cgZWxlbWVudHMgYmVmb3JlIGFuaW1hdGluZyB0aGVtXG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0c2hvd0hpZGUoIFsgZWxlbSBdLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqL1xuXG5cdFx0XHRhbmltLmRvbmUoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdFx0Ly8gVGhlIGZpbmFsIHN0ZXAgb2YgYSBcImhpZGVcIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50XG5cdFx0XHRcdGlmICggIWhpZGRlbiApIHtcblx0XHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiZnhzaG93XCIgKTtcblx0XHRcdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvLyBQZXItcHJvcGVydHkgc2V0dXBcblx0XHRwcm9wVHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblx0XHRpZiAoICEoIHByb3AgaW4gZGF0YVNob3cgKSApIHtcblx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7XG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0cHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdFx0cHJvcFR3ZWVuLnN0YXJ0ID0gMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7XG5cdFx0ZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdO1xuXHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF07XG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0ZWFzaW5nID0gdmFsdWVbIDEgXTtcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XG5cdFx0XHRwcm9wc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRkZWxldGUgcHJvcHNbIGluZGV4IF07XG5cdFx0fVxuXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTtcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgbmFtZSBdO1xuXG5cdFx0XHQvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuXG5cdFx0XHQvLyBSZXVzaW5nICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFwibmFtZVwiXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkge1xuXHRcdFx0XHRcdHByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07XG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzcGVjaWFsRWFzaW5nWyBuYW1lIF0gPSBlYXNpbmc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcblx0dmFyIHJlc3VsdCxcblx0XHRzdG9wcGVkLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBBbmltYXRpb24ucHJlZmlsdGVycy5sZW5ndGgsXG5cdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBEb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3Jcblx0XHRcdGRlbGV0ZSB0aWNrLmVsZW07XG5cdFx0fSApLFxuXHRcdHRpY2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGN1cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdFx0cmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLFxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHlcblx0XHRcdFx0Ly8gQXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIGAxIC0gKCAwLjUgfHwgMCApYCAodHJhYy0xMjQ5Nylcblx0XHRcdFx0dGVtcCA9IHJlbWFpbmluZyAvIGFuaW1hdGlvbi5kdXJhdGlvbiB8fCAwLFxuXHRcdFx0XHRwZXJjZW50ID0gMSAtIHRlbXAsXG5cdFx0XHRcdGluZGV4ID0gMCxcblx0XHRcdFx0bGVuZ3RoID0gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGg7XG5cblx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSApO1xuXG5cdFx0XHQvLyBJZiB0aGVyZSdzIG1vcmUgdG8gZG8sIHlpZWxkXG5cdFx0XHRpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHtcblx0XHRcdFx0cmV0dXJuIHJlbWFpbmluZztcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgdGhpcyB3YXMgYW4gZW1wdHkgYW5pbWF0aW9uLCBzeW50aGVzaXplIGEgZmluYWwgcHJvZ3Jlc3Mgbm90aWZpY2F0aW9uXG5cdFx0XHRpZiAoICFsZW5ndGggKSB7XG5cdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCAxLCAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVzb2x2ZSB0aGUgYW5pbWF0aW9uIGFuZCByZXBvcnQgaXRzIGNvbmNsdXNpb25cblx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRhbmltYXRpb24gPSBkZWZlcnJlZC5wcm9taXNlKCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0cHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksXG5cdFx0XHRvcHRzOiBqUXVlcnkuZXh0ZW5kKCB0cnVlLCB7XG5cdFx0XHRcdHNwZWNpYWxFYXNpbmc6IHt9LFxuXHRcdFx0XHRlYXNpbmc6IGpRdWVyeS5lYXNpbmcuX2RlZmF1bHRcblx0XHRcdH0sIG9wdGlvbnMgKSxcblx0XHRcdG9yaWdpbmFsUHJvcGVydGllczogcHJvcGVydGllcyxcblx0XHRcdG9yaWdpbmFsT3B0aW9uczogb3B0aW9ucyxcblx0XHRcdHN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uLFxuXHRcdFx0dHdlZW5zOiBbXSxcblx0XHRcdGNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkge1xuXHRcdFx0XHR2YXIgdHdlZW4gPSBqUXVlcnkuVHdlZW4oIGVsZW0sIGFuaW1hdGlvbi5vcHRzLCBwcm9wLCBlbmQsXG5cdFx0XHRcdFx0YW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZ1sgcHJvcCBdIHx8IGFuaW1hdGlvbi5vcHRzLmVhc2luZyApO1xuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7XG5cdFx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHRcdH0sXG5cdFx0XHRzdG9wOiBmdW5jdGlvbiggZ290b0VuZCApIHtcblx0XHRcdFx0dmFyIGluZGV4ID0gMCxcblxuXHRcdFx0XHRcdC8vIElmIHdlIGFyZSBnb2luZyB0byB0aGUgZW5kLCB3ZSB3YW50IHRvIHJ1biBhbGwgdGhlIHR3ZWVuc1xuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3ZSBza2lwIHRoaXMgcGFydFxuXHRcdFx0XHRcdGxlbmd0aCA9IGdvdG9FbmQgPyBhbmltYXRpb24udHdlZW5zLmxlbmd0aCA6IDA7XG5cdFx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0XHRzdG9wcGVkID0gdHJ1ZTtcblx0XHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0XHRhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVzb2x2ZSB3aGVuIHdlIHBsYXllZCB0aGUgbGFzdCBmcmFtZTsgb3RoZXJ3aXNlLCByZWplY3Rcblx0XHRcdFx0aWYgKCBnb3RvRW5kICkge1xuXHRcdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCAxLCAwIF0gKTtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHR9ICksXG5cdFx0cHJvcHMgPSBhbmltYXRpb24ucHJvcHM7XG5cblx0cHJvcEZpbHRlciggcHJvcHMsIGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmcgKTtcblxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdHJlc3VsdCA9IEFuaW1hdGlvbi5wcmVmaWx0ZXJzWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1hdGlvbi5vcHRzICk7XG5cdFx0aWYgKCByZXN1bHQgKSB7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggYW5pbWF0aW9uLmVsZW0sIGFuaW1hdGlvbi5vcHRzLnF1ZXVlICkuc3RvcCA9XG5cdFx0XHRcdFx0cmVzdWx0LnN0b3AuYmluZCggcmVzdWx0ICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0fVxuXG5cdGpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7XG5cblx0aWYgKCBpc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkge1xuXHRcdGFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApO1xuXHR9XG5cblx0Ly8gQXR0YWNoIGNhbGxiYWNrcyBmcm9tIG9wdGlvbnNcblx0YW5pbWF0aW9uXG5cdFx0LnByb2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApXG5cdFx0LmRvbmUoIGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlIClcblx0XHQuZmFpbCggYW5pbWF0aW9uLm9wdHMuZmFpbCApXG5cdFx0LmFsd2F5cyggYW5pbWF0aW9uLm9wdHMuYWx3YXlzICk7XG5cblx0alF1ZXJ5LmZ4LnRpbWVyKFxuXHRcdGpRdWVyeS5leHRlbmQoIHRpY2ssIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRhbmltOiBhbmltYXRpb24sXG5cdFx0XHRxdWV1ZTogYW5pbWF0aW9uLm9wdHMucXVldWVcblx0XHR9IClcblx0KTtcblxuXHRyZXR1cm4gYW5pbWF0aW9uO1xufVxuXG5qUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7XG5cblx0dHdlZW5lcnM6IHtcblx0XHRcIipcIjogWyBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApO1xuXHRcdFx0YWRqdXN0Q1NTKCB0d2Vlbi5lbGVtLCBwcm9wLCByY3NzTnVtLmV4ZWMoIHZhbHVlICksIHR3ZWVuICk7XG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fSBdXG5cdH0sXG5cblx0dHdlZW5lcjogZnVuY3Rpb24oIHByb3BzLCBjYWxsYmFjayApIHtcblx0XHRpZiAoIGlzRnVuY3Rpb24oIHByb3BzICkgKSB7XG5cdFx0XHRjYWxsYmFjayA9IHByb3BzO1xuXHRcdFx0cHJvcHMgPSBbIFwiKlwiIF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BzID0gcHJvcHMubWF0Y2goIHJub3RodG1sd2hpdGUgKTtcblx0XHR9XG5cblx0XHR2YXIgcHJvcCxcblx0XHRcdGluZGV4ID0gMCxcblx0XHRcdGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuXHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRwcm9wID0gcHJvcHNbIGluZGV4IF07XG5cdFx0XHRBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSA9IEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0udW5zaGlmdCggY2FsbGJhY2sgKTtcblx0XHR9XG5cdH0sXG5cblx0cHJlZmlsdGVyczogWyBkZWZhdWx0UHJlZmlsdGVyIF0sXG5cblx0cHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7XG5cdFx0aWYgKCBwcmVwZW5kICkge1xuXHRcdFx0QW5pbWF0aW9uLnByZWZpbHRlcnMudW5zaGlmdCggY2FsbGJhY2sgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0QW5pbWF0aW9uLnByZWZpbHRlcnMucHVzaCggY2FsbGJhY2sgKTtcblx0XHR9XG5cdH1cbn0gKTtcblxualF1ZXJ5LnNwZWVkID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGZuICkge1xuXHR2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSBcIm9iamVjdFwiID8galF1ZXJ5LmV4dGVuZCgge30sIHNwZWVkICkgOiB7XG5cdFx0Y29tcGxldGU6IGZuIHx8ICFmbiAmJiBlYXNpbmcgfHxcblx0XHRcdGlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsXG5cdFx0ZHVyYXRpb246IHNwZWVkLFxuXHRcdGVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nXG5cdH07XG5cblx0Ly8gR28gdG8gdGhlIGVuZCBzdGF0ZSBpZiBmeCBhcmUgb2ZmXG5cdGlmICggalF1ZXJ5LmZ4Lm9mZiApIHtcblx0XHRvcHQuZHVyYXRpb24gPSAwO1xuXG5cdH0gZWxzZSB7XG5cdFx0aWYgKCB0eXBlb2Ygb3B0LmR1cmF0aW9uICE9PSBcIm51bWJlclwiICkge1xuXHRcdFx0aWYgKCBvcHQuZHVyYXRpb24gaW4galF1ZXJ5LmZ4LnNwZWVkcyApIHtcblx0XHRcdFx0b3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5zcGVlZHMuX2RlZmF1bHQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gTm9ybWFsaXplIG9wdC5xdWV1ZSAtIHRydWUvdW5kZWZpbmVkL251bGwgLT4gXCJmeFwiXG5cdGlmICggb3B0LnF1ZXVlID09IG51bGwgfHwgb3B0LnF1ZXVlID09PSB0cnVlICkge1xuXHRcdG9wdC5xdWV1ZSA9IFwiZnhcIjtcblx0fVxuXG5cdC8vIFF1ZXVlaW5nXG5cdG9wdC5vbGQgPSBvcHQuY29tcGxldGU7XG5cblx0b3B0LmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBvcHQub2xkICkgKSB7XG5cdFx0XHRvcHQub2xkLmNhbGwoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdC5xdWV1ZSApIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCBvcHQucXVldWUgKTtcblx0XHR9XG5cdH07XG5cblx0cmV0dXJuIG9wdDtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXG5cdFx0Ly8gU2hvdyBhbnkgaGlkZGVuIGVsZW1lbnRzIGFmdGVyIHNldHRpbmcgb3BhY2l0eSB0byAwXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBpc0hpZGRlbldpdGhpblRyZWUgKS5jc3MoIFwib3BhY2l0eVwiLCAwICkuc2hvdygpXG5cblx0XHRcdC8vIEFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZFxuXHRcdFx0LmVuZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fSxcblx0YW5pbWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHZhciBlbXB0eSA9IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBwcm9wICksXG5cdFx0XHRvcHRhbGwgPSBqUXVlcnkuc3BlZWQoIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICksXG5cdFx0XHRkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0XG5cdFx0XHRcdHZhciBhbmltID0gQW5pbWF0aW9uKCB0aGlzLCBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApLCBvcHRhbGwgKTtcblxuXHRcdFx0XHQvLyBFbXB0eSBhbmltYXRpb25zLCBvciBmaW5pc2hpbmcgcmVzb2x2ZXMgaW1tZWRpYXRlbHlcblx0XHRcdFx0aWYgKCBlbXB0eSB8fCBkYXRhUHJpdi5nZXQoIHRoaXMsIFwiZmluaXNoXCIgKSApIHtcblx0XHRcdFx0XHRhbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGRvQW5pbWF0aW9uLmZpbmlzaCA9IGRvQW5pbWF0aW9uO1xuXG5cdFx0cmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0dGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDpcblx0XHRcdHRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24gKTtcblx0fSxcblx0c3RvcDogZnVuY3Rpb24oIHR5cGUsIGNsZWFyUXVldWUsIGdvdG9FbmQgKSB7XG5cdFx0dmFyIHN0b3BRdWV1ZSA9IGZ1bmN0aW9uKCBob29rcyApIHtcblx0XHRcdHZhciBzdG9wID0gaG9va3Muc3RvcDtcblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0c3RvcCggZ290b0VuZCApO1xuXHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0Z290b0VuZCA9IGNsZWFyUXVldWU7XG5cdFx0XHRjbGVhclF1ZXVlID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xlYXJRdWV1ZSApIHtcblx0XHRcdHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRlcXVldWUgPSB0cnVlLFxuXHRcdFx0XHRpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgXCJxdWV1ZUhvb2tzXCIsXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBpbmRleCApIHtcblx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCApIHtcblx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggaW5kZXggaW4gZGF0YSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHtcblx0XHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmXG5cdFx0XHRcdFx0KCB0eXBlID09IG51bGwgfHwgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkgKSB7XG5cblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7XG5cdFx0XHRcdFx0ZGVxdWV1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZC5cblx0XHRcdC8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2hcblx0XHRcdC8vIHdpbGwgZGVxdWV1ZSBidXQgb25seSBpZiB0aGV5IHdlcmUgZ290b0VuZC5cblx0XHRcdGlmICggZGVxdWV1ZSB8fCAhZ290b0VuZCApIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cdGZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0aWYgKCB0eXBlICE9PSBmYWxzZSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaW5kZXgsXG5cdFx0XHRcdGRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKSxcblx0XHRcdFx0cXVldWUgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZVwiIF0sXG5cdFx0XHRcdGhvb2tzID0gZGF0YVsgdHlwZSArIFwicXVldWVIb29rc1wiIF0sXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDtcblxuXHRcdFx0Ly8gRW5hYmxlIGZpbmlzaGluZyBmbGFnIG9uIHByaXZhdGUgZGF0YVxuXHRcdFx0ZGF0YS5maW5pc2ggPSB0cnVlO1xuXG5cdFx0XHQvLyBFbXB0eSB0aGUgcXVldWUgZmlyc3Rcblx0XHRcdGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTtcblxuXHRcdFx0aWYgKCBob29rcyAmJiBob29rcy5zdG9wICkge1xuXHRcdFx0XHRob29rcy5zdG9wLmNhbGwoIHRoaXMsIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFjdGl2ZSBhbmltYXRpb25zLCBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiYgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkge1xuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHtcblx0XHRcdFx0XHRxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFR1cm4gb2ZmIGZpbmlzaGluZyBmbGFnXG5cdFx0XHRkZWxldGUgZGF0YS5maW5pc2g7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwidG9nZ2xlXCIsIFwic2hvd1wiLCBcImhpZGVcIiBdLCBmdW5jdGlvbiggX2ksIG5hbWUgKSB7XG5cdHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdO1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09IFwiYm9vbGVhblwiID9cblx0XHRcdGNzc0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6XG5cdFx0XHR0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnNcbmpRdWVyeS5lYWNoKCB7XG5cdHNsaWRlRG93bjogZ2VuRngoIFwic2hvd1wiICksXG5cdHNsaWRlVXA6IGdlbkZ4KCBcImhpZGVcIiApLFxuXHRzbGlkZVRvZ2dsZTogZ2VuRngoIFwidG9nZ2xlXCIgKSxcblx0ZmFkZUluOiB7IG9wYWNpdHk6IFwic2hvd1wiIH0sXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcblx0ZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiBcInRvZ2dsZVwiIH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS50aW1lcnMgPSBbXTtcbmpRdWVyeS5meC50aWNrID0gZnVuY3Rpb24oKSB7XG5cdHZhciB0aW1lcixcblx0XHRpID0gMCxcblx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzO1xuXG5cdGZ4Tm93ID0gRGF0ZS5ub3coKTtcblxuXHRmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7XG5cdFx0dGltZXIgPSB0aW1lcnNbIGkgXTtcblxuXHRcdC8vIFJ1biB0aGUgdGltZXIgYW5kIHNhZmVseSByZW1vdmUgaXQgd2hlbiBkb25lIChhbGxvd2luZyBmb3IgZXh0ZXJuYWwgcmVtb3ZhbClcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcblx0XHRcdHRpbWVycy5zcGxpY2UoIGktLSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIXRpbWVycy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcblx0fVxuXHRmeE5vdyA9IHVuZGVmaW5lZDtcbn07XG5cbmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHtcblx0alF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApO1xuXHRqUXVlcnkuZnguc3RhcnQoKTtcbn07XG5cbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xualF1ZXJ5LmZ4LnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpblByb2dyZXNzID0gdHJ1ZTtcblx0c2NoZWR1bGUoKTtcbn07XG5cbmpRdWVyeS5meC5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdGluUHJvZ3Jlc3MgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cblx0Ly8gRGVmYXVsdCBzcGVlZFxuXHRfZGVmYXVsdDogNDAwXG59O1xuXG5cbi8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi5cbmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkge1xuXHR0aW1lID0galF1ZXJ5LmZ4ID8galF1ZXJ5LmZ4LnNwZWVkc1sgdGltZSBdIHx8IHRpbWUgOiB0aW1lO1xuXHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHtcblx0XHR2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7XG5cdFx0aG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0d2luZG93LmNsZWFyVGltZW91dCggdGltZW91dCApO1xuXHRcdH07XG5cdH0gKTtcbn07XG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICksXG5cdFx0c2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJzZWxlY3RcIiApLFxuXHRcdG9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvcHRpb25cIiApICk7XG5cblx0aW5wdXQudHlwZSA9IFwiY2hlY2tib3hcIjtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4zIG9ubHlcblx0Ly8gRGVmYXVsdCB2YWx1ZSBmb3IgYSBjaGVja2JveCBzaG91bGQgYmUgXCJvblwiXG5cdHN1cHBvcnQuY2hlY2tPbiA9IGlucHV0LnZhbHVlICE9PSBcIlwiO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHQvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdFxuXHRzdXBwb3J0Lm9wdFNlbGVjdGVkID0gb3B0LnNlbGVjdGVkO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHQvLyBBbiBpbnB1dCBsb3NlcyBpdHMgdmFsdWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRpb1xuXHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXHRpbnB1dC52YWx1ZSA9IFwidFwiO1xuXHRpbnB1dC50eXBlID0gXCJyYWRpb1wiO1xuXHRzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gXCJ0XCI7XG59ICkoKTtcblxuXG52YXIgYm9vbEhvb2ssXG5cdGF0dHJIYW5kbGUgPSBqUXVlcnkuZXhwci5hdHRySGFuZGxlO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHR2YXIgcmV0LCBob29rcyxcblx0XHRcdG5UeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdC8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcblx0XHRpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgPT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXR0cmlidXRlIGhvb2tzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb3dlcmNhc2UgdmVyc2lvblxuXHRcdC8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWRcblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblx0XHRcdGhvb2tzID0galF1ZXJ5LmF0dHJIb29rc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gfHxcblx0XHRcdFx0KCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZpbmVkICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gbnVsbCApIHtcblx0XHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyBcIlwiICk7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXG5cdFx0cmV0ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0Ly8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWRcblx0XHRyZXR1cm4gcmV0ID09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7XG5cdH0sXG5cblx0YXR0ckhvb2tzOiB7XG5cdFx0dHlwZToge1xuXHRcdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRcdGlmICggIXN1cHBvcnQucmFkaW9WYWx1ZSAmJiB2YWx1ZSA9PT0gXCJyYWRpb1wiICYmXG5cdFx0XHRcdFx0bm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApICkge1xuXHRcdFx0XHRcdHZhciB2YWwgPSBlbGVtLnZhbHVlO1xuXHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgdmFsdWUgKTtcblx0XHRcdFx0XHRpZiAoIHZhbCApIHtcblx0XHRcdFx0XHRcdGVsZW0udmFsdWUgPSB2YWw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0dmFyIG5hbWUsXG5cdFx0XHRpID0gMCxcblxuXHRcdFx0Ly8gQXR0cmlidXRlIG5hbWVzIGNhbiBjb250YWluIG5vbi1IVE1MIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xuXHRcdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yXG5cdFx0XHRhdHRyTmFtZXMgPSB2YWx1ZSAmJiB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApO1xuXG5cdFx0aWYgKCBhdHRyTmFtZXMgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdHdoaWxlICggKCBuYW1lID0gYXR0ck5hbWVzWyBpKysgXSApICkge1xuXHRcdFx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG4vLyBIb29rcyBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzXG5ib29sSG9vayA9IHtcblx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7XG5cdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBib29sZWFuIGF0dHJpYnV0ZXMgd2hlbiBzZXQgdG8gZmFsc2Vcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lICk7XG5cdFx0fVxuXHRcdHJldHVybiBuYW1lO1xuXHR9XG59O1xuXG5qUXVlcnkuZWFjaCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goIC9cXHcrL2cgKSwgZnVuY3Rpb24oIF9pLCBuYW1lICkge1xuXHR2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7XG5cblx0YXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciByZXQsIGhhbmRsZSxcblx0XHRcdGxvd2VyY2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRpZiAoICFpc1hNTCApIHtcblxuXHRcdFx0Ly8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGdldHRlclxuXHRcdFx0aGFuZGxlID0gYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdO1xuXHRcdFx0YXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0O1xuXHRcdFx0cmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9IG51bGwgP1xuXHRcdFx0XHRsb3dlcmNhc2VOYW1lIDpcblx0XHRcdFx0bnVsbDtcblx0XHRcdGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn0gKTtcblxuXG5cblxudmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyY2xpY2thYmxlID0gL14oPzphfGFyZWEpJC9pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkZWxldGUgdGhpc1sgalF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lIF07XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3Ncblx0XHRcdG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldHVybiBlbGVtWyBuYW1lIF07XG5cdH0sXG5cblx0cHJvcEhvb2tzOiB7XG5cdFx0dGFiSW5kZXg6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHRcdFx0XHQvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGVcblx0XHRcdFx0Ly8gY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0XG5cdFx0XHRcdC8vIFVzZSBwcm9wZXIgYXR0cmlidXRlIHJldHJpZXZhbCAodHJhYy0xMjA3Milcblx0XHRcdFx0dmFyIHRhYmluZGV4ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ0YWJpbmRleFwiICk7XG5cblx0XHRcdFx0aWYgKCB0YWJpbmRleCApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGFyc2VJbnQoIHRhYmluZGV4LCAxMCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8XG5cdFx0XHRcdFx0cmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiZcblx0XHRcdFx0XHRlbGVtLmhyZWZcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHByb3BGaXg6IHtcblx0XHRcImZvclwiOiBcImh0bWxGb3JcIixcblx0XHRcImNsYXNzXCI6IFwiY2xhc3NOYW1lXCJcblx0fVxufSApO1xuXG4vLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcbi8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eVxuLy8gZm9yY2VzIHRoZSBicm93c2VyIHRvIHJlc3BlY3Qgc2V0dGluZyBzZWxlY3RlZFxuLy8gb24gdGhlIG9wdGlvblxuLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWRcbi8vIHdoZW4gaW4gYW4gb3B0Z3JvdXBcbi8vIGVzbGludCBydWxlIFwibm8tdW51c2VkLWV4cHJlc3Npb25zXCIgaXMgZGlzYWJsZWQgZm9yIHRoaXMgY29kZVxuLy8gc2luY2UgaXQgY29uc2lkZXJzIHN1Y2ggYWNjZXNzaW9ucyBub29wXG5pZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkge1xuXHRqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiBcIm9mZlwiICovXG5cblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRpZiAoIHBhcmVudCApIHtcblx0XHRcdFx0cGFyZW50LnNlbGVjdGVkSW5kZXg7XG5cblx0XHRcdFx0aWYgKCBwYXJlbnQucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5qUXVlcnkuZWFjaCggW1xuXHRcInRhYkluZGV4XCIsXG5cdFwicmVhZE9ubHlcIixcblx0XCJtYXhMZW5ndGhcIixcblx0XCJjZWxsU3BhY2luZ1wiLFxuXHRcImNlbGxQYWRkaW5nXCIsXG5cdFwicm93U3BhblwiLFxuXHRcImNvbFNwYW5cIixcblx0XCJ1c2VNYXBcIixcblx0XCJmcmFtZUJvcmRlclwiLFxuXHRcImNvbnRlbnRFZGl0YWJsZVwiXG5dLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnByb3BGaXhbIHRoaXMudG9Mb3dlckNhc2UoKSBdID0gdGhpcztcbn0gKTtcblxuXG5cblxuXHQvLyBTdHJpcCBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZSBhY2NvcmRpbmcgdG8gSFRNTCBzcGVjXG5cdC8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2UtYXNjaWktd2hpdGVzcGFjZVxuXHRmdW5jdGlvbiBzdHJpcEFuZENvbGxhcHNlKCB2YWx1ZSApIHtcblx0XHR2YXIgdG9rZW5zID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblx0XHRyZXR1cm4gdG9rZW5zLmpvaW4oIFwiIFwiICk7XG5cdH1cblxuXG5mdW5jdGlvbiBnZXRDbGFzcyggZWxlbSApIHtcblx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlICYmIGVsZW0uZ2V0QXR0cmlidXRlKCBcImNsYXNzXCIgKSB8fCBcIlwiO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VzVG9BcnJheSggdmFsdWUgKSB7XG5cdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cdH1cblx0cmV0dXJuIFtdO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZXMsIGN1ciwgY3VyVmFsdWUsIGNsYXNzTmFtZSwgaSwgZmluYWxWYWx1ZTtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0Y2xhc3NOYW1lcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCBjbGFzc05hbWVzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCB0aGlzICk7XG5cdFx0XHRcdGN1ciA9IHRoaXMubm9kZVR5cGUgPT09IDEgJiYgKCBcIiBcIiArIHN0cmlwQW5kQ29sbGFwc2UoIGN1clZhbHVlICkgKyBcIiBcIiApO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkgXTtcblx0XHRcdFx0XHRcdGlmICggY3VyLmluZGV4T2YoIFwiIFwiICsgY2xhc3NOYW1lICsgXCIgXCIgKSA8IDAgKSB7XG5cdFx0XHRcdFx0XHRcdGN1ciArPSBjbGFzc05hbWUgKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZXMsIGN1ciwgY3VyVmFsdWUsIGNsYXNzTmFtZSwgaSwgZmluYWxWYWx1ZTtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB0aGlzLmF0dHIoIFwiY2xhc3NcIiwgXCJcIiApO1xuXHRcdH1cblxuXHRcdGNsYXNzTmFtZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTtcblxuXHRcdGlmICggY2xhc3NOYW1lcy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggdGhpcyApO1xuXG5cdFx0XHRcdC8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpXG5cdFx0XHRcdGN1ciA9IHRoaXMubm9kZVR5cGUgPT09IDEgJiYgKCBcIiBcIiArIHN0cmlwQW5kQ29sbGFwc2UoIGN1clZhbHVlICkgKyBcIiBcIiApO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkgXTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlICphbGwqIGluc3RhbmNlc1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGFzc05hbWUgKyBcIiBcIiApID4gLTEgKSB7XG5cdFx0XHRcdFx0XHRcdGN1ciA9IGN1ci5yZXBsYWNlKCBcIiBcIiArIGNsYXNzTmFtZSArIFwiIFwiLCBcIiBcIiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuXG5cdFx0XHRcdFx0ZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0dG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZXMsIGNsYXNzTmFtZSwgaSwgc2VsZixcblx0XHRcdHR5cGUgPSB0eXBlb2YgdmFsdWUsXG5cdFx0XHRpc1ZhbGlkVmFsdWUgPSB0eXBlID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkudG9nZ2xlQ2xhc3MoXG5cdFx0XHRcdFx0dmFsdWUuY2FsbCggdGhpcywgaSwgZ2V0Q2xhc3MoIHRoaXMgKSwgc3RhdGVWYWwgKSxcblx0XHRcdFx0XHRzdGF0ZVZhbFxuXHRcdFx0XHQpO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZW9mIHN0YXRlVmFsID09PSBcImJvb2xlYW5cIiAmJiBpc1ZhbGlkVmFsdWUgKSB7XG5cdFx0XHRyZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTtcblx0XHR9XG5cblx0XHRjbGFzc05hbWVzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNWYWxpZFZhbHVlICkge1xuXG5cdFx0XHRcdC8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzXG5cdFx0XHRcdHNlbGYgPSBqUXVlcnkoIHRoaXMgKTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSBdO1xuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0XG5cdFx0XHRcdFx0aWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHtcblx0XHRcdFx0XHRcdHNlbGYucmVtb3ZlQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZWxmLmFkZENsYXNzKCBjbGFzc05hbWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWVcblx0XHRcdH0gZWxzZSBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZSA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0XHRcdGNsYXNzTmFtZSA9IGdldENsYXNzKCB0aGlzICk7XG5cdFx0XHRcdGlmICggY2xhc3NOYW1lICkge1xuXG5cdFx0XHRcdFx0Ly8gU3RvcmUgY2xhc3NOYW1lIGlmIHNldFxuXHRcdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIsIGNsYXNzTmFtZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCxcblx0XHRcdFx0Ly8gdGhlbiByZW1vdmUgdGhlIHdob2xlIGNsYXNzbmFtZSAoaWYgdGhlcmUgd2FzIG9uZSwgdGhlIGFib3ZlIHNhdmVkIGl0KS5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGJyaW5nIGJhY2sgd2hhdGV2ZXIgd2FzIHByZXZpb3VzbHkgc2F2ZWQgKGlmIGFueXRoaW5nKSxcblx0XHRcdFx0Ly8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLlxuXHRcdFx0XHRpZiAoIHRoaXMuc2V0QXR0cmlidXRlICkge1xuXHRcdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCBcImNsYXNzXCIsXG5cdFx0XHRcdFx0XHRjbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID9cblx0XHRcdFx0XHRcdFx0XCJcIiA6XG5cdFx0XHRcdFx0XHRcdGRhdGFQcml2LmdldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIgKSB8fCBcIlwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRoYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBjbGFzc05hbWUsIGVsZW0sXG5cdFx0XHRpID0gMDtcblxuXHRcdGNsYXNzTmFtZSA9IFwiIFwiICsgc2VsZWN0b3IgKyBcIiBcIjtcblx0XHR3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7XG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0KCBcIiBcIiArIHN0cmlwQW5kQ29sbGFwc2UoIGdldENsYXNzKCBlbGVtICkgKSArIFwiIFwiICkuaW5kZXhPZiggY2xhc3NOYW1lICkgPiAtMSApIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBycmV0dXJuID0gL1xcci9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHZhbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0XHRpZiAoIGhvb2tzICYmXG5cdFx0XHRcdFx0XCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBcInZhbHVlXCIgKSApICE9PSB1bmRlZmluZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldCA9IGVsZW0udmFsdWU7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlc1xuXHRcdFx0XHRpZiAoIHR5cGVvZiByZXQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldC5yZXBsYWNlKCBycmV0dXJuLCBcIlwiICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcblx0XHRcdFx0cmV0dXJuIHJldCA9PSBudWxsID8gXCJcIiA6IHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhbHVlSXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdHZhciB2YWw7XG5cblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbHVlSXNGdW5jdGlvbiApIHtcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWwgKz0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHZhbCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIjtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgXCJ2YWx1ZVwiICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbDtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHR2YWxIb29rczoge1xuXHRcdG9wdGlvbjoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHR2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ2YWx1ZVwiICk7XG5cdFx0XHRcdHJldHVybiB2YWwgIT0gbnVsbCA/XG5cdFx0XHRcdFx0dmFsIDpcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSBvbmx5XG5cdFx0XHRcdFx0Ly8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKHRyYWMtMTQ2ODYsIHRyYWMtMTQ4NTgpXG5cdFx0XHRcdFx0Ly8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2Vcblx0XHRcdFx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2Utd2hpdGVzcGFjZVxuXHRcdFx0XHRcdHN0cmlwQW5kQ29sbGFwc2UoIGpRdWVyeS50ZXh0KCBlbGVtICkgKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHNlbGVjdDoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIHZhbHVlLCBvcHRpb24sIGksXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcblx0XHRcdFx0XHRpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCxcblx0XHRcdFx0XHRvbmUgPSBlbGVtLnR5cGUgPT09IFwic2VsZWN0LW9uZVwiLFxuXHRcdFx0XHRcdHZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSxcblx0XHRcdFx0XHRtYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDtcblxuXHRcdFx0XHRpZiAoIGluZGV4IDwgMCApIHtcblx0XHRcdFx0XHRpID0gbWF4O1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aSA9IG9uZSA/IGluZGV4IDogMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnNcblx0XHRcdFx0Zm9yICggOyBpIDwgbWF4OyBpKysgKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHQvLyBJRTgtOSBkb2Vzbid0IHVwZGF0ZSBzZWxlY3RlZCBhZnRlciBmb3JtIHJlc2V0ICh0cmFjLTI1NTEpXG5cdFx0XHRcdFx0aWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmXG5cblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQhb3B0aW9uLmRpc2FibGVkICYmXG5cdFx0XHRcdFx0XHRcdCggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8XG5cdFx0XHRcdFx0XHRcdFx0IW5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxuXHRcdFx0XHRcdFx0dmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xuXHRcdFx0XHRcdFx0aWYgKCBvbmUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXlcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIG9wdGlvblNldCwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0dmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKSxcblx0XHRcdFx0XHRpID0gb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tY29uZC1hc3NpZ24gKi9cblxuXHRcdFx0XHRcdGlmICggb3B0aW9uLnNlbGVjdGVkID1cblx0XHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBqUXVlcnkudmFsSG9va3Mub3B0aW9uLmdldCggb3B0aW9uICksIHZhbHVlcyApID4gLTFcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9wdGlvblNldCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRm9yY2UgYnJvd3NlcnMgdG8gYmVoYXZlIGNvbnNpc3RlbnRseSB3aGVuIG5vbi1tYXRjaGluZyB2YWx1ZSBpcyBzZXRcblx0XHRcdFx0aWYgKCAhb3B0aW9uU2V0ICkge1xuXHRcdFx0XHRcdGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyXG5qUXVlcnkuZWFjaCggWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRpZiAoICFzdXBwb3J0LmNoZWNrT24gKSB7XG5cdFx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0uZ2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiApID09PSBudWxsID8gXCJvblwiIDogZWxlbS52YWx1ZTtcblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb25cblxuXG5zdXBwb3J0LmZvY3VzaW4gPSBcIm9uZm9jdXNpblwiIGluIHdpbmRvdztcblxuXG52YXIgcmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sXG5cdHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24oIGUgKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0fTtcblxualF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmV2ZW50LCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7XG5cblx0XHR2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCxcblx0XHRcdGV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLFxuXHRcdFx0dHlwZSA9IGhhc093bi5jYWxsKCBldmVudCwgXCJ0eXBlXCIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCxcblx0XHRcdG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwibmFtZXNwYWNlXCIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdCggXCIuXCIgKSA6IFtdO1xuXG5cdFx0Y3VyID0gbGFzdEVsZW1lbnQgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuXHRcdC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XG5cdFx0aWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZS5pbmRleE9mKCBcIi5cIiApID4gLTEgKSB7XG5cblx0XHRcdC8vIE5hbWVzcGFjZWQgdHJpZ2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50IHR5cGUgaW4gaGFuZGxlKClcblx0XHRcdG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCBcIi5cIiApO1xuXHRcdFx0dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTtcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xuXHRcdH1cblx0XHRvbnR5cGUgPSB0eXBlLmluZGV4T2YoIFwiOlwiICkgPCAwICYmIFwib25cIiArIHR5cGU7XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmdcblx0XHRldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdGV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJiBldmVudCApO1xuXG5cdFx0Ly8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKVxuXHRcdGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKTtcblx0XHRldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID9cblx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApIDpcblx0XHRcdG51bGw7XG5cblx0XHQvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWRcblx0XHRldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZWxlbTtcblx0XHR9XG5cblx0XHQvLyBDbG9uZSBhbnkgaW5jb21pbmcgZGF0YSBhbmQgcHJlcGVuZCB0aGUgZXZlbnQsIGNyZWF0aW5nIHRoZSBoYW5kbGVyIGFyZyBsaXN0XG5cdFx0ZGF0YSA9IGRhdGEgPT0gbnVsbCA/XG5cdFx0XHRbIGV2ZW50IF0gOlxuXHRcdFx0alF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7XG5cblx0XHQvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzXG5cdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAodHJhYy05OTUxKVxuXHRcdC8vIEJ1YmJsZSB1cCB0byBkb2N1bWVudCwgdGhlbiB0byB3aW5kb3c7IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRvY3VtZW50IHZhciAodHJhYy05NzI0KVxuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhc3BlY2lhbC5ub0J1YmJsZSAmJiAhaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0YnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVUeXBlIHx8IHR5cGU7XG5cdFx0XHRpZiAoICFyZm9jdXNNb3JwaC50ZXN0KCBidWJibGVUeXBlICsgdHlwZSApICkge1xuXHRcdFx0XHRjdXIgPSBjdXIucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdGZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIGN1ciApO1xuXHRcdFx0XHR0bXAgPSBjdXI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKVxuXHRcdFx0aWYgKCB0bXAgPT09ICggZWxlbS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50ICkgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCB0bXAuZGVmYXVsdFZpZXcgfHwgdG1wLnBhcmVudFdpbmRvdyB8fCB3aW5kb3cgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdGxhc3RFbGVtZW50ID0gY3VyO1xuXHRcdFx0ZXZlbnQudHlwZSA9IGkgPiAxID9cblx0XHRcdFx0YnViYmxlVHlwZSA6XG5cdFx0XHRcdHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTtcblxuXHRcdFx0Ly8galF1ZXJ5IGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9ICggZGF0YVByaXYuZ2V0KCBjdXIsIFwiZXZlbnRzXCIgKSB8fCBPYmplY3QuY3JlYXRlKCBudWxsICkgKVsgZXZlbnQudHlwZSBdICYmXG5cdFx0XHRcdGRhdGFQcml2LmdldCggY3VyLCBcImhhbmRsZVwiICk7XG5cdFx0XHRpZiAoIGhhbmRsZSApIHtcblx0XHRcdFx0aGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTmF0aXZlIGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdO1xuXHRcdFx0aWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkge1xuXHRcdFx0XHRldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRldmVudC50eXBlID0gdHlwZTtcblxuXHRcdC8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3dcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXG5cdFx0XHRpZiAoICggIXNwZWNpYWwuX2RlZmF1bHQgfHxcblx0XHRcdFx0c3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiZcblx0XHRcdFx0YWNjZXB0RGF0YSggZWxlbSApICkge1xuXG5cdFx0XHRcdC8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZXZlbnQuXG5cdFx0XHRcdC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICh0cmFjLTYxNzApXG5cdFx0XHRcdGlmICggb250eXBlICYmIGlzRnVuY3Rpb24oIGVsZW1bIHR5cGUgXSApICYmICFpc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRG9uJ3QgcmUtdHJpZ2dlciBhbiBvbkZPTyBldmVudCB3aGVuIHdlIGNhbGwgaXRzIEZPTygpIG1ldGhvZFxuXHRcdFx0XHRcdHRtcCA9IGVsZW1bIG9udHlwZSBdO1xuXG5cdFx0XHRcdFx0aWYgKCB0bXAgKSB7XG5cdFx0XHRcdFx0XHRlbGVtWyBvbnR5cGUgXSA9IG51bGw7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJldmVudCByZS10cmlnZ2VyaW5nIG9mIHRoZSBzYW1lIGV2ZW50LCBzaW5jZSB3ZSBhbHJlYWR5IGJ1YmJsZWQgaXQgYWJvdmVcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdHlwZTtcblxuXHRcdFx0XHRcdGlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdFx0XHRcdGxhc3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZWxlbVsgdHlwZSBdKCk7XG5cblx0XHRcdFx0XHRpZiAoIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRcdFx0XHRsYXN0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBzdG9wUHJvcGFnYXRpb25DYWxsYmFjayApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gdG1wO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0Ly8gUGlnZ3liYWNrIG9uIGEgZG9ub3IgZXZlbnQgdG8gc2ltdWxhdGUgYSBkaWZmZXJlbnQgb25lXG5cdC8vIFVzZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzXG5cdHNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQgKSB7XG5cdFx0dmFyIGUgPSBqUXVlcnkuZXh0ZW5kKFxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCgpLFxuXHRcdFx0ZXZlbnQsXG5cdFx0XHR7XG5cdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdGlzU2ltdWxhdGVkOiB0cnVlXG5cdFx0XHR9XG5cdFx0KTtcblxuXHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBlLCBudWxsLCBlbGVtICk7XG5cdH1cblxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApO1xuXHRcdH0gKTtcblx0fSxcblx0dHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBlbGVtID0gdGhpc1sgMCBdO1xuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgZWxlbSwgdHJ1ZSApO1xuXHRcdH1cblx0fVxufSApO1xuXG5cbi8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00NFxuLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50c1xuLy8gUmVsYXRlZCB0aWNrZXQgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc3ODdcbi8vXG4vLyBTdXBwb3J0OiBDaHJvbWUgPD00OCAtIDQ5LCBTYWZhcmkgPD05LjAgLSA5LjFcbi8vIGZvY3VzKGluIHwgb3V0KSBldmVudHMgZmlyZSBhZnRlciBmb2N1cyAmIGJsdXIgZXZlbnRzLFxuLy8gd2hpY2ggaXMgc3BlYyB2aW9sYXRpb24gLSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2V2ZW50cy1mb2N1c2V2ZW50LWV2ZW50LW9yZGVyXG4vLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1N1xuaWYgKCAhc3VwcG9ydC5mb2N1c2luICkge1xuXHRqUXVlcnkuZWFjaCggeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXG5cdFx0Ly8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIG9uIHRoZSBkb2N1bWVudCB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXRcblx0XHR2YXIgaGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTtcblx0XHR9O1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0ge1xuXHRcdFx0c2V0dXA6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8vIEhhbmRsZTogcmVndWxhciBub2RlcyAodmlhIGB0aGlzLm93bmVyRG9jdW1lbnRgKSwgd2luZG93XG5cdFx0XHRcdC8vICh2aWEgYHRoaXMuZG9jdW1lbnRgKSAmIGRvY3VtZW50ICh2aWEgYHRoaXNgKS5cblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLmRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLmFkZEV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCAoIGF0dGFjaGVzIHx8IDAgKSArIDEgKTtcblx0XHRcdH0sXG5cdFx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcy5kb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0gZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCApIC0gMTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZG9jLCBmaXggKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsIGF0dGFjaGVzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9ICk7XG59XG52YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247XG5cbnZhciBub25jZSA9IHsgZ3VpZDogRGF0ZS5ub3coKSB9O1xuXG52YXIgcnF1ZXJ5ID0gKCAvXFw/LyApO1xuXG5cblxuLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZ1xualF1ZXJ5LnBhcnNlWE1MID0gZnVuY3Rpb24oIGRhdGEgKSB7XG5cdHZhciB4bWwsIHBhcnNlckVycm9yRWxlbTtcblx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdC8vIElFIHRocm93cyBvbiBwYXJzZUZyb21TdHJpbmcgd2l0aCBpbnZhbGlkIGlucHV0LlxuXHR0cnkge1xuXHRcdHhtbCA9ICggbmV3IHdpbmRvdy5ET01QYXJzZXIoKSApLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgXCJ0ZXh0L3htbFwiICk7XG5cdH0gY2F0Y2ggKCBlICkge31cblxuXHRwYXJzZXJFcnJvckVsZW0gPSB4bWwgJiYgeG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcInBhcnNlcmVycm9yXCIgKVsgMCBdO1xuXHRpZiAoICF4bWwgfHwgcGFyc2VyRXJyb3JFbGVtICkge1xuXHRcdGpRdWVyeS5lcnJvciggXCJJbnZhbGlkIFhNTDogXCIgKyAoXG5cdFx0XHRwYXJzZXJFcnJvckVsZW0gP1xuXHRcdFx0XHRqUXVlcnkubWFwKCBwYXJzZXJFcnJvckVsZW0uY2hpbGROb2RlcywgZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0XHRcdHJldHVybiBlbC50ZXh0Q29udGVudDtcblx0XHRcdFx0fSApLmpvaW4oIFwiXFxuXCIgKSA6XG5cdFx0XHRcdGRhdGFcblx0XHQpICk7XG5cdH1cblx0cmV0dXJuIHhtbDtcbn07XG5cblxudmFyXG5cdHJicmFja2V0ID0gL1xcW1xcXSQvLFxuXHRyQ1JMRiA9IC9cXHI/XFxuL2csXG5cdHJzdWJtaXR0ZXJUeXBlcyA9IC9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxcblx0cnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO1xuXG5mdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQgKSB7XG5cdHZhciBuYW1lO1xuXG5cdGlmICggQXJyYXkuaXNBcnJheSggb2JqICkgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgYXJyYXkgaXRlbS5cblx0XHRqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHtcblx0XHRcdGlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7XG5cblx0XHRcdFx0Ly8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLlxuXHRcdFx0XHRhZGQoIHByZWZpeCwgdiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEl0ZW0gaXMgbm9uLXNjYWxhciAoYXJyYXkgb3Igb2JqZWN0KSwgZW5jb2RlIGl0cyBudW1lcmljIGluZGV4LlxuXHRcdFx0XHRidWlsZFBhcmFtcyhcblx0XHRcdFx0XHRwcmVmaXggKyBcIltcIiArICggdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPSBudWxsID8gaSA6IFwiXCIgKSArIFwiXVwiLFxuXHRcdFx0XHRcdHYsXG5cdFx0XHRcdFx0dHJhZGl0aW9uYWwsXG5cdFx0XHRcdFx0YWRkXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdH0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiB0b1R5cGUoIG9iaiApID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIG9iamVjdCBpdGVtLlxuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCArIFwiW1wiICsgbmFtZSArIFwiXVwiLCBvYmpbIG5hbWUgXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gU2VyaWFsaXplIHNjYWxhciBpdGVtLlxuXHRcdGFkZCggcHJlZml4LCBvYmogKTtcblx0fVxufVxuXG4vLyBTZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZlxuLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nXG5qUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7XG5cdHZhciBwcmVmaXgsXG5cdFx0cyA9IFtdLFxuXHRcdGFkZCA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlT3JGdW5jdGlvbiApIHtcblxuXHRcdFx0Ly8gSWYgdmFsdWUgaXMgYSBmdW5jdGlvbiwgaW52b2tlIGl0IGFuZCB1c2UgaXRzIHJldHVybiB2YWx1ZVxuXHRcdFx0dmFyIHZhbHVlID0gaXNGdW5jdGlvbiggdmFsdWVPckZ1bmN0aW9uICkgP1xuXHRcdFx0XHR2YWx1ZU9yRnVuY3Rpb24oKSA6XG5cdFx0XHRcdHZhbHVlT3JGdW5jdGlvbjtcblxuXHRcdFx0c1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyBcIj1cIiArXG5cdFx0XHRcdGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSApO1xuXHRcdH07XG5cblx0aWYgKCBhID09IG51bGwgKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHQvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLlxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxlbWVudHNcblx0XHRqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApO1xuXHRcdH0gKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgXCJvbGRcIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXJcblx0XHQvLyBkaWQgaXQpLCBvdGhlcndpc2UgZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS5cblx0XHRmb3IgKCBwcmVmaXggaW4gYSApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvblxuXHRyZXR1cm4gcy5qb2luKCBcIiZcIiApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRzZXJpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApO1xuXHR9LFxuXHRzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gQ2FuIGFkZCBwcm9wSG9vayBmb3IgXCJlbGVtZW50c1wiIHRvIGZpbHRlciBvciBhZGQgZm9ybSBlbGVtZW50c1xuXHRcdFx0dmFyIGVsZW1lbnRzID0galF1ZXJ5LnByb3AoIHRoaXMsIFwiZWxlbWVudHNcIiApO1xuXHRcdFx0cmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMgKSA6IHRoaXM7XG5cdFx0fSApLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdFx0Ly8gVXNlIC5pcyggXCI6ZGlzYWJsZWRcIiApIHNvIHRoYXQgZmllbGRzZXRbZGlzYWJsZWRdIHdvcmtzXG5cdFx0XHRyZXR1cm4gdGhpcy5uYW1lICYmICFqUXVlcnkoIHRoaXMgKS5pcyggXCI6ZGlzYWJsZWRcIiApICYmXG5cdFx0XHRcdHJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiZcblx0XHRcdFx0KCB0aGlzLmNoZWNrZWQgfHwgIXJjaGVja2FibGVUeXBlLnRlc3QoIHR5cGUgKSApO1xuXHRcdH0gKS5tYXAoIGZ1bmN0aW9uKCBfaSwgZWxlbSApIHtcblx0XHRcdHZhciB2YWwgPSBqUXVlcnkoIHRoaXMgKS52YWwoKTtcblxuXHRcdFx0aWYgKCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHJldHVybiBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdH0gKS5nZXQoKTtcblx0fVxufSApO1xuXG5cbnZhclxuXHRyMjAgPSAvJTIwL2csXG5cdHJoYXNoID0gLyMuKiQvLFxuXHRyYW50aUNhY2hlID0gLyhbPyZdKV89W14mXSovLFxuXHRyaGVhZGVycyA9IC9eKC4qPyk6WyBcXHRdKihbXlxcclxcbl0qKSQvbWcsXG5cblx0Ly8gdHJhYy03NjUzLCB0cmFjLTgxMjUsIHRyYWMtODE1MjogbG9jYWwgcHJvdG9jb2wgZGV0ZWN0aW9uXG5cdHJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sXG5cdHJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLFxuXHRycHJvdG9jb2wgPSAvXlxcL1xcLy8sXG5cblx0LyogUHJlZmlsdGVyc1xuXHQgKiAxKSBUaGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBhamF4L2pzb25wLmpzIGZvciBhbiBleGFtcGxlKVxuXHQgKiAyKSBUaGVzZSBhcmUgY2FsbGVkOlxuXHQgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0XG5cdCAqICAgIC0gQUZURVIgcGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEgaXMgdHJ1ZSlcblx0ICogMykga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDUpIGV4ZWN1dGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGNvbnRpbnVlIGRvd24gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHRwcmVmaWx0ZXJzID0ge30sXG5cblx0LyogVHJhbnNwb3J0cyBiaW5kaW5nc1xuXHQgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlXG5cdCAqIDIpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcblx0ICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHR0cmFuc3BvcnRzID0ge30sXG5cblx0Ly8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAodHJhYy0xMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cbm9yaWdpbkFuY2hvci5ocmVmID0gbG9jYXRpb24uaHJlZjtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHtcblxuXHRcdFx0Ly8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvblxuXHRcdFx0d2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdGlmICggZGF0YVR5cGVbIDAgXSA9PT0gXCIrXCIgKSB7XG5cdFx0XHRcdFx0ZGF0YVR5cGUgPSBkYXRhVHlwZS5zbGljZSggMSApIHx8IFwiKlwiO1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXG5cdFx0XHRcdG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0aW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkge1xuXHRcdFx0XHRyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyB0cmFjLTk4ODdcbmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkge1xuXHR2YXIga2V5LCBkZWVwLFxuXHRcdGZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTtcblxuXHRmb3IgKCBrZXkgaW4gc3JjICkge1xuXHRcdGlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0KCBmbGF0T3B0aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKCBkZWVwID0ge30gKSApIClbIGtleSBdID0gc3JjWyBrZXkgXTtcblx0XHR9XG5cdH1cblx0aWYgKCBkZWVwICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApO1xuXHR9XG5cblx0cmV0dXJuIHRhcmdldDtcbn1cblxuLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OlxuICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSlcbiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuICovXG5mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkge1xuXG5cdHZhciBjdCwgdHlwZSwgZmluYWxEYXRhVHlwZSwgZmlyc3REYXRhVHlwZSxcblx0XHRjb250ZW50cyA9IHMuY29udGVudHMsXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7XG5cblx0Ly8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3Ncblx0d2hpbGUgKCBkYXRhVHlwZXNbIDAgXSA9PT0gXCIqXCIgKSB7XG5cdFx0ZGF0YVR5cGVzLnNoaWZ0KCk7XG5cdFx0aWYgKCBjdCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0Y3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29udGVudC10eXBlXG5cdGlmICggY3QgKSB7XG5cdFx0Zm9yICggdHlwZSBpbiBjb250ZW50cyApIHtcblx0XHRcdGlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7XG5cdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0eXBlICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZVxuXHRpZiAoIGRhdGFUeXBlc1sgMCBdIGluIHJlc3BvbnNlcyApIHtcblx0XHRmaW5hbERhdGFUeXBlID0gZGF0YVR5cGVzWyAwIF07XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzXG5cdFx0Zm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7XG5cdFx0XHRpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyBcIiBcIiArIGRhdGFUeXBlc1sgMCBdIF0gKSB7XG5cdFx0XHRcdGZpbmFsRGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggIWZpcnN0RGF0YVR5cGUgKSB7XG5cdFx0XHRcdGZpcnN0RGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZVxuXHRcdGZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7XG5cdH1cblxuXHQvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlXG5cdC8vIFdlIGFkZCB0aGUgZGF0YVR5cGUgdG8gdGhlIGxpc3QgaWYgbmVlZGVkXG5cdC8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2Vcblx0aWYgKCBmaW5hbERhdGFUeXBlICkge1xuXHRcdGlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7XG5cdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07XG5cdH1cbn1cblxuLyogQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZVxuICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApIHtcblx0dmFyIGNvbnYyLCBjdXJyZW50LCBjb252LCB0bXAsIHByZXYsXG5cdFx0Y29udmVydGVycyA9IHt9LFxuXG5cdFx0Ly8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvblxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7XG5cblx0Ly8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzXG5cdGlmICggZGF0YVR5cGVzWyAxIF0gKSB7XG5cdFx0Zm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7XG5cdFx0XHRjb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdO1xuXHRcdH1cblx0fVxuXG5cdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHQvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZVxuXHR3aGlsZSAoIGN1cnJlbnQgKSB7XG5cblx0XHRpZiAoIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSApIHtcblx0XHRcdGpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gXSA9IHJlc3BvbnNlO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkXG5cdFx0aWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkge1xuXHRcdFx0cmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7XG5cdFx0fVxuXG5cdFx0cHJldiA9IGN1cnJlbnQ7XG5cdFx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdFx0aWYgKCBjdXJyZW50ICkge1xuXG5cdFx0XHQvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvXG5cdFx0XHRpZiAoIGN1cnJlbnQgPT09IFwiKlwiICkge1xuXG5cdFx0XHRcdGN1cnJlbnQgPSBwcmV2O1xuXG5cdFx0XHQvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRpZmZlcnMgZnJvbSBjdXJyZW50XG5cdFx0XHR9IGVsc2UgaWYgKCBwcmV2ICE9PSBcIipcIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdC8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyXG5cdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyBjdXJyZW50IF0gfHwgY29udmVydGVyc1sgXCIqIFwiICsgY3VycmVudCBdO1xuXG5cdFx0XHRcdC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyXG5cdFx0XHRcdGlmICggIWNvbnYgKSB7XG5cdFx0XHRcdFx0Zm9yICggY29udjIgaW4gY29udmVydGVycyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgY29udjIgb3V0cHV0cyBjdXJyZW50XG5cdFx0XHRcdFx0XHR0bXAgPSBjb252Mi5zcGxpdCggXCIgXCIgKTtcblx0XHRcdFx0XHRcdGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0XG5cdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyB0bXBbIDAgXSBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyc1sgXCIqIFwiICsgdG1wWyAwIF0gXTtcblx0XHRcdFx0XHRcdFx0aWYgKCBjb252ICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVyc1xuXHRcdFx0XHRcdFx0XHRcdGlmICggY29udiA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIGludGVybWVkaWF0ZSBkYXRhVHlwZVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnZlcnRlcnNbIGNvbnYyIF0gIT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50ID0gdG1wWyAwIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdG1wWyAxIF0gKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSlcblx0XHRcdFx0aWYgKCBjb252ICE9PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0Ly8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbVxuXHRcdFx0XHRcdGlmICggY29udiAmJiBzLnRocm93cyApIHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdGU6IFwicGFyc2VyZXJyb3JcIixcblx0XHRcdFx0XHRcdFx0XHRlcnJvcjogY29udiA/IGUgOiBcIk5vIGNvbnZlcnNpb24gZnJvbSBcIiArIHByZXYgKyBcIiB0byBcIiArIGN1cnJlbnRcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4geyBzdGF0ZTogXCJzdWNjZXNzXCIsIGRhdGE6IHJlc3BvbnNlIH07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXNcblx0YWN0aXZlOiAwLFxuXG5cdC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3Rcblx0bGFzdE1vZGlmaWVkOiB7fSxcblx0ZXRhZzoge30sXG5cblx0YWpheFNldHRpbmdzOiB7XG5cdFx0dXJsOiBsb2NhdGlvbi5ocmVmLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0aXNMb2NhbDogcmxvY2FsUHJvdG9jb2wudGVzdCggbG9jYXRpb24ucHJvdG9jb2wgKSxcblx0XHRnbG9iYWw6IHRydWUsXG5cdFx0cHJvY2Vzc0RhdGE6IHRydWUsXG5cdFx0YXN5bmM6IHRydWUsXG5cdFx0Y29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIsXG5cblx0XHQvKlxuXHRcdHRpbWVvdXQ6IDAsXG5cdFx0ZGF0YTogbnVsbCxcblx0XHRkYXRhVHlwZTogbnVsbCxcblx0XHR1c2VybmFtZTogbnVsbCxcblx0XHRwYXNzd29yZDogbnVsbCxcblx0XHRjYWNoZTogbnVsbCxcblx0XHR0aHJvd3M6IGZhbHNlLFxuXHRcdHRyYWRpdGlvbmFsOiBmYWxzZSxcblx0XHRoZWFkZXJzOiB7fSxcblx0XHQqL1xuXG5cdFx0YWNjZXB0czoge1xuXHRcdFx0XCIqXCI6IGFsbFR5cGVzLFxuXHRcdFx0dGV4dDogXCJ0ZXh0L3BsYWluXCIsXG5cdFx0XHRodG1sOiBcInRleHQvaHRtbFwiLFxuXHRcdFx0eG1sOiBcImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWxcIixcblx0XHRcdGpzb246IFwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0XCJcblx0XHR9LFxuXG5cdFx0Y29udGVudHM6IHtcblx0XHRcdHhtbDogL1xcYnhtbFxcYi8sXG5cdFx0XHRodG1sOiAvXFxiaHRtbC8sXG5cdFx0XHRqc29uOiAvXFxianNvblxcYi9cblx0XHR9LFxuXG5cdFx0cmVzcG9uc2VGaWVsZHM6IHtcblx0XHRcdHhtbDogXCJyZXNwb25zZVhNTFwiLFxuXHRcdFx0dGV4dDogXCJyZXNwb25zZVRleHRcIixcblx0XHRcdGpzb246IFwicmVzcG9uc2VKU09OXCJcblx0XHR9LFxuXG5cdFx0Ly8gRGF0YSBjb252ZXJ0ZXJzXG5cdFx0Ly8gS2V5cyBzZXBhcmF0ZSBzb3VyY2UgKG9yIGNhdGNoYWxsIFwiKlwiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuXHRcdGNvbnZlcnRlcnM6IHtcblxuXHRcdFx0Ly8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0XG5cdFx0XHRcIiogdGV4dFwiOiBTdHJpbmcsXG5cblx0XHRcdC8vIFRleHQgdG8gaHRtbCAodHJ1ZSA9IG5vIHRyYW5zZm9ybWF0aW9uKVxuXHRcdFx0XCJ0ZXh0IGh0bWxcIjogdHJ1ZSxcblxuXHRcdFx0Ly8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvblxuXHRcdFx0XCJ0ZXh0IGpzb25cIjogSlNPTi5wYXJzZSxcblxuXHRcdFx0Ly8gUGFyc2UgdGV4dCBhcyB4bWxcblx0XHRcdFwidGV4dCB4bWxcIjogalF1ZXJ5LnBhcnNlWE1MXG5cdFx0fSxcblxuXHRcdC8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6XG5cdFx0Ly8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZlxuXHRcdC8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlXG5cdFx0Ly8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpXG5cdFx0ZmxhdE9wdGlvbnM6IHtcblx0XHRcdHVybDogdHJ1ZSxcblx0XHRcdGNvbnRleHQ6IHRydWVcblx0XHR9XG5cdH0sXG5cblx0Ly8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXRcblx0Ly8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLlxuXHQvLyBJZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRpbmdzLlxuXHRhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkge1xuXHRcdHJldHVybiBzZXR0aW5ncyA/XG5cblx0XHRcdC8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0XG5cdFx0XHRhamF4RXh0ZW5kKCBhamF4RXh0ZW5kKCB0YXJnZXQsIGpRdWVyeS5hamF4U2V0dGluZ3MgKSwgc2V0dGluZ3MgKSA6XG5cblx0XHRcdC8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3Ncblx0XHRcdGFqYXhFeHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHRhcmdldCApO1xuXHR9LFxuXG5cdGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLFxuXHRhamF4VHJhbnNwb3J0OiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMgKSxcblxuXHQvLyBNYWluIG1ldGhvZFxuXHRhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkge1xuXG5cdFx0Ly8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmVcblx0XHRpZiAoIHR5cGVvZiB1cmwgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRvcHRpb25zID0gdXJsO1xuXHRcdFx0dXJsID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIEZvcmNlIG9wdGlvbnMgdG8gYmUgYW4gb2JqZWN0XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHR2YXIgdHJhbnNwb3J0LFxuXG5cdFx0XHQvLyBVUkwgd2l0aG91dCBhbnRpLWNhY2hlIHBhcmFtXG5cdFx0XHRjYWNoZVVSTCxcblxuXHRcdFx0Ly8gUmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nLFxuXHRcdFx0cmVzcG9uc2VIZWFkZXJzLFxuXG5cdFx0XHQvLyB0aW1lb3V0IGhhbmRsZVxuXHRcdFx0dGltZW91dFRpbWVyLFxuXG5cdFx0XHQvLyBVcmwgY2xlYW51cCB2YXJcblx0XHRcdHVybEFuY2hvcixcblxuXHRcdFx0Ly8gUmVxdWVzdCBzdGF0ZSAoYmVjb21lcyBmYWxzZSB1cG9uIHNlbmQgYW5kIHRydWUgdXBvbiBjb21wbGV0aW9uKVxuXHRcdFx0Y29tcGxldGVkLFxuXG5cdFx0XHQvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWRcblx0XHRcdGZpcmVHbG9iYWxzLFxuXG5cdFx0XHQvLyBMb29wIHZhcmlhYmxlXG5cdFx0XHRpLFxuXG5cdFx0XHQvLyB1bmNhY2hlZCBwYXJ0IG9mIHRoZSB1cmxcblx0XHRcdHVuY2FjaGVkLFxuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGZpbmFsIG9wdGlvbnMgb2JqZWN0XG5cdFx0XHRzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSxcblxuXHRcdFx0Ly8gQ2FsbGJhY2tzIGNvbnRleHRcblx0XHRcdGNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLFxuXG5cdFx0XHQvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uXG5cdFx0XHRnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiZcblx0XHRcdFx0KCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0LmpxdWVyeSApID9cblx0XHRcdFx0alF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6XG5cdFx0XHRcdGpRdWVyeS5ldmVudCxcblxuXHRcdFx0Ly8gRGVmZXJyZWRzXG5cdFx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblxuXHRcdFx0Ly8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSlcblx0XHRcdHJlcXVlc3RIZWFkZXJzID0ge30sXG5cdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sXG5cblx0XHRcdC8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZVxuXHRcdFx0c3RyQWJvcnQgPSBcImNhbmNlbGVkXCIsXG5cblx0XHRcdC8vIEZha2UgeGhyXG5cdFx0XHRqcVhIUiA9IHtcblx0XHRcdFx0cmVhZHlTdGF0ZTogMCxcblxuXHRcdFx0XHQvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdFx0XHRcdHZhciBtYXRjaDtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0XHRcdGlmICggIXJlc3BvbnNlSGVhZGVycyApIHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzID0ge307XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdID1cblx0XHRcdFx0XHRcdFx0XHRcdCggcmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdIHx8IFtdIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNvbmNhdCggbWF0Y2hbIDIgXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaC5qb2luKCBcIiwgXCIgKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FjaGVzIHRoZSBoZWFkZXJcblx0XHRcdFx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRuYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gPVxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fCBuYW1lO1xuXHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxuXHRcdFx0XHRvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3Ncblx0XHRcdFx0XHRcdFx0anFYSFIuYWx3YXlzKCBtYXBbIGpxWEhSLnN0YXR1cyBdICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzXG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvZGUgaW4gbWFwICkge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0dmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XG5cdFx0XHRcdFx0aWYgKCB0cmFuc3BvcnQgKSB7XG5cdFx0XHRcdFx0XHR0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb25lKCAwLCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIEF0dGFjaCBkZWZlcnJlZHNcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApO1xuXG5cdFx0Ly8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpXG5cdFx0Ly8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICh0cmFjLTEwMDkzOiBjb25zaXN0ZW5jeSB3aXRoIG9sZCBzaWduYXR1cmUpXG5cdFx0Ly8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlXG5cdFx0cy51cmwgPSAoICggdXJsIHx8IHMudXJsIHx8IGxvY2F0aW9uLmhyZWYgKSArIFwiXCIgKVxuXHRcdFx0LnJlcGxhY2UoIHJwcm90b2NvbCwgbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKTtcblxuXHRcdC8vIEFsaWFzIG1ldGhvZCBvcHRpb24gdG8gdHlwZSBhcyBwZXIgdGlja2V0IHRyYWMtMTIwMDRcblx0XHRzLnR5cGUgPSBvcHRpb25zLm1ldGhvZCB8fCBvcHRpb25zLnR5cGUgfHwgcy5tZXRob2QgfHwgcy50eXBlO1xuXG5cdFx0Ly8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdFxuXHRcdHMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8IFwiKlwiICkudG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXG5cdFx0Ly8gQSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHRoZSBvcmlnaW4gZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudCBvcmlnaW4uXG5cdFx0aWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7XG5cdFx0XHR1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSwgRWRnZSAxMiAtIDE1XG5cdFx0XHQvLyBJRSB0aHJvd3MgZXhjZXB0aW9uIG9uIGFjY2Vzc2luZyB0aGUgaHJlZiBwcm9wZXJ0eSBpZiB1cmwgaXMgbWFsZm9ybWVkLFxuXHRcdFx0Ly8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4L1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dXJsQW5jaG9yLmhyZWYgPSBzLnVybDtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5XG5cdFx0XHRcdC8vIEFuY2hvcidzIGhvc3QgcHJvcGVydHkgaXNuJ3QgY29ycmVjdGx5IHNldCB3aGVuIHMudXJsIGlzIHJlbGF0aXZlXG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gdXJsQW5jaG9yLmhyZWY7XG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyBvcmlnaW5BbmNob3IuaG9zdCAhPT1cblx0XHRcdFx0XHR1cmxBbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyB1cmxBbmNob3IuaG9zdDtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIGFuIGVycm9yIHBhcnNpbmcgdGhlIFVSTCwgYXNzdW1lIGl0IGlzIGNyb3NzRG9tYWluLFxuXHRcdFx0XHQvLyBpdCBjYW4gYmUgcmVqZWN0ZWQgYnkgdGhlIHRyYW5zcG9ydCBpZiBpdCBpcyBpbnZhbGlkXG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZ1xuXHRcdGlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgcHJlZmlsdGVyc1xuXHRcdGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWx0ZXIsIHN0b3AgdGhlcmVcblx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdHJldHVybiBqcVhIUjtcblx0XHR9XG5cblx0XHQvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0b1xuXHRcdC8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICh0cmFjLTE1MTE4KVxuXHRcdGZpcmVHbG9iYWxzID0galF1ZXJ5LmV2ZW50ICYmIHMuZ2xvYmFsO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0c1xuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0YXJ0XCIgKTtcblx0XHR9XG5cblx0XHQvLyBVcHBlcmNhc2UgdGhlIHR5cGVcblx0XHRzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTtcblxuXHRcdC8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50XG5cdFx0cy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7XG5cblx0XHQvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2Vcblx0XHQvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb25cblx0XHQvLyBSZW1vdmUgaGFzaCB0byBzaW1wbGlmeSB1cmwgbWFuaXB1bGF0aW9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybC5yZXBsYWNlKCByaGFzaCwgXCJcIiApO1xuXG5cdFx0Ly8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnRcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBoYXNoIHNvIHdlIGNhbiBwdXQgaXQgYmFja1xuXHRcdFx0dW5jYWNoZWQgPSBzLnVybC5zbGljZSggY2FjaGVVUkwubGVuZ3RoICk7XG5cblx0XHRcdC8vIElmIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCBzaG91bGQgYmUgcHJvY2Vzc2VkLCBhcHBlbmQgZGF0YSB0byB1cmxcblx0XHRcdGlmICggcy5kYXRhICYmICggcy5wcm9jZXNzRGF0YSB8fCB0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICkgKSB7XG5cdFx0XHRcdGNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGE7XG5cblx0XHRcdFx0Ly8gdHJhYy05NjgyOiByZW1vdmUgZGF0YSBzbyB0aGF0IGl0J3Mgbm90IHVzZWQgaW4gYW4gZXZlbnR1YWwgcmV0cnlcblx0XHRcdFx0ZGVsZXRlIHMuZGF0YTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG9yIHVwZGF0ZSBhbnRpLWNhY2hlIHBhcmFtIGlmIG5lZWRlZFxuXHRcdFx0aWYgKCBzLmNhY2hlID09PSBmYWxzZSApIHtcblx0XHRcdFx0Y2FjaGVVUkwgPSBjYWNoZVVSTC5yZXBsYWNlKCByYW50aUNhY2hlLCBcIiQxXCIgKTtcblx0XHRcdFx0dW5jYWNoZWQgPSAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gXCImXCIgOiBcIj9cIiApICsgXCJfPVwiICsgKCBub25jZS5ndWlkKysgKSArXG5cdFx0XHRcdFx0dW5jYWNoZWQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMilcblx0XHRcdHMudXJsID0gY2FjaGVVUkwgKyB1bmNhY2hlZDtcblxuXHRcdC8vIENoYW5nZSAnJTIwJyB0byAnKycgaWYgdGhpcyBpcyBlbmNvZGVkIGZvcm0gYm9keSBjb250ZW50IChnaC0yNjU4KVxuXHRcdH0gZWxzZSBpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmXG5cdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApLmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCApIHtcblx0XHRcdHMuZGF0YSA9IHMuZGF0YS5yZXBsYWNlKCByMjAsIFwiK1wiICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdGlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Nb2RpZmllZC1TaW5jZVwiLCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkge1xuXHRcdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIklmLU5vbmUtTWF0Y2hcIiwgalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnRcblx0XHRpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIsIHMuY29udGVudFR5cGUgKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlXG5cdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlcihcblx0XHRcdFwiQWNjZXB0XCIsXG5cdFx0XHRzLmRhdGFUeXBlc1sgMCBdICYmIHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdID9cblx0XHRcdFx0cy5hY2NlcHRzWyBzLmRhdGFUeXBlc1sgMCBdIF0gK1xuXHRcdFx0XHRcdCggcy5kYXRhVHlwZXNbIDAgXSAhPT0gXCIqXCIgPyBcIiwgXCIgKyBhbGxUeXBlcyArIFwiOyBxPTAuMDFcIiA6IFwiXCIgKSA6XG5cdFx0XHRcdHMuYWNjZXB0c1sgXCIqXCIgXVxuXHRcdCk7XG5cblx0XHQvLyBDaGVjayBmb3IgaGVhZGVycyBvcHRpb25cblx0XHRmb3IgKCBpIGluIHMuaGVhZGVycyApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsb3cgY3VzdG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydFxuXHRcdGlmICggcy5iZWZvcmVTZW5kICYmXG5cdFx0XHQoIHMuYmVmb3JlU2VuZC5jYWxsKCBjYWxsYmFja0NvbnRleHQsIGpxWEhSLCBzICkgPT09IGZhbHNlIHx8IGNvbXBsZXRlZCApICkge1xuXG5cdFx0XHQvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm5cblx0XHRcdHJldHVybiBqcVhIUi5hYm9ydCgpO1xuXHRcdH1cblxuXHRcdC8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvblxuXHRcdHN0ckFib3J0ID0gXCJhYm9ydFwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzXG5cdFx0Y29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTtcblx0XHRqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTtcblx0XHRqcVhIUi5mYWlsKCBzLmVycm9yICk7XG5cblx0XHQvLyBHZXQgdHJhbnNwb3J0XG5cdFx0dHJhbnNwb3J0ID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XG5cblx0XHQvLyBJZiBubyB0cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnRcblx0XHRpZiAoICF0cmFuc3BvcnQgKSB7XG5cdFx0XHRkb25lKCAtMSwgXCJObyBUcmFuc3BvcnRcIiApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gMTtcblxuXHRcdFx0Ly8gU2VuZCBnbG9iYWwgZXZlbnRcblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhTZW5kXCIsIFsganFYSFIsIHMgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhamF4U2VuZCwgc3RvcCB0aGVyZVxuXHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdHJldHVybiBqcVhIUjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGltZW91dFxuXHRcdFx0aWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAgKSB7XG5cdFx0XHRcdHRpbWVvdXRUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRqcVhIUi5hYm9ydCggXCJ0aW1lb3V0XCIgKTtcblx0XHRcdFx0fSwgcy50aW1lb3V0ICk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbXBsZXRlZCA9IGZhbHNlO1xuXHRcdFx0XHR0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIFJldGhyb3cgcG9zdC1jb21wbGV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFByb3BhZ2F0ZSBvdGhlcnMgYXMgcmVzdWx0c1xuXHRcdFx0XHRkb25lKCAtMSwgZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZVxuXHRcdGZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkge1xuXHRcdFx0dmFyIGlzU3VjY2Vzcywgc3VjY2VzcywgZXJyb3IsIHJlc3BvbnNlLCBtb2RpZmllZCxcblx0XHRcdFx0c3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7XG5cblx0XHRcdC8vIElnbm9yZSByZXBlYXQgaW52b2NhdGlvbnNcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbXBsZXRlZCA9IHRydWU7XG5cblx0XHRcdC8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzXG5cdFx0XHRpZiAoIHRpbWVvdXRUaW1lciApIHtcblx0XHRcdFx0d2luZG93LmNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uXG5cdFx0XHQvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKVxuXHRcdFx0dHJhbnNwb3J0ID0gdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8IFwiXCI7XG5cblx0XHRcdC8vIFNldCByZWFkeVN0YXRlXG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gc3RhdHVzID4gMCA/IDQgOiAwO1xuXG5cdFx0XHQvLyBEZXRlcm1pbmUgaWYgc3VjY2Vzc2Z1bFxuXHRcdFx0aXNTdWNjZXNzID0gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQ7XG5cblx0XHRcdC8vIEdldCByZXNwb25zZSBkYXRhXG5cdFx0XHRpZiAoIHJlc3BvbnNlcyApIHtcblx0XHRcdFx0cmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVzZSBhIG5vb3AgY29udmVydGVyIGZvciBtaXNzaW5nIHNjcmlwdCBidXQgbm90IGlmIGpzb25wXG5cdFx0XHRpZiAoICFpc1N1Y2Nlc3MgJiZcblx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIFwic2NyaXB0XCIsIHMuZGF0YVR5cGVzICkgPiAtMSAmJlxuXHRcdFx0XHRqUXVlcnkuaW5BcnJheSggXCJqc29uXCIsIHMuZGF0YVR5cGVzICkgPCAwICkge1xuXHRcdFx0XHRzLmNvbnZlcnRlcnNbIFwidGV4dCBzY3JpcHRcIiBdID0gZnVuY3Rpb24oKSB7fTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KVxuXHRcdFx0cmVzcG9uc2UgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKTtcblxuXHRcdFx0Ly8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmdcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXG5cdFx0XHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0XHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiTGFzdC1Nb2RpZmllZFwiICk7XG5cdFx0XHRcdFx0aWYgKCBtb2RpZmllZCApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJldGFnXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBpZiBubyBjb250ZW50XG5cdFx0XHRcdGlmICggc3RhdHVzID09PSAyMDQgfHwgcy50eXBlID09PSBcIkhFQURcIiApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub2NvbnRlbnRcIjtcblxuXHRcdFx0XHQvLyBpZiBub3QgbW9kaWZpZWRcblx0XHRcdFx0fSBlbHNlIGlmICggc3RhdHVzID09PSAzMDQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm90bW9kaWZpZWRcIjtcblxuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gcmVzcG9uc2Uuc3RhdGU7XG5cdFx0XHRcdFx0c3VjY2VzcyA9IHJlc3BvbnNlLmRhdGE7XG5cdFx0XHRcdFx0ZXJyb3IgPSByZXNwb25zZS5lcnJvcjtcblx0XHRcdFx0XHRpc1N1Y2Nlc3MgPSAhZXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gRXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQgYW5kIG5vcm1hbGl6ZSBmb3Igbm9uLWFib3J0c1xuXHRcdFx0XHRlcnJvciA9IHN0YXR1c1RleHQ7XG5cdFx0XHRcdGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcImVycm9yXCI7XG5cdFx0XHRcdFx0aWYgKCBzdGF0dXMgPCAwICkge1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHhociBvYmplY3Rcblx0XHRcdGpxWEhSLnN0YXR1cyA9IHN0YXR1cztcblx0XHRcdGpxWEhSLnN0YXR1c1RleHQgPSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsgXCJcIjtcblxuXHRcdFx0Ly8gU3VjY2Vzcy9FcnJvclxuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsgc3VjY2Vzcywgc3RhdHVzVGV4dCwganFYSFIgXSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0LCBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7XG5cdFx0XHRzdGF0dXNDb2RlID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggaXNTdWNjZXNzID8gXCJhamF4U3VjY2Vzc1wiIDogXCJhamF4RXJyb3JcIixcblx0XHRcdFx0XHRbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb21wbGV0ZVxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheENvbXBsZXRlXCIsIFsganFYSFIsIHMgXSApO1xuXG5cdFx0XHRcdC8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlclxuXHRcdFx0XHRpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdG9wXCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBqcVhIUjtcblx0fSxcblxuXHRnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFjaywgXCJqc29uXCIgKTtcblx0fSxcblxuXHRnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssIFwic2NyaXB0XCIgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcImdldFwiLCBcInBvc3RcIiBdLCBmdW5jdGlvbiggX2ksIG1ldGhvZCApIHtcblx0alF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkge1xuXG5cdFx0Ly8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWRcblx0XHRpZiAoIGlzRnVuY3Rpb24oIGRhdGEgKSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrO1xuXHRcdFx0Y2FsbGJhY2sgPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBUaGUgdXJsIGNhbiBiZSBhbiBvcHRpb25zIG9iamVjdCAod2hpY2ggdGhlbiBtdXN0IGhhdmUgLnVybClcblx0XHRyZXR1cm4galF1ZXJ5LmFqYXgoIGpRdWVyeS5leHRlbmQoIHtcblx0XHRcdHVybDogdXJsLFxuXHRcdFx0dHlwZTogbWV0aG9kLFxuXHRcdFx0ZGF0YVR5cGU6IHR5cGUsXG5cdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0c3VjY2VzczogY2FsbGJhY2tcblx0XHR9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIGZ1bmN0aW9uKCBzICkge1xuXHR2YXIgaTtcblx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0aWYgKCBpLnRvTG93ZXJDYXNlKCkgPT09IFwiY29udGVudC10eXBlXCIgKSB7XG5cdFx0XHRzLmNvbnRlbnRUeXBlID0gcy5oZWFkZXJzWyBpIF0gfHwgXCJcIjtcblx0XHR9XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsLCBvcHRpb25zLCBkb2MgKSB7XG5cdHJldHVybiBqUXVlcnkuYWpheCgge1xuXHRcdHVybDogdXJsLFxuXG5cdFx0Ly8gTWFrZSB0aGlzIGV4cGxpY2l0LCBzaW5jZSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIHRocm91Z2ggYWpheFNldHVwICh0cmFjLTExMjY0KVxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0ZGF0YVR5cGU6IFwic2NyaXB0XCIsXG5cdFx0Y2FjaGU6IHRydWUsXG5cdFx0YXN5bmM6IGZhbHNlLFxuXHRcdGdsb2JhbDogZmFsc2UsXG5cblx0XHQvLyBPbmx5IGV2YWx1YXRlIHRoZSByZXNwb25zZSBpZiBpdCBpcyBzdWNjZXNzZnVsIChnaC00MTI2KVxuXHRcdC8vIGRhdGFGaWx0ZXIgaXMgbm90IGludm9rZWQgZm9yIGZhaWx1cmUgcmVzcG9uc2VzLCBzbyB1c2luZyBpdCBpbnN0ZWFkXG5cdFx0Ly8gb2YgdGhlIGRlZmF1bHQgY29udmVydGVyIGlzIGtsdWRneSBidXQgaXQgd29ya3MuXG5cdFx0Y29udmVydGVyczoge1xuXHRcdFx0XCJ0ZXh0IHNjcmlwdFwiOiBmdW5jdGlvbigpIHt9XG5cdFx0fSxcblx0XHRkYXRhRmlsdGVyOiBmdW5jdGlvbiggcmVzcG9uc2UgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggcmVzcG9uc2UsIG9wdGlvbnMsIGRvYyApO1xuXHRcdH1cblx0fSApO1xufTtcblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciB3cmFwO1xuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdFx0aHRtbCA9IGh0bWwuY2FsbCggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kXG5cdFx0XHR3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCApLmVxKCAwICkuY2xvbmUoIHRydWUgKTtcblxuXHRcdFx0aWYgKCB0aGlzWyAwIF0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0d3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHR3cmFwLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gdGhpcztcblxuXHRcdFx0XHR3aGlsZSAoIGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQgKSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZWxlbTtcblx0XHRcdH0gKS5hcHBlbmQoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKCB0aGlzLCBpICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHR3cmFwOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWxJc0Z1bmN0aW9uID8gaHRtbC5jYWxsKCB0aGlzLCBpICkgOiBodG1sICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHVud3JhcDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHRoaXMucGFyZW50KCBzZWxlY3RvciApLm5vdCggXCJib2R5XCIgKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTtcblx0XHR9ICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApO1xufTtcbmpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gISEoIGVsZW0ub2Zmc2V0V2lkdGggfHwgZWxlbS5vZmZzZXRIZWlnaHQgfHwgZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApO1xufTtcblxuXG5cblxualF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoICggZSApIHt9XG59O1xuXG52YXIgeGhyU3VjY2Vzc1N0YXR1cyA9IHtcblxuXHRcdC8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwXG5cdFx0MDogMjAwLFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHQvLyB0cmFjLTE0NTA6IHNvbWV0aW1lcyBJRSByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0XG5cdFx0MTIyMzogMjA0XG5cdH0sXG5cdHhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7XG5cbnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHJTdXBwb3J0ZWQgKTtcbnN1cHBvcnQuYWpheCA9IHhoclN1cHBvcnRlZCA9ICEheGhyU3VwcG9ydGVkO1xuXG5qUXVlcnkuYWpheFRyYW5zcG9ydCggZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdHZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaztcblxuXHQvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0XG5cdGlmICggc3VwcG9ydC5jb3JzIHx8IHhoclN1cHBvcnRlZCAmJiAhb3B0aW9ucy5jcm9zc0RvbWFpbiApIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkge1xuXHRcdFx0XHR2YXIgaSxcblx0XHRcdFx0XHR4aHIgPSBvcHRpb25zLnhocigpO1xuXG5cdFx0XHRcdHhoci5vcGVuKFxuXHRcdFx0XHRcdG9wdGlvbnMudHlwZSxcblx0XHRcdFx0XHRvcHRpb25zLnVybCxcblx0XHRcdFx0XHRvcHRpb25zLmFzeW5jLFxuXHRcdFx0XHRcdG9wdGlvbnMudXNlcm5hbWUsXG5cdFx0XHRcdFx0b3B0aW9ucy5wYXNzd29yZFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIEFwcGx5IGN1c3RvbSBmaWVsZHMgaWYgcHJvdmlkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdFx0eGhyWyBpIF0gPSBvcHRpb25zLnhockZpZWxkc1sgaSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLm1pbWVUeXBlICYmIHhoci5vdmVycmlkZU1pbWVUeXBlICkge1xuXHRcdFx0XHRcdHhoci5vdmVycmlkZU1pbWVUeXBlKCBvcHRpb25zLm1pbWVUeXBlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlclxuXHRcdFx0XHQvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlXG5cdFx0XHRcdC8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuXG5cdFx0XHRcdC8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKVxuXHRcdFx0XHQvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC5cblx0XHRcdFx0aWYgKCAhb3B0aW9ucy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSApIHtcblx0XHRcdFx0XHRoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdID0gXCJYTUxIdHRwUmVxdWVzdFwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2V0IGhlYWRlcnNcblx0XHRcdFx0Zm9yICggaSBpbiBoZWFkZXJzICkge1xuXHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrID0geGhyLm9ubG9hZCA9XG5cdFx0XHRcdFx0XHRcdFx0eGhyLm9uZXJyb3IgPSB4aHIub25hYm9ydCA9IHhoci5vbnRpbWVvdXQgPVxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlID09PSBcImFib3J0XCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0eGhyLmFib3J0KCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09IFwiZXJyb3JcIiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0Ly8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZVxuXHRcdFx0XHRcdFx0XHRcdGlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggMCwgXCJlcnJvclwiICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSB0cmFjLTg2MDUsIHRyYWMtMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHRcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyU3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBdIHx8IHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dCxcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElFOSBoYXMgbm8gWEhSMiBidXQgdGhyb3dzIG9uIGJpbmFyeSAodHJhYy0xMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpXG5cdFx0XHRcdFx0XHRcdFx0XHQoIHhoci5yZXNwb25zZVR5cGUgfHwgXCJ0ZXh0XCIgKSAhPT0gXCJ0ZXh0XCIgIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgYmluYXJ5OiB4aHIucmVzcG9uc2UgfSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0ZXJyb3JDYWxsYmFjayA9IHhoci5vbmVycm9yID0geGhyLm9udGltZW91dCA9IGNhbGxiYWNrKCBcImVycm9yXCIgKTtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHRcdFx0Ly8gVXNlIG9ucmVhZHlzdGF0ZWNoYW5nZSB0byByZXBsYWNlIG9uYWJvcnRcblx0XHRcdFx0Ly8gdG8gaGFuZGxlIHVuY2F1Z2h0IGFib3J0c1xuXHRcdFx0XHRpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0eGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgcmVhZHlTdGF0ZSBiZWZvcmUgdGltZW91dCBhcyBpdCBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFsbG93IG9uZXJyb3IgdG8gYmUgY2FsbGVkIGZpcnN0LFxuXHRcdFx0XHRcdFx0XHQvLyBidXQgdGhhdCB3aWxsIG5vdCBoYW5kbGUgYSBuYXRpdmUgYWJvcnRcblx0XHRcdFx0XHRcdFx0Ly8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0Ly8gYXMgeGhyLm9uZXJyb3IgY2Fubm90IGJlIGFjY2Vzc2VkXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JDYWxsYmFjaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2soIFwiYWJvcnRcIiApO1xuXG5cdFx0XHRcdHRyeSB7XG5cblx0XHRcdFx0XHQvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pXG5cdFx0XHRcdFx0eGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApO1xuXHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdC8vIHRyYWMtMTQ2ODM6IE9ubHkgcmV0aHJvdyBpZiB0aGlzIGhhc24ndCBiZWVuIG5vdGlmaWVkIGFzIGFuIGVycm9yIHlldFxuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFByZXZlbnQgYXV0by1leGVjdXRpb24gb2Ygc2NyaXB0cyB3aGVuIG5vIGV4cGxpY2l0IGRhdGFUeXBlIHdhcyBwcm92aWRlZCAoU2VlIGdoLTI0MzIpXG5qUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLmNvbnRlbnRzLnNjcmlwdCA9IGZhbHNlO1xuXHR9XG59ICk7XG5cbi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlXG5qUXVlcnkuYWpheFNldHVwKCB7XG5cdGFjY2VwdHM6IHtcblx0XHRzY3JpcHQ6IFwidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBcIiArXG5cdFx0XHRcImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdFwiXG5cdH0sXG5cdGNvbnRlbnRzOiB7XG5cdFx0c2NyaXB0OiAvXFxiKD86amF2YXxlY21hKXNjcmlwdFxcYi9cblx0fSxcblx0Y29udmVydGVyczoge1xuXHRcdFwidGV4dCBzY3JpcHRcIjogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApO1xuXHRcdFx0cmV0dXJuIHRleHQ7XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgY3Jvc3NEb21haW5cbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0cy5jYWNoZSA9IGZhbHNlO1xuXHR9XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLnR5cGUgPSBcIkdFVFwiO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgc2NyaXB0IHRhZyBoYWNrIHRyYW5zcG9ydFxualF1ZXJ5LmFqYXhUcmFuc3BvcnQoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXG5cdC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gb3IgZm9yY2VkLWJ5LWF0dHJzIHJlcXVlc3RzXG5cdGlmICggcy5jcm9zc0RvbWFpbiB8fCBzLnNjcmlwdEF0dHJzICkge1xuXHRcdHZhciBzY3JpcHQsIGNhbGxiYWNrO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggXywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHNjcmlwdCA9IGpRdWVyeSggXCI8c2NyaXB0PlwiIClcblx0XHRcdFx0XHQuYXR0ciggcy5zY3JpcHRBdHRycyB8fCB7fSApXG5cdFx0XHRcdFx0LnByb3AoIHsgY2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LCBzcmM6IHMudXJsIH0gKVxuXHRcdFx0XHRcdC5vbiggXCJsb2FkIGVycm9yXCIsIGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0Ly8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFYIHRyaWNrZXJ5XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcblx0cmpzb25wID0gLyg9KVxcPyg/PSZ8JCl8XFw/XFw/LztcblxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZS5ndWlkKysgKSApO1xuXHRcdHRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlO1xuXHRcdHJldHVybiBjYWxsYmFjaztcblx0fVxufSApO1xuXG4vLyBEZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVxdWVzdHNcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcImpzb24ganNvbnBcIiwgZnVuY3Rpb24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpxWEhSICkge1xuXG5cdHZhciBjYWxsYmFja05hbWUsIG92ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lcixcblx0XHRqc29uUHJvcCA9IHMuanNvbnAgIT09IGZhbHNlICYmICggcmpzb25wLnRlc3QoIHMudXJsICkgP1xuXHRcdFx0XCJ1cmxcIiA6XG5cdFx0XHR0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCggcy5jb250ZW50VHlwZSB8fCBcIlwiIClcblx0XHRcdFx0XHQuaW5kZXhPZiggXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiApID09PSAwICYmXG5cdFx0XHRcdHJqc29ucC50ZXN0KCBzLmRhdGEgKSAmJiBcImRhdGFcIlxuXHRcdCk7XG5cblx0Ly8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzIFwianNvbnBcIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldFxuXHRpZiAoIGpzb25Qcm9wIHx8IHMuZGF0YVR5cGVzWyAwIF0gPT09IFwianNvbnBcIiApIHtcblxuXHRcdC8vIEdldCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGluZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXRcblx0XHRjYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBpc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2soKSA6XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHQvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1cmwgb3IgZm9ybSBkYXRhXG5cdFx0aWYgKCBqc29uUHJvcCApIHtcblx0XHRcdHNbIGpzb25Qcm9wIF0gPSBzWyBqc29uUHJvcCBdLnJlcGxhY2UoIHJqc29ucCwgXCIkMVwiICsgY2FsbGJhY2tOYW1lICk7XG5cdFx0fSBlbHNlIGlmICggcy5qc29ucCAhPT0gZmFsc2UgKSB7XG5cdFx0XHRzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gXCImXCIgOiBcIj9cIiApICsgcy5qc29ucCArIFwiPVwiICsgY2FsbGJhY2tOYW1lO1xuXHRcdH1cblxuXHRcdC8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb25cblx0XHRzLmNvbnZlcnRlcnNbIFwic2NyaXB0IGpzb25cIiBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHtcblx0XHRcdFx0alF1ZXJ5LmVycm9yKCBjYWxsYmFja05hbWUgKyBcIiB3YXMgbm90IGNhbGxlZFwiICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTtcblx0XHR9O1xuXG5cdFx0Ly8gRm9yY2UganNvbiBkYXRhVHlwZVxuXHRcdHMuZGF0YVR5cGVzWyAwIF0gPSBcImpzb25cIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tcblx0XHRvdmVyd3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07XG5cdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBhcmd1bWVudHM7XG5cdFx0fTtcblxuXHRcdC8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKVxuXHRcdGpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIElmIHByZXZpb3VzIHZhbHVlIGRpZG4ndCBleGlzdCAtIHJlbW92ZSBpdFxuXHRcdFx0aWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRqUXVlcnkoIHdpbmRvdyApLnJlbW92ZVByb3AoIGNhbGxiYWNrTmFtZSApO1xuXG5cdFx0XHQvLyBPdGhlcndpc2UgcmVzdG9yZSBwcmVleGlzdGluZyB2YWx1ZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IG92ZXJ3cml0dGVuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTYXZlIGJhY2sgYXMgZnJlZVxuXHRcdFx0aWYgKCBzWyBjYWxsYmFja05hbWUgXSApIHtcblxuXHRcdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCByZS11c2luZyB0aGUgb3B0aW9ucyBkb2Vzbid0IHNjcmV3IHRoaW5ncyBhcm91bmRcblx0XHRcdFx0cy5qc29ucENhbGxiYWNrID0gb3JpZ2luYWxTZXR0aW5ncy5qc29ucENhbGxiYWNrO1xuXG5cdFx0XHRcdC8vIFNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2Vcblx0XHRcdFx0b2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2Vcblx0XHRcdGlmICggcmVzcG9uc2VDb250YWluZXIgJiYgaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4gKSApIHtcblx0XHRcdFx0b3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDtcblx0XHR9ICk7XG5cblx0XHQvLyBEZWxlZ2F0ZSB0byBzY3JpcHRcblx0XHRyZXR1cm4gXCJzY3JpcHRcIjtcblx0fVxufSApO1xuXG5cblxuXG4vLyBTdXBwb3J0OiBTYWZhcmkgOCBvbmx5XG4vLyBJbiBTYWZhcmkgOCBkb2N1bWVudHMgY3JlYXRlZCB2aWEgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50XG4vLyBjb2xsYXBzZSBzaWJsaW5nIGZvcm1zOiB0aGUgc2Vjb25kIG9uZSBiZWNvbWVzIGEgY2hpbGQgb2YgdGhlIGZpcnN0IG9uZS5cbi8vIEJlY2F1c2Ugb2YgdGhhdCwgdGhpcyBzZWN1cml0eSBtZWFzdXJlIGhhcyB0byBiZSBkaXNhYmxlZCBpbiBTYWZhcmkgOC5cbi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzczMzdcbnN1cHBvcnQuY3JlYXRlSFRNTERvY3VtZW50ID0gKCBmdW5jdGlvbigpIHtcblx0dmFyIGJvZHkgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIFwiXCIgKS5ib2R5O1xuXHRib2R5LmlubmVySFRNTCA9IFwiPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT5cIjtcblx0cmV0dXJuIGJvZHkuY2hpbGROb2Rlcy5sZW5ndGggPT09IDI7XG59ICkoKTtcblxuXG4vLyBBcmd1bWVudCBcImRhdGFcIiBzaG91bGQgYmUgc3RyaW5nIG9mIGh0bWxcbi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCxcbi8vIGRlZmF1bHRzIHRvIGRvY3VtZW50XG4vLyBrZWVwU2NyaXB0cyAob3B0aW9uYWwpOiBJZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIGh0bWwgc3RyaW5nXG5qUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkge1xuXHRpZiAoIHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRrZWVwU2NyaXB0cyA9IGNvbnRleHQ7XG5cdFx0Y29udGV4dCA9IGZhbHNlO1xuXHR9XG5cblx0dmFyIGJhc2UsIHBhcnNlZCwgc2NyaXB0cztcblxuXHRpZiAoICFjb250ZXh0ICkge1xuXG5cdFx0Ly8gU3RvcCBzY3JpcHRzIG9yIGlubGluZSBldmVudCBoYW5kbGVycyBmcm9tIGJlaW5nIGV4ZWN1dGVkIGltbWVkaWF0ZWx5XG5cdFx0Ly8gYnkgdXNpbmcgZG9jdW1lbnQuaW1wbGVtZW50YXRpb25cblx0XHRpZiAoIHN1cHBvcnQuY3JlYXRlSFRNTERvY3VtZW50ICkge1xuXHRcdFx0Y29udGV4dCA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCggXCJcIiApO1xuXG5cdFx0XHQvLyBTZXQgdGhlIGJhc2UgaHJlZiBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnRcblx0XHRcdC8vIHNvIGFueSBwYXJzZWQgZWxlbWVudHMgd2l0aCBVUkxzXG5cdFx0XHQvLyBhcmUgYmFzZWQgb24gdGhlIGRvY3VtZW50J3MgVVJMIChnaC0yOTY1KVxuXHRcdFx0YmFzZSA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCggXCJiYXNlXCIgKTtcblx0XHRcdGJhc2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7XG5cdFx0XHRjb250ZXh0LmhlYWQuYXBwZW5kQ2hpbGQoIGJhc2UgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29udGV4dCA9IGRvY3VtZW50O1xuXHRcdH1cblx0fVxuXG5cdHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApO1xuXHRzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdO1xuXG5cdC8vIFNpbmdsZSB0YWdcblx0aWYgKCBwYXJzZWQgKSB7XG5cdFx0cmV0dXJuIFsgY29udGV4dC5jcmVhdGVFbGVtZW50KCBwYXJzZWRbIDEgXSApIF07XG5cdH1cblxuXHRwYXJzZWQgPSBidWlsZEZyYWdtZW50KCBbIGRhdGEgXSwgY29udGV4dCwgc2NyaXB0cyApO1xuXG5cdGlmICggc2NyaXB0cyAmJiBzY3JpcHRzLmxlbmd0aCApIHtcblx0XHRqUXVlcnkoIHNjcmlwdHMgKS5yZW1vdmUoKTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApO1xufTtcblxuXG4vKipcbiAqIExvYWQgYSB1cmwgaW50byBhIHBhZ2VcbiAqL1xualF1ZXJ5LmZuLmxvYWQgPSBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkge1xuXHR2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLFxuXHRcdHNlbGYgPSB0aGlzLFxuXHRcdG9mZiA9IHVybC5pbmRleE9mKCBcIiBcIiApO1xuXG5cdGlmICggb2ZmID4gLTEgKSB7XG5cdFx0c2VsZWN0b3IgPSBzdHJpcEFuZENvbGxhcHNlKCB1cmwuc2xpY2UoIG9mZiApICk7XG5cdFx0dXJsID0gdXJsLnNsaWNlKCAwLCBvZmYgKTtcblx0fVxuXG5cdC8vIElmIGl0J3MgYSBmdW5jdGlvblxuXHRpZiAoIGlzRnVuY3Rpb24oIHBhcmFtcyApICkge1xuXG5cdFx0Ly8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2tcblx0XHRjYWxsYmFjayA9IHBhcmFtcztcblx0XHRwYXJhbXMgPSB1bmRlZmluZWQ7XG5cblx0Ly8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZ1xuXHR9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gXCJvYmplY3RcIiApIHtcblx0XHR0eXBlID0gXCJQT1NUXCI7XG5cdH1cblxuXHQvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdFxuXHRpZiAoIHNlbGYubGVuZ3RoID4gMCApIHtcblx0XHRqUXVlcnkuYWpheCgge1xuXHRcdFx0dXJsOiB1cmwsXG5cblx0XHRcdC8vIElmIFwidHlwZVwiIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlbiBcIkdFVFwiIG1ldGhvZCB3aWxsIGJlIHVzZWQuXG5cdFx0XHQvLyBNYWtlIHZhbHVlIG9mIHRoaXMgZmllbGQgZXhwbGljaXQgc2luY2Vcblx0XHRcdC8vIHVzZXIgY2FuIG92ZXJyaWRlIGl0IHRocm91Z2ggYWpheFNldHVwIG1ldGhvZFxuXHRcdFx0dHlwZTogdHlwZSB8fCBcIkdFVFwiLFxuXHRcdFx0ZGF0YVR5cGU6IFwiaHRtbFwiLFxuXHRcdFx0ZGF0YTogcGFyYW1zXG5cdFx0fSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7XG5cblx0XHRcdC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21wbGV0ZSBjYWxsYmFja1xuXHRcdFx0cmVzcG9uc2UgPSBhcmd1bWVudHM7XG5cblx0XHRcdHNlbGYuaHRtbCggc2VsZWN0b3IgP1xuXG5cdFx0XHRcdC8vIElmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZCwgbG9jYXRlIHRoZSByaWdodCBlbGVtZW50cyBpbiBhIGR1bW15IGRpdlxuXHRcdFx0XHQvLyBFeGNsdWRlIHNjcmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnNcblx0XHRcdFx0alF1ZXJ5KCBcIjxkaXY+XCIgKS5hcHBlbmQoIGpRdWVyeS5wYXJzZUhUTUwoIHJlc3BvbnNlVGV4dCApICkuZmluZCggc2VsZWN0b3IgKSA6XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCByZXN1bHRcblx0XHRcdFx0cmVzcG9uc2VUZXh0ICk7XG5cblx0XHQvLyBJZiB0aGUgcmVxdWVzdCBzdWNjZWVkcywgdGhpcyBmdW5jdGlvbiBnZXRzIFwiZGF0YVwiLCBcInN0YXR1c1wiLCBcImpxWEhSXCJcblx0XHQvLyBidXQgdGhleSBhcmUgaWdub3JlZCBiZWNhdXNlIHJlc3BvbnNlIHdhcyBzZXQgYWJvdmUuXG5cdFx0Ly8gSWYgaXQgZmFpbHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImpxWEhSXCIsIFwic3RhdHVzXCIsIFwiZXJyb3JcIlxuXHRcdH0gKS5hbHdheXMoIGNhbGxiYWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkge1xuXHRcdFx0c2VsZi5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y2FsbGJhY2suYXBwbHkoIHRoaXMsIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0gKTtcblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHRyZXR1cm4gdGhpcztcbn07XG5cblxuXG5cbmpRdWVyeS5leHByLnBzZXVkb3MuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5ncmVwKCBqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW0gPT09IGZuLmVsZW07XG5cdH0gKS5sZW5ndGg7XG59O1xuXG5cblxuXG5qUXVlcnkub2Zmc2V0ID0ge1xuXHRzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkge1xuXHRcdHZhciBjdXJQb3NpdGlvbiwgY3VyTGVmdCwgY3VyQ1NTVG9wLCBjdXJUb3AsIGN1ck9mZnNldCwgY3VyQ1NTTGVmdCwgY2FsY3VsYXRlUG9zaXRpb24sXG5cdFx0XHRwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApLFxuXHRcdFx0Y3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLFxuXHRcdFx0cHJvcHMgPSB7fTtcblxuXHRcdC8vIFNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW1cblx0XHRpZiAoIHBvc2l0aW9uID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0ZWxlbS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcblx0XHR9XG5cblx0XHRjdXJPZmZzZXQgPSBjdXJFbGVtLm9mZnNldCgpO1xuXHRcdGN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwidG9wXCIgKTtcblx0XHRjdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJsZWZ0XCIgKTtcblx0XHRjYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiB8fCBwb3NpdGlvbiA9PT0gXCJmaXhlZFwiICkgJiZcblx0XHRcdCggY3VyQ1NTVG9wICsgY3VyQ1NTTGVmdCApLmluZGV4T2YoIFwiYXV0b1wiICkgPiAtMTtcblxuXHRcdC8vIE5lZWQgdG8gYmUgYWJsZSB0byBjYWxjdWxhdGUgcG9zaXRpb24gaWYgZWl0aGVyXG5cdFx0Ly8gdG9wIG9yIGxlZnQgaXMgYXV0byBhbmQgcG9zaXRpb24gaXMgZWl0aGVyIGFic29sdXRlIG9yIGZpeGVkXG5cdFx0aWYgKCBjYWxjdWxhdGVQb3NpdGlvbiApIHtcblx0XHRcdGN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpO1xuXHRcdFx0Y3VyVG9wID0gY3VyUG9zaXRpb24udG9wO1xuXHRcdFx0Y3VyTGVmdCA9IGN1clBvc2l0aW9uLmxlZnQ7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDtcblx0XHRcdGN1ckxlZnQgPSBwYXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkgfHwgMDtcblx0XHR9XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHtcblxuXHRcdFx0Ly8gVXNlIGpRdWVyeS5leHRlbmQgaGVyZSB0byBhbGxvdyBtb2RpZmljYXRpb24gb2YgY29vcmRpbmF0ZXMgYXJndW1lbnQgKGdoLTE4NDgpXG5cdFx0XHRvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdGlvbnMudG9wICE9IG51bGwgKSB7XG5cdFx0XHRwcm9wcy50b3AgPSAoIG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCApICsgY3VyVG9wO1xuXHRcdH1cblx0XHRpZiAoIG9wdGlvbnMubGVmdCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7XG5cdFx0fVxuXG5cdFx0aWYgKCBcInVzaW5nXCIgaW4gb3B0aW9ucyApIHtcblx0XHRcdG9wdGlvbnMudXNpbmcuY2FsbCggZWxlbSwgcHJvcHMgKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdXJFbGVtLmNzcyggcHJvcHMgKTtcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHQvLyBvZmZzZXQoKSByZWxhdGVzIGFuIGVsZW1lbnQncyBib3JkZXIgYm94IHRvIHRoZSBkb2N1bWVudCBvcmlnaW5cblx0b2Zmc2V0OiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHRcdC8vIFByZXNlcnZlIGNoYWluaW5nIGZvciBzZXR0ZXJcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0dGhpcyA6XG5cdFx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTtcblx0XHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHZhciByZWN0LCB3aW4sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4gemVyb3MgZm9yIGRpc2Nvbm5lY3RlZCBhbmQgaGlkZGVuIChkaXNwbGF5OiBub25lKSBlbGVtZW50cyAoZ2gtMjMxMClcblx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0XHQvLyBSdW5uaW5nIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBvbiBhXG5cdFx0Ly8gZGlzY29ubmVjdGVkIG5vZGUgaW4gSUUgdGhyb3dzIGFuIGVycm9yXG5cdFx0aWYgKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9O1xuXHRcdH1cblxuXHRcdC8vIEdldCBkb2N1bWVudC1yZWxhdGl2ZSBwb3NpdGlvbiBieSBhZGRpbmcgdmlld3BvcnQgc2Nyb2xsIHRvIHZpZXdwb3J0LXJlbGF0aXZlIGdCQ1Jcblx0XHRyZWN0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHR3aW4gPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRvcDogcmVjdC50b3AgKyB3aW4ucGFnZVlPZmZzZXQsXG5cdFx0XHRsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXRcblx0XHR9O1xuXHR9LFxuXG5cdC8vIHBvc2l0aW9uKCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgbWFyZ2luIGJveCB0byBpdHMgb2Zmc2V0IHBhcmVudCdzIHBhZGRpbmcgYm94XG5cdC8vIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGJlaGF2aW9yIG9mIENTUyBhYnNvbHV0ZSBwb3NpdGlvbmluZ1xuXHRwb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAhdGhpc1sgMCBdICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBvZmZzZXRQYXJlbnQsIG9mZnNldCwgZG9jLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdHBhcmVudE9mZnNldCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XG5cblx0XHQvLyBwb3NpdGlvbjpmaXhlZCBlbGVtZW50cyBhcmUgb2Zmc2V0IGZyb20gdGhlIHZpZXdwb3J0LCB3aGljaCBpdHNlbGYgYWx3YXlzIGhhcyB6ZXJvIG9mZnNldFxuXHRcdGlmICggalF1ZXJ5LmNzcyggZWxlbSwgXCJwb3NpdGlvblwiICkgPT09IFwiZml4ZWRcIiApIHtcblxuXHRcdFx0Ly8gQXNzdW1lIHBvc2l0aW9uOmZpeGVkIGltcGxpZXMgYXZhaWxhYmlsaXR5IG9mIGdldEJvdW5kaW5nQ2xpZW50UmVjdFxuXHRcdFx0b2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRvZmZzZXQgPSB0aGlzLm9mZnNldCgpO1xuXG5cdFx0XHQvLyBBY2NvdW50IGZvciB0aGUgKnJlYWwqIG9mZnNldCBwYXJlbnQsIHdoaWNoIGNhbiBiZSB0aGUgZG9jdW1lbnQgb3IgaXRzIHJvb3QgZWxlbWVudFxuXHRcdFx0Ly8gd2hlbiBhIHN0YXRpY2FsbHkgcG9zaXRpb25lZCBlbGVtZW50IGlzIGlkZW50aWZpZWRcblx0XHRcdGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDtcblx0XHRcdG9mZnNldFBhcmVudCA9IGVsZW0ub2Zmc2V0UGFyZW50IHx8IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJlxuXHRcdFx0XHQoIG9mZnNldFBhcmVudCA9PT0gZG9jLmJvZHkgfHwgb2Zmc2V0UGFyZW50ID09PSBkb2MuZG9jdW1lbnRFbGVtZW50ICkgJiZcblx0XHRcdFx0alF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcInBvc2l0aW9uXCIgKSA9PT0gXCJzdGF0aWNcIiApIHtcblxuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdGlmICggb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudCAhPT0gZWxlbSAmJiBvZmZzZXRQYXJlbnQubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgYm9yZGVycyBpbnRvIGl0cyBvZmZzZXQsIHNpbmNlIHRoZXkgYXJlIG91dHNpZGUgaXRzIGNvbnRlbnQgb3JpZ2luXG5cdFx0XHRcdHBhcmVudE9mZnNldCA9IGpRdWVyeSggb2Zmc2V0UGFyZW50ICkub2Zmc2V0KCk7XG5cdFx0XHRcdHBhcmVudE9mZnNldC50b3AgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcImJvcmRlclRvcFdpZHRoXCIsIHRydWUgKTtcblx0XHRcdFx0cGFyZW50T2Zmc2V0LmxlZnQgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcImJvcmRlckxlZnRXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2luc1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IG9mZnNldC50b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwgXCJtYXJnaW5Ub3BcIiwgdHJ1ZSApLFxuXHRcdFx0bGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luTGVmdFwiLCB0cnVlIClcblx0XHR9O1xuXHR9LFxuXG5cdC8vIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGRvY3VtZW50RWxlbWVudCBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuXHQvLyAxKSBGb3IgdGhlIGVsZW1lbnQgaW5zaWRlIHRoZSBpZnJhbWUgd2l0aG91dCBvZmZzZXRQYXJlbnQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuXG5cdC8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvd1xuXHQvLyAyKSBGb3IgdGhlIGhpZGRlbiBvciBkZXRhY2hlZCBlbGVtZW50XG5cdC8vIDMpIEZvciBib2R5IG9yIGh0bWwgZWxlbWVudCwgaS5lLiBpbiBjYXNlIG9mIHRoZSBodG1sIG5vZGUgLSBpdCB3aWxsIHJldHVybiBpdHNlbGZcblx0Ly9cblx0Ly8gYnV0IHRob3NlIGV4Y2VwdGlvbnMgd2VyZSBuZXZlciBwcmVzZW50ZWQgYXMgYSByZWFsIGxpZmUgdXNlLWNhc2VzXG5cdC8vIGFuZCBtaWdodCBiZSBjb25zaWRlcmVkIGFzIG1vcmUgcHJlZmVyYWJsZSByZXN1bHRzLlxuXHQvL1xuXHQvLyBUaGlzIGxvZ2ljLCBob3dldmVyLCBpcyBub3QgZ3VhcmFudGVlZCBhbmQgY2FuIGNoYW5nZSBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZVxuXHRvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQ7XG5cblx0XHRcdHdoaWxlICggb2Zmc2V0UGFyZW50ICYmIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSB7XG5cdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnRFbGVtZW50O1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG4vLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHNcbmpRdWVyeS5lYWNoKCB7IHNjcm9sbExlZnQ6IFwicGFnZVhPZmZzZXRcIiwgc2Nyb2xsVG9wOiBcInBhZ2VZT2Zmc2V0XCIgfSwgZnVuY3Rpb24oIG1ldGhvZCwgcHJvcCApIHtcblx0dmFyIHRvcCA9IFwicGFnZVlPZmZzZXRcIiA9PT0gcHJvcDtcblxuXHRqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7XG5cblx0XHRcdC8vIENvYWxlc2NlIGRvY3VtZW50cyBhbmQgd2luZG93c1xuXHRcdFx0dmFyIHdpbjtcblx0XHRcdGlmICggaXNXaW5kb3coIGVsZW0gKSApIHtcblx0XHRcdFx0d2luID0gZWxlbTtcblx0XHRcdH0gZWxzZSBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHdpbiA9IGVsZW0uZGVmYXVsdFZpZXc7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiB3aW4gPyB3aW5bIHByb3AgXSA6IGVsZW1bIG1ldGhvZCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHdpbiApIHtcblx0XHRcdFx0d2luLnNjcm9sbFRvKFxuXHRcdFx0XHRcdCF0b3AgPyB2YWwgOiB3aW4ucGFnZVhPZmZzZXQsXG5cdFx0XHRcdFx0dG9wID8gdmFsIDogd2luLnBhZ2VZT2Zmc2V0XG5cdFx0XHRcdCk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1bIG1ldGhvZCBdID0gdmFsO1xuXHRcdFx0fVxuXHRcdH0sIG1ldGhvZCwgdmFsLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH07XG59ICk7XG5cbi8vIFN1cHBvcnQ6IFNhZmFyaSA8PTcgLSA5LjEsIENocm9tZSA8PTM3IC0gNDlcbi8vIEFkZCB0aGUgdG9wL2xlZnQgY3NzSG9va3MgdXNpbmcgalF1ZXJ5LmZuLnBvc2l0aW9uXG4vLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODRcbi8vIEJsaW5rIGJ1ZzogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NTg5MzQ3XG4vLyBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNwZWNpZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0O1xuLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmVcbmpRdWVyeS5lYWNoKCBbIFwidG9wXCIsIFwibGVmdFwiIF0sIGZ1bmN0aW9uKCBfaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCgge1xuXHRcdHBhZGRpbmc6IFwiaW5uZXJcIiArIG5hbWUsXG5cdFx0Y29udGVudDogdHlwZSxcblx0XHRcIlwiOiBcIm91dGVyXCIgKyBuYW1lXG5cdH0sIGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkge1xuXG5cdFx0Ly8gTWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoXG5cdFx0alF1ZXJ5LmZuWyBmdW5jTmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSBcImJvb2xlYW5cIiApLFxuXHRcdFx0XHRleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/IFwibWFyZ2luXCIgOiBcImJvcmRlclwiICk7XG5cblx0XHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIGRvYztcblxuXHRcdFx0XHRpZiAoIGlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KVxuXHRcdFx0XHRcdHJldHVybiBmdW5jTmFtZS5pbmRleE9mKCBcIm91dGVyXCIgKSA9PT0gMCA/XG5cdFx0XHRcdFx0XHRlbGVtWyBcImlubmVyXCIgKyBuYW1lIF0gOlxuXHRcdFx0XHRcdFx0ZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIFwiY2xpZW50XCIgKyBuYW1lIF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBHZXQgZG9jdW1lbnQgd2lkdGggb3IgaGVpZ2h0XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdFx0XHRcdC8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSxcblx0XHRcdFx0XHQvLyB3aGljaGV2ZXIgaXMgZ3JlYXRlc3Rcblx0XHRcdFx0XHRyZXR1cm4gTWF0aC5tYXgoXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwic2Nyb2xsXCIgKyBuYW1lIF0sIGRvY1sgXCJzY3JvbGxcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJvZmZzZXRcIiArIG5hbWUgXSwgZG9jWyBcIm9mZnNldFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZG9jWyBcImNsaWVudFwiICsgbmFtZSBdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblxuXHRcdFx0XHRcdC8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQsIHJlcXVlc3RpbmcgYnV0IG5vdCBmb3JjaW5nIHBhcnNlRmxvYXRcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDpcblxuXHRcdFx0XHRcdC8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApO1xuXHRcdFx0fSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUgKTtcblx0XHR9O1xuXHR9ICk7XG59ICk7XG5cblxualF1ZXJ5LmVhY2goIFtcblx0XCJhamF4U3RhcnRcIixcblx0XCJhamF4U3RvcFwiLFxuXHRcImFqYXhDb21wbGV0ZVwiLFxuXHRcImFqYXhFcnJvclwiLFxuXHRcImFqYXhTdWNjZXNzXCIsXG5cdFwiYWpheFNlbmRcIlxuXSwgZnVuY3Rpb24oIF9pLCB0eXBlICkge1xuXHRqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZSwgZm4gKTtcblx0fTtcbn0gKTtcblxuXG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTtcblx0fSxcblxuXHRkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7XG5cblx0XHQvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApXG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgP1xuXHRcdFx0dGhpcy5vZmYoIHNlbGVjdG9yLCBcIioqXCIgKSA6XG5cdFx0XHR0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8IFwiKipcIiwgZm4gKTtcblx0fSxcblxuXHRob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7XG5cdFx0cmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goXG5cdCggXCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBcIiArXG5cdFwibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgXCIgK1xuXHRcImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnVcIiApLnNwbGl0KCBcIiBcIiApLFxuXHRmdW5jdGlvbiggX2ksIG5hbWUgKSB7XG5cblx0XHQvLyBIYW5kbGUgZXZlbnQgYmluZGluZ1xuXHRcdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID9cblx0XHRcdFx0dGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6XG5cdFx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHRcdH07XG5cdH1cbik7XG5cblxuXG5cbi8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seVxuLy8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQXG4vLyBSZXF1aXJlIHRoYXQgdGhlIFwid2hpdGVzcGFjZSBydW5cIiBzdGFydHMgZnJvbSBhIG5vbi13aGl0ZXNwYWNlXG4vLyB0byBhdm9pZCBPKE5eMikgYmVoYXZpb3Igd2hlbiB0aGUgZW5naW5lIHdvdWxkIHRyeSBtYXRjaGluZyBcIlxccyskXCIgYXQgZWFjaCBzcGFjZSBwb3NpdGlvbi5cbnZhciBydHJpbSA9IC9eW1xcc1xcdUZFRkZcXHhBMF0rfChbXlxcc1xcdUZFRkZcXHhBMF0pW1xcc1xcdUZFRkZcXHhBMF0rJC9nO1xuXG4vLyBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0LCBvcHRpb25hbGx5IHBhcnRpYWxseSBhcHBseWluZyBhbnlcbi8vIGFyZ3VtZW50cy5cbi8vIGpRdWVyeS5wcm94eSBpcyBkZXByZWNhdGVkIHRvIHByb21vdGUgc3RhbmRhcmRzIChzcGVjaWZpY2FsbHkgRnVuY3Rpb24jYmluZClcbi8vIEhvd2V2ZXIsIGl0IGlzIG5vdCBzbGF0ZWQgZm9yIHJlbW92YWwgYW55IHRpbWUgc29vblxualF1ZXJ5LnByb3h5ID0gZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkge1xuXHR2YXIgdG1wLCBhcmdzLCBwcm94eTtcblxuXHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcInN0cmluZ1wiICkge1xuXHRcdHRtcCA9IGZuWyBjb250ZXh0IF07XG5cdFx0Y29udGV4dCA9IGZuO1xuXHRcdGZuID0gdG1wO1xuXHR9XG5cblx0Ly8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWNcblx0Ly8gdGhpcyB0aHJvd3MgYSBUeXBlRXJyb3IsIGJ1dCB3ZSB3aWxsIGp1c3QgcmV0dXJuIHVuZGVmaW5lZC5cblx0aWYgKCAhaXNGdW5jdGlvbiggZm4gKSApIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Ly8gU2ltdWxhdGVkIGJpbmRcblx0YXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMiApO1xuXHRwcm94eSA9IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBmbi5hcHBseSggY29udGV4dCB8fCB0aGlzLCBhcmdzLmNvbmNhdCggc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKSApO1xuXHR9O1xuXG5cdC8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZFxuXHRwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKztcblxuXHRyZXR1cm4gcHJveHk7XG59O1xuXG5qUXVlcnkuaG9sZFJlYWR5ID0gZnVuY3Rpb24oIGhvbGQgKSB7XG5cdGlmICggaG9sZCApIHtcblx0XHRqUXVlcnkucmVhZHlXYWl0Kys7XG5cdH0gZWxzZSB7XG5cdFx0alF1ZXJ5LnJlYWR5KCB0cnVlICk7XG5cdH1cbn07XG5qUXVlcnkuaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5qUXVlcnkucGFyc2VKU09OID0gSlNPTi5wYXJzZTtcbmpRdWVyeS5ub2RlTmFtZSA9IG5vZGVOYW1lO1xualF1ZXJ5LmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xualF1ZXJ5LmlzV2luZG93ID0gaXNXaW5kb3c7XG5qUXVlcnkuY2FtZWxDYXNlID0gY2FtZWxDYXNlO1xualF1ZXJ5LnR5cGUgPSB0b1R5cGU7XG5cbmpRdWVyeS5ub3cgPSBEYXRlLm5vdztcblxualF1ZXJ5LmlzTnVtZXJpYyA9IGZ1bmN0aW9uKCBvYmogKSB7XG5cblx0Ly8gQXMgb2YgalF1ZXJ5IDMuMCwgaXNOdW1lcmljIGlzIGxpbWl0ZWQgdG9cblx0Ly8gc3RyaW5ncyBhbmQgbnVtYmVycyAocHJpbWl0aXZlcyBvciBvYmplY3RzKVxuXHQvLyB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIGZpbml0ZSBudW1iZXJzIChnaC0yNjYyKVxuXHR2YXIgdHlwZSA9IGpRdWVyeS50eXBlKCBvYmogKTtcblx0cmV0dXJuICggdHlwZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlID09PSBcInN0cmluZ1wiICkgJiZcblxuXHRcdC8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzIChcIlwiKVxuXHRcdC8vIC4uLmJ1dCBtaXNpbnRlcnByZXRzIGxlYWRpbmctbnVtYmVyIHN0cmluZ3MsIHBhcnRpY3VsYXJseSBoZXggbGl0ZXJhbHMgKFwiMHguLi5cIilcblx0XHQvLyBzdWJ0cmFjdGlvbiBmb3JjZXMgaW5maW5pdGllcyB0byBOYU5cblx0XHQhaXNOYU4oIG9iaiAtIHBhcnNlRmxvYXQoIG9iaiApICk7XG59O1xuXG5qUXVlcnkudHJpbSA9IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRyZXR1cm4gdGV4dCA9PSBudWxsID9cblx0XHRcIlwiIDpcblx0XHQoIHRleHQgKyBcIlwiICkucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApO1xufTtcblxuXG5cbi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlclxuLy8gZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdFxuLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0XG4vLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlXG4vLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2Vcbi8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50c1xuLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLlxuXG4vLyBOb3RlIHRoYXQgZm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3VsZFxuLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhblxuLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJhcmllcyN3aWtpLWFub25cblxuaWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeTtcblx0fSApO1xufVxuXG5cblxuXG52YXJcblxuXHQvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0X2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksXG5cblx0Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0XyQgPSB3aW5kb3cuJDtcblxualF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHtcblx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy4kID0gXyQ7XG5cdH1cblxuXHRpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeTtcbn07XG5cbi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1EXG4vLyAodHJhYy03MTAyI2NvbW1lbnQ6MTAsIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNTU3KVxuLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAodHJhYy0xMzU2NilcbmlmICggdHlwZW9mIG5vR2xvYmFsID09PSBcInVuZGVmaW5lZFwiICkge1xuXHR3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7XG59XG5cblxuXG5cbnJldHVybiBqUXVlcnk7XG59ICk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/jquery/dist/jquery.js\n");
/***/ }),
/***/ "./resources/sass/app.scss":
/*!*********************************!*\
!*** ./resources/sass/app.scss ***!
\*********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvc2Fzcy9hcHAuc2Nzcy5qcyIsIm1hcHBpbmdzIjoiO0FBQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvc2Fzcy9hcHAuc2Nzcz9hODBiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/sass/app.scss\n");
/***/ }),
/***/ "./node_modules/popper.js/dist/esm/popper.js":
/*!***************************************************!*\
!*** ./node_modules/popper.js/dist/esm/popper.js ***!
\***************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/**!\n * @fileOverview Kickass library to create and place poppers near their reference elements.\n * @version 1.16.1\n * @license\n * Copyright (c) 2016 Federico Zivolo and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';\n\nvar timeoutDuration = function () {\n var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n return 1;\n }\n }\n return 0;\n}();\n\nfunction microtaskDebounce(fn) {\n var called = false;\n return function () {\n if (called) {\n return;\n }\n called = true;\n window.Promise.resolve().then(function () {\n called = false;\n fn();\n });\n };\n}\n\nfunction taskDebounce(fn) {\n var scheduled = false;\n return function () {\n if (!scheduled) {\n scheduled = true;\n setTimeout(function () {\n scheduled = false;\n fn();\n }, timeoutDuration);\n }\n };\n}\n\nvar supportsMicroTasks = isBrowser && window.Promise;\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nfunction isFunction(functionToCheck) {\n var getType = {};\n return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n}\n\n/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nfunction getStyleComputedProperty(element, property) {\n if (element.nodeType !== 1) {\n return [];\n }\n // NOTE: 1 DOM access here\n var window = element.ownerDocument.defaultView;\n var css = window.getComputedStyle(element, null);\n return property ? css[property] : css;\n}\n\n/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nfunction getParentNode(element) {\n if (element.nodeName === 'HTML') {\n return element;\n }\n return element.parentNode || element.host;\n}\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nfunction getScrollParent(element) {\n // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n if (!element) {\n return document.body;\n }\n\n switch (element.nodeName) {\n case 'HTML':\n case 'BODY':\n return element.ownerDocument.body;\n case '#document':\n return element.body;\n }\n\n // Firefox want us to check `-x` and `-y` variations as well\n\n var _getStyleComputedProp = getStyleComputedProperty(element),\n overflow = _getStyleComputedProp.overflow,\n overflowX = _getStyleComputedProp.overflowX,\n overflowY = _getStyleComputedProp.overflowY;\n\n if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n return element;\n }\n\n return getScrollParent(getParentNode(element));\n}\n\n/**\n * Returns the reference node of the reference object, or the reference object itself.\n * @method\n * @memberof Popper.Utils\n * @param {Element|Object} reference - the reference element (the popper will be relative to this)\n * @returns {Element} parent\n */\nfunction getReferenceNode(reference) {\n return reference && reference.referenceNode ? reference.referenceNode : reference;\n}\n\nvar isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nvar isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nfunction isIE(version) {\n if (version === 11) {\n return isIE11;\n }\n if (version === 10) {\n return isIE10;\n }\n return isIE11 || isIE10;\n}\n\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nfunction getOffsetParent(element) {\n if (!element) {\n return document.documentElement;\n }\n\n var noOffsetParent = isIE(10) ? document.body : null;\n\n // NOTE: 1 DOM access here\n var offsetParent = element.offsetParent || null;\n // Skip hidden elements which don't have an offsetParent\n while (offsetParent === noOffsetParent && element.nextElementSibling) {\n offsetParent = (element = element.nextElementSibling).offsetParent;\n }\n\n var nodeName = offsetParent && offsetParent.nodeName;\n\n if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n return element ? element.ownerDocument.documentElement : document.documentElement;\n }\n\n // .offsetParent will return the closest TH, TD or TABLE in case\n // no offsetParent is present, I hate this job...\n if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n return getOffsetParent(offsetParent);\n }\n\n return offsetParent;\n}\n\nfunction isOffsetContainer(element) {\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY') {\n return false;\n }\n return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n}\n\n/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nfunction getRoot(node) {\n if (node.parentNode !== null) {\n return getRoot(node.parentNode);\n }\n\n return node;\n}\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nfunction findCommonOffsetParent(element1, element2) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n return document.documentElement;\n }\n\n // Here we make sure to give as \"start\" the element that comes first in the DOM\n var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n var start = order ? element1 : element2;\n var end = order ? element2 : element1;\n\n // Get common ancestor container\n var range = document.createRange();\n range.setStart(start, 0);\n range.setEnd(end, 0);\n var commonAncestorContainer = range.commonAncestorContainer;\n\n // Both nodes are inside #document\n\n if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n if (isOffsetContainer(commonAncestorContainer)) {\n return commonAncestorContainer;\n }\n\n return getOffsetParent(commonAncestorContainer);\n }\n\n // one of the nodes is inside shadowDOM, find which one\n var element1root = getRoot(element1);\n if (element1root.host) {\n return findCommonOffsetParent(element1root.host, element2);\n } else {\n return findCommonOffsetParent(element1, getRoot(element2).host);\n }\n}\n\n/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nfunction getScroll(element) {\n var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n var html = element.ownerDocument.documentElement;\n var scrollingElement = element.ownerDocument.scrollingElement || html;\n return scrollingElement[upperSide];\n }\n\n return element[upperSide];\n}\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nfunction includeScroll(rect, element) {\n var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n var modifier = subtract ? -1 : 1;\n rect.top += scrollTop * modifier;\n rect.bottom += scrollTop * modifier;\n rect.left += scrollLeft * modifier;\n rect.right += scrollLeft * modifier;\n return rect;\n}\n\n/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nfunction getBordersSize(styles, axis) {\n var sideA = axis === 'x' ? 'Left' : 'Top';\n var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n return parseFloat(styles['border' + sideA + 'Width']) + parseFloat(styles['border' + sideB + 'Width']);\n}\n\nfunction getSize(axis, body, html, computedStyle) {\n return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\n}\n\nfunction getWindowSizes(document) {\n var body = document.body;\n var html = document.documentElement;\n var computedStyle = isIE(10) && getComputedStyle(html);\n\n return {\n height: getSize('Height', body, html, computedStyle),\n width: getSize('Width', body, html, computedStyle)\n };\n}\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\nvar defineProperty = function (obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n};\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\n/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nfunction getClientRect(offsets) {\n return _extends({}, offsets, {\n right: offsets.left + offsets.width,\n bottom: offsets.top + offsets.height\n });\n}\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nfunction getBoundingClientRect(element) {\n var rect = {};\n\n // IE10 10 FIX: Please, don't ask, the element isn't\n // considered in DOM in some circumstances...\n // This isn't reproducible in IE10 compatibility mode of IE11\n try {\n if (isIE(10)) {\n rect = element.getBoundingClientRect();\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n rect.top += scrollTop;\n rect.left += scrollLeft;\n rect.bottom += scrollTop;\n rect.right += scrollLeft;\n } else {\n rect = element.getBoundingClientRect();\n }\n } catch (e) {}\n\n var result = {\n left: rect.left,\n top: rect.top,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top\n };\n\n // subtract scrollbar size from sizes\n var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n var width = sizes.width || element.clientWidth || result.width;\n var height = sizes.height || element.clientHeight || result.height;\n\n var horizScrollbar = element.offsetWidth - width;\n var vertScrollbar = element.offsetHeight - height;\n\n // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n // we make this check conditional for performance reasons\n if (horizScrollbar || vertScrollbar) {\n var styles = getStyleComputedProperty(element);\n horizScrollbar -= getBordersSize(styles, 'x');\n vertScrollbar -= getBordersSize(styles, 'y');\n\n result.width -= horizScrollbar;\n result.height -= vertScrollbar;\n }\n\n return getClientRect(result);\n}\n\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\n var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var isIE10 = isIE(10);\n var isHTML = parent.nodeName === 'HTML';\n var childrenRect = getBoundingClientRect(children);\n var parentRect = getBoundingClientRect(parent);\n var scrollParent = getScrollParent(children);\n\n var styles = getStyleComputedProperty(parent);\n var borderTopWidth = parseFloat(styles.borderTopWidth);\n var borderLeftWidth = parseFloat(styles.borderLeftWidth);\n\n // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n if (fixedPosition && isHTML) {\n parentRect.top = Math.max(parentRect.top, 0);\n parentRect.left = Math.max(parentRect.left, 0);\n }\n var offsets = getClientRect({\n top: childrenRect.top - parentRect.top - borderTopWidth,\n left: childrenRect.left - parentRect.left - borderLeftWidth,\n width: childrenRect.width,\n height: childrenRect.height\n });\n offsets.marginTop = 0;\n offsets.marginLeft = 0;\n\n // Subtract margins of documentElement in case it's being used as parent\n // we do this only on HTML because it's the only element that behaves\n // differently when margins are applied to it. The margins are included in\n // the box of the documentElement, in the other cases not.\n if (!isIE10 && isHTML) {\n var marginTop = parseFloat(styles.marginTop);\n var marginLeft = parseFloat(styles.marginLeft);\n\n offsets.top -= borderTopWidth - marginTop;\n offsets.bottom -= borderTopWidth - marginTop;\n offsets.left -= borderLeftWidth - marginLeft;\n offsets.right -= borderLeftWidth - marginLeft;\n\n // Attach marginTop and marginLeft because in some circumstances we may need them\n offsets.marginTop = marginTop;\n offsets.marginLeft = marginLeft;\n }\n\n if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n offsets = includeScroll(offsets, parent);\n }\n\n return offsets;\n}\n\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\n var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var html = element.ownerDocument.documentElement;\n var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n var width = Math.max(html.clientWidth, window.innerWidth || 0);\n var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n var scrollTop = !excludeScroll ? getScroll(html) : 0;\n var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n var offset = {\n top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n width: width,\n height: height\n };\n\n return getClientRect(offset);\n}\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nfunction isFixed(element) {\n var nodeName = element.nodeName;\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n return false;\n }\n if (getStyleComputedProperty(element, 'position') === 'fixed') {\n return true;\n }\n var parentNode = getParentNode(element);\n if (!parentNode) {\n return false;\n }\n return isFixed(parentNode);\n}\n\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nfunction getFixedPositionOffsetParent(element) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element || !element.parentElement || isIE()) {\n return document.documentElement;\n }\n var el = element.parentElement;\n while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n el = el.parentElement;\n }\n return el || document.documentElement;\n}\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\n var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n // NOTE: 1 DOM access here\n\n var boundaries = { top: 0, left: 0 };\n var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n\n // Handle viewport case\n if (boundariesElement === 'viewport') {\n boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n } else {\n // Handle other cases based on DOM element used as boundaries\n var boundariesNode = void 0;\n if (boundariesElement === 'scrollParent') {\n boundariesNode = getScrollParent(getParentNode(reference));\n if (boundariesNode.nodeName === 'BODY') {\n boundariesNode = popper.ownerDocument.documentElement;\n }\n } else if (boundariesElement === 'window') {\n boundariesNode = popper.ownerDocument.documentElement;\n } else {\n boundariesNode = boundariesElement;\n }\n\n var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n // In case of HTML, we need a different computation\n if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n var _getWindowSizes = getWindowSizes(popper.ownerDocument),\n height = _getWindowSizes.height,\n width = _getWindowSizes.width;\n\n boundaries.top += offsets.top - offsets.marginTop;\n boundaries.bottom = height + offsets.top;\n boundaries.left += offsets.left - offsets.marginLeft;\n boundaries.right = width + offsets.left;\n } else {\n // for all the other DOM elements, this one is good\n boundaries = offsets;\n }\n }\n\n // Add paddings\n padding = padding || 0;\n var isPaddingNumber = typeof padding === 'number';\n boundaries.left += isPaddingNumber ? padding : padding.left || 0;\n boundaries.top += isPaddingNumber ? padding : padding.top || 0;\n boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\n boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\n\n return boundaries;\n}\n\nfunction getArea(_ref) {\n var width = _ref.width,\n height = _ref.height;\n\n return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n if (placement.indexOf('auto') === -1) {\n return placement;\n }\n\n var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n var rects = {\n top: {\n width: boundaries.width,\n height: refRect.top - boundaries.top\n },\n right: {\n width: boundaries.right - refRect.right,\n height: boundaries.height\n },\n bottom: {\n width: boundaries.width,\n height: boundaries.bottom - refRect.bottom\n },\n left: {\n width: refRect.left - boundaries.left,\n height: boundaries.height\n }\n };\n\n var sortedAreas = Object.keys(rects).map(function (key) {\n return _extends({\n key: key\n }, rects[key], {\n area: getArea(rects[key])\n });\n }).sort(function (a, b) {\n return b.area - a.area;\n });\n\n var filteredAreas = sortedAreas.filter(function (_ref2) {\n var width = _ref2.width,\n height = _ref2.height;\n return width >= popper.clientWidth && height >= popper.clientHeight;\n });\n\n var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n var variation = placement.split('-')[1];\n\n return computedPlacement + (variation ? '-' + variation : '');\n}\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nfunction getReferenceOffsets(state, popper, reference) {\n var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n\n/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nfunction getOuterSizes(element) {\n var window = element.ownerDocument.defaultView;\n var styles = window.getComputedStyle(element);\n var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n var result = {\n width: element.offsetWidth + y,\n height: element.offsetHeight + x\n };\n return result;\n}\n\n/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nfunction getOppositePlacement(placement) {\n var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\n placement = placement.split('-')[0];\n\n // Get popper node sizes\n var popperRect = getOuterSizes(popper);\n\n // Add position, width and height to our offsets object\n var popperOffsets = {\n width: popperRect.width,\n height: popperRect.height\n };\n\n // depending by the popper placement we have to compute its offsets slightly differently\n var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n var mainSide = isHoriz ? 'top' : 'left';\n var secondarySide = isHoriz ? 'left' : 'top';\n var measurement = isHoriz ? 'height' : 'width';\n var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n if (placement === secondarySide) {\n popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n } else {\n popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n }\n\n return popperOffsets;\n}\n\n/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction find(arr, check) {\n // use native find if supported\n if (Array.prototype.find) {\n return arr.find(check);\n }\n\n // use `filter` to obtain the same behavior of `find`\n return arr.filter(check)[0];\n}\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction findIndex(arr, prop, value) {\n // use native findIndex if supported\n if (Array.prototype.findIndex) {\n return arr.findIndex(function (cur) {\n return cur[prop] === value;\n });\n }\n\n // use `find` + `indexOf` if `findIndex` isn't supported\n var match = find(arr, function (obj) {\n return obj[prop] === value;\n });\n return arr.indexOf(match);\n}\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nfunction runModifiers(modifiers, data, ends) {\n var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n modifiersToRun.forEach(function (modifier) {\n if (modifier['function']) {\n // eslint-disable-line dot-notation\n console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n }\n var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n if (modifier.enabled && isFunction(fn)) {\n // Add properties to offsets to make them a complete clientRect object\n // we do this before each modifier to make sure the previous one doesn't\n // mess with these values\n data.offsets.popper = getClientRect(data.offsets.popper);\n data.offsets.reference = getClientRect(data.offsets.reference);\n\n data = fn(data, modifier);\n }\n });\n\n return data;\n}\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.<br />\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nfunction update() {\n // if popper is destroyed, don't perform any further update\n if (this.state.isDestroyed) {\n return;\n }\n\n var data = {\n instance: this,\n styles: {},\n arrowStyles: {},\n attributes: {},\n flipped: false,\n offsets: {}\n };\n\n // compute reference element offsets\n data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n // store the computed placement inside `originalPlacement`\n data.originalPlacement = data.placement;\n\n data.positionFixed = this.options.positionFixed;\n\n // compute the popper offsets\n data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n\n data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n // run the modifiers\n data = runModifiers(this.modifiers, data);\n\n // the first `update` will call `onCreate` callback\n // the other ones will call `onUpdate` callback\n if (!this.state.isCreated) {\n this.state.isCreated = true;\n this.options.onCreate(data);\n } else {\n this.options.onUpdate(data);\n }\n}\n\n/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nfunction isModifierEnabled(modifiers, modifierName) {\n return modifiers.some(function (_ref) {\n var name = _ref.name,\n enabled = _ref.enabled;\n return enabled && name === modifierName;\n });\n}\n\n/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nfunction getSupportedPropertyName(property) {\n var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n for (var i = 0; i < prefixes.length; i++) {\n var prefix = prefixes[i];\n var toCheck = prefix ? '' + prefix + upperProp : property;\n if (typeof document.body.style[toCheck] !== 'undefined') {\n return toCheck;\n }\n }\n return null;\n}\n\n/**\n * Destroys the popper.\n * @method\n * @memberof Popper\n */\nfunction destroy() {\n this.state.isDestroyed = true;\n\n // touch DOM only if `applyStyle` modifier is enabled\n if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n this.popper.removeAttribute('x-placement');\n this.popper.style.position = '';\n this.popper.style.top = '';\n this.popper.style.left = '';\n this.popper.style.right = '';\n this.popper.style.bottom = '';\n this.popper.style.willChange = '';\n this.popper.style[getSupportedPropertyName('transform')] = '';\n }\n\n this.disableEventListeners();\n\n // remove the popper if user explicitly asked for the deletion on destroy\n // do not use `remove` because IE11 doesn't support it\n if (this.options.removeOnDestroy) {\n this.popper.parentNode.removeChild(this.popper);\n }\n return this;\n}\n\n/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nfunction getWindow(element) {\n var ownerDocument = element.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView : window;\n}\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n var isBody = scrollParent.nodeName === 'BODY';\n var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n target.addEventListener(event, callback, { passive: true });\n\n if (!isBody) {\n attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n }\n scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction setupEventListeners(reference, options, state, updateBound) {\n // Resize event listener on window\n state.updateBound = updateBound;\n getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n // Scroll event listener on scroll parents\n var scrollElement = getScrollParent(reference);\n attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n state.scrollElement = scrollElement;\n state.eventsEnabled = true;\n\n return state;\n}\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nfunction enableEventListeners() {\n if (!this.state.eventsEnabled) {\n this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n }\n}\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction removeEventListeners(reference, state) {\n // Remove resize event listener on window\n getWindow(reference).removeEventListener('resize', state.updateBound);\n\n // Remove scroll event listener on scroll parents\n state.scrollParents.forEach(function (target) {\n target.removeEventListener('scroll', state.updateBound);\n });\n\n // Reset state\n state.updateBound = null;\n state.scrollParents = [];\n state.scrollElement = null;\n state.eventsEnabled = false;\n return state;\n}\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nfunction disableEventListeners() {\n if (this.state.eventsEnabled) {\n cancelAnimationFrame(this.scheduleUpdate);\n this.state = removeEventListeners(this.reference, this.state);\n }\n}\n\n/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nfunction isNumeric(n) {\n return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setStyles(element, styles) {\n Object.keys(styles).forEach(function (prop) {\n var unit = '';\n // add unit if the value is numeric and is one of the following\n if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n unit = 'px';\n }\n element.style[prop] = styles[prop] + unit;\n });\n}\n\n/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setAttributes(element, attributes) {\n Object.keys(attributes).forEach(function (prop) {\n var value = attributes[prop];\n if (value !== false) {\n element.setAttribute(prop, attributes[prop]);\n } else {\n element.removeAttribute(prop);\n }\n });\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nfunction applyStyle(data) {\n // any property present in `data.styles` will be applied to the popper,\n // in this way we can make the 3rd party modifiers add custom styles to it\n // Be aware, modifiers could override the properties defined in the previous\n // lines of this modifier!\n setStyles(data.instance.popper, data.styles);\n\n // any property present in `data.attributes` will be applied to the popper,\n // they will be set as HTML attributes of the element\n setAttributes(data.instance.popper, data.attributes);\n\n // if arrowElement is defined and arrowStyles has some properties\n if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n setStyles(data.arrowElement, data.arrowStyles);\n }\n\n return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n // compute reference element offsets\n var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n popper.setAttribute('x-placement', placement);\n\n // Apply `position` to popper before anything else because\n // without the position applied we can't guarantee correct computations\n setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n return options;\n}\n\n/**\n * @function\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n * @returns {Object} The popper's position offsets rounded\n *\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n * good as it can be within reason.\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n *\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n * as well on High DPI screens).\n *\n * Firefox prefers no rounding for positioning and does not have blurriness on\n * high DPI screens.\n *\n * Only horizontal placement and left/right values need to be considered.\n */\nfunction getRoundedOffsets(data, shouldRound) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n var round = Math.round,\n floor = Math.floor;\n\n var noRound = function noRound(v) {\n return v;\n };\n\n var referenceWidth = round(reference.width);\n var popperWidth = round(popper.width);\n\n var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n var isVariation = data.placement.indexOf('-') !== -1;\n var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\n var verticalToInteger = !shouldRound ? noRound : round;\n\n return {\n left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\n top: verticalToInteger(popper.top),\n bottom: verticalToInteger(popper.bottom),\n right: horizontalToInteger(popper.right)\n };\n}\n\nvar isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeStyle(data, options) {\n var x = options.x,\n y = options.y;\n var popper = data.offsets.popper;\n\n // Remove this legacy support in Popper.js v2\n\n var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'applyStyle';\n }).gpuAcceleration;\n if (legacyGpuAccelerationOption !== undefined) {\n console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n }\n var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n var offsetParent = getOffsetParent(data.instance.popper);\n var offsetParentRect = getBoundingClientRect(offsetParent);\n\n // Styles\n var styles = {\n position: popper.position\n };\n\n var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\n\n var sideA = x === 'bottom' ? 'top' : 'bottom';\n var sideB = y === 'right' ? 'left' : 'right';\n\n // if gpuAcceleration is set to `true` and transform is supported,\n // we use `translate3d` to apply the position to the popper we\n // automatically use the supported prefixed version if needed\n var prefixedProperty = getSupportedPropertyName('transform');\n\n // now, let's make a step back and look at this code closely (wtf?)\n // If the content of the popper grows once it's been positioned, it\n // may happen that the popper gets misplaced because of the new content\n // overflowing its reference element\n // To avoid this problem, we provide two options (x and y), which allow\n // the consumer to define the offset origin.\n // If we position a popper on top of a reference element, we can set\n // `x` to `top` to make the popper grow towards its top instead of\n // its bottom.\n var left = void 0,\n top = void 0;\n if (sideA === 'bottom') {\n // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\n // and not the bottom of the html element\n if (offsetParent.nodeName === 'HTML') {\n top = -offsetParent.clientHeight + offsets.bottom;\n } else {\n top = -offsetParentRect.height + offsets.bottom;\n }\n } else {\n top = offsets.top;\n }\n if (sideB === 'right') {\n if (offsetParent.nodeName === 'HTML') {\n left = -offsetParent.clientWidth + offsets.right;\n } else {\n left = -offsetParentRect.width + offsets.right;\n }\n } else {\n left = offsets.left;\n }\n if (gpuAcceleration && prefixedProperty) {\n styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n styles[sideA] = 0;\n styles[sideB] = 0;\n styles.willChange = 'transform';\n } else {\n // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n var invertTop = sideA === 'bottom' ? -1 : 1;\n var invertLeft = sideB === 'right' ? -1 : 1;\n styles[sideA] = top * invertTop;\n styles[sideB] = left * invertLeft;\n styles.willChange = sideA + ', ' + sideB;\n }\n\n // Attributes\n var attributes = {\n 'x-placement': data.placement\n };\n\n // Update `data` attributes, styles and arrowStyles\n data.attributes = _extends({}, attributes, data.attributes);\n data.styles = _extends({}, styles, data.styles);\n data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n return data;\n}\n\n/**\n * Helper used to know if the given modifier depends from another one.<br />\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\n var requesting = find(modifiers, function (_ref) {\n var name = _ref.name;\n return name === requestingName;\n });\n\n var isRequired = !!requesting && modifiers.some(function (modifier) {\n return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n });\n\n if (!isRequired) {\n var _requesting = '`' + requestingName + '`';\n var requested = '`' + requestedName + '`';\n console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n }\n return isRequired;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction arrow(data, options) {\n var _data$offsets$arrow;\n\n // arrow depends on keepTogether in order to work\n if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n return data;\n }\n\n var arrowElement = options.element;\n\n // if arrowElement is a string, suppose it's a CSS selector\n if (typeof arrowElement === 'string') {\n arrowElement = data.instance.popper.querySelector(arrowElement);\n\n // if arrowElement is not found, don't run the modifier\n if (!arrowElement) {\n return data;\n }\n } else {\n // if the arrowElement isn't a query selector we must check that the\n // provided DOM node is child of its popper node\n if (!data.instance.popper.contains(arrowElement)) {\n console.warn('WARNING: `arrow.element` must be child of its popper element!');\n return data;\n }\n }\n\n var placement = data.placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n var len = isVertical ? 'height' : 'width';\n var sideCapitalized = isVertical ? 'Top' : 'Left';\n var side = sideCapitalized.toLowerCase();\n var altSide = isVertical ? 'left' : 'top';\n var opSide = isVertical ? 'bottom' : 'right';\n var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n //\n // extends keepTogether behavior making sure the popper and its\n // reference have enough pixels in conjunction\n //\n\n // top/left side\n if (reference[opSide] - arrowElementSize < popper[side]) {\n data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n }\n // bottom/right side\n if (reference[side] + arrowElementSize > popper[opSide]) {\n data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n }\n data.offsets.popper = getClientRect(data.offsets.popper);\n\n // compute center of the popper\n var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n // Compute the sideValue using the updated popper offsets\n // take popper margin in account because we don't have this info available\n var css = getStyleComputedProperty(data.instance.popper);\n var popperMarginSide = parseFloat(css['margin' + sideCapitalized]);\n var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width']);\n var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n // prevent arrowElement from being placed not contiguously to its popper\n sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n data.arrowElement = arrowElement;\n data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n return data;\n}\n\n/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nfunction getOppositeVariation(variation) {\n if (variation === 'end') {\n return 'start';\n } else if (variation === 'start') {\n return 'end';\n }\n return variation;\n}\n\n/**\n * List of accepted placements to use as values of the `placement` option.<br />\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.<br />\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-end` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n// Get rid of `auto` `auto-start` and `auto-end`\nvar validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nfunction clockwise(placement) {\n var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var index = validPlacements.indexOf(placement);\n var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n return counter ? arr.reverse() : arr;\n}\n\nvar BEHAVIORS = {\n FLIP: 'flip',\n CLOCKWISE: 'clockwise',\n COUNTERCLOCKWISE: 'counterclockwise'\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction flip(data, options) {\n // if `inner` modifier is enabled, we can't use the `flip` modifier\n if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n return data;\n }\n\n if (data.flipped && data.placement === data.originalPlacement) {\n // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n return data;\n }\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n var placement = data.placement.split('-')[0];\n var placementOpposite = getOppositePlacement(placement);\n var variation = data.placement.split('-')[1] || '';\n\n var flipOrder = [];\n\n switch (options.behavior) {\n case BEHAVIORS.FLIP:\n flipOrder = [placement, placementOpposite];\n break;\n case BEHAVIORS.CLOCKWISE:\n flipOrder = clockwise(placement);\n break;\n case BEHAVIORS.COUNTERCLOCKWISE:\n flipOrder = clockwise(placement, true);\n break;\n default:\n flipOrder = options.behavior;\n }\n\n flipOrder.forEach(function (step, index) {\n if (placement !== step || flipOrder.length === index + 1) {\n return data;\n }\n\n placement = data.placement.split('-')[0];\n placementOpposite = getOppositePlacement(placement);\n\n var popperOffsets = data.offsets.popper;\n var refOffsets = data.offsets.reference;\n\n // using floor because the reference offsets may contain decimals we are not going to consider here\n var floor = Math.floor;\n var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n // flip the variation if required\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n\n // flips variation if reference element overflows boundaries\n var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n // flips variation if popper content overflows boundaries\n var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);\n\n var flippedVariation = flippedVariationByRef || flippedVariationByContent;\n\n if (overlapsRef || overflowsBoundaries || flippedVariation) {\n // this boolean to detect any flip loop\n data.flipped = true;\n\n if (overlapsRef || overflowsBoundaries) {\n placement = flipOrder[index + 1];\n }\n\n if (flippedVariation) {\n variation = getOppositeVariation(variation);\n }\n\n data.placement = placement + (variation ? '-' + variation : '');\n\n // this object contains `position`, we want to preserve it along with\n // any additional property we may add in the future\n data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n data = runModifiers(data.instance.modifiers, data, 'flip');\n }\n });\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction keepTogether(data) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var placement = data.placement.split('-')[0];\n var floor = Math.floor;\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n var side = isVertical ? 'right' : 'bottom';\n var opSide = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n if (popper[side] < floor(reference[opSide])) {\n data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n }\n if (popper[opSide] > floor(reference[side])) {\n data.offsets.popper[opSide] = floor(reference[side]);\n }\n\n return data;\n}\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\n // separate value from unit\n var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n var value = +split[1];\n var unit = split[2];\n\n // If it's not a number it's an operator, I guess\n if (!value) {\n return str;\n }\n\n if (unit.indexOf('%') === 0) {\n var element = void 0;\n switch (unit) {\n case '%p':\n element = popperOffsets;\n break;\n case '%':\n case '%r':\n default:\n element = referenceOffsets;\n }\n\n var rect = getClientRect(element);\n return rect[measurement] / 100 * value;\n } else if (unit === 'vh' || unit === 'vw') {\n // if is a vh or vw, we calculate the size based on the viewport\n var size = void 0;\n if (unit === 'vh') {\n size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n } else {\n size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n }\n return size / 100 * value;\n } else {\n // if is an explicit pixel unit, we get rid of the unit and keep the value\n // if is an implicit unit, it's px, and we return just the value\n return value;\n }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n var offsets = [0, 0];\n\n // Use height if placement is left or right and index is 0 otherwise use width\n // in this way the first offset will use an axis and the second one\n // will use the other one\n var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n // Split the offset string to obtain a list of values and operands\n // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n return frag.trim();\n });\n\n // Detect if the offset string contains a pair of values or a single one\n // they could be separated by comma or space\n var divider = fragments.indexOf(find(fragments, function (frag) {\n return frag.search(/,|\\s/) !== -1;\n }));\n\n if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n }\n\n // If divider is found, we divide the list of values and operands to divide\n // them by ofset X and Y.\n var splitRegex = /\\s*,\\s*|\\s+/;\n var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n // Convert the values with units to absolute pixels to allow our computations\n ops = ops.map(function (op, index) {\n // Most of the units rely on the orientation of the popper\n var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n var mergeWithPrevious = false;\n return op\n // This aggregates any `+` or `-` sign that aren't considered operators\n // e.g.: 10 + +5 => [10, +, +5]\n .reduce(function (a, b) {\n if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n a[a.length - 1] = b;\n mergeWithPrevious = true;\n return a;\n } else if (mergeWithPrevious) {\n a[a.length - 1] += b;\n mergeWithPrevious = false;\n return a;\n } else {\n return a.concat(b);\n }\n }, [])\n // Here we convert the string values into number values (in px)\n .map(function (str) {\n return toValue(str, measurement, popperOffsets, referenceOffsets);\n });\n });\n\n // Loop trough the offsets arrays and execute the operations\n ops.forEach(function (op, index) {\n op.forEach(function (frag, index2) {\n if (isNumeric(frag)) {\n offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n }\n });\n });\n return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nfunction offset(data, _ref) {\n var offset = _ref.offset;\n var placement = data.placement,\n _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var basePlacement = placement.split('-')[0];\n\n var offsets = void 0;\n if (isNumeric(+offset)) {\n offsets = [+offset, 0];\n } else {\n offsets = parseOffset(offset, popper, reference, basePlacement);\n }\n\n if (basePlacement === 'left') {\n popper.top += offsets[0];\n popper.left -= offsets[1];\n } else if (basePlacement === 'right') {\n popper.top += offsets[0];\n popper.left += offsets[1];\n } else if (basePlacement === 'top') {\n popper.left += offsets[0];\n popper.top -= offsets[1];\n } else if (basePlacement === 'bottom') {\n popper.left += offsets[0];\n popper.top += offsets[1];\n }\n\n data.popper = popper;\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction preventOverflow(data, options) {\n var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n // If offsetParent is the reference element, we really want to\n // go one step up and use the next offsetParent as reference to\n // avoid to make this modifier completely useless and look like broken\n if (data.instance.reference === boundariesElement) {\n boundariesElement = getOffsetParent(boundariesElement);\n }\n\n // NOTE: DOM access here\n // resets the popper's position so that the document size can be calculated excluding\n // the size of the popper element itself\n var transformProp = getSupportedPropertyName('transform');\n var popperStyles = data.instance.popper.style; // assignment to help minification\n var top = popperStyles.top,\n left = popperStyles.left,\n transform = popperStyles[transformProp];\n\n popperStyles.top = '';\n popperStyles.left = '';\n popperStyles[transformProp] = '';\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n\n // NOTE: DOM access here\n // restores the original style properties after the offsets have been computed\n popperStyles.top = top;\n popperStyles.left = left;\n popperStyles[transformProp] = transform;\n\n options.boundaries = boundaries;\n\n var order = options.priority;\n var popper = data.offsets.popper;\n\n var check = {\n primary: function primary(placement) {\n var value = popper[placement];\n if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n value = Math.max(popper[placement], boundaries[placement]);\n }\n return defineProperty({}, placement, value);\n },\n secondary: function secondary(placement) {\n var mainSide = placement === 'right' ? 'left' : 'top';\n var value = popper[mainSide];\n if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n }\n return defineProperty({}, mainSide, value);\n }\n };\n\n order.forEach(function (placement) {\n var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n popper = _extends({}, popper, check[side](placement));\n });\n\n data.offsets.popper = popper;\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction shift(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var shiftvariation = placement.split('-')[1];\n\n // if shift shiftvariation is specified, run the modifier\n if (shiftvariation) {\n var _data$offsets = data.offsets,\n reference = _data$offsets.reference,\n popper = _data$offsets.popper;\n\n var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n var side = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n var shiftOffsets = {\n start: defineProperty({}, side, reference[side]),\n end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n };\n\n data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction hide(data) {\n if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n return data;\n }\n\n var refRect = data.offsets.reference;\n var bound = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'preventOverflow';\n }).boundaries;\n\n if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === true) {\n return data;\n }\n\n data.hide = true;\n data.attributes['x-out-of-boundaries'] = '';\n } else {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === false) {\n return data;\n }\n\n data.hide = false;\n data.attributes['x-out-of-boundaries'] = false;\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction inner(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n data.placement = getOppositePlacement(placement);\n data.offsets.popper = getClientRect(popper);\n\n return data;\n}\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.<br />\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nvar modifiers = {\n /**\n * Modifier used to shift the popper on the start or end of its reference\n * element.<br />\n * It will read the variation of the `placement` property.<br />\n * It can be one either `-end` or `-start`.\n * @memberof modifiers\n * @inner\n */\n shift: {\n /** @prop {number} order=100 - Index used to define the order of execution */\n order: 100,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: shift\n },\n\n /**\n * The `offset` modifier can shift your popper on both its axis.\n *\n * It accepts the following units:\n * - `px` or unit-less, interpreted as pixels\n * - `%` or `%r`, percentage relative to the length of the reference element\n * - `%p`, percentage relative to the length of the popper element\n * - `vw`, CSS viewport width unit\n * - `vh`, CSS viewport height unit\n *\n * For length is intended the main axis relative to the placement of the popper.<br />\n * This means that if the placement is `top` or `bottom`, the length will be the\n * `width`. In case of `left` or `right`, it will be the `height`.\n *\n * You can provide a single value (as `Number` or `String`), or a pair of values\n * as `String` divided by a comma or one (or more) white spaces.<br />\n * The latter is a deprecated method because it leads to confusion and will be\n * removed in v2.<br />\n * Additionally, it accepts additions and subtractions between different units.\n * Note that multiplications and divisions aren't supported.\n *\n * Valid examples are:\n * ```\n * 10\n * '10%'\n * '10, 10'\n * '10%, 10'\n * '10 + 10%'\n * '10 - 5vh + 3%'\n * '-10px + 5vh, 5px - 6%'\n * ```\n * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n *\n * @memberof modifiers\n * @inner\n */\n offset: {\n /** @prop {number} order=200 - Index used to define the order of execution */\n order: 200,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: offset,\n /** @prop {Number|String} offset=0\n * The offset value as described in the modifier description\n */\n offset: 0\n },\n\n /**\n * Modifier used to prevent the popper from being positioned outside the boundary.\n *\n * A scenario exists where the reference itself is not within the boundaries.<br />\n * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n * In this case we need to decide whether the popper should either:\n *\n * - detach from the reference and remain \"trapped\" in the boundaries, or\n * - if it should ignore the boundary and \"escape with its reference\"\n *\n * When `escapeWithReference` is set to`true` and reference is completely\n * outside its boundaries, the popper will overflow (or completely leave)\n * the boundaries in order to remain attached to the edge of the reference.\n *\n * @memberof modifiers\n * @inner\n */\n preventOverflow: {\n /** @prop {number} order=300 - Index used to define the order of execution */\n order: 300,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: preventOverflow,\n /**\n * @prop {Array} [priority=['left','right','top','bottom']]\n * Popper will try to prevent overflow following these priorities by default,\n * then, it could overflow on the left and on top of the `boundariesElement`\n */\n priority: ['left', 'right', 'top', 'bottom'],\n /**\n * @prop {number} padding=5\n * Amount of pixel used to define a minimum distance between the boundaries\n * and the popper. This makes sure the popper always has a little padding\n * between the edges of its container\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='scrollParent'\n * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n * `viewport` or any DOM element.\n */\n boundariesElement: 'scrollParent'\n },\n\n /**\n * Modifier used to make sure the reference and its popper stay near each other\n * without leaving any gap between the two. Especially useful when the arrow is\n * enabled and you want to ensure that it points to its reference element.\n * It cares only about the first axis. You can still have poppers with margin\n * between the popper and its reference element.\n * @memberof modifiers\n * @inner\n */\n keepTogether: {\n /** @prop {number} order=400 - Index used to define the order of execution */\n order: 400,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: keepTogether\n },\n\n /**\n * This modifier is used to move the `arrowElement` of the popper to make\n * sure it is positioned between the reference element and its popper element.\n * It will read the outer size of the `arrowElement` node to detect how many\n * pixels of conjunction are needed.\n *\n * It has no effect if no `arrowElement` is provided.\n * @memberof modifiers\n * @inner\n */\n arrow: {\n /** @prop {number} order=500 - Index used to define the order of execution */\n order: 500,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: arrow,\n /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n element: '[x-arrow]'\n },\n\n /**\n * Modifier used to flip the popper's placement when it starts to overlap its\n * reference element.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n *\n * **NOTE:** this modifier will interrupt the current update cycle and will\n * restart it if it detects the need to flip the placement.\n * @memberof modifiers\n * @inner\n */\n flip: {\n /** @prop {number} order=600 - Index used to define the order of execution */\n order: 600,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: flip,\n /**\n * @prop {String|Array} behavior='flip'\n * The behavior used to change the popper's placement. It can be one of\n * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n * placements (with optional variations)\n */\n behavior: 'flip',\n /**\n * @prop {number} padding=5\n * The popper will flip if it hits the edges of the `boundariesElement`\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='viewport'\n * The element which will define the boundaries of the popper position.\n * The popper will never be placed outside of the defined boundaries\n * (except if `keepTogether` is enabled)\n */\n boundariesElement: 'viewport',\n /**\n * @prop {Boolean} flipVariations=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the reference element overlaps its boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariations: false,\n /**\n * @prop {Boolean} flipVariationsByContent=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the popper element overlaps its reference boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariationsByContent: false\n },\n\n /**\n * Modifier used to make the popper flow toward the inner of the reference element.\n * By default, when this modifier is disabled, the popper will be placed outside\n * the reference element.\n * @memberof modifiers\n * @inner\n */\n inner: {\n /** @prop {number} order=700 - Index used to define the order of execution */\n order: 700,\n /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n enabled: false,\n /** @prop {ModifierFn} */\n fn: inner\n },\n\n /**\n * Modifier used to hide the popper when its reference element is outside of the\n * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n * be used to hide with a CSS selector the popper when its reference is\n * out of boundaries.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n * @memberof modifiers\n * @inner\n */\n hide: {\n /** @prop {number} order=800 - Index used to define the order of execution */\n order: 800,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: hide\n },\n\n /**\n * Computes the style that will be applied to the popper element to gets\n * properly positioned.\n *\n * Note that this modifier will not touch the DOM, it just prepares the styles\n * so that `applyStyle` modifier can apply it. This separation is useful\n * in case you need to replace `applyStyle` with a custom implementation.\n *\n * This modifier has `850` as `order` value to maintain backward compatibility\n * with previous versions of Popper.js. Expect the modifiers ordering method\n * to change in future major versions of the library.\n *\n * @memberof modifiers\n * @inner\n */\n computeStyle: {\n /** @prop {number} order=850 - Index used to define the order of execution */\n order: 850,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: computeStyle,\n /**\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: true,\n /**\n * @prop {string} [x='bottom']\n * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n * Change this if your popper should grow in a direction different from `bottom`\n */\n x: 'bottom',\n /**\n * @prop {string} [x='left']\n * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n * Change this if your popper should grow in a direction different from `right`\n */\n y: 'right'\n },\n\n /**\n * Applies the computed styles to the popper element.\n *\n * All the DOM manipulations are limited to this modifier. This is useful in case\n * you want to integrate Popper.js inside a framework or view library and you\n * want to delegate all the DOM manipulations to it.\n *\n * Note that if you disable this modifier, you must make sure the popper element\n * has its position set to `absolute` before Popper.js can do its work!\n *\n * Just disable this modifier and define your own to achieve the desired effect.\n *\n * @memberof modifiers\n * @inner\n */\n applyStyle: {\n /** @prop {number} order=900 - Index used to define the order of execution */\n order: 900,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: applyStyle,\n /** @prop {Function} */\n onLoad: applyStyleOnLoad,\n /**\n * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: undefined\n }\n};\n\n/**\n * The `dataObject` is an object containing all the information used by Popper.js.\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n\n/**\n * Default options provided to Popper.js constructor.<br />\n * These can be overridden using the `options` argument of Popper.js.<br />\n * To override an option, simply pass an object with the same\n * structure of the `options` object, as the 3rd argument. For example:\n * ```\n * new Popper(ref, pop, {\n * modifiers: {\n * preventOverflow: { enabled: false }\n * }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nvar Defaults = {\n /**\n * Popper's placement.\n * @prop {Popper.placements} placement='bottom'\n */\n placement: 'bottom',\n\n /**\n * Set this to true if you want popper to position it self in 'fixed' mode\n * @prop {Boolean} positionFixed=false\n */\n positionFixed: false,\n\n /**\n * Whether events (resize, scroll) are initially enabled.\n * @prop {Boolean} eventsEnabled=true\n */\n eventsEnabled: true,\n\n /**\n * Set to true if you want to automatically remove the popper when\n * you call the `destroy` method.\n * @prop {Boolean} removeOnDestroy=false\n */\n removeOnDestroy: false,\n\n /**\n * Callback called when the popper is created.<br />\n * By default, it is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onCreate}\n */\n onCreate: function onCreate() {},\n\n /**\n * Callback called when the popper is updated. This callback is not called\n * on the initialization/creation of the popper, but only on subsequent\n * updates.<br />\n * By default, it is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onUpdate}\n */\n onUpdate: function onUpdate() {},\n\n /**\n * List of modifiers used to modify the offsets before they are applied to the popper.\n * They provide most of the functionalities of Popper.js.\n * @prop {modifiers}\n */\n modifiers: modifiers\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n\n// Utils\n// Methods\nvar Popper = function () {\n /**\n * Creates a new Popper.js instance.\n * @class Popper\n * @param {Element|referenceObject} reference - The reference element used to position the popper\n * @param {Element} popper - The HTML / XML element used as the popper\n * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n * @return {Object} instance - The generated Popper.js instance\n */\n function Popper(reference, popper) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n classCallCheck(this, Popper);\n\n this.scheduleUpdate = function () {\n return requestAnimationFrame(_this.update);\n };\n\n // make update() debounced, so that it only runs at most once-per-tick\n this.update = debounce(this.update.bind(this));\n\n // with {} we create a new object with the options inside it\n this.options = _extends({}, Popper.Defaults, options);\n\n // init state\n this.state = {\n isDestroyed: false,\n isCreated: false,\n scrollParents: []\n };\n\n // get reference and popper elements (allow jQuery wrappers)\n this.reference = reference && reference.jquery ? reference[0] : reference;\n this.popper = popper && popper.jquery ? popper[0] : popper;\n\n // Deep merge modifiers options\n this.options.modifiers = {};\n Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n });\n\n // Refactoring modifiers' list (Object => Array)\n this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n return _extends({\n name: name\n }, _this.options.modifiers[name]);\n })\n // sort the modifiers by order\n .sort(function (a, b) {\n return a.order - b.order;\n });\n\n // modifiers have the ability to execute arbitrary code when Popper.js get inited\n // such code is executed in the same order of its modifier\n // they could add new properties to their options configuration\n // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n this.modifiers.forEach(function (modifierOptions) {\n if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n }\n });\n\n // fire the first update to position the popper in the right place\n this.update();\n\n var eventsEnabled = this.options.eventsEnabled;\n if (eventsEnabled) {\n // setup event listeners, they will take care of update the position in specific situations\n this.enableEventListeners();\n }\n\n this.state.eventsEnabled = eventsEnabled;\n }\n\n // We can't use class properties because they don't get listed in the\n // class prototype and break stuff like Sinon stubs\n\n\n createClass(Popper, [{\n key: 'update',\n value: function update$$1() {\n return update.call(this);\n }\n }, {\n key: 'destroy',\n value: function destroy$$1() {\n return destroy.call(this);\n }\n }, {\n key: 'enableEventListeners',\n value: function enableEventListeners$$1() {\n return enableEventListeners.call(this);\n }\n }, {\n key: 'disableEventListeners',\n value: function disableEventListeners$$1() {\n return disableEventListeners.call(this);\n }\n\n /**\n * Schedules an update. It will run on the next UI update available.\n * @method scheduleUpdate\n * @memberof Popper\n */\n\n\n /**\n * Collection of utilities useful when writing custom modifiers.\n * Starting from version 1.7, this method is available only if you\n * include `popper-utils.js` before `popper.js`.\n *\n * **DEPRECATION**: This way to access PopperUtils is deprecated\n * and will be removed in v2! Use the PopperUtils module directly instead.\n * Due to the high instability of the methods contained in Utils, we can't\n * guarantee them to follow semver. Use them at your own risk!\n * @static\n * @private\n * @type {Object}\n * @deprecated since version 1.8\n * @member Utils\n * @memberof Popper\n */\n\n }]);\n return Popper;\n}();\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.<br />\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10.\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n\n\nPopper.Utils = (typeof window !== 'undefined' ? window : __webpack_require__.g).PopperUtils;\nPopper.placements = placements;\nPopper.Defaults = Defaults;\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Popper);\n//# sourceMappingURL=popper.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcG9wcGVyLmpzL2Rpc3QvZXNtL3BvcHBlci5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixrQ0FBa0M7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkIsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLEtBQUs7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsU0FBUztBQUN2QixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxnQkFBZ0I7QUFDM0IsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsU0FBUztBQUN2QixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCLGNBQWMsU0FBUztBQUN2QixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFNBQVM7QUFDdkIsY0FBYyxRQUFRO0FBQ3RCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsU0FBUztBQUNwQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcscUJBQXFCO0FBQ2hDO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksUUFBUTtBQUNwQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7Ozs7QUFNRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLHNCQUFzQjtBQUN4Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCLGNBQWMsU0FBUztBQUN2QixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCLGFBQWEsU0FBUztBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLFFBQVE7QUFDbkIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsU0FBUztBQUNwQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBOztBQUVBOztBQUVBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxPQUFPO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCLFdBQVcsT0FBTztBQUNsQixXQUFXLFFBQVE7QUFDbkIsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkLG1CQUFtQjtBQUNuQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IscUJBQXFCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxlQUFlOztBQUU1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RSxlQUFlOztBQUV0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsU0FBUztBQUN2QixjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFNBQVM7QUFDdkIsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCLHdEQUF3RDs7QUFFOUU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEIsY0FBYyxTQUFTO0FBQ3ZCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQkFBK0I7QUFDL0IsMkJBQTJCO0FBQzNCLGdDQUFnQzs7QUFFaEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdEOztBQUVoRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QixjQUFjLFNBQVM7QUFDdkIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsdUNBQXVDOztBQUV2QztBQUNBO0FBQ0Es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Q1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxVQUFVO0FBQ3hCO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7OztBQUdBLHlEQUF5RCxxQkFBTTtBQUMvRDtBQUNBOztBQUVBLGlFQUFlLE1BQU0sRUFBQztBQUN0QiIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wb3BwZXIuanMvZGlzdC9lc20vcG9wcGVyLmpzP2VhMjYiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIVxuICogQGZpbGVPdmVydmlldyBLaWNrYXNzIGxpYnJhcnkgdG8gY3JlYXRlIGFuZCBwbGFjZSBwb3BwZXJzIG5lYXIgdGhlaXIgcmVmZXJlbmNlIGVsZW1lbnRzLlxuICogQHZlcnNpb24gMS4xNi4xXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2IEZlZGVyaWNvIFppdm9sbyBhbmQgY29udHJpYnV0b3JzXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xudmFyIGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCc7XG5cbnZhciB0aW1lb3V0RHVyYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsb25nZXJUaW1lb3V0QnJvd3NlcnMgPSBbJ0VkZ2UnLCAnVHJpZGVudCcsICdGaXJlZm94J107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbG9uZ2VyVGltZW91dEJyb3dzZXJzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKGlzQnJvd3NlciAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YobG9uZ2VyVGltZW91dEJyb3dzZXJzW2ldKSA+PSAwKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59KCk7XG5cbmZ1bmN0aW9uIG1pY3JvdGFza0RlYm91bmNlKGZuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2FsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgd2luZG93LlByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGVkID0gZmFsc2U7XG4gICAgICBmbigpO1xuICAgIH0pO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0YXNrRGVib3VuY2UoZm4pIHtcbiAgdmFyIHNjaGVkdWxlZCA9IGZhbHNlO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghc2NoZWR1bGVkKSB7XG4gICAgICBzY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNjaGVkdWxlZCA9IGZhbHNlO1xuICAgICAgICBmbigpO1xuICAgICAgfSwgdGltZW91dER1cmF0aW9uKTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBzdXBwb3J0c01pY3JvVGFza3MgPSBpc0Jyb3dzZXIgJiYgd2luZG93LlByb21pc2U7XG5cbi8qKlxuKiBDcmVhdGUgYSBkZWJvdW5jZWQgdmVyc2lvbiBvZiBhIG1ldGhvZCwgdGhhdCdzIGFzeW5jaHJvbm91c2x5IGRlZmVycmVkXG4qIGJ1dCBjYWxsZWQgaW4gdGhlIG1pbmltdW0gdGltZSBwb3NzaWJsZS5cbipcbiogQG1ldGhvZFxuKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4qIEBhcmd1bWVudCB7RnVuY3Rpb259IGZuXG4qIEByZXR1cm5zIHtGdW5jdGlvbn1cbiovXG52YXIgZGVib3VuY2UgPSBzdXBwb3J0c01pY3JvVGFza3MgPyBtaWNyb3Rhc2tEZWJvdW5jZSA6IHRhc2tEZWJvdW5jZTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYSBmdW5jdGlvblxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtBbnl9IGZ1bmN0aW9uVG9DaGVjayAtIHZhcmlhYmxlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYW5zd2VyIHRvOiBpcyBhIGZ1bmN0aW9uP1xuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGZ1bmN0aW9uVG9DaGVjaykge1xuICB2YXIgZ2V0VHlwZSA9IHt9O1xuICByZXR1cm4gZnVuY3Rpb25Ub0NoZWNrICYmIGdldFR5cGUudG9TdHJpbmcuY2FsbChmdW5jdGlvblRvQ2hlY2spID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufVxuXG4vKipcbiAqIEdldCBDU1MgY29tcHV0ZWQgcHJvcGVydHkgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWVtZW50fSBlbGVtZW50XG4gKiBAYXJndW1lbnQge1N0cmluZ30gcHJvcGVydHlcbiAqL1xuZnVuY3Rpb24gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQsIHByb3BlcnR5KSB7XG4gIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9PSAxKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlXG4gIHZhciB3aW5kb3cgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gIHZhciBjc3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCBudWxsKTtcbiAgcmV0dXJuIHByb3BlcnR5ID8gY3NzW3Byb3BlcnR5XSA6IGNzcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXJlbnROb2RlIG9yIHRoZSBob3N0IG9mIHRoZSBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtFbGVtZW50fSBwYXJlbnRcbiAqL1xuZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZShlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50Lm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuICByZXR1cm4gZWxlbWVudC5wYXJlbnROb2RlIHx8IGVsZW1lbnQuaG9zdDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzY3JvbGxpbmcgcGFyZW50IG9mIHRoZSBnaXZlbiBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtFbGVtZW50fSBzY3JvbGwgcGFyZW50XG4gKi9cbmZ1bmN0aW9uIGdldFNjcm9sbFBhcmVudChlbGVtZW50KSB7XG4gIC8vIFJldHVybiBib2R5LCBgZ2V0U2Nyb2xsYCB3aWxsIHRha2UgY2FyZSB0byBnZXQgdGhlIGNvcnJlY3QgYHNjcm9sbFRvcGAgZnJvbSBpdFxuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuYm9keTtcbiAgfVxuXG4gIHN3aXRjaCAoZWxlbWVudC5ub2RlTmFtZSkge1xuICAgIGNhc2UgJ0hUTUwnOlxuICAgIGNhc2UgJ0JPRFknOlxuICAgICAgcmV0dXJuIGVsZW1lbnQub3duZXJEb2N1bWVudC5ib2R5O1xuICAgIGNhc2UgJyNkb2N1bWVudCc6XG4gICAgICByZXR1cm4gZWxlbWVudC5ib2R5O1xuICB9XG5cbiAgLy8gRmlyZWZveCB3YW50IHVzIHRvIGNoZWNrIGAteGAgYW5kIGAteWAgdmFyaWF0aW9ucyBhcyB3ZWxsXG5cbiAgdmFyIF9nZXRTdHlsZUNvbXB1dGVkUHJvcCA9IGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShlbGVtZW50KSxcbiAgICAgIG92ZXJmbG93ID0gX2dldFN0eWxlQ29tcHV0ZWRQcm9wLm92ZXJmbG93LFxuICAgICAgb3ZlcmZsb3dYID0gX2dldFN0eWxlQ29tcHV0ZWRQcm9wLm92ZXJmbG93WCxcbiAgICAgIG92ZXJmbG93WSA9IF9nZXRTdHlsZUNvbXB1dGVkUHJvcC5vdmVyZmxvd1k7XG5cbiAgaWYgKC8oYXV0b3xzY3JvbGx8b3ZlcmxheSkvLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gZ2V0U2Nyb2xsUGFyZW50KGdldFBhcmVudE5vZGUoZWxlbWVudCkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlZmVyZW5jZSBub2RlIG9mIHRoZSByZWZlcmVuY2Ugb2JqZWN0LCBvciB0aGUgcmVmZXJlbmNlIG9iamVjdCBpdHNlbGYuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSByZWZlcmVuY2UgLSB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgKHRoZSBwb3BwZXIgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGlzKVxuICogQHJldHVybnMge0VsZW1lbnR9IHBhcmVudFxuICovXG5mdW5jdGlvbiBnZXRSZWZlcmVuY2VOb2RlKHJlZmVyZW5jZSkge1xuICByZXR1cm4gcmVmZXJlbmNlICYmIHJlZmVyZW5jZS5yZWZlcmVuY2VOb2RlID8gcmVmZXJlbmNlLnJlZmVyZW5jZU5vZGUgOiByZWZlcmVuY2U7XG59XG5cbnZhciBpc0lFMTEgPSBpc0Jyb3dzZXIgJiYgISEod2luZG93Lk1TSW5wdXRNZXRob2RDb250ZXh0ICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSk7XG52YXIgaXNJRTEwID0gaXNCcm93c2VyICYmIC9NU0lFIDEwLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGJyb3dzZXIgaXMgSW50ZXJuZXQgRXhwbG9yZXJcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7TnVtYmVyfSB2ZXJzaW9uIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXNJRVxuICovXG5mdW5jdGlvbiBpc0lFKHZlcnNpb24pIHtcbiAgaWYgKHZlcnNpb24gPT09IDExKSB7XG4gICAgcmV0dXJuIGlzSUUxMTtcbiAgfVxuICBpZiAodmVyc2lvbiA9PT0gMTApIHtcbiAgICByZXR1cm4gaXNJRTEwO1xuICB9XG4gIHJldHVybiBpc0lFMTEgfHwgaXNJRTEwO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG9mZnNldCBwYXJlbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IG9mZnNldCBwYXJlbnRcbiAqL1xuZnVuY3Rpb24gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfVxuXG4gIHZhciBub09mZnNldFBhcmVudCA9IGlzSUUoMTApID8gZG9jdW1lbnQuYm9keSA6IG51bGw7XG5cbiAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmVcbiAgdmFyIG9mZnNldFBhcmVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50IHx8IG51bGw7XG4gIC8vIFNraXAgaGlkZGVuIGVsZW1lbnRzIHdoaWNoIGRvbid0IGhhdmUgYW4gb2Zmc2V0UGFyZW50XG4gIHdoaWxlIChvZmZzZXRQYXJlbnQgPT09IG5vT2Zmc2V0UGFyZW50ICYmIGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKSB7XG4gICAgb2Zmc2V0UGFyZW50ID0gKGVsZW1lbnQgPSBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZykub2Zmc2V0UGFyZW50O1xuICB9XG5cbiAgdmFyIG5vZGVOYW1lID0gb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudC5ub2RlTmFtZTtcblxuICBpZiAoIW5vZGVOYW1lIHx8IG5vZGVOYW1lID09PSAnQk9EWScgfHwgbm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgIHJldHVybiBlbGVtZW50ID8gZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCA6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfVxuXG4gIC8vIC5vZmZzZXRQYXJlbnQgd2lsbCByZXR1cm4gdGhlIGNsb3Nlc3QgVEgsIFREIG9yIFRBQkxFIGluIGNhc2VcbiAgLy8gbm8gb2Zmc2V0UGFyZW50IGlzIHByZXNlbnQsIEkgaGF0ZSB0aGlzIGpvYi4uLlxuICBpZiAoWydUSCcsICdURCcsICdUQUJMRSddLmluZGV4T2Yob2Zmc2V0UGFyZW50Lm5vZGVOYW1lKSAhPT0gLTEgJiYgZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KG9mZnNldFBhcmVudCwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSB7XG4gICAgcmV0dXJuIGdldE9mZnNldFBhcmVudChvZmZzZXRQYXJlbnQpO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudDtcbn1cblxuZnVuY3Rpb24gaXNPZmZzZXRDb250YWluZXIoZWxlbWVudCkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lO1xuXG4gIGlmIChub2RlTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBub2RlTmFtZSA9PT0gJ0hUTUwnIHx8IGdldE9mZnNldFBhcmVudChlbGVtZW50LmZpcnN0RWxlbWVudENoaWxkKSA9PT0gZWxlbWVudDtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgcm9vdCBub2RlIChkb2N1bWVudCwgc2hhZG93RE9NIHJvb3QpIG9mIHRoZSBnaXZlbiBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IG5vZGVcbiAqIEByZXR1cm5zIHtFbGVtZW50fSByb290IG5vZGVcbiAqL1xuZnVuY3Rpb24gZ2V0Um9vdChub2RlKSB7XG4gIGlmIChub2RlLnBhcmVudE5vZGUgIT09IG51bGwpIHtcbiAgICByZXR1cm4gZ2V0Um9vdChub2RlLnBhcmVudE5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIG9mZnNldCBwYXJlbnQgY29tbW9uIHRvIHRoZSB0d28gcHJvdmlkZWQgbm9kZXNcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudDFcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudDJcbiAqIEByZXR1cm5zIHtFbGVtZW50fSBjb21tb24gb2Zmc2V0IHBhcmVudFxuICovXG5mdW5jdGlvbiBmaW5kQ29tbW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQxLCBlbGVtZW50Mikge1xuICAvLyBUaGlzIGNoZWNrIGlzIG5lZWRlZCB0byBhdm9pZCBlcnJvcnMgaW4gY2FzZSBvbmUgb2YgdGhlIGVsZW1lbnRzIGlzbid0IGRlZmluZWQgZm9yIGFueSByZWFzb25cbiAgaWYgKCFlbGVtZW50MSB8fCAhZWxlbWVudDEubm9kZVR5cGUgfHwgIWVsZW1lbnQyIHx8ICFlbGVtZW50Mi5ub2RlVHlwZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cblxuICAvLyBIZXJlIHdlIG1ha2Ugc3VyZSB0byBnaXZlIGFzIFwic3RhcnRcIiB0aGUgZWxlbWVudCB0aGF0IGNvbWVzIGZpcnN0IGluIHRoZSBET01cbiAgdmFyIG9yZGVyID0gZWxlbWVudDEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZWxlbWVudDIpICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkc7XG4gIHZhciBzdGFydCA9IG9yZGVyID8gZWxlbWVudDEgOiBlbGVtZW50MjtcbiAgdmFyIGVuZCA9IG9yZGVyID8gZWxlbWVudDIgOiBlbGVtZW50MTtcblxuICAvLyBHZXQgY29tbW9uIGFuY2VzdG9yIGNvbnRhaW5lclxuICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICByYW5nZS5zZXRTdGFydChzdGFydCwgMCk7XG4gIHJhbmdlLnNldEVuZChlbmQsIDApO1xuICB2YXIgY29tbW9uQW5jZXN0b3JDb250YWluZXIgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAvLyBCb3RoIG5vZGVzIGFyZSBpbnNpZGUgI2RvY3VtZW50XG5cbiAgaWYgKGVsZW1lbnQxICE9PSBjb21tb25BbmNlc3RvckNvbnRhaW5lciAmJiBlbGVtZW50MiAhPT0gY29tbW9uQW5jZXN0b3JDb250YWluZXIgfHwgc3RhcnQuY29udGFpbnMoZW5kKSkge1xuICAgIGlmIChpc09mZnNldENvbnRhaW5lcihjb21tb25BbmNlc3RvckNvbnRhaW5lcikpIHtcbiAgICAgIHJldHVybiBjb21tb25BbmNlc3RvckNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0T2Zmc2V0UGFyZW50KGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKTtcbiAgfVxuXG4gIC8vIG9uZSBvZiB0aGUgbm9kZXMgaXMgaW5zaWRlIHNoYWRvd0RPTSwgZmluZCB3aGljaCBvbmVcbiAgdmFyIGVsZW1lbnQxcm9vdCA9IGdldFJvb3QoZWxlbWVudDEpO1xuICBpZiAoZWxlbWVudDFyb290Lmhvc3QpIHtcbiAgICByZXR1cm4gZmluZENvbW1vbk9mZnNldFBhcmVudChlbGVtZW50MXJvb3QuaG9zdCwgZWxlbWVudDIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmaW5kQ29tbW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQxLCBnZXRSb290KGVsZW1lbnQyKS5ob3N0KTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgdGhlIHNjcm9sbCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBpbiB0aGUgZ2l2ZW4gc2lkZSAodG9wIGFuZCBsZWZ0KVxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAYXJndW1lbnQge1N0cmluZ30gc2lkZSBgdG9wYCBvciBgbGVmdGBcbiAqIEByZXR1cm5zIHtudW1iZXJ9IGFtb3VudCBvZiBzY3JvbGxlZCBwaXhlbHNcbiAqL1xuZnVuY3Rpb24gZ2V0U2Nyb2xsKGVsZW1lbnQpIHtcbiAgdmFyIHNpZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICd0b3AnO1xuXG4gIHZhciB1cHBlclNpZGUgPSBzaWRlID09PSAndG9wJyA/ICdzY3JvbGxUb3AnIDogJ3Njcm9sbExlZnQnO1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lO1xuXG4gIGlmIChub2RlTmFtZSA9PT0gJ0JPRFknIHx8IG5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICB2YXIgaHRtbCA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgdmFyIHNjcm9sbGluZ0VsZW1lbnQgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCB8fCBodG1sO1xuICAgIHJldHVybiBzY3JvbGxpbmdFbGVtZW50W3VwcGVyU2lkZV07XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFt1cHBlclNpZGVdO1xufVxuXG4vKlxuICogU3VtIG9yIHN1YnRyYWN0IHRoZSBlbGVtZW50IHNjcm9sbCB2YWx1ZXMgKGxlZnQgYW5kIHRvcCkgZnJvbSBhIGdpdmVuIHJlY3Qgb2JqZWN0XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge09iamVjdH0gcmVjdCAtIFJlY3Qgb2JqZWN0IHlvdSB3YW50IHRvIGNoYW5nZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IGZyb20gdGhlIGZ1bmN0aW9uIHJlYWRzIHRoZSBzY3JvbGwgdmFsdWVzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHN1YnRyYWN0IC0gc2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gc3VidHJhY3QgdGhlIHNjcm9sbCB2YWx1ZXNcbiAqIEByZXR1cm4ge09iamVjdH0gcmVjdCAtIFRoZSBtb2RpZmllciByZWN0IG9iamVjdFxuICovXG5mdW5jdGlvbiBpbmNsdWRlU2Nyb2xsKHJlY3QsIGVsZW1lbnQpIHtcbiAgdmFyIHN1YnRyYWN0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcblxuICB2YXIgc2Nyb2xsVG9wID0gZ2V0U2Nyb2xsKGVsZW1lbnQsICd0b3AnKTtcbiAgdmFyIHNjcm9sbExlZnQgPSBnZXRTY3JvbGwoZWxlbWVudCwgJ2xlZnQnKTtcbiAgdmFyIG1vZGlmaWVyID0gc3VidHJhY3QgPyAtMSA6IDE7XG4gIHJlY3QudG9wICs9IHNjcm9sbFRvcCAqIG1vZGlmaWVyO1xuICByZWN0LmJvdHRvbSArPSBzY3JvbGxUb3AgKiBtb2RpZmllcjtcbiAgcmVjdC5sZWZ0ICs9IHNjcm9sbExlZnQgKiBtb2RpZmllcjtcbiAgcmVjdC5yaWdodCArPSBzY3JvbGxMZWZ0ICogbW9kaWZpZXI7XG4gIHJldHVybiByZWN0O1xufVxuXG4vKlxuICogSGVscGVyIHRvIGRldGVjdCBib3JkZXJzIG9mIGEgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtDU1NTdHlsZURlY2xhcmF0aW9ufSBzdHlsZXNcbiAqIFJlc3VsdCBvZiBgZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5YCBvbiB0aGUgZ2l2ZW4gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IGF4aXMgLSBgeGAgb3IgYHlgXG4gKiBAcmV0dXJuIHtudW1iZXJ9IGJvcmRlcnMgLSBUaGUgYm9yZGVycyBzaXplIG9mIHRoZSBnaXZlbiBheGlzXG4gKi9cblxuZnVuY3Rpb24gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzLCBheGlzKSB7XG4gIHZhciBzaWRlQSA9IGF4aXMgPT09ICd4JyA/ICdMZWZ0JyA6ICdUb3AnO1xuICB2YXIgc2lkZUIgPSBzaWRlQSA9PT0gJ0xlZnQnID8gJ1JpZ2h0JyA6ICdCb3R0b20nO1xuXG4gIHJldHVybiBwYXJzZUZsb2F0KHN0eWxlc1snYm9yZGVyJyArIHNpZGVBICsgJ1dpZHRoJ10pICsgcGFyc2VGbG9hdChzdHlsZXNbJ2JvcmRlcicgKyBzaWRlQiArICdXaWR0aCddKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2l6ZShheGlzLCBib2R5LCBodG1sLCBjb21wdXRlZFN0eWxlKSB7XG4gIHJldHVybiBNYXRoLm1heChib2R5WydvZmZzZXQnICsgYXhpc10sIGJvZHlbJ3Njcm9sbCcgKyBheGlzXSwgaHRtbFsnY2xpZW50JyArIGF4aXNdLCBodG1sWydvZmZzZXQnICsgYXhpc10sIGh0bWxbJ3Njcm9sbCcgKyBheGlzXSwgaXNJRSgxMCkgPyBwYXJzZUludChodG1sWydvZmZzZXQnICsgYXhpc10pICsgcGFyc2VJbnQoY29tcHV0ZWRTdHlsZVsnbWFyZ2luJyArIChheGlzID09PSAnSGVpZ2h0JyA/ICdUb3AnIDogJ0xlZnQnKV0pICsgcGFyc2VJbnQoY29tcHV0ZWRTdHlsZVsnbWFyZ2luJyArIChheGlzID09PSAnSGVpZ2h0JyA/ICdCb3R0b20nIDogJ1JpZ2h0JyldKSA6IDApO1xufVxuXG5mdW5jdGlvbiBnZXRXaW5kb3dTaXplcyhkb2N1bWVudCkge1xuICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gIHZhciBodG1sID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB2YXIgY29tcHV0ZWRTdHlsZSA9IGlzSUUoMTApICYmIGdldENvbXB1dGVkU3R5bGUoaHRtbCk7XG5cbiAgcmV0dXJuIHtcbiAgICBoZWlnaHQ6IGdldFNpemUoJ0hlaWdodCcsIGJvZHksIGh0bWwsIGNvbXB1dGVkU3R5bGUpLFxuICAgIHdpZHRoOiBnZXRTaXplKCdXaWR0aCcsIGJvZHksIGh0bWwsIGNvbXB1dGVkU3R5bGUpXG4gIH07XG59XG5cbnZhciBjbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59O1xuXG52YXIgY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH07XG59KCk7XG5cblxuXG5cblxudmFyIGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTtcblxuLyoqXG4gKiBHaXZlbiBlbGVtZW50IG9mZnNldHMsIGdlbmVyYXRlIGFuIG91dHB1dCBzaW1pbGFyIHRvIGdldEJvdW5kaW5nQ2xpZW50UmVjdFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IG9mZnNldHNcbiAqIEByZXR1cm5zIHtPYmplY3R9IENsaWVudFJlY3QgbGlrZSBvdXRwdXRcbiAqL1xuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdChvZmZzZXRzKSB7XG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgb2Zmc2V0cywge1xuICAgIHJpZ2h0OiBvZmZzZXRzLmxlZnQgKyBvZmZzZXRzLndpZHRoLFxuICAgIGJvdHRvbTogb2Zmc2V0cy50b3AgKyBvZmZzZXRzLmhlaWdodFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgYm91bmRpbmcgY2xpZW50IHJlY3Qgb2YgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybiB7T2JqZWN0fSBjbGllbnQgcmVjdFxuICovXG5mdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCkge1xuICB2YXIgcmVjdCA9IHt9O1xuXG4gIC8vIElFMTAgMTAgRklYOiBQbGVhc2UsIGRvbid0IGFzaywgdGhlIGVsZW1lbnQgaXNuJ3RcbiAgLy8gY29uc2lkZXJlZCBpbiBET00gaW4gc29tZSBjaXJjdW1zdGFuY2VzLi4uXG4gIC8vIFRoaXMgaXNuJ3QgcmVwcm9kdWNpYmxlIGluIElFMTAgY29tcGF0aWJpbGl0eSBtb2RlIG9mIElFMTFcbiAgdHJ5IHtcbiAgICBpZiAoaXNJRSgxMCkpIHtcbiAgICAgIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIHNjcm9sbFRvcCA9IGdldFNjcm9sbChlbGVtZW50LCAndG9wJyk7XG4gICAgICB2YXIgc2Nyb2xsTGVmdCA9IGdldFNjcm9sbChlbGVtZW50LCAnbGVmdCcpO1xuICAgICAgcmVjdC50b3AgKz0gc2Nyb2xsVG9wO1xuICAgICAgcmVjdC5sZWZ0ICs9IHNjcm9sbExlZnQ7XG4gICAgICByZWN0LmJvdHRvbSArPSBzY3JvbGxUb3A7XG4gICAgICByZWN0LnJpZ2h0ICs9IHNjcm9sbExlZnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0ge1xuICAgIGxlZnQ6IHJlY3QubGVmdCxcbiAgICB0b3A6IHJlY3QudG9wLFxuICAgIHdpZHRoOiByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LFxuICAgIGhlaWdodDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuICB9O1xuXG4gIC8vIHN1YnRyYWN0IHNjcm9sbGJhciBzaXplIGZyb20gc2l6ZXNcbiAgdmFyIHNpemVzID0gZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0hUTUwnID8gZ2V0V2luZG93U2l6ZXMoZWxlbWVudC5vd25lckRvY3VtZW50KSA6IHt9O1xuICB2YXIgd2lkdGggPSBzaXplcy53aWR0aCB8fCBlbGVtZW50LmNsaWVudFdpZHRoIHx8IHJlc3VsdC53aWR0aDtcbiAgdmFyIGhlaWdodCA9IHNpemVzLmhlaWdodCB8fCBlbGVtZW50LmNsaWVudEhlaWdodCB8fCByZXN1bHQuaGVpZ2h0O1xuXG4gIHZhciBob3JpelNjcm9sbGJhciA9IGVsZW1lbnQub2Zmc2V0V2lkdGggLSB3aWR0aDtcbiAgdmFyIHZlcnRTY3JvbGxiYXIgPSBlbGVtZW50Lm9mZnNldEhlaWdodCAtIGhlaWdodDtcblxuICAvLyBpZiBhbiBoeXBvdGhldGljYWwgc2Nyb2xsYmFyIGlzIGRldGVjdGVkLCB3ZSBtdXN0IGJlIHN1cmUgaXQncyBub3QgYSBgYm9yZGVyYFxuICAvLyB3ZSBtYWtlIHRoaXMgY2hlY2sgY29uZGl0aW9uYWwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnNcbiAgaWYgKGhvcml6U2Nyb2xsYmFyIHx8IHZlcnRTY3JvbGxiYXIpIHtcbiAgICB2YXIgc3R5bGVzID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQpO1xuICAgIGhvcml6U2Nyb2xsYmFyIC09IGdldEJvcmRlcnNTaXplKHN0eWxlcywgJ3gnKTtcbiAgICB2ZXJ0U2Nyb2xsYmFyIC09IGdldEJvcmRlcnNTaXplKHN0eWxlcywgJ3knKTtcblxuICAgIHJlc3VsdC53aWR0aCAtPSBob3JpelNjcm9sbGJhcjtcbiAgICByZXN1bHQuaGVpZ2h0IC09IHZlcnRTY3JvbGxiYXI7XG4gIH1cblxuICByZXR1cm4gZ2V0Q2xpZW50UmVjdChyZXN1bHQpO1xufVxuXG5mdW5jdGlvbiBnZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUoY2hpbGRyZW4sIHBhcmVudCkge1xuICB2YXIgZml4ZWRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG5cbiAgdmFyIGlzSUUxMCA9IGlzSUUoMTApO1xuICB2YXIgaXNIVE1MID0gcGFyZW50Lm5vZGVOYW1lID09PSAnSFRNTCc7XG4gIHZhciBjaGlsZHJlblJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoY2hpbGRyZW4pO1xuICB2YXIgcGFyZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChwYXJlbnQpO1xuICB2YXIgc2Nyb2xsUGFyZW50ID0gZ2V0U2Nyb2xsUGFyZW50KGNoaWxkcmVuKTtcblxuICB2YXIgc3R5bGVzID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KHBhcmVudCk7XG4gIHZhciBib3JkZXJUb3BXaWR0aCA9IHBhcnNlRmxvYXQoc3R5bGVzLmJvcmRlclRvcFdpZHRoKTtcbiAgdmFyIGJvcmRlckxlZnRXaWR0aCA9IHBhcnNlRmxvYXQoc3R5bGVzLmJvcmRlckxlZnRXaWR0aCk7XG5cbiAgLy8gSW4gY2FzZXMgd2hlcmUgdGhlIHBhcmVudCBpcyBmaXhlZCwgd2UgbXVzdCBpZ25vcmUgbmVnYXRpdmUgc2Nyb2xsIGluIG9mZnNldCBjYWxjXG4gIGlmIChmaXhlZFBvc2l0aW9uICYmIGlzSFRNTCkge1xuICAgIHBhcmVudFJlY3QudG9wID0gTWF0aC5tYXgocGFyZW50UmVjdC50b3AsIDApO1xuICAgIHBhcmVudFJlY3QubGVmdCA9IE1hdGgubWF4KHBhcmVudFJlY3QubGVmdCwgMCk7XG4gIH1cbiAgdmFyIG9mZnNldHMgPSBnZXRDbGllbnRSZWN0KHtcbiAgICB0b3A6IGNoaWxkcmVuUmVjdC50b3AgLSBwYXJlbnRSZWN0LnRvcCAtIGJvcmRlclRvcFdpZHRoLFxuICAgIGxlZnQ6IGNoaWxkcmVuUmVjdC5sZWZ0IC0gcGFyZW50UmVjdC5sZWZ0IC0gYm9yZGVyTGVmdFdpZHRoLFxuICAgIHdpZHRoOiBjaGlsZHJlblJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiBjaGlsZHJlblJlY3QuaGVpZ2h0XG4gIH0pO1xuICBvZmZzZXRzLm1hcmdpblRvcCA9IDA7XG4gIG9mZnNldHMubWFyZ2luTGVmdCA9IDA7XG5cbiAgLy8gU3VidHJhY3QgbWFyZ2lucyBvZiBkb2N1bWVudEVsZW1lbnQgaW4gY2FzZSBpdCdzIGJlaW5nIHVzZWQgYXMgcGFyZW50XG4gIC8vIHdlIGRvIHRoaXMgb25seSBvbiBIVE1MIGJlY2F1c2UgaXQncyB0aGUgb25seSBlbGVtZW50IHRoYXQgYmVoYXZlc1xuICAvLyBkaWZmZXJlbnRseSB3aGVuIG1hcmdpbnMgYXJlIGFwcGxpZWQgdG8gaXQuIFRoZSBtYXJnaW5zIGFyZSBpbmNsdWRlZCBpblxuICAvLyB0aGUgYm94IG9mIHRoZSBkb2N1bWVudEVsZW1lbnQsIGluIHRoZSBvdGhlciBjYXNlcyBub3QuXG4gIGlmICghaXNJRTEwICYmIGlzSFRNTCkge1xuICAgIHZhciBtYXJnaW5Ub3AgPSBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5Ub3ApO1xuICAgIHZhciBtYXJnaW5MZWZ0ID0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luTGVmdCk7XG5cbiAgICBvZmZzZXRzLnRvcCAtPSBib3JkZXJUb3BXaWR0aCAtIG1hcmdpblRvcDtcbiAgICBvZmZzZXRzLmJvdHRvbSAtPSBib3JkZXJUb3BXaWR0aCAtIG1hcmdpblRvcDtcbiAgICBvZmZzZXRzLmxlZnQgLT0gYm9yZGVyTGVmdFdpZHRoIC0gbWFyZ2luTGVmdDtcbiAgICBvZmZzZXRzLnJpZ2h0IC09IGJvcmRlckxlZnRXaWR0aCAtIG1hcmdpbkxlZnQ7XG5cbiAgICAvLyBBdHRhY2ggbWFyZ2luVG9wIGFuZCBtYXJnaW5MZWZ0IGJlY2F1c2UgaW4gc29tZSBjaXJjdW1zdGFuY2VzIHdlIG1heSBuZWVkIHRoZW1cbiAgICBvZmZzZXRzLm1hcmdpblRvcCA9IG1hcmdpblRvcDtcbiAgICBvZmZzZXRzLm1hcmdpbkxlZnQgPSBtYXJnaW5MZWZ0O1xuICB9XG5cbiAgaWYgKGlzSUUxMCAmJiAhZml4ZWRQb3NpdGlvbiA/IHBhcmVudC5jb250YWlucyhzY3JvbGxQYXJlbnQpIDogcGFyZW50ID09PSBzY3JvbGxQYXJlbnQgJiYgc2Nyb2xsUGFyZW50Lm5vZGVOYW1lICE9PSAnQk9EWScpIHtcbiAgICBvZmZzZXRzID0gaW5jbHVkZVNjcm9sbChvZmZzZXRzLCBwYXJlbnQpO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldHM7XG59XG5cbmZ1bmN0aW9uIGdldFZpZXdwb3J0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcnRiaXRyYXJ5Tm9kZShlbGVtZW50KSB7XG4gIHZhciBleGNsdWRlU2Nyb2xsID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICB2YXIgaHRtbCA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIHZhciByZWxhdGl2ZU9mZnNldCA9IGdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZShlbGVtZW50LCBodG1sKTtcbiAgdmFyIHdpZHRoID0gTWF0aC5tYXgoaHRtbC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7XG4gIHZhciBoZWlnaHQgPSBNYXRoLm1heChodG1sLmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApO1xuXG4gIHZhciBzY3JvbGxUb3AgPSAhZXhjbHVkZVNjcm9sbCA/IGdldFNjcm9sbChodG1sKSA6IDA7XG4gIHZhciBzY3JvbGxMZWZ0ID0gIWV4Y2x1ZGVTY3JvbGwgPyBnZXRTY3JvbGwoaHRtbCwgJ2xlZnQnKSA6IDA7XG5cbiAgdmFyIG9mZnNldCA9IHtcbiAgICB0b3A6IHNjcm9sbFRvcCAtIHJlbGF0aXZlT2Zmc2V0LnRvcCArIHJlbGF0aXZlT2Zmc2V0Lm1hcmdpblRvcCxcbiAgICBsZWZ0OiBzY3JvbGxMZWZ0IC0gcmVsYXRpdmVPZmZzZXQubGVmdCArIHJlbGF0aXZlT2Zmc2V0Lm1hcmdpbkxlZnQsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG5cbiAgcmV0dXJuIGdldENsaWVudFJlY3Qob2Zmc2V0KTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBmaXhlZCBvciBpcyBpbnNpZGUgYSBmaXhlZCBwYXJlbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQGFyZ3VtZW50IHtFbGVtZW50fSBjdXN0b21Db250YWluZXJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBhbnN3ZXIgdG8gXCJpc0ZpeGVkP1wiXG4gKi9cbmZ1bmN0aW9uIGlzRml4ZWQoZWxlbWVudCkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lO1xuICBpZiAobm9kZU5hbWUgPT09ICdCT0RZJyB8fCBub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG4gIGlmICghcGFyZW50Tm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gaXNGaXhlZChwYXJlbnROb2RlKTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgZmlyc3QgcGFyZW50IG9mIGFuIGVsZW1lbnQgdGhhdCBoYXMgYSB0cmFuc2Zvcm1lZCBwcm9wZXJ0eSBkZWZpbmVkXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtFbGVtZW50fSBmaXJzdCB0cmFuc2Zvcm1lZCBwYXJlbnQgb3IgZG9jdW1lbnRFbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIC8vIFRoaXMgY2hlY2sgaXMgbmVlZGVkIHRvIGF2b2lkIGVycm9ycyBpbiBjYXNlIG9uZSBvZiB0aGUgZWxlbWVudHMgaXNuJ3QgZGVmaW5lZCBmb3IgYW55IHJlYXNvblxuICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQucGFyZW50RWxlbWVudCB8fCBpc0lFKCkpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG4gIHZhciBlbCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgd2hpbGUgKGVsICYmIGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShlbCwgJ3RyYW5zZm9ybScpID09PSAnbm9uZScpIHtcbiAgICBlbCA9IGVsLnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIGVsIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbn1cblxuLyoqXG4gKiBDb21wdXRlZCB0aGUgYm91bmRhcmllcyBsaW1pdHMgYW5kIHJldHVybiB0aGVtXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwb3BwZXJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJlZmVyZW5jZVxuICogQHBhcmFtIHtudW1iZXJ9IHBhZGRpbmdcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGJvdW5kYXJpZXNFbGVtZW50IC0gRWxlbWVudCB1c2VkIHRvIGRlZmluZSB0aGUgYm91bmRhcmllc1xuICogQHBhcmFtIHtCb29sZWFufSBmaXhlZFBvc2l0aW9uIC0gSXMgaW4gZml4ZWQgcG9zaXRpb24gbW9kZVxuICogQHJldHVybnMge09iamVjdH0gQ29vcmRpbmF0ZXMgb2YgdGhlIGJvdW5kYXJpZXNcbiAqL1xuZnVuY3Rpb24gZ2V0Qm91bmRhcmllcyhwb3BwZXIsIHJlZmVyZW5jZSwgcGFkZGluZywgYm91bmRhcmllc0VsZW1lbnQpIHtcbiAgdmFyIGZpeGVkUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IGZhbHNlO1xuXG4gIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlXG5cbiAgdmFyIGJvdW5kYXJpZXMgPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuICB2YXIgb2Zmc2V0UGFyZW50ID0gZml4ZWRQb3NpdGlvbiA/IGdldEZpeGVkUG9zaXRpb25PZmZzZXRQYXJlbnQocG9wcGVyKSA6IGZpbmRDb21tb25PZmZzZXRQYXJlbnQocG9wcGVyLCBnZXRSZWZlcmVuY2VOb2RlKHJlZmVyZW5jZSkpO1xuXG4gIC8vIEhhbmRsZSB2aWV3cG9ydCBjYXNlXG4gIGlmIChib3VuZGFyaWVzRWxlbWVudCA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgIGJvdW5kYXJpZXMgPSBnZXRWaWV3cG9ydE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJ0Yml0cmFyeU5vZGUob2Zmc2V0UGFyZW50LCBmaXhlZFBvc2l0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBIYW5kbGUgb3RoZXIgY2FzZXMgYmFzZWQgb24gRE9NIGVsZW1lbnQgdXNlZCBhcyBib3VuZGFyaWVzXG4gICAgdmFyIGJvdW5kYXJpZXNOb2RlID0gdm9pZCAwO1xuICAgIGlmIChib3VuZGFyaWVzRWxlbWVudCA9PT0gJ3Njcm9sbFBhcmVudCcpIHtcbiAgICAgIGJvdW5kYXJpZXNOb2RlID0gZ2V0U2Nyb2xsUGFyZW50KGdldFBhcmVudE5vZGUocmVmZXJlbmNlKSk7XG4gICAgICBpZiAoYm91bmRhcmllc05vZGUubm9kZU5hbWUgPT09ICdCT0RZJykge1xuICAgICAgICBib3VuZGFyaWVzTm9kZSA9IHBvcHBlci5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGJvdW5kYXJpZXNFbGVtZW50ID09PSAnd2luZG93Jykge1xuICAgICAgYm91bmRhcmllc05vZGUgPSBwb3BwZXIub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvdW5kYXJpZXNOb2RlID0gYm91bmRhcmllc0VsZW1lbnQ7XG4gICAgfVxuXG4gICAgdmFyIG9mZnNldHMgPSBnZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUoYm91bmRhcmllc05vZGUsIG9mZnNldFBhcmVudCwgZml4ZWRQb3NpdGlvbik7XG5cbiAgICAvLyBJbiBjYXNlIG9mIEhUTUwsIHdlIG5lZWQgYSBkaWZmZXJlbnQgY29tcHV0YXRpb25cbiAgICBpZiAoYm91bmRhcmllc05vZGUubm9kZU5hbWUgPT09ICdIVE1MJyAmJiAhaXNGaXhlZChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICB2YXIgX2dldFdpbmRvd1NpemVzID0gZ2V0V2luZG93U2l6ZXMocG9wcGVyLm93bmVyRG9jdW1lbnQpLFxuICAgICAgICAgIGhlaWdodCA9IF9nZXRXaW5kb3dTaXplcy5oZWlnaHQsXG4gICAgICAgICAgd2lkdGggPSBfZ2V0V2luZG93U2l6ZXMud2lkdGg7XG5cbiAgICAgIGJvdW5kYXJpZXMudG9wICs9IG9mZnNldHMudG9wIC0gb2Zmc2V0cy5tYXJnaW5Ub3A7XG4gICAgICBib3VuZGFyaWVzLmJvdHRvbSA9IGhlaWdodCArIG9mZnNldHMudG9wO1xuICAgICAgYm91bmRhcmllcy5sZWZ0ICs9IG9mZnNldHMubGVmdCAtIG9mZnNldHMubWFyZ2luTGVmdDtcbiAgICAgIGJvdW5kYXJpZXMucmlnaHQgPSB3aWR0aCArIG9mZnNldHMubGVmdDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZm9yIGFsbCB0aGUgb3RoZXIgRE9NIGVsZW1lbnRzLCB0aGlzIG9uZSBpcyBnb29kXG4gICAgICBib3VuZGFyaWVzID0gb2Zmc2V0cztcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgcGFkZGluZ3NcbiAgcGFkZGluZyA9IHBhZGRpbmcgfHwgMDtcbiAgdmFyIGlzUGFkZGluZ051bWJlciA9IHR5cGVvZiBwYWRkaW5nID09PSAnbnVtYmVyJztcbiAgYm91bmRhcmllcy5sZWZ0ICs9IGlzUGFkZGluZ051bWJlciA/IHBhZGRpbmcgOiBwYWRkaW5nLmxlZnQgfHwgMDtcbiAgYm91bmRhcmllcy50b3AgKz0gaXNQYWRkaW5nTnVtYmVyID8gcGFkZGluZyA6IHBhZGRpbmcudG9wIHx8IDA7XG4gIGJvdW5kYXJpZXMucmlnaHQgLT0gaXNQYWRkaW5nTnVtYmVyID8gcGFkZGluZyA6IHBhZGRpbmcucmlnaHQgfHwgMDtcbiAgYm91bmRhcmllcy5ib3R0b20gLT0gaXNQYWRkaW5nTnVtYmVyID8gcGFkZGluZyA6IHBhZGRpbmcuYm90dG9tIHx8IDA7XG5cbiAgcmV0dXJuIGJvdW5kYXJpZXM7XG59XG5cbmZ1bmN0aW9uIGdldEFyZWEoX3JlZikge1xuICB2YXIgd2lkdGggPSBfcmVmLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX3JlZi5oZWlnaHQ7XG5cbiAgcmV0dXJuIHdpZHRoICogaGVpZ2h0O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdXNlZCB0byB0cmFuc2Zvcm0gdGhlIGBhdXRvYCBwbGFjZW1lbnQgdG8gdGhlIHBsYWNlbWVudCB3aXRoIG1vcmVcbiAqIGF2YWlsYWJsZSBzcGFjZS5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVBdXRvUGxhY2VtZW50KHBsYWNlbWVudCwgcmVmUmVjdCwgcG9wcGVyLCByZWZlcmVuY2UsIGJvdW5kYXJpZXNFbGVtZW50KSB7XG4gIHZhciBwYWRkaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiAwO1xuXG4gIGlmIChwbGFjZW1lbnQuaW5kZXhPZignYXV0bycpID09PSAtMSkge1xuICAgIHJldHVybiBwbGFjZW1lbnQ7XG4gIH1cblxuICB2YXIgYm91bmRhcmllcyA9IGdldEJvdW5kYXJpZXMocG9wcGVyLCByZWZlcmVuY2UsIHBhZGRpbmcsIGJvdW5kYXJpZXNFbGVtZW50KTtcblxuICB2YXIgcmVjdHMgPSB7XG4gICAgdG9wOiB7XG4gICAgICB3aWR0aDogYm91bmRhcmllcy53aWR0aCxcbiAgICAgIGhlaWdodDogcmVmUmVjdC50b3AgLSBib3VuZGFyaWVzLnRvcFxuICAgIH0sXG4gICAgcmlnaHQ6IHtcbiAgICAgIHdpZHRoOiBib3VuZGFyaWVzLnJpZ2h0IC0gcmVmUmVjdC5yaWdodCxcbiAgICAgIGhlaWdodDogYm91bmRhcmllcy5oZWlnaHRcbiAgICB9LFxuICAgIGJvdHRvbToge1xuICAgICAgd2lkdGg6IGJvdW5kYXJpZXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IGJvdW5kYXJpZXMuYm90dG9tIC0gcmVmUmVjdC5ib3R0b21cbiAgICB9LFxuICAgIGxlZnQ6IHtcbiAgICAgIHdpZHRoOiByZWZSZWN0LmxlZnQgLSBib3VuZGFyaWVzLmxlZnQsXG4gICAgICBoZWlnaHQ6IGJvdW5kYXJpZXMuaGVpZ2h0XG4gICAgfVxuICB9O1xuXG4gIHZhciBzb3J0ZWRBcmVhcyA9IE9iamVjdC5rZXlzKHJlY3RzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICBrZXk6IGtleVxuICAgIH0sIHJlY3RzW2tleV0sIHtcbiAgICAgIGFyZWE6IGdldEFyZWEocmVjdHNba2V5XSlcbiAgICB9KTtcbiAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLmFyZWEgLSBhLmFyZWE7XG4gIH0pO1xuXG4gIHZhciBmaWx0ZXJlZEFyZWFzID0gc29ydGVkQXJlYXMuZmlsdGVyKGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciB3aWR0aCA9IF9yZWYyLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBfcmVmMi5oZWlnaHQ7XG4gICAgcmV0dXJuIHdpZHRoID49IHBvcHBlci5jbGllbnRXaWR0aCAmJiBoZWlnaHQgPj0gcG9wcGVyLmNsaWVudEhlaWdodDtcbiAgfSk7XG5cbiAgdmFyIGNvbXB1dGVkUGxhY2VtZW50ID0gZmlsdGVyZWRBcmVhcy5sZW5ndGggPiAwID8gZmlsdGVyZWRBcmVhc1swXS5rZXkgOiBzb3J0ZWRBcmVhc1swXS5rZXk7XG5cbiAgdmFyIHZhcmlhdGlvbiA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xuXG4gIHJldHVybiBjb21wdXRlZFBsYWNlbWVudCArICh2YXJpYXRpb24gPyAnLScgKyB2YXJpYXRpb24gOiAnJyk7XG59XG5cbi8qKlxuICogR2V0IG9mZnNldHMgdG8gdGhlIHJlZmVyZW5jZSBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7RWxlbWVudH0gcG9wcGVyIC0gdGhlIHBvcHBlciBlbGVtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR9IHJlZmVyZW5jZSAtIHRoZSByZWZlcmVuY2UgZWxlbWVudCAodGhlIHBvcHBlciB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXMpXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGZpeGVkUG9zaXRpb24gLSBpcyBpbiBmaXhlZCBwb3NpdGlvbiBtb2RlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgb2Zmc2V0cyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlclxuICovXG5mdW5jdGlvbiBnZXRSZWZlcmVuY2VPZmZzZXRzKHN0YXRlLCBwb3BwZXIsIHJlZmVyZW5jZSkge1xuICB2YXIgZml4ZWRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblxuICB2YXIgY29tbW9uT2Zmc2V0UGFyZW50ID0gZml4ZWRQb3NpdGlvbiA/IGdldEZpeGVkUG9zaXRpb25PZmZzZXRQYXJlbnQocG9wcGVyKSA6IGZpbmRDb21tb25PZmZzZXRQYXJlbnQocG9wcGVyLCBnZXRSZWZlcmVuY2VOb2RlKHJlZmVyZW5jZSkpO1xuICByZXR1cm4gZ2V0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcmJpdHJhcnlOb2RlKHJlZmVyZW5jZSwgY29tbW9uT2Zmc2V0UGFyZW50LCBmaXhlZFBvc2l0aW9uKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG91dGVyIHNpemVzIG9mIHRoZSBnaXZlbiBlbGVtZW50IChvZmZzZXQgc2l6ZSArIG1hcmdpbnMpXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtPYmplY3R9IG9iamVjdCBjb250YWluaW5nIHdpZHRoIGFuZCBoZWlnaHQgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBnZXRPdXRlclNpemVzKGVsZW1lbnQpIHtcbiAgdmFyIHdpbmRvdyA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgdmFyIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICB2YXIgeCA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpblRvcCB8fCAwKSArIHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpbkJvdHRvbSB8fCAwKTtcbiAgdmFyIHkgPSBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5MZWZ0IHx8IDApICsgcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luUmlnaHQgfHwgMCk7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgd2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGggKyB5LFxuICAgIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHQgKyB4XG4gIH07XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBvcHBvc2l0ZSBwbGFjZW1lbnQgb2YgdGhlIGdpdmVuIG9uZVxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtTdHJpbmd9IHBsYWNlbWVudFxuICogQHJldHVybnMge1N0cmluZ30gZmxpcHBlZCBwbGFjZW1lbnRcbiAqL1xuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHZhciBoYXNoID0geyBsZWZ0OiAncmlnaHQnLCByaWdodDogJ2xlZnQnLCBib3R0b206ICd0b3AnLCB0b3A6ICdib3R0b20nIH07XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBvZmZzZXRzIHRvIHRoZSBwb3BwZXJcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwb3NpdGlvbiAtIENTUyBwb3NpdGlvbiB0aGUgUG9wcGVyIHdpbGwgZ2V0IGFwcGxpZWRcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBvcHBlciAtIHRoZSBwb3BwZXIgZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IHJlZmVyZW5jZU9mZnNldHMgLSB0aGUgcmVmZXJlbmNlIG9mZnNldHMgKHRoZSBwb3BwZXIgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGlzKVxuICogQHBhcmFtIHtTdHJpbmd9IHBsYWNlbWVudCAtIG9uZSBvZiB0aGUgdmFsaWQgcGxhY2VtZW50IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IHBvcHBlck9mZnNldHMgLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgb2Zmc2V0cyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlclxuICovXG5mdW5jdGlvbiBnZXRQb3BwZXJPZmZzZXRzKHBvcHBlciwgcmVmZXJlbmNlT2Zmc2V0cywgcGxhY2VtZW50KSB7XG4gIHBsYWNlbWVudCA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuXG4gIC8vIEdldCBwb3BwZXIgbm9kZSBzaXplc1xuICB2YXIgcG9wcGVyUmVjdCA9IGdldE91dGVyU2l6ZXMocG9wcGVyKTtcblxuICAvLyBBZGQgcG9zaXRpb24sIHdpZHRoIGFuZCBoZWlnaHQgdG8gb3VyIG9mZnNldHMgb2JqZWN0XG4gIHZhciBwb3BwZXJPZmZzZXRzID0ge1xuICAgIHdpZHRoOiBwb3BwZXJSZWN0LndpZHRoLFxuICAgIGhlaWdodDogcG9wcGVyUmVjdC5oZWlnaHRcbiAgfTtcblxuICAvLyBkZXBlbmRpbmcgYnkgdGhlIHBvcHBlciBwbGFjZW1lbnQgd2UgaGF2ZSB0byBjb21wdXRlIGl0cyBvZmZzZXRzIHNsaWdodGx5IGRpZmZlcmVudGx5XG4gIHZhciBpc0hvcml6ID0gWydyaWdodCcsICdsZWZ0J10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMTtcbiAgdmFyIG1haW5TaWRlID0gaXNIb3JpeiA/ICd0b3AnIDogJ2xlZnQnO1xuICB2YXIgc2Vjb25kYXJ5U2lkZSA9IGlzSG9yaXogPyAnbGVmdCcgOiAndG9wJztcbiAgdmFyIG1lYXN1cmVtZW50ID0gaXNIb3JpeiA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgdmFyIHNlY29uZGFyeU1lYXN1cmVtZW50ID0gIWlzSG9yaXogPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgcG9wcGVyT2Zmc2V0c1ttYWluU2lkZV0gPSByZWZlcmVuY2VPZmZzZXRzW21haW5TaWRlXSArIHJlZmVyZW5jZU9mZnNldHNbbWVhc3VyZW1lbnRdIC8gMiAtIHBvcHBlclJlY3RbbWVhc3VyZW1lbnRdIC8gMjtcbiAgaWYgKHBsYWNlbWVudCA9PT0gc2Vjb25kYXJ5U2lkZSkge1xuICAgIHBvcHBlck9mZnNldHNbc2Vjb25kYXJ5U2lkZV0gPSByZWZlcmVuY2VPZmZzZXRzW3NlY29uZGFyeVNpZGVdIC0gcG9wcGVyUmVjdFtzZWNvbmRhcnlNZWFzdXJlbWVudF07XG4gIH0gZWxzZSB7XG4gICAgcG9wcGVyT2Zmc2V0c1tzZWNvbmRhcnlTaWRlXSA9IHJlZmVyZW5jZU9mZnNldHNbZ2V0T3Bwb3NpdGVQbGFjZW1lbnQoc2Vjb25kYXJ5U2lkZSldO1xuICB9XG5cbiAgcmV0dXJuIHBvcHBlck9mZnNldHM7XG59XG5cbi8qKlxuICogTWltaWNzIHRoZSBgZmluZGAgbWV0aG9kIG9mIEFycmF5XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0FycmF5fSBhcnJcbiAqIEBhcmd1bWVudCBwcm9wXG4gKiBAYXJndW1lbnQgdmFsdWVcbiAqIEByZXR1cm5zIGluZGV4IG9yIC0xXG4gKi9cbmZ1bmN0aW9uIGZpbmQoYXJyLCBjaGVjaykge1xuICAvLyB1c2UgbmF0aXZlIGZpbmQgaWYgc3VwcG9ydGVkXG4gIGlmIChBcnJheS5wcm90b3R5cGUuZmluZCkge1xuICAgIHJldHVybiBhcnIuZmluZChjaGVjayk7XG4gIH1cblxuICAvLyB1c2UgYGZpbHRlcmAgdG8gb2J0YWluIHRoZSBzYW1lIGJlaGF2aW9yIG9mIGBmaW5kYFxuICByZXR1cm4gYXJyLmZpbHRlcihjaGVjaylbMF07XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hpbmcgb2JqZWN0XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0FycmF5fSBhcnJcbiAqIEBhcmd1bWVudCBwcm9wXG4gKiBAYXJndW1lbnQgdmFsdWVcbiAqIEByZXR1cm5zIGluZGV4IG9yIC0xXG4gKi9cbmZ1bmN0aW9uIGZpbmRJbmRleChhcnIsIHByb3AsIHZhbHVlKSB7XG4gIC8vIHVzZSBuYXRpdmUgZmluZEluZGV4IGlmIHN1cHBvcnRlZFxuICBpZiAoQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleCkge1xuICAgIHJldHVybiBhcnIuZmluZEluZGV4KGZ1bmN0aW9uIChjdXIpIHtcbiAgICAgIHJldHVybiBjdXJbcHJvcF0gPT09IHZhbHVlO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gdXNlIGBmaW5kYCArIGBpbmRleE9mYCBpZiBgZmluZEluZGV4YCBpc24ndCBzdXBwb3J0ZWRcbiAgdmFyIG1hdGNoID0gZmluZChhcnIsIGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqW3Byb3BdID09PSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiBhcnIuaW5kZXhPZihtYXRjaCk7XG59XG5cbi8qKlxuICogTG9vcCB0cm91Z2ggdGhlIGxpc3Qgb2YgbW9kaWZpZXJzIGFuZCBydW4gdGhlbSBpbiBvcmRlcixcbiAqIGVhY2ggb2YgdGhlbSB3aWxsIHRoZW4gZWRpdCB0aGUgZGF0YSBvYmplY3QuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge2RhdGFPYmplY3R9IGRhdGFcbiAqIEBwYXJhbSB7QXJyYXl9IG1vZGlmaWVyc1xuICogQHBhcmFtIHtTdHJpbmd9IGVuZHMgLSBPcHRpb25hbCBtb2RpZmllciBuYW1lIHVzZWQgYXMgc3RvcHBlclxuICogQHJldHVybnMge2RhdGFPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIHJ1bk1vZGlmaWVycyhtb2RpZmllcnMsIGRhdGEsIGVuZHMpIHtcbiAgdmFyIG1vZGlmaWVyc1RvUnVuID0gZW5kcyA9PT0gdW5kZWZpbmVkID8gbW9kaWZpZXJzIDogbW9kaWZpZXJzLnNsaWNlKDAsIGZpbmRJbmRleChtb2RpZmllcnMsICduYW1lJywgZW5kcykpO1xuXG4gIG1vZGlmaWVyc1RvUnVuLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgaWYgKG1vZGlmaWVyWydmdW5jdGlvbiddKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRvdC1ub3RhdGlvblxuICAgICAgY29uc29sZS53YXJuKCdgbW9kaWZpZXIuZnVuY3Rpb25gIGlzIGRlcHJlY2F0ZWQsIHVzZSBgbW9kaWZpZXIuZm5gIScpO1xuICAgIH1cbiAgICB2YXIgZm4gPSBtb2RpZmllclsnZnVuY3Rpb24nXSB8fCBtb2RpZmllci5mbjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkb3Qtbm90YXRpb25cbiAgICBpZiAobW9kaWZpZXIuZW5hYmxlZCAmJiBpc0Z1bmN0aW9uKGZuKSkge1xuICAgICAgLy8gQWRkIHByb3BlcnRpZXMgdG8gb2Zmc2V0cyB0byBtYWtlIHRoZW0gYSBjb21wbGV0ZSBjbGllbnRSZWN0IG9iamVjdFxuICAgICAgLy8gd2UgZG8gdGhpcyBiZWZvcmUgZWFjaCBtb2RpZmllciB0byBtYWtlIHN1cmUgdGhlIHByZXZpb3VzIG9uZSBkb2Vzbid0XG4gICAgICAvLyBtZXNzIHdpdGggdGhlc2UgdmFsdWVzXG4gICAgICBkYXRhLm9mZnNldHMucG9wcGVyID0gZ2V0Q2xpZW50UmVjdChkYXRhLm9mZnNldHMucG9wcGVyKTtcbiAgICAgIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UgPSBnZXRDbGllbnRSZWN0KGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UpO1xuXG4gICAgICBkYXRhID0gZm4oZGF0YSwgbW9kaWZpZXIpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHBvcHBlciwgY29tcHV0aW5nIHRoZSBuZXcgb2Zmc2V0cyBhbmQgYXBwbHlpbmdcbiAqIHRoZSBuZXcgc3R5bGUuPGJyIC8+XG4gKiBQcmVmZXIgYHNjaGVkdWxlVXBkYXRlYCBvdmVyIGB1cGRhdGVgIGJlY2F1c2Ugb2YgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xuZnVuY3Rpb24gdXBkYXRlKCkge1xuICAvLyBpZiBwb3BwZXIgaXMgZGVzdHJveWVkLCBkb24ndCBwZXJmb3JtIGFueSBmdXJ0aGVyIHVwZGF0ZVxuICBpZiAodGhpcy5zdGF0ZS5pc0Rlc3Ryb3llZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBkYXRhID0ge1xuICAgIGluc3RhbmNlOiB0aGlzLFxuICAgIHN0eWxlczoge30sXG4gICAgYXJyb3dTdHlsZXM6IHt9LFxuICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgIGZsaXBwZWQ6IGZhbHNlLFxuICAgIG9mZnNldHM6IHt9XG4gIH07XG5cbiAgLy8gY29tcHV0ZSByZWZlcmVuY2UgZWxlbWVudCBvZmZzZXRzXG4gIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UgPSBnZXRSZWZlcmVuY2VPZmZzZXRzKHRoaXMuc3RhdGUsIHRoaXMucG9wcGVyLCB0aGlzLnJlZmVyZW5jZSwgdGhpcy5vcHRpb25zLnBvc2l0aW9uRml4ZWQpO1xuXG4gIC8vIGNvbXB1dGUgYXV0byBwbGFjZW1lbnQsIHN0b3JlIHBsYWNlbWVudCBpbnNpZGUgdGhlIGRhdGEgb2JqZWN0LFxuICAvLyBtb2RpZmllcnMgd2lsbCBiZSBhYmxlIHRvIGVkaXQgYHBsYWNlbWVudGAgaWYgbmVlZGVkXG4gIC8vIGFuZCByZWZlciB0byBvcmlnaW5hbFBsYWNlbWVudCB0byBrbm93IHRoZSBvcmlnaW5hbCB2YWx1ZVxuICBkYXRhLnBsYWNlbWVudCA9IGNvbXB1dGVBdXRvUGxhY2VtZW50KHRoaXMub3B0aW9ucy5wbGFjZW1lbnQsIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UsIHRoaXMucG9wcGVyLCB0aGlzLnJlZmVyZW5jZSwgdGhpcy5vcHRpb25zLm1vZGlmaWVycy5mbGlwLmJvdW5kYXJpZXNFbGVtZW50LCB0aGlzLm9wdGlvbnMubW9kaWZpZXJzLmZsaXAucGFkZGluZyk7XG5cbiAgLy8gc3RvcmUgdGhlIGNvbXB1dGVkIHBsYWNlbWVudCBpbnNpZGUgYG9yaWdpbmFsUGxhY2VtZW50YFxuICBkYXRhLm9yaWdpbmFsUGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQ7XG5cbiAgZGF0YS5wb3NpdGlvbkZpeGVkID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uRml4ZWQ7XG5cbiAgLy8gY29tcHV0ZSB0aGUgcG9wcGVyIG9mZnNldHNcbiAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IGdldFBvcHBlck9mZnNldHModGhpcy5wb3BwZXIsIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UsIGRhdGEucGxhY2VtZW50KTtcblxuICBkYXRhLm9mZnNldHMucG9wcGVyLnBvc2l0aW9uID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uRml4ZWQgPyAnZml4ZWQnIDogJ2Fic29sdXRlJztcblxuICAvLyBydW4gdGhlIG1vZGlmaWVyc1xuICBkYXRhID0gcnVuTW9kaWZpZXJzKHRoaXMubW9kaWZpZXJzLCBkYXRhKTtcblxuICAvLyB0aGUgZmlyc3QgYHVwZGF0ZWAgd2lsbCBjYWxsIGBvbkNyZWF0ZWAgY2FsbGJhY2tcbiAgLy8gdGhlIG90aGVyIG9uZXMgd2lsbCBjYWxsIGBvblVwZGF0ZWAgY2FsbGJhY2tcbiAgaWYgKCF0aGlzLnN0YXRlLmlzQ3JlYXRlZCkge1xuICAgIHRoaXMuc3RhdGUuaXNDcmVhdGVkID0gdHJ1ZTtcbiAgICB0aGlzLm9wdGlvbnMub25DcmVhdGUoZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5vcHRpb25zLm9uVXBkYXRlKGRhdGEpO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIHVzZWQgdG8ga25vdyBpZiB0aGUgZ2l2ZW4gbW9kaWZpZXIgaXMgZW5hYmxlZC5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc01vZGlmaWVyRW5hYmxlZChtb2RpZmllcnMsIG1vZGlmaWVyTmFtZSkge1xuICByZXR1cm4gbW9kaWZpZXJzLnNvbWUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgICAgZW5hYmxlZCA9IF9yZWYuZW5hYmxlZDtcbiAgICByZXR1cm4gZW5hYmxlZCAmJiBuYW1lID09PSBtb2RpZmllck5hbWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJlZml4ZWQgc3VwcG9ydGVkIHByb3BlcnR5IG5hbWVcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBwcm9wZXJ0eSAoY2FtZWxDYXNlKVxuICogQHJldHVybnMge1N0cmluZ30gcHJlZml4ZWQgcHJvcGVydHkgKGNhbWVsQ2FzZSBvciBQYXNjYWxDYXNlLCBkZXBlbmRpbmcgb24gdGhlIHZlbmRvciBwcmVmaXgpXG4gKi9cbmZ1bmN0aW9uIGdldFN1cHBvcnRlZFByb3BlcnR5TmFtZShwcm9wZXJ0eSkge1xuICB2YXIgcHJlZml4ZXMgPSBbZmFsc2UsICdtcycsICdXZWJraXQnLCAnTW96JywgJ08nXTtcbiAgdmFyIHVwcGVyUHJvcCA9IHByb3BlcnR5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc2xpY2UoMSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwcmVmaXggPSBwcmVmaXhlc1tpXTtcbiAgICB2YXIgdG9DaGVjayA9IHByZWZpeCA/ICcnICsgcHJlZml4ICsgdXBwZXJQcm9wIDogcHJvcGVydHk7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudC5ib2R5LnN0eWxlW3RvQ2hlY2tdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRvQ2hlY2s7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIERlc3Ryb3lzIHRoZSBwb3BwZXIuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyXG4gKi9cbmZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gIHRoaXMuc3RhdGUuaXNEZXN0cm95ZWQgPSB0cnVlO1xuXG4gIC8vIHRvdWNoIERPTSBvbmx5IGlmIGBhcHBseVN0eWxlYCBtb2RpZmllciBpcyBlbmFibGVkXG4gIGlmIChpc01vZGlmaWVyRW5hYmxlZCh0aGlzLm1vZGlmaWVycywgJ2FwcGx5U3R5bGUnKSkge1xuICAgIHRoaXMucG9wcGVyLnJlbW92ZUF0dHJpYnV0ZSgneC1wbGFjZW1lbnQnKTtcbiAgICB0aGlzLnBvcHBlci5zdHlsZS5wb3NpdGlvbiA9ICcnO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlLnRvcCA9ICcnO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlLmxlZnQgPSAnJztcbiAgICB0aGlzLnBvcHBlci5zdHlsZS5yaWdodCA9ICcnO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlLmJvdHRvbSA9ICcnO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlLndpbGxDaGFuZ2UgPSAnJztcbiAgICB0aGlzLnBvcHBlci5zdHlsZVtnZXRTdXBwb3J0ZWRQcm9wZXJ0eU5hbWUoJ3RyYW5zZm9ybScpXSA9ICcnO1xuICB9XG5cbiAgdGhpcy5kaXNhYmxlRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAvLyByZW1vdmUgdGhlIHBvcHBlciBpZiB1c2VyIGV4cGxpY2l0bHkgYXNrZWQgZm9yIHRoZSBkZWxldGlvbiBvbiBkZXN0cm95XG4gIC8vIGRvIG5vdCB1c2UgYHJlbW92ZWAgYmVjYXVzZSBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBpdFxuICBpZiAodGhpcy5vcHRpb25zLnJlbW92ZU9uRGVzdHJveSkge1xuICAgIHRoaXMucG9wcGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wb3BwZXIpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEdldCB0aGUgd2luZG93IGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudFxuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7V2luZG93fVxuICovXG5mdW5jdGlvbiBnZXRXaW5kb3coZWxlbWVudCkge1xuICB2YXIgb3duZXJEb2N1bWVudCA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgcmV0dXJuIG93bmVyRG9jdW1lbnQgPyBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IDogd2luZG93O1xufVxuXG5mdW5jdGlvbiBhdHRhY2hUb1Njcm9sbFBhcmVudHMoc2Nyb2xsUGFyZW50LCBldmVudCwgY2FsbGJhY2ssIHNjcm9sbFBhcmVudHMpIHtcbiAgdmFyIGlzQm9keSA9IHNjcm9sbFBhcmVudC5ub2RlTmFtZSA9PT0gJ0JPRFknO1xuICB2YXIgdGFyZ2V0ID0gaXNCb2R5ID8gc2Nyb2xsUGFyZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgOiBzY3JvbGxQYXJlbnQ7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBjYWxsYmFjaywgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG4gIGlmICghaXNCb2R5KSB7XG4gICAgYXR0YWNoVG9TY3JvbGxQYXJlbnRzKGdldFNjcm9sbFBhcmVudCh0YXJnZXQucGFyZW50Tm9kZSksIGV2ZW50LCBjYWxsYmFjaywgc2Nyb2xsUGFyZW50cyk7XG4gIH1cbiAgc2Nyb2xsUGFyZW50cy5wdXNoKHRhcmdldCk7XG59XG5cbi8qKlxuICogU2V0dXAgbmVlZGVkIGV2ZW50IGxpc3RlbmVycyB1c2VkIHRvIHVwZGF0ZSB0aGUgcG9wcGVyIHBvc2l0aW9uXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXR1cEV2ZW50TGlzdGVuZXJzKHJlZmVyZW5jZSwgb3B0aW9ucywgc3RhdGUsIHVwZGF0ZUJvdW5kKSB7XG4gIC8vIFJlc2l6ZSBldmVudCBsaXN0ZW5lciBvbiB3aW5kb3dcbiAgc3RhdGUudXBkYXRlQm91bmQgPSB1cGRhdGVCb3VuZDtcbiAgZ2V0V2luZG93KHJlZmVyZW5jZSkuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgc3RhdGUudXBkYXRlQm91bmQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBTY3JvbGwgZXZlbnQgbGlzdGVuZXIgb24gc2Nyb2xsIHBhcmVudHNcbiAgdmFyIHNjcm9sbEVsZW1lbnQgPSBnZXRTY3JvbGxQYXJlbnQocmVmZXJlbmNlKTtcbiAgYXR0YWNoVG9TY3JvbGxQYXJlbnRzKHNjcm9sbEVsZW1lbnQsICdzY3JvbGwnLCBzdGF0ZS51cGRhdGVCb3VuZCwgc3RhdGUuc2Nyb2xsUGFyZW50cyk7XG4gIHN0YXRlLnNjcm9sbEVsZW1lbnQgPSBzY3JvbGxFbGVtZW50O1xuICBzdGF0ZS5ldmVudHNFbmFibGVkID0gdHJ1ZTtcblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogSXQgd2lsbCBhZGQgcmVzaXplL3Njcm9sbCBldmVudHMgYW5kIHN0YXJ0IHJlY2FsY3VsYXRpbmdcbiAqIHBvc2l0aW9uIG9mIHRoZSBwb3BwZXIgZWxlbWVudCB3aGVuIHRoZXkgYXJlIHRyaWdnZXJlZC5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xuZnVuY3Rpb24gZW5hYmxlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gIGlmICghdGhpcy5zdGF0ZS5ldmVudHNFbmFibGVkKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHNldHVwRXZlbnRMaXN0ZW5lcnModGhpcy5yZWZlcmVuY2UsIHRoaXMub3B0aW9ucywgdGhpcy5zdGF0ZSwgdGhpcy5zY2hlZHVsZVVwZGF0ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIHVzZWQgdG8gdXBkYXRlIHRoZSBwb3BwZXIgcG9zaXRpb25cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHJlZmVyZW5jZSwgc3RhdGUpIHtcbiAgLy8gUmVtb3ZlIHJlc2l6ZSBldmVudCBsaXN0ZW5lciBvbiB3aW5kb3dcbiAgZ2V0V2luZG93KHJlZmVyZW5jZSkucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgc3RhdGUudXBkYXRlQm91bmQpO1xuXG4gIC8vIFJlbW92ZSBzY3JvbGwgZXZlbnQgbGlzdGVuZXIgb24gc2Nyb2xsIHBhcmVudHNcbiAgc3RhdGUuc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc3RhdGUudXBkYXRlQm91bmQpO1xuICB9KTtcblxuICAvLyBSZXNldCBzdGF0ZVxuICBzdGF0ZS51cGRhdGVCb3VuZCA9IG51bGw7XG4gIHN0YXRlLnNjcm9sbFBhcmVudHMgPSBbXTtcbiAgc3RhdGUuc2Nyb2xsRWxlbWVudCA9IG51bGw7XG4gIHN0YXRlLmV2ZW50c0VuYWJsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIEl0IHdpbGwgcmVtb3ZlIHJlc2l6ZS9zY3JvbGwgZXZlbnRzIGFuZCB3b24ndCByZWNhbGN1bGF0ZSBwb3BwZXIgcG9zaXRpb25cbiAqIHdoZW4gdGhleSBhcmUgdHJpZ2dlcmVkLiBJdCBhbHNvIHdvbid0IHRyaWdnZXIgYG9uVXBkYXRlYCBjYWxsYmFjayBhbnltb3JlLFxuICogdW5sZXNzIHlvdSBjYWxsIGB1cGRhdGVgIG1ldGhvZCBtYW51YWxseS5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xuZnVuY3Rpb24gZGlzYWJsZUV2ZW50TGlzdGVuZXJzKCkge1xuICBpZiAodGhpcy5zdGF0ZS5ldmVudHNFbmFibGVkKSB7XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5zY2hlZHVsZVVwZGF0ZSk7XG4gICAgdGhpcy5zdGF0ZSA9IHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMucmVmZXJlbmNlLCB0aGlzLnN0YXRlKTtcbiAgfVxufVxuXG4vKipcbiAqIFRlbGxzIGlmIGEgZ2l2ZW4gaW5wdXQgaXMgYSBudW1iZXJcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7Kn0gaW5wdXQgdG8gY2hlY2tcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTnVtZXJpYyhuKSB7XG4gIHJldHVybiBuICE9PSAnJyAmJiAhaXNOYU4ocGFyc2VGbG9hdChuKSkgJiYgaXNGaW5pdGUobik7XG59XG5cbi8qKlxuICogU2V0IHRoZSBzdHlsZSB0byB0aGUgZ2l2ZW4gcG9wcGVyXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGFwcGx5IHRoZSBzdHlsZSB0b1xuICogQGFyZ3VtZW50IHtPYmplY3R9IHN0eWxlc1xuICogT2JqZWN0IHdpdGggYSBsaXN0IG9mIHByb3BlcnRpZXMgYW5kIHZhbHVlcyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gc2V0U3R5bGVzKGVsZW1lbnQsIHN0eWxlcykge1xuICBPYmplY3Qua2V5cyhzdHlsZXMpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICB2YXIgdW5pdCA9ICcnO1xuICAgIC8vIGFkZCB1bml0IGlmIHRoZSB2YWx1ZSBpcyBudW1lcmljIGFuZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZ1xuICAgIGlmIChbJ3dpZHRoJywgJ2hlaWdodCcsICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXS5pbmRleE9mKHByb3ApICE9PSAtMSAmJiBpc051bWVyaWMoc3R5bGVzW3Byb3BdKSkge1xuICAgICAgdW5pdCA9ICdweCc7XG4gICAgfVxuICAgIGVsZW1lbnQuc3R5bGVbcHJvcF0gPSBzdHlsZXNbcHJvcF0gKyB1bml0O1xuICB9KTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGF0dHJpYnV0ZXMgdG8gdGhlIGdpdmVuIHBvcHBlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBhcHBseSB0aGUgYXR0cmlidXRlcyB0b1xuICogQGFyZ3VtZW50IHtPYmplY3R9IHN0eWxlc1xuICogT2JqZWN0IHdpdGggYSBsaXN0IG9mIHByb3BlcnRpZXMgYW5kIHZhbHVlcyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlcyhlbGVtZW50LCBhdHRyaWJ1dGVzKSB7XG4gIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICB2YXIgdmFsdWUgPSBhdHRyaWJ1dGVzW3Byb3BdO1xuICAgIGlmICh2YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKHByb3AsIGF0dHJpYnV0ZXNbcHJvcF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShwcm9wKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEuc3R5bGVzIC0gTGlzdCBvZiBzdHlsZSBwcm9wZXJ0aWVzIC0gdmFsdWVzIHRvIGFwcGx5IHRvIHBvcHBlciBlbGVtZW50XG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YS5hdHRyaWJ1dGVzIC0gTGlzdCBvZiBhdHRyaWJ1dGUgcHJvcGVydGllcyAtIHZhbHVlcyB0byBhcHBseSB0byBwb3BwZXIgZWxlbWVudFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIHNhbWUgZGF0YSBvYmplY3RcbiAqL1xuZnVuY3Rpb24gYXBwbHlTdHlsZShkYXRhKSB7XG4gIC8vIGFueSBwcm9wZXJ0eSBwcmVzZW50IGluIGBkYXRhLnN0eWxlc2Agd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXIsXG4gIC8vIGluIHRoaXMgd2F5IHdlIGNhbiBtYWtlIHRoZSAzcmQgcGFydHkgbW9kaWZpZXJzIGFkZCBjdXN0b20gc3R5bGVzIHRvIGl0XG4gIC8vIEJlIGF3YXJlLCBtb2RpZmllcnMgY291bGQgb3ZlcnJpZGUgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgcHJldmlvdXNcbiAgLy8gbGluZXMgb2YgdGhpcyBtb2RpZmllciFcbiAgc2V0U3R5bGVzKGRhdGEuaW5zdGFuY2UucG9wcGVyLCBkYXRhLnN0eWxlcyk7XG5cbiAgLy8gYW55IHByb3BlcnR5IHByZXNlbnQgaW4gYGRhdGEuYXR0cmlidXRlc2Agd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXIsXG4gIC8vIHRoZXkgd2lsbCBiZSBzZXQgYXMgSFRNTCBhdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50XG4gIHNldEF0dHJpYnV0ZXMoZGF0YS5pbnN0YW5jZS5wb3BwZXIsIGRhdGEuYXR0cmlidXRlcyk7XG5cbiAgLy8gaWYgYXJyb3dFbGVtZW50IGlzIGRlZmluZWQgYW5kIGFycm93U3R5bGVzIGhhcyBzb21lIHByb3BlcnRpZXNcbiAgaWYgKGRhdGEuYXJyb3dFbGVtZW50ICYmIE9iamVjdC5rZXlzKGRhdGEuYXJyb3dTdHlsZXMpLmxlbmd0aCkge1xuICAgIHNldFN0eWxlcyhkYXRhLmFycm93RWxlbWVudCwgZGF0YS5hcnJvd1N0eWxlcyk7XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHgtcGxhY2VtZW50IGF0dHJpYnV0ZSBiZWZvcmUgZXZlcnl0aGluZyBlbHNlIGJlY2F1c2UgaXQgY291bGQgYmUgdXNlZFxuICogdG8gYWRkIG1hcmdpbnMgdG8gdGhlIHBvcHBlciBtYXJnaW5zIG5lZWRzIHRvIGJlIGNhbGN1bGF0ZWQgdG8gZ2V0IHRoZVxuICogY29ycmVjdCBwb3BwZXIgb2Zmc2V0cy5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIubW9kaWZpZXJzXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIGVsZW1lbnQgdXNlZCB0byBwb3NpdGlvbiB0aGUgcG9wcGVyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwb3BwZXIgLSBUaGUgSFRNTCBlbGVtZW50IHVzZWQgYXMgcG9wcGVyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFBvcHBlci5qcyBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIGFwcGx5U3R5bGVPbkxvYWQocmVmZXJlbmNlLCBwb3BwZXIsIG9wdGlvbnMsIG1vZGlmaWVyT3B0aW9ucywgc3RhdGUpIHtcbiAgLy8gY29tcHV0ZSByZWZlcmVuY2UgZWxlbWVudCBvZmZzZXRzXG4gIHZhciByZWZlcmVuY2VPZmZzZXRzID0gZ2V0UmVmZXJlbmNlT2Zmc2V0cyhzdGF0ZSwgcG9wcGVyLCByZWZlcmVuY2UsIG9wdGlvbnMucG9zaXRpb25GaXhlZCk7XG5cbiAgLy8gY29tcHV0ZSBhdXRvIHBsYWNlbWVudCwgc3RvcmUgcGxhY2VtZW50IGluc2lkZSB0aGUgZGF0YSBvYmplY3QsXG4gIC8vIG1vZGlmaWVycyB3aWxsIGJlIGFibGUgdG8gZWRpdCBgcGxhY2VtZW50YCBpZiBuZWVkZWRcbiAgLy8gYW5kIHJlZmVyIHRvIG9yaWdpbmFsUGxhY2VtZW50IHRvIGtub3cgdGhlIG9yaWdpbmFsIHZhbHVlXG4gIHZhciBwbGFjZW1lbnQgPSBjb21wdXRlQXV0b1BsYWNlbWVudChvcHRpb25zLnBsYWNlbWVudCwgcmVmZXJlbmNlT2Zmc2V0cywgcG9wcGVyLCByZWZlcmVuY2UsIG9wdGlvbnMubW9kaWZpZXJzLmZsaXAuYm91bmRhcmllc0VsZW1lbnQsIG9wdGlvbnMubW9kaWZpZXJzLmZsaXAucGFkZGluZyk7XG5cbiAgcG9wcGVyLnNldEF0dHJpYnV0ZSgneC1wbGFjZW1lbnQnLCBwbGFjZW1lbnQpO1xuXG4gIC8vIEFwcGx5IGBwb3NpdGlvbmAgdG8gcG9wcGVyIGJlZm9yZSBhbnl0aGluZyBlbHNlIGJlY2F1c2VcbiAgLy8gd2l0aG91dCB0aGUgcG9zaXRpb24gYXBwbGllZCB3ZSBjYW4ndCBndWFyYW50ZWUgY29ycmVjdCBjb21wdXRhdGlvbnNcbiAgc2V0U3R5bGVzKHBvcHBlciwgeyBwb3NpdGlvbjogb3B0aW9ucy5wb3NpdGlvbkZpeGVkID8gJ2ZpeGVkJyA6ICdhYnNvbHV0ZScgfSk7XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge0Jvb2xlYW59IHNob3VsZFJvdW5kIC0gSWYgdGhlIG9mZnNldHMgc2hvdWxkIGJlIHJvdW5kZWQgYXQgYWxsXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcG9wcGVyJ3MgcG9zaXRpb24gb2Zmc2V0cyByb3VuZGVkXG4gKlxuICogVGhlIHRhbGUgb2YgcGl4ZWwtcGVyZmVjdCBwb3NpdGlvbmluZy4gSXQncyBzdGlsbCBub3QgMTAwJSBwZXJmZWN0LCBidXQgYXNcbiAqIGdvb2QgYXMgaXQgY2FuIGJlIHdpdGhpbiByZWFzb24uXG4gKiBEaXNjdXNzaW9uIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9GZXpWcmFzdGEvcG9wcGVyLmpzL3B1bGwvNzE1XG4gKlxuICogTG93IERQSSBzY3JlZW5zIGNhdXNlIGEgcG9wcGVyIHRvIGJlIGJsdXJyeSBpZiBub3QgdXNpbmcgZnVsbCBwaXhlbHMgKFNhZmFyaVxuICogYXMgd2VsbCBvbiBIaWdoIERQSSBzY3JlZW5zKS5cbiAqXG4gKiBGaXJlZm94IHByZWZlcnMgbm8gcm91bmRpbmcgZm9yIHBvc2l0aW9uaW5nIGFuZCBkb2VzIG5vdCBoYXZlIGJsdXJyaW5lc3Mgb25cbiAqIGhpZ2ggRFBJIHNjcmVlbnMuXG4gKlxuICogT25seSBob3Jpem9udGFsIHBsYWNlbWVudCBhbmQgbGVmdC9yaWdodCB2YWx1ZXMgbmVlZCB0byBiZSBjb25zaWRlcmVkLlxuICovXG5mdW5jdGlvbiBnZXRSb3VuZGVkT2Zmc2V0cyhkYXRhLCBzaG91bGRSb3VuZCkge1xuICB2YXIgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyLFxuICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2U7XG4gIHZhciByb3VuZCA9IE1hdGgucm91bmQsXG4gICAgICBmbG9vciA9IE1hdGguZmxvb3I7XG5cbiAgdmFyIG5vUm91bmQgPSBmdW5jdGlvbiBub1JvdW5kKHYpIHtcbiAgICByZXR1cm4gdjtcbiAgfTtcblxuICB2YXIgcmVmZXJlbmNlV2lkdGggPSByb3VuZChyZWZlcmVuY2Uud2lkdGgpO1xuICB2YXIgcG9wcGVyV2lkdGggPSByb3VuZChwb3BwZXIud2lkdGgpO1xuXG4gIHZhciBpc1ZlcnRpY2FsID0gWydsZWZ0JywgJ3JpZ2h0J10uaW5kZXhPZihkYXRhLnBsYWNlbWVudCkgIT09IC0xO1xuICB2YXIgaXNWYXJpYXRpb24gPSBkYXRhLnBsYWNlbWVudC5pbmRleE9mKCctJykgIT09IC0xO1xuICB2YXIgc2FtZVdpZHRoUGFyaXR5ID0gcmVmZXJlbmNlV2lkdGggJSAyID09PSBwb3BwZXJXaWR0aCAlIDI7XG4gIHZhciBib3RoT2RkV2lkdGggPSByZWZlcmVuY2VXaWR0aCAlIDIgPT09IDEgJiYgcG9wcGVyV2lkdGggJSAyID09PSAxO1xuXG4gIHZhciBob3Jpem9udGFsVG9JbnRlZ2VyID0gIXNob3VsZFJvdW5kID8gbm9Sb3VuZCA6IGlzVmVydGljYWwgfHwgaXNWYXJpYXRpb24gfHwgc2FtZVdpZHRoUGFyaXR5ID8gcm91bmQgOiBmbG9vcjtcbiAgdmFyIHZlcnRpY2FsVG9JbnRlZ2VyID0gIXNob3VsZFJvdW5kID8gbm9Sb3VuZCA6IHJvdW5kO1xuXG4gIHJldHVybiB7XG4gICAgbGVmdDogaG9yaXpvbnRhbFRvSW50ZWdlcihib3RoT2RkV2lkdGggJiYgIWlzVmFyaWF0aW9uICYmIHNob3VsZFJvdW5kID8gcG9wcGVyLmxlZnQgLSAxIDogcG9wcGVyLmxlZnQpLFxuICAgIHRvcDogdmVydGljYWxUb0ludGVnZXIocG9wcGVyLnRvcCksXG4gICAgYm90dG9tOiB2ZXJ0aWNhbFRvSW50ZWdlcihwb3BwZXIuYm90dG9tKSxcbiAgICByaWdodDogaG9yaXpvbnRhbFRvSW50ZWdlcihwb3BwZXIucmlnaHQpXG4gIH07XG59XG5cbnZhciBpc0ZpcmVmb3ggPSBpc0Jyb3dzZXIgJiYgL0ZpcmVmb3gvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBjb21wdXRlU3R5bGUoZGF0YSwgb3B0aW9ucykge1xuICB2YXIgeCA9IG9wdGlvbnMueCxcbiAgICAgIHkgPSBvcHRpb25zLnk7XG4gIHZhciBwb3BwZXIgPSBkYXRhLm9mZnNldHMucG9wcGVyO1xuXG4gIC8vIFJlbW92ZSB0aGlzIGxlZ2FjeSBzdXBwb3J0IGluIFBvcHBlci5qcyB2MlxuXG4gIHZhciBsZWdhY3lHcHVBY2NlbGVyYXRpb25PcHRpb24gPSBmaW5kKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCBmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICByZXR1cm4gbW9kaWZpZXIubmFtZSA9PT0gJ2FwcGx5U3R5bGUnO1xuICB9KS5ncHVBY2NlbGVyYXRpb247XG4gIGlmIChsZWdhY3lHcHVBY2NlbGVyYXRpb25PcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnNvbGUud2FybignV0FSTklORzogYGdwdUFjY2VsZXJhdGlvbmAgb3B0aW9uIG1vdmVkIHRvIGBjb21wdXRlU3R5bGVgIG1vZGlmaWVyIGFuZCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFBvcHBlci5qcyEnKTtcbiAgfVxuICB2YXIgZ3B1QWNjZWxlcmF0aW9uID0gbGVnYWN5R3B1QWNjZWxlcmF0aW9uT3B0aW9uICE9PSB1bmRlZmluZWQgPyBsZWdhY3lHcHVBY2NlbGVyYXRpb25PcHRpb24gOiBvcHRpb25zLmdwdUFjY2VsZXJhdGlvbjtcblxuICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KGRhdGEuaW5zdGFuY2UucG9wcGVyKTtcbiAgdmFyIG9mZnNldFBhcmVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qob2Zmc2V0UGFyZW50KTtcblxuICAvLyBTdHlsZXNcbiAgdmFyIHN0eWxlcyA9IHtcbiAgICBwb3NpdGlvbjogcG9wcGVyLnBvc2l0aW9uXG4gIH07XG5cbiAgdmFyIG9mZnNldHMgPSBnZXRSb3VuZGVkT2Zmc2V0cyhkYXRhLCB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA8IDIgfHwgIWlzRmlyZWZveCk7XG5cbiAgdmFyIHNpZGVBID0geCA9PT0gJ2JvdHRvbScgPyAndG9wJyA6ICdib3R0b20nO1xuICB2YXIgc2lkZUIgPSB5ID09PSAncmlnaHQnID8gJ2xlZnQnIDogJ3JpZ2h0JztcblxuICAvLyBpZiBncHVBY2NlbGVyYXRpb24gaXMgc2V0IHRvIGB0cnVlYCBhbmQgdHJhbnNmb3JtIGlzIHN1cHBvcnRlZCxcbiAgLy8gIHdlIHVzZSBgdHJhbnNsYXRlM2RgIHRvIGFwcGx5IHRoZSBwb3NpdGlvbiB0byB0aGUgcG9wcGVyIHdlXG4gIC8vIGF1dG9tYXRpY2FsbHkgdXNlIHRoZSBzdXBwb3J0ZWQgcHJlZml4ZWQgdmVyc2lvbiBpZiBuZWVkZWRcbiAgdmFyIHByZWZpeGVkUHJvcGVydHkgPSBnZXRTdXBwb3J0ZWRQcm9wZXJ0eU5hbWUoJ3RyYW5zZm9ybScpO1xuXG4gIC8vIG5vdywgbGV0J3MgbWFrZSBhIHN0ZXAgYmFjayBhbmQgbG9vayBhdCB0aGlzIGNvZGUgY2xvc2VseSAod3RmPylcbiAgLy8gSWYgdGhlIGNvbnRlbnQgb2YgdGhlIHBvcHBlciBncm93cyBvbmNlIGl0J3MgYmVlbiBwb3NpdGlvbmVkLCBpdFxuICAvLyBtYXkgaGFwcGVuIHRoYXQgdGhlIHBvcHBlciBnZXRzIG1pc3BsYWNlZCBiZWNhdXNlIG9mIHRoZSBuZXcgY29udGVudFxuICAvLyBvdmVyZmxvd2luZyBpdHMgcmVmZXJlbmNlIGVsZW1lbnRcbiAgLy8gVG8gYXZvaWQgdGhpcyBwcm9ibGVtLCB3ZSBwcm92aWRlIHR3byBvcHRpb25zICh4IGFuZCB5KSwgd2hpY2ggYWxsb3dcbiAgLy8gdGhlIGNvbnN1bWVyIHRvIGRlZmluZSB0aGUgb2Zmc2V0IG9yaWdpbi5cbiAgLy8gSWYgd2UgcG9zaXRpb24gYSBwb3BwZXIgb24gdG9wIG9mIGEgcmVmZXJlbmNlIGVsZW1lbnQsIHdlIGNhbiBzZXRcbiAgLy8gYHhgIHRvIGB0b3BgIHRvIG1ha2UgdGhlIHBvcHBlciBncm93IHRvd2FyZHMgaXRzIHRvcCBpbnN0ZWFkIG9mXG4gIC8vIGl0cyBib3R0b20uXG4gIHZhciBsZWZ0ID0gdm9pZCAwLFxuICAgICAgdG9wID0gdm9pZCAwO1xuICBpZiAoc2lkZUEgPT09ICdib3R0b20nKSB7XG4gICAgLy8gd2hlbiBvZmZzZXRQYXJlbnQgaXMgPGh0bWw+IHRoZSBwb3NpdGlvbmluZyBpcyByZWxhdGl2ZSB0byB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gKGV4Y2x1ZGluZyB0aGUgc2Nyb2xsYmFyKVxuICAgIC8vIGFuZCBub3QgdGhlIGJvdHRvbSBvZiB0aGUgaHRtbCBlbGVtZW50XG4gICAgaWYgKG9mZnNldFBhcmVudC5ub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgICB0b3AgPSAtb2Zmc2V0UGFyZW50LmNsaWVudEhlaWdodCArIG9mZnNldHMuYm90dG9tO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b3AgPSAtb2Zmc2V0UGFyZW50UmVjdC5oZWlnaHQgKyBvZmZzZXRzLmJvdHRvbTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdG9wID0gb2Zmc2V0cy50b3A7XG4gIH1cbiAgaWYgKHNpZGVCID09PSAncmlnaHQnKSB7XG4gICAgaWYgKG9mZnNldFBhcmVudC5ub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgICBsZWZ0ID0gLW9mZnNldFBhcmVudC5jbGllbnRXaWR0aCArIG9mZnNldHMucmlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlZnQgPSAtb2Zmc2V0UGFyZW50UmVjdC53aWR0aCArIG9mZnNldHMucmlnaHQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxlZnQgPSBvZmZzZXRzLmxlZnQ7XG4gIH1cbiAgaWYgKGdwdUFjY2VsZXJhdGlvbiAmJiBwcmVmaXhlZFByb3BlcnR5KSB7XG4gICAgc3R5bGVzW3ByZWZpeGVkUHJvcGVydHldID0gJ3RyYW5zbGF0ZTNkKCcgKyBsZWZ0ICsgJ3B4LCAnICsgdG9wICsgJ3B4LCAwKSc7XG4gICAgc3R5bGVzW3NpZGVBXSA9IDA7XG4gICAgc3R5bGVzW3NpZGVCXSA9IDA7XG4gICAgc3R5bGVzLndpbGxDaGFuZ2UgPSAndHJhbnNmb3JtJztcbiAgfSBlbHNlIHtcbiAgICAvLyBvdGh3ZXJpc2UsIHdlIHVzZSB0aGUgc3RhbmRhcmQgYHRvcGAsIGBsZWZ0YCwgYGJvdHRvbWAgYW5kIGByaWdodGAgcHJvcGVydGllc1xuICAgIHZhciBpbnZlcnRUb3AgPSBzaWRlQSA9PT0gJ2JvdHRvbScgPyAtMSA6IDE7XG4gICAgdmFyIGludmVydExlZnQgPSBzaWRlQiA9PT0gJ3JpZ2h0JyA/IC0xIDogMTtcbiAgICBzdHlsZXNbc2lkZUFdID0gdG9wICogaW52ZXJ0VG9wO1xuICAgIHN0eWxlc1tzaWRlQl0gPSBsZWZ0ICogaW52ZXJ0TGVmdDtcbiAgICBzdHlsZXMud2lsbENoYW5nZSA9IHNpZGVBICsgJywgJyArIHNpZGVCO1xuICB9XG5cbiAgLy8gQXR0cmlidXRlc1xuICB2YXIgYXR0cmlidXRlcyA9IHtcbiAgICAneC1wbGFjZW1lbnQnOiBkYXRhLnBsYWNlbWVudFxuICB9O1xuXG4gIC8vIFVwZGF0ZSBgZGF0YWAgYXR0cmlidXRlcywgc3R5bGVzIGFuZCBhcnJvd1N0eWxlc1xuICBkYXRhLmF0dHJpYnV0ZXMgPSBfZXh0ZW5kcyh7fSwgYXR0cmlidXRlcywgZGF0YS5hdHRyaWJ1dGVzKTtcbiAgZGF0YS5zdHlsZXMgPSBfZXh0ZW5kcyh7fSwgc3R5bGVzLCBkYXRhLnN0eWxlcyk7XG4gIGRhdGEuYXJyb3dTdHlsZXMgPSBfZXh0ZW5kcyh7fSwgZGF0YS5vZmZzZXRzLmFycm93LCBkYXRhLmFycm93U3R5bGVzKTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdXNlZCB0byBrbm93IGlmIHRoZSBnaXZlbiBtb2RpZmllciBkZXBlbmRzIGZyb20gYW5vdGhlciBvbmUuPGJyIC8+XG4gKiBJdCBjaGVja3MgaWYgdGhlIG5lZWRlZCBtb2RpZmllciBpcyBsaXN0ZWQgYW5kIGVuYWJsZWQuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0FycmF5fSBtb2RpZmllcnMgLSBsaXN0IG9mIG1vZGlmaWVyc1xuICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RpbmdOYW1lIC0gbmFtZSBvZiByZXF1ZXN0aW5nIG1vZGlmaWVyXG4gKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdGVkTmFtZSAtIG5hbWUgb2YgcmVxdWVzdGVkIG1vZGlmaWVyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNNb2RpZmllclJlcXVpcmVkKG1vZGlmaWVycywgcmVxdWVzdGluZ05hbWUsIHJlcXVlc3RlZE5hbWUpIHtcbiAgdmFyIHJlcXVlc3RpbmcgPSBmaW5kKG1vZGlmaWVycywgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgbmFtZSA9IF9yZWYubmFtZTtcbiAgICByZXR1cm4gbmFtZSA9PT0gcmVxdWVzdGluZ05hbWU7XG4gIH0pO1xuXG4gIHZhciBpc1JlcXVpcmVkID0gISFyZXF1ZXN0aW5nICYmIG1vZGlmaWVycy5zb21lKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIHJldHVybiBtb2RpZmllci5uYW1lID09PSByZXF1ZXN0ZWROYW1lICYmIG1vZGlmaWVyLmVuYWJsZWQgJiYgbW9kaWZpZXIub3JkZXIgPCByZXF1ZXN0aW5nLm9yZGVyO1xuICB9KTtcblxuICBpZiAoIWlzUmVxdWlyZWQpIHtcbiAgICB2YXIgX3JlcXVlc3RpbmcgPSAnYCcgKyByZXF1ZXN0aW5nTmFtZSArICdgJztcbiAgICB2YXIgcmVxdWVzdGVkID0gJ2AnICsgcmVxdWVzdGVkTmFtZSArICdgJztcbiAgICBjb25zb2xlLndhcm4ocmVxdWVzdGVkICsgJyBtb2RpZmllciBpcyByZXF1aXJlZCBieSAnICsgX3JlcXVlc3RpbmcgKyAnIG1vZGlmaWVyIGluIG9yZGVyIHRvIHdvcmssIGJlIHN1cmUgdG8gaW5jbHVkZSBpdCBiZWZvcmUgJyArIF9yZXF1ZXN0aW5nICsgJyEnKTtcbiAgfVxuICByZXR1cm4gaXNSZXF1aXJlZDtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGFycm93KGRhdGEsIG9wdGlvbnMpIHtcbiAgdmFyIF9kYXRhJG9mZnNldHMkYXJyb3c7XG5cbiAgLy8gYXJyb3cgZGVwZW5kcyBvbiBrZWVwVG9nZXRoZXIgaW4gb3JkZXIgdG8gd29ya1xuICBpZiAoIWlzTW9kaWZpZXJSZXF1aXJlZChkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgJ2Fycm93JywgJ2tlZXBUb2dldGhlcicpKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICB2YXIgYXJyb3dFbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50O1xuXG4gIC8vIGlmIGFycm93RWxlbWVudCBpcyBhIHN0cmluZywgc3VwcG9zZSBpdCdzIGEgQ1NTIHNlbGVjdG9yXG4gIGlmICh0eXBlb2YgYXJyb3dFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIGFycm93RWxlbWVudCA9IGRhdGEuaW5zdGFuY2UucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3dFbGVtZW50KTtcblxuICAgIC8vIGlmIGFycm93RWxlbWVudCBpcyBub3QgZm91bmQsIGRvbid0IHJ1biB0aGUgbW9kaWZpZXJcbiAgICBpZiAoIWFycm93RWxlbWVudCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGlmIHRoZSBhcnJvd0VsZW1lbnQgaXNuJ3QgYSBxdWVyeSBzZWxlY3RvciB3ZSBtdXN0IGNoZWNrIHRoYXQgdGhlXG4gICAgLy8gcHJvdmlkZWQgRE9NIG5vZGUgaXMgY2hpbGQgb2YgaXRzIHBvcHBlciBub2RlXG4gICAgaWYgKCFkYXRhLmluc3RhbmNlLnBvcHBlci5jb250YWlucyhhcnJvd0VsZW1lbnQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IGBhcnJvdy5lbGVtZW50YCBtdXN0IGJlIGNoaWxkIG9mIGl0cyBwb3BwZXIgZWxlbWVudCEnKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgfVxuXG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICB2YXIgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyLFxuICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2U7XG5cbiAgdmFyIGlzVmVydGljYWwgPSBbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xO1xuXG4gIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICB2YXIgc2lkZUNhcGl0YWxpemVkID0gaXNWZXJ0aWNhbCA/ICdUb3AnIDogJ0xlZnQnO1xuICB2YXIgc2lkZSA9IHNpZGVDYXBpdGFsaXplZC50b0xvd2VyQ2FzZSgpO1xuICB2YXIgYWx0U2lkZSA9IGlzVmVydGljYWwgPyAnbGVmdCcgOiAndG9wJztcbiAgdmFyIG9wU2lkZSA9IGlzVmVydGljYWwgPyAnYm90dG9tJyA6ICdyaWdodCc7XG4gIHZhciBhcnJvd0VsZW1lbnRTaXplID0gZ2V0T3V0ZXJTaXplcyhhcnJvd0VsZW1lbnQpW2xlbl07XG5cbiAgLy9cbiAgLy8gZXh0ZW5kcyBrZWVwVG9nZXRoZXIgYmVoYXZpb3IgbWFraW5nIHN1cmUgdGhlIHBvcHBlciBhbmQgaXRzXG4gIC8vIHJlZmVyZW5jZSBoYXZlIGVub3VnaCBwaXhlbHMgaW4gY29uanVuY3Rpb25cbiAgLy9cblxuICAvLyB0b3AvbGVmdCBzaWRlXG4gIGlmIChyZWZlcmVuY2Vbb3BTaWRlXSAtIGFycm93RWxlbWVudFNpemUgPCBwb3BwZXJbc2lkZV0pIHtcbiAgICBkYXRhLm9mZnNldHMucG9wcGVyW3NpZGVdIC09IHBvcHBlcltzaWRlXSAtIChyZWZlcmVuY2Vbb3BTaWRlXSAtIGFycm93RWxlbWVudFNpemUpO1xuICB9XG4gIC8vIGJvdHRvbS9yaWdodCBzaWRlXG4gIGlmIChyZWZlcmVuY2Vbc2lkZV0gKyBhcnJvd0VsZW1lbnRTaXplID4gcG9wcGVyW29wU2lkZV0pIHtcbiAgICBkYXRhLm9mZnNldHMucG9wcGVyW3NpZGVdICs9IHJlZmVyZW5jZVtzaWRlXSArIGFycm93RWxlbWVudFNpemUgLSBwb3BwZXJbb3BTaWRlXTtcbiAgfVxuICBkYXRhLm9mZnNldHMucG9wcGVyID0gZ2V0Q2xpZW50UmVjdChkYXRhLm9mZnNldHMucG9wcGVyKTtcblxuICAvLyBjb21wdXRlIGNlbnRlciBvZiB0aGUgcG9wcGVyXG4gIHZhciBjZW50ZXIgPSByZWZlcmVuY2Vbc2lkZV0gKyByZWZlcmVuY2VbbGVuXSAvIDIgLSBhcnJvd0VsZW1lbnRTaXplIC8gMjtcblxuICAvLyBDb21wdXRlIHRoZSBzaWRlVmFsdWUgdXNpbmcgdGhlIHVwZGF0ZWQgcG9wcGVyIG9mZnNldHNcbiAgLy8gdGFrZSBwb3BwZXIgbWFyZ2luIGluIGFjY291bnQgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRoaXMgaW5mbyBhdmFpbGFibGVcbiAgdmFyIGNzcyA9IGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShkYXRhLmluc3RhbmNlLnBvcHBlcik7XG4gIHZhciBwb3BwZXJNYXJnaW5TaWRlID0gcGFyc2VGbG9hdChjc3NbJ21hcmdpbicgKyBzaWRlQ2FwaXRhbGl6ZWRdKTtcbiAgdmFyIHBvcHBlckJvcmRlclNpZGUgPSBwYXJzZUZsb2F0KGNzc1snYm9yZGVyJyArIHNpZGVDYXBpdGFsaXplZCArICdXaWR0aCddKTtcbiAgdmFyIHNpZGVWYWx1ZSA9IGNlbnRlciAtIGRhdGEub2Zmc2V0cy5wb3BwZXJbc2lkZV0gLSBwb3BwZXJNYXJnaW5TaWRlIC0gcG9wcGVyQm9yZGVyU2lkZTtcblxuICAvLyBwcmV2ZW50IGFycm93RWxlbWVudCBmcm9tIGJlaW5nIHBsYWNlZCBub3QgY29udGlndW91c2x5IHRvIGl0cyBwb3BwZXJcbiAgc2lkZVZhbHVlID0gTWF0aC5tYXgoTWF0aC5taW4ocG9wcGVyW2xlbl0gLSBhcnJvd0VsZW1lbnRTaXplLCBzaWRlVmFsdWUpLCAwKTtcblxuICBkYXRhLmFycm93RWxlbWVudCA9IGFycm93RWxlbWVudDtcbiAgZGF0YS5vZmZzZXRzLmFycm93ID0gKF9kYXRhJG9mZnNldHMkYXJyb3cgPSB7fSwgZGVmaW5lUHJvcGVydHkoX2RhdGEkb2Zmc2V0cyRhcnJvdywgc2lkZSwgTWF0aC5yb3VuZChzaWRlVmFsdWUpKSwgZGVmaW5lUHJvcGVydHkoX2RhdGEkb2Zmc2V0cyRhcnJvdywgYWx0U2lkZSwgJycpLCBfZGF0YSRvZmZzZXRzJGFycm93KTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG9wcG9zaXRlIHBsYWNlbWVudCB2YXJpYXRpb24gb2YgdGhlIGdpdmVuIG9uZVxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtTdHJpbmd9IHBsYWNlbWVudCB2YXJpYXRpb25cbiAqIEByZXR1cm5zIHtTdHJpbmd9IGZsaXBwZWQgcGxhY2VtZW50IHZhcmlhdGlvblxuICovXG5mdW5jdGlvbiBnZXRPcHBvc2l0ZVZhcmlhdGlvbih2YXJpYXRpb24pIHtcbiAgaWYgKHZhcmlhdGlvbiA9PT0gJ2VuZCcpIHtcbiAgICByZXR1cm4gJ3N0YXJ0JztcbiAgfSBlbHNlIGlmICh2YXJpYXRpb24gPT09ICdzdGFydCcpIHtcbiAgICByZXR1cm4gJ2VuZCc7XG4gIH1cbiAgcmV0dXJuIHZhcmlhdGlvbjtcbn1cblxuLyoqXG4gKiBMaXN0IG9mIGFjY2VwdGVkIHBsYWNlbWVudHMgdG8gdXNlIGFzIHZhbHVlcyBvZiB0aGUgYHBsYWNlbWVudGAgb3B0aW9uLjxiciAvPlxuICogVmFsaWQgcGxhY2VtZW50cyBhcmU6XG4gKiAtIGBhdXRvYFxuICogLSBgdG9wYFxuICogLSBgcmlnaHRgXG4gKiAtIGBib3R0b21gXG4gKiAtIGBsZWZ0YFxuICpcbiAqIEVhY2ggcGxhY2VtZW50IGNhbiBoYXZlIGEgdmFyaWF0aW9uIGZyb20gdGhpcyBsaXN0OlxuICogLSBgLXN0YXJ0YFxuICogLSBgLWVuZGBcbiAqXG4gKiBWYXJpYXRpb25zIGFyZSBpbnRlcnByZXRlZCBlYXNpbHkgaWYgeW91IHRoaW5rIG9mIHRoZW0gYXMgdGhlIGxlZnQgdG8gcmlnaHRcbiAqIHdyaXR0ZW4gbGFuZ3VhZ2VzLiBIb3Jpem9udGFsbHkgKGB0b3BgIGFuZCBgYm90dG9tYCksIGBzdGFydGAgaXMgbGVmdCBhbmQgYGVuZGBcbiAqIGlzIHJpZ2h0LjxiciAvPlxuICogVmVydGljYWxseSAoYGxlZnRgIGFuZCBgcmlnaHRgKSwgYHN0YXJ0YCBpcyB0b3AgYW5kIGBlbmRgIGlzIGJvdHRvbS5cbiAqXG4gKiBTb21lIHZhbGlkIGV4YW1wbGVzIGFyZTpcbiAqIC0gYHRvcC1lbmRgIChvbiB0b3Agb2YgcmVmZXJlbmNlLCByaWdodCBhbGlnbmVkKVxuICogLSBgcmlnaHQtc3RhcnRgIChvbiByaWdodCBvZiByZWZlcmVuY2UsIHRvcCBhbGlnbmVkKVxuICogLSBgYm90dG9tYCAob24gYm90dG9tLCBjZW50ZXJlZClcbiAqIC0gYGF1dG8tZW5kYCAob24gdGhlIHNpZGUgd2l0aCBtb3JlIHNwYWNlIGF2YWlsYWJsZSwgYWxpZ25tZW50IGRlcGVuZHMgYnkgcGxhY2VtZW50KVxuICpcbiAqIEBzdGF0aWNcbiAqIEB0eXBlIHtBcnJheX1cbiAqIEBlbnVtIHtTdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZXRob2QgcGxhY2VtZW50c1xuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG52YXIgcGxhY2VtZW50cyA9IFsnYXV0by1zdGFydCcsICdhdXRvJywgJ2F1dG8tZW5kJywgJ3RvcC1zdGFydCcsICd0b3AnLCAndG9wLWVuZCcsICdyaWdodC1zdGFydCcsICdyaWdodCcsICdyaWdodC1lbmQnLCAnYm90dG9tLWVuZCcsICdib3R0b20nLCAnYm90dG9tLXN0YXJ0JywgJ2xlZnQtZW5kJywgJ2xlZnQnLCAnbGVmdC1zdGFydCddO1xuXG4vLyBHZXQgcmlkIG9mIGBhdXRvYCBgYXV0by1zdGFydGAgYW5kIGBhdXRvLWVuZGBcbnZhciB2YWxpZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzLnNsaWNlKDMpO1xuXG4vKipcbiAqIEdpdmVuIGFuIGluaXRpYWwgcGxhY2VtZW50LCByZXR1cm5zIGFsbCB0aGUgc3Vic2VxdWVudCBwbGFjZW1lbnRzXG4gKiBjbG9ja3dpc2UgKG9yIGNvdW50ZXItY2xvY2t3aXNlKS5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge1N0cmluZ30gcGxhY2VtZW50IC0gQSB2YWxpZCBwbGFjZW1lbnQgKGl0IGFjY2VwdHMgdmFyaWF0aW9ucylcbiAqIEBhcmd1bWVudCB7Qm9vbGVhbn0gY291bnRlciAtIFNldCB0byB0cnVlIHRvIHdhbGsgdGhlIHBsYWNlbWVudHMgY291bnRlcmNsb2Nrd2lzZVxuICogQHJldHVybnMge0FycmF5fSBwbGFjZW1lbnRzIGluY2x1ZGluZyB0aGVpciB2YXJpYXRpb25zXG4gKi9cbmZ1bmN0aW9uIGNsb2Nrd2lzZShwbGFjZW1lbnQpIHtcbiAgdmFyIGNvdW50ZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gIHZhciBpbmRleCA9IHZhbGlkUGxhY2VtZW50cy5pbmRleE9mKHBsYWNlbWVudCk7XG4gIHZhciBhcnIgPSB2YWxpZFBsYWNlbWVudHMuc2xpY2UoaW5kZXggKyAxKS5jb25jYXQodmFsaWRQbGFjZW1lbnRzLnNsaWNlKDAsIGluZGV4KSk7XG4gIHJldHVybiBjb3VudGVyID8gYXJyLnJldmVyc2UoKSA6IGFycjtcbn1cblxudmFyIEJFSEFWSU9SUyA9IHtcbiAgRkxJUDogJ2ZsaXAnLFxuICBDTE9DS1dJU0U6ICdjbG9ja3dpc2UnLFxuICBDT1VOVEVSQ0xPQ0tXSVNFOiAnY291bnRlcmNsb2Nrd2lzZSdcbn07XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgdXBkYXRlIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBmbGlwKGRhdGEsIG9wdGlvbnMpIHtcbiAgLy8gaWYgYGlubmVyYCBtb2RpZmllciBpcyBlbmFibGVkLCB3ZSBjYW4ndCB1c2UgdGhlIGBmbGlwYCBtb2RpZmllclxuICBpZiAoaXNNb2RpZmllckVuYWJsZWQoZGF0YS5pbnN0YW5jZS5tb2RpZmllcnMsICdpbm5lcicpKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBpZiAoZGF0YS5mbGlwcGVkICYmIGRhdGEucGxhY2VtZW50ID09PSBkYXRhLm9yaWdpbmFsUGxhY2VtZW50KSB7XG4gICAgLy8gc2VlbXMgbGlrZSBmbGlwIGlzIHRyeWluZyB0byBsb29wLCBwcm9iYWJseSB0aGVyZSdzIG5vdCBlbm91Z2ggc3BhY2Ugb24gYW55IG9mIHRoZSBmbGlwcGFibGUgc2lkZXNcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHZhciBib3VuZGFyaWVzID0gZ2V0Qm91bmRhcmllcyhkYXRhLmluc3RhbmNlLnBvcHBlciwgZGF0YS5pbnN0YW5jZS5yZWZlcmVuY2UsIG9wdGlvbnMucGFkZGluZywgb3B0aW9ucy5ib3VuZGFyaWVzRWxlbWVudCwgZGF0YS5wb3NpdGlvbkZpeGVkKTtcblxuICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgdmFyIHBsYWNlbWVudE9wcG9zaXRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgdmFyIHZhcmlhdGlvbiA9IGRhdGEucGxhY2VtZW50LnNwbGl0KCctJylbMV0gfHwgJyc7XG5cbiAgdmFyIGZsaXBPcmRlciA9IFtdO1xuXG4gIHN3aXRjaCAob3B0aW9ucy5iZWhhdmlvcikge1xuICAgIGNhc2UgQkVIQVZJT1JTLkZMSVA6XG4gICAgICBmbGlwT3JkZXIgPSBbcGxhY2VtZW50LCBwbGFjZW1lbnRPcHBvc2l0ZV07XG4gICAgICBicmVhaztcbiAgICBjYXNlIEJFSEFWSU9SUy5DTE9DS1dJU0U6XG4gICAgICBmbGlwT3JkZXIgPSBjbG9ja3dpc2UocGxhY2VtZW50KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQkVIQVZJT1JTLkNPVU5URVJDTE9DS1dJU0U6XG4gICAgICBmbGlwT3JkZXIgPSBjbG9ja3dpc2UocGxhY2VtZW50LCB0cnVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBmbGlwT3JkZXIgPSBvcHRpb25zLmJlaGF2aW9yO1xuICB9XG5cbiAgZmxpcE9yZGVyLmZvckVhY2goZnVuY3Rpb24gKHN0ZXAsIGluZGV4KSB7XG4gICAgaWYgKHBsYWNlbWVudCAhPT0gc3RlcCB8fCBmbGlwT3JkZXIubGVuZ3RoID09PSBpbmRleCArIDEpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gICAgcGxhY2VtZW50T3Bwb3NpdGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuXG4gICAgdmFyIHBvcHBlck9mZnNldHMgPSBkYXRhLm9mZnNldHMucG9wcGVyO1xuICAgIHZhciByZWZPZmZzZXRzID0gZGF0YS5vZmZzZXRzLnJlZmVyZW5jZTtcblxuICAgIC8vIHVzaW5nIGZsb29yIGJlY2F1c2UgdGhlIHJlZmVyZW5jZSBvZmZzZXRzIG1heSBjb250YWluIGRlY2ltYWxzIHdlIGFyZSBub3QgZ29pbmcgdG8gY29uc2lkZXIgaGVyZVxuICAgIHZhciBmbG9vciA9IE1hdGguZmxvb3I7XG4gICAgdmFyIG92ZXJsYXBzUmVmID0gcGxhY2VtZW50ID09PSAnbGVmdCcgJiYgZmxvb3IocG9wcGVyT2Zmc2V0cy5yaWdodCkgPiBmbG9vcihyZWZPZmZzZXRzLmxlZnQpIHx8IHBsYWNlbWVudCA9PT0gJ3JpZ2h0JyAmJiBmbG9vcihwb3BwZXJPZmZzZXRzLmxlZnQpIDwgZmxvb3IocmVmT2Zmc2V0cy5yaWdodCkgfHwgcGxhY2VtZW50ID09PSAndG9wJyAmJiBmbG9vcihwb3BwZXJPZmZzZXRzLmJvdHRvbSkgPiBmbG9vcihyZWZPZmZzZXRzLnRvcCkgfHwgcGxhY2VtZW50ID09PSAnYm90dG9tJyAmJiBmbG9vcihwb3BwZXJPZmZzZXRzLnRvcCkgPCBmbG9vcihyZWZPZmZzZXRzLmJvdHRvbSk7XG5cbiAgICB2YXIgb3ZlcmZsb3dzTGVmdCA9IGZsb29yKHBvcHBlck9mZnNldHMubGVmdCkgPCBmbG9vcihib3VuZGFyaWVzLmxlZnQpO1xuICAgIHZhciBvdmVyZmxvd3NSaWdodCA9IGZsb29yKHBvcHBlck9mZnNldHMucmlnaHQpID4gZmxvb3IoYm91bmRhcmllcy5yaWdodCk7XG4gICAgdmFyIG92ZXJmbG93c1RvcCA9IGZsb29yKHBvcHBlck9mZnNldHMudG9wKSA8IGZsb29yKGJvdW5kYXJpZXMudG9wKTtcbiAgICB2YXIgb3ZlcmZsb3dzQm90dG9tID0gZmxvb3IocG9wcGVyT2Zmc2V0cy5ib3R0b20pID4gZmxvb3IoYm91bmRhcmllcy5ib3R0b20pO1xuXG4gICAgdmFyIG92ZXJmbG93c0JvdW5kYXJpZXMgPSBwbGFjZW1lbnQgPT09ICdsZWZ0JyAmJiBvdmVyZmxvd3NMZWZ0IHx8IHBsYWNlbWVudCA9PT0gJ3JpZ2h0JyAmJiBvdmVyZmxvd3NSaWdodCB8fCBwbGFjZW1lbnQgPT09ICd0b3AnICYmIG92ZXJmbG93c1RvcCB8fCBwbGFjZW1lbnQgPT09ICdib3R0b20nICYmIG92ZXJmbG93c0JvdHRvbTtcblxuICAgIC8vIGZsaXAgdGhlIHZhcmlhdGlvbiBpZiByZXF1aXJlZFxuICAgIHZhciBpc1ZlcnRpY2FsID0gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMTtcblxuICAgIC8vIGZsaXBzIHZhcmlhdGlvbiBpZiByZWZlcmVuY2UgZWxlbWVudCBvdmVyZmxvd3MgYm91bmRhcmllc1xuICAgIHZhciBmbGlwcGVkVmFyaWF0aW9uQnlSZWYgPSAhIW9wdGlvbnMuZmxpcFZhcmlhdGlvbnMgJiYgKGlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnc3RhcnQnICYmIG92ZXJmbG93c0xlZnQgfHwgaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdlbmQnICYmIG92ZXJmbG93c1JpZ2h0IHx8ICFpc1ZlcnRpY2FsICYmIHZhcmlhdGlvbiA9PT0gJ3N0YXJ0JyAmJiBvdmVyZmxvd3NUb3AgfHwgIWlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnZW5kJyAmJiBvdmVyZmxvd3NCb3R0b20pO1xuXG4gICAgLy8gZmxpcHMgdmFyaWF0aW9uIGlmIHBvcHBlciBjb250ZW50IG92ZXJmbG93cyBib3VuZGFyaWVzXG4gICAgdmFyIGZsaXBwZWRWYXJpYXRpb25CeUNvbnRlbnQgPSAhIW9wdGlvbnMuZmxpcFZhcmlhdGlvbnNCeUNvbnRlbnQgJiYgKGlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnc3RhcnQnICYmIG92ZXJmbG93c1JpZ2h0IHx8IGlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnZW5kJyAmJiBvdmVyZmxvd3NMZWZ0IHx8ICFpc1ZlcnRpY2FsICYmIHZhcmlhdGlvbiA9PT0gJ3N0YXJ0JyAmJiBvdmVyZmxvd3NCb3R0b20gfHwgIWlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnZW5kJyAmJiBvdmVyZmxvd3NUb3ApO1xuXG4gICAgdmFyIGZsaXBwZWRWYXJpYXRpb24gPSBmbGlwcGVkVmFyaWF0aW9uQnlSZWYgfHwgZmxpcHBlZFZhcmlhdGlvbkJ5Q29udGVudDtcblxuICAgIGlmIChvdmVybGFwc1JlZiB8fCBvdmVyZmxvd3NCb3VuZGFyaWVzIHx8IGZsaXBwZWRWYXJpYXRpb24pIHtcbiAgICAgIC8vIHRoaXMgYm9vbGVhbiB0byBkZXRlY3QgYW55IGZsaXAgbG9vcFxuICAgICAgZGF0YS5mbGlwcGVkID0gdHJ1ZTtcblxuICAgICAgaWYgKG92ZXJsYXBzUmVmIHx8IG92ZXJmbG93c0JvdW5kYXJpZXMpIHtcbiAgICAgICAgcGxhY2VtZW50ID0gZmxpcE9yZGVyW2luZGV4ICsgMV07XG4gICAgICB9XG5cbiAgICAgIGlmIChmbGlwcGVkVmFyaWF0aW9uKSB7XG4gICAgICAgIHZhcmlhdGlvbiA9IGdldE9wcG9zaXRlVmFyaWF0aW9uKHZhcmlhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGRhdGEucGxhY2VtZW50ID0gcGxhY2VtZW50ICsgKHZhcmlhdGlvbiA/ICctJyArIHZhcmlhdGlvbiA6ICcnKTtcblxuICAgICAgLy8gdGhpcyBvYmplY3QgY29udGFpbnMgYHBvc2l0aW9uYCwgd2Ugd2FudCB0byBwcmVzZXJ2ZSBpdCBhbG9uZyB3aXRoXG4gICAgICAvLyBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0eSB3ZSBtYXkgYWRkIGluIHRoZSBmdXR1cmVcbiAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBfZXh0ZW5kcyh7fSwgZGF0YS5vZmZzZXRzLnBvcHBlciwgZ2V0UG9wcGVyT2Zmc2V0cyhkYXRhLmluc3RhbmNlLnBvcHBlciwgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSwgZGF0YS5wbGFjZW1lbnQpKTtcblxuICAgICAgZGF0YSA9IHJ1bk1vZGlmaWVycyhkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgZGF0YSwgJ2ZsaXAnKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGtlZXBUb2dldGhlcihkYXRhKSB7XG4gIHZhciBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXIsXG4gICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZTtcblxuICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgdmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbiAgdmFyIGlzVmVydGljYWwgPSBbJ3RvcCcsICdib3R0b20nXS5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xO1xuICB2YXIgc2lkZSA9IGlzVmVydGljYWwgPyAncmlnaHQnIDogJ2JvdHRvbSc7XG4gIHZhciBvcFNpZGUgPSBpc1ZlcnRpY2FsID8gJ2xlZnQnIDogJ3RvcCc7XG4gIHZhciBtZWFzdXJlbWVudCA9IGlzVmVydGljYWwgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG5cbiAgaWYgKHBvcHBlcltzaWRlXSA8IGZsb29yKHJlZmVyZW5jZVtvcFNpZGVdKSkge1xuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbb3BTaWRlXSA9IGZsb29yKHJlZmVyZW5jZVtvcFNpZGVdKSAtIHBvcHBlclttZWFzdXJlbWVudF07XG4gIH1cbiAgaWYgKHBvcHBlcltvcFNpZGVdID4gZmxvb3IocmVmZXJlbmNlW3NpZGVdKSkge1xuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbb3BTaWRlXSA9IGZsb29yKHJlZmVyZW5jZVtzaWRlXSk7XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyBjb250YWluaW5nIHZhbHVlICsgdW5pdCBpbnRvIGEgcHggdmFsdWUgbnVtYmVyXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiB7bW9kaWZpZXJzfm9mZnNldH1cbiAqIEBwcml2YXRlXG4gKiBAYXJndW1lbnQge1N0cmluZ30gc3RyIC0gVmFsdWUgKyB1bml0IHN0cmluZ1xuICogQGFyZ3VtZW50IHtTdHJpbmd9IG1lYXN1cmVtZW50IC0gYGhlaWdodGAgb3IgYHdpZHRoYFxuICogQGFyZ3VtZW50IHtPYmplY3R9IHBvcHBlck9mZnNldHNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSByZWZlcmVuY2VPZmZzZXRzXG4gKiBAcmV0dXJucyB7TnVtYmVyfFN0cmluZ31cbiAqIFZhbHVlIGluIHBpeGVscywgb3Igb3JpZ2luYWwgc3RyaW5nIGlmIG5vIHZhbHVlcyB3ZXJlIGV4dHJhY3RlZFxuICovXG5mdW5jdGlvbiB0b1ZhbHVlKHN0ciwgbWVhc3VyZW1lbnQsIHBvcHBlck9mZnNldHMsIHJlZmVyZW5jZU9mZnNldHMpIHtcbiAgLy8gc2VwYXJhdGUgdmFsdWUgZnJvbSB1bml0XG4gIHZhciBzcGxpdCA9IHN0ci5tYXRjaCgvKCg/OlxcLXxcXCspP1xcZCpcXC4/XFxkKikoLiopLyk7XG4gIHZhciB2YWx1ZSA9ICtzcGxpdFsxXTtcbiAgdmFyIHVuaXQgPSBzcGxpdFsyXTtcblxuICAvLyBJZiBpdCdzIG5vdCBhIG51bWJlciBpdCdzIGFuIG9wZXJhdG9yLCBJIGd1ZXNzXG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgaWYgKHVuaXQuaW5kZXhPZignJScpID09PSAwKSB7XG4gICAgdmFyIGVsZW1lbnQgPSB2b2lkIDA7XG4gICAgc3dpdGNoICh1bml0KSB7XG4gICAgICBjYXNlICclcCc6XG4gICAgICAgIGVsZW1lbnQgPSBwb3BwZXJPZmZzZXRzO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyUnOlxuICAgICAgY2FzZSAnJXInOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZWxlbWVudCA9IHJlZmVyZW5jZU9mZnNldHM7XG4gICAgfVxuXG4gICAgdmFyIHJlY3QgPSBnZXRDbGllbnRSZWN0KGVsZW1lbnQpO1xuICAgIHJldHVybiByZWN0W21lYXN1cmVtZW50XSAvIDEwMCAqIHZhbHVlO1xuICB9IGVsc2UgaWYgKHVuaXQgPT09ICd2aCcgfHwgdW5pdCA9PT0gJ3Z3Jykge1xuICAgIC8vIGlmIGlzIGEgdmggb3IgdncsIHdlIGNhbGN1bGF0ZSB0aGUgc2l6ZSBiYXNlZCBvbiB0aGUgdmlld3BvcnRcbiAgICB2YXIgc2l6ZSA9IHZvaWQgMDtcbiAgICBpZiAodW5pdCA9PT0gJ3ZoJykge1xuICAgICAgc2l6ZSA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2l6ZSA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7XG4gICAgfVxuICAgIHJldHVybiBzaXplIC8gMTAwICogdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgaXMgYW4gZXhwbGljaXQgcGl4ZWwgdW5pdCwgd2UgZ2V0IHJpZCBvZiB0aGUgdW5pdCBhbmQga2VlcCB0aGUgdmFsdWVcbiAgICAvLyBpZiBpcyBhbiBpbXBsaWNpdCB1bml0LCBpdCdzIHB4LCBhbmQgd2UgcmV0dXJuIGp1c3QgdGhlIHZhbHVlXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2UgYW4gYG9mZnNldGAgc3RyaW5nIHRvIGV4dHJhcG9sYXRlIGB4YCBhbmQgYHlgIG51bWVyaWMgb2Zmc2V0cy5cbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIHttb2RpZmllcnN+b2Zmc2V0fVxuICogQHByaXZhdGVcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBvZmZzZXRcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBwb3BwZXJPZmZzZXRzXG4gKiBAYXJndW1lbnQge09iamVjdH0gcmVmZXJlbmNlT2Zmc2V0c1xuICogQGFyZ3VtZW50IHtTdHJpbmd9IGJhc2VQbGFjZW1lbnRcbiAqIEByZXR1cm5zIHtBcnJheX0gYSB0d28gY2VsbHMgYXJyYXkgd2l0aCB4IGFuZCB5IG9mZnNldHMgaW4gbnVtYmVyc1xuICovXG5mdW5jdGlvbiBwYXJzZU9mZnNldChvZmZzZXQsIHBvcHBlck9mZnNldHMsIHJlZmVyZW5jZU9mZnNldHMsIGJhc2VQbGFjZW1lbnQpIHtcbiAgdmFyIG9mZnNldHMgPSBbMCwgMF07XG5cbiAgLy8gVXNlIGhlaWdodCBpZiBwbGFjZW1lbnQgaXMgbGVmdCBvciByaWdodCBhbmQgaW5kZXggaXMgMCBvdGhlcndpc2UgdXNlIHdpZHRoXG4gIC8vIGluIHRoaXMgd2F5IHRoZSBmaXJzdCBvZmZzZXQgd2lsbCB1c2UgYW4gYXhpcyBhbmQgdGhlIHNlY29uZCBvbmVcbiAgLy8gd2lsbCB1c2UgdGhlIG90aGVyIG9uZVxuICB2YXIgdXNlSGVpZ2h0ID0gWydyaWdodCcsICdsZWZ0J10uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgLy8gU3BsaXQgdGhlIG9mZnNldCBzdHJpbmcgdG8gb2J0YWluIGEgbGlzdCBvZiB2YWx1ZXMgYW5kIG9wZXJhbmRzXG4gIC8vIFRoZSByZWdleCBhZGRyZXNzZXMgdmFsdWVzIHdpdGggdGhlIHBsdXMgb3IgbWludXMgc2lnbiBpbiBmcm9udCAoKzEwLCAtMjAsIGV0YylcbiAgdmFyIGZyYWdtZW50cyA9IG9mZnNldC5zcGxpdCgvKFxcK3xcXC0pLykubWFwKGZ1bmN0aW9uIChmcmFnKSB7XG4gICAgcmV0dXJuIGZyYWcudHJpbSgpO1xuICB9KTtcblxuICAvLyBEZXRlY3QgaWYgdGhlIG9mZnNldCBzdHJpbmcgY29udGFpbnMgYSBwYWlyIG9mIHZhbHVlcyBvciBhIHNpbmdsZSBvbmVcbiAgLy8gdGhleSBjb3VsZCBiZSBzZXBhcmF0ZWQgYnkgY29tbWEgb3Igc3BhY2VcbiAgdmFyIGRpdmlkZXIgPSBmcmFnbWVudHMuaW5kZXhPZihmaW5kKGZyYWdtZW50cywgZnVuY3Rpb24gKGZyYWcpIHtcbiAgICByZXR1cm4gZnJhZy5zZWFyY2goLyx8XFxzLykgIT09IC0xO1xuICB9KSk7XG5cbiAgaWYgKGZyYWdtZW50c1tkaXZpZGVyXSAmJiBmcmFnbWVudHNbZGl2aWRlcl0uaW5kZXhPZignLCcpID09PSAtMSkge1xuICAgIGNvbnNvbGUud2FybignT2Zmc2V0cyBzZXBhcmF0ZWQgYnkgd2hpdGUgc3BhY2UocykgYXJlIGRlcHJlY2F0ZWQsIHVzZSBhIGNvbW1hICgsKSBpbnN0ZWFkLicpO1xuICB9XG5cbiAgLy8gSWYgZGl2aWRlciBpcyBmb3VuZCwgd2UgZGl2aWRlIHRoZSBsaXN0IG9mIHZhbHVlcyBhbmQgb3BlcmFuZHMgdG8gZGl2aWRlXG4gIC8vIHRoZW0gYnkgb2ZzZXQgWCBhbmQgWS5cbiAgdmFyIHNwbGl0UmVnZXggPSAvXFxzKixcXHMqfFxccysvO1xuICB2YXIgb3BzID0gZGl2aWRlciAhPT0gLTEgPyBbZnJhZ21lbnRzLnNsaWNlKDAsIGRpdmlkZXIpLmNvbmNhdChbZnJhZ21lbnRzW2RpdmlkZXJdLnNwbGl0KHNwbGl0UmVnZXgpWzBdXSksIFtmcmFnbWVudHNbZGl2aWRlcl0uc3BsaXQoc3BsaXRSZWdleClbMV1dLmNvbmNhdChmcmFnbWVudHMuc2xpY2UoZGl2aWRlciArIDEpKV0gOiBbZnJhZ21lbnRzXTtcblxuICAvLyBDb252ZXJ0IHRoZSB2YWx1ZXMgd2l0aCB1bml0cyB0byBhYnNvbHV0ZSBwaXhlbHMgdG8gYWxsb3cgb3VyIGNvbXB1dGF0aW9uc1xuICBvcHMgPSBvcHMubWFwKGZ1bmN0aW9uIChvcCwgaW5kZXgpIHtcbiAgICAvLyBNb3N0IG9mIHRoZSB1bml0cyByZWx5IG9uIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgcG9wcGVyXG4gICAgdmFyIG1lYXN1cmVtZW50ID0gKGluZGV4ID09PSAxID8gIXVzZUhlaWdodCA6IHVzZUhlaWdodCkgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgdmFyIG1lcmdlV2l0aFByZXZpb3VzID0gZmFsc2U7XG4gICAgcmV0dXJuIG9wXG4gICAgLy8gVGhpcyBhZ2dyZWdhdGVzIGFueSBgK2Agb3IgYC1gIHNpZ24gdGhhdCBhcmVuJ3QgY29uc2lkZXJlZCBvcGVyYXRvcnNcbiAgICAvLyBlLmcuOiAxMCArICs1ID0+IFsxMCwgKywgKzVdXG4gICAgLnJlZHVjZShmdW5jdGlvbiAoYSwgYikge1xuICAgICAgaWYgKGFbYS5sZW5ndGggLSAxXSA9PT0gJycgJiYgWycrJywgJy0nXS5pbmRleE9mKGIpICE9PSAtMSkge1xuICAgICAgICBhW2EubGVuZ3RoIC0gMV0gPSBiO1xuICAgICAgICBtZXJnZVdpdGhQcmV2aW91cyA9IHRydWU7XG4gICAgICAgIHJldHVybiBhO1xuICAgICAgfSBlbHNlIGlmIChtZXJnZVdpdGhQcmV2aW91cykge1xuICAgICAgICBhW2EubGVuZ3RoIC0gMV0gKz0gYjtcbiAgICAgICAgbWVyZ2VXaXRoUHJldmlvdXMgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYS5jb25jYXQoYik7XG4gICAgICB9XG4gICAgfSwgW10pXG4gICAgLy8gSGVyZSB3ZSBjb252ZXJ0IHRoZSBzdHJpbmcgdmFsdWVzIGludG8gbnVtYmVyIHZhbHVlcyAoaW4gcHgpXG4gICAgLm1hcChmdW5jdGlvbiAoc3RyKSB7XG4gICAgICByZXR1cm4gdG9WYWx1ZShzdHIsIG1lYXN1cmVtZW50LCBwb3BwZXJPZmZzZXRzLCByZWZlcmVuY2VPZmZzZXRzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gTG9vcCB0cm91Z2ggdGhlIG9mZnNldHMgYXJyYXlzIGFuZCBleGVjdXRlIHRoZSBvcGVyYXRpb25zXG4gIG9wcy5mb3JFYWNoKGZ1bmN0aW9uIChvcCwgaW5kZXgpIHtcbiAgICBvcC5mb3JFYWNoKGZ1bmN0aW9uIChmcmFnLCBpbmRleDIpIHtcbiAgICAgIGlmIChpc051bWVyaWMoZnJhZykpIHtcbiAgICAgICAgb2Zmc2V0c1tpbmRleF0gKz0gZnJhZyAqIChvcFtpbmRleDIgLSAxXSA9PT0gJy0nID8gLTEgOiAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBvZmZzZXRzO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEBhcmd1bWVudCB7TnVtYmVyfFN0cmluZ30gb3B0aW9ucy5vZmZzZXQ9MFxuICogVGhlIG9mZnNldCB2YWx1ZSBhcyBkZXNjcmliZWQgaW4gdGhlIG1vZGlmaWVyIGRlc2NyaXB0aW9uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIG9mZnNldChkYXRhLCBfcmVmKSB7XG4gIHZhciBvZmZzZXQgPSBfcmVmLm9mZnNldDtcbiAgdmFyIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50LFxuICAgICAgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyLFxuICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2U7XG5cbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcblxuICB2YXIgb2Zmc2V0cyA9IHZvaWQgMDtcbiAgaWYgKGlzTnVtZXJpYygrb2Zmc2V0KSkge1xuICAgIG9mZnNldHMgPSBbK29mZnNldCwgMF07XG4gIH0gZWxzZSB7XG4gICAgb2Zmc2V0cyA9IHBhcnNlT2Zmc2V0KG9mZnNldCwgcG9wcGVyLCByZWZlcmVuY2UsIGJhc2VQbGFjZW1lbnQpO1xuICB9XG5cbiAgaWYgKGJhc2VQbGFjZW1lbnQgPT09ICdsZWZ0Jykge1xuICAgIHBvcHBlci50b3AgKz0gb2Zmc2V0c1swXTtcbiAgICBwb3BwZXIubGVmdCAtPSBvZmZzZXRzWzFdO1xuICB9IGVsc2UgaWYgKGJhc2VQbGFjZW1lbnQgPT09ICdyaWdodCcpIHtcbiAgICBwb3BwZXIudG9wICs9IG9mZnNldHNbMF07XG4gICAgcG9wcGVyLmxlZnQgKz0gb2Zmc2V0c1sxXTtcbiAgfSBlbHNlIGlmIChiYXNlUGxhY2VtZW50ID09PSAndG9wJykge1xuICAgIHBvcHBlci5sZWZ0ICs9IG9mZnNldHNbMF07XG4gICAgcG9wcGVyLnRvcCAtPSBvZmZzZXRzWzFdO1xuICB9IGVsc2UgaWYgKGJhc2VQbGFjZW1lbnQgPT09ICdib3R0b20nKSB7XG4gICAgcG9wcGVyLmxlZnQgKz0gb2Zmc2V0c1swXTtcbiAgICBwb3BwZXIudG9wICs9IG9mZnNldHNbMV07XG4gIH1cblxuICBkYXRhLnBvcHBlciA9IHBvcHBlcjtcbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIHByZXZlbnRPdmVyZmxvdyhkYXRhLCBvcHRpb25zKSB7XG4gIHZhciBib3VuZGFyaWVzRWxlbWVudCA9IG9wdGlvbnMuYm91bmRhcmllc0VsZW1lbnQgfHwgZ2V0T2Zmc2V0UGFyZW50KGRhdGEuaW5zdGFuY2UucG9wcGVyKTtcblxuICAvLyBJZiBvZmZzZXRQYXJlbnQgaXMgdGhlIHJlZmVyZW5jZSBlbGVtZW50LCB3ZSByZWFsbHkgd2FudCB0b1xuICAvLyBnbyBvbmUgc3RlcCB1cCBhbmQgdXNlIHRoZSBuZXh0IG9mZnNldFBhcmVudCBhcyByZWZlcmVuY2UgdG9cbiAgLy8gYXZvaWQgdG8gbWFrZSB0aGlzIG1vZGlmaWVyIGNvbXBsZXRlbHkgdXNlbGVzcyBhbmQgbG9vayBsaWtlIGJyb2tlblxuICBpZiAoZGF0YS5pbnN0YW5jZS5yZWZlcmVuY2UgPT09IGJvdW5kYXJpZXNFbGVtZW50KSB7XG4gICAgYm91bmRhcmllc0VsZW1lbnQgPSBnZXRPZmZzZXRQYXJlbnQoYm91bmRhcmllc0VsZW1lbnQpO1xuICB9XG5cbiAgLy8gTk9URTogRE9NIGFjY2VzcyBoZXJlXG4gIC8vIHJlc2V0cyB0aGUgcG9wcGVyJ3MgcG9zaXRpb24gc28gdGhhdCB0aGUgZG9jdW1lbnQgc2l6ZSBjYW4gYmUgY2FsY3VsYXRlZCBleGNsdWRpbmdcbiAgLy8gdGhlIHNpemUgb2YgdGhlIHBvcHBlciBlbGVtZW50IGl0c2VsZlxuICB2YXIgdHJhbnNmb3JtUHJvcCA9IGdldFN1cHBvcnRlZFByb3BlcnR5TmFtZSgndHJhbnNmb3JtJyk7XG4gIHZhciBwb3BwZXJTdHlsZXMgPSBkYXRhLmluc3RhbmNlLnBvcHBlci5zdHlsZTsgLy8gYXNzaWdubWVudCB0byBoZWxwIG1pbmlmaWNhdGlvblxuICB2YXIgdG9wID0gcG9wcGVyU3R5bGVzLnRvcCxcbiAgICAgIGxlZnQgPSBwb3BwZXJTdHlsZXMubGVmdCxcbiAgICAgIHRyYW5zZm9ybSA9IHBvcHBlclN0eWxlc1t0cmFuc2Zvcm1Qcm9wXTtcblxuICBwb3BwZXJTdHlsZXMudG9wID0gJyc7XG4gIHBvcHBlclN0eWxlcy5sZWZ0ID0gJyc7XG4gIHBvcHBlclN0eWxlc1t0cmFuc2Zvcm1Qcm9wXSA9ICcnO1xuXG4gIHZhciBib3VuZGFyaWVzID0gZ2V0Qm91bmRhcmllcyhkYXRhLmluc3RhbmNlLnBvcHBlciwgZGF0YS5pbnN0YW5jZS5yZWZlcmVuY2UsIG9wdGlvbnMucGFkZGluZywgYm91bmRhcmllc0VsZW1lbnQsIGRhdGEucG9zaXRpb25GaXhlZCk7XG5cbiAgLy8gTk9URTogRE9NIGFjY2VzcyBoZXJlXG4gIC8vIHJlc3RvcmVzIHRoZSBvcmlnaW5hbCBzdHlsZSBwcm9wZXJ0aWVzIGFmdGVyIHRoZSBvZmZzZXRzIGhhdmUgYmVlbiBjb21wdXRlZFxuICBwb3BwZXJTdHlsZXMudG9wID0gdG9wO1xuICBwb3BwZXJTdHlsZXMubGVmdCA9IGxlZnQ7XG4gIHBvcHBlclN0eWxlc1t0cmFuc2Zvcm1Qcm9wXSA9IHRyYW5zZm9ybTtcblxuICBvcHRpb25zLmJvdW5kYXJpZXMgPSBib3VuZGFyaWVzO1xuXG4gIHZhciBvcmRlciA9IG9wdGlvbnMucHJpb3JpdHk7XG4gIHZhciBwb3BwZXIgPSBkYXRhLm9mZnNldHMucG9wcGVyO1xuXG4gIHZhciBjaGVjayA9IHtcbiAgICBwcmltYXJ5OiBmdW5jdGlvbiBwcmltYXJ5KHBsYWNlbWVudCkge1xuICAgICAgdmFyIHZhbHVlID0gcG9wcGVyW3BsYWNlbWVudF07XG4gICAgICBpZiAocG9wcGVyW3BsYWNlbWVudF0gPCBib3VuZGFyaWVzW3BsYWNlbWVudF0gJiYgIW9wdGlvbnMuZXNjYXBlV2l0aFJlZmVyZW5jZSkge1xuICAgICAgICB2YWx1ZSA9IE1hdGgubWF4KHBvcHBlcltwbGFjZW1lbnRdLCBib3VuZGFyaWVzW3BsYWNlbWVudF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5KHt9LCBwbGFjZW1lbnQsIHZhbHVlKTtcbiAgICB9LFxuICAgIHNlY29uZGFyeTogZnVuY3Rpb24gc2Vjb25kYXJ5KHBsYWNlbWVudCkge1xuICAgICAgdmFyIG1haW5TaWRlID0gcGxhY2VtZW50ID09PSAncmlnaHQnID8gJ2xlZnQnIDogJ3RvcCc7XG4gICAgICB2YXIgdmFsdWUgPSBwb3BwZXJbbWFpblNpZGVdO1xuICAgICAgaWYgKHBvcHBlcltwbGFjZW1lbnRdID4gYm91bmRhcmllc1twbGFjZW1lbnRdICYmICFvcHRpb25zLmVzY2FwZVdpdGhSZWZlcmVuY2UpIHtcbiAgICAgICAgdmFsdWUgPSBNYXRoLm1pbihwb3BwZXJbbWFpblNpZGVdLCBib3VuZGFyaWVzW3BsYWNlbWVudF0gLSAocGxhY2VtZW50ID09PSAncmlnaHQnID8gcG9wcGVyLndpZHRoIDogcG9wcGVyLmhlaWdodCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5KHt9LCBtYWluU2lkZSwgdmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICBvcmRlci5mb3JFYWNoKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICB2YXIgc2lkZSA9IFsnbGVmdCcsICd0b3AnXS5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xID8gJ3ByaW1hcnknIDogJ3NlY29uZGFyeSc7XG4gICAgcG9wcGVyID0gX2V4dGVuZHMoe30sIHBvcHBlciwgY2hlY2tbc2lkZV0ocGxhY2VtZW50KSk7XG4gIH0pO1xuXG4gIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBwb3BwZXI7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIHNoaWZ0KGRhdGEpIHtcbiAgdmFyIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICB2YXIgc2hpZnR2YXJpYXRpb24gPSBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTtcblxuICAvLyBpZiBzaGlmdCBzaGlmdHZhcmlhdGlvbiBpcyBzcGVjaWZpZWQsIHJ1biB0aGUgbW9kaWZpZXJcbiAgaWYgKHNoaWZ0dmFyaWF0aW9uKSB7XG4gICAgdmFyIF9kYXRhJG9mZnNldHMgPSBkYXRhLm9mZnNldHMsXG4gICAgICAgIHJlZmVyZW5jZSA9IF9kYXRhJG9mZnNldHMucmVmZXJlbmNlLFxuICAgICAgICBwb3BwZXIgPSBfZGF0YSRvZmZzZXRzLnBvcHBlcjtcblxuICAgIHZhciBpc1ZlcnRpY2FsID0gWydib3R0b20nLCAndG9wJ10uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG4gICAgdmFyIHNpZGUgPSBpc1ZlcnRpY2FsID8gJ2xlZnQnIDogJ3RvcCc7XG4gICAgdmFyIG1lYXN1cmVtZW50ID0gaXNWZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcblxuICAgIHZhciBzaGlmdE9mZnNldHMgPSB7XG4gICAgICBzdGFydDogZGVmaW5lUHJvcGVydHkoe30sIHNpZGUsIHJlZmVyZW5jZVtzaWRlXSksXG4gICAgICBlbmQ6IGRlZmluZVByb3BlcnR5KHt9LCBzaWRlLCByZWZlcmVuY2Vbc2lkZV0gKyByZWZlcmVuY2VbbWVhc3VyZW1lbnRdIC0gcG9wcGVyW21lYXN1cmVtZW50XSlcbiAgICB9O1xuXG4gICAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IF9leHRlbmRzKHt9LCBwb3BwZXIsIHNoaWZ0T2Zmc2V0c1tzaGlmdHZhcmlhdGlvbl0pO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgdXBkYXRlIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBoaWRlKGRhdGEpIHtcbiAgaWYgKCFpc01vZGlmaWVyUmVxdWlyZWQoZGF0YS5pbnN0YW5jZS5tb2RpZmllcnMsICdoaWRlJywgJ3ByZXZlbnRPdmVyZmxvdycpKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICB2YXIgcmVmUmVjdCA9IGRhdGEub2Zmc2V0cy5yZWZlcmVuY2U7XG4gIHZhciBib3VuZCA9IGZpbmQoZGF0YS5pbnN0YW5jZS5tb2RpZmllcnMsIGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIHJldHVybiBtb2RpZmllci5uYW1lID09PSAncHJldmVudE92ZXJmbG93JztcbiAgfSkuYm91bmRhcmllcztcblxuICBpZiAocmVmUmVjdC5ib3R0b20gPCBib3VuZC50b3AgfHwgcmVmUmVjdC5sZWZ0ID4gYm91bmQucmlnaHQgfHwgcmVmUmVjdC50b3AgPiBib3VuZC5ib3R0b20gfHwgcmVmUmVjdC5yaWdodCA8IGJvdW5kLmxlZnQpIHtcbiAgICAvLyBBdm9pZCB1bm5lY2Vzc2FyeSBET00gYWNjZXNzIGlmIHZpc2liaWxpdHkgaGFzbid0IGNoYW5nZWRcbiAgICBpZiAoZGF0YS5oaWRlID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBkYXRhLmhpZGUgPSB0cnVlO1xuICAgIGRhdGEuYXR0cmlidXRlc1sneC1vdXQtb2YtYm91bmRhcmllcyddID0gJyc7XG4gIH0gZWxzZSB7XG4gICAgLy8gQXZvaWQgdW5uZWNlc3NhcnkgRE9NIGFjY2VzcyBpZiB2aXNpYmlsaXR5IGhhc24ndCBjaGFuZ2VkXG4gICAgaWYgKGRhdGEuaGlkZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGRhdGEuaGlkZSA9IGZhbHNlO1xuICAgIGRhdGEuYXR0cmlidXRlc1sneC1vdXQtb2YtYm91bmRhcmllcyddID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gaW5uZXIoZGF0YSkge1xuICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gIHZhciBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXIsXG4gICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZTtcblxuICB2YXIgaXNIb3JpeiA9IFsnbGVmdCcsICdyaWdodCddLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgIT09IC0xO1xuXG4gIHZhciBzdWJ0cmFjdExlbmd0aCA9IFsndG9wJywgJ2xlZnQnXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID09PSAtMTtcblxuICBwb3BwZXJbaXNIb3JpeiA/ICdsZWZ0JyA6ICd0b3AnXSA9IHJlZmVyZW5jZVtiYXNlUGxhY2VtZW50XSAtIChzdWJ0cmFjdExlbmd0aCA/IHBvcHBlcltpc0hvcml6ID8gJ3dpZHRoJyA6ICdoZWlnaHQnXSA6IDApO1xuXG4gIGRhdGEucGxhY2VtZW50ID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IGdldENsaWVudFJlY3QocG9wcGVyKTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBNb2RpZmllciBmdW5jdGlvbiwgZWFjaCBtb2RpZmllciBjYW4gaGF2ZSBhIGZ1bmN0aW9uIG9mIHRoaXMgdHlwZSBhc3NpZ25lZFxuICogdG8gaXRzIGBmbmAgcHJvcGVydHkuPGJyIC8+XG4gKiBUaGVzZSBmdW5jdGlvbnMgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCB1cGRhdGUsIHRoaXMgbWVhbnMgdGhhdCB5b3UgbXVzdFxuICogbWFrZSBzdXJlIHRoZXkgYXJlIHBlcmZvcm1hbnQgZW5vdWdoIHRvIGF2b2lkIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzLlxuICpcbiAqIEBmdW5jdGlvbiBNb2RpZmllckZuXG4gKiBAYXJndW1lbnQge2RhdGFPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge2RhdGFPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuXG4vKipcbiAqIE1vZGlmaWVycyBhcmUgcGx1Z2lucyB1c2VkIHRvIGFsdGVyIHRoZSBiZWhhdmlvciBvZiB5b3VyIHBvcHBlcnMuPGJyIC8+XG4gKiBQb3BwZXIuanMgdXNlcyBhIHNldCBvZiA5IG1vZGlmaWVycyB0byBwcm92aWRlIGFsbCB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0aWVzXG4gKiBuZWVkZWQgYnkgdGhlIGxpYnJhcnkuXG4gKlxuICogVXN1YWxseSB5b3UgZG9uJ3Qgd2FudCB0byBvdmVycmlkZSB0aGUgYG9yZGVyYCwgYGZuYCBhbmQgYG9uTG9hZGAgcHJvcHMuXG4gKiBBbGwgdGhlIG90aGVyIHByb3BlcnRpZXMgYXJlIGNvbmZpZ3VyYXRpb25zIHRoYXQgY291bGQgYmUgdHdlYWtlZC5cbiAqIEBuYW1lc3BhY2UgbW9kaWZpZXJzXG4gKi9cbnZhciBtb2RpZmllcnMgPSB7XG4gIC8qKlxuICAgKiBNb2RpZmllciB1c2VkIHRvIHNoaWZ0IHRoZSBwb3BwZXIgb24gdGhlIHN0YXJ0IG9yIGVuZCBvZiBpdHMgcmVmZXJlbmNlXG4gICAqIGVsZW1lbnQuPGJyIC8+XG4gICAqIEl0IHdpbGwgcmVhZCB0aGUgdmFyaWF0aW9uIG9mIHRoZSBgcGxhY2VtZW50YCBwcm9wZXJ0eS48YnIgLz5cbiAgICogSXQgY2FuIGJlIG9uZSBlaXRoZXIgYC1lbmRgIG9yIGAtc3RhcnRgLlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgc2hpZnQ6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9MTAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiAxMDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBzaGlmdFxuICB9LFxuXG4gIC8qKlxuICAgKiBUaGUgYG9mZnNldGAgbW9kaWZpZXIgY2FuIHNoaWZ0IHlvdXIgcG9wcGVyIG9uIGJvdGggaXRzIGF4aXMuXG4gICAqXG4gICAqIEl0IGFjY2VwdHMgdGhlIGZvbGxvd2luZyB1bml0czpcbiAgICogLSBgcHhgIG9yIHVuaXQtbGVzcywgaW50ZXJwcmV0ZWQgYXMgcGl4ZWxzXG4gICAqIC0gYCVgIG9yIGAlcmAsIHBlcmNlbnRhZ2UgcmVsYXRpdmUgdG8gdGhlIGxlbmd0aCBvZiB0aGUgcmVmZXJlbmNlIGVsZW1lbnRcbiAgICogLSBgJXBgLCBwZXJjZW50YWdlIHJlbGF0aXZlIHRvIHRoZSBsZW5ndGggb2YgdGhlIHBvcHBlciBlbGVtZW50XG4gICAqIC0gYHZ3YCwgQ1NTIHZpZXdwb3J0IHdpZHRoIHVuaXRcbiAgICogLSBgdmhgLCBDU1Mgdmlld3BvcnQgaGVpZ2h0IHVuaXRcbiAgICpcbiAgICogRm9yIGxlbmd0aCBpcyBpbnRlbmRlZCB0aGUgbWFpbiBheGlzIHJlbGF0aXZlIHRvIHRoZSBwbGFjZW1lbnQgb2YgdGhlIHBvcHBlci48YnIgLz5cbiAgICogVGhpcyBtZWFucyB0aGF0IGlmIHRoZSBwbGFjZW1lbnQgaXMgYHRvcGAgb3IgYGJvdHRvbWAsIHRoZSBsZW5ndGggd2lsbCBiZSB0aGVcbiAgICogYHdpZHRoYC4gSW4gY2FzZSBvZiBgbGVmdGAgb3IgYHJpZ2h0YCwgaXQgd2lsbCBiZSB0aGUgYGhlaWdodGAuXG4gICAqXG4gICAqIFlvdSBjYW4gcHJvdmlkZSBhIHNpbmdsZSB2YWx1ZSAoYXMgYE51bWJlcmAgb3IgYFN0cmluZ2ApLCBvciBhIHBhaXIgb2YgdmFsdWVzXG4gICAqIGFzIGBTdHJpbmdgIGRpdmlkZWQgYnkgYSBjb21tYSBvciBvbmUgKG9yIG1vcmUpIHdoaXRlIHNwYWNlcy48YnIgLz5cbiAgICogVGhlIGxhdHRlciBpcyBhIGRlcHJlY2F0ZWQgbWV0aG9kIGJlY2F1c2UgaXQgbGVhZHMgdG8gY29uZnVzaW9uIGFuZCB3aWxsIGJlXG4gICAqIHJlbW92ZWQgaW4gdjIuPGJyIC8+XG4gICAqIEFkZGl0aW9uYWxseSwgaXQgYWNjZXB0cyBhZGRpdGlvbnMgYW5kIHN1YnRyYWN0aW9ucyBiZXR3ZWVuIGRpZmZlcmVudCB1bml0cy5cbiAgICogTm90ZSB0aGF0IG11bHRpcGxpY2F0aW9ucyBhbmQgZGl2aXNpb25zIGFyZW4ndCBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIFZhbGlkIGV4YW1wbGVzIGFyZTpcbiAgICogYGBgXG4gICAqIDEwXG4gICAqICcxMCUnXG4gICAqICcxMCwgMTAnXG4gICAqICcxMCUsIDEwJ1xuICAgKiAnMTAgKyAxMCUnXG4gICAqICcxMCAtIDV2aCArIDMlJ1xuICAgKiAnLTEwcHggKyA1dmgsIDVweCAtIDYlJ1xuICAgKiBgYGBcbiAgICogPiAqKk5CKio6IElmIHlvdSBkZXNpcmUgdG8gYXBwbHkgb2Zmc2V0cyB0byB5b3VyIHBvcHBlcnMgaW4gYSB3YXkgdGhhdCBtYXkgbWFrZSB0aGVtIG92ZXJsYXBcbiAgICogPiB3aXRoIHRoZWlyIHJlZmVyZW5jZSBlbGVtZW50LCB1bmZvcnR1bmF0ZWx5LCB5b3Ugd2lsbCBoYXZlIHRvIGRpc2FibGUgdGhlIGBmbGlwYCBtb2RpZmllci5cbiAgICogPiBZb3UgY2FuIHJlYWQgbW9yZSBvbiB0aGlzIGF0IHRoaXMgW2lzc3VlXShodHRwczovL2dpdGh1Yi5jb20vRmV6VnJhc3RhL3BvcHBlci5qcy9pc3N1ZXMvMzczKS5cbiAgICpcbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIG9mZnNldDoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj0yMDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDIwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IG9mZnNldCxcbiAgICAvKiogQHByb3Age051bWJlcnxTdHJpbmd9IG9mZnNldD0wXG4gICAgICogVGhlIG9mZnNldCB2YWx1ZSBhcyBkZXNjcmliZWQgaW4gdGhlIG1vZGlmaWVyIGRlc2NyaXB0aW9uXG4gICAgICovXG4gICAgb2Zmc2V0OiAwXG4gIH0sXG5cbiAgLyoqXG4gICAqIE1vZGlmaWVyIHVzZWQgdG8gcHJldmVudCB0aGUgcG9wcGVyIGZyb20gYmVpbmcgcG9zaXRpb25lZCBvdXRzaWRlIHRoZSBib3VuZGFyeS5cbiAgICpcbiAgICogQSBzY2VuYXJpbyBleGlzdHMgd2hlcmUgdGhlIHJlZmVyZW5jZSBpdHNlbGYgaXMgbm90IHdpdGhpbiB0aGUgYm91bmRhcmllcy48YnIgLz5cbiAgICogV2UgY2FuIHNheSBpdCBoYXMgXCJlc2NhcGVkIHRoZSBib3VuZGFyaWVzXCIg4oCUIG9yIGp1c3QgXCJlc2NhcGVkXCIuPGJyIC8+XG4gICAqIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSBwb3BwZXIgc2hvdWxkIGVpdGhlcjpcbiAgICpcbiAgICogLSBkZXRhY2ggZnJvbSB0aGUgcmVmZXJlbmNlIGFuZCByZW1haW4gXCJ0cmFwcGVkXCIgaW4gdGhlIGJvdW5kYXJpZXMsIG9yXG4gICAqIC0gaWYgaXQgc2hvdWxkIGlnbm9yZSB0aGUgYm91bmRhcnkgYW5kIFwiZXNjYXBlIHdpdGggaXRzIHJlZmVyZW5jZVwiXG4gICAqXG4gICAqIFdoZW4gYGVzY2FwZVdpdGhSZWZlcmVuY2VgIGlzIHNldCB0b2B0cnVlYCBhbmQgcmVmZXJlbmNlIGlzIGNvbXBsZXRlbHlcbiAgICogb3V0c2lkZSBpdHMgYm91bmRhcmllcywgdGhlIHBvcHBlciB3aWxsIG92ZXJmbG93IChvciBjb21wbGV0ZWx5IGxlYXZlKVxuICAgKiB0aGUgYm91bmRhcmllcyBpbiBvcmRlciB0byByZW1haW4gYXR0YWNoZWQgdG8gdGhlIGVkZ2Ugb2YgdGhlIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIHByZXZlbnRPdmVyZmxvdzoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj0zMDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDMwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IHByZXZlbnRPdmVyZmxvdyxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7QXJyYXl9IFtwcmlvcml0eT1bJ2xlZnQnLCdyaWdodCcsJ3RvcCcsJ2JvdHRvbSddXVxuICAgICAqIFBvcHBlciB3aWxsIHRyeSB0byBwcmV2ZW50IG92ZXJmbG93IGZvbGxvd2luZyB0aGVzZSBwcmlvcml0aWVzIGJ5IGRlZmF1bHQsXG4gICAgICogdGhlbiwgaXQgY291bGQgb3ZlcmZsb3cgb24gdGhlIGxlZnQgYW5kIG9uIHRvcCBvZiB0aGUgYGJvdW5kYXJpZXNFbGVtZW50YFxuICAgICAqL1xuICAgIHByaW9yaXR5OiBbJ2xlZnQnLCAncmlnaHQnLCAndG9wJywgJ2JvdHRvbSddLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtudW1iZXJ9IHBhZGRpbmc9NVxuICAgICAqIEFtb3VudCBvZiBwaXhlbCB1c2VkIHRvIGRlZmluZSBhIG1pbmltdW0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgYm91bmRhcmllc1xuICAgICAqIGFuZCB0aGUgcG9wcGVyLiBUaGlzIG1ha2VzIHN1cmUgdGhlIHBvcHBlciBhbHdheXMgaGFzIGEgbGl0dGxlIHBhZGRpbmdcbiAgICAgKiBiZXR3ZWVuIHRoZSBlZGdlcyBvZiBpdHMgY29udGFpbmVyXG4gICAgICovXG4gICAgcGFkZGluZzogNSxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7U3RyaW5nfEhUTUxFbGVtZW50fSBib3VuZGFyaWVzRWxlbWVudD0nc2Nyb2xsUGFyZW50J1xuICAgICAqIEJvdW5kYXJpZXMgdXNlZCBieSB0aGUgbW9kaWZpZXIuIENhbiBiZSBgc2Nyb2xsUGFyZW50YCwgYHdpbmRvd2AsXG4gICAgICogYHZpZXdwb3J0YCBvciBhbnkgRE9NIGVsZW1lbnQuXG4gICAgICovXG4gICAgYm91bmRhcmllc0VsZW1lbnQ6ICdzY3JvbGxQYXJlbnQnXG4gIH0sXG5cbiAgLyoqXG4gICAqIE1vZGlmaWVyIHVzZWQgdG8gbWFrZSBzdXJlIHRoZSByZWZlcmVuY2UgYW5kIGl0cyBwb3BwZXIgc3RheSBuZWFyIGVhY2ggb3RoZXJcbiAgICogd2l0aG91dCBsZWF2aW5nIGFueSBnYXAgYmV0d2VlbiB0aGUgdHdvLiBFc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIHRoZSBhcnJvdyBpc1xuICAgKiBlbmFibGVkIGFuZCB5b3Ugd2FudCB0byBlbnN1cmUgdGhhdCBpdCBwb2ludHMgdG8gaXRzIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKiBJdCBjYXJlcyBvbmx5IGFib3V0IHRoZSBmaXJzdCBheGlzLiBZb3UgY2FuIHN0aWxsIGhhdmUgcG9wcGVycyB3aXRoIG1hcmdpblxuICAgKiBiZXR3ZWVuIHRoZSBwb3BwZXIgYW5kIGl0cyByZWZlcmVuY2UgZWxlbWVudC5cbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGtlZXBUb2dldGhlcjoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj00MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDQwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGtlZXBUb2dldGhlclxuICB9LFxuXG4gIC8qKlxuICAgKiBUaGlzIG1vZGlmaWVyIGlzIHVzZWQgdG8gbW92ZSB0aGUgYGFycm93RWxlbWVudGAgb2YgdGhlIHBvcHBlciB0byBtYWtlXG4gICAqIHN1cmUgaXQgaXMgcG9zaXRpb25lZCBiZXR3ZWVuIHRoZSByZWZlcmVuY2UgZWxlbWVudCBhbmQgaXRzIHBvcHBlciBlbGVtZW50LlxuICAgKiBJdCB3aWxsIHJlYWQgdGhlIG91dGVyIHNpemUgb2YgdGhlIGBhcnJvd0VsZW1lbnRgIG5vZGUgdG8gZGV0ZWN0IGhvdyBtYW55XG4gICAqIHBpeGVscyBvZiBjb25qdW5jdGlvbiBhcmUgbmVlZGVkLlxuICAgKlxuICAgKiBJdCBoYXMgbm8gZWZmZWN0IGlmIG5vIGBhcnJvd0VsZW1lbnRgIGlzIHByb3ZpZGVkLlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgYXJyb3c6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9NTAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA1MDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBhcnJvdyxcbiAgICAvKiogQHByb3Age1N0cmluZ3xIVE1MRWxlbWVudH0gZWxlbWVudD0nW3gtYXJyb3ddJyAtIFNlbGVjdG9yIG9yIG5vZGUgdXNlZCBhcyBhcnJvdyAqL1xuICAgIGVsZW1lbnQ6ICdbeC1hcnJvd10nXG4gIH0sXG5cbiAgLyoqXG4gICAqIE1vZGlmaWVyIHVzZWQgdG8gZmxpcCB0aGUgcG9wcGVyJ3MgcGxhY2VtZW50IHdoZW4gaXQgc3RhcnRzIHRvIG92ZXJsYXAgaXRzXG4gICAqIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKlxuICAgKiBSZXF1aXJlcyB0aGUgYHByZXZlbnRPdmVyZmxvd2AgbW9kaWZpZXIgYmVmb3JlIGl0IGluIG9yZGVyIHRvIHdvcmsuXG4gICAqXG4gICAqICoqTk9URToqKiB0aGlzIG1vZGlmaWVyIHdpbGwgaW50ZXJydXB0IHRoZSBjdXJyZW50IHVwZGF0ZSBjeWNsZSBhbmQgd2lsbFxuICAgKiByZXN0YXJ0IGl0IGlmIGl0IGRldGVjdHMgdGhlIG5lZWQgdG8gZmxpcCB0aGUgcGxhY2VtZW50LlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgZmxpcDoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj02MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDYwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGZsaXAsXG4gICAgLyoqXG4gICAgICogQHByb3Age1N0cmluZ3xBcnJheX0gYmVoYXZpb3I9J2ZsaXAnXG4gICAgICogVGhlIGJlaGF2aW9yIHVzZWQgdG8gY2hhbmdlIHRoZSBwb3BwZXIncyBwbGFjZW1lbnQuIEl0IGNhbiBiZSBvbmUgb2ZcbiAgICAgKiBgZmxpcGAsIGBjbG9ja3dpc2VgLCBgY291bnRlcmNsb2Nrd2lzZWAgb3IgYW4gYXJyYXkgd2l0aCBhIGxpc3Qgb2YgdmFsaWRcbiAgICAgKiBwbGFjZW1lbnRzICh3aXRoIG9wdGlvbmFsIHZhcmlhdGlvbnMpXG4gICAgICovXG4gICAgYmVoYXZpb3I6ICdmbGlwJyxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7bnVtYmVyfSBwYWRkaW5nPTVcbiAgICAgKiBUaGUgcG9wcGVyIHdpbGwgZmxpcCBpZiBpdCBoaXRzIHRoZSBlZGdlcyBvZiB0aGUgYGJvdW5kYXJpZXNFbGVtZW50YFxuICAgICAqL1xuICAgIHBhZGRpbmc6IDUsXG4gICAgLyoqXG4gICAgICogQHByb3Age1N0cmluZ3xIVE1MRWxlbWVudH0gYm91bmRhcmllc0VsZW1lbnQ9J3ZpZXdwb3J0J1xuICAgICAqIFRoZSBlbGVtZW50IHdoaWNoIHdpbGwgZGVmaW5lIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBwb3BwZXIgcG9zaXRpb24uXG4gICAgICogVGhlIHBvcHBlciB3aWxsIG5ldmVyIGJlIHBsYWNlZCBvdXRzaWRlIG9mIHRoZSBkZWZpbmVkIGJvdW5kYXJpZXNcbiAgICAgKiAoZXhjZXB0IGlmIGBrZWVwVG9nZXRoZXJgIGlzIGVuYWJsZWQpXG4gICAgICovXG4gICAgYm91bmRhcmllc0VsZW1lbnQ6ICd2aWV3cG9ydCcsXG4gICAgLyoqXG4gICAgICogQHByb3Age0Jvb2xlYW59IGZsaXBWYXJpYXRpb25zPWZhbHNlXG4gICAgICogVGhlIHBvcHBlciB3aWxsIHN3aXRjaCBwbGFjZW1lbnQgdmFyaWF0aW9uIGJldHdlZW4gYC1zdGFydGAgYW5kIGAtZW5kYCB3aGVuXG4gICAgICogdGhlIHJlZmVyZW5jZSBlbGVtZW50IG92ZXJsYXBzIGl0cyBib3VuZGFyaWVzLlxuICAgICAqXG4gICAgICogVGhlIG9yaWdpbmFsIHBsYWNlbWVudCBzaG91bGQgaGF2ZSBhIHNldCB2YXJpYXRpb24uXG4gICAgICovXG4gICAgZmxpcFZhcmlhdGlvbnM6IGZhbHNlLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtCb29sZWFufSBmbGlwVmFyaWF0aW9uc0J5Q29udGVudD1mYWxzZVxuICAgICAqIFRoZSBwb3BwZXIgd2lsbCBzd2l0Y2ggcGxhY2VtZW50IHZhcmlhdGlvbiBiZXR3ZWVuIGAtc3RhcnRgIGFuZCBgLWVuZGAgd2hlblxuICAgICAqIHRoZSBwb3BwZXIgZWxlbWVudCBvdmVybGFwcyBpdHMgcmVmZXJlbmNlIGJvdW5kYXJpZXMuXG4gICAgICpcbiAgICAgKiBUaGUgb3JpZ2luYWwgcGxhY2VtZW50IHNob3VsZCBoYXZlIGEgc2V0IHZhcmlhdGlvbi5cbiAgICAgKi9cbiAgICBmbGlwVmFyaWF0aW9uc0J5Q29udGVudDogZmFsc2VcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBtYWtlIHRoZSBwb3BwZXIgZmxvdyB0b3dhcmQgdGhlIGlubmVyIG9mIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAgICogQnkgZGVmYXVsdCwgd2hlbiB0aGlzIG1vZGlmaWVyIGlzIGRpc2FibGVkLCB0aGUgcG9wcGVyIHdpbGwgYmUgcGxhY2VkIG91dHNpZGVcbiAgICogdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgaW5uZXI6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9NzAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA3MDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPWZhbHNlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGlubmVyXG4gIH0sXG5cbiAgLyoqXG4gICAqIE1vZGlmaWVyIHVzZWQgdG8gaGlkZSB0aGUgcG9wcGVyIHdoZW4gaXRzIHJlZmVyZW5jZSBlbGVtZW50IGlzIG91dHNpZGUgb2YgdGhlXG4gICAqIHBvcHBlciBib3VuZGFyaWVzLiBJdCB3aWxsIHNldCBhIGB4LW91dC1vZi1ib3VuZGFyaWVzYCBhdHRyaWJ1dGUgd2hpY2ggY2FuXG4gICAqIGJlIHVzZWQgdG8gaGlkZSB3aXRoIGEgQ1NTIHNlbGVjdG9yIHRoZSBwb3BwZXIgd2hlbiBpdHMgcmVmZXJlbmNlIGlzXG4gICAqIG91dCBvZiBib3VuZGFyaWVzLlxuICAgKlxuICAgKiBSZXF1aXJlcyB0aGUgYHByZXZlbnRPdmVyZmxvd2AgbW9kaWZpZXIgYmVmb3JlIGl0IGluIG9yZGVyIHRvIHdvcmsuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBoaWRlOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTgwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogODAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogaGlkZVxuICB9LFxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgc3R5bGUgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlciBlbGVtZW50IHRvIGdldHNcbiAgICogcHJvcGVybHkgcG9zaXRpb25lZC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgbW9kaWZpZXIgd2lsbCBub3QgdG91Y2ggdGhlIERPTSwgaXQganVzdCBwcmVwYXJlcyB0aGUgc3R5bGVzXG4gICAqIHNvIHRoYXQgYGFwcGx5U3R5bGVgIG1vZGlmaWVyIGNhbiBhcHBseSBpdC4gVGhpcyBzZXBhcmF0aW9uIGlzIHVzZWZ1bFxuICAgKiBpbiBjYXNlIHlvdSBuZWVkIHRvIHJlcGxhY2UgYGFwcGx5U3R5bGVgIHdpdGggYSBjdXN0b20gaW1wbGVtZW50YXRpb24uXG4gICAqXG4gICAqIFRoaXMgbW9kaWZpZXIgaGFzIGA4NTBgIGFzIGBvcmRlcmAgdmFsdWUgdG8gbWFpbnRhaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgKiB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mIFBvcHBlci5qcy4gRXhwZWN0IHRoZSBtb2RpZmllcnMgb3JkZXJpbmcgbWV0aG9kXG4gICAqIHRvIGNoYW5nZSBpbiBmdXR1cmUgbWFqb3IgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBjb21wdXRlU3R5bGU6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9ODUwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA4NTAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBjb21wdXRlU3R5bGUsXG4gICAgLyoqXG4gICAgICogQHByb3Age0Jvb2xlYW59IGdwdUFjY2VsZXJhdGlvbj10cnVlXG4gICAgICogSWYgdHJ1ZSwgaXQgdXNlcyB0aGUgQ1NTIDNEIHRyYW5zZm9ybWF0aW9uIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXIuXG4gICAgICogT3RoZXJ3aXNlLCBpdCB3aWxsIHVzZSB0aGUgYHRvcGAgYW5kIGBsZWZ0YCBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgZ3B1QWNjZWxlcmF0aW9uOiB0cnVlLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtzdHJpbmd9IFt4PSdib3R0b20nXVxuICAgICAqIFdoZXJlIHRvIGFuY2hvciB0aGUgWCBheGlzIChgYm90dG9tYCBvciBgdG9wYCkuIEFLQSBYIG9mZnNldCBvcmlnaW4uXG4gICAgICogQ2hhbmdlIHRoaXMgaWYgeW91ciBwb3BwZXIgc2hvdWxkIGdyb3cgaW4gYSBkaXJlY3Rpb24gZGlmZmVyZW50IGZyb20gYGJvdHRvbWBcbiAgICAgKi9cbiAgICB4OiAnYm90dG9tJyxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7c3RyaW5nfSBbeD0nbGVmdCddXG4gICAgICogV2hlcmUgdG8gYW5jaG9yIHRoZSBZIGF4aXMgKGBsZWZ0YCBvciBgcmlnaHRgKS4gQUtBIFkgb2Zmc2V0IG9yaWdpbi5cbiAgICAgKiBDaGFuZ2UgdGhpcyBpZiB5b3VyIHBvcHBlciBzaG91bGQgZ3JvdyBpbiBhIGRpcmVjdGlvbiBkaWZmZXJlbnQgZnJvbSBgcmlnaHRgXG4gICAgICovXG4gICAgeTogJ3JpZ2h0J1xuICB9LFxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBjb21wdXRlZCBzdHlsZXMgdG8gdGhlIHBvcHBlciBlbGVtZW50LlxuICAgKlxuICAgKiBBbGwgdGhlIERPTSBtYW5pcHVsYXRpb25zIGFyZSBsaW1pdGVkIHRvIHRoaXMgbW9kaWZpZXIuIFRoaXMgaXMgdXNlZnVsIGluIGNhc2VcbiAgICogeW91IHdhbnQgdG8gaW50ZWdyYXRlIFBvcHBlci5qcyBpbnNpZGUgYSBmcmFtZXdvcmsgb3IgdmlldyBsaWJyYXJ5IGFuZCB5b3VcbiAgICogd2FudCB0byBkZWxlZ2F0ZSBhbGwgdGhlIERPTSBtYW5pcHVsYXRpb25zIHRvIGl0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgaWYgeW91IGRpc2FibGUgdGhpcyBtb2RpZmllciwgeW91IG11c3QgbWFrZSBzdXJlIHRoZSBwb3BwZXIgZWxlbWVudFxuICAgKiBoYXMgaXRzIHBvc2l0aW9uIHNldCB0byBgYWJzb2x1dGVgIGJlZm9yZSBQb3BwZXIuanMgY2FuIGRvIGl0cyB3b3JrIVxuICAgKlxuICAgKiBKdXN0IGRpc2FibGUgdGhpcyBtb2RpZmllciBhbmQgZGVmaW5lIHlvdXIgb3duIHRvIGFjaGlldmUgdGhlIGRlc2lyZWQgZWZmZWN0LlxuICAgKlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgYXBwbHlTdHlsZToge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj05MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDkwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGFwcGx5U3R5bGUsXG4gICAgLyoqIEBwcm9wIHtGdW5jdGlvbn0gKi9cbiAgICBvbkxvYWQ6IGFwcGx5U3R5bGVPbkxvYWQsXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAxLjEwLjAsIHRoZSBwcm9wZXJ0eSBtb3ZlZCB0byBgY29tcHV0ZVN0eWxlYCBtb2RpZmllclxuICAgICAqIEBwcm9wIHtCb29sZWFufSBncHVBY2NlbGVyYXRpb249dHJ1ZVxuICAgICAqIElmIHRydWUsIGl0IHVzZXMgdGhlIENTUyAzRCB0cmFuc2Zvcm1hdGlvbiB0byBwb3NpdGlvbiB0aGUgcG9wcGVyLlxuICAgICAqIE90aGVyd2lzZSwgaXQgd2lsbCB1c2UgdGhlIGB0b3BgIGFuZCBgbGVmdGAgcHJvcGVydGllc1xuICAgICAqL1xuICAgIGdwdUFjY2VsZXJhdGlvbjogdW5kZWZpbmVkXG4gIH1cbn07XG5cbi8qKlxuICogVGhlIGBkYXRhT2JqZWN0YCBpcyBhbiBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIGluZm9ybWF0aW9uIHVzZWQgYnkgUG9wcGVyLmpzLlxuICogVGhpcyBvYmplY3QgaXMgcGFzc2VkIHRvIG1vZGlmaWVycyBhbmQgdG8gdGhlIGBvbkNyZWF0ZWAgYW5kIGBvblVwZGF0ZWAgY2FsbGJhY2tzLlxuICogQG5hbWUgZGF0YU9iamVjdFxuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEuaW5zdGFuY2UgVGhlIFBvcHBlci5qcyBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtTdHJpbmd9IGRhdGEucGxhY2VtZW50IFBsYWNlbWVudCBhcHBsaWVkIHRvIHBvcHBlclxuICogQHByb3BlcnR5IHtTdHJpbmd9IGRhdGEub3JpZ2luYWxQbGFjZW1lbnQgUGxhY2VtZW50IG9yaWdpbmFsbHkgZGVmaW5lZCBvbiBpbml0XG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGRhdGEuZmxpcHBlZCBUcnVlIGlmIHBvcHBlciBoYXMgYmVlbiBmbGlwcGVkIGJ5IGZsaXAgbW9kaWZpZXJcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZGF0YS5oaWRlIFRydWUgaWYgdGhlIHJlZmVyZW5jZSBlbGVtZW50IGlzIG91dCBvZiBib3VuZGFyaWVzLCB1c2VmdWwgdG8ga25vdyB3aGVuIHRvIGhpZGUgdGhlIHBvcHBlclxuICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH0gZGF0YS5hcnJvd0VsZW1lbnQgTm9kZSB1c2VkIGFzIGFycm93IGJ5IGFycm93IG1vZGlmaWVyXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5zdHlsZXMgQW55IENTUyBwcm9wZXJ0eSBkZWZpbmVkIGhlcmUgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXIuIEl0IGV4cGVjdHMgdGhlIEphdmFTY3JpcHQgbm9tZW5jbGF0dXJlIChlZy4gYG1hcmdpbkJvdHRvbWApXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5hcnJvd1N0eWxlcyBBbnkgQ1NTIHByb3BlcnR5IGRlZmluZWQgaGVyZSB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlciBhcnJvdy4gSXQgZXhwZWN0cyB0aGUgSmF2YVNjcmlwdCBub21lbmNsYXR1cmUgKGVnLiBgbWFyZ2luQm90dG9tYClcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLmJvdW5kYXJpZXMgT2Zmc2V0cyBvZiB0aGUgcG9wcGVyIGJvdW5kYXJpZXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLm9mZnNldHMgVGhlIG1lYXN1cmVtZW50cyBvZiBwb3BwZXIsIHJlZmVyZW5jZSBhbmQgYXJyb3cgZWxlbWVudHNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLm9mZnNldHMucG9wcGVyIGB0b3BgLCBgbGVmdGAsIGB3aWR0aGAsIGBoZWlnaHRgIHZhbHVlc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UgYHRvcGAsIGBsZWZ0YCwgYHdpZHRoYCwgYGhlaWdodGAgdmFsdWVzXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5vZmZzZXRzLmFycm93XSBgdG9wYCBhbmQgYGxlZnRgIG9mZnNldHMsIG9ubHkgb25lIG9mIHRoZW0gd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSAwXG4gKi9cblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMgcHJvdmlkZWQgdG8gUG9wcGVyLmpzIGNvbnN0cnVjdG9yLjxiciAvPlxuICogVGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4gdXNpbmcgdGhlIGBvcHRpb25zYCBhcmd1bWVudCBvZiBQb3BwZXIuanMuPGJyIC8+XG4gKiBUbyBvdmVycmlkZSBhbiBvcHRpb24sIHNpbXBseSBwYXNzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lXG4gKiBzdHJ1Y3R1cmUgb2YgdGhlIGBvcHRpb25zYCBvYmplY3QsIGFzIHRoZSAzcmQgYXJndW1lbnQuIEZvciBleGFtcGxlOlxuICogYGBgXG4gKiBuZXcgUG9wcGVyKHJlZiwgcG9wLCB7XG4gKiAgIG1vZGlmaWVyczoge1xuICogICAgIHByZXZlbnRPdmVyZmxvdzogeyBlbmFibGVkOiBmYWxzZSB9XG4gKiAgIH1cbiAqIH0pXG4gKiBgYGBcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyb2YgUG9wcGVyXG4gKi9cbnZhciBEZWZhdWx0cyA9IHtcbiAgLyoqXG4gICAqIFBvcHBlcidzIHBsYWNlbWVudC5cbiAgICogQHByb3Age1BvcHBlci5wbGFjZW1lbnRzfSBwbGFjZW1lbnQ9J2JvdHRvbSdcbiAgICovXG4gIHBsYWNlbWVudDogJ2JvdHRvbScsXG5cbiAgLyoqXG4gICAqIFNldCB0aGlzIHRvIHRydWUgaWYgeW91IHdhbnQgcG9wcGVyIHRvIHBvc2l0aW9uIGl0IHNlbGYgaW4gJ2ZpeGVkJyBtb2RlXG4gICAqIEBwcm9wIHtCb29sZWFufSBwb3NpdGlvbkZpeGVkPWZhbHNlXG4gICAqL1xuICBwb3NpdGlvbkZpeGVkOiBmYWxzZSxcblxuICAvKipcbiAgICogV2hldGhlciBldmVudHMgKHJlc2l6ZSwgc2Nyb2xsKSBhcmUgaW5pdGlhbGx5IGVuYWJsZWQuXG4gICAqIEBwcm9wIHtCb29sZWFufSBldmVudHNFbmFibGVkPXRydWVcbiAgICovXG4gIGV2ZW50c0VuYWJsZWQ6IHRydWUsXG5cbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIGlmIHlvdSB3YW50IHRvIGF1dG9tYXRpY2FsbHkgcmVtb3ZlIHRoZSBwb3BwZXIgd2hlblxuICAgKiB5b3UgY2FsbCB0aGUgYGRlc3Ryb3lgIG1ldGhvZC5cbiAgICogQHByb3Age0Jvb2xlYW59IHJlbW92ZU9uRGVzdHJveT1mYWxzZVxuICAgKi9cbiAgcmVtb3ZlT25EZXN0cm95OiBmYWxzZSxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIHBvcHBlciBpcyBjcmVhdGVkLjxiciAvPlxuICAgKiBCeSBkZWZhdWx0LCBpdCBpcyBzZXQgdG8gbm8tb3AuPGJyIC8+XG4gICAqIEFjY2VzcyBQb3BwZXIuanMgaW5zdGFuY2Ugd2l0aCBgZGF0YS5pbnN0YW5jZWAuXG4gICAqIEBwcm9wIHtvbkNyZWF0ZX1cbiAgICovXG4gIG9uQ3JlYXRlOiBmdW5jdGlvbiBvbkNyZWF0ZSgpIHt9LFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiB0aGUgcG9wcGVyIGlzIHVwZGF0ZWQuIFRoaXMgY2FsbGJhY2sgaXMgbm90IGNhbGxlZFxuICAgKiBvbiB0aGUgaW5pdGlhbGl6YXRpb24vY3JlYXRpb24gb2YgdGhlIHBvcHBlciwgYnV0IG9ubHkgb24gc3Vic2VxdWVudFxuICAgKiB1cGRhdGVzLjxiciAvPlxuICAgKiBCeSBkZWZhdWx0LCBpdCBpcyBzZXQgdG8gbm8tb3AuPGJyIC8+XG4gICAqIEFjY2VzcyBQb3BwZXIuanMgaW5zdGFuY2Ugd2l0aCBgZGF0YS5pbnN0YW5jZWAuXG4gICAqIEBwcm9wIHtvblVwZGF0ZX1cbiAgICovXG4gIG9uVXBkYXRlOiBmdW5jdGlvbiBvblVwZGF0ZSgpIHt9LFxuXG4gIC8qKlxuICAgKiBMaXN0IG9mIG1vZGlmaWVycyB1c2VkIHRvIG1vZGlmeSB0aGUgb2Zmc2V0cyBiZWZvcmUgdGhleSBhcmUgYXBwbGllZCB0byB0aGUgcG9wcGVyLlxuICAgKiBUaGV5IHByb3ZpZGUgbW9zdCBvZiB0aGUgZnVuY3Rpb25hbGl0aWVzIG9mIFBvcHBlci5qcy5cbiAgICogQHByb3Age21vZGlmaWVyc31cbiAgICovXG4gIG1vZGlmaWVyczogbW9kaWZpZXJzXG59O1xuXG4vKipcbiAqIEBjYWxsYmFjayBvbkNyZWF0ZVxuICogQHBhcmFtIHtkYXRhT2JqZWN0fSBkYXRhXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgb25VcGRhdGVcbiAqIEBwYXJhbSB7ZGF0YU9iamVjdH0gZGF0YVxuICovXG5cbi8vIFV0aWxzXG4vLyBNZXRob2RzXG52YXIgUG9wcGVyID0gZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBQb3BwZXIuanMgaW5zdGFuY2UuXG4gICAqIEBjbGFzcyBQb3BwZXJcbiAgICogQHBhcmFtIHtFbGVtZW50fHJlZmVyZW5jZU9iamVjdH0gcmVmZXJlbmNlIC0gVGhlIHJlZmVyZW5jZSBlbGVtZW50IHVzZWQgdG8gcG9zaXRpb24gdGhlIHBvcHBlclxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHBvcHBlciAtIFRoZSBIVE1MIC8gWE1MIGVsZW1lbnQgdXNlZCBhcyB0aGUgcG9wcGVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gWW91ciBjdXN0b20gb3B0aW9ucyB0byBvdmVycmlkZSB0aGUgb25lcyBkZWZpbmVkIGluIFtEZWZhdWx0c10oI2RlZmF1bHRzKVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IGluc3RhbmNlIC0gVGhlIGdlbmVyYXRlZCBQb3BwZXIuanMgaW5zdGFuY2VcbiAgICovXG4gIGZ1bmN0aW9uIFBvcHBlcihyZWZlcmVuY2UsIHBvcHBlcikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9wcGVyKTtcblxuICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF90aGlzLnVwZGF0ZSk7XG4gICAgfTtcblxuICAgIC8vIG1ha2UgdXBkYXRlKCkgZGVib3VuY2VkLCBzbyB0aGF0IGl0IG9ubHkgcnVucyBhdCBtb3N0IG9uY2UtcGVyLXRpY2tcbiAgICB0aGlzLnVwZGF0ZSA9IGRlYm91bmNlKHRoaXMudXBkYXRlLmJpbmQodGhpcykpO1xuXG4gICAgLy8gd2l0aCB7fSB3ZSBjcmVhdGUgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG9wdGlvbnMgaW5zaWRlIGl0XG4gICAgdGhpcy5vcHRpb25zID0gX2V4dGVuZHMoe30sIFBvcHBlci5EZWZhdWx0cywgb3B0aW9ucyk7XG5cbiAgICAvLyBpbml0IHN0YXRlXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzRGVzdHJveWVkOiBmYWxzZSxcbiAgICAgIGlzQ3JlYXRlZDogZmFsc2UsXG4gICAgICBzY3JvbGxQYXJlbnRzOiBbXVxuICAgIH07XG5cbiAgICAvLyBnZXQgcmVmZXJlbmNlIGFuZCBwb3BwZXIgZWxlbWVudHMgKGFsbG93IGpRdWVyeSB3cmFwcGVycylcbiAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZSAmJiByZWZlcmVuY2UuanF1ZXJ5ID8gcmVmZXJlbmNlWzBdIDogcmVmZXJlbmNlO1xuICAgIHRoaXMucG9wcGVyID0gcG9wcGVyICYmIHBvcHBlci5qcXVlcnkgPyBwb3BwZXJbMF0gOiBwb3BwZXI7XG5cbiAgICAvLyBEZWVwIG1lcmdlIG1vZGlmaWVycyBvcHRpb25zXG4gICAgdGhpcy5vcHRpb25zLm1vZGlmaWVycyA9IHt9O1xuICAgIE9iamVjdC5rZXlzKF9leHRlbmRzKHt9LCBQb3BwZXIuRGVmYXVsdHMubW9kaWZpZXJzLCBvcHRpb25zLm1vZGlmaWVycykpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIF90aGlzLm9wdGlvbnMubW9kaWZpZXJzW25hbWVdID0gX2V4dGVuZHMoe30sIFBvcHBlci5EZWZhdWx0cy5tb2RpZmllcnNbbmFtZV0gfHwge30sIG9wdGlvbnMubW9kaWZpZXJzID8gb3B0aW9ucy5tb2RpZmllcnNbbmFtZV0gOiB7fSk7XG4gICAgfSk7XG5cbiAgICAvLyBSZWZhY3RvcmluZyBtb2RpZmllcnMnIGxpc3QgKE9iamVjdCA9PiBBcnJheSlcbiAgICB0aGlzLm1vZGlmaWVycyA9IE9iamVjdC5rZXlzKHRoaXMub3B0aW9ucy5tb2RpZmllcnMpLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgbmFtZTogbmFtZVxuICAgICAgfSwgX3RoaXMub3B0aW9ucy5tb2RpZmllcnNbbmFtZV0pO1xuICAgIH0pXG4gICAgLy8gc29ydCB0aGUgbW9kaWZpZXJzIGJ5IG9yZGVyXG4gICAgLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcbiAgICB9KTtcblxuICAgIC8vIG1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgd2hlbiBQb3BwZXIuanMgZ2V0IGluaXRlZFxuICAgIC8vIHN1Y2ggY29kZSBpcyBleGVjdXRlZCBpbiB0aGUgc2FtZSBvcmRlciBvZiBpdHMgbW9kaWZpZXJcbiAgICAvLyB0aGV5IGNvdWxkIGFkZCBuZXcgcHJvcGVydGllcyB0byB0aGVpciBvcHRpb25zIGNvbmZpZ3VyYXRpb25cbiAgICAvLyBCRSBBV0FSRTogZG9uJ3QgYWRkIG9wdGlvbnMgdG8gYG9wdGlvbnMubW9kaWZpZXJzLm5hbWVgIGJ1dCB0byBgbW9kaWZpZXJPcHRpb25zYCFcbiAgICB0aGlzLm1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllck9wdGlvbnMpIHtcbiAgICAgIGlmIChtb2RpZmllck9wdGlvbnMuZW5hYmxlZCAmJiBpc0Z1bmN0aW9uKG1vZGlmaWVyT3B0aW9ucy5vbkxvYWQpKSB7XG4gICAgICAgIG1vZGlmaWVyT3B0aW9ucy5vbkxvYWQoX3RoaXMucmVmZXJlbmNlLCBfdGhpcy5wb3BwZXIsIF90aGlzLm9wdGlvbnMsIG1vZGlmaWVyT3B0aW9ucywgX3RoaXMuc3RhdGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gZmlyZSB0aGUgZmlyc3QgdXBkYXRlIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXIgaW4gdGhlIHJpZ2h0IHBsYWNlXG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIHZhciBldmVudHNFbmFibGVkID0gdGhpcy5vcHRpb25zLmV2ZW50c0VuYWJsZWQ7XG4gICAgaWYgKGV2ZW50c0VuYWJsZWQpIHtcbiAgICAgIC8vIHNldHVwIGV2ZW50IGxpc3RlbmVycywgdGhleSB3aWxsIHRha2UgY2FyZSBvZiB1cGRhdGUgdGhlIHBvc2l0aW9uIGluIHNwZWNpZmljIHNpdHVhdGlvbnNcbiAgICAgIHRoaXMuZW5hYmxlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlLmV2ZW50c0VuYWJsZWQgPSBldmVudHNFbmFibGVkO1xuICB9XG5cbiAgLy8gV2UgY2FuJ3QgdXNlIGNsYXNzIHByb3BlcnRpZXMgYmVjYXVzZSB0aGV5IGRvbid0IGdldCBsaXN0ZWQgaW4gdGhlXG4gIC8vIGNsYXNzIHByb3RvdHlwZSBhbmQgYnJlYWsgc3R1ZmYgbGlrZSBTaW5vbiBzdHVic1xuXG5cbiAgY3JlYXRlQ2xhc3MoUG9wcGVyLCBbe1xuICAgIGtleTogJ3VwZGF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZSQkMSgpIHtcbiAgICAgIHJldHVybiB1cGRhdGUuY2FsbCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkZXN0cm95JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSQkMSgpIHtcbiAgICAgIHJldHVybiBkZXN0cm95LmNhbGwodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZW5hYmxlRXZlbnRMaXN0ZW5lcnMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmFibGVFdmVudExpc3RlbmVycyQkMSgpIHtcbiAgICAgIHJldHVybiBlbmFibGVFdmVudExpc3RlbmVycy5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2Rpc2FibGVFdmVudExpc3RlbmVycycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRpc2FibGVFdmVudExpc3RlbmVycyQkMSgpIHtcbiAgICAgIHJldHVybiBkaXNhYmxlRXZlbnRMaXN0ZW5lcnMuY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTY2hlZHVsZXMgYW4gdXBkYXRlLiBJdCB3aWxsIHJ1biBvbiB0aGUgbmV4dCBVSSB1cGRhdGUgYXZhaWxhYmxlLlxuICAgICAqIEBtZXRob2Qgc2NoZWR1bGVVcGRhdGVcbiAgICAgKiBAbWVtYmVyb2YgUG9wcGVyXG4gICAgICovXG5cblxuICAgIC8qKlxuICAgICAqIENvbGxlY3Rpb24gb2YgdXRpbGl0aWVzIHVzZWZ1bCB3aGVuIHdyaXRpbmcgY3VzdG9tIG1vZGlmaWVycy5cbiAgICAgKiBTdGFydGluZyBmcm9tIHZlcnNpb24gMS43LCB0aGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgb25seSBpZiB5b3VcbiAgICAgKiBpbmNsdWRlIGBwb3BwZXItdXRpbHMuanNgIGJlZm9yZSBgcG9wcGVyLmpzYC5cbiAgICAgKlxuICAgICAqICoqREVQUkVDQVRJT04qKjogVGhpcyB3YXkgdG8gYWNjZXNzIFBvcHBlclV0aWxzIGlzIGRlcHJlY2F0ZWRcbiAgICAgKiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHYyISBVc2UgdGhlIFBvcHBlclV0aWxzIG1vZHVsZSBkaXJlY3RseSBpbnN0ZWFkLlxuICAgICAqIER1ZSB0byB0aGUgaGlnaCBpbnN0YWJpbGl0eSBvZiB0aGUgbWV0aG9kcyBjb250YWluZWQgaW4gVXRpbHMsIHdlIGNhbid0XG4gICAgICogZ3VhcmFudGVlIHRoZW0gdG8gZm9sbG93IHNlbXZlci4gVXNlIHRoZW0gYXQgeW91ciBvd24gcmlzayFcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMS44XG4gICAgICogQG1lbWJlciBVdGlsc1xuICAgICAqIEBtZW1iZXJvZiBQb3BwZXJcbiAgICAgKi9cblxuICB9XSk7XG4gIHJldHVybiBQb3BwZXI7XG59KCk7XG5cbi8qKlxuICogVGhlIGByZWZlcmVuY2VPYmplY3RgIGlzIGFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFuIGludGVyZmFjZSBjb21wYXRpYmxlIHdpdGggUG9wcGVyLmpzXG4gKiBhbmQgbGV0cyB5b3UgdXNlIGl0IGFzIHJlcGxhY2VtZW50IG9mIGEgcmVhbCBET00gbm9kZS48YnIgLz5cbiAqIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIHBvc2l0aW9uIGEgcG9wcGVyIHJlbGF0aXZlbHkgdG8gYSBzZXQgb2YgY29vcmRpbmF0ZXNcbiAqIGluIGNhc2UgeW91IGRvbid0IGhhdmUgYSBET00gbm9kZSB0byB1c2UgYXMgcmVmZXJlbmNlLlxuICpcbiAqIGBgYFxuICogbmV3IFBvcHBlcihyZWZlcmVuY2VPYmplY3QsIHBvcHBlck5vZGUpO1xuICogYGBgXG4gKlxuICogTkI6IFRoaXMgZmVhdHVyZSBpc24ndCBzdXBwb3J0ZWQgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTAuXG4gKiBAbmFtZSByZWZlcmVuY2VPYmplY3RcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGRhdGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0XG4gKiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHNldCBvZiBjb29yZGluYXRlcyBjb21wYXRpYmxlIHdpdGggdGhlIG5hdGl2ZSBgZ2V0Qm91bmRpbmdDbGllbnRSZWN0YCBtZXRob2QuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZGF0YS5jbGllbnRXaWR0aFxuICogQW4gRVM2IGdldHRlciB0aGF0IHdpbGwgcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgdmlydHVhbCByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkYXRhLmNsaWVudEhlaWdodFxuICogQW4gRVM2IGdldHRlciB0aGF0IHdpbGwgcmV0dXJuIHRoZSBoZWlnaHQgb2YgdGhlIHZpcnR1YWwgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKi9cblxuXG5Qb3BwZXIuVXRpbHMgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBnbG9iYWwpLlBvcHBlclV0aWxzO1xuUG9wcGVyLnBsYWNlbWVudHMgPSBwbGFjZW1lbnRzO1xuUG9wcGVyLkRlZmF1bHRzID0gRGVmYXVsdHM7XG5cbmV4cG9ydCBkZWZhdWx0IFBvcHBlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvcHBlci5qcy5tYXBcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/popper.js/dist/esm/popper.js\n");
/***/ }),
/***/ "./node_modules/process/browser.js":
/*!*****************************************!*\
!*** ./node_modules/process/browser.js ***!
\*****************************************/
/***/ ((module) => {
eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isc0JBQXNCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTs7QUFFQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcz81Y2IzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/process/browser.js\n");
/***/ }),
/***/ "./node_modules/axios/package.json":
/*!*****************************************!*\
!*** ./node_modules/axios/package.json ***!
\*****************************************/
/***/ ((module) => {
"use strict";
module.exports = JSON.parse('{"name":"axios","version":"0.21.4","description":"Promise based HTTP client for the browser and node.js","main":"index.js","scripts":{"test":"grunt test","start":"node ./sandbox/server.js","build":"NODE_ENV=production grunt build","preversion":"npm test","version":"npm run build && grunt version && git add -A dist && git add CHANGELOG.md bower.json package.json","postversion":"git push && git push --tags","examples":"node ./examples/server.js","coveralls":"cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js","fix":"eslint --fix lib/**/*.js"},"repository":{"type":"git","url":"https://github.com/axios/axios.git"},"keywords":["xhr","http","ajax","promise","node"],"author":"Matt Zabriskie","license":"MIT","bugs":{"url":"https://github.com/axios/axios/issues"},"homepage":"https://axios-http.com","devDependencies":{"coveralls":"^3.0.0","es6-promise":"^4.2.4","grunt":"^1.3.0","grunt-banner":"^0.6.0","grunt-cli":"^1.2.0","grunt-contrib-clean":"^1.1.0","grunt-contrib-watch":"^1.0.0","grunt-eslint":"^23.0.0","grunt-karma":"^4.0.0","grunt-mocha-test":"^0.13.3","grunt-ts":"^6.0.0-beta.19","grunt-webpack":"^4.0.2","istanbul-instrumenter-loader":"^1.0.0","jasmine-core":"^2.4.1","karma":"^6.3.2","karma-chrome-launcher":"^3.1.0","karma-firefox-launcher":"^2.1.0","karma-jasmine":"^1.1.1","karma-jasmine-ajax":"^0.1.13","karma-safari-launcher":"^1.0.0","karma-sauce-launcher":"^4.3.6","karma-sinon":"^1.0.5","karma-sourcemap-loader":"^0.3.8","karma-webpack":"^4.0.2","load-grunt-tasks":"^3.5.2","minimist":"^1.2.0","mocha":"^8.2.1","sinon":"^4.5.0","terser-webpack-plugin":"^4.2.3","typescript":"^4.0.5","url-search-params":"^0.10.0","webpack":"^4.44.2","webpack-dev-server":"^3.11.0"},"browser":{"./lib/adapters/http.js":"./lib/adapters/xhr.js"},"jsdelivr":"dist/axios.min.js","unpkg":"dist/axios.min.js","typings":"./index.d.ts","dependencies":{"follow-redirects":"^1.14.0"},"bundlesize":[{"path":"./dist/axios.min.js","threshold":"5kB"}]}');
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = __webpack_modules__;
/******/
/************************************************************************/
/******/ /* webpack/runtime/chunk loaded */
/******/ (() => {
/******/ var deferred = [];
/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => {
/******/ if(chunkIds) {
/******/ priority = priority || 0;
/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];
/******/ deferred[i] = [chunkIds, fn, priority];
/******/ return;
/******/ }
/******/ var notFulfilled = Infinity;
/******/ for (var i = 0; i < deferred.length; i++) {
/******/ var [chunkIds, fn, priority] = deferred[i];
/******/ var fulfilled = true;
/******/ for (var j = 0; j < chunkIds.length; j++) {
/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {
/******/ chunkIds.splice(j--, 1);
/******/ } else {
/******/ fulfilled = false;
/******/ if(priority < notFulfilled) notFulfilled = priority;
/******/ }
/******/ }
/******/ if(fulfilled) {
/******/ deferred.splice(i--, 1)
/******/ var r = fn();
/******/ if (r !== undefined) result = r;
/******/ }
/******/ }
/******/ return result;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/global */
/******/ (() => {
/******/ __webpack_require__.g = (function() {
/******/ if (typeof globalThis === 'object') return globalThis;
/******/ try {
/******/ return this || new Function('return this')();
/******/ } catch (e) {
/******/ if (typeof window === 'object') return window;
/******/ }
/******/ })();
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/jsonp chunk loading */
/******/ (() => {
/******/ // no baseURI
/******/
/******/ // object to store loaded and loading chunks
/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
/******/ var installedChunks = {
/******/ "/js/app": 0,
/******/ "css/app": 0
/******/ };
/******/
/******/ // no chunk on demand loading
/******/
/******/ // no prefetching
/******/
/******/ // no preloaded
/******/
/******/ // no HMR
/******/
/******/ // no HMR manifest
/******/
/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);
/******/
/******/ // install a JSONP callback for chunk loading
/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => {
/******/ var [chunkIds, moreModules, runtime] = data;
/******/ // add "moreModules" to the modules object,
/******/ // then flag all "chunkIds" as loaded and fire callback
/******/ var moduleId, chunkId, i = 0;
/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) {
/******/ for(moduleId in moreModules) {
/******/ if(__webpack_require__.o(moreModules, moduleId)) {
/******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
/******/ }
/******/ }
/******/ if(runtime) var result = runtime(__webpack_require__);
/******/ }
/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);
/******/ for(;i < chunkIds.length; i++) {
/******/ chunkId = chunkIds[i];
/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {
/******/ installedChunks[chunkId][0]();
/******/ }
/******/ installedChunks[chunkId] = 0;
/******/ }
/******/ return __webpack_require__.O(result);
/******/ }
/******/
/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || [];
/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));
/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));
/******/ })();
/******/
/************************************************************************/
/******/
/******/ // startup
/******/ // Load entry module and return exports
/******/ // This entry module depends on other loaded chunks and execution need to be delayed
/******/ __webpack_require__.O(undefined, ["css/app"], () => (__webpack_require__("./resources/js/app.js")))
/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["css/app"], () => (__webpack_require__("./resources/sass/app.scss")))
/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__);
/******/
/******/ })()
;