566 lines
No EOL
2.6 MiB
Vendored
566 lines
No EOL
2.6 MiB
Vendored
/*
|
||
* 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvaW5kZXguanM/YmMzYSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0RkFBdUMiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvaW5kZXguanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2F4aW9zJyk7Il0sInNvdXJjZVJvb3QiOiIifQ==\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\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 // Listen for ready state\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\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !config.responseType || config.responseType === 'text' ? 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 // 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(timeoutErrorMessage, config, '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 (config.responseType) {\n try {\n request.responseType = config.responseType;\n } catch (e) {\n // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.\n // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.\n if (config.responseType !== 'json') {\n throw e;\n }\n }\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcz9iNTBkIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxxREFBWTtBQUNoQyxhQUFhLG1CQUFPLENBQUMsaUVBQWtCO0FBQ3ZDLGNBQWMsbUJBQU8sQ0FBQyx5RUFBc0I7QUFDNUMsZUFBZSxtQkFBTyxDQUFDLDJFQUF1QjtBQUM5QyxvQkFBb0IsbUJBQU8sQ0FBQyw2RUFBdUI7QUFDbkQsbUJBQW1CLG1CQUFPLENBQUMsbUZBQTJCO0FBQ3RELHNCQUFzQixtQkFBTyxDQUFDLHlGQUE4QjtBQUM1RCxrQkFBa0IsbUJBQU8sQ0FBQyx5RUFBcUI7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9hZGFwdGVycy94aHIuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcbnZhciBzZXR0bGUgPSByZXF1aXJlKCcuLy4uL2NvcmUvc2V0dGxlJyk7XG52YXIgY29va2llcyA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9jb29raWVzJyk7XG52YXIgYnVpbGRVUkwgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvYnVpbGRVUkwnKTtcbnZhciBidWlsZEZ1bGxQYXRoID0gcmVxdWlyZSgnLi4vY29yZS9idWlsZEZ1bGxQYXRoJyk7XG52YXIgcGFyc2VIZWFkZXJzID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL3BhcnNlSGVhZGVycycpO1xudmFyIGlzVVJMU2FtZU9yaWdpbiA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9pc1VSTFNhbWVPcmlnaW4nKTtcbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJy4uL2NvcmUvY3JlYXRlRXJyb3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB4aHJBZGFwdGVyKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciByZXF1ZXN0RGF0YSA9IGNvbmZpZy5kYXRhO1xuICAgIHZhciByZXF1ZXN0SGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzO1xuXG4gICAgaWYgKHV0aWxzLmlzRm9ybURhdGEocmVxdWVzdERhdGEpKSB7XG4gICAgICBkZWxldGUgcmVxdWVzdEhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddOyAvLyBMZXQgdGhlIGJyb3dzZXIgc2V0IGl0XG4gICAgfVxuXG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgIC8vIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb25cbiAgICBpZiAoY29uZmlnLmF1dGgpIHtcbiAgICAgIHZhciB1c2VybmFtZSA9IGNvbmZpZy5hdXRoLnVzZXJuYW1lIHx8ICcnO1xuICAgICAgdmFyIHBhc3N3b3JkID0gY29uZmlnLmF1dGgucGFzc3dvcmQgPyB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoY29uZmlnLmF1dGgucGFzc3dvcmQpKSA6ICcnO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuQXV0aG9yaXphdGlvbiA9ICdCYXNpYyAnICsgYnRvYSh1c2VybmFtZSArICc6JyArIHBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICB2YXIgZnVsbFBhdGggPSBidWlsZEZ1bGxQYXRoKGNvbmZpZy5iYXNlVVJMLCBjb25maWcudXJsKTtcbiAgICByZXF1ZXN0Lm9wZW4oY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCBidWlsZFVSTChmdWxsUGF0aCwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpLCB0cnVlKTtcblxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IGluIE1TXG4gICAgcmVxdWVzdC50aW1lb3V0ID0gY29uZmlnLnRpbWVvdXQ7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHJlYWR5IHN0YXRlXG4gICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVMb2FkKCkge1xuICAgICAgaWYgKCFyZXF1ZXN0IHx8IHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSByZXF1ZXN0IGVycm9yZWQgb3V0IGFuZCB3ZSBkaWRuJ3QgZ2V0IGEgcmVzcG9uc2UsIHRoaXMgd2lsbCBiZVxuICAgICAgLy8gaGFuZGxlZCBieSBvbmVycm9yIGluc3RlYWRcbiAgICAgIC8vIFdpdGggb25lIGV4Y2VwdGlvbjogcmVxdWVzdCB0aGF0IHVzaW5nIGZpbGU6IHByb3RvY29sLCBtb3N0IGJyb3dzZXJzXG4gICAgICAvLyB3aWxsIHJldHVybiBzdGF0dXMgYXMgMCBldmVuIHRob3VnaCBpdCdzIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0XG4gICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDAgJiYgIShyZXF1ZXN0LnJlc3BvbnNlVVJMICYmIHJlcXVlc3QucmVzcG9uc2VVUkwuaW5kZXhPZignZmlsZTonKSA9PT0gMCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZVxuICAgICAgdmFyIHJlc3BvbnNlSGVhZGVycyA9ICdnZXRBbGxSZXNwb25zZUhlYWRlcnMnIGluIHJlcXVlc3QgPyBwYXJzZUhlYWRlcnMocmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkgOiBudWxsO1xuICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9ICFjb25maWcucmVzcG9uc2VUeXBlIHx8IGNvbmZpZy5yZXNwb25zZVR5cGUgPT09ICd0ZXh0JyA/IHJlcXVlc3QucmVzcG9uc2VUZXh0IDogcmVxdWVzdC5yZXNwb25zZTtcbiAgICAgIHZhciByZXNwb25zZSA9IHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXF1ZXN0LnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RcbiAgICAgIH07XG5cbiAgICAgIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBicm93c2VyIHJlcXVlc3QgY2FuY2VsbGF0aW9uIChhcyBvcHBvc2VkIHRvIGEgbWFudWFsIGNhbmNlbGxhdGlvbilcbiAgICByZXF1ZXN0Lm9uYWJvcnQgPSBmdW5jdGlvbiBoYW5kbGVBYm9ydCgpIHtcbiAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlamVjdChjcmVhdGVFcnJvcignUmVxdWVzdCBhYm9ydGVkJywgY29uZmlnLCAnRUNPTk5BQk9SVEVEJywgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIGxvdyBsZXZlbCBuZXR3b3JrIGVycm9yc1xuICAgIHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIGhhbmRsZUVycm9yKCkge1xuICAgICAgLy8gUmVhbCBlcnJvcnMgYXJlIGhpZGRlbiBmcm9tIHVzIGJ5IHRoZSBicm93c2VyXG4gICAgICAvLyBvbmVycm9yIHNob3VsZCBvbmx5IGZpcmUgaWYgaXQncyBhIG5ldHdvcmsgZXJyb3JcbiAgICAgIHJlamVjdChjcmVhdGVFcnJvcignTmV0d29yayBFcnJvcicsIGNvbmZpZywgbnVsbCwgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIHRpbWVvdXRcbiAgICByZXF1ZXN0Lm9udGltZW91dCA9IGZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoKSB7XG4gICAgICB2YXIgdGltZW91dEVycm9yTWVzc2FnZSA9ICd0aW1lb3V0IG9mICcgKyBjb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCc7XG4gICAgICBpZiAoY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IGNvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmVqZWN0KGNyZWF0ZUVycm9yKHRpbWVvdXRFcnJvck1lc3NhZ2UsIGNvbmZpZywgJ0VDT05OQUJPUlRFRCcsXG4gICAgICAgIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgIC8vIFRoaXMgaXMgb25seSBkb25lIGlmIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50LlxuICAgIC8vIFNwZWNpZmljYWxseSBub3QgaWYgd2UncmUgaW4gYSB3ZWIgd29ya2VyLCBvciByZWFjdC1uYXRpdmUuXG4gICAgaWYgKHV0aWxzLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpIHtcbiAgICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgICAgdmFyIHhzcmZWYWx1ZSA9IChjb25maWcud2l0aENyZWRlbnRpYWxzIHx8IGlzVVJMU2FtZU9yaWdpbihmdWxsUGF0aCkpICYmIGNvbmZpZy54c3JmQ29va2llTmFtZSA/XG4gICAgICAgIGNvb2tpZXMucmVhZChjb25maWcueHNyZkNvb2tpZU5hbWUpIDpcbiAgICAgICAgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoeHNyZlZhbHVlKSB7XG4gICAgICAgIHJlcXVlc3RIZWFkZXJzW2NvbmZpZy54c3JmSGVhZGVyTmFtZV0gPSB4c3JmVmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcbiAgICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIHJlcXVlc3QpIHtcbiAgICAgIHV0aWxzLmZvckVhY2gocmVxdWVzdEhlYWRlcnMsIGZ1bmN0aW9uIHNldFJlcXVlc3RIZWFkZXIodmFsLCBrZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0RGF0YSA9PT0gJ3VuZGVmaW5lZCcgJiYga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnKSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIENvbnRlbnQtVHlwZSBpZiBkYXRhIGlzIHVuZGVmaW5lZFxuICAgICAgICAgIGRlbGV0ZSByZXF1ZXN0SGVhZGVyc1trZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE90aGVyd2lzZSBhZGQgaGVhZGVyIHRvIHRoZSByZXF1ZXN0XG4gICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHdpdGhDcmVkZW50aWFscyB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoY29uZmlnLndpdGhDcmVkZW50aWFscykpIHtcbiAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gISFjb25maWcud2l0aENyZWRlbnRpYWxzO1xuICAgIH1cblxuICAgIC8vIEFkZCByZXNwb25zZVR5cGUgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVHlwZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBFeHBlY3RlZCBET01FeGNlcHRpb24gdGhyb3duIGJ5IGJyb3dzZXJzIG5vdCBjb21wYXRpYmxlIFhNTEh0dHBSZXF1ZXN0IExldmVsIDIuXG4gICAgICAgIC8vIEJ1dCwgdGhpcyBjYW4gYmUgc3VwcHJlc3NlZCBmb3IgJ2pzb24nIHR5cGUgYXMgaXQgY2FuIGJlIHBhcnNlZCBieSBkZWZhdWx0ICd0cmFuc2Zvcm1SZXNwb25zZScgZnVuY3Rpb24uXG4gICAgICAgIGlmIChjb25maWcucmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHByb2dyZXNzIGlmIG5lZWRlZFxuICAgIGlmICh0eXBlb2YgY29uZmlnLm9uRG93bmxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGNvbmZpZy5vbkRvd25sb2FkUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIC8vIE5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCB1cGxvYWQgZXZlbnRzXG4gICAgaWYgKHR5cGVvZiBjb25maWcub25VcGxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJyAmJiByZXF1ZXN0LnVwbG9hZCkge1xuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBjb25maWcub25VcGxvYWRQcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgICAgLy8gSGFuZGxlIGNhbmNlbGxhdGlvblxuICAgICAgY29uZmlnLmNhbmNlbFRva2VuLnByb21pc2UudGhlbihmdW5jdGlvbiBvbkNhbmNlbGVkKGNhbmNlbCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgIHJlamVjdChjYW5jZWwpO1xuICAgICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXF1ZXN0RGF0YSkge1xuICAgICAgcmVxdWVzdERhdGEgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFNlbmQgdGhlIHJlcXVlc3RcbiAgICByZXF1ZXN0LnNlbmQocmVxdWVzdERhdGEpO1xuICB9KTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2F4aW9zLmpzP2NlZTQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsWUFBWSxtQkFBTyxDQUFDLGtEQUFTO0FBQzdCLFdBQVcsbUJBQU8sQ0FBQyxnRUFBZ0I7QUFDbkMsWUFBWSxtQkFBTyxDQUFDLDREQUFjO0FBQ2xDLGtCQUFrQixtQkFBTyxDQUFDLHdFQUFvQjtBQUM5QyxlQUFlLG1CQUFPLENBQUMsd0RBQVk7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZLE1BQU07QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxtQkFBTyxDQUFDLGtFQUFpQjtBQUN4QyxvQkFBb0IsbUJBQU8sQ0FBQyw0RUFBc0I7QUFDbEQsaUJBQWlCLG1CQUFPLENBQUMsc0VBQW1COztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsbUJBQU8sQ0FBQyxvRUFBa0I7O0FBRXpDO0FBQ0EscUJBQXFCLG1CQUFPLENBQUMsZ0ZBQXdCOztBQUVyRDs7QUFFQTtBQUNBLHNCQUFzQiIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYXhpb3MuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi9oZWxwZXJzL2JpbmQnKTtcbnZhciBBeGlvcyA9IHJlcXVpcmUoJy4vY29yZS9BeGlvcycpO1xudmFyIG1lcmdlQ29uZmlnID0gcmVxdWlyZSgnLi9jb3JlL21lcmdlQ29uZmlnJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG5cbi8qKlxuICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqIEByZXR1cm4ge0F4aW9zfSBBIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICovXG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZShkZWZhdWx0Q29uZmlnKSB7XG4gIHZhciBjb250ZXh0ID0gbmV3IEF4aW9zKGRlZmF1bHRDb25maWcpO1xuICB2YXIgaW5zdGFuY2UgPSBiaW5kKEF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0LCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGF4aW9zLnByb3RvdHlwZSB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIEF4aW9zLnByb3RvdHlwZSwgY29udGV4dCk7XG5cbiAgLy8gQ29weSBjb250ZXh0IHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgY29udGV4dCk7XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG4vLyBDcmVhdGUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgdG8gYmUgZXhwb3J0ZWRcbnZhciBheGlvcyA9IGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRzKTtcblxuLy8gRXhwb3NlIEF4aW9zIGNsYXNzIHRvIGFsbG93IGNsYXNzIGluaGVyaXRhbmNlXG5heGlvcy5BeGlvcyA9IEF4aW9zO1xuXG4vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgaW5zdGFuY2VzXG5heGlvcy5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaW5zdGFuY2VDb25maWcpIHtcbiAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlKG1lcmdlQ29uZmlnKGF4aW9zLmRlZmF1bHRzLCBpbnN0YW5jZUNvbmZpZykpO1xufTtcblxuLy8gRXhwb3NlIENhbmNlbCAmIENhbmNlbFRva2VuXG5heGlvcy5DYW5jZWwgPSByZXF1aXJlKCcuL2NhbmNlbC9DYW5jZWwnKTtcbmF4aW9zLkNhbmNlbFRva2VuID0gcmVxdWlyZSgnLi9jYW5jZWwvQ2FuY2VsVG9rZW4nKTtcbmF4aW9zLmlzQ2FuY2VsID0gcmVxdWlyZSgnLi9jYW5jZWwvaXNDYW5jZWwnKTtcblxuLy8gRXhwb3NlIGFsbC9zcHJlYWRcbmF4aW9zLmFsbCA9IGZ1bmN0aW9uIGFsbChwcm9taXNlcykge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufTtcbmF4aW9zLnNwcmVhZCA9IHJlcXVpcmUoJy4vaGVscGVycy9zcHJlYWQnKTtcblxuLy8gRXhwb3NlIGlzQXhpb3NFcnJvclxuYXhpb3MuaXNBeGlvc0Vycm9yID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzQXhpb3NFcnJvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGF4aW9zO1xuXG4vLyBBbGxvdyB1c2Ugb2YgZGVmYXVsdCBpbXBvcnQgc3ludGF4IGluIFR5cGVTY3JpcHRcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBheGlvcztcbiJdLCJzb3VyY2VSb290IjoiIn0=\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWwuanM/N2E3NyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWwuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQSBgQ2FuY2VsYCBpcyBhbiBvYmplY3QgdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgY2FuY2VsZWQuXG4gKlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge3N0cmluZz19IG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIENhbmNlbChtZXNzYWdlKSB7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG59XG5cbkNhbmNlbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuICdDYW5jZWwnICsgKHRoaXMubWVzc2FnZSA/ICc6ICcgKyB0aGlzLm1lc3NhZ2UgOiAnJyk7XG59O1xuXG5DYW5jZWwucHJvdG90eXBlLl9fQ0FOQ0VMX18gPSB0cnVlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENhbmNlbDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcz84ZGY0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLGFBQWEsbUJBQU8sQ0FBQywyREFBVTs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvQ2FuY2VsVG9rZW4uanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBDYW5jZWwgPSByZXF1aXJlKCcuL0NhbmNlbCcpO1xuXG4vKipcbiAqIEEgYENhbmNlbFRva2VuYCBpcyBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byByZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZiBhbiBvcGVyYXRpb24uXG4gKlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBleGVjdXRvciBUaGUgZXhlY3V0b3IgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIENhbmNlbFRva2VuKGV4ZWN1dG9yKSB7XG4gIGlmICh0eXBlb2YgZXhlY3V0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gIH1cblxuICB2YXIgcmVzb2x2ZVByb21pc2U7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIHByb21pc2VFeGVjdXRvcihyZXNvbHZlKSB7XG4gICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xuICB9KTtcblxuICB2YXIgdG9rZW4gPSB0aGlzO1xuICBleGVjdXRvcihmdW5jdGlvbiBjYW5jZWwobWVzc2FnZSkge1xuICAgIGlmICh0b2tlbi5yZWFzb24pIHtcbiAgICAgIC8vIENhbmNlbGxhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRva2VuLnJlYXNvbiA9IG5ldyBDYW5jZWwobWVzc2FnZSk7XG4gICAgcmVzb2x2ZVByb21pc2UodG9rZW4ucmVhc29uKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhyb3dzIGEgYENhbmNlbGAgaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAqL1xuQ2FuY2VsVG9rZW4ucHJvdG90eXBlLnRocm93SWZSZXF1ZXN0ZWQgPSBmdW5jdGlvbiB0aHJvd0lmUmVxdWVzdGVkKCkge1xuICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICB0aHJvdyB0aGlzLnJlYXNvbjtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbmV3IGBDYW5jZWxUb2tlbmAgYW5kIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsXG4gKiBjYW5jZWxzIHRoZSBgQ2FuY2VsVG9rZW5gLlxuICovXG5DYW5jZWxUb2tlbi5zb3VyY2UgPSBmdW5jdGlvbiBzb3VyY2UoKSB7XG4gIHZhciBjYW5jZWw7XG4gIHZhciB0b2tlbiA9IG5ldyBDYW5jZWxUb2tlbihmdW5jdGlvbiBleGVjdXRvcihjKSB7XG4gICAgY2FuY2VsID0gYztcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgdG9rZW46IHRva2VuLFxuICAgIGNhbmNlbDogY2FuY2VsXG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENhbmNlbFRva2VuO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcz8yZTY3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL2lzQ2FuY2VsLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQ2FuY2VsKHZhbHVlKSB7XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZS5fX0NBTkNFTF9fKTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\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\");\n\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 // Hook up interceptors middleware\n var chain = [dispatchRequest, undefined];\n var promise = Promise.resolve(config);\n\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n chain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n chain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3MuanM/MGEwNiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixZQUFZLG1CQUFPLENBQUMscURBQVk7QUFDaEMsZUFBZSxtQkFBTyxDQUFDLHlFQUFxQjtBQUM1Qyx5QkFBeUIsbUJBQU8sQ0FBQyxpRkFBc0I7QUFDdkQsc0JBQXNCLG1CQUFPLENBQUMsMkVBQW1CO0FBQ2pELGtCQUFrQixtQkFBTyxDQUFDLG1FQUFlOztBQUV6QztBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QixLQUFLO0FBQ0w7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDOztBQUVEIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgYnVpbGRVUkwgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2J1aWxkVVJMJyk7XG52YXIgSW50ZXJjZXB0b3JNYW5hZ2VyID0gcmVxdWlyZSgnLi9JbnRlcmNlcHRvck1hbmFnZXInKTtcbnZhciBkaXNwYXRjaFJlcXVlc3QgPSByZXF1aXJlKCcuL2Rpc3BhdGNoUmVxdWVzdCcpO1xudmFyIG1lcmdlQ29uZmlnID0gcmVxdWlyZSgnLi9tZXJnZUNvbmZpZycpO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZUNvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBBeGlvcyhpbnN0YW5jZUNvbmZpZykge1xuICB0aGlzLmRlZmF1bHRzID0gaW5zdGFuY2VDb25maWc7XG4gIHRoaXMuaW50ZXJjZXB0b3JzID0ge1xuICAgIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKSxcbiAgICByZXNwb25zZTogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpXG4gIH07XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHNwZWNpZmljIGZvciB0aGlzIHJlcXVlc3QgKG1lcmdlZCB3aXRoIHRoaXMuZGVmYXVsdHMpXG4gKi9cbkF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24gcmVxdWVzdChjb25maWcpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uZmlnID0gYXJndW1lbnRzWzFdIHx8IHt9O1xuICAgIGNvbmZpZy51cmwgPSBhcmd1bWVudHNbMF07XG4gIH0gZWxzZSB7XG4gICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICB9XG5cbiAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcblxuICAvLyBTZXQgY29uZmlnLm1ldGhvZFxuICBpZiAoY29uZmlnLm1ldGhvZCkge1xuICAgIGNvbmZpZy5tZXRob2QgPSBjb25maWcubWV0aG9kLnRvTG93ZXJDYXNlKCk7XG4gIH0gZWxzZSBpZiAodGhpcy5kZWZhdWx0cy5tZXRob2QpIHtcbiAgICBjb25maWcubWV0aG9kID0gdGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgfSBlbHNlIHtcbiAgICBjb25maWcubWV0aG9kID0gJ2dldCc7XG4gIH1cblxuICAvLyBIb29rIHVwIGludGVyY2VwdG9ycyBtaWRkbGV3YXJlXG4gIHZhciBjaGFpbiA9IFtkaXNwYXRjaFJlcXVlc3QsIHVuZGVmaW5lZF07XG4gIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgY2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgfSk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICBjaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICB9KTtcblxuICB3aGlsZSAoY2hhaW4ubGVuZ3RoKSB7XG4gICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbi5zaGlmdCgpLCBjaGFpbi5zaGlmdCgpKTtcbiAgfVxuXG4gIHJldHVybiBwcm9taXNlO1xufTtcblxuQXhpb3MucHJvdG90eXBlLmdldFVyaSA9IGZ1bmN0aW9uIGdldFVyaShjb25maWcpIHtcbiAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgcmV0dXJuIGJ1aWxkVVJMKGNvbmZpZy51cmwsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKS5yZXBsYWNlKC9eXFw/LywgJycpO1xufTtcblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ29wdGlvbnMnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIHVybDogdXJsLFxuICAgICAgZGF0YTogKGNvbmZpZyB8fCB7fSkuZGF0YVxuICAgIH0pKTtcbiAgfTtcbn0pO1xuXG51dGlscy5mb3JFYWNoKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZFdpdGhEYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgdXJsOiB1cmwsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQXhpb3M7XG4iXSwic291cmNlUm9vdCI6IiJ9\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) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvSW50ZXJjZXB0b3JNYW5hZ2VyLmpzP2Y2YjQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsWUFBWSxtQkFBTyxDQUFDLHFEQUFZOztBQUVoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsU0FBUztBQUNwQjtBQUNBLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0ludGVyY2VwdG9yTWFuYWdlci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5mdW5jdGlvbiBJbnRlcmNlcHRvck1hbmFnZXIoKSB7XG4gIHRoaXMuaGFuZGxlcnMgPSBbXTtcbn1cblxuLyoqXG4gKiBBZGQgYSBuZXcgaW50ZXJjZXB0b3IgdG8gdGhlIHN0YWNrXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVsZmlsbGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHRoZW5gIGZvciBhIGBQcm9taXNlYFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0ZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgcmVqZWN0YCBmb3IgYSBgUHJvbWlzZWBcbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IEFuIElEIHVzZWQgdG8gcmVtb3ZlIGludGVyY2VwdG9yIGxhdGVyXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gdXNlKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpIHtcbiAgdGhpcy5oYW5kbGVycy5wdXNoKHtcbiAgICBmdWxmaWxsZWQ6IGZ1bGZpbGxlZCxcbiAgICByZWplY3RlZDogcmVqZWN0ZWRcbiAgfSk7XG4gIHJldHVybiB0aGlzLmhhbmRsZXJzLmxlbmd0aCAtIDE7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhbiBpbnRlcmNlcHRvciBmcm9tIHRoZSBzdGFja1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBpZCBUaGUgSUQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgYHVzZWBcbiAqL1xuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS5lamVjdCA9IGZ1bmN0aW9uIGVqZWN0KGlkKSB7XG4gIGlmICh0aGlzLmhhbmRsZXJzW2lkXSkge1xuICAgIHRoaXMuaGFuZGxlcnNbaWRdID0gbnVsbDtcbiAgfVxufTtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWdpc3RlcmVkIGludGVyY2VwdG9yc1xuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHNraXBwaW5nIG92ZXIgYW55XG4gKiBpbnRlcmNlcHRvcnMgdGhhdCBtYXkgaGF2ZSBiZWNvbWUgYG51bGxgIGNhbGxpbmcgYGVqZWN0YC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpbnRlcmNlcHRvclxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiBmb3JFYWNoKGZuKSB7XG4gIHV0aWxzLmZvckVhY2godGhpcy5oYW5kbGVycywgZnVuY3Rpb24gZm9yRWFjaEhhbmRsZXIoaCkge1xuICAgIGlmIChoICE9PSBudWxsKSB7XG4gICAgICBmbihoKTtcbiAgICB9XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBJbnRlcmNlcHRvck1hbmFnZXI7XG4iXSwic291cmNlUm9vdCI6IiJ9\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvYnVpbGRGdWxsUGF0aC5qcz84M2I5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLG9CQUFvQixtQkFBTyxDQUFDLG1GQUEwQjtBQUN0RCxrQkFBa0IsbUJBQU8sQ0FBQywrRUFBd0I7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9idWlsZEZ1bGxQYXRoLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNBYnNvbHV0ZVVSTCA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTCcpO1xudmFyIGNvbWJpbmVVUkxzID0gcmVxdWlyZSgnLi4vaGVscGVycy9jb21iaW5lVVJMcycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgYmFzZVVSTCB3aXRoIHRoZSByZXF1ZXN0ZWRVUkwsXG4gKiBvbmx5IHdoZW4gdGhlIHJlcXVlc3RlZFVSTCBpcyBub3QgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwuXG4gKiBJZiB0aGUgcmVxdWVzdFVSTCBpcyBhYnNvbHV0ZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1ZXN0ZWRVUkwgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlcXVlc3RlZFVSTCBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gY29tYmluZVxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIGZ1bGwgcGF0aFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJ1aWxkRnVsbFBhdGgoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKSB7XG4gIGlmIChiYXNlVVJMICYmICFpc0Fic29sdXRlVVJMKHJlcXVlc3RlZFVSTCkpIHtcbiAgICByZXR1cm4gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKTtcbiAgfVxuICByZXR1cm4gcmVxdWVzdGVkVVJMO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvY3JlYXRlRXJyb3IuanM/MmQ4MyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixtQkFBbUIsbUJBQU8sQ0FBQyxxRUFBZ0I7O0FBRTNDO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvY3JlYXRlRXJyb3IuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBlbmhhbmNlRXJyb3IgPSByZXF1aXJlKCcuL2VuaGFuY2VFcnJvcicpO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBFcnJvciB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSwgY29uZmlnLCBlcnJvciBjb2RlLCByZXF1ZXN0IGFuZCByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY29kZV0gVGhlIGVycm9yIGNvZGUgKGZvciBleGFtcGxlLCAnRUNPTk5BQk9SVEVEJykuXG4gKiBAcGFyYW0ge09iamVjdH0gW3JlcXVlc3RdIFRoZSByZXF1ZXN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXNwb25zZV0gVGhlIHJlc3BvbnNlLlxuICogQHJldHVybnMge0Vycm9yfSBUaGUgY3JlYXRlZCBlcnJvci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjcmVhdGVFcnJvcihtZXNzYWdlLCBjb25maWcsIGNvZGUsIHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gIHZhciBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGVuaGFuY2VFcnJvcihlcnJvciwgY29uZmlnLCBjb2RlLCByZXF1ZXN0LCByZXNwb25zZSk7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\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(\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(\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(\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZGlzcGF0Y2hSZXF1ZXN0LmpzPzUyNzAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsWUFBWSxtQkFBTyxDQUFDLHFEQUFZO0FBQ2hDLG9CQUFvQixtQkFBTyxDQUFDLHVFQUFpQjtBQUM3QyxlQUFlLG1CQUFPLENBQUMsdUVBQW9CO0FBQzNDLGVBQWUsbUJBQU8sQ0FBQyx5REFBYTs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CLHVDQUF1QztBQUN2QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSCIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9kaXNwYXRjaFJlcXVlc3QuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcbnZhciB0cmFuc2Zvcm1EYXRhID0gcmVxdWlyZSgnLi90cmFuc2Zvcm1EYXRhJyk7XG52YXIgaXNDYW5jZWwgPSByZXF1aXJlKCcuLi9jYW5jZWwvaXNDYW5jZWwnKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoJy4uL2RlZmF1bHRzJyk7XG5cbi8qKlxuICogVGhyb3dzIGEgYENhbmNlbGAgaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAqL1xuZnVuY3Rpb24gdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpIHtcbiAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgIGNvbmZpZy5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB0aGUgY29uZmlndXJlZCBhZGFwdGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGlzcGF0Y2hSZXF1ZXN0KGNvbmZpZykge1xuICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgLy8gRW5zdXJlIGhlYWRlcnMgZXhpc3RcbiAgY29uZmlnLmhlYWRlcnMgPSBjb25maWcuaGVhZGVycyB8fCB7fTtcblxuICAvLyBUcmFuc2Zvcm0gcmVxdWVzdCBkYXRhXG4gIGNvbmZpZy5kYXRhID0gdHJhbnNmb3JtRGF0YShcbiAgICBjb25maWcuZGF0YSxcbiAgICBjb25maWcuaGVhZGVycyxcbiAgICBjb25maWcudHJhbnNmb3JtUmVxdWVzdFxuICApO1xuXG4gIC8vIEZsYXR0ZW4gaGVhZGVyc1xuICBjb25maWcuaGVhZGVycyA9IHV0aWxzLm1lcmdlKFxuICAgIGNvbmZpZy5oZWFkZXJzLmNvbW1vbiB8fCB7fSxcbiAgICBjb25maWcuaGVhZGVyc1tjb25maWcubWV0aG9kXSB8fCB7fSxcbiAgICBjb25maWcuaGVhZGVyc1xuICApO1xuXG4gIHV0aWxzLmZvckVhY2goXG4gICAgWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnLCAnY29tbW9uJ10sXG4gICAgZnVuY3Rpb24gY2xlYW5IZWFkZXJDb25maWcobWV0aG9kKSB7XG4gICAgICBkZWxldGUgY29uZmlnLmhlYWRlcnNbbWV0aG9kXTtcbiAgICB9XG4gICk7XG5cbiAgdmFyIGFkYXB0ZXIgPSBjb25maWcuYWRhcHRlciB8fCBkZWZhdWx0cy5hZGFwdGVyO1xuXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XG4gICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICByZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YShcbiAgICAgIHJlc3BvbnNlLmRhdGEsXG4gICAgICByZXNwb25zZS5oZWFkZXJzLFxuICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlXG4gICAgKTtcblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfSwgZnVuY3Rpb24gb25BZGFwdGVyUmVqZWN0aW9uKHJlYXNvbikge1xuICAgIGlmICghaXNDYW5jZWwocmVhc29uKSkge1xuICAgICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgICAgaWYgKHJlYXNvbiAmJiByZWFzb24ucmVzcG9uc2UpIHtcbiAgICAgICAgcmVhc29uLnJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKFxuICAgICAgICAgIHJlYXNvbi5yZXNwb25zZS5kYXRhLFxuICAgICAgICAgIHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzLFxuICAgICAgICAgIGNvbmZpZy50cmFuc2Zvcm1SZXNwb25zZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZWFzb24pO1xuICB9KTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZW5oYW5jZUVycm9yLmpzPzM4N2YiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2VuaGFuY2VFcnJvci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVcGRhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmZpZywgZXJyb3IgY29kZSwgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIFRoZSBlcnJvciB0byB1cGRhdGUuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGVycm9yLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVuaGFuY2VFcnJvcihlcnJvciwgY29uZmlnLCBjb2RlLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICBlcnJvci5jb25maWcgPSBjb25maWc7XG4gIGlmIChjb2RlKSB7XG4gICAgZXJyb3IuY29kZSA9IGNvZGU7XG4gIH1cblxuICBlcnJvci5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgZXJyb3IucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgZXJyb3IuaXNBeGlvc0Vycm9yID0gdHJ1ZTtcblxuICBlcnJvci50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0YW5kYXJkXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAvLyBNaWNyb3NvZnRcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgbnVtYmVyOiB0aGlzLm51bWJlcixcbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLFxuICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuICAgICAgY29sdW1uTnVtYmVyOiB0aGlzLmNvbHVtbk51bWJlcixcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgLy8gQXhpb3NcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBjb2RlOiB0aGlzLmNvZGVcbiAgICB9O1xuICB9O1xuICByZXR1cm4gZXJyb3I7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvbWVyZ2VDb25maWcuanM/NGE3YiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixZQUFZLG1CQUFPLENBQUMsbURBQVU7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsMkJBQTJCO0FBQzNCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0EiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvbWVyZ2VDb25maWcuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbi8qKlxuICogQ29uZmlnLXNwZWNpZmljIG1lcmdlLWZ1bmN0aW9uIHdoaWNoIGNyZWF0ZXMgYSBuZXcgY29uZmlnLW9iamVjdFxuICogYnkgbWVyZ2luZyB0d28gY29uZmlndXJhdGlvbiBvYmplY3RzIHRvZ2V0aGVyLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcxXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMlxuICogQHJldHVybnMge09iamVjdH0gTmV3IG9iamVjdCByZXN1bHRpbmcgZnJvbSBtZXJnaW5nIGNvbmZpZzIgdG8gY29uZmlnMVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG1lcmdlQ29uZmlnKGNvbmZpZzEsIGNvbmZpZzIpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGNvbmZpZzIgPSBjb25maWcyIHx8IHt9O1xuICB2YXIgY29uZmlnID0ge307XG5cbiAgdmFyIHZhbHVlRnJvbUNvbmZpZzJLZXlzID0gWyd1cmwnLCAnbWV0aG9kJywgJ2RhdGEnXTtcbiAgdmFyIG1lcmdlRGVlcFByb3BlcnRpZXNLZXlzID0gWydoZWFkZXJzJywgJ2F1dGgnLCAncHJveHknLCAncGFyYW1zJ107XG4gIHZhciBkZWZhdWx0VG9Db25maWcyS2V5cyA9IFtcbiAgICAnYmFzZVVSTCcsICd0cmFuc2Zvcm1SZXF1ZXN0JywgJ3RyYW5zZm9ybVJlc3BvbnNlJywgJ3BhcmFtc1NlcmlhbGl6ZXInLFxuICAgICd0aW1lb3V0JywgJ3RpbWVvdXRNZXNzYWdlJywgJ3dpdGhDcmVkZW50aWFscycsICdhZGFwdGVyJywgJ3Jlc3BvbnNlVHlwZScsICd4c3JmQ29va2llTmFtZScsXG4gICAgJ3hzcmZIZWFkZXJOYW1lJywgJ29uVXBsb2FkUHJvZ3Jlc3MnLCAnb25Eb3dubG9hZFByb2dyZXNzJywgJ2RlY29tcHJlc3MnLFxuICAgICdtYXhDb250ZW50TGVuZ3RoJywgJ21heEJvZHlMZW5ndGgnLCAnbWF4UmVkaXJlY3RzJywgJ3RyYW5zcG9ydCcsICdodHRwQWdlbnQnLFxuICAgICdodHRwc0FnZW50JywgJ2NhbmNlbFRva2VuJywgJ3NvY2tldFBhdGgnLCAncmVzcG9uc2VFbmNvZGluZydcbiAgXTtcbiAgdmFyIGRpcmVjdE1lcmdlS2V5cyA9IFsndmFsaWRhdGVTdGF0dXMnXTtcblxuICBmdW5jdGlvbiBnZXRNZXJnZWRWYWx1ZSh0YXJnZXQsIHNvdXJjZSkge1xuICAgIGlmICh1dGlscy5pc1BsYWluT2JqZWN0KHRhcmdldCkgJiYgdXRpbHMuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMubWVyZ2UodGFyZ2V0LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMubWVyZ2Uoe30sIHNvdXJjZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiBzb3VyY2Uuc2xpY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlRGVlcFByb3BlcnRpZXMocHJvcCkge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoY29uZmlnMltwcm9wXSkpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGdldE1lcmdlZFZhbHVlKGNvbmZpZzFbcHJvcF0sIGNvbmZpZzJbcHJvcF0pO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZzFbcHJvcF0pKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGNvbmZpZzFbcHJvcF0pO1xuICAgIH1cbiAgfVxuXG4gIHV0aWxzLmZvckVhY2godmFsdWVGcm9tQ29uZmlnMktleXMsIGZ1bmN0aW9uIHZhbHVlRnJvbUNvbmZpZzIocHJvcCkge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoY29uZmlnMltwcm9wXSkpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgY29uZmlnMltwcm9wXSk7XG4gICAgfVxuICB9KTtcblxuICB1dGlscy5mb3JFYWNoKG1lcmdlRGVlcFByb3BlcnRpZXNLZXlzLCBtZXJnZURlZXBQcm9wZXJ0aWVzKTtcblxuICB1dGlscy5mb3JFYWNoKGRlZmF1bHRUb0NvbmZpZzJLZXlzLCBmdW5jdGlvbiBkZWZhdWx0VG9Db25maWcyKHByb3ApIHtcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZzJbcHJvcF0pKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGNvbmZpZzJbcHJvcF0pO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZzFbcHJvcF0pKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGNvbmZpZzFbcHJvcF0pO1xuICAgIH1cbiAgfSk7XG5cbiAgdXRpbHMuZm9yRWFjaChkaXJlY3RNZXJnZUtleXMsIGZ1bmN0aW9uIG1lcmdlKHByb3ApIHtcbiAgICBpZiAocHJvcCBpbiBjb25maWcyKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBnZXRNZXJnZWRWYWx1ZShjb25maWcxW3Byb3BdLCBjb25maWcyW3Byb3BdKTtcbiAgICB9IGVsc2UgaWYgKHByb3AgaW4gY29uZmlnMSkge1xuICAgICAgY29uZmlnW3Byb3BdID0gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBjb25maWcxW3Byb3BdKTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBheGlvc0tleXMgPSB2YWx1ZUZyb21Db25maWcyS2V5c1xuICAgIC5jb25jYXQobWVyZ2VEZWVwUHJvcGVydGllc0tleXMpXG4gICAgLmNvbmNhdChkZWZhdWx0VG9Db25maWcyS2V5cylcbiAgICAuY29uY2F0KGRpcmVjdE1lcmdlS2V5cyk7XG5cbiAgdmFyIG90aGVyS2V5cyA9IE9iamVjdFxuICAgIC5rZXlzKGNvbmZpZzEpXG4gICAgLmNvbmNhdChPYmplY3Qua2V5cyhjb25maWcyKSlcbiAgICAuZmlsdGVyKGZ1bmN0aW9uIGZpbHRlckF4aW9zS2V5cyhrZXkpIHtcbiAgICAgIHJldHVybiBheGlvc0tleXMuaW5kZXhPZihrZXkpID09PSAtMTtcbiAgICB9KTtcblxuICB1dGlscy5mb3JFYWNoKG90aGVyS2V5cywgbWVyZ2VEZWVwUHJvcGVydGllcyk7XG5cbiAgcmV0dXJuIGNvbmZpZztcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvc2V0dGxlLmpzPzQ2N2YiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsa0JBQWtCLG1CQUFPLENBQUMsbUVBQWU7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL3NldHRsZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGNyZWF0ZUVycm9yID0gcmVxdWlyZSgnLi9jcmVhdGVFcnJvcicpO1xuXG4vKipcbiAqIFJlc29sdmUgb3IgcmVqZWN0IGEgUHJvbWlzZSBiYXNlZCBvbiByZXNwb25zZSBzdGF0dXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZSBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3QgQSBmdW5jdGlvbiB0aGF0IHJlamVjdHMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKSB7XG4gIHZhciB2YWxpZGF0ZVN0YXR1cyA9IHJlc3BvbnNlLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztcbiAgaWYgKCFyZXNwb25zZS5zdGF0dXMgfHwgIXZhbGlkYXRlU3RhdHVzIHx8IHZhbGlkYXRlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgfSBlbHNlIHtcbiAgICByZWplY3QoY3JlYXRlRXJyb3IoXG4gICAgICAnUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAnICsgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgcmVzcG9uc2UuY29uZmlnLFxuICAgICAgbnVsbCxcbiAgICAgIHJlc3BvbnNlLnJlcXVlc3QsXG4gICAgICByZXNwb25zZVxuICAgICkpO1xuICB9XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\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\");\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 /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn(data, headers);\n });\n\n return data;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvdHJhbnNmb3JtRGF0YS5qcz9jNDAxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxxREFBWTs7QUFFaEM7QUFDQTtBQUNBO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsTUFBTTtBQUNqQixXQUFXLGVBQWU7QUFDMUIsYUFBYSxFQUFFO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS90cmFuc2Zvcm1EYXRhLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbi8qKlxuICogVHJhbnNmb3JtIHRoZSBkYXRhIGZvciBhIHJlcXVlc3Qgb3IgYSByZXNwb25zZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gZGF0YSBUaGUgZGF0YSB0byBiZSB0cmFuc2Zvcm1lZFxuICogQHBhcmFtIHtBcnJheX0gaGVhZGVycyBUaGUgaGVhZGVycyBmb3IgdGhlIHJlcXVlc3Qgb3IgcmVzcG9uc2VcbiAqIEBwYXJhbSB7QXJyYXl8RnVuY3Rpb259IGZucyBBIHNpbmdsZSBmdW5jdGlvbiBvciBBcnJheSBvZiBmdW5jdGlvbnNcbiAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIGRhdGFcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0cmFuc2Zvcm1EYXRhKGRhdGEsIGhlYWRlcnMsIGZucykge1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgdXRpbHMuZm9yRWFjaChmbnMsIGZ1bmN0aW9uIHRyYW5zZm9ybShmbikge1xuICAgIGRhdGEgPSBmbihkYXRhLCBoZWFkZXJzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGRhdGE7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\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 */ \"./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\");\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\nvar defaults = {\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Accept');\n normalizeHeaderName(headers, 'Content-Type');\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)) {\n setContentTypeIfUnset(headers, 'application/json;charset=utf-8');\n return JSON.stringify(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n /*eslint no-param-reassign:0*/\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n } catch (e) { /* Ignore */ }\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzLmpzPzI0NDQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxrREFBUztBQUM3QiwwQkFBMEIsbUJBQU8sQ0FBQyw4RkFBK0I7O0FBRWpFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxtQkFBTyxDQUFDLGdFQUFnQjtBQUN0QyxHQUFHLGlCQUFpQixPQUFPLG1EQUFtRCxPQUFPO0FBQ3JGO0FBQ0EsY0FBYyxtQkFBTyxDQUFDLGlFQUFpQjtBQUN2QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RTtBQUN4RTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxZQUFZO0FBQ25CO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLENBQUM7O0FBRUQiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgbm9ybWFsaXplSGVhZGVyTmFtZSA9IHJlcXVpcmUoJy4vaGVscGVycy9ub3JtYWxpemVIZWFkZXJOYW1lJyk7XG5cbnZhciBERUZBVUxUX0NPTlRFTlRfVFlQRSA9IHtcbiAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG59O1xuXG5mdW5jdGlvbiBzZXRDb250ZW50VHlwZUlmVW5zZXQoaGVhZGVycywgdmFsdWUpIHtcbiAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChoZWFkZXJzKSAmJiB1dGlscy5pc1VuZGVmaW5lZChoZWFkZXJzWydDb250ZW50LVR5cGUnXSkpIHtcbiAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRBZGFwdGVyKCkge1xuICB2YXIgYWRhcHRlcjtcbiAgaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBGb3IgYnJvd3NlcnMgdXNlIFhIUiBhZGFwdGVyXG4gICAgYWRhcHRlciA9IHJlcXVpcmUoJy4vYWRhcHRlcnMveGhyJyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nKSB7XG4gICAgLy8gRm9yIG5vZGUgdXNlIEhUVFAgYWRhcHRlclxuICAgIGFkYXB0ZXIgPSByZXF1aXJlKCcuL2FkYXB0ZXJzL2h0dHAnKTtcbiAgfVxuICByZXR1cm4gYWRhcHRlcjtcbn1cblxudmFyIGRlZmF1bHRzID0ge1xuICBhZGFwdGVyOiBnZXREZWZhdWx0QWRhcHRlcigpLFxuXG4gIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXF1ZXN0KGRhdGEsIGhlYWRlcnMpIHtcbiAgICBub3JtYWxpemVIZWFkZXJOYW1lKGhlYWRlcnMsICdBY2NlcHQnKTtcbiAgICBub3JtYWxpemVIZWFkZXJOYW1lKGhlYWRlcnMsICdDb250ZW50LVR5cGUnKTtcbiAgICBpZiAodXRpbHMuaXNGb3JtRGF0YShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNBcnJheUJ1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzU3RyZWFtKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0ZpbGUoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQmxvYihkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyVmlldyhkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGEuYnVmZmVyO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMoZGF0YSkpIHtcbiAgICAgIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgnKTtcbiAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc09iamVjdChkYXRhKSkge1xuICAgICAgc2V0Q29udGVudFR5cGVJZlVuc2V0KGhlYWRlcnMsICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgnKTtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIHRyYW5zZm9ybVJlc3BvbnNlOiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVzcG9uc2UoZGF0YSkge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZSkgeyAvKiBJZ25vcmUgKi8gfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgLyoqXG4gICAqIEEgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gYWJvcnQgYSByZXF1ZXN0LiBJZiBzZXQgdG8gMCAoZGVmYXVsdCkgYVxuICAgKiB0aW1lb3V0IGlzIG5vdCBjcmVhdGVkLlxuICAgKi9cbiAgdGltZW91dDogMCxcblxuICB4c3JmQ29va2llTmFtZTogJ1hTUkYtVE9LRU4nLFxuICB4c3JmSGVhZGVyTmFtZTogJ1gtWFNSRi1UT0tFTicsXG5cbiAgbWF4Q29udGVudExlbmd0aDogLTEsXG4gIG1heEJvZHlMZW5ndGg6IC0xLFxuXG4gIHZhbGlkYXRlU3RhdHVzOiBmdW5jdGlvbiB2YWxpZGF0ZVN0YXR1cyhzdGF0dXMpIHtcbiAgICByZXR1cm4gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDA7XG4gIH1cbn07XG5cbmRlZmF1bHRzLmhlYWRlcnMgPSB7XG4gIGNvbW1vbjoge1xuICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJ1xuICB9XG59O1xuXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2ROb0RhdGEobWV0aG9kKSB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHt9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHV0aWxzLm1lcmdlKERFRkFVTFRfQ09OVEVOVF9UWVBFKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmF1bHRzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qcz8xZDJiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixpQkFBaUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9iaW5kLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJncyk7XG4gIH07XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnVpbGRVUkwuanM/MzBiNSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixZQUFZLG1CQUFPLENBQUMscURBQVk7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9idWlsZFVSTC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5mdW5jdGlvbiBlbmNvZGUodmFsKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKS5cbiAgICByZXBsYWNlKC8lM0EvZ2ksICc6JykuXG4gICAgcmVwbGFjZSgvJTI0L2csICckJykuXG4gICAgcmVwbGFjZSgvJTJDL2dpLCAnLCcpLlxuICAgIHJlcGxhY2UoLyUyMC9nLCAnKycpLlxuICAgIHJlcGxhY2UoLyU1Qi9naSwgJ1snKS5cbiAgICByZXBsYWNlKC8lNUQvZ2ksICddJyk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBVUkwgYnkgYXBwZW5kaW5nIHBhcmFtcyB0byB0aGUgZW5kXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgYmFzZSBvZiB0aGUgdXJsIChlLmcuLCBodHRwOi8vd3d3Lmdvb2dsZS5jb20pXG4gKiBAcGFyYW0ge29iamVjdH0gW3BhcmFtc10gVGhlIHBhcmFtcyB0byBiZSBhcHBlbmRlZFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBidWlsZFVSTCh1cmwsIHBhcmFtcywgcGFyYW1zU2VyaWFsaXplcikge1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgaWYgKCFwYXJhbXMpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgdmFyIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIGlmIChwYXJhbXNTZXJpYWxpemVyKSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcmFtc1NlcmlhbGl6ZXIocGFyYW1zKTtcbiAgfSBlbHNlIGlmICh1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMpKSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcmFtcy50b1N0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIHZhciBwYXJ0cyA9IFtdO1xuXG4gICAgdXRpbHMuZm9yRWFjaChwYXJhbXMsIGZ1bmN0aW9uIHNlcmlhbGl6ZSh2YWwsIGtleSkge1xuICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh1dGlscy5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAga2V5ID0ga2V5ICsgJ1tdJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbCA9IFt2YWxdO1xuICAgICAgfVxuXG4gICAgICB1dGlscy5mb3JFYWNoKHZhbCwgZnVuY3Rpb24gcGFyc2VWYWx1ZSh2KSB7XG4gICAgICAgIGlmICh1dGlscy5pc0RhdGUodikpIHtcbiAgICAgICAgICB2ID0gdi50b0lTT1N0cmluZygpO1xuICAgICAgICB9IGVsc2UgaWYgKHV0aWxzLmlzT2JqZWN0KHYpKSB7XG4gICAgICAgICAgdiA9IEpTT04uc3RyaW5naWZ5KHYpO1xuICAgICAgICB9XG4gICAgICAgIHBhcnRzLnB1c2goZW5jb2RlKGtleSkgKyAnPScgKyBlbmNvZGUodikpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJpYWxpemVkUGFyYW1zID0gcGFydHMuam9pbignJicpO1xuICB9XG5cbiAgaWYgKHNlcmlhbGl6ZWRQYXJhbXMpIHtcbiAgICB2YXIgaGFzaG1hcmtJbmRleCA9IHVybC5pbmRleE9mKCcjJyk7XG4gICAgaWYgKGhhc2htYXJrSW5kZXggIT09IC0xKSB7XG4gICAgICB1cmwgPSB1cmwuc2xpY2UoMCwgaGFzaG1hcmtJbmRleCk7XG4gICAgfVxuXG4gICAgdXJsICs9ICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyBzZXJpYWxpemVkUGFyYW1zO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tYmluZVVSTHMuanM/ZTY4MyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tYmluZVVSTHMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBzcGVjaWZpZWQgVVJMc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlVVJMIFRoZSByZWxhdGl2ZSBVUkxcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBVUkxcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZWxhdGl2ZVVSTCkge1xuICByZXR1cm4gcmVsYXRpdmVVUkxcbiAgICA/IGJhc2VVUkwucmVwbGFjZSgvXFwvKyQvLCAnJykgKyAnLycgKyByZWxhdGl2ZVVSTC5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgIDogYmFzZVVSTDtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29va2llcy5qcz83YWFjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxxREFBWTs7QUFFaEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDBDQUEwQztBQUMxQyxTQUFTOztBQUVUO0FBQ0EsNERBQTRELHdCQUF3QjtBQUNwRjtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQywrQkFBK0IsYUFBYSxFQUFFO0FBQzlDO0FBQ0E7QUFDQSxLQUFLO0FBQ0wiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29va2llcy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgdXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSA/XG5cbiAgLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIHN1cHBvcnQgZG9jdW1lbnQuY29va2llXG4gICAgKGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdyaXRlOiBmdW5jdGlvbiB3cml0ZShuYW1lLCB2YWx1ZSwgZXhwaXJlcywgcGF0aCwgZG9tYWluLCBzZWN1cmUpIHtcbiAgICAgICAgICB2YXIgY29va2llID0gW107XG4gICAgICAgICAgY29va2llLnB1c2gobmFtZSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpO1xuXG4gICAgICAgICAgaWYgKHV0aWxzLmlzTnVtYmVyKGV4cGlyZXMpKSB7XG4gICAgICAgICAgICBjb29raWUucHVzaCgnZXhwaXJlcz0nICsgbmV3IERhdGUoZXhwaXJlcykudG9HTVRTdHJpbmcoKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHV0aWxzLmlzU3RyaW5nKHBhdGgpKSB7XG4gICAgICAgICAgICBjb29raWUucHVzaCgncGF0aD0nICsgcGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHV0aWxzLmlzU3RyaW5nKGRvbWFpbikpIHtcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdkb21haW49JyArIGRvbWFpbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlY3VyZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29va2llLnB1c2goJ3NlY3VyZScpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZS5qb2luKCc7ICcpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlYWQ6IGZ1bmN0aW9uIHJlYWQobmFtZSkge1xuICAgICAgICAgIHZhciBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoXnw7XFxcXHMqKSgnICsgbmFtZSArICcpPShbXjtdKiknKSk7XG4gICAgICAgICAgcmV0dXJuIChtYXRjaCA/IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFszXSkgOiBudWxsKTtcbiAgICAgICAgfSxcblxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShuYW1lKSB7XG4gICAgICAgICAgdGhpcy53cml0ZShuYW1lLCAnJywgRGF0ZS5ub3coKSAtIDg2NDAwMDAwKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KSgpIDpcblxuICAvLyBOb24gc3RhbmRhcmQgYnJvd3NlciBlbnYgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gICAgKGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdyaXRlOiBmdW5jdGlvbiB3cml0ZSgpIHt9LFxuICAgICAgICByZWFkOiBmdW5jdGlvbiByZWFkKCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgICAgfTtcbiAgICB9KSgpXG4pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcz9kOTI1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQWJzb2x1dGVVUkwodXJsKSB7XG4gIC8vIEEgVVJMIGlzIGNvbnNpZGVyZWQgYWJzb2x1dGUgaWYgaXQgYmVnaW5zIHdpdGggXCI8c2NoZW1lPjovL1wiIG9yIFwiLy9cIiAocHJvdG9jb2wtcmVsYXRpdmUgVVJMKS5cbiAgLy8gUkZDIDM5ODYgZGVmaW5lcyBzY2hlbWUgbmFtZSBhcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYmVnaW5uaW5nIHdpdGggYSBsZXR0ZXIgYW5kIGZvbGxvd2VkXG4gIC8vIGJ5IGFueSBjb21iaW5hdGlvbiBvZiBsZXR0ZXJzLCBkaWdpdHMsIHBsdXMsIHBlcmlvZCwgb3IgaHlwaGVuLlxuICByZXR1cm4gL14oW2Etel1bYS16XFxkXFwrXFwtXFwuXSo6KT9cXC9cXC8vaS50ZXN0KHVybCk7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBeGlvc0Vycm9yLmpzPzVmMDIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQXhpb3NFcnJvci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zXG4gKlxuICogQHBhcmFtIHsqfSBwYXlsb2FkIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3MsIG90aGVyd2lzZSBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXhpb3NFcnJvcihwYXlsb2FkKSB7XG4gIHJldHVybiAodHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnKSAmJiAocGF5bG9hZC5pc0F4aW9zRXJyb3IgPT09IHRydWUpO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luLmpzPzM5MzQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsWUFBWSxtQkFBTyxDQUFDLHFEQUFZOztBQUVoQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLE9BQU87QUFDckIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYyxPQUFPO0FBQ3JCLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc1VSTFNhbWVPcmlnaW4uanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoXG4gIHV0aWxzLmlzU3RhbmRhcmRCcm93c2VyRW52KCkgP1xuXG4gIC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBoYXZlIGZ1bGwgc3VwcG9ydCBvZiB0aGUgQVBJcyBuZWVkZWQgdG8gdGVzdFxuICAvLyB3aGV0aGVyIHRoZSByZXF1ZXN0IFVSTCBpcyBvZiB0aGUgc2FtZSBvcmlnaW4gYXMgY3VycmVudCBsb2NhdGlvbi5cbiAgICAoZnVuY3Rpb24gc3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgdmFyIG1zaWUgPSAvKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgICAgdmFyIHVybFBhcnNpbmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgdmFyIG9yaWdpblVSTDtcblxuICAgICAgLyoqXG4gICAgKiBQYXJzZSBhIFVSTCB0byBkaXNjb3ZlciBpdCdzIGNvbXBvbmVudHNcbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcGFyc2VkXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICovXG4gICAgICBmdW5jdGlvbiByZXNvbHZlVVJMKHVybCkge1xuICAgICAgICB2YXIgaHJlZiA9IHVybDtcblxuICAgICAgICBpZiAobXNpZSkge1xuICAgICAgICAvLyBJRSBuZWVkcyBhdHRyaWJ1dGUgc2V0IHR3aWNlIHRvIG5vcm1hbGl6ZSBwcm9wZXJ0aWVzXG4gICAgICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG4gICAgICAgICAgaHJlZiA9IHVybFBhcnNpbmdOb2RlLmhyZWY7XG4gICAgICAgIH1cblxuICAgICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcblxuICAgICAgICAvLyB1cmxQYXJzaW5nTm9kZSBwcm92aWRlcyB0aGUgVXJsVXRpbHMgaW50ZXJmYWNlIC0gaHR0cDovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHV0aWxzXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaHJlZjogdXJsUGFyc2luZ05vZGUuaHJlZixcbiAgICAgICAgICBwcm90b2NvbDogdXJsUGFyc2luZ05vZGUucHJvdG9jb2wgPyB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKSA6ICcnLFxuICAgICAgICAgIGhvc3Q6IHVybFBhcnNpbmdOb2RlLmhvc3QsXG4gICAgICAgICAgc2VhcmNoOiB1cmxQYXJzaW5nTm9kZS5zZWFyY2ggPyB1cmxQYXJzaW5nTm9kZS5zZWFyY2gucmVwbGFjZSgvXlxcPy8sICcnKSA6ICcnLFxuICAgICAgICAgIGhhc2g6IHVybFBhcnNpbmdOb2RlLmhhc2ggPyB1cmxQYXJzaW5nTm9kZS5oYXNoLnJlcGxhY2UoL14jLywgJycpIDogJycsXG4gICAgICAgICAgaG9zdG5hbWU6IHVybFBhcnNpbmdOb2RlLmhvc3RuYW1lLFxuICAgICAgICAgIHBvcnQ6IHVybFBhcnNpbmdOb2RlLnBvcnQsXG4gICAgICAgICAgcGF0aG5hbWU6ICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJykgP1xuICAgICAgICAgICAgdXJsUGFyc2luZ05vZGUucGF0aG5hbWUgOlxuICAgICAgICAgICAgJy8nICsgdXJsUGFyc2luZ05vZGUucGF0aG5hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgb3JpZ2luVVJMID0gcmVzb2x2ZVVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG5cbiAgICAgIC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4gYXMgdGhlIGN1cnJlbnQgbG9jYXRpb25cbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdFVSTCBUaGUgVVJMIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luLCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbihyZXF1ZXN0VVJMKSB7XG4gICAgICAgIHZhciBwYXJzZWQgPSAodXRpbHMuaXNTdHJpbmcocmVxdWVzdFVSTCkpID8gcmVzb2x2ZVVSTChyZXF1ZXN0VVJMKSA6IHJlcXVlc3RVUkw7XG4gICAgICAgIHJldHVybiAocGFyc2VkLnByb3RvY29sID09PSBvcmlnaW5VUkwucHJvdG9jb2wgJiZcbiAgICAgICAgICAgIHBhcnNlZC5ob3N0ID09PSBvcmlnaW5VUkwuaG9zdCk7XG4gICAgICB9O1xuICAgIH0pKCkgOlxuXG4gIC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudnMgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gICAgKGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpc1VSTFNhbWVPcmlnaW4oKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfTtcbiAgICB9KSgpXG4pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvbm9ybWFsaXplSGVhZGVyTmFtZS5qcz9jOGFmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxtREFBVTs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL25vcm1hbGl6ZUhlYWRlck5hbWUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCBub3JtYWxpemVkTmFtZSkge1xuICB1dGlscy5mb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uIHByb2Nlc3NIZWFkZXIodmFsdWUsIG5hbWUpIHtcbiAgICBpZiAobmFtZSAhPT0gbm9ybWFsaXplZE5hbWUgJiYgbmFtZS50b1VwcGVyQ2FzZSgpID09PSBub3JtYWxpemVkTmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICBoZWFkZXJzW25vcm1hbGl6ZWROYW1lXSA9IHZhbHVlO1xuICAgICAgZGVsZXRlIGhlYWRlcnNbbmFtZV07XG4gICAgfVxuICB9KTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcGFyc2VIZWFkZXJzLmpzP2MzNDUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsWUFBWSxtQkFBTyxDQUFDLHFEQUFZOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLGVBQWU7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcGFyc2VIZWFkZXJzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbi8vIEhlYWRlcnMgd2hvc2UgZHVwbGljYXRlcyBhcmUgaWdub3JlZCBieSBub2RlXG4vLyBjLmYuIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvaHR0cC5odG1sI2h0dHBfbWVzc2FnZV9oZWFkZXJzXG52YXIgaWdub3JlRHVwbGljYXRlT2YgPSBbXG4gICdhZ2UnLCAnYXV0aG9yaXphdGlvbicsICdjb250ZW50LWxlbmd0aCcsICdjb250ZW50LXR5cGUnLCAnZXRhZycsXG4gICdleHBpcmVzJywgJ2Zyb20nLCAnaG9zdCcsICdpZi1tb2RpZmllZC1zaW5jZScsICdpZi11bm1vZGlmaWVkLXNpbmNlJyxcbiAgJ2xhc3QtbW9kaWZpZWQnLCAnbG9jYXRpb24nLCAnbWF4LWZvcndhcmRzJywgJ3Byb3h5LWF1dGhvcml6YXRpb24nLFxuICAncmVmZXJlcicsICdyZXRyeS1hZnRlcicsICd1c2VyLWFnZW50J1xuXTtcblxuLyoqXG4gKiBQYXJzZSBoZWFkZXJzIGludG8gYW4gb2JqZWN0XG4gKlxuICogYGBgXG4gKiBEYXRlOiBXZWQsIDI3IEF1ZyAyMDE0IDA4OjU4OjQ5IEdNVFxuICogQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXG4gKiBDb25uZWN0aW9uOiBrZWVwLWFsaXZlXG4gKiBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhlYWRlcnMgSGVhZGVycyBuZWVkaW5nIHRvIGJlIHBhcnNlZFxuICogQHJldHVybnMge09iamVjdH0gSGVhZGVycyBwYXJzZWQgaW50byBhbiBvYmplY3RcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYXJzZUhlYWRlcnMoaGVhZGVycykge1xuICB2YXIgcGFyc2VkID0ge307XG4gIHZhciBrZXk7XG4gIHZhciB2YWw7XG4gIHZhciBpO1xuXG4gIGlmICghaGVhZGVycykgeyByZXR1cm4gcGFyc2VkOyB9XG5cbiAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLnNwbGl0KCdcXG4nKSwgZnVuY3Rpb24gcGFyc2VyKGxpbmUpIHtcbiAgICBpID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAga2V5ID0gdXRpbHMudHJpbShsaW5lLnN1YnN0cigwLCBpKSkudG9Mb3dlckNhc2UoKTtcbiAgICB2YWwgPSB1dGlscy50cmltKGxpbmUuc3Vic3RyKGkgKyAxKSk7XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICBpZiAocGFyc2VkW2tleV0gJiYgaWdub3JlRHVwbGljYXRlT2YuaW5kZXhPZihrZXkpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICAgIHBhcnNlZFtrZXldID0gKHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gOiBbXSkuY29uY2F0KFt2YWxdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZFtrZXldID0gcGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSArICcsICcgKyB2YWwgOiB2YWw7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcGFyc2VkO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3ByZWFkLmpzPzBkZjYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3ByZWFkLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgaW52b2tpbmcgYSBmdW5jdGlvbiBhbmQgZXhwYW5kaW5nIGFuIGFycmF5IGZvciBhcmd1bWVudHMuXG4gKlxuICogQ29tbW9uIHVzZSBjYXNlIHdvdWxkIGJlIHRvIHVzZSBgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5YC5cbiAqXG4gKiAgYGBganNcbiAqICBmdW5jdGlvbiBmKHgsIHksIHopIHt9XG4gKiAgdmFyIGFyZ3MgPSBbMSwgMiwgM107XG4gKiAgZi5hcHBseShudWxsLCBhcmdzKTtcbiAqICBgYGBcbiAqXG4gKiBXaXRoIGBzcHJlYWRgIHRoaXMgZXhhbXBsZSBjYW4gYmUgcmUtd3JpdHRlbi5cbiAqXG4gKiAgYGBganNcbiAqICBzcHJlYWQoZnVuY3Rpb24oeCwgeSwgeikge30pKFsxLCAyLCAzXSk7XG4gKiAgYGBgXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzcHJlYWQoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoYXJyKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFycik7XG4gIH07XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/axios/lib/helpers/spread.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/*global toString:true*/\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.replace(/^\\s*/, '').replace(/\\s*$/, '');\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3V0aWxzLmpzP2M1MzIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsV0FBVyxtQkFBTyxDQUFDLGdFQUFnQjs7QUFFbkM7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1DQUFtQyxPQUFPO0FBQzFDO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixTQUFTLEdBQUcsU0FBUztBQUM1QywyQkFBMkI7QUFDM0I7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLDRCQUE0QjtBQUM1QixLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBLHVDQUF1QyxPQUFPO0FBQzlDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9heGlvcy9saWIvdXRpbHMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnLi9oZWxwZXJzL2JpbmQnKTtcblxuLypnbG9iYWwgdG9TdHJpbmc6dHJ1ZSovXG5cbi8vIHV0aWxzIGlzIGEgbGlicmFyeSBvZiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgbm9uLXNwZWNpZmljIHRvIGF4aW9zXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXkodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCdWZmZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQnVmZmVyKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwpICYmIHZhbC5jb25zdHJ1Y3RvciAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsLmNvbnN0cnVjdG9yKVxuICAgICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKHZhbCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGb3JtRGF0YVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGb3JtRGF0YSh2YWwpIHtcbiAgcmV0dXJuICh0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnKSAmJiAodmFsIGluc3RhbmNlb2YgRm9ybURhdGEpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJWaWV3KHZhbCkge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpICYmIChBcnJheUJ1ZmZlci5pc1ZpZXcpKSB7XG4gICAgcmVzdWx0ID0gQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gKHZhbCkgJiYgKHZhbC5idWZmZXIpICYmICh2YWwuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJpbmdcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmluZywgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBOdW1iZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIE51bWJlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTnVtYmVyKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcic7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWwpIHtcbiAgaWYgKHRvU3RyaW5nLmNhbGwodmFsKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbCk7XG4gIHJldHVybiBwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRGF0ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRGF0ZSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRmlsZSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRmlsZV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQmxvYiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQmxvYih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQmxvYl0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZ1bmN0aW9uLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmVhbVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyZWFtLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJlYW0odmFsKSB7XG4gIHJldHVybiBpc09iamVjdCh2YWwpICYmIGlzRnVuY3Rpb24odmFsLnBpcGUpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVVJMU2VhcmNoUGFyYW1zKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zO1xufVxuXG4vKipcbiAqIFRyaW0gZXhjZXNzIHdoaXRlc3BhY2Ugb2ZmIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIFN0cmluZyB0byB0cmltXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgU3RyaW5nIGZyZWVkIG9mIGV4Y2VzcyB3aGl0ZXNwYWNlXG4gKi9cbmZ1bmN0aW9uIHRyaW0oc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyovLCAnJykucmVwbGFjZSgvXFxzKiQvLCAnJyk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50XG4gKlxuICogVGhpcyBhbGxvd3MgYXhpb3MgdG8gcnVuIGluIGEgd2ViIHdvcmtlciwgYW5kIHJlYWN0LW5hdGl2ZS5cbiAqIEJvdGggZW52aXJvbm1lbnRzIHN1cHBvcnQgWE1MSHR0cFJlcXVlc3QsIGJ1dCBub3QgZnVsbHkgc3RhbmRhcmQgZ2xvYmFscy5cbiAqXG4gKiB3ZWIgd29ya2VyczpcbiAqICB0eXBlb2Ygd2luZG93IC0+IHVuZGVmaW5lZFxuICogIHR5cGVvZiBkb2N1bWVudCAtPiB1bmRlZmluZWRcbiAqXG4gKiByZWFjdC1uYXRpdmU6XG4gKiAgbmF2aWdhdG9yLnByb2R1Y3QgLT4gJ1JlYWN0TmF0aXZlJ1xuICogbmF0aXZlc2NyaXB0XG4gKiAgbmF2aWdhdG9yLnByb2R1Y3QgLT4gJ05hdGl2ZVNjcmlwdCcgb3IgJ05TJ1xuICovXG5mdW5jdGlvbiBpc1N0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIChuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ1JlYWN0TmF0aXZlJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5wcm9kdWN0ID09PSAnTmF0aXZlU2NyaXB0JyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5wcm9kdWN0ID09PSAnTlMnKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gKFxuICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ1xuICApO1xufVxuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBBcnJheSBvciBhbiBPYmplY3QgaW52b2tpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmIGBvYmpgIGlzIGFuIEFycmF5IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwgaW5kZXgsIGFuZCBjb21wbGV0ZSBhcnJheSBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmICdvYmonIGlzIGFuIE9iamVjdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGtleSwgYW5kIGNvbXBsZXRlIG9iamVjdCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBmb3IgZWFjaCBpdGVtXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBmbikge1xuICAvLyBEb24ndCBib3RoZXIgaWYgbm8gdmFsdWUgcHJvdmlkZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEZvcmNlIGFuIGFycmF5IGlmIG5vdCBhbHJlYWR5IHNvbWV0aGluZyBpdGVyYWJsZVxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICBvYmogPSBbb2JqXTtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgYXJyYXkgdmFsdWVzXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtpXSwgaSwgb2JqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIG9iamVjdCBrZXlzXG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgZm4uY2FsbChudWxsLCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFjY2VwdHMgdmFyYXJncyBleHBlY3RpbmcgZWFjaCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3QsIHRoZW5cbiAqIGltbXV0YWJseSBtZXJnZXMgdGhlIHByb3BlcnRpZXMgb2YgZWFjaCBvYmplY3QgYW5kIHJldHVybnMgcmVzdWx0LlxuICpcbiAqIFdoZW4gbXVsdGlwbGUgb2JqZWN0cyBjb250YWluIHRoZSBzYW1lIGtleSB0aGUgbGF0ZXIgb2JqZWN0IGluXG4gKiB0aGUgYXJndW1lbnRzIGxpc3Qgd2lsbCB0YWtlIHByZWNlZGVuY2UuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogdmFyIHJlc3VsdCA9IG1lcmdlKHtmb286IDEyM30sIHtmb286IDQ1Nn0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LmZvbyk7IC8vIG91dHB1dHMgNDU2XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMSBPYmplY3QgdG8gbWVyZ2VcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlc3VsdCBvZiBhbGwgbWVyZ2UgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBtZXJnZSgvKiBvYmoxLCBvYmoyLCBvYmozLCAuLi4gKi8pIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmdW5jdGlvbiBhc3NpZ25WYWx1ZSh2YWwsIGtleSkge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHJlc3VsdFtrZXldKSAmJiBpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2UocmVzdWx0W2tleV0sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2Uoe30sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsLnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGZvckVhY2goYXJndW1lbnRzW2ldLCBhc3NpZ25WYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFeHRlbmRzIG9iamVjdCBhIGJ5IG11dGFibHkgYWRkaW5nIHRvIGl0IHRoZSBwcm9wZXJ0aWVzIG9mIG9iamVjdCBiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBiIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb21cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIFRoZSBvYmplY3QgdG8gYmluZCBmdW5jdGlvbiB0b1xuICogQHJldHVybiB7T2JqZWN0fSBUaGUgcmVzdWx0aW5nIHZhbHVlIG9mIG9iamVjdCBhXG4gKi9cbmZ1bmN0aW9uIGV4dGVuZChhLCBiLCB0aGlzQXJnKSB7XG4gIGZvckVhY2goYiwgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAodGhpc0FyZyAmJiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhW2tleV0gPSBiaW5kKHZhbCwgdGhpc0FyZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFba2V5XSA9IHZhbDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gYTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYnl0ZSBvcmRlciBtYXJrZXIuIFRoaXMgY2F0Y2hlcyBFRiBCQiBCRiAodGhlIFVURi04IEJPTSlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCB3aXRoIEJPTVxuICogQHJldHVybiB7c3RyaW5nfSBjb250ZW50IHZhbHVlIHdpdGhvdXQgQk9NXG4gKi9cbmZ1bmN0aW9uIHN0cmlwQk9NKGNvbnRlbnQpIHtcbiAgaWYgKGNvbnRlbnQuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGKSB7XG4gICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMSk7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0FycmF5OiBpc0FycmF5LFxuICBpc0FycmF5QnVmZmVyOiBpc0FycmF5QnVmZmVyLFxuICBpc0J1ZmZlcjogaXNCdWZmZXIsXG4gIGlzRm9ybURhdGE6IGlzRm9ybURhdGEsXG4gIGlzQXJyYXlCdWZmZXJWaWV3OiBpc0FycmF5QnVmZmVyVmlldyxcbiAgaXNTdHJpbmc6IGlzU3RyaW5nLFxuICBpc051bWJlcjogaXNOdW1iZXIsXG4gIGlzT2JqZWN0OiBpc09iamVjdCxcbiAgaXNQbGFpbk9iamVjdDogaXNQbGFpbk9iamVjdCxcbiAgaXNVbmRlZmluZWQ6IGlzVW5kZWZpbmVkLFxuICBpc0RhdGU6IGlzRGF0ZSxcbiAgaXNGaWxlOiBpc0ZpbGUsXG4gIGlzQmxvYjogaXNCbG9iLFxuICBpc0Z1bmN0aW9uOiBpc0Z1bmN0aW9uLFxuICBpc1N0cmVhbTogaXNTdHJlYW0sXG4gIGlzVVJMU2VhcmNoUGFyYW1zOiBpc1VSTFNlYXJjaFBhcmFtcyxcbiAgaXNTdGFuZGFyZEJyb3dzZXJFbnY6IGlzU3RhbmRhcmRCcm93c2VyRW52LFxuICBmb3JFYWNoOiBmb3JFYWNoLFxuICBtZXJnZTogbWVyZ2UsXG4gIGV4dGVuZDogZXh0ZW5kLFxuICB0cmltOiB0cmltLFxuICBzdHJpcEJPTTogc3RyaXBCT01cbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\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\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/*!\r\n * AdminLTE v3.1.0-rc (https://adminlte.io)\r\n * Copyright 2014-2020 Colorlib <https://colorlib.com>\r\n * Licensed under MIT (https://github.com/ColorlibHQ/AdminLTE/blob/master/LICENSE)\r\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\n var $__default = /*#__PURE__*/_interopDefaultLegacy($);\n /**\r\n * --------------------------------------------\r\n * AdminLTE CardRefresh.js\r\n * License MIT\r\n * --------------------------------------------\r\n */\n\n /**\r\n * Constants\r\n * ====================================================\r\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\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\n if (element.hasClass(CLASS_NAME_CARD)) {\n this._parent = element;\n }\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\n var _proto = CardRefresh.prototype;\n\n _proto.load = function load() {\n var _this = this;\n\n this._addOverlay();\n\n this._settings.onLoadStart.call($__default['default'](this));\n\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\n _this._parent.find(_this._settings.content).html(response);\n }\n\n _this._settings.onLoadDone.call($__default['default'](_this), response);\n\n _this._removeOverlay();\n }, this._settings.responseType !== '' && this._settings.responseType);\n $__default['default'](this._element).trigger($__default['default'].Event(EVENT_LOADED));\n };\n\n _proto._addOverlay = function _addOverlay() {\n this._parent.append(this._overlay);\n\n $__default['default'](this._element).trigger($__default['default'].Event(EVENT_OVERLAY_ADDED));\n };\n\n _proto._removeOverlay = function _removeOverlay() {\n this._parent.find(this._overlay).remove();\n\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\n $__default['default'](this).find(this._settings.trigger).on('click', function () {\n _this2.load();\n });\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\n var _options = $__default['default'].extend({}, Default, $__default['default'](this).data());\n\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\n if (typeof config === 'string' && config.match(/load/)) {\n data[config]();\n } else {\n data._init($__default['default'](this));\n }\n };\n\n return CardRefresh;\n }();\n /**\r\n * Data API\r\n * ====================================================\r\n */\n\n\n $__default['default'](document).on('click', SELECTOR_DATA_REFRESH, function (event) {\n if (event) {\n event.preventDefault();\n }\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 /**\r\n * jQuery API\r\n * ====================================================\r\n */\n\n $__default['default'].fn[NAME] = CardRefresh._jQueryInterface;\n $__default['default'].fn[NAME].Constructor = CardRefresh;\n\n $__default['default'].fn[NAME].noConflict = function () {\n $__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;\n return CardRefresh._jQueryInterface;\n };\n /**\r\n * --------------------------------------------\r\n * AdminLTE CardWidget.js\r\n * License MIT\r\n * --------------------------------------------\r\n */\n\n /**\r\n * Constants\r\n * ====================================================\r\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\n var CardWidget = /*#__PURE__*/function () {\n function CardWidget(element, settings) {\n this._element = element;\n this._parent = element.parents(SELECTOR_CARD$1).first();\n\n if (element.hasClass(CLASS_NAME_CARD$1)) {\n this._parent = element;\n }\n\n this._settings = $__default['default'].extend({}, Default$1, settings);\n }\n\n var _proto = CardWidget.prototype;\n\n _proto.collapse = function collapse() {\n var _this = this;\n\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\n this._parent.find(\"> \" + SELECTOR_CARD_HEADER + \" \" + this._settings.collapseTrigger + \" .\" + this._settings.collapseIcon).addClass(this._settings.expandIcon).removeClass(this._settings.collapseIcon);\n\n this._element.trigger($__default['default'].Event(EVENT_COLLAPSED), this._parent);\n };\n\n _proto.expand = function expand() {\n var _this2 = this;\n\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\n this._parent.find(\"> \" + SELECTOR_CARD_HEADER + \" \" + this._settings.collapseTrigger + \" .\" + this._settings.expandIcon).addClass(this._settings.collapseIcon).removeClass(this._settings.expandIcon);\n\n this._element.trigger($__default['default'].Event(EVENT_EXPANDED), this._parent);\n };\n\n _proto.remove = function remove() {\n this._parent.slideUp();\n\n this._element.trigger($__default['default'].Event(EVENT_REMOVED), this._parent);\n };\n\n _proto.toggle = function toggle() {\n if (this._parent.hasClass(CLASS_NAME_COLLAPSED)) {\n this.expand();\n return;\n }\n\n this.collapse();\n };\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\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\n if ($element.hasClass(CLASS_NAME_COLLAPSED)) {\n $element.addClass(CLASS_NAME_WAS_COLLAPSED);\n }\n\n $element.dequeue();\n });\n\n this._element.trigger($__default['default'].Event(EVENT_MAXIMIZED), this._parent);\n };\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\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\n if ($element.hasClass(CLASS_NAME_WAS_COLLAPSED)) {\n $element.removeClass(CLASS_NAME_WAS_COLLAPSED);\n }\n\n $element.dequeue();\n });\n\n this._element.trigger($__default['default'].Event(EVENT_MINIMIZED), this._parent);\n };\n\n _proto.toggleMaximize = function toggleMaximize() {\n if (this._parent.hasClass(CLASS_NAME_MAXIMIZED)) {\n this.minimize();\n return;\n }\n\n this.maximize();\n } // Private\n ;\n\n _proto._init = function _init(card) {\n var _this3 = this;\n\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\n var _options = $__default['default'].extend({}, Default$1, $__default['default'](this).data());\n\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\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\n return CardWidget;\n }();\n /**\r\n * Data API\r\n * ====================================================\r\n */\n\n\n $__default['default'](document).on('click', SELECTOR_DATA_COLLAPSE, function (event) {\n if (event) {\n event.preventDefault();\n }\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\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\n CardWidget._jQueryInterface.call($__default['default'](this), 'toggleMaximize');\n });\n /**\r\n * jQuery API\r\n * ====================================================\r\n */\n\n $__default['default'].fn[NAME$1] = CardWidget._jQueryInterface;\n $__default['default'].fn[NAME$1].Constructor = CardWidget;\n\n $__default['default'].fn[NAME$1].noConflict = function () {\n $__default['default'].fn[NAME$1] = JQUERY_NO_CONFLICT$1;\n return CardWidget._jQueryInterface;\n };\n /**\r\n * --------------------------------------------\r\n * AdminLTE ControlSidebar.js\r\n * License MIT\r\n * --------------------------------------------\r\n */\n\n /**\r\n * Constants\r\n * ====================================================\r\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 /**\r\n * Class Definition\r\n * ====================================================\r\n */\n\n var ControlSidebar = /*#__PURE__*/function () {\n function ControlSidebar(element, config) {\n this._element = element;\n this._config = config;\n\n this._init();\n } // Public\n\n\n var _proto = ControlSidebar.prototype;\n\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\n $__default['default'](this._element).trigger($__default['default'].Event(EVENT_COLLAPSED$1));\n };\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\n this._fixHeight();\n\n this._fixScrollHeight();\n\n $__default['default'](this._element).trigger($__default['default'].Event(EVENT_EXPANDED$1));\n };\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\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\n this._fixHeight();\n\n this._fixScrollHeight();\n\n $__default['default'](window).resize(function () {\n _this._fixHeight();\n\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\n if (shouldFixHeight) {\n _this._fixScrollHeight();\n }\n });\n };\n\n _proto._fixScrollHeight = function _fixScrollHeight() {\n var $body = $__default['default']('body');\n\n if (!$body.hasClass(CLASS_NAME_LAYOUT_FIXED)) {\n return;\n }\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\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\n _proto._fixHeight = function _fixHeight() {\n var $body = $__default['default']('body');\n\n if (!$body.hasClass(CLASS_NAME_LAYOUT_FIXED)) {\n return;\n }\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\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\n var $controlSidebar = $__default['default'](SELECTOR_CONTROL_SIDEBAR + \" \" + SELECTOR_CONTROL_SIDEBAR_CONTENT);\n $controlSidebar.css('height', sidebarHeight);\n\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\n var _options = $__default['default'].extend({}, Default$2, $__default['default'](this).data());\n\n if (!data) {\n data = new ControlSidebar(this, _options);\n $__default['default'](this).data(DATA_KEY$2, data);\n }\n\n if (data[operation] === 'undefined') {\n throw new Error(operation + \" is not a function\");\n }\n\n data[operation]();\n });\n };\n\n return ControlSidebar;\n }();\n /**\r\n *\r\n * Data Api implementation\r\n * ====================================================\r\n */\n\n\n $__default['default'](document).on('click', SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault();\n\n ControlSidebar._jQueryInterface.call($__default['default'](this), 'toggle');\n });\n /**\r\n * jQuery API\r\n * ====================================================\r\n */\n\n $__default['default'].fn[NAME$2] = ControlSidebar._jQueryInterface;\n $__default['default'].fn[NAME$2].Constructor = ControlSidebar;\n\n $__default['default'].fn[NAME$2].noConflict = function () {\n $__default['default'].fn[NAME$2] = JQUERY_NO_CONFLICT$2;\n return ControlSidebar._jQueryInterface;\n };\n /**\r\n * --------------------------------------------\r\n * AdminLTE DirectChat.js\r\n * License MIT\r\n * --------------------------------------------\r\n */\n\n /**\r\n * Constants\r\n * ====================================================\r\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 /**\r\n * Class Definition\r\n * ====================================================\r\n */\n\n var DirectChat = /*#__PURE__*/function () {\n function DirectChat(element) {\n this._element = element;\n }\n\n var _proto = DirectChat.prototype;\n\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\n if (!data) {\n data = new DirectChat($__default['default'](this));\n $__default['default'](this).data(DATA_KEY$3, data);\n }\n\n data[config]();\n });\n };\n\n return DirectChat;\n }();\n /**\r\n *\r\n * Data Api implementation\r\n * ====================================================\r\n */\n\n\n $__default['default'](document).on('click', SELECTOR_DATA_TOGGLE$1, function (event) {\n if (event) {\n event.preventDefault();\n }\n\n DirectChat._jQueryInterface.call($__default['default'](this), 'toggle');\n });\n /**\r\n * jQuery API\r\n * ====================================================\r\n */\n\n $__default['default'].fn[NAME$3] = DirectChat._jQueryInterface;\n $__default['default'].fn[NAME$3].Constructor = DirectChat;\n\n $__default['default'].fn[NAME$3].noConflict = function () {\n $__default['default'].fn[NAME$3] = JQUERY_NO_CONFLICT$3;\n return DirectChat._jQueryInterface;\n };\n /**\r\n * --------------------------------------------\r\n * AdminLTE Dropdown.js\r\n * License MIT\r\n * --------------------------------------------\r\n */\n\n /**\r\n * Constants\r\n * ====================================================\r\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 /**\r\n * Class Definition\r\n * ====================================================\r\n */\n\n var Dropdown = /*#__PURE__*/function () {\n function Dropdown(element, config) {\n this._config = config;\n this._element = element;\n } // Public\n\n\n var _proto = Dropdown.prototype;\n\n _proto.toggleSubmenu = function toggleSubmenu() {\n this._element.siblings().show().toggleClass('show');\n\n if (!this._element.next().hasClass('show')) {\n this._element.parents(SELECTOR_DROPDOWN_MENU).first().find('.show').removeClass('show').hide();\n }\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\n _proto.fixPosition = function fixPosition() {\n var $element = $__default['default'](SELECTOR_DROPDOWN_MENU_ACTIVE);\n\n if ($element.length === 0) {\n return;\n }\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\n var offset = $element.offset();\n var width = $element.width();\n var visiblePart = $__default['default'](window).width() - offset.left;\n\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\n var _config = $__default['default'].extend({}, Default$3, $__default['default'](this).data());\n\n if (!data) {\n data = new Dropdown($__default['default'](this), _config);\n $__default['default'](this).data(DATA_KEY$4, data);\n }\n\n if (config === 'toggleSubmenu' || config === 'fixPosition') {\n data[config]();\n }\n });\n };\n\n return Dropdown;\n }();\n /**\r\n * Data API\r\n * ====================================================\r\n */\n\n\n $__default['default'](SELECTOR_DROPDOWN_MENU + \" \" + SELECTOR_DROPDOWN_TOGGLE).on('click', function (event) {\n event.preventDefault();\n event.stopPropagation();\n\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\n if ($__default['default'](event.target).parent().hasClass(CLASS_NAME_DROPDOWN_SUBMENU)) {\n return;\n }\n\n setTimeout(function () {\n Dropdown._jQueryInterface.call($__default['default'](this), 'fixPosition');\n }, 1);\n });\n /**\r\n * jQuery API\r\n * ====================================================\r\n */\n\n $__default['default'].fn[NAME$4] = Dropdown._jQueryInterface;\n $__default['default'].fn[NAME$4].Constructor = Dropdown;\n\n $__default['default'].fn[NAME$4].noConflict = function () {\n $__default['default'].fn[NAME$4] = JQUERY_NO_CONFLICT$4;\n return Dropdown._jQueryInterface;\n };\n /**\r\n * --------------------------------------------\r\n * AdminLTE ExpandableTable.js\r\n * License MIT\r\n * --------------------------------------------\r\n */\n\n /**\r\n * Constants\r\n * ====================================================\r\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 /**\r\n * Class Definition\r\n * ====================================================\r\n */\n\n var ExpandableTable = /*#__PURE__*/function () {\n function ExpandableTable(element, options) {\n this._options = options;\n this._element = element;\n } // Public\n\n\n var _proto = ExpandableTable.prototype;\n\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\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\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\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\n if (!data) {\n data = new ExpandableTable($__default['default'](this));\n $__default['default'](this).data(DATA_KEY$5, data);\n }\n\n if (typeof operation === 'string' && operation.match(/init|toggleRow/)) {\n data[operation]();\n }\n });\n };\n\n return ExpandableTable;\n }();\n /**\r\n * Data API\r\n * ====================================================\r\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 /**\r\n * jQuery API\r\n * ====================================================\r\n */\n\n $__default['default'].fn[NAME$5] = ExpandableTable._jQueryInterface;\n $__default['default'].fn[NAME$5].Constructor = ExpandableTable;\n\n $__default['default'].fn[NAME$5].noConflict = function () {\n $__default['default'].fn[NAME$5] = JQUERY_NO_CONFLICT$5;\n return ExpandableTable._jQueryInterface;\n };\n /**\r\n * --------------------------------------------\r\n * AdminLTE Fullscreen.js\r\n * License MIT\r\n * --------------------------------------------\r\n */\n\n /**\r\n * Constants\r\n * ====================================================\r\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 /**\r\n * Class Definition\r\n * ====================================================\r\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\n var _proto = Fullscreen.prototype;\n\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\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\n $__default['default'](SELECTOR_ICON).removeClass(this.options.maximizeIcon).addClass(this.options.minimizeIcon);\n };\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\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\n if (!data) {\n data = $__default['default'](this).data();\n }\n\n var _options = $__default['default'].extend({}, Default$4, _typeof(config) === 'object' ? config : data);\n\n var plugin = new Fullscreen($__default['default'](this), _options);\n $__default['default'](this).data(DATA_KEY$6, _typeof(config) === 'object' ? config : data);\n\n if (typeof config === 'string' && config.match(/toggle|fullscreen|windowed/)) {\n plugin[config]();\n } else {\n plugin.init();\n }\n };\n\n return Fullscreen;\n }();\n /**\r\n * Data API\r\n * ====================================================\r\n */\n\n\n $__default['default'](document).on('click', SELECTOR_DATA_WIDGET, function () {\n Fullscreen._jQueryInterface.call($__default['default'](this), 'toggle');\n });\n /**\r\n * jQuery API\r\n * ====================================================\r\n */\n\n $__default['default'].fn[NAME$6] = Fullscreen._jQueryInterface;\n $__default['default'].fn[NAME$6].Constructor = Fullscreen;\n\n $__default['default'].fn[NAME$6].noConflict = function () {\n $__default['default'].fn[NAME$6] = JQUERY_NO_CONFLICT$6;\n return Fullscreen._jQueryInterface;\n };\n /**\r\n * --------------------------------------------\r\n * AdminLTE IFrame.js\r\n * License MIT\r\n * --------------------------------------------\r\n */\n\n /**\r\n * Constants\r\n * ====================================================\r\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 /**\r\n * Class Definition\r\n * ====================================================\r\n */\n\n var IFrame = /*#__PURE__*/function () {\n function IFrame(element, config) {\n this._config = config;\n this._element = element;\n\n this._init();\n } // Public\n\n\n var _proto = IFrame.prototype;\n\n _proto.onTabClick = function onTabClick(item) {\n this._config.onTabClick(item);\n };\n\n _proto.onTabChanged = function onTabChanged(item) {\n this._config.onTabChanged(item);\n };\n\n _proto.onTabCreated = function onTabCreated(item) {\n this._config.onTabCreated(item);\n };\n\n _proto.createTab = function createTab(title, link, uniqueName, autoOpen) {\n var _this = this;\n\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\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\n setTimeout(function () {\n $loadingScreen.fadeOut();\n }, _this._config.loadingScreen);\n } else {\n _this.switchTab(\"#\" + navId, _this._config.loadingScreen);\n\n $loadingScreen.fadeOut();\n }\n });\n } else {\n this.switchTab(\"#\" + navId);\n }\n }\n\n this.onTabCreated($__default['default'](\"#\" + navId));\n };\n\n _proto.openTabSidebar = function openTabSidebar(item, autoOpen) {\n if (autoOpen === void 0) {\n autoOpen = this._config.autoShowNewTab;\n }\n\n var $item = $__default['default'](item).clone();\n\n if ($item.attr('href') === undefined) {\n $item = $__default['default'](item).parent('a').clone();\n }\n\n $item.find('.right').remove();\n var title = $item.find('p').text();\n\n if (title === '') {\n title = $item.text();\n }\n\n var link = $item.attr('href');\n\n if (link === '#' || link === '' || link === undefined) {\n return;\n }\n\n this.createTab(title, link, link.replace('.html', '').replace('./', '').replaceAll('/', '-'), autoOpen);\n };\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\n this._fixHeight();\n\n $item.tab('show');\n $item.parents('li').addClass('active');\n this.onTabChanged($item);\n\n if (this._config.autoItemActive) {\n this._setItemActive($__default['default'](tabId + \" iframe\").attr('src'));\n }\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\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\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\n $__default['default'](window).trigger('resize');\n\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\n this._fixHeight(true);\n }\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\n _proto._setupListeners = function _setupListeners() {\n var _this2 = this;\n\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\n _this2.openTabSidebar(e.target);\n });\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\n _this2.openTabSidebar(e.target);\n });\n }\n\n $__default['default'](document).on('click', SELECTOR_TAB_NAVBAR_NAV_ITEM, function (e) {\n e.preventDefault();\n\n _this2.onTabClick(e.target);\n\n _this2.switchTab(e.target);\n });\n $__default['default'](document).on('click', SELECTOR_DATA_TOGGLE_CLOSE, function (e) {\n e.preventDefault();\n\n _this2.removeActiveTab();\n });\n $__default['default'](document).on('click', SELECTOR_DATA_TOGGLE_FULLSCREEN, function (e) {\n e.preventDefault();\n\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\n if (!_this2._config.scrollBehaviorSwap) {\n scrollOffset = -scrollOffset;\n }\n\n mousedown = true;\n\n _this2._navScroll(scrollOffset);\n\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\n if (_this2._config.scrollBehaviorSwap) {\n scrollOffset = -scrollOffset;\n }\n\n mousedown = true;\n\n _this2._navScroll(scrollOffset);\n\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\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\n _proto._fixHeight = function _fixHeight(tabEmpty) {\n if (tabEmpty === void 0) {\n tabEmpty = false;\n }\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\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\n var _options = $__default['default'].extend({}, Default$5, $__default['default'](this).data());\n\n if (!data) {\n data = new IFrame(this, _options);\n $__default['default'](this).data(DATA_KEY$7, data);\n }\n\n if (typeof operation === 'string' && operation.match(/createTab|openTabSidebar|switchTab|removeActiveTab/)) {\n var _data;\n\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\n (_data = data)[operation].apply(_data, args);\n }\n };\n\n return IFrame;\n }();\n /**\r\n * Data API\r\n * ====================================================\r\n */\n\n\n $__default['default'](window).on('load', function () {\n IFrame._jQueryInterface.call($__default['default'](SELECTOR_DATA_TOGGLE$3));\n });\n /**\r\n * jQuery API\r\n * ====================================================\r\n */\n\n $__default['default'].fn[NAME$7] = IFrame._jQueryInterface;\n $__default['default'].fn[NAME$7].Constructor = IFrame;\n\n $__default['default'].fn[NAME$7].noConflict = function () {\n $__default['default'].fn[NAME$7] = JQUERY_NO_CONFLICT$7;\n return IFrame._jQueryInterface;\n };\n /**\r\n * --------------------------------------------\r\n * AdminLTE Layout.js\r\n * License MIT\r\n * --------------------------------------------\r\n */\n\n /**\r\n * Constants\r\n * ====================================================\r\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 /**\r\n * Class Definition\r\n * ====================================================\r\n */\n\n var Layout = /*#__PURE__*/function () {\n function Layout(element, config) {\n this._config = config;\n this._element = element;\n\n this._init();\n } // Public\n\n\n var _proto = Layout.prototype;\n\n _proto.fixLayoutHeight = function fixLayoutHeight(extra) {\n if (extra === void 0) {\n extra = null;\n }\n\n var $body = $__default['default']('body');\n var controlSidebar = 0;\n\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\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\n var max = this._max(heights);\n\n var offset = this._config.panelAutoHeight;\n\n if (offset === true) {\n offset = 0;\n }\n\n var $contentSelector = $__default['default'](SELECTOR_CONTENT);\n\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\n if (this._isFooterFixed()) {\n $contentSelector.css(this._config.panelAutoHeightMode, parseFloat($contentSelector.css(this._config.panelAutoHeightMode)) + heights.footer);\n }\n }\n\n if (!$body.hasClass(CLASS_NAME_LAYOUT_FIXED$1)) {\n return;\n }\n\n if (offset !== false) {\n $contentSelector.css(this._config.panelAutoHeightMode, max + offset - heights.header - heights.footer);\n }\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\n _proto.fixLoginRegisterHeight = function fixLoginRegisterHeight() {\n var $body = $__default['default']('body');\n var $selector = $__default['default'](SELECTOR_LOGIN_BOX + \", \" + SELECTOR_REGISTER_BOX);\n\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\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; // Activate layout height watcher\n\n\n this.fixLayoutHeight();\n\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\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\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\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\n return this.each(function () {\n var data = $__default['default'](this).data(DATA_KEY$8);\n\n var _options = $__default['default'].extend({}, Default$6, $__default['default'](this).data());\n\n if (!data) {\n data = new Layout($__default['default'](this), _options);\n $__default['default'](this).data(DATA_KEY$8, data);\n }\n\n if (config === 'init' || config === '') {\n data._init();\n } else if (config === 'fixLayoutHeight' || config === 'fixLoginRegisterHeight') {\n data[config]();\n }\n });\n };\n\n return Layout;\n }();\n /**\r\n * Data API\r\n * ====================================================\r\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 /**\r\n * jQuery API\r\n * ====================================================\r\n */\n\n $__default['default'].fn[NAME$8] = Layout._jQueryInterface;\n $__default['default'].fn[NAME$8].Constructor = Layout;\n\n $__default['default'].fn[NAME$8].noConflict = function () {\n $__default['default'].fn[NAME$8] = JQUERY_NO_CONFLICT$8;\n return Layout._jQueryInterface;\n };\n /**\r\n * --------------------------------------------\r\n * AdminLTE PushMenu.js\r\n * License MIT\r\n * --------------------------------------------\r\n */\n\n /**\r\n * Constants\r\n * ====================================================\r\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 /**\r\n * Class Definition\r\n * ====================================================\r\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\n if ($__default['default'](SELECTOR_OVERLAY).length === 0) {\n this._addOverlay();\n }\n\n this._init();\n } // Public\n\n\n var _proto = PushMenu.prototype;\n\n _proto.expand = function expand() {\n var $bodySelector = $__default['default'](SELECTOR_BODY);\n\n if (this._options.autoCollapseSize) {\n if ($__default['default'](window).width() <= this._options.autoCollapseSize) {\n $bodySelector.addClass(CLASS_NAME_OPEN);\n }\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\n if (this._options.enableRemember) {\n localStorage.setItem(\"remember\" + EVENT_KEY$5, CLASS_NAME_OPEN);\n }\n\n $__default['default'](this._element).trigger($__default['default'].Event(EVENT_SHOWN));\n };\n\n _proto.collapse = function collapse() {\n var $bodySelector = $__default['default'](SELECTOR_BODY);\n\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\n $bodySelector.addClass(CLASS_NAME_COLLAPSED$1);\n\n if (this._options.enableRemember) {\n localStorage.setItem(\"remember\" + EVENT_KEY$5, CLASS_NAME_COLLAPSED$1);\n }\n\n $__default['default'](this._element).trigger($__default['default'].Event(EVENT_COLLAPSED$3));\n };\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\n _proto.autoCollapse = function autoCollapse(resize) {\n if (resize === void 0) {\n resize = false;\n }\n\n if (!this._options.autoCollapseSize) {\n return;\n }\n\n var $bodySelector = $__default['default'](SELECTOR_BODY);\n\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\n _proto.remember = function remember() {\n if (!this._options.enableRemember) {\n return;\n }\n\n var $body = $__default['default']('body');\n var toggleState = localStorage.getItem(\"remember\" + EVENT_KEY$5);\n\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\n this.remember();\n this.autoCollapse();\n $__default['default'](window).resize(function () {\n _this.autoCollapse(true);\n });\n };\n\n _proto._addOverlay = function _addOverlay() {\n var _this2 = this;\n\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\n var _options = $__default['default'].extend({}, Default$7, $__default['default'](this).data());\n\n if (!data) {\n data = new PushMenu(this, _options);\n $__default['default'](this).data(DATA_KEY$9, data);\n }\n\n if (typeof operation === 'string' && operation.match(/collapse|expand|toggle/)) {\n data[operation]();\n }\n });\n };\n\n return PushMenu;\n }();\n /**\r\n * Data API\r\n * ====================================================\r\n */\n\n\n $__default['default'](document).on('click', SELECTOR_TOGGLE_BUTTON, function (event) {\n event.preventDefault();\n var button = event.currentTarget;\n\n if ($__default['default'](button).data('widget') !== 'pushmenu') {\n button = $__default['default'](button).closest(SELECTOR_TOGGLE_BUTTON);\n }\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 /**\r\n * jQuery API\r\n * ====================================================\r\n */\n\n $__default['default'].fn[NAME$9] = PushMenu._jQueryInterface;\n $__default['default'].fn[NAME$9].Constructor = PushMenu;\n\n $__default['default'].fn[NAME$9].noConflict = function () {\n $__default['default'].fn[NAME$9] = JQUERY_NO_CONFLICT$9;\n return PushMenu._jQueryInterface;\n };\n /**\r\n * --------------------------------------------\r\n * AdminLTE SidebarSearch.js\r\n * License MIT\r\n * --------------------------------------------\r\n */\n\n /**\r\n * Constants\r\n * ====================================================\r\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 /**\r\n * Class Definition\r\n * ====================================================\r\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\n var _proto = SidebarSearch.prototype;\n\n _proto.init = function init() {\n var _this = this;\n\n if ($__default['default'](SELECTOR_DATA_WIDGET$1).length == 0) {\n return;\n }\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\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\n this._addNotFound();\n\n $__default['default'](SELECTOR_SIDEBAR$1).children().each(function (i, child) {\n _this._parseItem(child);\n });\n };\n\n _proto.search = function search() {\n var _this2 = this;\n\n var searchValue = $__default['default'](SELECTOR_SEARCH_INPUT).val().toLowerCase();\n\n if (searchValue.length < this.options.minLength) {\n $__default['default'](SELECTOR_SEARCH_RESULTS_GROUP).empty();\n\n this._addNotFound();\n\n this.close();\n return;\n }\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\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\n this.open();\n };\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\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\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\n if (path === void 0) {\n path = [];\n }\n\n if ($__default['default'](item).hasClass(CLASS_NAME_HEADER)) {\n return;\n }\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\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\n _proto._trimText = function _trimText(text) {\n return $.trim(text.replace(/(\\r\\n|\\n|\\r)/gm, ' '));\n };\n\n _proto._renderItem = function _renderItem(name, link, path) {\n var _this4 = this;\n\n path = path.join(\" \" + this.options.arrowSign + \" \");\n\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\n if (this.options.highlightName) {\n name = name.replace(regExp, function (str) {\n return \"<b class=\\\"\" + _this4.options.highlightClass + \"\\\">\" + str + \"</b>\";\n });\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\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\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\n if (!data) {\n data = $__default['default'](this).data();\n }\n\n var _options = $__default['default'].extend({}, Default$8, _typeof(config) === 'object' ? config : data);\n\n var plugin = new SidebarSearch($__default['default'](this), _options);\n $__default['default'](this).data(DATA_KEY$a, _typeof(config) === 'object' ? config : data);\n\n if (typeof config === 'string' && config.match(/init|toggle|close|open|search/)) {\n plugin[config]();\n } else {\n plugin.init();\n }\n };\n\n return SidebarSearch;\n }();\n /**\r\n * Data API\r\n * ====================================================\r\n */\n\n\n $__default['default'](document).on('click', SELECTOR_SEARCH_BUTTON, function (event) {\n event.preventDefault();\n\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\n if (event.keyCode == 40) {\n event.preventDefault();\n $__default['default'](SELECTOR_SEARCH_RESULTS_GROUP).children().first().focus();\n return;\n }\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\n if (event.keyCode == 38) {\n event.preventDefault();\n\n if ($focused.is(':first-child')) {\n $focused.siblings().last().focus();\n } else {\n $focused.prev().focus();\n }\n }\n\n if (event.keyCode == 40) {\n event.preventDefault();\n\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 /**\r\n * jQuery API\r\n * ====================================================\r\n */\n\n $__default['default'].fn[NAME$a] = SidebarSearch._jQueryInterface;\n $__default['default'].fn[NAME$a].Constructor = SidebarSearch;\n\n $__default['default'].fn[NAME$a].noConflict = function () {\n $__default['default'].fn[NAME$a] = JQUERY_NO_CONFLICT$a;\n return SidebarSearch._jQueryInterface;\n };\n /**\r\n * --------------------------------------------\r\n * AdminLTE Toasts.js\r\n * License MIT\r\n * --------------------------------------------\r\n */\n\n /**\r\n * Constants\r\n * ====================================================\r\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 /**\r\n * Class Definition\r\n * ====================================================\r\n */\n\n var Toasts = /*#__PURE__*/function () {\n function Toasts(element, config) {\n this._config = config;\n\n this._prepareContainer();\n\n $__default['default']('body').trigger($__default['default'].Event(EVENT_INIT));\n } // Public\n\n\n var _proto = Toasts.prototype;\n\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\n if (this._config[\"class\"]) {\n toast.addClass(this._config[\"class\"]);\n }\n\n if (this._config.delay && this._config.delay != 500) {\n toast.data('delay', this._config.delay);\n }\n\n var toastHeader = $__default['default']('<div class=\"toast-header\">');\n\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\n if (this._config.imageHeight != null) {\n toastImage.height(this._config.imageHeight).width('auto');\n }\n\n toastHeader.append(toastImage);\n }\n\n if (this._config.icon != null) {\n toastHeader.append($__default['default']('<i />').addClass('mr-2').addClass(this._config.icon));\n }\n\n if (this._config.title != null) {\n toastHeader.append($__default['default']('<strong />').addClass('mr-auto').html(this._config.title));\n }\n\n if (this._config.subtitle != null) {\n toastHeader.append($__default['default']('<small />').html(this._config.subtitle));\n }\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\">×</span>');\n\n if (this._config.title == null) {\n toastClose.toggleClass('ml-2 ml-auto');\n }\n\n toastHeader.append(toastClose);\n }\n\n toast.append(toastHeader);\n\n if (this._config.body != null) {\n toast.append($__default['default']('<div class=\"toast-body\" />').html(this._config.body));\n }\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\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\n if (this._config.position == POSITION_TOP_LEFT) {\n return SELECTOR_CONTAINER_TOP_LEFT;\n }\n\n if (this._config.position == POSITION_BOTTOM_RIGHT) {\n return SELECTOR_CONTAINER_BOTTOM_RIGHT;\n }\n\n if (this._config.position == POSITION_BOTTOM_LEFT) {\n return SELECTOR_CONTAINER_BOTTOM_LEFT;\n }\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\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\n $__default['default']('body').append(container);\n }\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\n var toast = new Toasts($__default['default'](this), _options);\n\n if (option === 'create') {\n toast[option]();\n }\n });\n };\n\n return Toasts;\n }();\n /**\r\n * jQuery API\r\n * ====================================================\r\n */\n\n\n $__default['default'].fn[NAME$b] = Toasts._jQueryInterface;\n $__default['default'].fn[NAME$b].Constructor = Toasts;\n\n $__default['default'].fn[NAME$b].noConflict = function () {\n $__default['default'].fn[NAME$b] = JQUERY_NO_CONFLICT$b;\n return Toasts._jQueryInterface;\n };\n /**\r\n * --------------------------------------------\r\n * AdminLTE TodoList.js\r\n * License MIT\r\n * --------------------------------------------\r\n */\n\n /**\r\n * Constants\r\n * ====================================================\r\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 /**\r\n * Class Definition\r\n * ====================================================\r\n */\n\n var TodoList = /*#__PURE__*/function () {\n function TodoList(element, config) {\n this._config = config;\n this._element = element;\n\n this._init();\n } // Public\n\n\n var _proto = TodoList.prototype;\n\n _proto.toggle = function toggle(item) {\n item.parents('li').toggleClass(CLASS_NAME_TODO_LIST_DONE);\n\n if (!$__default['default'](item).prop('checked')) {\n this.unCheck($__default['default'](item));\n return;\n }\n\n this.check(item);\n };\n\n _proto.check = function check(item) {\n this._config.onCheck.call(item);\n };\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\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\n if (!data) {\n data = $__default['default'](this).data();\n }\n\n var _options = $__default['default'].extend({}, Default$a, _typeof(config) === 'object' ? config : data);\n\n var plugin = new TodoList($__default['default'](this), _options);\n $__default['default'](this).data(DATA_KEY$c, _typeof(config) === 'object' ? config : data);\n\n if (config === 'init') {\n plugin[config]();\n }\n });\n };\n\n return TodoList;\n }();\n /**\r\n * Data API\r\n * ====================================================\r\n */\n\n\n $__default['default'](window).on('load', function () {\n TodoList._jQueryInterface.call($__default['default'](SELECTOR_DATA_TOGGLE$4));\n });\n /**\r\n * jQuery API\r\n * ====================================================\r\n */\n\n $__default['default'].fn[NAME$c] = TodoList._jQueryInterface;\n $__default['default'].fn[NAME$c].Constructor = TodoList;\n\n $__default['default'].fn[NAME$c].noConflict = function () {\n $__default['default'].fn[NAME$c] = JQUERY_NO_CONFLICT$c;\n return TodoList._jQueryInterface;\n };\n /**\r\n * --------------------------------------------\r\n * AdminLTE Treeview.js\r\n * License MIT\r\n * --------------------------------------------\r\n */\n\n /**\r\n * Constants\r\n * ====================================================\r\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 /**\r\n * Class Definition\r\n * ====================================================\r\n */\n\n var Treeview = /*#__PURE__*/function () {\n function Treeview(element, config) {\n this._config = config;\n this._element = element;\n } // Public\n\n\n var _proto = Treeview.prototype;\n\n _proto.init = function init() {\n $__default['default'](\"\" + SELECTOR_LI + SELECTOR_OPEN + \" \" + SELECTOR_TREEVIEW_MENU).css('display', 'block');\n\n this._setupListeners();\n };\n\n _proto.expand = function expand(treeviewMenu, parentLi) {\n var _this = this;\n\n var expandedEvent = $__default['default'].Event(EVENT_EXPANDED$3);\n\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\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\n if (this._config.expandSidebar) {\n this._expandSidebar();\n }\n };\n\n _proto.collapse = function collapse(treeviewMenu, parentLi) {\n var _this2 = this;\n\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\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\n if (!treeviewMenu.is(SELECTOR_TREEVIEW_MENU)) {\n if (!$parent.is(SELECTOR_LI)) {\n treeviewMenu = $parent.parent().find(\"> \" + SELECTOR_TREEVIEW_MENU);\n }\n\n if (!treeviewMenu.is(SELECTOR_TREEVIEW_MENU)) {\n return;\n }\n }\n\n event.preventDefault();\n var parentLi = $relativeTarget.parents(SELECTOR_LI).first();\n var isOpen = parentLi.hasClass(CLASS_NAME_OPEN$2);\n\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\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\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\n var _options = $__default['default'].extend({}, Default$b, $__default['default'](this).data());\n\n if (!data) {\n data = new Treeview($__default['default'](this), _options);\n $__default['default'](this).data(DATA_KEY$d, data);\n }\n\n if (config === 'init') {\n data[config]();\n }\n });\n };\n\n return Treeview;\n }();\n /**\r\n * Data API\r\n * ====================================================\r\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 /**\r\n * jQuery API\r\n * ====================================================\r\n */\n\n $__default['default'].fn[NAME$d] = Treeview._jQueryInterface;\n $__default['default'].fn[NAME$d].Constructor = Treeview;\n\n $__default['default'].fn[NAME$d].noConflict = function () {\n $__default['default'].fn[NAME$d] = JQUERY_NO_CONFLICT$d;\n return Treeview._jQueryInterface;\n };\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYWRtaW5sdGUuanM/YTk3MiJdLCJuYW1lcyI6WyJnbG9iYWwiLCJmYWN0b3J5IiwiZXhwb3J0cyIsInJlcXVpcmUiLCJkZWZpbmUiLCIkIiwiX2ludGVyb3BEZWZhdWx0TGVnYWN5IiwiZSIsIiRfX2RlZmF1bHQiLCJOQU1FIiwiREFUQV9LRVkiLCJFVkVOVF9LRVkiLCJKUVVFUllfTk9fQ09ORkxJQ1QiLCJmbiIsIkVWRU5UX0xPQURFRCIsIkVWRU5UX09WRVJMQVlfQURERUQiLCJFVkVOVF9PVkVSTEFZX1JFTU9WRUQiLCJDTEFTU19OQU1FX0NBUkQiLCJTRUxFQ1RPUl9DQVJEIiwiU0VMRUNUT1JfREFUQV9SRUZSRVNIIiwiRGVmYXVsdCIsInNvdXJjZSIsInNvdXJjZVNlbGVjdG9yIiwicGFyYW1zIiwidHJpZ2dlciIsImNvbnRlbnQiLCJsb2FkSW5Db250ZW50IiwibG9hZE9uSW5pdCIsInJlc3BvbnNlVHlwZSIsIm92ZXJsYXlUZW1wbGF0ZSIsIm9uTG9hZFN0YXJ0Iiwib25Mb2FkRG9uZSIsInJlc3BvbnNlIiwiQ2FyZFJlZnJlc2giLCJlbGVtZW50Iiwic2V0dGluZ3MiLCJfZWxlbWVudCIsIl9wYXJlbnQiLCJwYXJlbnRzIiwiZmlyc3QiLCJfc2V0dGluZ3MiLCJleHRlbmQiLCJfb3ZlcmxheSIsImhhc0NsYXNzIiwiRXJyb3IiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJsb2FkIiwiX3RoaXMiLCJfYWRkT3ZlcmxheSIsImNhbGwiLCJnZXQiLCJmaW5kIiwiaHRtbCIsIl9yZW1vdmVPdmVybGF5IiwiRXZlbnQiLCJhcHBlbmQiLCJyZW1vdmUiLCJfaW5pdCIsIl90aGlzMiIsIm9uIiwiX2pRdWVyeUludGVyZmFjZSIsImNvbmZpZyIsImRhdGEiLCJfb3B0aW9ucyIsIm1hdGNoIiwiZG9jdW1lbnQiLCJldmVudCIsInByZXZlbnREZWZhdWx0IiwiZWFjaCIsIkNvbnN0cnVjdG9yIiwibm9Db25mbGljdCIsIk5BTUUkMSIsIkRBVEFfS0VZJDEiLCJFVkVOVF9LRVkkMSIsIkpRVUVSWV9OT19DT05GTElDVCQxIiwiRVZFTlRfRVhQQU5ERUQiLCJFVkVOVF9DT0xMQVBTRUQiLCJFVkVOVF9NQVhJTUlaRUQiLCJFVkVOVF9NSU5JTUlaRUQiLCJFVkVOVF9SRU1PVkVEIiwiQ0xBU1NfTkFNRV9DQVJEJDEiLCJDTEFTU19OQU1FX0NPTExBUFNFRCIsIkNMQVNTX05BTUVfQ09MTEFQU0lORyIsIkNMQVNTX05BTUVfRVhQQU5ESU5HIiwiQ0xBU1NfTkFNRV9XQVNfQ09MTEFQU0VEIiwiQ0xBU1NfTkFNRV9NQVhJTUlaRUQiLCJTRUxFQ1RPUl9EQVRBX1JFTU9WRSIsIlNFTEVDVE9SX0RBVEFfQ09MTEFQU0UiLCJTRUxFQ1RPUl9EQVRBX01BWElNSVpFIiwiU0VMRUNUT1JfQ0FSRCQxIiwiU0VMRUNUT1JfQ0FSRF9IRUFERVIiLCJTRUxFQ1RPUl9DQVJEX0JPRFkiLCJTRUxFQ1RPUl9DQVJEX0ZPT1RFUiIsIkRlZmF1bHQkMSIsImFuaW1hdGlvblNwZWVkIiwiY29sbGFwc2VUcmlnZ2VyIiwicmVtb3ZlVHJpZ2dlciIsIm1heGltaXplVHJpZ2dlciIsImNvbGxhcHNlSWNvbiIsImV4cGFuZEljb24iLCJtYXhpbWl6ZUljb24iLCJtaW5pbWl6ZUljb24iLCJDYXJkV2lkZ2V0IiwiY29sbGFwc2UiLCJhZGRDbGFzcyIsImNoaWxkcmVuIiwic2xpZGVVcCIsInJlbW92ZUNsYXNzIiwiZXhwYW5kIiwic2xpZGVEb3duIiwidG9nZ2xlIiwibWF4aW1pemUiLCJjc3MiLCJoZWlnaHQiLCJ3aWR0aCIsInRyYW5zaXRpb24iLCJkZWxheSIsInF1ZXVlIiwiJGVsZW1lbnQiLCJkZXF1ZXVlIiwibWluaW1pemUiLCJzdHlsZSIsInRvZ2dsZU1heGltaXplIiwiY2FyZCIsIl90aGlzMyIsImNsaWNrIiwiTkFNRSQyIiwiREFUQV9LRVkkMiIsIkVWRU5UX0tFWSQyIiwiSlFVRVJZX05PX0NPTkZMSUNUJDIiLCJFVkVOVF9DT0xMQVBTRUQkMSIsIkVWRU5UX0VYUEFOREVEJDEiLCJTRUxFQ1RPUl9DT05UUk9MX1NJREVCQVIiLCJTRUxFQ1RPUl9DT05UUk9MX1NJREVCQVJfQ09OVEVOVCIsIlNFTEVDVE9SX0RBVEFfVE9HR0xFIiwiU0VMRUNUT1JfSEVBREVSIiwiU0VMRUNUT1JfRk9PVEVSIiwiQ0xBU1NfTkFNRV9DT05UUk9MX1NJREVCQVJfQU5JTUFURSIsIkNMQVNTX05BTUVfQ09OVFJPTF9TSURFQkFSX09QRU4iLCJDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9TTElERSIsIkNMQVNTX05BTUVfTEFZT1VUX0ZJWEVEIiwiQ0xBU1NfTkFNRV9OQVZCQVJfRklYRUQiLCJDTEFTU19OQU1FX05BVkJBUl9TTV9GSVhFRCIsIkNMQVNTX05BTUVfTkFWQkFSX01EX0ZJWEVEIiwiQ0xBU1NfTkFNRV9OQVZCQVJfTEdfRklYRUQiLCJDTEFTU19OQU1FX05BVkJBUl9YTF9GSVhFRCIsIkNMQVNTX05BTUVfRk9PVEVSX0ZJWEVEIiwiQ0xBU1NfTkFNRV9GT09URVJfU01fRklYRUQiLCJDTEFTU19OQU1FX0ZPT1RFUl9NRF9GSVhFRCIsIkNMQVNTX05BTUVfRk9PVEVSX0xHX0ZJWEVEIiwiQ0xBU1NfTkFNRV9GT09URVJfWExfRklYRUQiLCJEZWZhdWx0JDIiLCJjb250cm9sc2lkZWJhclNsaWRlIiwic2Nyb2xsYmFyVGhlbWUiLCJzY3JvbGxiYXJBdXRvSGlkZSIsIkNvbnRyb2xTaWRlYmFyIiwiX2NvbmZpZyIsIiRib2R5IiwiJGh0bWwiLCJoaWRlIiwic2hvdyIsIl9maXhIZWlnaHQiLCJfZml4U2Nyb2xsSGVpZ2h0Iiwic2hvdWxkQ2xvc2UiLCJ3aW5kb3ciLCJyZXNpemUiLCJzY3JvbGwiLCJzaG91bGRGaXhIZWlnaHQiLCJoZWlnaHRzIiwiaGVhZGVyIiwib3V0ZXJIZWlnaHQiLCJmb290ZXIiLCJwb3NpdGlvbnMiLCJib3R0b20iLCJNYXRoIiwiYWJzIiwic2Nyb2xsVG9wIiwidG9wIiwibmF2YmFyRml4ZWQiLCJmb290ZXJGaXhlZCIsIiRjb250cm9sU2lkZWJhciIsIiRjb250cm9sc2lkZWJhckNvbnRlbnQiLCJzaWRlYmFySGVpZ2h0Iiwib3ZlcmxheVNjcm9sbGJhcnMiLCJjbGFzc05hbWUiLCJzaXplQXV0b0NhcGFibGUiLCJzY3JvbGxiYXJzIiwiYXV0b0hpZGUiLCJjbGlja1Njcm9sbGluZyIsIm9wZXJhdGlvbiIsIk5BTUUkMyIsIkRBVEFfS0VZJDMiLCJFVkVOVF9LRVkkMyIsIkpRVUVSWV9OT19DT05GTElDVCQzIiwiRVZFTlRfVE9HR0xFRCIsIlNFTEVDVE9SX0RBVEFfVE9HR0xFJDEiLCJTRUxFQ1RPUl9ESVJFQ1RfQ0hBVCIsIkNMQVNTX05BTUVfRElSRUNUX0NIQVRfT1BFTiIsIkRpcmVjdENoYXQiLCJ0b2dnbGVDbGFzcyIsIk5BTUUkNCIsIkRBVEFfS0VZJDQiLCJKUVVFUllfTk9fQ09ORkxJQ1QkNCIsIlNFTEVDVE9SX05BVkJBUiIsIlNFTEVDVE9SX0RST1BET1dOX01FTlUiLCJTRUxFQ1RPUl9EUk9QRE9XTl9NRU5VX0FDVElWRSIsIlNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSIsIkNMQVNTX05BTUVfRFJPUERPV05fUklHSFQiLCJDTEFTU19OQU1FX0RST1BET1dOX1NVQk1FTlUiLCJEZWZhdWx0JDMiLCJEcm9wZG93biIsInRvZ2dsZVN1Ym1lbnUiLCJzaWJsaW5ncyIsIm5leHQiLCJmaXhQb3NpdGlvbiIsImxlbmd0aCIsImxlZnQiLCJyaWdodCIsIm9mZnNldCIsInZpc2libGVQYXJ0Iiwic3RvcFByb3BhZ2F0aW9uIiwidGFyZ2V0IiwicGFyZW50Iiwic2V0VGltZW91dCIsIk5BTUUkNSIsIkRBVEFfS0VZJDUiLCJFVkVOVF9LRVkkNCIsIkpRVUVSWV9OT19DT05GTElDVCQ1IiwiRVZFTlRfRVhQQU5ERUQkMiIsIkVWRU5UX0NPTExBUFNFRCQyIiwiU0VMRUNUT1JfVEFCTEUiLCJTRUxFQ1RPUl9EQVRBX1RPR0dMRSQyIiwiU0VMRUNUT1JfQVJJQV9BVFRSIiwiRXhwYW5kYWJsZVRhYmxlIiwib3B0aW9ucyIsImluaXQiLCJfIiwiJGhlYWRlciIsIiR0eXBlIiwiYXR0ciIsInRvZ2dsZVJvdyIsInRpbWUiLCJzdG9wIiwicmVhZHkiLCJOQU1FJDYiLCJEQVRBX0tFWSQ2IiwiSlFVRVJZX05PX0NPTkZMSUNUJDYiLCJTRUxFQ1RPUl9EQVRBX1dJREdFVCIsIlNFTEVDVE9SX0lDT04iLCJEZWZhdWx0JDQiLCJGdWxsc2NyZWVuIiwiZnVsbHNjcmVlbkVsZW1lbnQiLCJtb3pGdWxsU2NyZWVuRWxlbWVudCIsIndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IiwibXNGdWxsc2NyZWVuRWxlbWVudCIsIndpbmRvd2VkIiwiZnVsbHNjcmVlbiIsImRvY3VtZW50RWxlbWVudCIsInJlcXVlc3RGdWxsc2NyZWVuIiwid2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4iLCJtc1JlcXVlc3RGdWxsc2NyZWVuIiwiZXhpdEZ1bGxzY3JlZW4iLCJ3ZWJraXRFeGl0RnVsbHNjcmVlbiIsIm1zRXhpdEZ1bGxzY3JlZW4iLCJwbHVnaW4iLCJOQU1FJDciLCJEQVRBX0tFWSQ3IiwiSlFVRVJZX05PX0NPTkZMSUNUJDciLCJTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzIiwiU0VMRUNUT1JfREFUQV9UT0dHTEVfQ0xPU0UiLCJTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TQ1JPTExfTEVGVCIsIlNFTEVDVE9SX0RBVEFfVE9HR0xFX1NDUk9MTF9SSUdIVCIsIlNFTEVDVE9SX0RBVEFfVE9HR0xFX0ZVTExTQ1JFRU4iLCJTRUxFQ1RPUl9DT05URU5UX1dSQVBQRVIiLCJTRUxFQ1RPUl9DT05URU5UX0lGUkFNRSIsIlNFTEVDVE9SX1RBQl9OQVYiLCJTRUxFQ1RPUl9UQUJfTkFWQkFSX05BViIsIlNFTEVDVE9SX1RBQl9OQVZCQVJfTkFWX0lURU0iLCJTRUxFQ1RPUl9UQUJfQ09OVEVOVCIsIlNFTEVDVE9SX1RBQl9FTVBUWSIsIlNFTEVDVE9SX1RBQl9MT0FESU5HIiwiU0VMRUNUT1JfU0lERUJBUl9NRU5VX0lURU0iLCJTRUxFQ1RPUl9IRUFERVJfTUVOVV9JVEVNIiwiU0VMRUNUT1JfSEVBREVSX0RST1BET1dOX0lURU0iLCJDTEFTU19OQU1FX0lGUkFNRV9NT0RFIiwiQ0xBU1NfTkFNRV9GVUxMU0NSRUVOX01PREUiLCJEZWZhdWx0JDUiLCJvblRhYkNsaWNrIiwiaXRlbSIsIm9uVGFiQ2hhbmdlZCIsIm9uVGFiQ3JlYXRlZCIsImF1dG9JZnJhbWVNb2RlIiwiYXV0b0l0ZW1BY3RpdmUiLCJhdXRvU2hvd05ld1RhYiIsImxvYWRpbmdTY3JlZW4iLCJ1c2VOYXZiYXJJdGVtcyIsInNjcm9sbE9mZnNldCIsInNjcm9sbEJlaGF2aW9yU3dhcCIsImljb25NYXhpbWl6ZSIsImljb25NaW5pbWl6ZSIsIklGcmFtZSIsImNyZWF0ZVRhYiIsInRpdGxlIiwibGluayIsInVuaXF1ZU5hbWUiLCJhdXRvT3BlbiIsInRhYklkIiwiZmxvb3IiLCJyYW5kb20iLCJuYXZJZCIsIm5ld05hdkl0ZW0iLCJuZXdUYWJJdGVtIiwiJGxvYWRpbmdTY3JlZW4iLCJmYWRlSW4iLCJzd2l0Y2hUYWIiLCJmYWRlT3V0Iiwib3BlblRhYlNpZGViYXIiLCIkaXRlbSIsImNsb25lIiwidW5kZWZpbmVkIiwidGV4dCIsInJlcGxhY2UiLCJyZXBsYWNlQWxsIiwidGFiIiwiX3NldEl0ZW1BY3RpdmUiLCJyZW1vdmVBY3RpdmVUYWIiLCIkbmF2SXRlbSIsIiRuYXZJdGVtUGFyZW50IiwibmF2SXRlbUluZGV4IiwiaW5kZXgiLCJwcmV2TmF2SXRlbUluZGV4IiwiZXEiLCJ0b2dnbGVGdWxsc2NyZWVuIiwiZnJhbWVFbGVtZW50IiwiX3NldHVwTGlzdGVuZXJzIiwiX25hdlNjcm9sbCIsImxlZnRQb3MiLCJzY3JvbGxMZWZ0IiwiYW5pbWF0ZSIsIm1vdXNlZG93biIsIm1vdXNlZG93bkludGVydmFsIiwiY2xlYXJJbnRlcnZhbCIsInNldEludGVydmFsIiwiaHJlZiIsIiRoZWFkZXJNZW51SXRlbSIsIiRoZWFkZXJEcm9wZG93bkl0ZW0iLCIkc2lkZWJhck1lbnVJdGVtIiwiaSIsInByZXZBbGwiLCJ0YWJFbXB0eSIsIndpbmRvd0hlaWdodCIsImNvbnRlbnRXcmFwcGVySGVpZ2h0IiwicGFyc2VGbG9hdCIsIm5hdmJhckhlaWdodCIsIl9kYXRhIiwiX2xlbiIsImFyZ3VtZW50cyIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJhcHBseSIsIk5BTUUkOCIsIkRBVEFfS0VZJDgiLCJKUVVFUllfTk9fQ09ORkxJQ1QkOCIsIlNFTEVDVE9SX0hFQURFUiQxIiwiU0VMRUNUT1JfTUFJTl9TSURFQkFSIiwiU0VMRUNUT1JfU0lERUJBUiIsIlNFTEVDVE9SX0NPTlRFTlQiLCJTRUxFQ1RPUl9DT05UUk9MX1NJREVCQVJfQ09OVEVOVCQxIiwiU0VMRUNUT1JfQ09OVFJPTF9TSURFQkFSX0JUTiIsIlNFTEVDVE9SX0ZPT1RFUiQxIiwiU0VMRUNUT1JfUFVTSE1FTlVfQlROIiwiU0VMRUNUT1JfTE9HSU5fQk9YIiwiU0VMRUNUT1JfUkVHSVNURVJfQk9YIiwiQ0xBU1NfTkFNRV9TSURFQkFSX0ZPQ1VTRUQiLCJDTEFTU19OQU1FX0xBWU9VVF9GSVhFRCQxIiwiQ0xBU1NfTkFNRV9DT05UUk9MX1NJREVCQVJfU0xJREVfT1BFTiIsIkNMQVNTX05BTUVfQ09OVFJPTF9TSURFQkFSX09QRU4kMSIsIkRlZmF1bHQkNiIsInBhbmVsQXV0b0hlaWdodCIsInBhbmVsQXV0b0hlaWdodE1vZGUiLCJsb2dpblJlZ2lzdGVyQXV0b0hlaWdodCIsIkxheW91dCIsImZpeExheW91dEhlaWdodCIsImV4dHJhIiwiY29udHJvbFNpZGViYXIiLCJzaWRlYmFyIiwibWF4IiwiX21heCIsIiRjb250ZW50U2VsZWN0b3IiLCJfaXNGb290ZXJGaXhlZCIsImZpeExvZ2luUmVnaXN0ZXJIZWlnaHQiLCIkc2VsZWN0b3IiLCJib3hIZWlnaHQiLCJwYXJzZUludCIsIm51bWJlcnMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsIk5BTUUkOSIsIkRBVEFfS0VZJDkiLCJFVkVOVF9LRVkkNSIsIkpRVUVSWV9OT19DT05GTElDVCQ5IiwiRVZFTlRfQ09MTEFQU0VEJDMiLCJFVkVOVF9TSE9XTiIsIlNFTEVDVE9SX1RPR0dMRV9CVVRUT04iLCJTRUxFQ1RPUl9CT0RZIiwiU0VMRUNUT1JfT1ZFUkxBWSIsIlNFTEVDVE9SX1dSQVBQRVIiLCJDTEFTU19OQU1FX0NPTExBUFNFRCQxIiwiQ0xBU1NfTkFNRV9PUEVOIiwiQ0xBU1NfTkFNRV9JU19PUEVOSU5HIiwiQ0xBU1NfTkFNRV9DTE9TRUQiLCJEZWZhdWx0JDciLCJhdXRvQ29sbGFwc2VTaXplIiwiZW5hYmxlUmVtZW1iZXIiLCJub1RyYW5zaXRpb25BZnRlclJlbG9hZCIsIlB1c2hNZW51IiwiJGJvZHlTZWxlY3RvciIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJhdXRvQ29sbGFwc2UiLCJyZW1lbWJlciIsInRvZ2dsZVN0YXRlIiwiZ2V0SXRlbSIsIm92ZXJsYXkiLCJpZCIsImJ1dHRvbiIsImN1cnJlbnRUYXJnZXQiLCJjbG9zZXN0IiwiTkFNRSRhIiwiREFUQV9LRVkkYSIsIkpRVUVSWV9OT19DT05GTElDVCRhIiwiQ0xBU1NfTkFNRV9PUEVOJDEiLCJDTEFTU19OQU1FX0lDT05fU0VBUkNIIiwiQ0xBU1NfTkFNRV9JQ09OX0NMT1NFIiwiQ0xBU1NfTkFNRV9IRUFERVIiLCJDTEFTU19OQU1FX1NFQVJDSF9SRVNVTFRTIiwiQ0xBU1NfTkFNRV9MSVNUX0dST1VQIiwiU0VMRUNUT1JfREFUQV9XSURHRVQkMSIsIlNFTEVDVE9SX1NJREVCQVIkMSIsIlNFTEVDVE9SX05BVl9MSU5LIiwiU0VMRUNUT1JfTkFWX1RSRUVWSUVXIiwiU0VMRUNUT1JfU0VBUkNIX0lOUFVUIiwiU0VMRUNUT1JfU0VBUkNIX0JVVFRPTiIsIlNFTEVDVE9SX1NFQVJDSF9JQ09OIiwiU0VMRUNUT1JfU0VBUkNIX0xJU1RfR1JPVVAiLCJTRUxFQ1RPUl9TRUFSQ0hfUkVTVUxUUyIsIlNFTEVDVE9SX1NFQVJDSF9SRVNVTFRTX0dST1VQIiwiRGVmYXVsdCQ4IiwiYXJyb3dTaWduIiwibWluTGVuZ3RoIiwibWF4UmVzdWx0cyIsImhpZ2hsaWdodE5hbWUiLCJoaWdobGlnaHRQYXRoIiwiaGlnaGxpZ2h0Q2xhc3MiLCJub3RGb3VuZFRleHQiLCJTZWFyY2hJdGVtcyIsIlNpZGViYXJTZWFyY2giLCJpdGVtcyIsImFmdGVyIiwiX2FkZE5vdEZvdW5kIiwiY2hpbGQiLCJfcGFyc2VJdGVtIiwic2VhcmNoIiwic2VhcmNoVmFsdWUiLCJ2YWwiLCJ0b0xvd2VyQ2FzZSIsImVtcHR5IiwiY2xvc2UiLCJzZWFyY2hSZXN1bHRzIiwiZmlsdGVyIiwibmFtZSIsImluY2x1ZGVzIiwiZW5kUmVzdWx0cyIsInNsaWNlIiwicmVzdWx0IiwiX3JlbmRlckl0ZW0iLCJwYXRoIiwib3BlbiIsIml0ZW1PYmplY3QiLCJuYXZMaW5rIiwibmF2VHJlZXZpZXciLCJlbmQiLCJfdHJpbVRleHQiLCJwdXNoIiwibmV3UGF0aCIsImNvbmNhdCIsInRyaW0iLCJfdGhpczQiLCJqb2luIiwicmVnRXhwIiwiUmVnRXhwIiwic3RyIiwia2V5Q29kZSIsImxhc3QiLCJmb2N1cyIsInRpbWVyIiwiY2xlYXJUaW1lb3V0IiwiJGZvY3VzZWQiLCJpcyIsInByZXYiLCJOQU1FJGIiLCJEQVRBX0tFWSRiIiwiRVZFTlRfS0VZJDYiLCJKUVVFUllfTk9fQ09ORkxJQ1QkYiIsIkVWRU5UX0lOSVQiLCJFVkVOVF9DUkVBVEVEIiwiRVZFTlRfUkVNT1ZFRCQxIiwiU0VMRUNUT1JfQ09OVEFJTkVSX1RPUF9SSUdIVCIsIlNFTEVDVE9SX0NPTlRBSU5FUl9UT1BfTEVGVCIsIlNFTEVDVE9SX0NPTlRBSU5FUl9CT1RUT01fUklHSFQiLCJTRUxFQ1RPUl9DT05UQUlORVJfQk9UVE9NX0xFRlQiLCJDTEFTU19OQU1FX1RPUF9SSUdIVCIsIkNMQVNTX05BTUVfVE9QX0xFRlQiLCJDTEFTU19OQU1FX0JPVFRPTV9SSUdIVCIsIkNMQVNTX05BTUVfQk9UVE9NX0xFRlQiLCJQT1NJVElPTl9UT1BfUklHSFQiLCJQT1NJVElPTl9UT1BfTEVGVCIsIlBPU0lUSU9OX0JPVFRPTV9SSUdIVCIsIlBPU0lUSU9OX0JPVFRPTV9MRUZUIiwiRGVmYXVsdCQ5IiwicG9zaXRpb24iLCJmaXhlZCIsImF1dG9oaWRlIiwiYXV0b3JlbW92ZSIsImZhZGUiLCJpY29uIiwiaW1hZ2UiLCJpbWFnZUFsdCIsImltYWdlSGVpZ2h0Iiwic3VidGl0bGUiLCJib2R5IiwiVG9hc3RzIiwiX3ByZXBhcmVDb250YWluZXIiLCJjcmVhdGUiLCJ0b2FzdCIsInRvYXN0SGVhZGVyIiwidG9hc3RJbWFnZSIsInRvYXN0Q2xvc2UiLCJfZ2V0Q29udGFpbmVySWQiLCJwcmVwZW5kIiwiY29udGFpbmVyIiwib3B0aW9uIiwiTkFNRSRjIiwiREFUQV9LRVkkYyIsIkpRVUVSWV9OT19DT05GTElDVCRjIiwiU0VMRUNUT1JfREFUQV9UT0dHTEUkNCIsIkNMQVNTX05BTUVfVE9ET19MSVNUX0RPTkUiLCJEZWZhdWx0JGEiLCJvbkNoZWNrIiwib25VbkNoZWNrIiwiVG9kb0xpc3QiLCJwcm9wIiwidW5DaGVjayIsImNoZWNrIiwiJHRvZ2dsZVNlbGVjdG9yIiwiTkFNRSRkIiwiREFUQV9LRVkkZCIsIkVWRU5UX0tFWSQ3IiwiSlFVRVJZX05PX0NPTkZMSUNUJGQiLCJFVkVOVF9FWFBBTkRFRCQzIiwiRVZFTlRfQ09MTEFQU0VEJDQiLCJFVkVOVF9MT0FEX0RBVEFfQVBJIiwiU0VMRUNUT1JfTEkiLCJTRUxFQ1RPUl9MSU5LIiwiU0VMRUNUT1JfVFJFRVZJRVdfTUVOVSIsIlNFTEVDVE9SX09QRU4iLCJTRUxFQ1RPUl9EQVRBX1dJREdFVCQyIiwiQ0xBU1NfTkFNRV9PUEVOJDIiLCJDTEFTU19OQU1FX0lTX09QRU5JTkckMSIsIkNMQVNTX05BTUVfU0lERUJBUl9DT0xMQVBTRUQiLCJEZWZhdWx0JGIiLCJhY2NvcmRpb24iLCJleHBhbmRTaWRlYmFyIiwic2lkZWJhckJ1dHRvblNlbGVjdG9yIiwiVHJlZXZpZXciLCJ0cmVldmlld01lbnUiLCJwYXJlbnRMaSIsImV4cGFuZGVkRXZlbnQiLCJvcGVuTWVudUxpIiwib3BlblRyZWV2aWV3IiwiX2V4cGFuZFNpZGViYXIiLCJjb2xsYXBzZWRFdmVudCIsIiRyZWxhdGl2ZVRhcmdldCIsIiRwYXJlbnQiLCJpc09wZW4iLCJlbGVtZW50SWQiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQyxXQUFVQSxNQUFWLEVBQWtCQyxPQUFsQixFQUEyQjtBQUMxQix3QkFBT0MsT0FBUCxPQUFtQixRQUFuQixJQUErQixhQUFrQixXQUFqRCxHQUErREQsT0FBTyxDQUFDQyxPQUFELEVBQVVDLG1CQUFPLENBQUMsb0RBQUQsQ0FBakIsQ0FBdEUsR0FDQSxRQUE2Q0MsaUNBQU8sQ0FBQyxPQUFELEVBQVkseUVBQVosQ0FBRCxvQ0FBd0JILE9BQXhCO0FBQUE7QUFBQTtBQUFBLGtHQUFuRCxJQUNDRCxDQURELENBREE7QUFHRCxDQUpBLEVBSUMsSUFKRCxFQUlRLFVBQVVFLE9BQVYsRUFBbUJHLENBQW5CLEVBQXNCO0FBQUU7O0FBRS9CLFdBQVNDLHFCQUFULENBQWdDQyxDQUFoQyxFQUFtQztBQUFFLFdBQU9BLENBQUMsSUFBSSxRQUFPQSxDQUFQLE1BQWEsUUFBbEIsSUFBOEIsYUFBYUEsQ0FBM0MsR0FBK0NBLENBQS9DLEdBQW1EO0FBQUUsaUJBQVdBO0FBQWIsS0FBMUQ7QUFBNkU7O0FBRWxILE1BQUlDLFVBQVUsR0FBRyxhQUFhRixxQkFBcUIsQ0FBQ0QsQ0FBRCxDQUFuRDtBQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDRTtBQUNGO0FBQ0E7QUFDQTs7O0FBRUUsTUFBSUksSUFBSSxHQUFHLGFBQVg7QUFDQSxNQUFJQyxRQUFRLEdBQUcsaUJBQWY7QUFDQSxNQUFJQyxTQUFTLEdBQUcsTUFBTUQsUUFBdEI7QUFDQSxNQUFJRSxrQkFBa0IsR0FBR0osVUFBVSxDQUFDLFNBQUQsQ0FBVixDQUFzQkssRUFBdEIsQ0FBeUJKLElBQXpCLENBQXpCO0FBQ0EsTUFBSUssWUFBWSxH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RUFyTCxRQUFNLENBQUNpTSxjQUFQLENBQXNCNWtCLE9BQXRCLEVBQStCLFlBQS9CLEVBQTZDO0FBQUU2a0IsU0FBSyxFQUFFO0FBQVQsR0FBN0M7QUFFRCxDQXRxRkEsQ0FBRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9hZG1pbmx0ZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxyXG4gKiBBZG1pbkxURSB2My4xLjAtcmMgKGh0dHBzOi8vYWRtaW5sdGUuaW8pXHJcbiAqIENvcHlyaWdodCAyMDE0LTIwMjAgQ29sb3JsaWIgPGh0dHBzOi8vY29sb3JsaWIuY29tPlxyXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS9Db2xvcmxpYkhRL0FkbWluTFRFL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXHJcbiAqL1xyXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xyXG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cywgcmVxdWlyZSgnanF1ZXJ5JykpIDpcclxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJywgJ2pxdWVyeSddLCBmYWN0b3J5KSA6XHJcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuYWRtaW5sdGUgPSB7fSwgZ2xvYmFsLmpRdWVyeSkpO1xyXG59KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cywgJCkgeyAndXNlIHN0cmljdCc7XHJcblxyXG4gIGZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdExlZ2FjeSAoZSkgeyByZXR1cm4gZSAmJiB0eXBlb2YgZSA9PT0gJ29iamVjdCcgJiYgJ2RlZmF1bHQnIGluIGUgPyBlIDogeyAnZGVmYXVsdCc6IGUgfTsgfVxyXG5cclxuICB2YXIgJF9fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9faW50ZXJvcERlZmF1bHRMZWdhY3koJCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICogQWRtaW5MVEUgQ2FyZFJlZnJlc2guanNcclxuICAgKiBMaWNlbnNlIE1JVFxyXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICovXHJcbiAgLyoqXHJcbiAgICogQ29uc3RhbnRzXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuICB2YXIgTkFNRSA9ICdDYXJkUmVmcmVzaCc7XHJcbiAgdmFyIERBVEFfS0VZID0gJ2x0ZS5jYXJkcmVmcmVzaCc7XHJcbiAgdmFyIEVWRU5UX0tFWSA9IFwiLlwiICsgREFUQV9LRVk7XHJcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FXTtcclxuICB2YXIgRVZFTlRfTE9BREVEID0gXCJsb2FkZWRcIiArIEVWRU5UX0tFWTtcclxuICB2YXIgRVZFTlRfT1ZFUkxBWV9BRERFRCA9IFwib3ZlcmxheS5hZGRlZFwiICsgRVZFTlRfS0VZO1xyXG4gIHZhciBFVkVOVF9PVkVSTEFZX1JFTU9WRUQgPSBcIm92ZXJsYXkucmVtb3ZlZFwiICsgRVZFTlRfS0VZO1xyXG4gIHZhciBDTEFTU19OQU1FX0NBUkQgPSAnY2FyZCc7XHJcbiAgdmFyIFNFTEVDVE9SX0NBUkQgPSBcIi5cIiArIENMQVNTX05BTUVfQ0FSRDtcclxuICB2YXIgU0VMRUNUT1JfREFUQV9SRUZSRVNIID0gJ1tkYXRhLWNhcmQtd2lkZ2V0PVwiY2FyZC1yZWZyZXNoXCJdJztcclxuICB2YXIgRGVmYXVsdCA9IHtcclxuICAgIHNvdXJjZTogJycsXHJcbiAgICBzb3VyY2VTZWxlY3RvcjogJycsXHJcbiAgICBwYXJhbXM6IHt9LFxyXG4gICAgdHJpZ2dlcjogU0VMRUNUT1JfREFUQV9SRUZSRVNILFxyXG4gICAgY29udGVudDogJy5jYXJkLWJvZHknLFxyXG4gICAgbG9hZEluQ29udGVudDogdHJ1ZSxcclxuICAgIGxvYWRPbkluaXQ6IHRydWUsXHJcbiAgICByZXNwb25zZVR5cGU6ICcnLFxyXG4gICAgb3ZlcmxheVRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cIm92ZXJsYXlcIj48aSBjbGFzcz1cImZhcyBmYS0yeCBmYS1zeW5jLWFsdCBmYS1zcGluXCI+PC9pPjwvZGl2PicsXHJcbiAgICBvbkxvYWRTdGFydDogZnVuY3Rpb24gb25Mb2FkU3RhcnQoKSB7fSxcclxuICAgIG9uTG9hZERvbmU6IGZ1bmN0aW9uIG9uTG9hZERvbmUocmVzcG9uc2UpIHtcclxuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHZhciBDYXJkUmVmcmVzaCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBDYXJkUmVmcmVzaChlbGVtZW50LCBzZXR0aW5ncykge1xyXG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcclxuICAgICAgdGhpcy5fcGFyZW50ID0gZWxlbWVudC5wYXJlbnRzKFNFTEVDVE9SX0NBUkQpLmZpcnN0KCk7XHJcbiAgICAgIHRoaXMuX3NldHRpbmdzID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmV4dGVuZCh7fSwgRGVmYXVsdCwgc2V0dGluZ3MpO1xyXG4gICAgICB0aGlzLl9vdmVybGF5ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX3NldHRpbmdzLm92ZXJsYXlUZW1wbGF0ZSk7XHJcblxyXG4gICAgICBpZiAoZWxlbWVudC5oYXNDbGFzcyhDTEFTU19OQU1FX0NBUkQpKSB7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50ID0gZWxlbWVudDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLnNvdXJjZSA9PT0gJycpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvdXJjZSB1cmwgd2FzIG5vdCBkZWZpbmVkLiBQbGVhc2Ugc3BlY2lmeSBhIHVybCBpbiB5b3VyIENhcmRSZWZyZXNoIHNvdXJjZSBvcHRpb24uJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2YXIgX3Byb3RvID0gQ2FyZFJlZnJlc2gucHJvdG90eXBlO1xyXG5cclxuICAgIF9wcm90by5sb2FkID0gZnVuY3Rpb24gbG9hZCgpIHtcclxuICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgIHRoaXMuX2FkZE92ZXJsYXkoKTtcclxuXHJcbiAgICAgIHRoaXMuX3NldHRpbmdzLm9uTG9hZFN0YXJ0LmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpKTtcclxuXHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5nZXQodGhpcy5fc2V0dGluZ3Muc291cmNlLCB0aGlzLl9zZXR0aW5ncy5wYXJhbXMsIGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgIGlmIChfdGhpcy5fc2V0dGluZ3MubG9hZEluQ29udGVudCkge1xyXG4gICAgICAgICAgaWYgKF90aGlzLl9zZXR0aW5ncy5zb3VyY2VTZWxlY3RvciAhPT0gJycpIHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSAkX19kZWZhdWx0WydkZWZhdWx0J10ocmVzcG9uc2UpLmZpbmQoX3RoaXMuX3NldHRpbmdzLnNvdXJjZVNlbGVjdG9yKS5odG1sKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgX3RoaXMuX3BhcmVudC5maW5kKF90aGlzLl9zZXR0aW5ncy5jb250ZW50KS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF90aGlzLl9zZXR0aW5ncy5vbkxvYWREb25lLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKF90aGlzKSwgcmVzcG9uc2UpO1xyXG5cclxuICAgICAgICBfdGhpcy5fcmVtb3ZlT3ZlcmxheSgpO1xyXG4gICAgICB9LCB0aGlzLl9zZXR0aW5ncy5yZXNwb25zZVR5cGUgIT09ICcnICYmIHRoaXMuX3NldHRpbmdzLnJlc3BvbnNlVHlwZSk7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9MT0FERUQpKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLl9hZGRPdmVybGF5ID0gZnVuY3Rpb24gX2FkZE92ZXJsYXkoKSB7XHJcbiAgICAgIHRoaXMuX3BhcmVudC5hcHBlbmQodGhpcy5fb3ZlcmxheSk7XHJcblxyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkudHJpZ2dlcigkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfT1ZFUkxBWV9BRERFRCkpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8uX3JlbW92ZU92ZXJsYXkgPSBmdW5jdGlvbiBfcmVtb3ZlT3ZlcmxheSgpIHtcclxuICAgICAgdGhpcy5fcGFyZW50LmZpbmQodGhpcy5fb3ZlcmxheSkucmVtb3ZlKCk7XHJcblxyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkudHJpZ2dlcigkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfT1ZFUkxBWV9SRU1PVkVEKSk7XHJcbiAgICB9IC8vIFByaXZhdGVcclxuICAgIDtcclxuXHJcbiAgICBfcHJvdG8uX2luaXQgPSBmdW5jdGlvbiBfaW5pdCgpIHtcclxuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XHJcblxyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZmluZCh0aGlzLl9zZXR0aW5ncy50cmlnZ2VyKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgX3RoaXMyLmxvYWQoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fc2V0dGluZ3MubG9hZE9uSW5pdCkge1xyXG4gICAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgICB9XHJcbiAgICB9IC8vIFN0YXRpY1xyXG4gICAgO1xyXG5cclxuICAgIENhcmRSZWZyZXNoLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xyXG4gICAgICB2YXIgZGF0YSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZKTtcclxuXHJcbiAgICAgIHZhciBfb3B0aW9ucyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5leHRlbmQoe30sIERlZmF1bHQsICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKCkpO1xyXG5cclxuICAgICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgZGF0YSA9IG5ldyBDYXJkUmVmcmVzaCgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcyksIF9vcHRpb25zKTtcclxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSwgdHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycgPyBkYXRhIDogY29uZmlnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnICYmIGNvbmZpZy5tYXRjaCgvbG9hZC8pKSB7XHJcbiAgICAgICAgZGF0YVtjb25maWddKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGF0YS5faW5pdCgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBDYXJkUmVmcmVzaDtcclxuICB9KCk7XHJcbiAgLyoqXHJcbiAgICogRGF0YSBBUElcclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9uKCdjbGljaycsIFNFTEVDVE9SX0RBVEFfUkVGUkVTSCwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBDYXJkUmVmcmVzaC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCAnbG9hZCcpO1xyXG4gIH0pO1xyXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShmdW5jdGlvbiAoKSB7XHJcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfREFUQV9SRUZSRVNIKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgQ2FyZFJlZnJlc2guX2pRdWVyeUludGVyZmFjZS5jYWxsKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuICAvKipcclxuICAgKiBqUXVlcnkgQVBJXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRV0gPSBDYXJkUmVmcmVzaC5falF1ZXJ5SW50ZXJmYWNlO1xyXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FXS5Db25zdHJ1Y3RvciA9IENhcmRSZWZyZXNoO1xyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FXSA9IEpRVUVSWV9OT19DT05GTElDVDtcclxuICAgIHJldHVybiBDYXJkUmVmcmVzaC5falF1ZXJ5SW50ZXJmYWNlO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICogQWRtaW5MVEUgQ2FyZFdpZGdldC5qc1xyXG4gICAqIExpY2Vuc2UgTUlUXHJcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgKi9cclxuICAvKipcclxuICAgKiBDb25zdGFudHNcclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG4gIHZhciBOQU1FJDEgPSAnQ2FyZFdpZGdldCc7XHJcbiAgdmFyIERBVEFfS0VZJDEgPSAnbHRlLmNhcmR3aWRnZXQnO1xyXG4gIHZhciBFVkVOVF9LRVkkMSA9IFwiLlwiICsgREFUQV9LRVkkMTtcclxuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJDEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQxXTtcclxuICB2YXIgRVZFTlRfRVhQQU5ERUQgPSBcImV4cGFuZGVkXCIgKyBFVkVOVF9LRVkkMTtcclxuICB2YXIgRVZFTlRfQ09MTEFQU0VEID0gXCJjb2xsYXBzZWRcIiArIEVWRU5UX0tFWSQxO1xyXG4gIHZhciBFVkVOVF9NQVhJTUlaRUQgPSBcIm1heGltaXplZFwiICsgRVZFTlRfS0VZJDE7XHJcbiAgdmFyIEVWRU5UX01JTklNSVpFRCA9IFwibWluaW1pemVkXCIgKyBFVkVOVF9LRVkkMTtcclxuICB2YXIgRVZFTlRfUkVNT1ZFRCA9IFwicmVtb3ZlZFwiICsgRVZFTlRfS0VZJDE7XHJcbiAgdmFyIENMQVNTX05BTUVfQ0FSRCQxID0gJ2NhcmQnO1xyXG4gIHZhciBDTEFTU19OQU1FX0NPTExBUFNFRCA9ICdjb2xsYXBzZWQtY2FyZCc7XHJcbiAgdmFyIENMQVNTX05BTUVfQ09MTEFQU0lORyA9ICdjb2xsYXBzaW5nLWNhcmQnO1xyXG4gIHZhciBDTEFTU19OQU1FX0VYUEFORElORyA9ICdleHBhbmRpbmctY2FyZCc7XHJcbiAgdmFyIENMQVNTX05BTUVfV0FTX0NPTExBUFNFRCA9ICd3YXMtY29sbGFwc2VkJztcclxuICB2YXIgQ0xBU1NfTkFNRV9NQVhJTUlaRUQgPSAnbWF4aW1pemVkLWNhcmQnO1xyXG4gIHZhciBTRUxFQ1RPUl9EQVRBX1JFTU9WRSA9ICdbZGF0YS1jYXJkLXdpZGdldD1cInJlbW92ZVwiXSc7XHJcbiAgdmFyIFNFTEVDVE9SX0RBVEFfQ09MTEFQU0UgPSAnW2RhdGEtY2FyZC13aWRnZXQ9XCJjb2xsYXBzZVwiXSc7XHJcbiAgdmFyIFNFTEVDVE9SX0RBVEFfTUFYSU1JWkUgPSAnW2RhdGEtY2FyZC13aWRnZXQ9XCJtYXhpbWl6ZVwiXSc7XHJcbiAgdmFyIFNFTEVDVE9SX0NBUkQkMSA9IFwiLlwiICsgQ0xBU1NfTkFNRV9DQVJEJDE7XHJcbiAgdmFyIFNFTEVDVE9SX0NBUkRfSEVBREVSID0gJy5jYXJkLWhlYWRlcic7XHJcbiAgdmFyIFNFTEVDVE9SX0NBUkRfQk9EWSA9ICcuY2FyZC1ib2R5JztcclxuICB2YXIgU0VMRUNUT1JfQ0FSRF9GT09URVIgPSAnLmNhcmQtZm9vdGVyJztcclxuICB2YXIgRGVmYXVsdCQxID0ge1xyXG4gICAgYW5pbWF0aW9uU3BlZWQ6ICdub3JtYWwnLFxyXG4gICAgY29sbGFwc2VUcmlnZ2VyOiBTRUxFQ1RPUl9EQVRBX0NPTExBUFNFLFxyXG4gICAgcmVtb3ZlVHJpZ2dlcjogU0VMRUNUT1JfREFUQV9SRU1PVkUsXHJcbiAgICBtYXhpbWl6ZVRyaWdnZXI6IFNFTEVDVE9SX0RBVEFfTUFYSU1JWkUsXHJcbiAgICBjb2xsYXBzZUljb246ICdmYS1taW51cycsXHJcbiAgICBleHBhbmRJY29uOiAnZmEtcGx1cycsXHJcbiAgICBtYXhpbWl6ZUljb246ICdmYS1leHBhbmQnLFxyXG4gICAgbWluaW1pemVJY29uOiAnZmEtY29tcHJlc3MnXHJcbiAgfTtcclxuXHJcbiAgdmFyIENhcmRXaWRnZXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gQ2FyZFdpZGdldChlbGVtZW50LCBzZXR0aW5ncykge1xyXG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcclxuICAgICAgdGhpcy5fcGFyZW50ID0gZWxlbWVudC5wYXJlbnRzKFNFTEVDVE9SX0NBUkQkMSkuZmlyc3QoKTtcclxuXHJcbiAgICAgIGlmIChlbGVtZW50Lmhhc0NsYXNzKENMQVNTX05BTUVfQ0FSRCQxKSkge1xyXG4gICAgICAgIHRoaXMuX3BhcmVudCA9IGVsZW1lbnQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX3NldHRpbmdzID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmV4dGVuZCh7fSwgRGVmYXVsdCQxLCBzZXR0aW5ncyk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIF9wcm90byA9IENhcmRXaWRnZXQucHJvdG90eXBlO1xyXG5cclxuICAgIF9wcm90by5jb2xsYXBzZSA9IGZ1bmN0aW9uIGNvbGxhcHNlKCkge1xyXG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgdGhpcy5fcGFyZW50LmFkZENsYXNzKENMQVNTX05BTUVfQ09MTEFQU0lORykuY2hpbGRyZW4oU0VMRUNUT1JfQ0FSRF9CT0RZICsgXCIsIFwiICsgU0VMRUNUT1JfQ0FSRF9GT09URVIpLnNsaWRlVXAodGhpcy5fc2V0dGluZ3MuYW5pbWF0aW9uU3BlZWQsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBfdGhpcy5fcGFyZW50LmFkZENsYXNzKENMQVNTX05BTUVfQ09MTEFQU0VEKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNJTkcpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuX3BhcmVudC5maW5kKFwiPiBcIiArIFNFTEVDVE9SX0NBUkRfSEVBREVSICsgXCIgXCIgKyB0aGlzLl9zZXR0aW5ncy5jb2xsYXBzZVRyaWdnZXIgKyBcIiAuXCIgKyB0aGlzLl9zZXR0aW5ncy5jb2xsYXBzZUljb24pLmFkZENsYXNzKHRoaXMuX3NldHRpbmdzLmV4cGFuZEljb24pLnJlbW92ZUNsYXNzKHRoaXMuX3NldHRpbmdzLmNvbGxhcHNlSWNvbik7XHJcblxyXG4gICAgICB0aGlzLl9lbGVtZW50LnRyaWdnZXIoJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX0NPTExBUFNFRCksIHRoaXMuX3BhcmVudCk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by5leHBhbmQgPSBmdW5jdGlvbiBleHBhbmQoKSB7XHJcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xyXG5cclxuICAgICAgdGhpcy5fcGFyZW50LmFkZENsYXNzKENMQVNTX05BTUVfRVhQQU5ESU5HKS5jaGlsZHJlbihTRUxFQ1RPUl9DQVJEX0JPRFkgKyBcIiwgXCIgKyBTRUxFQ1RPUl9DQVJEX0ZPT1RFUikuc2xpZGVEb3duKHRoaXMuX3NldHRpbmdzLmFuaW1hdGlvblNwZWVkLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgX3RoaXMyLl9wYXJlbnQucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRUQpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfRVhQQU5ESU5HKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLl9wYXJlbnQuZmluZChcIj4gXCIgKyBTRUxFQ1RPUl9DQVJEX0hFQURFUiArIFwiIFwiICsgdGhpcy5fc2V0dGluZ3MuY29sbGFwc2VUcmlnZ2VyICsgXCIgLlwiICsgdGhpcy5fc2V0dGluZ3MuZXhwYW5kSWNvbikuYWRkQ2xhc3ModGhpcy5fc2V0dGluZ3MuY29sbGFwc2VJY29uKS5yZW1vdmVDbGFzcyh0aGlzLl9zZXR0aW5ncy5leHBhbmRJY29uKTtcclxuXHJcbiAgICAgIHRoaXMuX2VsZW1lbnQudHJpZ2dlcigkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfRVhQQU5ERUQpLCB0aGlzLl9wYXJlbnQpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKCkge1xyXG4gICAgICB0aGlzLl9wYXJlbnQuc2xpZGVVcCgpO1xyXG5cclxuICAgICAgdGhpcy5fZWxlbWVudC50cmlnZ2VyKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9SRU1PVkVEKSwgdGhpcy5fcGFyZW50KTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcclxuICAgICAgaWYgKHRoaXMuX3BhcmVudC5oYXNDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNFRCkpIHtcclxuICAgICAgICB0aGlzLmV4cGFuZCgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jb2xsYXBzZSgpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8ubWF4aW1pemUgPSBmdW5jdGlvbiBtYXhpbWl6ZSgpIHtcclxuICAgICAgdGhpcy5fcGFyZW50LmZpbmQodGhpcy5fc2V0dGluZ3MubWF4aW1pemVUcmlnZ2VyICsgXCIgLlwiICsgdGhpcy5fc2V0dGluZ3MubWF4aW1pemVJY29uKS5hZGRDbGFzcyh0aGlzLl9zZXR0aW5ncy5taW5pbWl6ZUljb24pLnJlbW92ZUNsYXNzKHRoaXMuX3NldHRpbmdzLm1heGltaXplSWNvbik7XHJcblxyXG4gICAgICB0aGlzLl9wYXJlbnQuY3NzKHtcclxuICAgICAgICBoZWlnaHQ6IHRoaXMuX3BhcmVudC5oZWlnaHQoKSxcclxuICAgICAgICB3aWR0aDogdGhpcy5fcGFyZW50LndpZHRoKCksXHJcbiAgICAgICAgdHJhbnNpdGlvbjogJ2FsbCAuMTVzJ1xyXG4gICAgICB9KS5kZWxheSgxNTApLnF1ZXVlKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgJGVsZW1lbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcyk7XHJcbiAgICAgICAgJGVsZW1lbnQuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9NQVhJTUlaRUQpO1xyXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnaHRtbCcpLmFkZENsYXNzKENMQVNTX05BTUVfTUFYSU1JWkVEKTtcclxuXHJcbiAgICAgICAgaWYgKCRlbGVtZW50Lmhhc0NsYXNzKENMQVNTX05BTUVfQ09MTEFQU0VEKSkge1xyXG4gICAgICAgICAgJGVsZW1lbnQuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9XQVNfQ09MTEFQU0VEKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICRlbGVtZW50LmRlcXVldWUoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLl9lbGVtZW50LnRyaWdnZXIoJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX01BWElNSVpFRCksIHRoaXMuX3BhcmVudCk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by5taW5pbWl6ZSA9IGZ1bmN0aW9uIG1pbmltaXplKCkge1xyXG4gICAgICB0aGlzLl9wYXJlbnQuZmluZCh0aGlzLl9zZXR0aW5ncy5tYXhpbWl6ZVRyaWdnZXIgKyBcIiAuXCIgKyB0aGlzLl9zZXR0aW5ncy5taW5pbWl6ZUljb24pLmFkZENsYXNzKHRoaXMuX3NldHRpbmdzLm1heGltaXplSWNvbikucmVtb3ZlQ2xhc3ModGhpcy5fc2V0dGluZ3MubWluaW1pemVJY29uKTtcclxuXHJcbiAgICAgIHRoaXMuX3BhcmVudC5jc3MoJ2Nzc1RleHQnLCBcImhlaWdodDogXCIgKyB0aGlzLl9wYXJlbnRbMF0uc3R5bGUuaGVpZ2h0ICsgXCIgIWltcG9ydGFudDsgd2lkdGg6IFwiICsgdGhpcy5fcGFyZW50WzBdLnN0eWxlLndpZHRoICsgXCIgIWltcG9ydGFudDsgdHJhbnNpdGlvbjogYWxsIC4xNXM7XCIpLmRlbGF5KDEwKS5xdWV1ZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyICRlbGVtZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpO1xyXG4gICAgICAgICRlbGVtZW50LnJlbW92ZUNsYXNzKENMQVNTX05BTUVfTUFYSU1JWkVEKTtcclxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oJ2h0bWwnKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX01BWElNSVpFRCk7XHJcbiAgICAgICAgJGVsZW1lbnQuY3NzKHtcclxuICAgICAgICAgIGhlaWdodDogJ2luaGVyaXQnLFxyXG4gICAgICAgICAgd2lkdGg6ICdpbmhlcml0J1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoJGVsZW1lbnQuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9XQVNfQ09MTEFQU0VEKSkge1xyXG4gICAgICAgICAgJGVsZW1lbnQucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9XQVNfQ09MTEFQU0VEKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICRlbGVtZW50LmRlcXVldWUoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLl9lbGVtZW50LnRyaWdnZXIoJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX01JTklNSVpFRCksIHRoaXMuX3BhcmVudCk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by50b2dnbGVNYXhpbWl6ZSA9IGZ1bmN0aW9uIHRvZ2dsZU1heGltaXplKCkge1xyXG4gICAgICBpZiAodGhpcy5fcGFyZW50Lmhhc0NsYXNzKENMQVNTX05BTUVfTUFYSU1JWkVEKSkge1xyXG4gICAgICAgIHRoaXMubWluaW1pemUoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMubWF4aW1pemUoKTtcclxuICAgIH0gLy8gUHJpdmF0ZVxyXG4gICAgO1xyXG5cclxuICAgIF9wcm90by5faW5pdCA9IGZ1bmN0aW9uIF9pbml0KGNhcmQpIHtcclxuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XHJcblxyXG4gICAgICB0aGlzLl9wYXJlbnQgPSBjYXJkO1xyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZmluZCh0aGlzLl9zZXR0aW5ncy5jb2xsYXBzZVRyaWdnZXIpLmNsaWNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBfdGhpczMudG9nZ2xlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZmluZCh0aGlzLl9zZXR0aW5ncy5tYXhpbWl6ZVRyaWdnZXIpLmNsaWNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBfdGhpczMudG9nZ2xlTWF4aW1pemUoKTtcclxuICAgICAgfSk7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5maW5kKHRoaXMuX3NldHRpbmdzLnJlbW92ZVRyaWdnZXIpLmNsaWNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBfdGhpczMucmVtb3ZlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSAvLyBTdGF0aWNcclxuICAgIDtcclxuXHJcbiAgICBDYXJkV2lkZ2V0Ll9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xyXG4gICAgICB2YXIgZGF0YSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJDEpO1xyXG5cclxuICAgICAgdmFyIF9vcHRpb25zID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmV4dGVuZCh7fSwgRGVmYXVsdCQxLCAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YSgpKTtcclxuXHJcbiAgICAgIGlmICghZGF0YSkge1xyXG4gICAgICAgIGRhdGEgPSBuZXcgQ2FyZFdpZGdldCgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcyksIF9vcHRpb25zKTtcclxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQxLCB0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJyA/IGRhdGEgOiBjb25maWcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycgJiYgY29uZmlnLm1hdGNoKC9jb2xsYXBzZXxleHBhbmR8cmVtb3ZlfHRvZ2dsZXxtYXhpbWl6ZXxtaW5pbWl6ZXx0b2dnbGVNYXhpbWl6ZS8pKSB7XHJcbiAgICAgICAgZGF0YVtjb25maWddKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICBkYXRhLl9pbml0KCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIENhcmRXaWRnZXQ7XHJcbiAgfSgpO1xyXG4gIC8qKlxyXG4gICAqIERhdGEgQVBJXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuXHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbignY2xpY2snLCBTRUxFQ1RPUl9EQVRBX0NPTExBUFNFLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIENhcmRXaWRnZXQuX2pRdWVyeUludGVyZmFjZS5jYWxsKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSwgJ3RvZ2dsZScpO1xyXG4gIH0pO1xyXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub24oJ2NsaWNrJywgU0VMRUNUT1JfREFUQV9SRU1PVkUsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgQ2FyZFdpZGdldC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCAncmVtb3ZlJyk7XHJcbiAgfSk7XHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbignY2xpY2snLCBTRUxFQ1RPUl9EQVRBX01BWElNSVpFLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIENhcmRXaWRnZXQuX2pRdWVyeUludGVyZmFjZS5jYWxsKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSwgJ3RvZ2dsZU1heGltaXplJyk7XHJcbiAgfSk7XHJcbiAgLyoqXHJcbiAgICogalF1ZXJ5IEFQSVxyXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgKi9cclxuXHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkMV0gPSBDYXJkV2lkZ2V0Ll9qUXVlcnlJbnRlcmZhY2U7XHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkMV0uQ29uc3RydWN0b3IgPSBDYXJkV2lkZ2V0O1xyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQxXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkMV0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkMTtcclxuICAgIHJldHVybiBDYXJkV2lkZ2V0Ll9qUXVlcnlJbnRlcmZhY2U7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgKiBBZG1pbkxURSBDb250cm9sU2lkZWJhci5qc1xyXG4gICAqIExpY2Vuc2UgTUlUXHJcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgKi9cclxuICAvKipcclxuICAgKiBDb25zdGFudHNcclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG4gIHZhciBOQU1FJDIgPSAnQ29udHJvbFNpZGViYXInO1xyXG4gIHZhciBEQVRBX0tFWSQyID0gJ2x0ZS5jb250cm9sc2lkZWJhcic7XHJcbiAgdmFyIEVWRU5UX0tFWSQyID0gXCIuXCIgKyBEQVRBX0tFWSQyO1xyXG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkMiA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDJdO1xyXG4gIHZhciBFVkVOVF9DT0xMQVBTRUQkMSA9IFwiY29sbGFwc2VkXCIgKyBFVkVOVF9LRVkkMjtcclxuICB2YXIgRVZFTlRfRVhQQU5ERUQkMSA9IFwiZXhwYW5kZWRcIiArIEVWRU5UX0tFWSQyO1xyXG4gIHZhciBTRUxFQ1RPUl9DT05UUk9MX1NJREVCQVIgPSAnLmNvbnRyb2wtc2lkZWJhcic7XHJcbiAgdmFyIFNFTEVDVE9SX0NPTlRST0xfU0lERUJBUl9DT05URU5UID0gJy5jb250cm9sLXNpZGViYXItY29udGVudCc7XHJcbiAgdmFyIFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLXdpZGdldD1cImNvbnRyb2wtc2lkZWJhclwiXSc7XHJcbiAgdmFyIFNFTEVDVE9SX0hFQURFUiA9ICcubWFpbi1oZWFkZXInO1xyXG4gIHZhciBTRUxFQ1RPUl9GT09URVIgPSAnLm1haW4tZm9vdGVyJztcclxuICB2YXIgQ0xBU1NfTkFNRV9DT05UUk9MX1NJREVCQVJfQU5JTUFURSA9ICdjb250cm9sLXNpZGViYXItYW5pbWF0ZSc7XHJcbiAgdmFyIENMQVNTX05BTUVfQ09OVFJPTF9TSURFQkFSX09QRU4gPSAnY29udHJvbC1zaWRlYmFyLW9wZW4nO1xyXG4gIHZhciBDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9TTElERSA9ICdjb250cm9sLXNpZGViYXItc2xpZGUtb3Blbic7XHJcbiAgdmFyIENMQVNTX05BTUVfTEFZT1VUX0ZJWEVEID0gJ2xheW91dC1maXhlZCc7XHJcbiAgdmFyIENMQVNTX05BTUVfTkFWQkFSX0ZJWEVEID0gJ2xheW91dC1uYXZiYXItZml4ZWQnO1xyXG4gIHZhciBDTEFTU19OQU1FX05BVkJBUl9TTV9GSVhFRCA9ICdsYXlvdXQtc20tbmF2YmFyLWZpeGVkJztcclxuICB2YXIgQ0xBU1NfTkFNRV9OQVZCQVJfTURfRklYRUQgPSAnbGF5b3V0LW1kLW5hdmJhci1maXhlZCc7XHJcbiAgdmFyIENMQVNTX05BTUVfTkFWQkFSX0xHX0ZJWEVEID0gJ2xheW91dC1sZy1uYXZiYXItZml4ZWQnO1xyXG4gIHZhciBDTEFTU19OQU1FX05BVkJBUl9YTF9GSVhFRCA9ICdsYXlvdXQteGwtbmF2YmFyLWZpeGVkJztcclxuICB2YXIgQ0xBU1NfTkFNRV9GT09URVJfRklYRUQgPSAnbGF5b3V0LWZvb3Rlci1maXhlZCc7XHJcbiAgdmFyIENMQVNTX05BTUVfRk9PVEVSX1NNX0ZJWEVEID0gJ2xheW91dC1zbS1mb290ZXItZml4ZWQnO1xyXG4gIHZhciBDTEFTU19OQU1FX0ZPT1RFUl9NRF9GSVhFRCA9ICdsYXlvdXQtbWQtZm9vdGVyLWZpeGVkJztcclxuICB2YXIgQ0xBU1NfTkFNRV9GT09URVJfTEdfRklYRUQgPSAnbGF5b3V0LWxnLWZvb3Rlci1maXhlZCc7XHJcbiAgdmFyIENMQVNTX05BTUVfRk9PVEVSX1hMX0ZJWEVEID0gJ2xheW91dC14bC1mb290ZXItZml4ZWQnO1xyXG4gIHZhciBEZWZhdWx0JDIgPSB7XHJcbiAgICBjb250cm9sc2lkZWJhclNsaWRlOiB0cnVlLFxyXG4gICAgc2Nyb2xsYmFyVGhlbWU6ICdvcy10aGVtZS1saWdodCcsXHJcbiAgICBzY3JvbGxiYXJBdXRvSGlkZTogJ2wnXHJcbiAgfTtcclxuICAvKipcclxuICAgKiBDbGFzcyBEZWZpbml0aW9uXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuICB2YXIgQ29udHJvbFNpZGViYXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gQ29udHJvbFNpZGViYXIoZWxlbWVudCwgY29uZmlnKSB7XHJcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xyXG4gICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XHJcblxyXG4gICAgICB0aGlzLl9pbml0KCk7XHJcbiAgICB9IC8vIFB1YmxpY1xyXG5cclxuXHJcbiAgICB2YXIgX3Byb3RvID0gQ29udHJvbFNpZGViYXIucHJvdG90eXBlO1xyXG5cclxuICAgIF9wcm90by5jb2xsYXBzZSA9IGZ1bmN0aW9uIGNvbGxhcHNlKCkge1xyXG4gICAgICB2YXIgJGJvZHkgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oJ2JvZHknKTtcclxuICAgICAgdmFyICRodG1sID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdodG1sJyk7IC8vIFNob3cgdGhlIGNvbnRyb2wgc2lkZWJhclxyXG5cclxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5jb250cm9sc2lkZWJhclNsaWRlKSB7XHJcbiAgICAgICAgJGh0bWwuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9DT05UUk9MX1NJREVCQVJfQU5JTUFURSk7XHJcbiAgICAgICAgJGJvZHkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9DT05UUk9MX1NJREVCQVJfU0xJREUpLmRlbGF5KDMwMCkucXVldWUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0NPTlRST0xfU0lERUJBUikuaGlkZSgpO1xyXG4gICAgICAgICAgJGh0bWwucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9DT05UUk9MX1NJREVCQVJfQU5JTUFURSk7XHJcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGVxdWV1ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICRib2R5LnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQ09OVFJPTF9TSURFQkFSX09QRU4pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkudHJpZ2dlcigkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfQ09MTEFQU0VEJDEpKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLnNob3cgPSBmdW5jdGlvbiBzaG93KCkge1xyXG4gICAgICB2YXIgJGJvZHkgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oJ2JvZHknKTtcclxuICAgICAgdmFyICRodG1sID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdodG1sJyk7IC8vIENvbGxhcHNlIHRoZSBjb250cm9sIHNpZGViYXJcclxuXHJcbiAgICAgIGlmICh0aGlzLl9jb25maWcuY29udHJvbHNpZGViYXJTbGlkZSkge1xyXG4gICAgICAgICRodG1sLmFkZENsYXNzKENMQVNTX05BTUVfQ09OVFJPTF9TSURFQkFSX0FOSU1BVEUpO1xyXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9DT05UUk9MX1NJREVCQVIpLnNob3coKS5kZWxheSgxMCkucXVldWUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgJGJvZHkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9DT05UUk9MX1NJREVCQVJfU0xJREUpLmRlbGF5KDMwMCkucXVldWUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkaHRtbC5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9BTklNQVRFKTtcclxuICAgICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRlcXVldWUoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRlcXVldWUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAkYm9keS5hZGRDbGFzcyhDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9PUEVOKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fZml4SGVpZ2h0KCk7XHJcblxyXG4gICAgICB0aGlzLl9maXhTY3JvbGxIZWlnaHQoKTtcclxuXHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9FWFBBTkRFRCQxKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by50b2dnbGUgPSBmdW5jdGlvbiB0b2dnbGUoKSB7XHJcbiAgICAgIHZhciAkYm9keSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnYm9keScpO1xyXG4gICAgICB2YXIgc2hvdWxkQ2xvc2UgPSAkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9PUEVOKSB8fCAkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX0NPTlRST0xfU0lERUJBUl9TTElERSk7XHJcblxyXG4gICAgICBpZiAoc2hvdWxkQ2xvc2UpIHtcclxuICAgICAgICAvLyBDbG9zZSB0aGUgY29udHJvbCBzaWRlYmFyXHJcbiAgICAgICAgdGhpcy5jb2xsYXBzZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIE9wZW4gdGhlIGNvbnRyb2wgc2lkZWJhclxyXG4gICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICB9XHJcbiAgICB9IC8vIFByaXZhdGVcclxuICAgIDtcclxuXHJcbiAgICBfcHJvdG8uX2luaXQgPSBmdW5jdGlvbiBfaW5pdCgpIHtcclxuICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgIHRoaXMuX2ZpeEhlaWdodCgpO1xyXG5cclxuICAgICAgdGhpcy5fZml4U2Nyb2xsSGVpZ2h0KCk7XHJcblxyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10od2luZG93KS5yZXNpemUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIF90aGlzLl9maXhIZWlnaHQoKTtcclxuXHJcbiAgICAgICAgX3RoaXMuX2ZpeFNjcm9sbEhlaWdodCgpO1xyXG4gICAgICB9KTtcclxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgJGJvZHkgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oJ2JvZHknKTtcclxuICAgICAgICB2YXIgc2hvdWxkRml4SGVpZ2h0ID0gJGJvZHkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9DT05UUk9MX1NJREVCQVJfT1BFTikgfHwgJGJvZHkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9DT05UUk9MX1NJREVCQVJfU0xJREUpO1xyXG5cclxuICAgICAgICBpZiAoc2hvdWxkRml4SGVpZ2h0KSB7XHJcbiAgICAgICAgICBfdGhpcy5fZml4U2Nyb2xsSGVpZ2h0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLl9maXhTY3JvbGxIZWlnaHQgPSBmdW5jdGlvbiBfZml4U2Nyb2xsSGVpZ2h0KCkge1xyXG4gICAgICB2YXIgJGJvZHkgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oJ2JvZHknKTtcclxuXHJcbiAgICAgIGlmICghJGJvZHkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9MQVlPVVRfRklYRUQpKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2YXIgaGVpZ2h0cyA9IHtcclxuICAgICAgICBzY3JvbGw6ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkuaGVpZ2h0KCksXHJcbiAgICAgICAgd2luZG93OiAkX19kZWZhdWx0WydkZWZhdWx0J10od2luZG93KS5oZWlnaHQoKSxcclxuICAgICAgICBoZWFkZXI6ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9IRUFERVIpLm91dGVySGVpZ2h0KCksXHJcbiAgICAgICAgZm9vdGVyOiAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfRk9PVEVSKS5vdXRlckhlaWdodCgpXHJcbiAgICAgIH07XHJcbiAgICAgIHZhciBwb3NpdGlvbnMgPSB7XHJcbiAgICAgICAgYm90dG9tOiBNYXRoLmFicyhoZWlnaHRzLndpbmRvdyArICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh3aW5kb3cpLnNjcm9sbFRvcCgpIC0gaGVpZ2h0cy5zY3JvbGwpLFxyXG4gICAgICAgIHRvcDogJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykuc2Nyb2xsVG9wKClcclxuICAgICAgfTtcclxuICAgICAgdmFyIG5hdmJhckZpeGVkID0gKCRib2R5Lmhhc0NsYXNzKENMQVNTX05BTUVfTkFWQkFSX0ZJWEVEKSB8fCAkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX05BVkJBUl9TTV9GSVhFRCkgfHwgJGJvZHkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9OQVZCQVJfTURfRklYRUQpIHx8ICRib2R5Lmhhc0NsYXNzKENMQVNTX05BTUVfTkFWQkFSX0xHX0ZJWEVEKSB8fCAkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX05BVkJBUl9YTF9GSVhFRCkpICYmICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9IRUFERVIpLmNzcygncG9zaXRpb24nKSA9PT0gJ2ZpeGVkJztcclxuICAgICAgdmFyIGZvb3RlckZpeGVkID0gKCRib2R5Lmhhc0NsYXNzKENMQVNTX05BTUVfRk9PVEVSX0ZJWEVEKSB8fCAkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZPT1RFUl9TTV9GSVhFRCkgfHwgJGJvZHkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GT09URVJfTURfRklYRUQpIHx8ICRib2R5Lmhhc0NsYXNzKENMQVNTX05BTUVfRk9PVEVSX0xHX0ZJWEVEKSB8fCAkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZPT1RFUl9YTF9GSVhFRCkpICYmICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9GT09URVIpLmNzcygncG9zaXRpb24nKSA9PT0gJ2ZpeGVkJztcclxuICAgICAgdmFyICRjb250cm9sU2lkZWJhciA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9DT05UUk9MX1NJREVCQVIpO1xyXG4gICAgICB2YXIgJGNvbnRyb2xzaWRlYmFyQ29udGVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9DT05UUk9MX1NJREVCQVIgKyBcIiwgXCIgKyBTRUxFQ1RPUl9DT05UUk9MX1NJREVCQVIgKyBcIiBcIiArIFNFTEVDVE9SX0NPTlRST0xfU0lERUJBUl9DT05URU5UKTtcclxuXHJcbiAgICAgIGlmIChwb3NpdGlvbnMudG9wID09PSAwICYmIHBvc2l0aW9ucy5ib3R0b20gPT09IDApIHtcclxuICAgICAgICAkY29udHJvbFNpZGViYXIuY3NzKHtcclxuICAgICAgICAgIGJvdHRvbTogaGVpZ2h0cy5mb290ZXIsXHJcbiAgICAgICAgICB0b3A6IGhlaWdodHMuaGVhZGVyXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJGNvbnRyb2xzaWRlYmFyQ29udGVudC5jc3MoJ2hlaWdodCcsIGhlaWdodHMud2luZG93IC0gKGhlaWdodHMuaGVhZGVyICsgaGVpZ2h0cy5mb290ZXIpKTtcclxuICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbnMuYm90dG9tIDw9IGhlaWdodHMuZm9vdGVyKSB7XHJcbiAgICAgICAgaWYgKGZvb3RlckZpeGVkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgdmFyIHRvcCA9IGhlaWdodHMuaGVhZGVyIC0gcG9zaXRpb25zLnRvcDtcclxuICAgICAgICAgICRjb250cm9sU2lkZWJhci5jc3MoJ2JvdHRvbScsIGhlaWdodHMuZm9vdGVyIC0gcG9zaXRpb25zLmJvdHRvbSkuY3NzKCd0b3AnLCB0b3AgPj0gMCA/IHRvcCA6IDApO1xyXG4gICAgICAgICAgJGNvbnRyb2xzaWRlYmFyQ29udGVudC5jc3MoJ2hlaWdodCcsIGhlaWdodHMud2luZG93IC0gKGhlaWdodHMuZm9vdGVyIC0gcG9zaXRpb25zLmJvdHRvbSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAkY29udHJvbFNpZGViYXIuY3NzKCdib3R0b20nLCBoZWlnaHRzLmZvb3Rlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHBvc2l0aW9ucy50b3AgPD0gaGVpZ2h0cy5oZWFkZXIpIHtcclxuICAgICAgICBpZiAobmF2YmFyRml4ZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAkY29udHJvbFNpZGViYXIuY3NzKCd0b3AnLCBoZWlnaHRzLmhlYWRlciAtIHBvc2l0aW9ucy50b3ApO1xyXG4gICAgICAgICAgJGNvbnRyb2xzaWRlYmFyQ29udGVudC5jc3MoJ2hlaWdodCcsIGhlaWdodHMud2luZG93IC0gKGhlaWdodHMuaGVhZGVyIC0gcG9zaXRpb25zLnRvcCkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAkY29udHJvbFNpZGViYXIuY3NzKCd0b3AnLCBoZWlnaHRzLmhlYWRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKG5hdmJhckZpeGVkID09PSBmYWxzZSkge1xyXG4gICAgICAgICRjb250cm9sU2lkZWJhci5jc3MoJ3RvcCcsIDApO1xyXG4gICAgICAgICRjb250cm9sc2lkZWJhckNvbnRlbnQuY3NzKCdoZWlnaHQnLCBoZWlnaHRzLndpbmRvdyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgJGNvbnRyb2xTaWRlYmFyLmNzcygndG9wJywgaGVpZ2h0cy5oZWFkZXIpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by5fZml4SGVpZ2h0ID0gZnVuY3Rpb24gX2ZpeEhlaWdodCgpIHtcclxuICAgICAgdmFyICRib2R5ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdib2R5Jyk7XHJcblxyXG4gICAgICBpZiAoISRib2R5Lmhhc0NsYXNzKENMQVNTX05BTUVfTEFZT1VUX0ZJWEVEKSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdmFyIGhlaWdodHMgPSB7XHJcbiAgICAgICAgd2luZG93OiAkX19kZWZhdWx0WydkZWZhdWx0J10od2luZG93KS5oZWlnaHQoKSxcclxuICAgICAgICBoZWFkZXI6ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9IRUFERVIpLm91dGVySGVpZ2h0KCksXHJcbiAgICAgICAgZm9vdGVyOiAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfRk9PVEVSKS5vdXRlckhlaWdodCgpXHJcbiAgICAgIH07XHJcbiAgICAgIHZhciBzaWRlYmFySGVpZ2h0ID0gaGVpZ2h0cy53aW5kb3cgLSBoZWlnaHRzLmhlYWRlcjtcclxuXHJcbiAgICAgIGlmICgkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZPT1RFUl9GSVhFRCkgfHwgJGJvZHkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GT09URVJfU01fRklYRUQpIHx8ICRib2R5Lmhhc0NsYXNzKENMQVNTX05BTUVfRk9PVEVSX01EX0ZJWEVEKSB8fCAkYm9keS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZPT1RFUl9MR19GSVhFRCkgfHwgJGJvZHkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GT09URVJfWExfRklYRUQpKSB7XHJcbiAgICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9GT09URVIpLmNzcygncG9zaXRpb24nKSA9PT0gJ2ZpeGVkJykge1xyXG4gICAgICAgICAgc2lkZWJhckhlaWdodCA9IGhlaWdodHMud2luZG93IC0gaGVpZ2h0cy5oZWFkZXIgLSBoZWlnaHRzLmZvb3RlcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciAkY29udHJvbFNpZGViYXIgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfQ09OVFJPTF9TSURFQkFSICsgXCIgXCIgKyBTRUxFQ1RPUl9DT05UUk9MX1NJREVCQVJfQ09OVEVOVCk7XHJcbiAgICAgICRjb250cm9sU2lkZWJhci5jc3MoJ2hlaWdodCcsIHNpZGViYXJIZWlnaHQpO1xyXG5cclxuICAgICAgaWYgKHR5cGVvZiAkX19kZWZhdWx0WydkZWZhdWx0J10uZm4ub3ZlcmxheVNjcm9sbGJhcnMgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgJGNvbnRyb2xTaWRlYmFyLm92ZXJsYXlTY3JvbGxiYXJzKHtcclxuICAgICAgICAgIGNsYXNzTmFtZTogdGhpcy5fY29uZmlnLnNjcm9sbGJhclRoZW1lLFxyXG4gICAgICAgICAgc2l6ZUF1dG9DYXBhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgc2Nyb2xsYmFyczoge1xyXG4gICAgICAgICAgICBhdXRvSGlkZTogdGhpcy5fY29uZmlnLnNjcm9sbGJhckF1dG9IaWRlLFxyXG4gICAgICAgICAgICBjbGlja1Njcm9sbGluZzogdHJ1ZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IC8vIFN0YXRpY1xyXG4gICAgO1xyXG5cclxuICAgIENvbnRyb2xTaWRlYmFyLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKG9wZXJhdGlvbikge1xyXG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgZGF0YSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJDIpO1xyXG5cclxuICAgICAgICB2YXIgX29wdGlvbnMgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZXh0ZW5kKHt9LCBEZWZhdWx0JDIsICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKCkpO1xyXG5cclxuICAgICAgICBpZiAoIWRhdGEpIHtcclxuICAgICAgICAgIGRhdGEgPSBuZXcgQ29udHJvbFNpZGViYXIodGhpcywgX29wdGlvbnMpO1xyXG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkMiwgZGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZGF0YVtvcGVyYXRpb25dID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG9wZXJhdGlvbiArIFwiIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YVtvcGVyYXRpb25dKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gQ29udHJvbFNpZGViYXI7XHJcbiAgfSgpO1xyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9uKCdjbGljaycsIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgQ29udHJvbFNpZGViYXIuX2pRdWVyeUludGVyZmFjZS5jYWxsKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSwgJ3RvZ2dsZScpO1xyXG4gIH0pO1xyXG4gIC8qKlxyXG4gICAqIGpRdWVyeSBBUElcclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDJdID0gQ29udHJvbFNpZGViYXIuX2pRdWVyeUludGVyZmFjZTtcclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQyXS5Db25zdHJ1Y3RvciA9IENvbnRyb2xTaWRlYmFyO1xyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQyXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkMl0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkMjtcclxuICAgIHJldHVybiBDb250cm9sU2lkZWJhci5falF1ZXJ5SW50ZXJmYWNlO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICogQWRtaW5MVEUgRGlyZWN0Q2hhdC5qc1xyXG4gICAqIExpY2Vuc2UgTUlUXHJcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgKi9cclxuICAvKipcclxuICAgKiBDb25zdGFudHNcclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG4gIHZhciBOQU1FJDMgPSAnRGlyZWN0Q2hhdCc7XHJcbiAgdmFyIERBVEFfS0VZJDMgPSAnbHRlLmRpcmVjdGNoYXQnO1xyXG4gIHZhciBFVkVOVF9LRVkkMyA9IFwiLlwiICsgREFUQV9LRVkkMztcclxuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJDMgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQzXTtcclxuICB2YXIgRVZFTlRfVE9HR0xFRCA9IFwidG9nZ2xlZFwiICsgRVZFTlRfS0VZJDM7XHJcbiAgdmFyIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDEgPSAnW2RhdGEtd2lkZ2V0PVwiY2hhdC1wYW5lLXRvZ2dsZVwiXSc7XHJcbiAgdmFyIFNFTEVDVE9SX0RJUkVDVF9DSEFUID0gJy5kaXJlY3QtY2hhdCc7XHJcbiAgdmFyIENMQVNTX05BTUVfRElSRUNUX0NIQVRfT1BFTiA9ICdkaXJlY3QtY2hhdC1jb250YWN0cy1vcGVuJztcclxuICAvKipcclxuICAgKiBDbGFzcyBEZWZpbml0aW9uXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuICB2YXIgRGlyZWN0Q2hhdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBEaXJlY3RDaGF0KGVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIF9wcm90byA9IERpcmVjdENoYXQucHJvdG90eXBlO1xyXG5cclxuICAgIF9wcm90by50b2dnbGUgPSBmdW5jdGlvbiB0b2dnbGUoKSB7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5wYXJlbnRzKFNFTEVDVE9SX0RJUkVDVF9DSEFUKS5maXJzdCgpLnRvZ2dsZUNsYXNzKENMQVNTX05BTUVfRElSRUNUX0NIQVRfT1BFTik7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9UT0dHTEVEKSk7XHJcbiAgICB9IC8vIFN0YXRpY1xyXG4gICAgO1xyXG5cclxuICAgIERpcmVjdENoYXQuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBkYXRhID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkMyk7XHJcblxyXG4gICAgICAgIGlmICghZGF0YSkge1xyXG4gICAgICAgICAgZGF0YSA9IG5ldyBEaXJlY3RDaGF0KCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSk7XHJcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQzLCBkYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGFbY29uZmlnXSgpO1xyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIERpcmVjdENoYXQ7XHJcbiAgfSgpO1xyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9uKCdjbGljaycsIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDEsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgRGlyZWN0Q2hhdC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCAndG9nZ2xlJyk7XHJcbiAgfSk7XHJcbiAgLyoqXHJcbiAgICogalF1ZXJ5IEFQSVxyXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgKi9cclxuXHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkM10gPSBEaXJlY3RDaGF0Ll9qUXVlcnlJbnRlcmZhY2U7XHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkM10uQ29uc3RydWN0b3IgPSBEaXJlY3RDaGF0O1xyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQzXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkM10gPSBKUVVFUllfTk9fQ09ORkxJQ1QkMztcclxuICAgIHJldHVybiBEaXJlY3RDaGF0Ll9qUXVlcnlJbnRlcmZhY2U7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgKiBBZG1pbkxURSBEcm9wZG93bi5qc1xyXG4gICAqIExpY2Vuc2UgTUlUXHJcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgKi9cclxuICAvKipcclxuICAgKiBDb25zdGFudHNcclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG4gIHZhciBOQU1FJDQgPSAnRHJvcGRvd24nO1xyXG4gIHZhciBEQVRBX0tFWSQ0ID0gJ2x0ZS5kcm9wZG93bic7XHJcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCQ0ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNF07XHJcbiAgdmFyIFNFTEVDVE9SX05BVkJBUiA9ICcubmF2YmFyJztcclxuICB2YXIgU0VMRUNUT1JfRFJPUERPV05fTUVOVSA9ICcuZHJvcGRvd24tbWVudSc7XHJcbiAgdmFyIFNFTEVDVE9SX0RST1BET1dOX01FTlVfQUNUSVZFID0gJy5kcm9wZG93bi1tZW51LnNob3cnO1xyXG4gIHZhciBTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUgPSAnW2RhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIl0nO1xyXG4gIHZhciBDTEFTU19OQU1FX0RST1BET1dOX1JJR0hUID0gJ2Ryb3Bkb3duLW1lbnUtcmlnaHQnO1xyXG4gIHZhciBDTEFTU19OQU1FX0RST1BET1dOX1NVQk1FTlUgPSAnZHJvcGRvd24tc3VibWVudSc7IC8vIFRPRE86IHRoaXMgaXMgdW51c2VkOyBzaG91bGQgYmUgcmVtb3ZlZCBhbG9uZyB3aXRoIHRoZSBleHRlbmQ/XHJcblxyXG4gIHZhciBEZWZhdWx0JDMgPSB7fTtcclxuICAvKipcclxuICAgKiBDbGFzcyBEZWZpbml0aW9uXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuICB2YXIgRHJvcGRvd24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gRHJvcGRvd24oZWxlbWVudCwgY29uZmlnKSB7XHJcbiAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcclxuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgICB9IC8vIFB1YmxpY1xyXG5cclxuXHJcbiAgICB2YXIgX3Byb3RvID0gRHJvcGRvd24ucHJvdG90eXBlO1xyXG5cclxuICAgIF9wcm90by50b2dnbGVTdWJtZW51ID0gZnVuY3Rpb24gdG9nZ2xlU3VibWVudSgpIHtcclxuICAgICAgdGhpcy5fZWxlbWVudC5zaWJsaW5ncygpLnNob3coKS50b2dnbGVDbGFzcygnc2hvdycpO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLl9lbGVtZW50Lm5leHQoKS5oYXNDbGFzcygnc2hvdycpKSB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5wYXJlbnRzKFNFTEVDVE9SX0RST1BET1dOX01FTlUpLmZpcnN0KCkuZmluZCgnLnNob3cnKS5yZW1vdmVDbGFzcygnc2hvdycpLmhpZGUoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fZWxlbWVudC5wYXJlbnRzKCdsaS5uYXYtaXRlbS5kcm9wZG93bi5zaG93Jykub24oJ2hpZGRlbi5icy5kcm9wZG93bicsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oJy5kcm9wZG93bi1zdWJtZW51IC5zaG93JykucmVtb3ZlQ2xhc3MoJ3Nob3cnKS5oaWRlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8uZml4UG9zaXRpb24gPSBmdW5jdGlvbiBmaXhQb3NpdGlvbigpIHtcclxuICAgICAgdmFyICRlbGVtZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0RST1BET1dOX01FTlVfQUNUSVZFKTtcclxuXHJcbiAgICAgIGlmICgkZWxlbWVudC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICgkZWxlbWVudC5oYXNDbGFzcyhDTEFTU19OQU1FX0RST1BET1dOX1JJR0hUKSkge1xyXG4gICAgICAgICRlbGVtZW50LmNzcyh7XHJcbiAgICAgICAgICBsZWZ0OiAnaW5oZXJpdCcsXHJcbiAgICAgICAgICByaWdodDogMFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICRlbGVtZW50LmNzcyh7XHJcbiAgICAgICAgICBsZWZ0OiAwLFxyXG4gICAgICAgICAgcmlnaHQ6ICdpbmhlcml0J1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2YXIgb2Zmc2V0ID0gJGVsZW1lbnQub2Zmc2V0KCk7XHJcbiAgICAgIHZhciB3aWR0aCA9ICRlbGVtZW50LndpZHRoKCk7XHJcbiAgICAgIHZhciB2aXNpYmxlUGFydCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh3aW5kb3cpLndpZHRoKCkgLSBvZmZzZXQubGVmdDtcclxuXHJcbiAgICAgIGlmIChvZmZzZXQubGVmdCA8IDApIHtcclxuICAgICAgICAkZWxlbWVudC5jc3Moe1xyXG4gICAgICAgICAgbGVmdDogJ2luaGVyaXQnLFxyXG4gICAgICAgICAgcmlnaHQ6IG9mZnNldC5sZWZ0IC0gNVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKHZpc2libGVQYXJ0IDwgd2lkdGgpIHtcclxuICAgICAgICAkZWxlbWVudC5jc3Moe1xyXG4gICAgICAgICAgbGVmdDogJ2luaGVyaXQnLFxyXG4gICAgICAgICAgcmlnaHQ6IDBcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSAvLyBTdGF0aWNcclxuICAgIDtcclxuXHJcbiAgICBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQ0KTtcclxuXHJcbiAgICAgICAgdmFyIF9jb25maWcgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZXh0ZW5kKHt9LCBEZWZhdWx0JDMsICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKCkpO1xyXG5cclxuICAgICAgICBpZiAoIWRhdGEpIHtcclxuICAgICAgICAgIGRhdGEgPSBuZXcgRHJvcGRvd24oJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCBfY29uZmlnKTtcclxuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJDQsIGRhdGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gJ3RvZ2dsZVN1Ym1lbnUnIHx8IGNvbmZpZyA9PT0gJ2ZpeFBvc2l0aW9uJykge1xyXG4gICAgICAgICAgZGF0YVtjb25maWddKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIERyb3Bkb3duO1xyXG4gIH0oKTtcclxuICAvKipcclxuICAgKiBEYXRhIEFQSVxyXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgKi9cclxuXHJcblxyXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9EUk9QRE9XTl9NRU5VICsgXCIgXCIgKyBTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIERyb3Bkb3duLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcyksICd0b2dnbGVTdWJtZW51Jyk7XHJcbiAgfSk7XHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX05BVkJBUiArIFwiIFwiICsgU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShldmVudC50YXJnZXQpLnBhcmVudCgpLmhhc0NsYXNzKENMQVNTX05BTUVfRFJPUERPV05fU1VCTUVOVSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCAnZml4UG9zaXRpb24nKTtcclxuICAgIH0sIDEpO1xyXG4gIH0pO1xyXG4gIC8qKlxyXG4gICAqIGpRdWVyeSBBUElcclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDRdID0gRHJvcGRvd24uX2pRdWVyeUludGVyZmFjZTtcclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ0XS5Db25zdHJ1Y3RvciA9IERyb3Bkb3duO1xyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ0XS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNF0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkNDtcclxuICAgIHJldHVybiBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICogQWRtaW5MVEUgRXhwYW5kYWJsZVRhYmxlLmpzXHJcbiAgICogTGljZW5zZSBNSVRcclxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAqL1xyXG4gIC8qKlxyXG4gICAgKiBDb25zdGFudHNcclxuICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgKi9cclxuXHJcbiAgdmFyIE5BTUUkNSA9ICdFeHBhbmRhYmxlVGFibGUnO1xyXG4gIHZhciBEQVRBX0tFWSQ1ID0gJ2x0ZS5leHBhbmRhYmxlVGFibGUnO1xyXG4gIHZhciBFVkVOVF9LRVkkNCA9IFwiLlwiICsgREFUQV9LRVkkNTtcclxuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJDUgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ1XTtcclxuICB2YXIgRVZFTlRfRVhQQU5ERUQkMiA9IFwiZXhwYW5kZWRcIiArIEVWRU5UX0tFWSQ0O1xyXG4gIHZhciBFVkVOVF9DT0xMQVBTRUQkMiA9IFwiY29sbGFwc2VkXCIgKyBFVkVOVF9LRVkkNDtcclxuICB2YXIgU0VMRUNUT1JfVEFCTEUgPSAnLmV4cGFuZGFibGUtdGFibGUnO1xyXG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQyID0gJ1tkYXRhLXdpZGdldD1cImV4cGFuZGFibGUtdGFibGVcIl0nO1xyXG4gIHZhciBTRUxFQ1RPUl9BUklBX0FUVFIgPSAnYXJpYS1leHBhbmRlZCc7XHJcbiAgLyoqXHJcbiAgICAqIENsYXNzIERlZmluaXRpb25cclxuICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgKi9cclxuXHJcbiAgdmFyIEV4cGFuZGFibGVUYWJsZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBFeHBhbmRhYmxlVGFibGUoZWxlbWVudCwgb3B0aW9ucykge1xyXG4gICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgICB9IC8vIFB1YmxpY1xyXG5cclxuXHJcbiAgICB2YXIgX3Byb3RvID0gRXhwYW5kYWJsZVRhYmxlLnByb3RvdHlwZTtcclxuXHJcbiAgICBfcHJvdG8uaW5pdCA9IGZ1bmN0aW9uIGluaXQoKSB7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9EQVRBX1RPR0dMRSQyKS5lYWNoKGZ1bmN0aW9uIChfLCAkaGVhZGVyKSB7XHJcbiAgICAgICAgdmFyICR0eXBlID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKCRoZWFkZXIpLmF0dHIoU0VMRUNUT1JfQVJJQV9BVFRSKTtcclxuICAgICAgICB2YXIgJGJvZHkgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oJGhlYWRlcikubmV4dCgpLmNoaWxkcmVuKCkuZmlyc3QoKS5jaGlsZHJlbigpO1xyXG5cclxuICAgICAgICBpZiAoJHR5cGUgPT09ICd0cnVlJykge1xyXG4gICAgICAgICAgJGJvZHkuc2hvdygpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoJHR5cGUgPT09ICdmYWxzZScpIHtcclxuICAgICAgICAgICRib2R5LmhpZGUoKTtcclxuICAgICAgICAgICRib2R5LnBhcmVudCgpLnBhcmVudCgpLmFkZENsYXNzKCdkLW5vbmUnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8udG9nZ2xlUm93ID0gZnVuY3Rpb24gdG9nZ2xlUm93KCkge1xyXG4gICAgICB2YXIgJGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xyXG4gICAgICB2YXIgdGltZSA9IDUwMDtcclxuICAgICAgdmFyICR0eXBlID0gJGVsZW1lbnQuYXR0cihTRUxFQ1RPUl9BUklBX0FUVFIpO1xyXG4gICAgICB2YXIgJGJvZHkgPSAkZWxlbWVudC5uZXh0KCkuY2hpbGRyZW4oKS5maXJzdCgpLmNoaWxkcmVuKCk7XHJcbiAgICAgICRib2R5LnN0b3AoKTtcclxuXHJcbiAgICAgIGlmICgkdHlwZSA9PT0gJ3RydWUnKSB7XHJcbiAgICAgICAgJGJvZHkuc2xpZGVVcCh0aW1lLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAkZWxlbWVudC5uZXh0KCkuYWRkQ2xhc3MoJ2Qtbm9uZScpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICRlbGVtZW50LmF0dHIoU0VMRUNUT1JfQVJJQV9BVFRSLCAnZmFsc2UnKTtcclxuICAgICAgICAkZWxlbWVudC50cmlnZ2VyKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9DT0xMQVBTRUQkMikpO1xyXG4gICAgICB9IGVsc2UgaWYgKCR0eXBlID09PSAnZmFsc2UnKSB7XHJcbiAgICAgICAgJGVsZW1lbnQubmV4dCgpLnJlbW92ZUNsYXNzKCdkLW5vbmUnKTtcclxuICAgICAgICAkYm9keS5zbGlkZURvd24odGltZSk7XHJcbiAgICAgICAgJGVsZW1lbnQuYXR0cihTRUxFQ1RPUl9BUklBX0FUVFIsICd0cnVlJyk7XHJcbiAgICAgICAgJGVsZW1lbnQudHJpZ2dlcigkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfRVhQQU5ERUQkMikpO1xyXG4gICAgICB9XHJcbiAgICB9IC8vIFN0YXRpY1xyXG4gICAgO1xyXG5cclxuICAgIEV4cGFuZGFibGVUYWJsZS5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShvcGVyYXRpb24pIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQ1KTtcclxuXHJcbiAgICAgICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgICBkYXRhID0gbmV3IEV4cGFuZGFibGVUYWJsZSgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykpO1xyXG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkNSwgZGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIG9wZXJhdGlvbiA9PT0gJ3N0cmluZycgJiYgb3BlcmF0aW9uLm1hdGNoKC9pbml0fHRvZ2dsZVJvdy8pKSB7XHJcbiAgICAgICAgICBkYXRhW29wZXJhdGlvbl0oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gRXhwYW5kYWJsZVRhYmxlO1xyXG4gIH0oKTtcclxuICAvKipcclxuICAgICogRGF0YSBBUElcclxuICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgKi9cclxuXHJcblxyXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9UQUJMRSkucmVhZHkoZnVuY3Rpb24gKCkge1xyXG4gICAgRXhwYW5kYWJsZVRhYmxlLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcyksICdpbml0Jyk7XHJcbiAgfSk7XHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbignY2xpY2snLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQyLCBmdW5jdGlvbiAoKSB7XHJcbiAgICBFeHBhbmRhYmxlVGFibGUuX2pRdWVyeUludGVyZmFjZS5jYWxsKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSwgJ3RvZ2dsZVJvdycpO1xyXG4gIH0pO1xyXG4gIC8qKlxyXG4gICAgKiBqUXVlcnkgQVBJXHJcbiAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgICovXHJcblxyXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDVdID0gRXhwYW5kYWJsZVRhYmxlLl9qUXVlcnlJbnRlcmZhY2U7XHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNV0uQ29uc3RydWN0b3IgPSBFeHBhbmRhYmxlVGFibGU7XHJcblxyXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ1XSA9IEpRVUVSWV9OT19DT05GTElDVCQ1O1xyXG4gICAgcmV0dXJuIEV4cGFuZGFibGVUYWJsZS5falF1ZXJ5SW50ZXJmYWNlO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICogQWRtaW5MVEUgRnVsbHNjcmVlbi5qc1xyXG4gICAqIExpY2Vuc2UgTUlUXHJcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgKi9cclxuICAvKipcclxuICAgKiBDb25zdGFudHNcclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG4gIHZhciBOQU1FJDYgPSAnRnVsbHNjcmVlbic7XHJcbiAgdmFyIERBVEFfS0VZJDYgPSAnbHRlLmZ1bGxzY3JlZW4nO1xyXG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkNiA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDZdO1xyXG4gIHZhciBTRUxFQ1RPUl9EQVRBX1dJREdFVCA9ICdbZGF0YS13aWRnZXQ9XCJmdWxsc2NyZWVuXCJdJztcclxuICB2YXIgU0VMRUNUT1JfSUNPTiA9IFNFTEVDVE9SX0RBVEFfV0lER0VUICsgXCIgaVwiO1xyXG4gIHZhciBEZWZhdWx0JDQgPSB7XHJcbiAgICBtaW5pbWl6ZUljb246ICdmYS1jb21wcmVzcy1hcnJvd3MtYWx0JyxcclxuICAgIG1heGltaXplSWNvbjogJ2ZhLWV4cGFuZC1hcnJvd3MtYWx0J1xyXG4gIH07XHJcbiAgLyoqXHJcbiAgICogQ2xhc3MgRGVmaW5pdGlvblxyXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgKi9cclxuXHJcbiAgdmFyIEZ1bGxzY3JlZW4gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gRnVsbHNjcmVlbihfZWxlbWVudCwgX29wdGlvbnMpIHtcclxuICAgICAgdGhpcy5lbGVtZW50ID0gX2VsZW1lbnQ7XHJcbiAgICAgIHRoaXMub3B0aW9ucyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5leHRlbmQoe30sIERlZmF1bHQkNCwgX29wdGlvbnMpO1xyXG4gICAgfSAvLyBQdWJsaWNcclxuXHJcblxyXG4gICAgdmFyIF9wcm90byA9IEZ1bGxzY3JlZW4ucHJvdG90eXBlO1xyXG5cclxuICAgIF9wcm90by50b2dnbGUgPSBmdW5jdGlvbiB0b2dnbGUoKSB7XHJcbiAgICAgIGlmIChkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCB8fCBkb2N1bWVudC5tb3pGdWxsU2NyZWVuRWxlbWVudCB8fCBkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCB8fCBkb2N1bWVudC5tc0Z1bGxzY3JlZW5FbGVtZW50KSB7XHJcbiAgICAgICAgdGhpcy53aW5kb3dlZCgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZnVsbHNjcmVlbigpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by5mdWxsc2NyZWVuID0gZnVuY3Rpb24gZnVsbHNjcmVlbigpIHtcclxuICAgICAgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbikge1xyXG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbigpO1xyXG4gICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xyXG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbigpO1xyXG4gICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5tc1JlcXVlc3RGdWxsc2NyZWVuKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm1zUmVxdWVzdEZ1bGxzY3JlZW4oKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0lDT04pLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5tYXhpbWl6ZUljb24pLmFkZENsYXNzKHRoaXMub3B0aW9ucy5taW5pbWl6ZUljb24pO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8ud2luZG93ZWQgPSBmdW5jdGlvbiB3aW5kb3dlZCgpIHtcclxuICAgICAgaWYgKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcclxuICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbikge1xyXG4gICAgICAgIGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbikge1xyXG4gICAgICAgIGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0lDT04pLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5taW5pbWl6ZUljb24pLmFkZENsYXNzKHRoaXMub3B0aW9ucy5tYXhpbWl6ZUljb24pO1xyXG4gICAgfSAvLyBTdGF0aWNcclxuICAgIDtcclxuXHJcbiAgICBGdWxsc2NyZWVuLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xyXG4gICAgICB2YXIgZGF0YSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJDYpO1xyXG5cclxuICAgICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgZGF0YSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciBfb3B0aW9ucyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5leHRlbmQoe30sIERlZmF1bHQkNCwgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgPyBjb25maWcgOiBkYXRhKTtcclxuXHJcbiAgICAgIHZhciBwbHVnaW4gPSBuZXcgRnVsbHNjcmVlbigkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcyksIF9vcHRpb25zKTtcclxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkNiwgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgPyBjb25maWcgOiBkYXRhKTtcclxuXHJcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJyAmJiBjb25maWcubWF0Y2goL3RvZ2dsZXxmdWxsc2NyZWVufHdpbmRvd2VkLykpIHtcclxuICAgICAgICBwbHVnaW5bY29uZmlnXSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBsdWdpbi5pbml0KCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIEZ1bGxzY3JlZW47XHJcbiAgfSgpO1xyXG4gIC8qKlxyXG4gICAgKiBEYXRhIEFQSVxyXG4gICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAqL1xyXG5cclxuXHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbignY2xpY2snLCBTRUxFQ1RPUl9EQVRBX1dJREdFVCwgZnVuY3Rpb24gKCkge1xyXG4gICAgRnVsbHNjcmVlbi5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCAndG9nZ2xlJyk7XHJcbiAgfSk7XHJcbiAgLyoqXHJcbiAgICogalF1ZXJ5IEFQSVxyXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgKi9cclxuXHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNl0gPSBGdWxsc2NyZWVuLl9qUXVlcnlJbnRlcmZhY2U7XHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNl0uQ29uc3RydWN0b3IgPSBGdWxsc2NyZWVuO1xyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ2XS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNl0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkNjtcclxuICAgIHJldHVybiBGdWxsc2NyZWVuLl9qUXVlcnlJbnRlcmZhY2U7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgKiBBZG1pbkxURSBJRnJhbWUuanNcclxuICAgKiBMaWNlbnNlIE1JVFxyXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICovXHJcbiAgLyoqXHJcbiAgICogQ29uc3RhbnRzXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuICB2YXIgTkFNRSQ3ID0gJ0lGcmFtZSc7XHJcbiAgdmFyIERBVEFfS0VZJDcgPSAnbHRlLmlmcmFtZSc7XHJcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCQ3ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkN107XHJcbiAgdmFyIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDMgPSAnW2RhdGEtd2lkZ2V0PVwiaWZyYW1lXCJdJztcclxuICB2YXIgU0VMRUNUT1JfREFUQV9UT0dHTEVfQ0xPU0UgPSAnW2RhdGEtd2lkZ2V0PVwiaWZyYW1lLWNsb3NlXCJdJztcclxuICB2YXIgU0VMRUNUT1JfREFUQV9UT0dHTEVfU0NST0xMX0xFRlQgPSAnW2RhdGEtd2lkZ2V0PVwiaWZyYW1lLXNjcm9sbGxlZnRcIl0nO1xyXG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TQ1JPTExfUklHSFQgPSAnW2RhdGEtd2lkZ2V0PVwiaWZyYW1lLXNjcm9sbHJpZ2h0XCJdJztcclxuICB2YXIgU0VMRUNUT1JfREFUQV9UT0dHTEVfRlVMTFNDUkVFTiA9ICdbZGF0YS13aWRnZXQ9XCJpZnJhbWUtZnVsbHNjcmVlblwiXSc7XHJcbiAgdmFyIFNFTEVDVE9SX0NPTlRFTlRfV1JBUFBFUiA9ICcuY29udGVudC13cmFwcGVyJztcclxuICB2YXIgU0VMRUNUT1JfQ09OVEVOVF9JRlJBTUUgPSBTRUxFQ1RPUl9DT05URU5UX1dSQVBQRVIgKyBcIiBpZnJhbWVcIjtcclxuICB2YXIgU0VMRUNUT1JfVEFCX05BViA9IFNFTEVDVE9SX0RBVEFfVE9HR0xFJDMgKyBcIi5pZnJhbWUtbW9kZSAubmF2XCI7XHJcbiAgdmFyIFNFTEVDVE9SX1RBQl9OQVZCQVJfTkFWID0gU0VMRUNUT1JfREFUQV9UT0dHTEUkMyArIFwiLmlmcmFtZS1tb2RlIC5uYXZiYXItbmF2XCI7XHJcbiAgdmFyIFNFTEVDVE9SX1RBQl9OQVZCQVJfTkFWX0lURU0gPSBTRUxFQ1RPUl9UQUJfTkFWQkFSX05BViArIFwiIC5uYXYtaXRlbVwiO1xyXG4gIHZhciBTRUxFQ1RPUl9UQUJfQ09OVEVOVCA9IFNFTEVDVE9SX0RBVEFfVE9HR0xFJDMgKyBcIi5pZnJhbWUtbW9kZSAudGFiLWNvbnRlbnRcIjtcclxuICB2YXIgU0VMRUNUT1JfVEFCX0VNUFRZID0gU0VMRUNUT1JfVEFCX0NPTlRFTlQgKyBcIiAudGFiLWVtcHR5XCI7XHJcbiAgdmFyIFNFTEVDVE9SX1RBQl9MT0FESU5HID0gU0VMRUNUT1JfVEFCX0NPTlRFTlQgKyBcIiAudGFiLWxvYWRpbmdcIjtcclxuICB2YXIgU0VMRUNUT1JfU0lERUJBUl9NRU5VX0lURU0gPSAnLm1haW4tc2lkZWJhciAubmF2LWl0ZW0gPiBhLm5hdi1saW5rJztcclxuICB2YXIgU0VMRUNUT1JfSEVBREVSX01FTlVfSVRFTSA9ICcubWFpbi1oZWFkZXIgLm5hdi1pdGVtIGEubmF2LWxpbmsnO1xyXG4gIHZhciBTRUxFQ1RPUl9IRUFERVJfRFJPUERPV05fSVRFTSA9ICcubWFpbi1oZWFkZXIgYS5kcm9wZG93bi1pdGVtJztcclxuICB2YXIgQ0xBU1NfTkFNRV9JRlJBTUVfTU9ERSA9ICdpZnJhbWUtbW9kZSc7XHJcbiAgdmFyIENMQVNTX05BTUVfRlVMTFNDUkVFTl9NT0RFID0gJ2lmcmFtZS1tb2RlLWZ1bGxzY3JlZW4nO1xyXG4gIHZhciBEZWZhdWx0JDUgPSB7XHJcbiAgICBvblRhYkNsaWNrOiBmdW5jdGlvbiBvblRhYkNsaWNrKGl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICB9LFxyXG4gICAgb25UYWJDaGFuZ2VkOiBmdW5jdGlvbiBvblRhYkNoYW5nZWQoaXRlbSkge1xyXG4gICAgICByZXR1cm4gaXRlbTtcclxuICAgIH0sXHJcbiAgICBvblRhYkNyZWF0ZWQ6IGZ1bmN0aW9uIG9uVGFiQ3JlYXRlZChpdGVtKSB7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfSxcclxuICAgIGF1dG9JZnJhbWVNb2RlOiB0cnVlLFxyXG4gICAgYXV0b0l0ZW1BY3RpdmU6IHRydWUsXHJcbiAgICBhdXRvU2hvd05ld1RhYjogdHJ1ZSxcclxuICAgIGxvYWRpbmdTY3JlZW46IHRydWUsXHJcbiAgICB1c2VOYXZiYXJJdGVtczogdHJ1ZSxcclxuICAgIHNjcm9sbE9mZnNldDogNDAsXHJcbiAgICBzY3JvbGxCZWhhdmlvclN3YXA6IGZhbHNlLFxyXG4gICAgaWNvbk1heGltaXplOiAnZmEtZXhwYW5kJyxcclxuICAgIGljb25NaW5pbWl6ZTogJ2ZhLWNvbXByZXNzJ1xyXG4gIH07XHJcbiAgLyoqXHJcbiAgICogQ2xhc3MgRGVmaW5pdGlvblxyXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgKi9cclxuXHJcbiAgdmFyIElGcmFtZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBJRnJhbWUoZWxlbWVudCwgY29uZmlnKSB7XHJcbiAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcclxuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XHJcblxyXG4gICAgICB0aGlzLl9pbml0KCk7XHJcbiAgICB9IC8vIFB1YmxpY1xyXG5cclxuXHJcbiAgICB2YXIgX3Byb3RvID0gSUZyYW1lLnByb3RvdHlwZTtcclxuXHJcbiAgICBfcHJvdG8ub25UYWJDbGljayA9IGZ1bmN0aW9uIG9uVGFiQ2xpY2soaXRlbSkge1xyXG4gICAgICB0aGlzLl9jb25maWcub25UYWJDbGljayhpdGVtKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLm9uVGFiQ2hhbmdlZCA9IGZ1bmN0aW9uIG9uVGFiQ2hhbmdlZChpdGVtKSB7XHJcbiAgICAgIHRoaXMuX2NvbmZpZy5vblRhYkNoYW5nZWQoaXRlbSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by5vblRhYkNyZWF0ZWQgPSBmdW5jdGlvbiBvblRhYkNyZWF0ZWQoaXRlbSkge1xyXG4gICAgICB0aGlzLl9jb25maWcub25UYWJDcmVhdGVkKGl0ZW0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8uY3JlYXRlVGFiID0gZnVuY3Rpb24gY3JlYXRlVGFiKHRpdGxlLCBsaW5rLCB1bmlxdWVOYW1lLCBhdXRvT3Blbikge1xyXG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgdmFyIHRhYklkID0gXCJwYW5lbC1cIiArIHVuaXF1ZU5hbWUgKyBcIi1cIiArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDApO1xyXG4gICAgICB2YXIgbmF2SWQgPSBcInRhYi1cIiArIHVuaXF1ZU5hbWUgKyBcIi1cIiArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDApO1xyXG4gICAgICB2YXIgbmV3TmF2SXRlbSA9IFwiPGxpIGNsYXNzPVxcXCJuYXYtaXRlbVxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj48YSBjbGFzcz1cXFwibmF2LWxpbmtcXFwiIGRhdGEtdG9nZ2xlPVxcXCJyb3dcXFwiIGlkPVxcXCJcIiArIG5hdklkICsgXCJcXFwiIGhyZWY9XFxcIiNcIiArIHRhYklkICsgXCJcXFwiIHJvbGU9XFxcInRhYlxcXCIgYXJpYS1jb250cm9scz1cXFwiXCIgKyB0YWJJZCArIFwiXFxcIiBhcmlhLXNlbGVjdGVkPVxcXCJmYWxzZVxcXCI+XCIgKyB0aXRsZSArIFwiPC9hPjwvbGk+XCI7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9UQUJfTkFWQkFSX05BVikuYXBwZW5kKG5ld05hdkl0ZW0pO1xyXG4gICAgICB2YXIgbmV3VGFiSXRlbSA9IFwiPGRpdiBjbGFzcz1cXFwidGFiLXBhbmUgZmFkZVxcXCIgaWQ9XFxcIlwiICsgdGFiSWQgKyBcIlxcXCIgcm9sZT1cXFwidGFicGFuZWxcXFwiIGFyaWEtbGFiZWxsZWRieT1cXFwiXCIgKyBuYXZJZCArIFwiXFxcIj48aWZyYW1lIHNyYz1cXFwiXCIgKyBsaW5rICsgXCJcXFwiPjwvaWZyYW1lPjwvZGl2PlwiO1xyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfVEFCX0NPTlRFTlQpLmFwcGVuZChuZXdUYWJJdGVtKTtcclxuXHJcbiAgICAgIGlmIChhdXRvT3Blbikge1xyXG4gICAgICAgIGlmICh0aGlzLl9jb25maWcubG9hZGluZ1NjcmVlbikge1xyXG4gICAgICAgICAgdmFyICRsb2FkaW5nU2NyZWVuID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1RBQl9MT0FESU5HKTtcclxuICAgICAgICAgICRsb2FkaW5nU2NyZWVuLmZhZGVJbigpO1xyXG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRhYklkICsgXCIgaWZyYW1lXCIpLnJlYWR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBfdGhpcy5fY29uZmlnLmxvYWRpbmdTY3JlZW4gPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgICAgX3RoaXMuc3dpdGNoVGFiKFwiI1wiICsgbmF2SWQsIF90aGlzLl9jb25maWcubG9hZGluZ1NjcmVlbik7XHJcblxyXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJGxvYWRpbmdTY3JlZW4uZmFkZU91dCgpO1xyXG4gICAgICAgICAgICAgIH0sIF90aGlzLl9jb25maWcubG9hZGluZ1NjcmVlbik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgX3RoaXMuc3dpdGNoVGFiKFwiI1wiICsgbmF2SWQsIF90aGlzLl9jb25maWcubG9hZGluZ1NjcmVlbik7XHJcblxyXG4gICAgICAgICAgICAgICRsb2FkaW5nU2NyZWVuLmZhZGVPdXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3dpdGNoVGFiKFwiI1wiICsgbmF2SWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5vblRhYkNyZWF0ZWQoJF9fZGVmYXVsdFsnZGVmYXVsdCddKFwiI1wiICsgbmF2SWQpKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLm9wZW5UYWJTaWRlYmFyID0gZnVuY3Rpb24gb3BlblRhYlNpZGViYXIoaXRlbSwgYXV0b09wZW4pIHtcclxuICAgICAgaWYgKGF1dG9PcGVuID09PSB2b2lkIDApIHtcclxuICAgICAgICBhdXRvT3BlbiA9IHRoaXMuX2NvbmZpZy5hdXRvU2hvd05ld1RhYjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdmFyICRpdGVtID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGl0ZW0pLmNsb25lKCk7XHJcblxyXG4gICAgICBpZiAoJGl0ZW0uYXR0cignaHJlZicpID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAkaXRlbSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShpdGVtKS5wYXJlbnQoJ2EnKS5jbG9uZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAkaXRlbS5maW5kKCcucmlnaHQnKS5yZW1vdmUoKTtcclxuICAgICAgdmFyIHRpdGxlID0gJGl0ZW0uZmluZCgncCcpLnRleHQoKTtcclxuXHJcbiAgICAgIGlmICh0aXRsZSA9PT0gJycpIHtcclxuICAgICAgICB0aXRsZSA9ICRpdGVtLnRleHQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdmFyIGxpbmsgPSAkaXRlbS5hdHRyKCdocmVmJyk7XHJcblxyXG4gICAgICBpZiAobGluayA9PT0gJyMnIHx8IGxpbmsgPT09ICcnIHx8IGxpbmsgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jcmVhdGVUYWIodGl0bGUsIGxpbmssIGxpbmsucmVwbGFjZSgnLmh0bWwnLCAnJykucmVwbGFjZSgnLi8nLCAnJykucmVwbGFjZUFsbCgnLycsICctJyksIGF1dG9PcGVuKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLnN3aXRjaFRhYiA9IGZ1bmN0aW9uIHN3aXRjaFRhYihpdGVtKSB7XHJcbiAgICAgIHZhciAkaXRlbSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShpdGVtKTtcclxuICAgICAgdmFyIHRhYklkID0gJGl0ZW0uYXR0cignaHJlZicpO1xyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfVEFCX0VNUFRZKS5oaWRlKCk7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9UQUJfTkFWQkFSX05BViArIFwiIC5hY3RpdmVcIikudGFiKCdkaXNwb3NlJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG5cclxuICAgICAgdGhpcy5fZml4SGVpZ2h0KCk7XHJcblxyXG4gICAgICAkaXRlbS50YWIoJ3Nob3cnKTtcclxuICAgICAgJGl0ZW0ucGFyZW50cygnbGknKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgIHRoaXMub25UYWJDaGFuZ2VkKCRpdGVtKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9jb25maWcuYXV0b0l0ZW1BY3RpdmUpIHtcclxuICAgICAgICB0aGlzLl9zZXRJdGVtQWN0aXZlKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0YWJJZCArIFwiIGlmcmFtZVwiKS5hdHRyKCdzcmMnKSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLnJlbW92ZUFjdGl2ZVRhYiA9IGZ1bmN0aW9uIHJlbW92ZUFjdGl2ZVRhYigpIHtcclxuICAgICAgdmFyICRuYXZJdGVtID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1RBQl9OQVZCQVJfTkFWX0lURU0gKyBcIi5hY3RpdmVcIik7XHJcbiAgICAgIHZhciAkbmF2SXRlbVBhcmVudCA9ICRuYXZJdGVtLnBhcmVudCgpO1xyXG4gICAgICB2YXIgbmF2SXRlbUluZGV4ID0gJG5hdkl0ZW0uaW5kZXgoKTtcclxuICAgICAgJG5hdkl0ZW0ucmVtb3ZlKCk7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnLnRhYi1wYW5lLmFjdGl2ZScpLnJlbW92ZSgpO1xyXG5cclxuICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9UQUJfQ09OVEVOVCkuY2hpbGRyZW4oKS5sZW5ndGggPT0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1RBQl9FTVBUWSArIFwiLCBcIiArIFNFTEVDVE9SX1RBQl9MT0FESU5HKS5sZW5ndGgpIHtcclxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfVEFCX0VNUFRZKS5zaG93KCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdmFyIHByZXZOYXZJdGVtSW5kZXggPSBuYXZJdGVtSW5kZXggLSAxO1xyXG4gICAgICAgIHRoaXMuc3dpdGNoVGFiKCRuYXZJdGVtUGFyZW50LmNoaWxkcmVuKCkuZXEocHJldk5hdkl0ZW1JbmRleCkuZmluZCgnYScpKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8udG9nZ2xlRnVsbHNjcmVlbiA9IGZ1bmN0aW9uIHRvZ2dsZUZ1bGxzY3JlZW4oKSB7XHJcbiAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10oJ2JvZHknKS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZVTExTQ1JFRU5fTU9ERSkpIHtcclxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfREFUQV9UT0dHTEVfRlVMTFNDUkVFTiArIFwiIGlcIikucmVtb3ZlQ2xhc3ModGhpcy5fY29uZmlnLmljb25NaW5pbWl6ZSkuYWRkQ2xhc3ModGhpcy5fY29uZmlnLmljb25NYXhpbWl6ZSk7XHJcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdib2R5JykucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9GVUxMU0NSRUVOX01PREUpO1xyXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9UQUJfRU1QVFkgKyBcIiwgXCIgKyBTRUxFQ1RPUl9UQUJfTE9BRElORykuaGVpZ2h0KCdhdXRvJyk7XHJcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0NPTlRFTlRfV1JBUFBFUikuaGVpZ2h0KCdhdXRvJyk7XHJcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0NPTlRFTlRfSUZSQU1FKS5oZWlnaHQoJ2F1dG8nKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfREFUQV9UT0dHTEVfRlVMTFNDUkVFTiArIFwiIGlcIikucmVtb3ZlQ2xhc3ModGhpcy5fY29uZmlnLmljb25NYXhpbWl6ZSkuYWRkQ2xhc3ModGhpcy5fY29uZmlnLmljb25NaW5pbWl6ZSk7XHJcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdib2R5JykuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9GVUxMU0NSRUVOX01PREUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10od2luZG93KS50cmlnZ2VyKCdyZXNpemUnKTtcclxuXHJcbiAgICAgIHRoaXMuX2ZpeEhlaWdodCh0cnVlKTtcclxuICAgIH0gLy8gUHJpdmF0ZVxyXG4gICAgO1xyXG5cclxuICAgIF9wcm90by5faW5pdCA9IGZ1bmN0aW9uIF9pbml0KCkge1xyXG4gICAgICBpZiAod2luZG93LmZyYW1lRWxlbWVudCAmJiB0aGlzLl9jb25maWcuYXV0b0lmcmFtZU1vZGUpIHtcclxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oJ2JvZHknKS5hZGRDbGFzcyhDTEFTU19OQU1FX0lGUkFNRV9NT0RFKTtcclxuICAgICAgfSBlbHNlIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfQ09OVEVOVF9XUkFQUEVSKS5oYXNDbGFzcyhDTEFTU19OQU1FX0lGUkFNRV9NT0RFKSkge1xyXG4gICAgICAgIHRoaXMuX3NldHVwTGlzdGVuZXJzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2ZpeEhlaWdodCh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8uX25hdlNjcm9sbCA9IGZ1bmN0aW9uIF9uYXZTY3JvbGwob2Zmc2V0KSB7XHJcbiAgICAgIHZhciBsZWZ0UG9zID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1RBQl9OQVZCQVJfTkFWKS5zY3JvbGxMZWZ0KCk7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9UQUJfTkFWQkFSX05BVikuYW5pbWF0ZSh7XHJcbiAgICAgICAgc2Nyb2xsTGVmdDogbGVmdFBvcyArIG9mZnNldFxyXG4gICAgICB9LCAyNTAsICdsaW5lYXInKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLl9zZXR1cExpc3RlbmVycyA9IGZ1bmN0aW9uIF9zZXR1cExpc3RlbmVycygpIHtcclxuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XHJcblxyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10od2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgX3RoaXMyLl9maXhIZWlnaHQoKTtcclxuICAgICAgICB9LCAxKTtcclxuICAgICAgfSk7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub24oJ2NsaWNrJywgU0VMRUNUT1JfU0lERUJBUl9NRU5VX0lURU0sIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICBfdGhpczIub3BlblRhYlNpZGViYXIoZS50YXJnZXQpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9jb25maWcudXNlTmF2YmFySXRlbXMpIHtcclxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9uKCdjbGljaycsIFNFTEVDVE9SX0hFQURFUl9NRU5VX0lURU0gKyBcIiwgXCIgKyBTRUxFQ1RPUl9IRUFERVJfRFJPUERPV05fSVRFTSwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICBfdGhpczIub3BlblRhYlNpZGViYXIoZS50YXJnZXQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9uKCdjbGljaycsIFNFTEVDVE9SX1RBQl9OQVZCQVJfTkFWX0lURU0sIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICBfdGhpczIub25UYWJDbGljayhlLnRhcmdldCk7XHJcblxyXG4gICAgICAgIF90aGlzMi5zd2l0Y2hUYWIoZS50YXJnZXQpO1xyXG4gICAgICB9KTtcclxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbignY2xpY2snLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9DTE9TRSwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgIF90aGlzMi5yZW1vdmVBY3RpdmVUYWIoKTtcclxuICAgICAgfSk7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub24oJ2NsaWNrJywgU0VMRUNUT1JfREFUQV9UT0dHTEVfRlVMTFNDUkVFTiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgIF90aGlzMi50b2dnbGVGdWxsc2NyZWVuKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB2YXIgbW91c2Vkb3duID0gZmFsc2U7XHJcbiAgICAgIHZhciBtb3VzZWRvd25JbnRlcnZhbCA9IG51bGw7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub24oJ21vdXNlZG93bicsIFNFTEVDVE9SX0RBVEFfVE9HR0xFX1NDUk9MTF9MRUZULCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBjbGVhckludGVydmFsKG1vdXNlZG93bkludGVydmFsKTtcclxuICAgICAgICB2YXIgc2Nyb2xsT2Zmc2V0ID0gX3RoaXMyLl9jb25maWcuc2Nyb2xsT2Zmc2V0O1xyXG5cclxuICAgICAgICBpZiAoIV90aGlzMi5fY29uZmlnLnNjcm9sbEJlaGF2aW9yU3dhcCkge1xyXG4gICAgICAgICAgc2Nyb2xsT2Zmc2V0ID0gLXNjcm9sbE9mZnNldDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG1vdXNlZG93biA9IHRydWU7XHJcblxyXG4gICAgICAgIF90aGlzMi5fbmF2U2Nyb2xsKHNjcm9sbE9mZnNldCk7XHJcblxyXG4gICAgICAgIG1vdXNlZG93bkludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgX3RoaXMyLl9uYXZTY3JvbGwoc2Nyb2xsT2Zmc2V0KTtcclxuICAgICAgICB9LCAyNTApO1xyXG4gICAgICB9KTtcclxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbignbW91c2Vkb3duJywgU0VMRUNUT1JfREFUQV9UT0dHTEVfU0NST0xMX1JJR0hULCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBjbGVhckludGVydmFsKG1vdXNlZG93bkludGVydmFsKTtcclxuICAgICAgICB2YXIgc2Nyb2xsT2Zmc2V0ID0gX3RoaXMyLl9jb25maWcuc2Nyb2xsT2Zmc2V0O1xyXG5cclxuICAgICAgICBpZiAoX3RoaXMyLl9jb25maWcuc2Nyb2xsQmVoYXZpb3JTd2FwKSB7XHJcbiAgICAgICAgICBzY3JvbGxPZmZzZXQgPSAtc2Nyb2xsT2Zmc2V0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbW91c2Vkb3duID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgX3RoaXMyLl9uYXZTY3JvbGwoc2Nyb2xsT2Zmc2V0KTtcclxuXHJcbiAgICAgICAgbW91c2Vkb3duSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBfdGhpczIuX25hdlNjcm9sbChzY3JvbGxPZmZzZXQpO1xyXG4gICAgICAgIH0sIDI1MCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9uKCdtb3VzZXVwJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmIChtb3VzZWRvd24pIHtcclxuICAgICAgICAgIG1vdXNlZG93biA9IGZhbHNlO1xyXG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChtb3VzZWRvd25JbnRlcnZhbCk7XHJcbiAgICAgICAgICBtb3VzZWRvd25JbnRlcnZhbCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLl9zZXRJdGVtQWN0aXZlID0gZnVuY3Rpb24gX3NldEl0ZW1BY3RpdmUoaHJlZikge1xyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfU0lERUJBUl9NRU5VX0lURU0gKyBcIiwgXCIgKyBTRUxFQ1RPUl9IRUFERVJfRFJPUERPV05fSVRFTSkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfSEVBREVSX01FTlVfSVRFTSkucGFyZW50KCkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgICB2YXIgJGhlYWRlck1lbnVJdGVtID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0hFQURFUl9NRU5VX0lURU0gKyBcIltocmVmJD1cXFwiXCIgKyBocmVmICsgXCJcXFwiXVwiKTtcclxuICAgICAgdmFyICRoZWFkZXJEcm9wZG93bkl0ZW0gPSAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfSEVBREVSX0RST1BET1dOX0lURU0gKyBcIltocmVmJD1cXFwiXCIgKyBocmVmICsgXCJcXFwiXVwiKTtcclxuICAgICAgdmFyICRzaWRlYmFyTWVudUl0ZW0gPSAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfU0lERUJBUl9NRU5VX0lURU0gKyBcIltocmVmJD1cXFwiXCIgKyBocmVmICsgXCJcXFwiXVwiKTtcclxuICAgICAgJGhlYWRlck1lbnVJdGVtLmVhY2goZnVuY3Rpb24gKGksIGUpIHtcclxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZSkucGFyZW50KCkuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgICB9KTtcclxuICAgICAgJGhlYWRlckRyb3Bkb3duSXRlbS5lYWNoKGZ1bmN0aW9uIChpLCBlKSB7XHJcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGUpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgfSk7XHJcbiAgICAgICRzaWRlYmFyTWVudUl0ZW0uZWFjaChmdW5jdGlvbiAoaSwgZSkge1xyXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGUpLnBhcmVudHMoJy5uYXYtdHJlZXZpZXcnKS5wcmV2QWxsKCcubmF2LWxpbmsnKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8uX2ZpeEhlaWdodCA9IGZ1bmN0aW9uIF9maXhIZWlnaHQodGFiRW1wdHkpIHtcclxuICAgICAgaWYgKHRhYkVtcHR5ID09PSB2b2lkIDApIHtcclxuICAgICAgICB0YWJFbXB0eSA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdib2R5JykuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GVUxMU0NSRUVOX01PREUpKSB7XHJcbiAgICAgICAgdmFyIHdpbmRvd0hlaWdodCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh3aW5kb3cpLmhlaWdodCgpO1xyXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9UQUJfRU1QVFkgKyBcIiwgXCIgKyBTRUxFQ1RPUl9UQUJfTE9BRElORykuaGVpZ2h0KHdpbmRvd0hlaWdodCk7XHJcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0NPTlRFTlRfV1JBUFBFUikuaGVpZ2h0KHdpbmRvd0hlaWdodCk7XHJcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0NPTlRFTlRfSUZSQU1FKS5oZWlnaHQod2luZG93SGVpZ2h0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgY29udGVudFdyYXBwZXJIZWlnaHQgPSBwYXJzZUZsb2F0KCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9DT05URU5UX1dSQVBQRVIpLmNzcygnbWluLWhlaWdodCcpKTtcclxuICAgICAgICB2YXIgbmF2YmFySGVpZ2h0ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1RBQl9OQVYpLm91dGVySGVpZ2h0KCk7XHJcblxyXG4gICAgICAgIGlmICh0YWJFbXB0eSA9PSB0cnVlKSB7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1RBQl9FTVBUWSArIFwiLCBcIiArIFNFTEVDVE9SX1RBQl9MT0FESU5HKS5oZWlnaHQoY29udGVudFdyYXBwZXJIZWlnaHQgLSBuYXZiYXJIZWlnaHQpO1xyXG4gICAgICAgICAgfSwgNTApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfQ09OVEVOVF9JRlJBTUUpLmhlaWdodChjb250ZW50V3JhcHBlckhlaWdodCAtIG5hdmJhckhlaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IC8vIFN0YXRpY1xyXG4gICAgO1xyXG5cclxuICAgIElGcmFtZS5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShvcGVyYXRpb24pIHtcclxuICAgICAgdmFyIGRhdGEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQ3KTtcclxuXHJcbiAgICAgIHZhciBfb3B0aW9ucyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5leHRlbmQoe30sIERlZmF1bHQkNSwgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoKSk7XHJcblxyXG4gICAgICBpZiAoIWRhdGEpIHtcclxuICAgICAgICBkYXRhID0gbmV3IElGcmFtZSh0aGlzLCBfb3B0aW9ucyk7XHJcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkNywgZGF0YSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0eXBlb2Ygb3BlcmF0aW9uID09PSAnc3RyaW5nJyAmJiBvcGVyYXRpb24ubWF0Y2goL2NyZWF0ZVRhYnxvcGVuVGFiU2lkZWJhcnxzd2l0Y2hUYWJ8cmVtb3ZlQWN0aXZlVGFiLykpIHtcclxuICAgICAgICB2YXIgX2RhdGE7XHJcblxyXG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcclxuICAgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgKF9kYXRhID0gZGF0YSlbb3BlcmF0aW9uXS5hcHBseShfZGF0YSwgYXJncyk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIElGcmFtZTtcclxuICB9KCk7XHJcbiAgLyoqXHJcbiAgICogRGF0YSBBUElcclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10od2luZG93KS5vbignbG9hZCcsIGZ1bmN0aW9uICgpIHtcclxuICAgIElGcmFtZS5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0RBVEFfVE9HR0xFJDMpKTtcclxuICB9KTtcclxuICAvKipcclxuICAgKiBqUXVlcnkgQVBJXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ3XSA9IElGcmFtZS5falF1ZXJ5SW50ZXJmYWNlO1xyXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDddLkNvbnN0cnVjdG9yID0gSUZyYW1lO1xyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ3XS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkN10gPSBKUVVFUllfTk9fQ09ORkxJQ1QkNztcclxuICAgIHJldHVybiBJRnJhbWUuX2pRdWVyeUludGVyZmFjZTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAqIEFkbWluTFRFIExheW91dC5qc1xyXG4gICAqIExpY2Vuc2UgTUlUXHJcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgKi9cclxuICAvKipcclxuICAgKiBDb25zdGFudHNcclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG4gIHZhciBOQU1FJDggPSAnTGF5b3V0JztcclxuICB2YXIgREFUQV9LRVkkOCA9ICdsdGUubGF5b3V0JztcclxuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJDggPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ4XTtcclxuICB2YXIgU0VMRUNUT1JfSEVBREVSJDEgPSAnLm1haW4taGVhZGVyJztcclxuICB2YXIgU0VMRUNUT1JfTUFJTl9TSURFQkFSID0gJy5tYWluLXNpZGViYXInO1xyXG4gIHZhciBTRUxFQ1RPUl9TSURFQkFSID0gJy5tYWluLXNpZGViYXIgLnNpZGViYXInO1xyXG4gIHZhciBTRUxFQ1RPUl9DT05URU5UID0gJy5jb250ZW50LXdyYXBwZXInO1xyXG4gIHZhciBTRUxFQ1RPUl9DT05UUk9MX1NJREVCQVJfQ09OVEVOVCQxID0gJy5jb250cm9sLXNpZGViYXItY29udGVudCc7XHJcbiAgdmFyIFNFTEVDVE9SX0NPTlRST0xfU0lERUJBUl9CVE4gPSAnW2RhdGEtd2lkZ2V0PVwiY29udHJvbC1zaWRlYmFyXCJdJztcclxuICB2YXIgU0VMRUNUT1JfRk9PVEVSJDEgPSAnLm1haW4tZm9vdGVyJztcclxuICB2YXIgU0VMRUNUT1JfUFVTSE1FTlVfQlROID0gJ1tkYXRhLXdpZGdldD1cInB1c2htZW51XCJdJztcclxuICB2YXIgU0VMRUNUT1JfTE9HSU5fQk9YID0gJy5sb2dpbi1ib3gnO1xyXG4gIHZhciBTRUxFQ1RPUl9SRUdJU1RFUl9CT1ggPSAnLnJlZ2lzdGVyLWJveCc7XHJcbiAgdmFyIENMQVNTX05BTUVfU0lERUJBUl9GT0NVU0VEID0gJ3NpZGViYXItZm9jdXNlZCc7XHJcbiAgdmFyIENMQVNTX05BTUVfTEFZT1VUX0ZJWEVEJDEgPSAnbGF5b3V0LWZpeGVkJztcclxuICB2YXIgQ0xBU1NfTkFNRV9DT05UUk9MX1NJREVCQVJfU0xJREVfT1BFTiA9ICdjb250cm9sLXNpZGViYXItc2xpZGUtb3Blbic7XHJcbiAgdmFyIENMQVNTX05BTUVfQ09OVFJPTF9TSURFQkFSX09QRU4kMSA9ICdjb250cm9sLXNpZGViYXItb3Blbic7XHJcbiAgdmFyIERlZmF1bHQkNiA9IHtcclxuICAgIHNjcm9sbGJhclRoZW1lOiAnb3MtdGhlbWUtbGlnaHQnLFxyXG4gICAgc2Nyb2xsYmFyQXV0b0hpZGU6ICdsJyxcclxuICAgIHBhbmVsQXV0b0hlaWdodDogdHJ1ZSxcclxuICAgIHBhbmVsQXV0b0hlaWdodE1vZGU6ICdtaW4taGVpZ2h0JyxcclxuICAgIGxvZ2luUmVnaXN0ZXJBdXRvSGVpZ2h0OiB0cnVlXHJcbiAgfTtcclxuICAvKipcclxuICAgKiBDbGFzcyBEZWZpbml0aW9uXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuICB2YXIgTGF5b3V0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIExheW91dChlbGVtZW50LCBjb25maWcpIHtcclxuICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xyXG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcclxuXHJcbiAgICAgIHRoaXMuX2luaXQoKTtcclxuICAgIH0gLy8gUHVibGljXHJcblxyXG5cclxuICAgIHZhciBfcHJvdG8gPSBMYXlvdXQucHJvdG90eXBlO1xyXG5cclxuICAgIF9wcm90by5maXhMYXlvdXRIZWlnaHQgPSBmdW5jdGlvbiBmaXhMYXlvdXRIZWlnaHQoZXh0cmEpIHtcclxuICAgICAgaWYgKGV4dHJhID09PSB2b2lkIDApIHtcclxuICAgICAgICBleHRyYSA9IG51bGw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciAkYm9keSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnYm9keScpO1xyXG4gICAgICB2YXIgY29udHJvbFNpZGViYXIgPSAwO1xyXG5cclxuICAgICAgaWYgKCRib2R5Lmhhc0NsYXNzKENMQVNTX05BTUVfQ09OVFJPTF9TSURFQkFSX1NMSURFX09QRU4pIHx8ICRib2R5Lmhhc0NsYXNzKENMQVNTX05BTUVfQ09OVFJPTF9TSURFQkFSX09QRU4kMSkgfHwgZXh0cmEgPT09ICdjb250cm9sX3NpZGViYXInKSB7XHJcbiAgICAgICAgY29udHJvbFNpZGViYXIgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfQ09OVFJPTF9TSURFQkFSX0NPTlRFTlQkMSkuaGVpZ2h0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciBoZWlnaHRzID0ge1xyXG4gICAgICAgIHdpbmRvdzogJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykuaGVpZ2h0KCksXHJcbiAgICAgICAgaGVhZGVyOiAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfSEVBREVSJDEpLmxlbmd0aCAhPT0gMCA/ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9IRUFERVIkMSkub3V0ZXJIZWlnaHQoKSA6IDAsXHJcbiAgICAgICAgZm9vdGVyOiAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfRk9PVEVSJDEpLmxlbmd0aCAhPT0gMCA/ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9GT09URVIkMSkub3V0ZXJIZWlnaHQoKSA6IDAsXHJcbiAgICAgICAgc2lkZWJhcjogJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1NJREVCQVIpLmxlbmd0aCAhPT0gMCA/ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9TSURFQkFSKS5oZWlnaHQoKSA6IDAsXHJcbiAgICAgICAgY29udHJvbFNpZGViYXI6IGNvbnRyb2xTaWRlYmFyXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB2YXIgbWF4ID0gdGhpcy5fbWF4KGhlaWdodHMpO1xyXG5cclxuICAgICAgdmFyIG9mZnNldCA9IHRoaXMuX2NvbmZpZy5wYW5lbEF1dG9IZWlnaHQ7XHJcblxyXG4gICAgICBpZiAob2Zmc2V0ID09PSB0cnVlKSB7XHJcbiAgICAgICAgb2Zmc2V0ID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdmFyICRjb250ZW50U2VsZWN0b3IgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfQ09OVEVOVCk7XHJcblxyXG4gICAgICBpZiAob2Zmc2V0ICE9PSBmYWxzZSkge1xyXG4gICAgICAgIGlmIChtYXggPT09IGhlaWdodHMuY29udHJvbFNpZGViYXIpIHtcclxuICAgICAgICAgICRjb250ZW50U2VsZWN0b3IuY3NzKHRoaXMuX2NvbmZpZy5wYW5lbEF1dG9IZWlnaHRNb2RlLCBtYXggKyBvZmZzZXQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWF4ID09PSBoZWlnaHRzLndpbmRvdykge1xyXG4gICAgICAgICAgJGNvbnRlbnRTZWxlY3Rvci5jc3ModGhpcy5fY29uZmlnLnBhbmVsQXV0b0hlaWdodE1vZGUsIG1heCArIG9mZnNldCAtIGhlaWdodHMuaGVhZGVyIC0gaGVpZ2h0cy5mb290ZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAkY29udGVudFNlbGVjdG9yLmNzcyh0aGlzLl9jb25maWcucGFuZWxBdXRvSGVpZ2h0TW9kZSwgbWF4ICsgb2Zmc2V0IC0gaGVpZ2h0cy5oZWFkZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzRm9vdGVyRml4ZWQoKSkge1xyXG4gICAgICAgICAgJGNvbnRlbnRTZWxlY3Rvci5jc3ModGhpcy5fY29uZmlnLnBhbmVsQXV0b0hlaWdodE1vZGUsIHBhcnNlRmxvYXQoJGNvbnRlbnRTZWxlY3Rvci5jc3ModGhpcy5fY29uZmlnLnBhbmVsQXV0b0hlaWdodE1vZGUpKSArIGhlaWdodHMuZm9vdGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghJGJvZHkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9MQVlPVVRfRklYRUQkMSkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChvZmZzZXQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgJGNvbnRlbnRTZWxlY3Rvci5jc3ModGhpcy5fY29uZmlnLnBhbmVsQXV0b0hlaWdodE1vZGUsIG1heCArIG9mZnNldCAtIGhlaWdodHMuaGVhZGVyIC0gaGVpZ2h0cy5mb290ZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbi5vdmVybGF5U2Nyb2xsYmFycyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfU0lERUJBUikub3ZlcmxheVNjcm9sbGJhcnMoe1xyXG4gICAgICAgICAgY2xhc3NOYW1lOiB0aGlzLl9jb25maWcuc2Nyb2xsYmFyVGhlbWUsXHJcbiAgICAgICAgICBzaXplQXV0b0NhcGFibGU6IHRydWUsXHJcbiAgICAgICAgICBzY3JvbGxiYXJzOiB7XHJcbiAgICAgICAgICAgIGF1dG9IaWRlOiB0aGlzLl9jb25maWcuc2Nyb2xsYmFyQXV0b0hpZGUsXHJcbiAgICAgICAgICAgIGNsaWNrU2Nyb2xsaW5nOiB0cnVlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLmZpeExvZ2luUmVnaXN0ZXJIZWlnaHQgPSBmdW5jdGlvbiBmaXhMb2dpblJlZ2lzdGVySGVpZ2h0KCkge1xyXG4gICAgICB2YXIgJGJvZHkgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oJ2JvZHknKTtcclxuICAgICAgdmFyICRzZWxlY3RvciA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9MT0dJTl9CT1ggKyBcIiwgXCIgKyBTRUxFQ1RPUl9SRUdJU1RFUl9CT1gpO1xyXG5cclxuICAgICAgaWYgKCRzZWxlY3Rvci5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAkYm9keS5jc3MoJ2hlaWdodCcsICdhdXRvJyk7XHJcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdodG1sJykuY3NzKCdoZWlnaHQnLCAnYXV0bycpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhciBib3hIZWlnaHQgPSAkc2VsZWN0b3IuaGVpZ2h0KCk7XHJcblxyXG4gICAgICAgIGlmICgkYm9keS5jc3ModGhpcy5fY29uZmlnLnBhbmVsQXV0b0hlaWdodE1vZGUpICE9PSBib3hIZWlnaHQpIHtcclxuICAgICAgICAgICRib2R5LmNzcyh0aGlzLl9jb25maWcucGFuZWxBdXRvSGVpZ2h0TW9kZSwgYm94SGVpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gLy8gUHJpdmF0ZVxyXG4gICAgO1xyXG5cclxuICAgIF9wcm90by5faW5pdCA9IGZ1bmN0aW9uIF9pbml0KCkge1xyXG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgLy8gQWN0aXZhdGUgbGF5b3V0IGhlaWdodCB3YXRjaGVyXHJcbiAgICAgIHRoaXMuZml4TGF5b3V0SGVpZ2h0KCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmxvZ2luUmVnaXN0ZXJBdXRvSGVpZ2h0ID09PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5maXhMb2dpblJlZ2lzdGVySGVpZ2h0KCk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fY29uZmlnLmxvZ2luUmVnaXN0ZXJBdXRvSGVpZ2h0ID09PSBwYXJzZUludCh0aGlzLl9jb25maWcubG9naW5SZWdpc3RlckF1dG9IZWlnaHQsIDEwKSkge1xyXG4gICAgICAgIHNldEludGVydmFsKHRoaXMuZml4TG9naW5SZWdpc3RlckhlaWdodCwgdGhpcy5fY29uZmlnLmxvZ2luUmVnaXN0ZXJBdXRvSGVpZ2h0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1NJREVCQVIpLm9uKCdjb2xsYXBzZWQubHRlLnRyZWV2aWV3IGV4cGFuZGVkLmx0ZS50cmVldmlldycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBfdGhpcy5maXhMYXlvdXRIZWlnaHQoKTtcclxuICAgICAgfSk7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9QVVNITUVOVV9CVE4pLm9uKCdjb2xsYXBzZWQubHRlLnB1c2htZW51IHNob3duLmx0ZS5wdXNobWVudScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBfdGhpcy5maXhMYXlvdXRIZWlnaHQoKTtcclxuICAgICAgfSk7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9DT05UUk9MX1NJREVCQVJfQlROKS5vbignY29sbGFwc2VkLmx0ZS5jb250cm9sc2lkZWJhcicsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBfdGhpcy5maXhMYXlvdXRIZWlnaHQoKTtcclxuICAgICAgfSkub24oJ2V4cGFuZGVkLmx0ZS5jb250cm9sc2lkZWJhcicsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBfdGhpcy5maXhMYXlvdXRIZWlnaHQoJ2NvbnRyb2xfc2lkZWJhcicpO1xyXG4gICAgICB9KTtcclxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBfdGhpcy5maXhMYXlvdXRIZWlnaHQoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnYm9keS5ob2xkLXRyYW5zaXRpb24nKS5yZW1vdmVDbGFzcygnaG9sZC10cmFuc2l0aW9uJyk7XHJcbiAgICAgIH0sIDUwKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLl9tYXggPSBmdW5jdGlvbiBfbWF4KG51bWJlcnMpIHtcclxuICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIG51bWJlciBpbiBhIGxpc3RcclxuICAgICAgdmFyIG1heCA9IDA7XHJcbiAgICAgIE9iamVjdC5rZXlzKG51bWJlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgIGlmIChudW1iZXJzW2tleV0gPiBtYXgpIHtcclxuICAgICAgICAgIG1heCA9IG51bWJlcnNba2V5XTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gbWF4O1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8uX2lzRm9vdGVyRml4ZWQgPSBmdW5jdGlvbiBfaXNGb290ZXJGaXhlZCgpIHtcclxuICAgICAgcmV0dXJuICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9GT09URVIkMSkuY3NzKCdwb3NpdGlvbicpID09PSAnZml4ZWQnO1xyXG4gICAgfSAvLyBTdGF0aWNcclxuICAgIDtcclxuXHJcbiAgICBMYXlvdXQuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XHJcbiAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkge1xyXG4gICAgICAgIGNvbmZpZyA9ICcnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgZGF0YSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJDgpO1xyXG5cclxuICAgICAgICB2YXIgX29wdGlvbnMgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZXh0ZW5kKHt9LCBEZWZhdWx0JDYsICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKCkpO1xyXG5cclxuICAgICAgICBpZiAoIWRhdGEpIHtcclxuICAgICAgICAgIGRhdGEgPSBuZXcgTGF5b3V0KCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSwgX29wdGlvbnMpO1xyXG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkOCwgZGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29uZmlnID09PSAnaW5pdCcgfHwgY29uZmlnID09PSAnJykge1xyXG4gICAgICAgICAgZGF0YS5faW5pdCgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnID09PSAnZml4TGF5b3V0SGVpZ2h0JyB8fCBjb25maWcgPT09ICdmaXhMb2dpblJlZ2lzdGVySGVpZ2h0Jykge1xyXG4gICAgICAgICAgZGF0YVtjb25maWddKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIExheW91dDtcclxuICB9KCk7XHJcbiAgLyoqXHJcbiAgICogRGF0YSBBUElcclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10od2luZG93KS5vbignbG9hZCcsIGZ1bmN0aW9uICgpIHtcclxuICAgIExheW91dC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKCdib2R5JykpO1xyXG4gIH0pO1xyXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9TSURFQkFSICsgXCIgYVwiKS5vbignZm9jdXNpbicsIGZ1bmN0aW9uICgpIHtcclxuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9NQUlOX1NJREVCQVIpLmFkZENsYXNzKENMQVNTX05BTUVfU0lERUJBUl9GT0NVU0VEKTtcclxuICB9KTtcclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfU0lERUJBUiArIFwiIGFcIikub24oJ2ZvY3Vzb3V0JywgZnVuY3Rpb24gKCkge1xyXG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX01BSU5fU0lERUJBUikucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9TSURFQkFSX0ZPQ1VTRUQpO1xyXG4gIH0pO1xyXG4gIC8qKlxyXG4gICAqIGpRdWVyeSBBUElcclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDhdID0gTGF5b3V0Ll9qUXVlcnlJbnRlcmZhY2U7XHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkOF0uQ29uc3RydWN0b3IgPSBMYXlvdXQ7XHJcblxyXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDhdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ4XSA9IEpRVUVSWV9OT19DT05GTElDVCQ4O1xyXG4gICAgcmV0dXJuIExheW91dC5falF1ZXJ5SW50ZXJmYWNlO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICogQWRtaW5MVEUgUHVzaE1lbnUuanNcclxuICAgKiBMaWNlbnNlIE1JVFxyXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICovXHJcbiAgLyoqXHJcbiAgICogQ29uc3RhbnRzXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuICB2YXIgTkFNRSQ5ID0gJ1B1c2hNZW51JztcclxuICB2YXIgREFUQV9LRVkkOSA9ICdsdGUucHVzaG1lbnUnO1xyXG4gIHZhciBFVkVOVF9LRVkkNSA9IFwiLlwiICsgREFUQV9LRVkkOTtcclxuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJDkgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ5XTtcclxuICB2YXIgRVZFTlRfQ09MTEFQU0VEJDMgPSBcImNvbGxhcHNlZFwiICsgRVZFTlRfS0VZJDU7XHJcbiAgdmFyIEVWRU5UX1NIT1dOID0gXCJzaG93blwiICsgRVZFTlRfS0VZJDU7XHJcbiAgdmFyIFNFTEVDVE9SX1RPR0dMRV9CVVRUT04gPSAnW2RhdGEtd2lkZ2V0PVwicHVzaG1lbnVcIl0nO1xyXG4gIHZhciBTRUxFQ1RPUl9CT0RZID0gJ2JvZHknO1xyXG4gIHZhciBTRUxFQ1RPUl9PVkVSTEFZID0gJyNzaWRlYmFyLW92ZXJsYXknO1xyXG4gIHZhciBTRUxFQ1RPUl9XUkFQUEVSID0gJy53cmFwcGVyJztcclxuICB2YXIgQ0xBU1NfTkFNRV9DT0xMQVBTRUQkMSA9ICdzaWRlYmFyLWNvbGxhcHNlJztcclxuICB2YXIgQ0xBU1NfTkFNRV9PUEVOID0gJ3NpZGViYXItb3Blbic7XHJcbiAgdmFyIENMQVNTX05BTUVfSVNfT1BFTklORyA9ICdzaWRlYmFyLWlzLW9wZW5pbmcnO1xyXG4gIHZhciBDTEFTU19OQU1FX0NMT1NFRCA9ICdzaWRlYmFyLWNsb3NlZCc7XHJcbiAgdmFyIERlZmF1bHQkNyA9IHtcclxuICAgIGF1dG9Db2xsYXBzZVNpemU6IDk5MixcclxuICAgIGVuYWJsZVJlbWVtYmVyOiBmYWxzZSxcclxuICAgIG5vVHJhbnNpdGlvbkFmdGVyUmVsb2FkOiB0cnVlXHJcbiAgfTtcclxuICAvKipcclxuICAgKiBDbGFzcyBEZWZpbml0aW9uXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuICB2YXIgUHVzaE1lbnUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gUHVzaE1lbnUoZWxlbWVudCwgb3B0aW9ucykge1xyXG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcclxuICAgICAgdGhpcy5fb3B0aW9ucyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5leHRlbmQoe30sIERlZmF1bHQkNywgb3B0aW9ucyk7XHJcblxyXG4gICAgICBpZiAoJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX09WRVJMQVkpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHRoaXMuX2FkZE92ZXJsYXkoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5faW5pdCgpO1xyXG4gICAgfSAvLyBQdWJsaWNcclxuXHJcblxyXG4gICAgdmFyIF9wcm90byA9IFB1c2hNZW51LnByb3RvdHlwZTtcclxuXHJcbiAgICBfcHJvdG8uZXhwYW5kID0gZnVuY3Rpb24gZXhwYW5kKCkge1xyXG4gICAgICB2YXIgJGJvZHlTZWxlY3RvciA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9CT0RZKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9vcHRpb25zLmF1dG9Db2xsYXBzZVNpemUpIHtcclxuICAgICAgICBpZiAoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykud2lkdGgoKSA8PSB0aGlzLl9vcHRpb25zLmF1dG9Db2xsYXBzZVNpemUpIHtcclxuICAgICAgICAgICRib2R5U2VsZWN0b3IuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9PUEVOKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICRib2R5U2VsZWN0b3IuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9JU19PUEVOSU5HKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNFRCQxICsgXCIgXCIgKyBDTEFTU19OQU1FX0NMT1NFRCkuZGVsYXkoNTApLnF1ZXVlKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAkYm9keVNlbGVjdG9yLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfSVNfT1BFTklORyk7XHJcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRlcXVldWUoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fb3B0aW9ucy5lbmFibGVSZW1lbWJlcikge1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwicmVtZW1iZXJcIiArIEVWRU5UX0tFWSQ1LCBDTEFTU19OQU1FX09QRU4pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkudHJpZ2dlcigkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfU0hPV04pKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLmNvbGxhcHNlID0gZnVuY3Rpb24gY29sbGFwc2UoKSB7XHJcbiAgICAgIHZhciAkYm9keVNlbGVjdG9yID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0JPRFkpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX29wdGlvbnMuYXV0b0NvbGxhcHNlU2l6ZSkge1xyXG4gICAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10od2luZG93KS53aWR0aCgpIDw9IHRoaXMuX29wdGlvbnMuYXV0b0NvbGxhcHNlU2l6ZSkge1xyXG4gICAgICAgICAgJGJvZHlTZWxlY3Rvci5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX09QRU4pLmFkZENsYXNzKENMQVNTX05BTUVfQ0xPU0VEKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICRib2R5U2VsZWN0b3IuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRUQkMSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fb3B0aW9ucy5lbmFibGVSZW1lbWJlcikge1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwicmVtZW1iZXJcIiArIEVWRU5UX0tFWSQ1LCBDTEFTU19OQU1FX0NPTExBUFNFRCQxKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX0NPTExBUFNFRCQzKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by50b2dnbGUgPSBmdW5jdGlvbiB0b2dnbGUoKSB7XHJcbiAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfQk9EWSkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRUQkMSkpIHtcclxuICAgICAgICB0aGlzLmV4cGFuZCgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY29sbGFwc2UoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8uYXV0b0NvbGxhcHNlID0gZnVuY3Rpb24gYXV0b0NvbGxhcHNlKHJlc2l6ZSkge1xyXG4gICAgICBpZiAocmVzaXplID09PSB2b2lkIDApIHtcclxuICAgICAgICByZXNpemUgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLl9vcHRpb25zLmF1dG9Db2xsYXBzZVNpemUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciAkYm9keVNlbGVjdG9yID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0JPRFkpO1xyXG5cclxuICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh3aW5kb3cpLndpZHRoKCkgPD0gdGhpcy5fb3B0aW9ucy5hdXRvQ29sbGFwc2VTaXplKSB7XHJcbiAgICAgICAgaWYgKCEkYm9keVNlbGVjdG9yLmhhc0NsYXNzKENMQVNTX05BTUVfT1BFTikpIHtcclxuICAgICAgICAgIHRoaXMuY29sbGFwc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAocmVzaXplID09PSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKCRib2R5U2VsZWN0b3IuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9PUEVOKSkge1xyXG4gICAgICAgICAgJGJvZHlTZWxlY3Rvci5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX09QRU4pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoJGJvZHlTZWxlY3Rvci5oYXNDbGFzcyhDTEFTU19OQU1FX0NMT1NFRCkpIHtcclxuICAgICAgICAgIHRoaXMuZXhwYW5kKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by5yZW1lbWJlciA9IGZ1bmN0aW9uIHJlbWVtYmVyKCkge1xyXG4gICAgICBpZiAoIXRoaXMuX29wdGlvbnMuZW5hYmxlUmVtZW1iZXIpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciAkYm9keSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnYm9keScpO1xyXG4gICAgICB2YXIgdG9nZ2xlU3RhdGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInJlbWVtYmVyXCIgKyBFVkVOVF9LRVkkNSk7XHJcblxyXG4gICAgICBpZiAodG9nZ2xlU3RhdGUgPT09IENMQVNTX05BTUVfQ09MTEFQU0VEJDEpIHtcclxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5ub1RyYW5zaXRpb25BZnRlclJlbG9hZCkge1xyXG4gICAgICAgICAgJGJvZHkuYWRkQ2xhc3MoJ2hvbGQtdHJhbnNpdGlvbicpLmFkZENsYXNzKENMQVNTX05BTUVfQ09MTEFQU0VEJDEpLmRlbGF5KDUwKS5xdWV1ZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5yZW1vdmVDbGFzcygnaG9sZC10cmFuc2l0aW9uJyk7XHJcbiAgICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kZXF1ZXVlKCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgJGJvZHkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRUQkMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX29wdGlvbnMubm9UcmFuc2l0aW9uQWZ0ZXJSZWxvYWQpIHtcclxuICAgICAgICAkYm9keS5hZGRDbGFzcygnaG9sZC10cmFuc2l0aW9uJykucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRUQkMSkuZGVsYXkoNTApLnF1ZXVlKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5yZW1vdmVDbGFzcygnaG9sZC10cmFuc2l0aW9uJyk7XHJcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGVxdWV1ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICRib2R5LnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQ09MTEFQU0VEJDEpO1xyXG4gICAgICB9XHJcbiAgICB9IC8vIFByaXZhdGVcclxuICAgIDtcclxuXHJcbiAgICBfcHJvdG8uX2luaXQgPSBmdW5jdGlvbiBfaW5pdCgpIHtcclxuICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgIHRoaXMucmVtZW1iZXIoKTtcclxuICAgICAgdGhpcy5hdXRvQ29sbGFwc2UoKTtcclxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBfdGhpcy5hdXRvQ29sbGFwc2UodHJ1ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8uX2FkZE92ZXJsYXkgPSBmdW5jdGlvbiBfYWRkT3ZlcmxheSgpIHtcclxuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XHJcblxyXG4gICAgICB2YXIgb3ZlcmxheSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnPGRpdiAvPicsIHtcclxuICAgICAgICBpZDogJ3NpZGViYXItb3ZlcmxheSdcclxuICAgICAgfSk7XHJcbiAgICAgIG92ZXJsYXkub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIF90aGlzMi5jb2xsYXBzZSgpO1xyXG4gICAgICB9KTtcclxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1dSQVBQRVIpLmFwcGVuZChvdmVybGF5KTtcclxuICAgIH0gLy8gU3RhdGljXHJcbiAgICA7XHJcblxyXG4gICAgUHVzaE1lbnUuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2Uob3BlcmF0aW9uKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBkYXRhID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkOSk7XHJcblxyXG4gICAgICAgIHZhciBfb3B0aW9ucyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5leHRlbmQoe30sIERlZmF1bHQkNywgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoKSk7XHJcblxyXG4gICAgICAgIGlmICghZGF0YSkge1xyXG4gICAgICAgICAgZGF0YSA9IG5ldyBQdXNoTWVudSh0aGlzLCBfb3B0aW9ucyk7XHJcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQ5LCBkYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2Ygb3BlcmF0aW9uID09PSAnc3RyaW5nJyAmJiBvcGVyYXRpb24ubWF0Y2goL2NvbGxhcHNlfGV4cGFuZHx0b2dnbGUvKSkge1xyXG4gICAgICAgICAgZGF0YVtvcGVyYXRpb25dKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIFB1c2hNZW51O1xyXG4gIH0oKTtcclxuICAvKipcclxuICAgKiBEYXRhIEFQSVxyXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgKi9cclxuXHJcblxyXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub24oJ2NsaWNrJywgU0VMRUNUT1JfVE9HR0xFX0JVVFRPTiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdmFyIGJ1dHRvbiA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XHJcblxyXG4gICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShidXR0b24pLmRhdGEoJ3dpZGdldCcpICE9PSAncHVzaG1lbnUnKSB7XHJcbiAgICAgIGJ1dHRvbiA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShidXR0b24pLmNsb3Nlc3QoU0VMRUNUT1JfVE9HR0xFX0JVVFRPTik7XHJcbiAgICB9XHJcblxyXG4gICAgUHVzaE1lbnUuX2pRdWVyeUludGVyZmFjZS5jYWxsKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShidXR0b24pLCAndG9nZ2xlJyk7XHJcbiAgfSk7XHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICBQdXNoTWVudS5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1RPR0dMRV9CVVRUT04pKTtcclxuICB9KTtcclxuICAvKipcclxuICAgKiBqUXVlcnkgQVBJXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ5XSA9IFB1c2hNZW51Ll9qUXVlcnlJbnRlcmZhY2U7XHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkOV0uQ29uc3RydWN0b3IgPSBQdXNoTWVudTtcclxuXHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkOV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDldID0gSlFVRVJZX05PX0NPTkZMSUNUJDk7XHJcbiAgICByZXR1cm4gUHVzaE1lbnUuX2pRdWVyeUludGVyZmFjZTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAqIEFkbWluTFRFIFNpZGViYXJTZWFyY2guanNcclxuICAgKiBMaWNlbnNlIE1JVFxyXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICovXHJcbiAgLyoqXHJcbiAgICogQ29uc3RhbnRzXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuICB2YXIgTkFNRSRhID0gJ1NpZGViYXJTZWFyY2gnO1xyXG4gIHZhciBEQVRBX0tFWSRhID0gJ2x0ZS5zaWRlYmFyLXNlYXJjaCc7XHJcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCRhID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkYV07XHJcbiAgdmFyIENMQVNTX05BTUVfT1BFTiQxID0gJ3NpZGViYXItc2VhcmNoLW9wZW4nO1xyXG4gIHZhciBDTEFTU19OQU1FX0lDT05fU0VBUkNIID0gJ2ZhLXNlYXJjaCc7XHJcbiAgdmFyIENMQVNTX05BTUVfSUNPTl9DTE9TRSA9ICdmYS10aW1lcyc7XHJcbiAgdmFyIENMQVNTX05BTUVfSEVBREVSID0gJ25hdi1oZWFkZXInO1xyXG4gIHZhciBDTEFTU19OQU1FX1NFQVJDSF9SRVNVTFRTID0gJ3NpZGViYXItc2VhcmNoLXJlc3VsdHMnO1xyXG4gIHZhciBDTEFTU19OQU1FX0xJU1RfR1JPVVAgPSAnbGlzdC1ncm91cCc7XHJcbiAgdmFyIFNFTEVDVE9SX0RBVEFfV0lER0VUJDEgPSAnW2RhdGEtd2lkZ2V0PVwic2lkZWJhci1zZWFyY2hcIl0nO1xyXG4gIHZhciBTRUxFQ1RPUl9TSURFQkFSJDEgPSAnLm1haW4tc2lkZWJhciAubmF2LXNpZGViYXInO1xyXG4gIHZhciBTRUxFQ1RPUl9OQVZfTElOSyA9ICcubmF2LWxpbmsnO1xyXG4gIHZhciBTRUxFQ1RPUl9OQVZfVFJFRVZJRVcgPSAnLm5hdi10cmVldmlldyc7XHJcbiAgdmFyIFNFTEVDVE9SX1NFQVJDSF9JTlBVVCA9IFNFTEVDVE9SX0RBVEFfV0lER0VUJDEgKyBcIiAuZm9ybS1jb250cm9sXCI7XHJcbiAgdmFyIFNFTEVDVE9SX1NFQVJDSF9CVVRUT04gPSBTRUxFQ1RPUl9EQVRBX1dJREdFVCQxICsgXCIgLmJ0blwiO1xyXG4gIHZhciBTRUxFQ1RPUl9TRUFSQ0hfSUNPTiA9IFNFTEVDVE9SX1NFQVJDSF9CVVRUT04gKyBcIiBpXCI7XHJcbiAgdmFyIFNFTEVDVE9SX1NFQVJDSF9MSVNUX0dST1VQID0gXCIuXCIgKyBDTEFTU19OQU1FX0xJU1RfR1JPVVA7XHJcbiAgdmFyIFNFTEVDVE9SX1NFQVJDSF9SRVNVTFRTID0gXCIuXCIgKyBDTEFTU19OQU1FX1NFQVJDSF9SRVNVTFRTO1xyXG4gIHZhciBTRUxFQ1RPUl9TRUFSQ0hfUkVTVUxUU19HUk9VUCA9IFNFTEVDVE9SX1NFQVJDSF9SRVNVTFRTICsgXCIgLlwiICsgQ0xBU1NfTkFNRV9MSVNUX0dST1VQO1xyXG4gIHZhciBEZWZhdWx0JDggPSB7XHJcbiAgICBhcnJvd1NpZ246ICctPicsXHJcbiAgICBtaW5MZW5ndGg6IDMsXHJcbiAgICBtYXhSZXN1bHRzOiA3LFxyXG4gICAgaGlnaGxpZ2h0TmFtZTogdHJ1ZSxcclxuICAgIGhpZ2hsaWdodFBhdGg6IGZhbHNlLFxyXG4gICAgaGlnaGxpZ2h0Q2xhc3M6ICd0ZXh0LWxpZ2h0JyxcclxuICAgIG5vdEZvdW5kVGV4dDogJ05vIGVsZW1lbnQgZm91bmQhJ1xyXG4gIH07XHJcbiAgdmFyIFNlYXJjaEl0ZW1zID0gW107XHJcbiAgLyoqXHJcbiAgICogQ2xhc3MgRGVmaW5pdGlvblxyXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgKi9cclxuXHJcbiAgdmFyIFNpZGViYXJTZWFyY2ggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gU2lkZWJhclNlYXJjaChfZWxlbWVudCwgX29wdGlvbnMpIHtcclxuICAgICAgdGhpcy5lbGVtZW50ID0gX2VsZW1lbnQ7XHJcbiAgICAgIHRoaXMub3B0aW9ucyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5leHRlbmQoe30sIERlZmF1bHQkOCwgX29wdGlvbnMpO1xyXG4gICAgICB0aGlzLml0ZW1zID0gW107XHJcbiAgICB9IC8vIFB1YmxpY1xyXG5cclxuXHJcbiAgICB2YXIgX3Byb3RvID0gU2lkZWJhclNlYXJjaC5wcm90b3R5cGU7XHJcblxyXG4gICAgX3Byb3RvLmluaXQgPSBmdW5jdGlvbiBpbml0KCkge1xyXG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9EQVRBX1dJREdFVCQxKS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9EQVRBX1dJREdFVCQxKS5uZXh0KFNFTEVDVE9SX1NFQVJDSF9SRVNVTFRTKS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9EQVRBX1dJREdFVCQxKS5hZnRlcigkX19kZWZhdWx0WydkZWZhdWx0J10oJzxkaXYgLz4nLCB7XHJcbiAgICAgICAgICBjbGFzczogQ0xBU1NfTkFNRV9TRUFSQ0hfUkVTVUxUU1xyXG4gICAgICAgIH0pKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9TRUFSQ0hfUkVTVUxUUykuY2hpbGRyZW4oU0VMRUNUT1JfU0VBUkNIX0xJU1RfR1JPVVApLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1NFQVJDSF9SRVNVTFRTKS5hcHBlbmQoJF9fZGVmYXVsdFsnZGVmYXVsdCddKCc8ZGl2IC8+Jywge1xyXG4gICAgICAgICAgY2xhc3M6IENMQVNTX05BTUVfTElTVF9HUk9VUFxyXG4gICAgICAgIH0pKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fYWRkTm90Rm91bmQoKTtcclxuXHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9TSURFQkFSJDEpLmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbiAoaSwgY2hpbGQpIHtcclxuICAgICAgICBfdGhpcy5fcGFyc2VJdGVtKGNoaWxkKTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2goKSB7XHJcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xyXG5cclxuICAgICAgdmFyIHNlYXJjaFZhbHVlID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1NFQVJDSF9JTlBVVCkudmFsKCkudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAgIGlmIChzZWFyY2hWYWx1ZS5sZW5ndGggPCB0aGlzLm9wdGlvbnMubWluTGVuZ3RoKSB7XHJcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1NFQVJDSF9SRVNVTFRTX0dST1VQKS5lbXB0eSgpO1xyXG5cclxuICAgICAgICB0aGlzLl9hZGROb3RGb3VuZCgpO1xyXG5cclxuICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2YXIgc2VhcmNoUmVzdWx0cyA9IFNlYXJjaEl0ZW1zLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgIHJldHVybiBpdGVtLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hWYWx1ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB2YXIgZW5kUmVzdWx0cyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShzZWFyY2hSZXN1bHRzLnNsaWNlKDAsIHRoaXMub3B0aW9ucy5tYXhSZXN1bHRzKSk7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9TRUFSQ0hfUkVTVUxUU19HUk9VUCkuZW1wdHkoKTtcclxuXHJcbiAgICAgIGlmIChlbmRSZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHRoaXMuX2FkZE5vdEZvdW5kKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZW5kUmVzdWx0cy5lYWNoKGZ1bmN0aW9uIChpLCByZXN1bHQpIHtcclxuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9TRUFSQ0hfUkVTVUxUU19HUk9VUCkuYXBwZW5kKF90aGlzMi5fcmVuZGVySXRlbShyZXN1bHQubmFtZSwgcmVzdWx0LmxpbmssIHJlc3VsdC5wYXRoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8ub3BlbiA9IGZ1bmN0aW9uIG9wZW4oKSB7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9EQVRBX1dJREdFVCQxKS5wYXJlbnQoKS5hZGRDbGFzcyhDTEFTU19OQU1FX09QRU4kMSk7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9TRUFSQ0hfSUNPTikucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9JQ09OX1NFQVJDSCkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9JQ09OX0NMT1NFKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLmNsb3NlID0gZnVuY3Rpb24gY2xvc2UoKSB7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9EQVRBX1dJREdFVCQxKS5wYXJlbnQoKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX09QRU4kMSk7XHJcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9TRUFSQ0hfSUNPTikucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9JQ09OX0NMT1NFKS5hZGRDbGFzcyhDTEFTU19OQU1FX0lDT05fU0VBUkNIKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcclxuICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShTRUxFQ1RPUl9EQVRBX1dJREdFVCQxKS5wYXJlbnQoKS5oYXNDbGFzcyhDTEFTU19OQU1FX09QRU4kMSkpIHtcclxuICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgIH1cclxuICAgIH0gLy8gUHJpdmF0ZVxyXG4gICAgO1xyXG5cclxuICAgIF9wcm90by5fcGFyc2VJdGVtID0gZnVuY3Rpb24gX3BhcnNlSXRlbShpdGVtLCBwYXRoKSB7XHJcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xyXG5cclxuICAgICAgaWYgKHBhdGggPT09IHZvaWQgMCkge1xyXG4gICAgICAgIHBhdGggPSBbXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShpdGVtKS5oYXNDbGFzcyhDTEFTU19OQU1FX0hFQURFUikpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciBpdGVtT2JqZWN0ID0ge307XHJcbiAgICAgIHZhciBuYXZMaW5rID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGl0ZW0pLmNsb25lKCkuZmluZChcIj4gXCIgKyBTRUxFQ1RPUl9OQVZfTElOSyk7XHJcbiAgICAgIHZhciBuYXZUcmVldmlldyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShpdGVtKS5jbG9uZSgpLmZpbmQoXCI+IFwiICsgU0VMRUNUT1JfTkFWX1RSRUVWSUVXKTtcclxuICAgICAgdmFyIGxpbmsgPSBuYXZMaW5rLmF0dHIoJ2hyZWYnKTtcclxuICAgICAgdmFyIG5hbWUgPSBuYXZMaW5rLmZpbmQoJ3AnKS5jaGlsZHJlbigpLnJlbW92ZSgpLmVuZCgpLnRleHQoKTtcclxuICAgICAgaXRlbU9iamVjdC5uYW1lID0gdGhpcy5fdHJpbVRleHQobmFtZSk7XHJcbiAgICAgIGl0ZW1PYmplY3QubGluayA9IGxpbms7XHJcbiAgICAgIGl0ZW1PYmplY3QucGF0aCA9IHBhdGg7XHJcblxyXG4gICAgICBpZiAobmF2VHJlZXZpZXcubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgU2VhcmNoSXRlbXMucHVzaChpdGVtT2JqZWN0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgbmV3UGF0aCA9IGl0ZW1PYmplY3QucGF0aC5jb25jYXQoW2l0ZW1PYmplY3QubmFtZV0pO1xyXG4gICAgICAgIG5hdlRyZWV2aWV3LmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbiAoaSwgY2hpbGQpIHtcclxuICAgICAgICAgIF90aGlzMy5fcGFyc2VJdGVtKGNoaWxkLCBuZXdQYXRoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8uX3RyaW1UZXh0ID0gZnVuY3Rpb24gX3RyaW1UZXh0KHRleHQpIHtcclxuICAgICAgcmV0dXJuICQudHJpbSh0ZXh0LnJlcGxhY2UoLyhcXHJcXG58XFxufFxccikvZ20sICcgJykpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8uX3JlbmRlckl0ZW0gPSBmdW5jdGlvbiBfcmVuZGVySXRlbShuYW1lLCBsaW5rLCBwYXRoKSB7XHJcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xyXG5cclxuICAgICAgcGF0aCA9IHBhdGguam9pbihcIiBcIiArIHRoaXMub3B0aW9ucy5hcnJvd1NpZ24gKyBcIiBcIik7XHJcblxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmhpZ2hsaWdodE5hbWUgfHwgdGhpcy5vcHRpb25zLmhpZ2hsaWdodFBhdGgpIHtcclxuICAgICAgICB2YXIgc2VhcmNoVmFsdWUgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfU0VBUkNIX0lOUFVUKS52YWwoKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHNlYXJjaFZhbHVlLCAnZ2knKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oaWdobGlnaHROYW1lKSB7XHJcbiAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKHJlZ0V4cCwgZnVuY3Rpb24gKHN0cikge1xyXG4gICAgICAgICAgICByZXR1cm4gXCI8YiBjbGFzcz1cXFwiXCIgKyBfdGhpczQub3B0aW9ucy5oaWdobGlnaHRDbGFzcyArIFwiXFxcIj5cIiArIHN0ciArIFwiPC9iPlwiO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhpZ2hsaWdodFBhdGgpIHtcclxuICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UocmVnRXhwLCBmdW5jdGlvbiAoc3RyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIjxiIGNsYXNzPVxcXCJcIiArIF90aGlzNC5vcHRpb25zLmhpZ2hsaWdodENsYXNzICsgXCJcXFwiPlwiICsgc3RyICsgXCI8L2I+XCI7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBcIjxhIGhyZWY9XFxcIlwiICsgbGluayArIFwiXFxcIiBjbGFzcz1cXFwibGlzdC1ncm91cC1pdGVtXFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInNlYXJjaC10aXRsZVxcXCI+XFxuICAgICAgICAgIFwiICsgbmFtZSArIFwiXFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInNlYXJjaC1wYXRoXFxcIj5cXG4gICAgICAgICAgXCIgKyBwYXRoICsgXCJcXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvYT5cIjtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLl9hZGROb3RGb3VuZCA9IGZ1bmN0aW9uIF9hZGROb3RGb3VuZCgpIHtcclxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX1NFQVJDSF9SRVNVTFRTX0dST1VQKS5hcHBlbmQodGhpcy5fcmVuZGVySXRlbSh0aGlzLm9wdGlvbnMubm90Rm91bmRUZXh0LCAnIycsIFtdKSk7XHJcbiAgICB9IC8vIFN0YXRpY1xyXG4gICAgO1xyXG5cclxuICAgIFNpZGViYXJTZWFyY2guX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XHJcbiAgICAgIHZhciBkYXRhID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkYSk7XHJcblxyXG4gICAgICBpZiAoIWRhdGEpIHtcclxuICAgICAgICBkYXRhID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdmFyIF9vcHRpb25zID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmV4dGVuZCh7fSwgRGVmYXVsdCQ4LCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IGRhdGEpO1xyXG5cclxuICAgICAgdmFyIHBsdWdpbiA9IG5ldyBTaWRlYmFyU2VhcmNoKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSwgX29wdGlvbnMpO1xyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSRhLCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IGRhdGEpO1xyXG5cclxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnICYmIGNvbmZpZy5tYXRjaCgvaW5pdHx0b2dnbGV8Y2xvc2V8b3BlbnxzZWFyY2gvKSkge1xyXG4gICAgICAgIHBsdWdpbltjb25maWddKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGx1Z2luLmluaXQoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gU2lkZWJhclNlYXJjaDtcclxuICB9KCk7XHJcbiAgLyoqXHJcbiAgICogRGF0YSBBUElcclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9uKCdjbGljaycsIFNFTEVDVE9SX1NFQVJDSF9CVVRUT04sIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICBTaWRlYmFyU2VhcmNoLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfREFUQV9XSURHRVQkMSksICd0b2dnbGUnKTtcclxuICB9KTtcclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9uKCdrZXl1cCcsIFNFTEVDVE9SX1NFQVJDSF9JTlBVVCwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAzOCkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfU0VBUkNIX1JFU1VMVFNfR1JPVVApLmNoaWxkcmVuKCkubGFzdCgpLmZvY3VzKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSA0MCkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfU0VBUkNIX1JFU1VMVFNfR1JPVVApLmNoaWxkcmVuKCkuZmlyc3QoKS5mb2N1cygpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHRpbWVyID0gMDtcclxuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XHJcbiAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICBTaWRlYmFyU2VhcmNoLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfREFUQV9XSURHRVQkMSksICdzZWFyY2gnKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfSk7XHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbigna2V5ZG93bicsIFNFTEVDVE9SX1NFQVJDSF9SRVNVTFRTX0dST1VQLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgIHZhciAkZm9jdXNlZCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnOmZvY3VzJyk7XHJcblxyXG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gMzgpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgIGlmICgkZm9jdXNlZC5pcygnOmZpcnN0LWNoaWxkJykpIHtcclxuICAgICAgICAkZm9jdXNlZC5zaWJsaW5ncygpLmxhc3QoKS5mb2N1cygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICRmb2N1c2VkLnByZXYoKS5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gNDApIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgIGlmICgkZm9jdXNlZC5pcygnOmxhc3QtY2hpbGQnKSkge1xyXG4gICAgICAgICRmb2N1c2VkLnNpYmxpbmdzKCkuZmlyc3QoKS5mb2N1cygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICRmb2N1c2VkLm5leHQoKS5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICBTaWRlYmFyU2VhcmNoLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkX19kZWZhdWx0WydkZWZhdWx0J10oU0VMRUNUT1JfREFUQV9XSURHRVQkMSksICdpbml0Jyk7XHJcbiAgfSk7XHJcbiAgLyoqXHJcbiAgICogalF1ZXJ5IEFQSVxyXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgKi9cclxuXHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkYV0gPSBTaWRlYmFyU2VhcmNoLl9qUXVlcnlJbnRlcmZhY2U7XHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkYV0uQ29uc3RydWN0b3IgPSBTaWRlYmFyU2VhcmNoO1xyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRhXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkYV0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkYTtcclxuICAgIHJldHVybiBTaWRlYmFyU2VhcmNoLl9qUXVlcnlJbnRlcmZhY2U7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgKiBBZG1pbkxURSBUb2FzdHMuanNcclxuICAgKiBMaWNlbnNlIE1JVFxyXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICovXHJcbiAgLyoqXHJcbiAgICogQ29uc3RhbnRzXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuICB2YXIgTkFNRSRiID0gJ1RvYXN0cyc7XHJcbiAgdmFyIERBVEFfS0VZJGIgPSAnbHRlLnRvYXN0cyc7XHJcbiAgdmFyIEVWRU5UX0tFWSQ2ID0gXCIuXCIgKyBEQVRBX0tFWSRiO1xyXG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkYiA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJGJdO1xyXG4gIHZhciBFVkVOVF9JTklUID0gXCJpbml0XCIgKyBFVkVOVF9LRVkkNjtcclxuICB2YXIgRVZFTlRfQ1JFQVRFRCA9IFwiY3JlYXRlZFwiICsgRVZFTlRfS0VZJDY7XHJcbiAgdmFyIEVWRU5UX1JFTU9WRUQkMSA9IFwicmVtb3ZlZFwiICsgRVZFTlRfS0VZJDY7XHJcbiAgdmFyIFNFTEVDVE9SX0NPTlRBSU5FUl9UT1BfUklHSFQgPSAnI3RvYXN0c0NvbnRhaW5lclRvcFJpZ2h0JztcclxuICB2YXIgU0VMRUNUT1JfQ09OVEFJTkVSX1RPUF9MRUZUID0gJyN0b2FzdHNDb250YWluZXJUb3BMZWZ0JztcclxuICB2YXIgU0VMRUNUT1JfQ09OVEFJTkVSX0JPVFRPTV9SSUdIVCA9ICcjdG9hc3RzQ29udGFpbmVyQm90dG9tUmlnaHQnO1xyXG4gIHZhciBTRUxFQ1RPUl9DT05UQUlORVJfQk9UVE9NX0xFRlQgPSAnI3RvYXN0c0NvbnRhaW5lckJvdHRvbUxlZnQnO1xyXG4gIHZhciBDTEFTU19OQU1FX1RPUF9SSUdIVCA9ICd0b2FzdHMtdG9wLXJpZ2h0JztcclxuICB2YXIgQ0xBU1NfTkFNRV9UT1BfTEVGVCA9ICd0b2FzdHMtdG9wLWxlZnQnO1xyXG4gIHZhciBDTEFTU19OQU1FX0JPVFRPTV9SSUdIVCA9ICd0b2FzdHMtYm90dG9tLXJpZ2h0JztcclxuICB2YXIgQ0xBU1NfTkFNRV9CT1RUT01fTEVGVCA9ICd0b2FzdHMtYm90dG9tLWxlZnQnO1xyXG4gIHZhciBQT1NJVElPTl9UT1BfUklHSFQgPSAndG9wUmlnaHQnO1xyXG4gIHZhciBQT1NJVElPTl9UT1BfTEVGVCA9ICd0b3BMZWZ0JztcclxuICB2YXIgUE9TSVRJT05fQk9UVE9NX1JJR0hUID0gJ2JvdHRvbVJpZ2h0JztcclxuICB2YXIgUE9TSVRJT05fQk9UVE9NX0xFRlQgPSAnYm90dG9tTGVmdCc7XHJcbiAgdmFyIERlZmF1bHQkOSA9IHtcclxuICAgIHBvc2l0aW9uOiBQT1NJVElPTl9UT1BfUklHSFQsXHJcbiAgICBmaXhlZDogdHJ1ZSxcclxuICAgIGF1dG9oaWRlOiBmYWxzZSxcclxuICAgIGF1dG9yZW1vdmU6IHRydWUsXHJcbiAgICBkZWxheTogMTAwMCxcclxuICAgIGZhZGU6IHRydWUsXHJcbiAgICBpY29uOiBudWxsLFxyXG4gICAgaW1hZ2U6IG51bGwsXHJcbiAgICBpbWFnZUFsdDogbnVsbCxcclxuICAgIGltYWdlSGVpZ2h0OiAnMjVweCcsXHJcbiAgICB0aXRsZTogbnVsbCxcclxuICAgIHN1YnRpdGxlOiBudWxsLFxyXG4gICAgY2xvc2U6IHRydWUsXHJcbiAgICBib2R5OiBudWxsLFxyXG4gICAgY2xhc3M6IG51bGxcclxuICB9O1xyXG4gIC8qKlxyXG4gICAqIENsYXNzIERlZmluaXRpb25cclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG4gIHZhciBUb2FzdHMgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gVG9hc3RzKGVsZW1lbnQsIGNvbmZpZykge1xyXG4gICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XHJcblxyXG4gICAgICB0aGlzLl9wcmVwYXJlQ29udGFpbmVyKCk7XHJcblxyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oJ2JvZHknKS50cmlnZ2VyKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9JTklUKSk7XHJcbiAgICB9IC8vIFB1YmxpY1xyXG5cclxuXHJcbiAgICB2YXIgX3Byb3RvID0gVG9hc3RzLnByb3RvdHlwZTtcclxuXHJcbiAgICBfcHJvdG8uY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKCkge1xyXG4gICAgICB2YXIgdG9hc3QgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oJzxkaXYgY2xhc3M9XCJ0b2FzdFwiIHJvbGU9XCJhbGVydFwiIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiIGFyaWEtYXRvbWljPVwidHJ1ZVwiLz4nKTtcclxuICAgICAgdG9hc3QuZGF0YSgnYXV0b2hpZGUnLCB0aGlzLl9jb25maWcuYXV0b2hpZGUpO1xyXG4gICAgICB0b2FzdC5kYXRhKCdhbmltYXRpb24nLCB0aGlzLl9jb25maWcuZmFkZSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmNsYXNzKSB7XHJcbiAgICAgICAgdG9hc3QuYWRkQ2xhc3ModGhpcy5fY29uZmlnLmNsYXNzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5kZWxheSAmJiB0aGlzLl9jb25maWcuZGVsYXkgIT0gNTAwKSB7XHJcbiAgICAgICAgdG9hc3QuZGF0YSgnZGVsYXknLCB0aGlzLl9jb25maWcuZGVsYXkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2YXIgdG9hc3RIZWFkZXIgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oJzxkaXYgY2xhc3M9XCJ0b2FzdC1oZWFkZXJcIj4nKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9jb25maWcuaW1hZ2UgIT0gbnVsbCkge1xyXG4gICAgICAgIHZhciB0b2FzdEltYWdlID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKCc8aW1nIC8+JykuYWRkQ2xhc3MoJ3JvdW5kZWQgbXItMicpLmF0dHIoJ3NyYycsIHRoaXMuX2NvbmZpZy5pbWFnZSkuYXR0cignYWx0JywgdGhpcy5fY29uZmlnLmltYWdlQWx0KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5pbWFnZUhlaWdodCAhPSBudWxsKSB7XHJcbiAgICAgICAgICB0b2FzdEltYWdlLmhlaWdodCh0aGlzLl9jb25maWcuaW1hZ2VIZWlnaHQpLndpZHRoKCdhdXRvJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0b2FzdEhlYWRlci5hcHBlbmQodG9hc3RJbWFnZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLl9jb25maWcuaWNvbiAhPSBudWxsKSB7XHJcbiAgICAgICAgdG9hc3RIZWFkZXIuYXBwZW5kKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnPGkgLz4nKS5hZGRDbGFzcygnbXItMicpLmFkZENsYXNzKHRoaXMuX2NvbmZpZy5pY29uKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLl9jb25maWcudGl0bGUgIT0gbnVsbCkge1xyXG4gICAgICAgIHRvYXN0SGVhZGVyLmFwcGVuZCgkX19kZWZhdWx0WydkZWZhdWx0J10oJzxzdHJvbmcgLz4nKS5hZGRDbGFzcygnbXItYXV0bycpLmh0bWwodGhpcy5fY29uZmlnLnRpdGxlKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLl9jb25maWcuc3VidGl0bGUgIT0gbnVsbCkge1xyXG4gICAgICAgIHRvYXN0SGVhZGVyLmFwcGVuZCgkX19kZWZhdWx0WydkZWZhdWx0J10oJzxzbWFsbCAvPicpLmh0bWwodGhpcy5fY29uZmlnLnN1YnRpdGxlKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLl9jb25maWcuY2xvc2UgPT0gdHJ1ZSkge1xyXG4gICAgICAgIHZhciB0b2FzdENsb3NlID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKCc8YnV0dG9uIGRhdGEtZGlzbWlzcz1cInRvYXN0XCIgLz4nKS5hdHRyKCd0eXBlJywgJ2J1dHRvbicpLmFkZENsYXNzKCdtbC0yIG1iLTEgY2xvc2UnKS5hdHRyKCdhcmlhLWxhYmVsJywgJ0Nsb3NlJykuYXBwZW5kKCc8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPicpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLnRpdGxlID09IG51bGwpIHtcclxuICAgICAgICAgIHRvYXN0Q2xvc2UudG9nZ2xlQ2xhc3MoJ21sLTIgbWwtYXV0bycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdG9hc3RIZWFkZXIuYXBwZW5kKHRvYXN0Q2xvc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0b2FzdC5hcHBlbmQodG9hc3RIZWFkZXIpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5ib2R5ICE9IG51bGwpIHtcclxuICAgICAgICB0b2FzdC5hcHBlbmQoJF9fZGVmYXVsdFsnZGVmYXVsdCddKCc8ZGl2IGNsYXNzPVwidG9hc3QtYm9keVwiIC8+JykuaHRtbCh0aGlzLl9jb25maWcuYm9keSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZ2V0Q29udGFpbmVySWQoKSkucHJlcGVuZCh0b2FzdCk7XHJcbiAgICAgIHZhciAkYm9keSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnYm9keScpO1xyXG4gICAgICAkYm9keS50cmlnZ2VyKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9DUkVBVEVEKSk7XHJcbiAgICAgIHRvYXN0LnRvYXN0KCdzaG93Jyk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmF1dG9yZW1vdmUpIHtcclxuICAgICAgICB0b2FzdC5vbignaGlkZGVuLmJzLnRvYXN0JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRlbGF5KDIwMCkucmVtb3ZlKCk7XHJcbiAgICAgICAgICAkYm9keS50cmlnZ2VyKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9SRU1PVkVEJDEpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSAvLyBTdGF0aWNcclxuICAgIDtcclxuXHJcbiAgICBfcHJvdG8uX2dldENvbnRhaW5lcklkID0gZnVuY3Rpb24gX2dldENvbnRhaW5lcklkKCkge1xyXG4gICAgICBpZiAodGhpcy5fY29uZmlnLnBvc2l0aW9uID09IFBPU0lUSU9OX1RPUF9SSUdIVCkge1xyXG4gICAgICAgIHJldHVybiBTRUxFQ1RPUl9DT05UQUlORVJfVE9QX1JJR0hUO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5fY29uZmlnLnBvc2l0aW9uID09IFBPU0lUSU9OX1RPUF9MRUZUKSB7XHJcbiAgICAgICAgcmV0dXJuIFNFTEVDVE9SX0NPTlRBSU5FUl9UT1BfTEVGVDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5wb3NpdGlvbiA9PSBQT1NJVElPTl9CT1RUT01fUklHSFQpIHtcclxuICAgICAgICByZXR1cm4gU0VMRUNUT1JfQ09OVEFJTkVSX0JPVFRPTV9SSUdIVDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5wb3NpdGlvbiA9PSBQT1NJVElPTl9CT1RUT01fTEVGVCkge1xyXG4gICAgICAgIHJldHVybiBTRUxFQ1RPUl9DT05UQUlORVJfQk9UVE9NX0xFRlQ7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLl9wcmVwYXJlQ29udGFpbmVyID0gZnVuY3Rpb24gX3ByZXBhcmVDb250YWluZXIoKSB7XHJcbiAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZ2V0Q29udGFpbmVySWQoKSkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnPGRpdiAvPicpLmF0dHIoJ2lkJywgdGhpcy5fZ2V0Q29udGFpbmVySWQoKS5yZXBsYWNlKCcjJywgJycpKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5wb3NpdGlvbiA9PSBQT1NJVElPTl9UT1BfUklHSFQpIHtcclxuICAgICAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyhDTEFTU19OQU1FX1RPUF9SSUdIVCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jb25maWcucG9zaXRpb24gPT0gUE9TSVRJT05fVE9QX0xFRlQpIHtcclxuICAgICAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyhDTEFTU19OQU1FX1RPUF9MRUZUKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NvbmZpZy5wb3NpdGlvbiA9PSBQT1NJVElPTl9CT1RUT01fUklHSFQpIHtcclxuICAgICAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyhDTEFTU19OQU1FX0JPVFRPTV9SSUdIVCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jb25maWcucG9zaXRpb24gPT0gUE9TSVRJT05fQk9UVE9NX0xFRlQpIHtcclxuICAgICAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyhDTEFTU19OQU1FX0JPVFRPTV9MRUZUKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSgnYm9keScpLmFwcGVuZChjb250YWluZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmZpeGVkKSB7XHJcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2dldENvbnRhaW5lcklkKCkpLmFkZENsYXNzKCdmaXhlZCcpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9nZXRDb250YWluZXJJZCgpKS5yZW1vdmVDbGFzcygnZml4ZWQnKTtcclxuICAgICAgfVxyXG4gICAgfSAvLyBTdGF0aWNcclxuICAgIDtcclxuXHJcbiAgICBUb2FzdHMuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2Uob3B0aW9uLCBjb25maWcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIF9vcHRpb25zID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmV4dGVuZCh7fSwgRGVmYXVsdCQ5LCBjb25maWcpO1xyXG5cclxuICAgICAgICB2YXIgdG9hc3QgPSBuZXcgVG9hc3RzKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSwgX29wdGlvbnMpO1xyXG5cclxuICAgICAgICBpZiAob3B0aW9uID09PSAnY3JlYXRlJykge1xyXG4gICAgICAgICAgdG9hc3Rbb3B0aW9uXSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBUb2FzdHM7XHJcbiAgfSgpO1xyXG4gIC8qKlxyXG4gICAqIGpRdWVyeSBBUElcclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRiXSA9IFRvYXN0cy5falF1ZXJ5SW50ZXJmYWNlO1xyXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJGJdLkNvbnN0cnVjdG9yID0gVG9hc3RzO1xyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRiXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkYl0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkYjtcclxuICAgIHJldHVybiBUb2FzdHMuX2pRdWVyeUludGVyZmFjZTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAqIEFkbWluTFRFIFRvZG9MaXN0LmpzXHJcbiAgICogTGljZW5zZSBNSVRcclxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAqL1xyXG4gIC8qKlxyXG4gICAqIENvbnN0YW50c1xyXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgKi9cclxuXHJcbiAgdmFyIE5BTUUkYyA9ICdUb2RvTGlzdCc7XHJcbiAgdmFyIERBVEFfS0VZJGMgPSAnbHRlLnRvZG9saXN0JztcclxuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJGMgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRjXTtcclxuICB2YXIgU0VMRUNUT1JfREFUQV9UT0dHTEUkNCA9ICdbZGF0YS13aWRnZXQ9XCJ0b2RvLWxpc3RcIl0nO1xyXG4gIHZhciBDTEFTU19OQU1FX1RPRE9fTElTVF9ET05FID0gJ2RvbmUnO1xyXG4gIHZhciBEZWZhdWx0JGEgPSB7XHJcbiAgICBvbkNoZWNrOiBmdW5jdGlvbiBvbkNoZWNrKGl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICB9LFxyXG4gICAgb25VbkNoZWNrOiBmdW5jdGlvbiBvblVuQ2hlY2soaXRlbSkge1xyXG4gICAgICByZXR1cm4gaXRlbTtcclxuICAgIH1cclxuICB9O1xyXG4gIC8qKlxyXG4gICAqIENsYXNzIERlZmluaXRpb25cclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICovXHJcblxyXG4gIHZhciBUb2RvTGlzdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBUb2RvTGlzdChlbGVtZW50LCBjb25maWcpIHtcclxuICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xyXG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcclxuXHJcbiAgICAgIHRoaXMuX2luaXQoKTtcclxuICAgIH0gLy8gUHVibGljXHJcblxyXG5cclxuICAgIHZhciBfcHJvdG8gPSBUb2RvTGlzdC5wcm90b3R5cGU7XHJcblxyXG4gICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZShpdGVtKSB7XHJcbiAgICAgIGl0ZW0ucGFyZW50cygnbGknKS50b2dnbGVDbGFzcyhDTEFTU19OQU1FX1RPRE9fTElTVF9ET05FKTtcclxuXHJcbiAgICAgIGlmICghJF9fZGVmYXVsdFsnZGVmYXVsdCddKGl0ZW0pLnByb3AoJ2NoZWNrZWQnKSkge1xyXG4gICAgICAgIHRoaXMudW5DaGVjaygkX19kZWZhdWx0WydkZWZhdWx0J10oaXRlbSkpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jaGVjayhpdGVtKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLmNoZWNrID0gZnVuY3Rpb24gY2hlY2soaXRlbSkge1xyXG4gICAgICB0aGlzLl9jb25maWcub25DaGVjay5jYWxsKGl0ZW0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8udW5DaGVjayA9IGZ1bmN0aW9uIHVuQ2hlY2soaXRlbSkge1xyXG4gICAgICB0aGlzLl9jb25maWcub25VbkNoZWNrLmNhbGwoaXRlbSk7XHJcbiAgICB9IC8vIFByaXZhdGVcclxuICAgIDtcclxuXHJcbiAgICBfcHJvdG8uX2luaXQgPSBmdW5jdGlvbiBfaW5pdCgpIHtcclxuICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgIHZhciAkdG9nZ2xlU2VsZWN0b3IgPSB0aGlzLl9lbGVtZW50O1xyXG4gICAgICAkdG9nZ2xlU2VsZWN0b3IuZmluZCgnaW5wdXQ6Y2hlY2tib3g6Y2hlY2tlZCcpLnBhcmVudHMoJ2xpJykudG9nZ2xlQ2xhc3MoQ0xBU1NfTkFNRV9UT0RPX0xJU1RfRE9ORSk7XHJcbiAgICAgICR0b2dnbGVTZWxlY3Rvci5vbignY2hhbmdlJywgJ2lucHV0OmNoZWNrYm94JywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgX3RoaXMudG9nZ2xlKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShldmVudC50YXJnZXQpKTtcclxuICAgICAgfSk7XHJcbiAgICB9IC8vIFN0YXRpY1xyXG4gICAgO1xyXG5cclxuICAgIFRvZG9MaXN0Ll9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xyXG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgZGF0YSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJGMpO1xyXG5cclxuICAgICAgICBpZiAoIWRhdGEpIHtcclxuICAgICAgICAgIGRhdGEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIF9vcHRpb25zID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmV4dGVuZCh7fSwgRGVmYXVsdCRhLCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IGRhdGEpO1xyXG5cclxuICAgICAgICB2YXIgcGx1Z2luID0gbmV3IFRvZG9MaXN0KCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSwgX29wdGlvbnMpO1xyXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJGMsIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDogZGF0YSk7XHJcblxyXG4gICAgICAgIGlmIChjb25maWcgPT09ICdpbml0Jykge1xyXG4gICAgICAgICAgcGx1Z2luW2NvbmZpZ10oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gVG9kb0xpc3Q7XHJcbiAgfSgpO1xyXG4gIC8qKlxyXG4gICAqIERhdGEgQVBJXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuXHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICBUb2RvTGlzdC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0RBVEFfVE9HR0xFJDQpKTtcclxuICB9KTtcclxuICAvKipcclxuICAgKiBqUXVlcnkgQVBJXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRjXSA9IFRvZG9MaXN0Ll9qUXVlcnlJbnRlcmZhY2U7XHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkY10uQ29uc3RydWN0b3IgPSBUb2RvTGlzdDtcclxuXHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkY10ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJGNdID0gSlFVRVJZX05PX0NPTkZMSUNUJGM7XHJcbiAgICByZXR1cm4gVG9kb0xpc3QuX2pRdWVyeUludGVyZmFjZTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAqIEFkbWluTFRFIFRyZWV2aWV3LmpzXHJcbiAgICogTGljZW5zZSBNSVRcclxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAqL1xyXG4gIC8qKlxyXG4gICAqIENvbnN0YW50c1xyXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgKi9cclxuXHJcbiAgdmFyIE5BTUUkZCA9ICdUcmVldmlldyc7XHJcbiAgdmFyIERBVEFfS0VZJGQgPSAnbHRlLnRyZWV2aWV3JztcclxuICB2YXIgRVZFTlRfS0VZJDcgPSBcIi5cIiArIERBVEFfS0VZJGQ7XHJcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCRkID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkZF07XHJcbiAgdmFyIEVWRU5UX0VYUEFOREVEJDMgPSBcImV4cGFuZGVkXCIgKyBFVkVOVF9LRVkkNztcclxuICB2YXIgRVZFTlRfQ09MTEFQU0VEJDQgPSBcImNvbGxhcHNlZFwiICsgRVZFTlRfS0VZJDc7XHJcbiAgdmFyIEVWRU5UX0xPQURfREFUQV9BUEkgPSBcImxvYWRcIiArIEVWRU5UX0tFWSQ3O1xyXG4gIHZhciBTRUxFQ1RPUl9MSSA9ICcubmF2LWl0ZW0nO1xyXG4gIHZhciBTRUxFQ1RPUl9MSU5LID0gJy5uYXYtbGluayc7XHJcbiAgdmFyIFNFTEVDVE9SX1RSRUVWSUVXX01FTlUgPSAnLm5hdi10cmVldmlldyc7XHJcbiAgdmFyIFNFTEVDVE9SX09QRU4gPSAnLm1lbnUtb3Blbic7XHJcbiAgdmFyIFNFTEVDVE9SX0RBVEFfV0lER0VUJDIgPSAnW2RhdGEtd2lkZ2V0PVwidHJlZXZpZXdcIl0nO1xyXG4gIHZhciBDTEFTU19OQU1FX09QRU4kMiA9ICdtZW51LW9wZW4nO1xyXG4gIHZhciBDTEFTU19OQU1FX0lTX09QRU5JTkckMSA9ICdtZW51LWlzLW9wZW5pbmcnO1xyXG4gIHZhciBDTEFTU19OQU1FX1NJREVCQVJfQ09MTEFQU0VEID0gJ3NpZGViYXItY29sbGFwc2UnO1xyXG4gIHZhciBEZWZhdWx0JGIgPSB7XHJcbiAgICB0cmlnZ2VyOiBTRUxFQ1RPUl9EQVRBX1dJREdFVCQyICsgXCIgXCIgKyBTRUxFQ1RPUl9MSU5LLFxyXG4gICAgYW5pbWF0aW9uU3BlZWQ6IDMwMCxcclxuICAgIGFjY29yZGlvbjogdHJ1ZSxcclxuICAgIGV4cGFuZFNpZGViYXI6IGZhbHNlLFxyXG4gICAgc2lkZWJhckJ1dHRvblNlbGVjdG9yOiAnW2RhdGEtd2lkZ2V0PVwicHVzaG1lbnVcIl0nXHJcbiAgfTtcclxuICAvKipcclxuICAgKiBDbGFzcyBEZWZpbml0aW9uXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuICB2YXIgVHJlZXZpZXcgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gVHJlZXZpZXcoZWxlbWVudCwgY29uZmlnKSB7XHJcbiAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcclxuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgICB9IC8vIFB1YmxpY1xyXG5cclxuXHJcbiAgICB2YXIgX3Byb3RvID0gVHJlZXZpZXcucHJvdG90eXBlO1xyXG5cclxuICAgIF9wcm90by5pbml0ID0gZnVuY3Rpb24gaW5pdCgpIHtcclxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFwiXCIgKyBTRUxFQ1RPUl9MSSArIFNFTEVDVE9SX09QRU4gKyBcIiBcIiArIFNFTEVDVE9SX1RSRUVWSUVXX01FTlUpLmNzcygnZGlzcGxheScsICdibG9jaycpO1xyXG5cclxuICAgICAgdGhpcy5fc2V0dXBMaXN0ZW5lcnMoKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLmV4cGFuZCA9IGZ1bmN0aW9uIGV4cGFuZCh0cmVldmlld01lbnUsIHBhcmVudExpKSB7XHJcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICB2YXIgZXhwYW5kZWRFdmVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9FWFBBTkRFRCQzKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9jb25maWcuYWNjb3JkaW9uKSB7XHJcbiAgICAgICAgdmFyIG9wZW5NZW51TGkgPSBwYXJlbnRMaS5zaWJsaW5ncyhTRUxFQ1RPUl9PUEVOKS5maXJzdCgpO1xyXG4gICAgICAgIHZhciBvcGVuVHJlZXZpZXcgPSBvcGVuTWVudUxpLmZpbmQoU0VMRUNUT1JfVFJFRVZJRVdfTUVOVSkuZmlyc3QoKTtcclxuICAgICAgICB0aGlzLmNvbGxhcHNlKG9wZW5UcmVldmlldywgb3Blbk1lbnVMaSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHBhcmVudExpLmFkZENsYXNzKENMQVNTX05BTUVfSVNfT1BFTklORyQxKTtcclxuICAgICAgdHJlZXZpZXdNZW51LnN0b3AoKS5zbGlkZURvd24odGhpcy5fY29uZmlnLmFuaW1hdGlvblNwZWVkLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcGFyZW50TGkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9PUEVOJDIpO1xyXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShfdGhpcy5fZWxlbWVudCkudHJpZ2dlcihleHBhbmRlZEV2ZW50KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmV4cGFuZFNpZGViYXIpIHtcclxuICAgICAgICB0aGlzLl9leHBhbmRTaWRlYmFyKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLmNvbGxhcHNlID0gZnVuY3Rpb24gY29sbGFwc2UodHJlZXZpZXdNZW51LCBwYXJlbnRMaSkge1xyXG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcclxuXHJcbiAgICAgIHZhciBjb2xsYXBzZWRFdmVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9DT0xMQVBTRUQkNCk7XHJcbiAgICAgIHBhcmVudExpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfSVNfT1BFTklORyQxICsgXCIgXCIgKyBDTEFTU19OQU1FX09QRU4kMik7XHJcbiAgICAgIHRyZWV2aWV3TWVudS5zdG9wKCkuc2xpZGVVcCh0aGlzLl9jb25maWcuYW5pbWF0aW9uU3BlZWQsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oX3RoaXMyLl9lbGVtZW50KS50cmlnZ2VyKGNvbGxhcHNlZEV2ZW50KTtcclxuICAgICAgICB0cmVldmlld01lbnUuZmluZChTRUxFQ1RPUl9PUEVOICsgXCIgPiBcIiArIFNFTEVDVE9SX1RSRUVWSUVXX01FTlUpLnNsaWRlVXAoKTtcclxuICAgICAgICB0cmVldmlld01lbnUuZmluZChTRUxFQ1RPUl9PUEVOKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX09QRU4kMik7XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8udG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKGV2ZW50KSB7XHJcbiAgICAgIHZhciAkcmVsYXRpdmVUYXJnZXQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oZXZlbnQuY3VycmVudFRhcmdldCk7XHJcbiAgICAgIHZhciAkcGFyZW50ID0gJHJlbGF0aXZlVGFyZ2V0LnBhcmVudCgpO1xyXG4gICAgICB2YXIgdHJlZXZpZXdNZW51ID0gJHBhcmVudC5maW5kKFwiPiBcIiArIFNFTEVDVE9SX1RSRUVWSUVXX01FTlUpO1xyXG5cclxuICAgICAgaWYgKCF0cmVldmlld01lbnUuaXMoU0VMRUNUT1JfVFJFRVZJRVdfTUVOVSkpIHtcclxuICAgICAgICBpZiAoISRwYXJlbnQuaXMoU0VMRUNUT1JfTEkpKSB7XHJcbiAgICAgICAgICB0cmVldmlld01lbnUgPSAkcGFyZW50LnBhcmVudCgpLmZpbmQoXCI+IFwiICsgU0VMRUNUT1JfVFJFRVZJRVdfTUVOVSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRyZWV2aWV3TWVudS5pcyhTRUxFQ1RPUl9UUkVFVklFV19NRU5VKSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdmFyIHBhcmVudExpID0gJHJlbGF0aXZlVGFyZ2V0LnBhcmVudHMoU0VMRUNUT1JfTEkpLmZpcnN0KCk7XHJcbiAgICAgIHZhciBpc09wZW4gPSBwYXJlbnRMaS5oYXNDbGFzcyhDTEFTU19OQU1FX09QRU4kMik7XHJcblxyXG4gICAgICBpZiAoaXNPcGVuKSB7XHJcbiAgICAgICAgdGhpcy5jb2xsYXBzZSgkX19kZWZhdWx0WydkZWZhdWx0J10odHJlZXZpZXdNZW51KSwgcGFyZW50TGkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZXhwYW5kKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0cmVldmlld01lbnUpLCBwYXJlbnRMaSk7XHJcbiAgICAgIH1cclxuICAgIH0gLy8gUHJpdmF0ZVxyXG4gICAgO1xyXG5cclxuICAgIF9wcm90by5fc2V0dXBMaXN0ZW5lcnMgPSBmdW5jdGlvbiBfc2V0dXBMaXN0ZW5lcnMoKSB7XHJcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xyXG5cclxuICAgICAgdmFyIGVsZW1lbnRJZCA9IHRoaXMuX2VsZW1lbnQuYXR0cignaWQnKSAhPT0gdW5kZWZpbmVkID8gXCIjXCIgKyB0aGlzLl9lbGVtZW50LmF0dHIoJ2lkJykgOiAnJztcclxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbignY2xpY2snLCBcIlwiICsgZWxlbWVudElkICsgdGhpcy5fY29uZmlnLnRyaWdnZXIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgIF90aGlzMy50b2dnbGUoZXZlbnQpO1xyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLl9leHBhbmRTaWRlYmFyID0gZnVuY3Rpb24gX2V4cGFuZFNpZGViYXIoKSB7XHJcbiAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10oJ2JvZHknKS5oYXNDbGFzcyhDTEFTU19OQU1FX1NJREVCQVJfQ09MTEFQU0VEKSkge1xyXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9jb25maWcuc2lkZWJhckJ1dHRvblNlbGVjdG9yKS5QdXNoTWVudSgnZXhwYW5kJyk7XHJcbiAgICAgIH1cclxuICAgIH0gLy8gU3RhdGljXHJcbiAgICA7XHJcblxyXG4gICAgVHJlZXZpZXcuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBkYXRhID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkZCk7XHJcblxyXG4gICAgICAgIHZhciBfb3B0aW9ucyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5leHRlbmQoe30sIERlZmF1bHQkYiwgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoKSk7XHJcblxyXG4gICAgICAgIGlmICghZGF0YSkge1xyXG4gICAgICAgICAgZGF0YSA9IG5ldyBUcmVldmlldygkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcyksIF9vcHRpb25zKTtcclxuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJGQsIGRhdGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gJ2luaXQnKSB7XHJcbiAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gVHJlZXZpZXc7XHJcbiAgfSgpO1xyXG4gIC8qKlxyXG4gICAqIERhdGEgQVBJXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAqL1xyXG5cclxuXHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykub24oRVZFTlRfTE9BRF9EQVRBX0FQSSwgZnVuY3Rpb24gKCkge1xyXG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKFNFTEVDVE9SX0RBVEFfV0lER0VUJDIpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICBUcmVldmlldy5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLCAnaW5pdCcpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcbiAgLyoqXHJcbiAgICogalF1ZXJ5IEFQSVxyXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgKi9cclxuXHJcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkZF0gPSBUcmVldmlldy5falF1ZXJ5SW50ZXJmYWNlO1xyXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJGRdLkNvbnN0cnVjdG9yID0gVHJlZXZpZXc7XHJcblxyXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJGRdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRkXSA9IEpRVUVSWV9OT19DT05GTElDVCRkO1xyXG4gICAgcmV0dXJuIFRyZWV2aWV3Ll9qUXVlcnlJbnRlcmZhY2U7XHJcbiAgfTtcclxuXHJcbiAgZXhwb3J0cy5DYXJkUmVmcmVzaCA9IENhcmRSZWZyZXNoO1xyXG4gIGV4cG9ydHMuQ2FyZFdpZGdldCA9IENhcmRXaWRnZXQ7XHJcbiAgZXhwb3J0cy5Db250cm9sU2lkZWJhciA9IENvbnRyb2xTaWRlYmFyO1xyXG4gIGV4cG9ydHMuRGlyZWN0Q2hhdCA9IERpcmVjdENoYXQ7XHJcbiAgZXhwb3J0cy5Ecm9wZG93biA9IERyb3Bkb3duO1xyXG4gIGV4cG9ydHMuRXhwYW5kYWJsZVRhYmxlID0gRXhwYW5kYWJsZVRhYmxlO1xyXG4gIGV4cG9ydHMuRnVsbHNjcmVlbiA9IEZ1bGxzY3JlZW47XHJcbiAgZXhwb3J0cy5JRnJhbWUgPSBJRnJhbWU7XHJcbiAgZXhwb3J0cy5MYXlvdXQgPSBMYXlvdXQ7XHJcbiAgZXhwb3J0cy5QdXNoTWVudSA9IFB1c2hNZW51O1xyXG4gIGV4cG9ydHMuU2lkZWJhclNlYXJjaCA9IFNpZGViYXJTZWFyY2g7XHJcbiAgZXhwb3J0cy5Ub2FzdHMgPSBUb2FzdHM7XHJcbiAgZXhwb3J0cy5Ub2RvTGlzdCA9IFRvZG9MaXN0O1xyXG4gIGV4cG9ydHMuVHJlZXZpZXcgPSBUcmVldmlldztcclxuXHJcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuXHJcbn0pKSk7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkbWlubHRlLmpzLm1hcFxyXG4iXSwic291cmNlUm9vdCI6IiJ9\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\n__webpack_require__(/*! ./slim.kickstart.min */ \"./resources/js/slim.kickstart.min.js\");\n\n__webpack_require__(/*! ./bootstrap */ \"./resources/js/bootstrap.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYXBwLmpzPzZkNDAiXSwibmFtZXMiOlsicmVxdWlyZSJdLCJtYXBwaW5ncyI6IkFBQUFBLG1CQUFPLENBQUMsOENBQUQsQ0FBUDs7QUFDQUEsbUJBQU8sQ0FBQyxrRUFBRCxDQUFQOztBQUNBQSxtQkFBTyxDQUFDLGdEQUFELENBQVAiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYXBwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi9hZG1pbmx0ZScpO1xyXG5yZXF1aXJlKCcuL3NsaW0ua2lja3N0YXJ0Lm1pbicpXHJcbnJlcXVpcmUoJy4vYm9vdHN0cmFwJyk7XHJcblxyXG5cclxuXHJcbiJdLCJzb3VyY2VSb290IjoiIn0=\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/**\r\n * We'll load jQuery and the Bootstrap jQuery plugin which provides support\r\n * for JavaScript based Bootstrap features such as modals and tabs. This\r\n * code may be modified to fit the specific needs of your application.\r\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\n __webpack_require__(/*! bootstrap */ \"./node_modules/bootstrap/dist/js/bootstrap.js\");\n} catch (e) {}\n/**\r\n * We'll load the axios HTTP library which allows us to easily issue requests\r\n * to our Laravel back-end. This library automatically handles sending the\r\n * CSRF token as a header based on the value of the \"XSRF\" token cookie.\r\n */\n\n\nwindow.axios = __webpack_require__(/*! axios */ \"./node_modules/axios/index.js\");\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\n/**\r\n * Echo exposes an expressive API for subscribing to channels and listening\r\n * for events that are broadcast by Laravel. Echo and event broadcasting\r\n * allows your team to easily build robust real-time web applications.\r\n */\n// import Echo from 'laravel-echo';\n// window.Pusher = require('pusher-js');\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzP2Y1NjgiXSwibmFtZXMiOlsid2luZG93IiwiUG9wcGVyIiwicmVxdWlyZSIsIiQiLCJqUXVlcnkiLCJlIiwiYXhpb3MiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJjb21tb24iXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFJO0FBQ0FBLFFBQU0sQ0FBQ0MsTUFBUCxHQUFnQkMsMkZBQWhCO0FBQ0FGLFFBQU0sQ0FBQ0csQ0FBUCxHQUFXSCxNQUFNLENBQUNJLE1BQVAsR0FBZ0JGLG1CQUFPLENBQUMsb0RBQUQsQ0FBbEM7O0FBRUFBLHFCQUFPLENBQUMsZ0VBQUQsQ0FBUDtBQUNILENBTEQsQ0FLRSxPQUFPRyxDQUFQLEVBQVUsQ0FBRTtBQUVkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBTCxNQUFNLENBQUNNLEtBQVAsR0FBZUosbUJBQU8sQ0FBQyw0Q0FBRCxDQUF0QjtBQUVBRixNQUFNLENBQUNNLEtBQVAsQ0FBYUMsUUFBYixDQUFzQkMsT0FBdEIsQ0FBOEJDLE1BQTlCLENBQXFDLGtCQUFyQyxJQUEyRCxnQkFBM0Q7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9ib290c3RyYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB3aW5kb3cuXyA9IHJlcXVpcmUoJ2xvZGFzaCcpO1xyXG5cclxuLyoqXHJcbiAqIFdlJ2xsIGxvYWQgalF1ZXJ5IGFuZCB0aGUgQm9vdHN0cmFwIGpRdWVyeSBwbHVnaW4gd2hpY2ggcHJvdmlkZXMgc3VwcG9ydFxyXG4gKiBmb3IgSmF2YVNjcmlwdCBiYXNlZCBCb290c3RyYXAgZmVhdHVyZXMgc3VjaCBhcyBtb2RhbHMgYW5kIHRhYnMuIFRoaXNcclxuICogY29kZSBtYXkgYmUgbW9kaWZpZWQgdG8gZml0IHRoZSBzcGVjaWZpYyBuZWVkcyBvZiB5b3VyIGFwcGxpY2F0aW9uLlxyXG4gKi9cclxuXHJcbnRyeSB7XHJcbiAgICB3aW5kb3cuUG9wcGVyID0gcmVxdWlyZSgncG9wcGVyLmpzJykuZGVmYXVsdDtcclxuICAgIHdpbmRvdy4kID0gd2luZG93LmpRdWVyeSA9IHJlcXVpcmUoJ2pxdWVyeScpO1xyXG5cclxuICAgIHJlcXVpcmUoJ2Jvb3RzdHJhcCcpO1xyXG59IGNhdGNoIChlKSB7fVxyXG5cclxuLyoqXHJcbiAqIFdlJ2xsIGxvYWQgdGhlIGF4aW9zIEhUVFAgbGlicmFyeSB3aGljaCBhbGxvd3MgdXMgdG8gZWFzaWx5IGlzc3VlIHJlcXVlc3RzXHJcbiAqIHRvIG91ciBMYXJhdmVsIGJhY2stZW5kLiBUaGlzIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYW5kbGVzIHNlbmRpbmcgdGhlXHJcbiAqIENTUkYgdG9rZW4gYXMgYSBoZWFkZXIgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBcIlhTUkZcIiB0b2tlbiBjb29raWUuXHJcbiAqL1xyXG5cclxud2luZG93LmF4aW9zID0gcmVxdWlyZSgnYXhpb3MnKTtcclxuXHJcbndpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1SZXF1ZXN0ZWQtV2l0aCddID0gJ1hNTEh0dHBSZXF1ZXN0JztcclxuXHJcbi8qKlxyXG4gKiBFY2hvIGV4cG9zZXMgYW4gZXhwcmVzc2l2ZSBBUEkgZm9yIHN1YnNjcmliaW5nIHRvIGNoYW5uZWxzIGFuZCBsaXN0ZW5pbmdcclxuICogZm9yIGV2ZW50cyB0aGF0IGFyZSBicm9hZGNhc3QgYnkgTGFyYXZlbC4gRWNobyBhbmQgZXZlbnQgYnJvYWRjYXN0aW5nXHJcbiAqIGFsbG93cyB5b3VyIHRlYW0gdG8gZWFzaWx5IGJ1aWxkIHJvYnVzdCByZWFsLXRpbWUgd2ViIGFwcGxpY2F0aW9ucy5cclxuICovXHJcblxyXG4vLyBpbXBvcnQgRWNobyBmcm9tICdsYXJhdmVsLWVjaG8nO1xyXG5cclxuLy8gd2luZG93LlB1c2hlciA9IHJlcXVpcmUoJ3B1c2hlci1qcycpO1xyXG5cclxuLy8gd2luZG93LkVjaG8gPSBuZXcgRWNobyh7XHJcbi8vICAgICBicm9hZGNhc3RlcjogJ3B1c2hlcicsXHJcbi8vICAgICBrZXk6IHByb2Nlc3MuZW52Lk1JWF9QVVNIRVJfQVBQX0tFWSxcclxuLy8gICAgIGNsdXN0ZXI6IHByb2Nlc3MuZW52Lk1JWF9QVVNIRVJfQVBQX0NMVVNURVIsXHJcbi8vICAgICBmb3JjZVRMUzogdHJ1ZVxyXG4vLyB9KTtcclxuIl0sInNvdXJjZVJvb3QiOiIifQ==\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\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/*\r\n * Slim v4.19.0 - Image Cropping Made Easy\r\n * Copyright (c) 2018 Rik Schennink - http://slimimagecropper.com\r\n */\n!function (t, e) {\n function i() {\n t.Slim.parse(document);\n }\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\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\n t.width = r, t.height = s, l = t.getContext(\"2d\"), l.drawImage(h, 0, 0, r, s);\n }\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\n return \"function\" != typeof window.CustomEvent && (t.prototype = window.Event.prototype, void (window.CustomEvent = t));\n }();\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 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\n for (n in e) {\n e.hasOwnProperty(n) && (i[n] = e[n]);\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\n function a() {\n var t = Math.min((r || b) / b, (s || k) / k);\n t < 1 && (b *= t, k *= t);\n }\n\n i = i || {};\n\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\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\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\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\n case 3:\n i.translate(o, a), i.rotate(Math.PI);\n break;\n\n case 4:\n i.translate(0, a), i.scale(1, -1);\n break;\n\n case 5:\n i.rotate(.5 * Math.PI), i.scale(1, -1);\n break;\n\n case 6:\n i.rotate(.5 * Math.PI), i.translate(0, -a);\n break;\n\n case 7:\n i.rotate(.5 * Math.PI), i.translate(o, -a), i.scale(-1, 1);\n break;\n\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\n for (o in a) {\n a.hasOwnProperty(o) && (i[o] = a[o]);\n }\n\n switch (a.orientation) {\n case 2:\n i.left = a.right, i.right = a.left;\n break;\n\n case 3:\n i.left = a.right, i.top = a.bottom, i.right = a.left, i.bottom = a.top;\n break;\n\n case 4:\n i.top = a.bottom, i.bottom = a.top;\n break;\n\n case 5:\n i.left = a.top, i.top = a.left, i.right = a.bottom, i.bottom = a.right;\n break;\n\n case 6:\n i.left = a.top, i.top = a.right, i.right = a.bottom, i.bottom = a.left;\n break;\n\n case 7:\n i.left = a.bottom, i.top = a.right, i.right = a.top, i.bottom = a.left;\n break;\n\n case 8:\n i.left = a.bottom, i.top = a.left, i.right = a.top, i.bottom = a.right;\n }\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\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\n !i.disableImageHead && f > 6 && (l.slice ? r.imageHead = l.slice(0, f) : r.imageHead = new Uint8Array(l).subarray(0, f));\n }\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\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\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\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\n for (u = [], l = 0; l < a; l += 1) {\n u[l] = d.getValue(t, h + l * d.size, r);\n }\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\n return p;\n }\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\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\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\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\n case 19789:\n r = !1;\n break;\n\n default:\n return;\n }\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\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\n var s = function s(t, i, n) {\n var o = t;\n\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\n return a;\n }\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\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\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\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\n for (o = 0; o < s; ++o) {\n e = r[o][0], (t.contains(e) || t === e) && a.push(e);\n }\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\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\n return e;\n },\n v = function v(t) {\n var e = _(i, t);\n\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\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\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\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\n if (_) {\n var e = Math.max(1e-5, m - g);\n s.tick(e), t = s.getValue();\n }\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\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\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\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\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\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\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\n if (c) {\n var E = a.width - o.width;\n r.width = o.width + t * E;\n }\n\n if (d) {\n var C = a.height - o.height;\n r.height = o.height + t * C;\n }\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\n for (var i in t) {\n e[i] = t[i];\n }\n\n return e;\n };\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\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\n return a;\n }\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\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\n for (p = 1; p < z; p++) {\n if (B = B.next = new n(), p == U) var F = B;\n }\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\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\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\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\n _ += r;\n }\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\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\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\n return t;\n }\n\n function n() {\n this.r = 0, this.g = 0, this.b = 0, this.a = 0, this.next = null;\n }\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\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\n t(new Blob([a], {\n type: e || \"image/png\"\n }));\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\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\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\n return n;\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\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\n for (i in t) {\n t.hasOwnProperty(i) && (n[i] = \"undefined\" == typeof o[i] ? t[i] : o[i]);\n }\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\n for (var i = 0; i < e.length; i++) {\n if (e[i] === t) return !0;\n }\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\n try {\n e = JSON.parse(h.responseText);\n } catch (i) {}\n\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\n try {\n n = JSON.parse(h.responseText);\n } catch (i) {}\n\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\n for (e in w) {\n w.hasOwnProperty(e) && (i = w[e], t.indexOf(i) == -1 && t.push(i));\n }\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\n for (e in w) {\n if (w.hasOwnProperty(e) && w[e] === t) return e;\n }\n\n return t;\n },\n N = function N(t) {\n var e = void 0;\n\n for (e in w) {\n if (w.hasOwnProperty(e) && t.indexOf(w[e]) !== -1) return w[e];\n }\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\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\n if (i) {\n var n = new i();\n return n.append(t), n.getBlob(e);\n }\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\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\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\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\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\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\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\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\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\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\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\n this._element.appendChild(t);\n\n for (var e in i) {\n if (i.hasOwnProperty(e)) {\n var n = k(\"button\", e);\n\n this._element.appendChild(n);\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\n break;\n\n case \"touchmove\":\n case \"pointermove\":\n case \"mousemove\":\n this._onDrag(t);\n\n break;\n\n case \"touchend\":\n case \"touchcancel\":\n case \"pointerup\":\n case \"mouseup\":\n this._onStopDrag(t);\n\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\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\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\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\n break;\n\n case \"change\":\n this._onGridChange(t);\n\n break;\n\n case \"input\":\n this._onGridInput(t);\n\n break;\n\n case \"keydown\":\n this._onKeyDown(t);\n\n break;\n\n case \"resize\":\n this._onResize(t);\n\n }\n }\n }, {\n key: \"_onKeyDown\",\n value: function value(t) {\n switch (t.keyCode) {\n case v.RETURN:\n this._confirm();\n\n break;\n\n case v.ESC:\n this._cancel();\n\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\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\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\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\n this._updateWrapperScale();\n\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\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\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\n break;\n\n case \"dragleave\":\n this._onDragLeave(t);\n\n break;\n\n case \"drop\":\n this._onDrop(t);\n\n }\n }\n }, {\n key: \"_onDrop\",\n value: function value(t) {\n t.preventDefault();\n var e = null;\n\n if (this._allowURLs) {\n var i = void 0,\n n = void 0;\n\n try {\n i = t.dataTransfer.getData(\"url\"), n = t.dataTransfer.getData(\"text/html\");\n } catch (t) {}\n\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\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\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\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\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\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\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\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\n try {\n e = JSON.parse(this._output.value);\n } catch (i) {}\n\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\n this._input.removeAttribute(\"name\");\n\n var o = k(\"div\", \"slim-area\"),\n a = this._getInitialImage(),\n r = (a || {}).src,\n s = a ? a.getAttribute(\"data-filename\") : null;\n\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\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\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\n var e = function e() {\n var e = setTimeout(function () {\n t._options.didInit.apply(t, [t.data, t]);\n }, 0);\n\n t._timers.push(e);\n };\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\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\n if (this._element) {\n this._progressEnabled = !1;\n\n var i = this._element.querySelector(\".slim-loader\");\n\n if (i) {\n var n = i.children[0];\n\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\n if (this._element) {\n var e = this._element.querySelector(\".slim-loader\");\n\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\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\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\n break;\n\n case \"change\":\n this._onChange(t);\n\n break;\n\n case \"cancel\":\n this._onCancel(t);\n\n break;\n\n case \"confirm\":\n this._onConfirm(t);\n\n break;\n\n case \"file-over\":\n this._onFileOver(t);\n\n break;\n\n case \"file-out\":\n this._onFileOut(t);\n\n break;\n\n case \"file-drop\":\n this._onDropFile(t);\n\n break;\n\n case \"file-invalid\":\n this._onInvalidFile(t);\n\n break;\n\n case \"file-invalid-drop\":\n this._onInvalidFileDrop(t);\n\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\n var e = this._element.querySelector(\".slim-error\");\n\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\n var t = this._element.querySelector(\".slim-error\");\n\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\n switch (n.getAttribute(\"data-action\")) {\n case \"remove\":\n this._options.willRemove.apply(this, [this.data, function () {\n e._doRemove();\n }]);\n\n break;\n\n case \"edit\":\n this._doEdit();\n\n break;\n\n case \"download\":\n this._doDownload();\n\n break;\n\n case \"upload\":\n this._doUpload();\n\n }\n }\n }, {\n key: \"_onInvalidFileDrop\",\n value: function value() {\n this._onInvalidFile(), this._removeState(\"file-over\");\n\n var t = this._getDrip();\n\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\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\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\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\n var e = this._getDrip(),\n i = u.createMatrix();\n\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\n var e = this._getDrip(),\n i = u.createMatrix();\n\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\n this._removeState(\"file-over\");\n\n var i = this._getDrip(),\n n = u.createMatrix();\n\n n.translate(t.detail.x, t.detail.y, 0), u.setElementTransform(i, n);\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\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\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\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\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\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\n var r = n._options.didLoad.apply(n, [s, t, e, n]);\n\n if (r !== !0) return a(), r !== !1 && n._throwError(r), void (i && i.apply(n, [r]));\n\n n._removeState(\"loading\");\n\n var h = function h(t) {\n n._imageHopper && n._options.dropReplace && (n._imageHopper.enabled = !0);\n\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 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 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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\n var t = setTimeout(function () {\n Ft.hide();\n }, 250);\n\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\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\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\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\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\n var i = this._getOutro();\n\n i && (i.style.opacity = \"0\");\n var n = this.data;\n\n this._resetData();\n\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\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\n var i = _(this._originalElement);\n\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\n return function () {\n function t(t) {\n return t ? \"<p>\" + t + \"</p>\" : null;\n }\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\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\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\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\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\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\n return o;\n }, Gt.getOptionsFromAttributes = function (t) {\n var e = d(t),\n i = {\n meta: {}\n };\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\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\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2xpbS5raWNrc3RhcnQubWluLmpzPzljMDUiXSwibmFtZXMiOlsidCIsImUiLCJpIiwiU2xpbSIsInBhcnNlIiwiZG9jdW1lbnQiLCJUeXBlRXJyb3IiLCJuIiwibyIsIndpZHRoIiwiYSIsImhlaWdodCIsInIiLCJNYXRoIiwibWF4IiwibWluIiwicm91bmQiLCJzIiwiaCIsInN0IiwidSIsImwiLCJjcmVhdGVFbGVtZW50IiwiZ2V0Q29udGV4dCIsImRyYXdJbWFnZSIsImJ1YmJsZXMiLCJjYW5jZWxhYmxlIiwiZGV0YWlsIiwiY3JlYXRlRXZlbnQiLCJpbml0Q3VzdG9tRXZlbnQiLCJ3aW5kb3ciLCJDdXN0b21FdmVudCIsInByb3RvdHlwZSIsIkV2ZW50Iiwib25lcnJvciIsIm9ubG9hZCIsIm5vUmV2b2tlIiwicmV2b2tlT2JqZWN0VVJMIiwic2NhbGUiLCJpc0luc3RhbmNlT2YiLCJjcmVhdGVPYmplY3RVUkwiLCJfdHlwZSIsInR5cGUiLCJjcm9zc09yaWdpbiIsInNyYyIsInJlYWRGaWxlIiwidGFyZ2V0IiwicmVzdWx0IiwiVVJMIiwid2Via2l0VVJMIiwiT2JqZWN0IiwidG9TdHJpbmciLCJjYWxsIiwidHJhbnNmb3JtQ29vcmRpbmF0ZXMiLCJnZXRUcmFuc2Zvcm1lZE9wdGlvbnMiLCJhc3BlY3RSYXRpbyIsImhhc093blByb3BlcnR5IiwiY3JvcCIsIm5hdHVyYWxXaWR0aCIsIm5hdHVyYWxIZWlnaHQiLCJtYXhXaWR0aCIsIm1heEhlaWdodCIsInJlbmRlckltYWdlVG9DYW52YXMiLCJoYXNDYW52YXNPcHRpb24iLCJjYW52YXMiLCJiIiwiayIsInAiLCJjIiwiZCIsImYiLCJfIiwibSIsImciLCJ2IiwieSIsInciLCJsZWZ0IiwidG9wIiwic291cmNlV2lkdGgiLCJyaWdodCIsInNvdXJjZUhlaWdodCIsImJvdHRvbSIsIm1pbldpZHRoIiwibWluSGVpZ2h0IiwiY29udGFpbiIsImNvdmVyIiwicGl4ZWxSYXRpbyIsInN0eWxlIiwiZG93bnNhbXBsaW5nUmF0aW8iLCJGaWxlUmVhZGVyIiwib3JpZW50YXRpb24iLCJ0cmFuc2xhdGUiLCJyb3RhdGUiLCJQSSIsIkJsb2IiLCJzbGljZSIsIndlYmtpdFNsaWNlIiwibW96U2xpY2UiLCJibG9iU2xpY2UiLCJhcHBseSIsImFyZ3VtZW50cyIsIm1ldGFEYXRhUGFyc2VycyIsImpwZWciLCJwYXJzZU1ldGFEYXRhIiwibWF4TWV0YURhdGFTaXplIiwiRGF0YVZpZXciLCJzaXplIiwiZXJyb3IiLCJieXRlTGVuZ3RoIiwiZ2V0VWludDE2IiwibGVuZ3RoIiwiZGlzYWJsZUltYWdlSGVhZCIsImltYWdlSGVhZCIsIlVpbnQ4QXJyYXkiLCJzdWJhcnJheSIsIkV4aWZNYXAiLCJtYXAiLCJPcmllbnRhdGlvbiIsImdldCIsImdldEV4aWZUaHVtYm5haWwiLCJnZXRVaW50OCIsInB1c2giLCJqb2luIiwiZXhpZlRhZ1R5cGVzIiwiZ2V0VmFsdWUiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJhc2NpaSIsImdldFVpbnQzMiIsImdldEludDMyIiwiZ2V0RXhpZlZhbHVlIiwicGFyc2VFeGlmVGFnIiwiZXhpZiIsInBhcnNlRXhpZlRhZ3MiLCJwYXJzZUV4aWZEYXRhIiwiZGlzYWJsZUV4aWYiLCJkaXNhYmxlRXhpZlRodW1ibmFpbCIsIlRodW1ibmFpbCIsImRpc2FibGVFeGlmU3ViIiwiZGlzYWJsZUV4aWZHcHMiLCJnZXRDb21wdXRlZFN0eWxlIiwiZG9jdW1lbnRFbGVtZW50IiwiQXJyYXkiLCJtYXRjaCIsIk9MaW5rIiwiY2hhaW5lcnMiLCJ0aGVuIiwic25hYmJ0IiwiZm9yRWFjaCIsInNldFZhbHVlIiwiZmluaXNoIiwicm9sbGJhY2siLCIkIiwiSiIsImRlbGF5IiwiY2FsbGJhY2siLCJjb21wbGV0ZSIsImFsbERvbmUiLCJ2YWx1ZUZlZWRlciIsImVhc2luZyIsInRpY2siLCJ1cGRhdGVFbGVtZW50IiwiaXNTdG9wcGVkIiwiY29tcGxldGVkIiwibG9vcCIsInJlc3RhcnQiLCJwb3AiLCJTIiwidW5zaGlmdCIsIm1hbnVhbCIsInEiLCJtb3ZlbWVudCIsIkUiLCJzdG9wIiwiY29uY2F0IiwiY29udGFpbnMiLCJzcGxpY2UiLCJnZXRDdXJyZW50U3RhdGUiLCJmaWx0ZXIiLCJib2R5IiwicGFyZW50Tm9kZSIsInBvc2l0aW9uIiwicm90YXRpb24iLCJyb3RhdGlvblBvc3QiLCJza2V3IiwiRyIsInNjYWxlUG9zdCIsIm9wYWNpdHkiLCJzdGFydFN0YXRlIiwiZW5kU3RhdGUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJtb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJtc1JlcXVlc3RBbmltYXRpb25GcmFtZSIsInNldFRpbWVvdXQiLCJ4IiwiZHVyYXRpb24iLCJwZXJzcGVjdGl2ZSIsIkwiLCJjbG9uZSIsInRyYW5zZm9ybU9yaWdpbiIsIlYiLCJqIiwicmVzZXRGcm9tIiwic2V0UmV2ZXJzZSIsInVwZGF0ZUN1cnJlbnRUcmFuc2Zvcm0iLCJ0d2VlbiIsImFzTWF0cml4IiwiZ2V0UHJvcGVydGllcyIsIlgiLCJZIiwiaW5pdGlhbFZlbG9jaXR5IiwiZXF1aWxpYnJpdW1Qb3NpdGlvbiIsIlQiLCJlcXVpbGlicml1bSIsInVwZGF0ZU1vdmVtZW50IiwiQyIsIlAiLCJjb3MiLCJNIiwiUiIsInBvdyIsInN0YXJ0UG9zaXRpb24iLCJzcHJpbmdDb25zdGFudCIsInNwcmluZ0RlY2VsZXJhdGlvbiIsInNwcmluZ01hc3MiLCJhYnMiLCJJIiwibGluZWFyIiwiZWFzZSIsImVhc2VJbiIsImVhc2VPdXQiLCJPIiwieiIsInNpbiIsIkQiLCJBIiwiVSIsInRhbiIsIkgiLCJOIiwiQiIsIkYiLCJGbG9hdDMyQXJyYXkiLCJkYXRhIiwiYXNDU1MiLCJ0b0ZpeGVkIiwiY2xlYXIiLCJXIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwiY3JlYXRlTWF0cml4Iiwic2V0RWxlbWVudFRyYW5zZm9ybSIsImdldEVsZW1lbnRCeUlkIiwiSFRNTENhbnZhc0VsZW1lbnQiLCJnZXRJbWFnZURhdGEiLCJFcnJvciIsImlzTmFOIiwicHV0SW1hZ2VEYXRhIiwibmV4dCIsInRvQmxvYiIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJhdG9iIiwidG9EYXRhVVJMIiwic3BsaXQiLCJjaGFyQ29kZUF0IiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwia2V5IiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJjb25zdHJ1Y3RvciIsImRhdGFzZXQiLCJhdHRyaWJ1dGVzIiwibmFtZSIsInRlc3QiLCJzdWJzdHIiLCJyZXBsYWNlIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJvZmZzZXRYIiwibGF5ZXJYIiwib2Zmc2V0WSIsImxheWVyWSIsIkVTQyIsIlJFVFVSTiIsIkRPV04iLCJNT1ZFIiwiVVAiLCJqcGciLCJqcGUiLCJwbmciLCJnaWYiLCJibXAiLCJjbGFzc05hbWUiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImNoYW5nZWRUb3VjaGVzIiwicGFnZVgiLCJwYWdlWSIsInBhZ2VYT2Zmc2V0Iiwic2Nyb2xsTGVmdCIsInBhZ2VZT2Zmc2V0Iiwic2Nyb2xsVG9wIiwidG9Mb3dlckNhc2UiLCJYTUxIdHRwUmVxdWVzdCIsInVwbG9hZCIsImxvYWRlZCIsInRvdGFsIiwib3BlbiIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJzdGF0dXMiLCJyZXNwb25zZVRleHQiLCJpbmRleE9mIiwiSlNPTiIsIm1lc3NhZ2UiLCJzZW5kIiwid2Via2l0VHJhbnNmb3JtIiwidHJhbnNmb3JtIiwic2hpZnQiLCJnZXRGdWxsWWVhciIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJEYXRlIiwiRmlsZSIsImxhc3RNb2RpZmllZCIsIm5vdyIsInJlc3BvbnNlVHlwZSIsInJlc3BvbnNlIiwiZ3QiLCJzdGF0dXNUZXh0IiwiWiIsIkFycmF5QnVmZmVyIiwid3QiLCJLIiwiQmxvYkJ1aWxkZXIiLCJXZWJLaXRCbG9iQnVpbGRlciIsIk1vekJsb2JCdWlsZGVyIiwiTVNCbG9iQnVpbGRlciIsImFwcGVuZCIsImdldEJsb2IiLCJRIiwidHQiLCJldCIsImZpbHRlcnMiLCJtaW5TaXplIiwic2hhcnBlbiIsIm50IiwiYXQiLCJpdCIsIm90IiwiY3JlYXRlSW1hZ2VEYXRhIiwic2V0Iiwic3FydCIsInJ0IiwiaHQiLCJ1dCIsImx0IiwicHQiLCJjdCIsInBhcnNlSW50IiwiZHQiLCJmdCIsIl90IiwibmV4dFNpYmxpbmciLCJhcHBlbmRDaGlsZCIsInJlc2V0IiwiaW5zZXJ0QmVmb3JlIiwibXQiLCJzdHJpbmdpZnkiLCJ2dCIsImlucHV0IiwiZmlsZSIsIm91dHB1dCIsImltYWdlIiwieXQiLCJzdWJzdHJpbmciLCJidCIsInNlcnZlciIsIm1ldGEiLCJmaWVsZCIsImFjdGlvbnMiLCJrdCIsIm5hdmlnYXRvciIsIm1zU2F2ZUJsb2IiLCJkaXNwbGF5IiwiZG93bmxvYWQiLCJocmVmIiwiY2xpY2siLCJyZW1vdmVDaGlsZCIsInh0IiwicXVlcnlTZWxlY3RvciIsIlN0IiwiRXQiLCJDdCIsIlB0IiwiTXQiLCJSdCIsIlR0IiwibmUiLCJzZSIsInN3IiwibnciLCJfZWxlbWVudCIsIl9pbnRlcmFjdGlvbiIsIl9taW5XaWR0aCIsIl9taW5IZWlnaHQiLCJfcmF0aW8iLCJfcmVjdCIsIl9zcGFjZSIsIl9yZWN0Q2hhbmdlZCIsIl9pbml0IiwiX3JlZHJhdyIsImRpc3BhdGNoRXZlbnQiLCJfb25TdGFydERyYWciLCJfb25EcmFnIiwiX29uU3RvcERyYWciLCJwcmV2ZW50RGVmYXVsdCIsIm9mZnNldCIsInNldEF0dHJpYnV0ZSIsImNzc1RleHQiLCJJdCIsIl9vcHRpb25zIiwib3B0aW9ucyIsIl9vdXRwdXQiLCJfcm90YXRpbmciLCJfaW5wdXQiLCJfcHJldmlldyIsIl9wcmV2aWV3Qmx1cnJlZCIsIl9ibHVycmVkUHJldmlldyIsIl9jcm9wcGVyIiwiX3N0cmFpZ2h0Q3JvcCIsIl9wcmV2aWV3V3JhcHBlciIsIl9jdXJyZW50V2luZG93U2l6ZSIsIl9idG5Hcm91cCIsIl9tYXNrRnJhbWUiLCJfZGlydHkiLCJfd3JhcHBlclJvdGF0aW9uIiwiX3dyYXBwZXJTY2FsZSIsIl9jb250YWluZXIiLCJfd3JhcHBlciIsIl9zdGFnZSIsImVsZW1lbnQiLCJfcHJldmlld01hc2siLCJCdXR0b25zIiwiaW5uZXJIVE1MIiwidGl0bGUiLCJfdXRpbHNHcm91cCIsImJ1dHRvblJvdGF0ZUNsYXNzTmFtZSIsImJ1dHRvblJvdGF0ZVRpdGxlIiwiX29uQ2xpY2siLCJfb25HcmlkQ2hhbmdlIiwiX29uR3JpZElucHV0IiwiX29uS2V5RG93biIsIl9vblJlc2l6ZSIsImtleUNvZGUiLCJfY29uZmlybSIsIl9jYW5jZWwiLCJjbGFzc0xpc3QiLCJfcm90YXRlIiwiaW5uZXJXaWR0aCIsImlubmVySGVpZ2h0IiwiX3JlZHJhd0Nyb3BwZXIiLCJhcmVhIiwiX3VwZGF0ZVdyYXBwZXJTY2FsZSIsIl9yZWRyYXdXcmFwcGVyIiwiX3JlZHJhd0Nyb3BNYXNrIiwib2Zmc2V0V2lkdGgiLCJvZmZzZXRIZWlnaHQiLCJfdXBkYXRlV3JhcHBlclJvdGF0aW9uIiwicmF0aW8iLCJfaGlkZUNyb3BwZXIiLCJfc2hvd0Nyb3BwZXIiLCJmcm9tT3BhY2l0eSIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwiX3ByZXZpZXdTaXplIiwiZGV2aWNlUGl4ZWxSYXRpbyIsIm9mZnNldExlZnQiLCJvZmZzZXRUb3AiLCJsaW1pdCIsInNjYWxhciIsInJlc2l6ZSIsImNsaWVudFdpZHRoIiwiY2xpZW50SGVpZ2h0IiwiZnJvbVJvdGF0aW9uIiwiZnJvbVBvc2l0aW9uIiwiZnJvbVNjYWxlIiwiZGlydHkiLCJjaGlsZE5vZGVzIiwiY2hpbGRyZW4iLCJkZXN0cm95IiwicmVtb3ZlIiwiYWRkIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiYnV0dG9uQ2FuY2VsQ2xhc3NOYW1lIiwiYnV0dG9uQ29uZmlybUNsYXNzTmFtZSIsImJ1dHRvbkNhbmNlbExhYmVsIiwiYnV0dG9uQ29uZmlybUxhYmVsIiwiYnV0dG9uQ2FuY2VsVGl0bGUiLCJidXR0b25Db25maXJtVGl0bGUiLCJMdCIsIl9hY2NlcHQiLCJfYWxsb3dVUkxzIiwiX2RyYWdQYXRoIiwiZmlsZXMiLCJhcmVWYWxpZERhdGFUcmFuc2ZlckZpbGVzIiwiaXRlbXMiLCJhcmVWYWxpZERhdGFUcmFuc2Zlckl0ZW1zIiwia2luZCIsIl9vbkRyYWdPdmVyIiwiX29uRHJhZ0xlYXZlIiwiX29uRHJvcCIsImRhdGFUcmFuc2ZlciIsImdldERhdGEiLCJyZW1vdGUiLCJpc1ZhbGlkRGF0YVRyYW5zZmVyIiwiZHJvcEVmZmVjdCIsIk90IiwiX2lubmVyIiwiZmlyc3RDaGlsZCIsInp0IiwiRHQiLCJub2RlTmFtZSIsIkF0IiwiQVVUTyIsIklOSVRJQUwiLCJNQU5VQUwiLCJVdCIsIkh0IiwiTnQiLCJCdCIsIkZ0IiwiV3QiLCJxdCIsImp0IiwiVnQiLCJHdCIsIl91aWQiLCJmb3JjZVNpemUiLCJwb3N0IiwidHJpbSIsIl9vcmlnaW5hbEVsZW1lbnQiLCJfb3JpZ2luYWxFbGVtZW50SW5uZXIiLCJfb3JpZ2luYWxFbGVtZW50QXR0cmlidXRlcyIsIl9zdGF0ZSIsIl90aW1lcnMiLCJfaW5wdXRSZWZlcmVuY2UiLCJfaXNSZXF1aXJlZCIsIl9pbWFnZUhvcHBlciIsIl9pbWFnZUVkaXRvciIsIl9wcm9ncmVzc0VuYWJsZWQiLCJfZGF0YSIsIl9yZXNldERhdGEiLCJfZHJpcCIsIl9oYXNJbml0aWFsSW1hZ2UiLCJfaW5pdGlhbENyb3AiLCJfaW5pdGlhbFJvdGF0aW9uIiwiX2lzQmVpbmdEZXN0cm95ZWQiLCJzdXBwb3J0ZWQiLCJfZmFsbGJhY2siLCJfbWFudWFsVHJhbnNmb3JtIiwic2V0UmF0aW8iLCJfaXNGaXhlZFJhdGlvIiwiX2Nyb3BBdXRvIiwiX3NjYWxlRHJvcEFyZWEiLCJfbG9hZCIsImJsb2NrUHVzaCIsIl9kb1VwbG9hZCIsIl9kb0Rvd25sb2FkIiwiX2RvUmVtb3ZlIiwiX2RvRGVzdHJveSIsIl9kb0VkaXQiLCJfY3JvcCIsImluc3RhbnRFZGl0IiwiX2lzSW5pdGlhbGlzaW5nIiwiX2dldEZpbGVJbnB1dCIsIl9nZXRJbml0aWFsSW1hZ2UiLCJfdXBkYXRlU3RhdGUiLCJfYWRkU3RhdGUiLCJfZ2V0SW5wdXRFbGVtZW50IiwicmVxdWlyZWQiLCJJbWFnZSIsImRlZmF1bHRJbnB1dE5hbWUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGUiLCJfaXNJbWFnZU9ubHkiLCJsYWJlbExvYWRpbmciLCJzZXJ2aWNlIiwiaGFzQXR0cmlidXRlIiwiYWNjZXB0IiwiYWxsb3dVUkxzIiwiZmV0Y2hlciIsImxhYmVsIiwiX2lzQnV0dG9uQWxsb3dlZCIsIl91cGRhdGVQcm9ncmVzcyIsIl9vbkluaXQiLCJkaWRJbml0Iiwic2F2ZUluaXRpYWxJbWFnZSIsImNvbnRhaW5zSW1hZ2UiLCJfc2F2ZSIsIl90b2dnbGVCdXR0b24iLCJxdWVyeVNlbGVjdG9yQWxsIiwiX3N0b3BQcm9ncmVzc0xvb3AiLCJwYXJzZUZsb2F0IiwiZWRpdCIsIl90aHJvd0Vycm9yIiwic3RhdHVzTm9TdXBwb3J0IiwiX29uQ2hhbmdlIiwiX29uQ2FuY2VsIiwiX29uQ29uZmlybSIsIl9vbkZpbGVPdmVyIiwiX29uRmlsZU91dCIsIl9vbkRyb3BGaWxlIiwiX29uSW52YWxpZEZpbGUiLCJfb25JbnZhbGlkRmlsZURyb3AiLCJkaWRUaHJvd0Vycm9yIiwiX3JlbW92ZVN0YXRlIiwiX3JlbW92ZUVycm9yIiwiX29wZW5GaWxlRGlhbG9nIiwid2lsbFJlbW92ZSIsIl9nZXREcmlwIiwic3RhdHVzRmlsZVR5cGUiLCJzdGF0dXNJbWFnZVRvb1NtYWxsIiwic3RhdHVzRmlsZVNpemUiLCJtYXhGaWxlU2l6ZSIsInN0YXR1c0xvY2FsVXJsUHJvYmxlbSIsImRyYWdQYXRoIiwiY2xlYXJUaW1lb3V0IiwiX3JlcGxhY2VUaW1lb3V0IiwiX3N0YXJ0UHJvZ3Jlc3NMb29wIiwiZW5hYmxlZCIsIl9sb2FkVGltZW91dCIsIndpbGxMb2FkIiwiX29uTG9jYWxVUkxQcm9ibGVtIiwid2lsbEZldGNoIiwiX29uUmVtb3RlVVJMUHJvYmxlbSIsIl9vbk92ZXJXZWlnaHRGaWxlIiwiaW50ZXJuYWxDYW52YXNTaXplIiwiX29uSW1hZ2VUb29TbWFsbCIsImRpZExvYWQiLCJkcm9wUmVwbGFjZSIsIl9nZXRJbnRybyIsImlzRGV0YWNoZWQiLCJfY2FuSW5zdGFudEVkaXQiLCJfbG9hZENhbnZhcyIsIl9zaG93QnV0dG9ucyIsIl9hcHBseVRyYW5zZm9ybXMiLCJfc3RhcnRQcm9ncmVzcyIsIl9zdG9wUHJvZ3Jlc3MiLCJ3aWxsQ3JvcEluaXRpYWwiLCJmaWx0ZXJTaGFycGVuIiwiZm9yY2VNaW5TaXplIiwiX29uVHJhbnNmb3JtQ2FudmFzIiwiZGlkVHJhbnNmb3JtIiwid2lsbFRyYW5zZm9ybSIsImJ1dHRvblJvdGF0ZUxhYmVsIiwiX2dldFJhdGlvU3BhY2VyRWxlbWVudCIsIm1hcmdpbkJvdHRvbSIsImRpZENhbmNlbCIsIl9oaWRlRWRpdG9yIiwiX2lzQXV0b0Nyb3AiLCJkaWRDb25maXJtIiwiX2dldEluT3V0IiwiekluZGV4IiwiX3Nob3dQcmV2aWV3IiwiZGF0YUJhc2U2NCIsIndpbGxTYXZlIiwiX3N0b3JlIiwiZGlkU2F2ZSIsIl91cGxvYWQiLCJfc3RvcmVTZXJ2ZXJSZXNwb25zZSIsImRpZFVwbG9hZCIsInJlcXVlc3RPdXRwdXQiLCJ3aWxsUmVxdWVzdCIsInN0YXR1c1VwbG9hZFN1Y2Nlc3MiLCJzdGF0dXNDb250ZW50TGVuZ3RoIiwiZGlkUmVjZWl2ZVNlcnZlckVycm9yIiwic3RhdHVzVW5rbm93blJlc3BvbnNlIiwidXBsb2FkTWV0aG9kIiwic2VydmljZUZvcm1hdCIsIkZvcm1EYXRhIiwidXBsb2FkQmFzZTY0IiwiY29weUltYWdlSGVhZCIsInBvcG92ZXJDbGFzc05hbWUiLCJzaG93IiwiaGlkZSIsIl9hcHBlbmRFZGl0b3IiLCJzaG93Um90YXRlQnV0dG9uIiwicm90YXRlQnV0dG9uIiwiaW5uZXIiLCJfc2hvd0VkaXRvciIsIl9oaWRlQnV0dG9ucyIsIl9oaWRlU3RhdHVzIiwiX2NsZWFyU3RhdGUiLCJfZ2V0T3V0cm8iLCJfaGlkZVJlc3VsdCIsImRpZFJlbW92ZSIsImpwZWdDb21wcmVzc2lvbiIsImZvcmNlVHlwZSIsInJlcGxhY2VDaGlsZCIsInNldFNpemUiLCJzZXRSb3RhdGlvbiIsInNldEZvcmNlU2l6ZSIsImlzQXR0YWNoZWRUbyIsIm9wZXJhbWluaSIsImNyZWF0ZSIsImdldE9wdGlvbnNGcm9tQXR0cmlidXRlcyIsImZpbmQiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxVQUFVQSxDQUFWLEVBQWFDLENBQWIsRUFBZ0I7QUFDYixXQUFTQyxDQUFULEdBQWE7QUFDVEYsSUFBQUEsQ0FBQyxDQUFDRyxJQUFGLENBQU9DLEtBQVAsQ0FBYUMsUUFBYjtBQUNIOztBQUVELE1BQUlMLENBQUosRUFBTyxJQUFJQSxDQUFDLENBQUNHLElBQUYsR0FBUyxZQUFZO0FBQzVCLGFBQVNILENBQVQsQ0FBV0EsQ0FBWCxFQUFjQyxDQUFkLEVBQWlCO0FBQ2IsVUFBSSxFQUFFRCxDQUFDLFlBQVlDLENBQWYsQ0FBSixFQUF1QixNQUFNLElBQUlLLFNBQUosQ0FBYyxtQ0FBZCxDQUFOO0FBQzFCOztBQUVELGFBQVNKLENBQVQsQ0FBV0YsQ0FBWCxFQUFjQyxDQUFkLEVBQWlCQyxDQUFqQixFQUFvQkssQ0FBcEIsRUFBdUI7QUFDbkIsVUFBSSxFQUFFTixDQUFDLElBQUksQ0FBUCxDQUFKLEVBQWU7QUFDWCxhQUFLLElBQUlPLENBQUMsR0FBR1IsQ0FBQyxDQUFDUyxLQUFWLEVBQWlCQyxDQUFDLEdBQUdWLENBQUMsQ0FBQ1csTUFBdkIsRUFBK0JDLENBQUMsR0FBR0MsSUFBSSxDQUFDQyxHQUFMLENBQVNQLENBQUMsQ0FBQ0UsS0FBWCxFQUFrQkksSUFBSSxDQUFDRSxHQUFMLENBQVNiLENBQUMsQ0FBQ08sS0FBWCxFQUFrQkksSUFBSSxDQUFDRyxLQUFMLENBQVdoQixDQUFDLENBQUNTLEtBQUYsR0FBVVIsQ0FBckIsQ0FBbEIsQ0FBbEIsQ0FBbkMsRUFBa0dnQixDQUFDLEdBQUdKLElBQUksQ0FBQ0MsR0FBTCxDQUFTUCxDQUFDLENBQUNJLE1BQVgsRUFBbUJFLElBQUksQ0FBQ0UsR0FBTCxDQUFTYixDQUFDLENBQUNTLE1BQVgsRUFBbUJFLElBQUksQ0FBQ0csS0FBTCxDQUFXaEIsQ0FBQyxDQUFDVyxNQUFGLEdBQVdWLENBQXRCLENBQW5CLENBQW5CLENBQXRHLEVBQXdLaUIsQ0FBQyxHQUFHQyxFQUFFLENBQUNuQixDQUFELENBQTlLLEVBQW1Mb0IsQ0FBQyxHQUFHLEtBQUssQ0FBNUwsRUFBK0xDLENBQUMsR0FBRyxLQUFLLENBQTdNLEVBQWdOYixDQUFDLEdBQUdJLENBQUosSUFBU0YsQ0FBQyxHQUFHTyxDQUE3TjtBQUFpT0csVUFBQUEsQ0FBQyxHQUFHZixRQUFRLENBQUNpQixhQUFULENBQXVCLFFBQXZCLENBQUosRUFBc0NkLENBQUMsR0FBR0ssSUFBSSxDQUFDRyxLQUFMLENBQVcsS0FBS0UsQ0FBQyxDQUFDVCxLQUFsQixDQUExQyxFQUFvRUMsQ0FBQyxHQUFHRyxJQUFJLENBQUNHLEtBQUwsQ0FBVyxLQUFLRSxDQUFDLENBQUNQLE1BQWxCLENBQXhFLEVBQW1HSCxDQUFDLEdBQUdJLENBQUosS0FBVUosQ0FBQyxHQUFHSSxDQUFkLENBQW5HLEVBQXFIRixDQUFDLEdBQUdPLENBQUosS0FBVVAsQ0FBQyxHQUFHTyxDQUFkLENBQXJILEVBQXVJRyxDQUFDLENBQUNYLEtBQUYsR0FBVUQsQ0FBakosRUFBb0pZLENBQUMsQ0FBQ1QsTUFBRixHQUFXRCxDQUEvSixFQUFrS1csQ0FBQyxHQUFHRCxDQUFDLENBQUNHLFVBQUYsQ0FBYSxJQUFiLENBQXRLLEVBQTBMRixDQUFDLENBQUNHLFNBQUYsQ0FBWU4sQ0FBWixFQUFlLENBQWYsRUFBa0IsQ0FBbEIsRUFBcUJWLENBQXJCLEVBQXdCRSxDQUF4QixDQUExTCxFQUFzTlEsQ0FBQyxHQUFHQyxFQUFFLENBQUNDLENBQUQsQ0FBNU47QUFBak87O0FBQ0FwQixRQUFBQSxDQUFDLENBQUNTLEtBQUYsR0FBVUcsQ0FBVixFQUFhWixDQUFDLENBQUNXLE1BQUYsR0FBV00sQ0FBeEIsRUFBMkJJLENBQUMsR0FBR3JCLENBQUMsQ0FBQ3VCLFVBQUYsQ0FBYSxJQUFiLENBQS9CLEVBQW1ERixDQUFDLENBQUNHLFNBQUYsQ0FBWU4sQ0FBWixFQUFlLENBQWYsRUFBa0IsQ0FBbEIsRUFBcUJOLENBQXJCLEVBQXdCSyxDQUF4QixDQUFuRDtBQUNIO0FBQ0o7O0FBRUQsS0FBQyxZQUFZO0FBQ1QsZUFBU2pCLENBQVQsQ0FBV0EsQ0FBWCxFQUFjRSxDQUFkLEVBQWlCO0FBQ2JBLFFBQUFBLENBQUMsR0FBR0EsQ0FBQyxJQUFJO0FBQUN1QixVQUFBQSxPQUFPLEVBQUUsQ0FBQyxDQUFYO0FBQWNDLFVBQUFBLFVBQVUsRUFBRSxDQUFDLENBQTNCO0FBQThCQyxVQUFBQSxNQUFNLEVBQUUxQjtBQUF0QyxTQUFUO0FBQ0EsWUFBSU0sQ0FBQyxHQUFHRixRQUFRLENBQUN1QixXQUFULENBQXFCLGFBQXJCLENBQVI7QUFDQSxlQUFPckIsQ0FBQyxDQUFDc0IsZUFBRixDQUFrQjdCLENBQWxCLEVBQXFCRSxDQUFDLENBQUN1QixPQUF2QixFQUFnQ3ZCLENBQUMsQ0FBQ3dCLFVBQWxDLEVBQThDeEIsQ0FBQyxDQUFDeUIsTUFBaEQsR0FBeURwQixDQUFoRTtBQUNIOztBQUVELGFBQU8sY0FBYyxPQUFPdUIsTUFBTSxDQUFDQyxXQUE1QixLQUE0Qy9CLENBQUMsQ0FBQ2dDLFNBQUYsR0FBY0YsTUFBTSxDQUFDRyxLQUFQLENBQWFELFNBQTNCLEVBQXNDLE1BQUtGLE1BQU0sQ0FBQ0MsV0FBUCxHQUFxQi9CLENBQTFCLENBQWxGLENBQVA7QUFDSCxLQVJBLEVBQUQ7O0FBU0EsUUFBSU8sQ0FBQyxHQUFHLFNBQUpBLENBQUksQ0FBVVAsQ0FBVixFQUFhQyxDQUFiLEVBQWdCQyxDQUFoQixFQUFtQjtBQUNuQixVQUFJTSxDQUFKO0FBQUEsVUFBT0UsQ0FBUDtBQUFBLFVBQVVFLENBQUMsR0FBR1AsUUFBUSxDQUFDaUIsYUFBVCxDQUF1QixLQUF2QixDQUFkO0FBQ0EsVUFBSVYsQ0FBQyxDQUFDc0IsT0FBRixHQUFZakMsQ0FBWixFQUFlVyxDQUFDLENBQUN1QixNQUFGLEdBQVcsWUFBWTtBQUN0QyxTQUFDekIsQ0FBRCxJQUFNUixDQUFDLElBQUlBLENBQUMsQ0FBQ2tDLFFBQWIsSUFBeUI3QixDQUFDLENBQUM4QixlQUFGLENBQWtCM0IsQ0FBbEIsQ0FBekIsRUFBK0NULENBQUMsSUFBSUEsQ0FBQyxDQUFDTSxDQUFDLENBQUMrQixLQUFGLENBQVExQixDQUFSLEVBQVdWLENBQVgsQ0FBRCxDQUFyRDtBQUNILE9BRkcsRUFFREssQ0FBQyxDQUFDZ0MsWUFBRixDQUFlLE1BQWYsRUFBdUJ2QyxDQUF2QixLQUE2Qk8sQ0FBQyxDQUFDZ0MsWUFBRixDQUFlLE1BQWYsRUFBdUJ2QyxDQUF2QixDQUZoQyxFQUUyRFEsQ0FBQyxHQUFHRSxDQUFDLEdBQUdILENBQUMsQ0FBQ2lDLGVBQUYsQ0FBa0J4QyxDQUFsQixDQUFSLEVBQThCWSxDQUFDLENBQUM2QixLQUFGLEdBQVV6QyxDQUFDLENBQUMwQyxJQUExQyxDQUYzRCxLQUVnSDtBQUM1RyxZQUFJLFlBQVksT0FBTzFDLENBQXZCLEVBQTBCLE9BQU8sQ0FBQyxDQUFSO0FBQzFCUSxRQUFBQSxDQUFDLEdBQUdSLENBQUosRUFBT0UsQ0FBQyxJQUFJQSxDQUFDLENBQUN5QyxXQUFQLEtBQXVCL0IsQ0FBQyxDQUFDK0IsV0FBRixHQUFnQnpDLENBQUMsQ0FBQ3lDLFdBQXpDLENBQVA7QUFDSDtBQUNELGFBQU9uQyxDQUFDLElBQUlJLENBQUMsQ0FBQ2dDLEdBQUYsR0FBUXBDLENBQVIsRUFBV0ksQ0FBZixJQUFvQkwsQ0FBQyxDQUFDc0MsUUFBRixDQUFXN0MsQ0FBWCxFQUFjLFVBQVVBLENBQVYsRUFBYTtBQUNuRCxZQUFJRSxDQUFDLEdBQUdGLENBQUMsQ0FBQzhDLE1BQVY7QUFDQTVDLFFBQUFBLENBQUMsSUFBSUEsQ0FBQyxDQUFDNkMsTUFBUCxHQUFnQm5DLENBQUMsQ0FBQ2dDLEdBQUYsR0FBUTFDLENBQUMsQ0FBQzZDLE1BQTFCLEdBQW1DOUMsQ0FBQyxJQUFJQSxDQUFDLENBQUNELENBQUQsQ0FBekM7QUFDSCxPQUgyQixDQUE1QjtBQUlILEtBWkw7QUFBQSxRQWFJUSxDQUFDLEdBQUdzQixNQUFNLENBQUNVLGVBQVAsSUFBMEJWLE1BQTFCLElBQW9DQSxNQUFNLENBQUNrQixHQUFQLElBQWNBLEdBQUcsQ0FBQ1gsZUFBbEIsSUFBcUNXLEdBQXpFLElBQWdGbEIsTUFBTSxDQUFDbUIsU0FBUCxJQUFvQkEsU0FiNUc7O0FBY0ExQyxJQUFBQSxDQUFDLENBQUNnQyxZQUFGLEdBQWlCLFVBQVV2QyxDQUFWLEVBQWFDLENBQWIsRUFBZ0I7QUFDN0IsYUFBT2lELE1BQU0sQ0FBQ2xCLFNBQVAsQ0FBaUJtQixRQUFqQixDQUEwQkMsSUFBMUIsQ0FBK0JuRCxDQUEvQixNQUFzQyxhQUFhRCxDQUFiLEdBQWlCLEdBQTlEO0FBQ0gsS0FGRCxFQUVHTyxDQUFDLENBQUM4QyxvQkFBRixHQUF5QixZQUFZLENBQ3ZDLENBSEQsRUFHRzlDLENBQUMsQ0FBQytDLHFCQUFGLEdBQTBCLFVBQVV0RCxDQUFWLEVBQWFDLENBQWIsRUFBZ0I7QUFDekMsVUFBSUMsQ0FBSjtBQUFBLFVBQU9LLENBQVA7QUFBQSxVQUFVQyxDQUFWO0FBQUEsVUFBYUUsQ0FBYjtBQUFBLFVBQWdCRSxDQUFDLEdBQUdYLENBQUMsQ0FBQ3NELFdBQXRCO0FBQ0EsVUFBSSxDQUFDM0MsQ0FBTCxFQUFRLE9BQU9YLENBQVA7QUFDUkMsTUFBQUEsQ0FBQyxHQUFHLEVBQUo7O0FBQ0EsV0FBS0ssQ0FBTCxJQUFVTixDQUFWO0FBQWFBLFFBQUFBLENBQUMsQ0FBQ3VELGNBQUYsQ0FBaUJqRCxDQUFqQixNQUF3QkwsQ0FBQyxDQUFDSyxDQUFELENBQUQsR0FBT04sQ0FBQyxDQUFDTSxDQUFELENBQWhDO0FBQWI7O0FBQ0EsYUFBT0wsQ0FBQyxDQUFDdUQsSUFBRixHQUFTLENBQUMsQ0FBVixFQUFhakQsQ0FBQyxHQUFHUixDQUFDLENBQUMwRCxZQUFGLElBQWtCMUQsQ0FBQyxDQUFDUyxLQUFyQyxFQUE0Q0MsQ0FBQyxHQUFHVixDQUFDLENBQUMyRCxhQUFGLElBQW1CM0QsQ0FBQyxDQUFDVyxNQUFyRSxFQUE2RUgsQ0FBQyxHQUFHRSxDQUFKLEdBQVFFLENBQVIsSUFBYVYsQ0FBQyxDQUFDMEQsUUFBRixHQUFhbEQsQ0FBQyxHQUFHRSxDQUFqQixFQUFvQlYsQ0FBQyxDQUFDMkQsU0FBRixHQUFjbkQsQ0FBL0MsS0FBcURSLENBQUMsQ0FBQzBELFFBQUYsR0FBYXBELENBQWIsRUFBZ0JOLENBQUMsQ0FBQzJELFNBQUYsR0FBY3JELENBQUMsR0FBR0ksQ0FBdkYsQ0FBN0UsRUFBd0tWLENBQS9LO0FBQ0gsS0FURCxFQVNHSyxDQUFDLENBQUN1RCxtQkFBRixHQUF3QixVQUFVOUQsQ0FBVixFQUFhQyxDQUFiLEVBQWdCQyxDQUFoQixFQUFtQkssQ0FBbkIsRUFBc0JDLENBQXRCLEVBQXlCRSxDQUF6QixFQUE0QkUsQ0FBNUIsRUFBK0JLLENBQS9CLEVBQWtDQyxDQUFsQyxFQUFxQ0UsQ0FBckMsRUFBd0M7QUFDL0QsYUFBT3BCLENBQUMsQ0FBQ3VCLFVBQUYsQ0FBYSxJQUFiLEVBQW1CQyxTQUFuQixDQUE2QnZCLENBQTdCLEVBQWdDQyxDQUFoQyxFQUFtQ0ssQ0FBbkMsRUFBc0NDLENBQXRDLEVBQXlDRSxDQUF6QyxFQUE0Q0UsQ0FBNUMsRUFBK0NLLENBQS9DLEVBQWtEQyxDQUFsRCxFQUFxREUsQ0FBckQsR0FBeURwQixDQUFoRTtBQUNILEtBWEQsRUFXR08sQ0FBQyxDQUFDd0QsZUFBRixHQUFvQixVQUFVL0QsQ0FBVixFQUFhO0FBQ2hDLGFBQU9BLENBQUMsQ0FBQ2dFLE1BQUYsSUFBWWhFLENBQUMsQ0FBQ3lELElBQWQsSUFBc0IsQ0FBQyxDQUFDekQsQ0FBQyxDQUFDdUQsV0FBakM7QUFDSCxLQWJELEVBYUdoRCxDQUFDLENBQUMrQixLQUFGLEdBQVUsVUFBVXRDLENBQVYsRUFBYUUsQ0FBYixFQUFnQjtBQUN6QixlQUFTTSxDQUFULEdBQWE7QUFDVCxZQUFJUixDQUFDLEdBQUdhLElBQUksQ0FBQ0MsR0FBTCxDQUFTLENBQUNJLENBQUMsSUFBSStDLENBQU4sSUFBV0EsQ0FBcEIsRUFBdUIsQ0FBQzdDLENBQUMsSUFBSThDLENBQU4sSUFBV0EsQ0FBbEMsQ0FBUjtBQUNBbEUsUUFBQUEsQ0FBQyxHQUFHLENBQUosS0FBVWlFLENBQUMsSUFBSWpFLENBQUwsRUFBUWtFLENBQUMsSUFBSWxFLENBQXZCO0FBQ0g7O0FBRUQsZUFBU1UsQ0FBVCxHQUFhO0FBQ1QsWUFBSVYsQ0FBQyxHQUFHYSxJQUFJLENBQUNFLEdBQUwsQ0FBUyxDQUFDSCxDQUFDLElBQUlxRCxDQUFOLElBQVdBLENBQXBCLEVBQXVCLENBQUNoRCxDQUFDLElBQUlpRCxDQUFOLElBQVdBLENBQWxDLENBQVI7QUFDQWxFLFFBQUFBLENBQUMsR0FBRyxDQUFKLEtBQVVpRSxDQUFDLElBQUlqRSxDQUFMLEVBQVFrRSxDQUFDLElBQUlsRSxDQUF2QjtBQUNIOztBQUVERSxNQUFBQSxDQUFDLEdBQUdBLENBQUMsSUFBSSxFQUFUOztBQUNBLFVBQUlVLENBQUo7QUFBQSxVQUFPSyxDQUFQO0FBQUEsVUFBVUMsQ0FBVjtBQUFBLFVBQWFFLENBQWI7QUFBQSxVQUFnQkMsQ0FBaEI7QUFBQSxVQUFtQjhDLENBQW5CO0FBQUEsVUFBc0JDLENBQXRCO0FBQUEsVUFBeUJDLENBQXpCO0FBQUEsVUFBNEJDLENBQTVCO0FBQUEsVUFBK0JDLENBQS9CO0FBQUEsVUFBa0NDLENBQWxDO0FBQUEsVUFBcUNDLENBQUMsR0FBR3BFLFFBQVEsQ0FBQ2lCLGFBQVQsQ0FBdUIsUUFBdkIsQ0FBekM7QUFBQSxVQUNJb0QsQ0FBQyxHQUFHMUUsQ0FBQyxDQUFDdUIsVUFBRixJQUFnQmhCLENBQUMsQ0FBQ3dELGVBQUYsQ0FBa0I3RCxDQUFsQixLQUF3QnVFLENBQUMsQ0FBQ2xELFVBRGxEO0FBQUEsVUFDOERvRCxDQUFDLEdBQUczRSxDQUFDLENBQUMwRCxZQUFGLElBQWtCMUQsQ0FBQyxDQUFDUyxLQUR0RjtBQUFBLFVBRUltRSxDQUFDLEdBQUc1RSxDQUFDLENBQUMyRCxhQUFGLElBQW1CM0QsQ0FBQyxDQUFDVyxNQUY3QjtBQUFBLFVBRXFDc0QsQ0FBQyxHQUFHVSxDQUZ6QztBQUFBLFVBRTRDVCxDQUFDLEdBQUdVLENBRmhEOztBQUdBLFVBQUlGLENBQUMsS0FBS3hFLENBQUMsR0FBR0ssQ0FBQyxDQUFDK0MscUJBQUYsQ0FBd0J0RCxDQUF4QixFQUEyQkUsQ0FBM0IsQ0FBSixFQUFtQ2tFLENBQUMsR0FBR2xFLENBQUMsQ0FBQzJFLElBQUYsSUFBVSxDQUFqRCxFQUFvRFIsQ0FBQyxHQUFHbkUsQ0FBQyxDQUFDNEUsR0FBRixJQUFTLENBQWpFLEVBQW9FNUUsQ0FBQyxDQUFDNkUsV0FBRixJQUFpQjFELENBQUMsR0FBR25CLENBQUMsQ0FBQzZFLFdBQU4sRUFBbUI3RSxDQUFDLENBQUM4RSxLQUFGLEtBQVkvRSxDQUFaLElBQWlCQyxDQUFDLENBQUMyRSxJQUFGLEtBQVc1RSxDQUE1QixLQUFrQ21FLENBQUMsR0FBR08sQ0FBQyxHQUFHdEQsQ0FBSixHQUFRbkIsQ0FBQyxDQUFDOEUsS0FBaEQsQ0FBcEMsSUFBOEYzRCxDQUFDLEdBQUdzRCxDQUFDLEdBQUdQLENBQUosSUFBU2xFLENBQUMsQ0FBQzhFLEtBQUYsSUFBVyxDQUFwQixDQUF0SyxFQUE4TDlFLENBQUMsQ0FBQytFLFlBQUYsSUFBa0JkLENBQUMsR0FBR2pFLENBQUMsQ0FBQytFLFlBQU4sRUFBb0IvRSxDQUFDLENBQUNnRixNQUFGLEtBQWFqRixDQUFiLElBQWtCQyxDQUFDLENBQUM0RSxHQUFGLEtBQVU3RSxDQUE1QixLQUFrQ29FLENBQUMsR0FBR08sQ0FBQyxHQUFHVCxDQUFKLEdBQVFqRSxDQUFDLENBQUNnRixNQUFoRCxDQUF0QyxJQUFpR2YsQ0FBQyxHQUFHUyxDQUFDLEdBQUdQLENBQUosSUFBU25FLENBQUMsQ0FBQ2dGLE1BQUYsSUFBWSxDQUFyQixDQUFuUyxFQUE0VGpCLENBQUMsR0FBRzVDLENBQWhVLEVBQW1VNkMsQ0FBQyxHQUFHQyxDQUE1VSxDQUFELEVBQWlWdkQsQ0FBQyxHQUFHVixDQUFDLENBQUMwRCxRQUF2VixFQUFpVzNDLENBQUMsR0FBR2YsQ0FBQyxDQUFDMkQsU0FBdlcsRUFBa1gzQyxDQUFDLEdBQUdoQixDQUFDLENBQUNpRixRQUF4WCxFQUFrWS9ELENBQUMsR0FBR2xCLENBQUMsQ0FBQ2tGLFNBQXhZLEVBQW1aVixDQUFDLElBQUk5RCxDQUFMLElBQVVLLENBQVYsSUFBZWYsQ0FBQyxDQUFDdUQsSUFBakIsSUFBeUJRLENBQUMsR0FBR3JELENBQUosRUFBT3NELENBQUMsR0FBR2pELENBQVgsRUFBY3VELENBQUMsR0FBR25ELENBQUMsR0FBRzhDLENBQUosR0FBUXZELENBQUMsR0FBR0ssQ0FBOUIsRUFBaUN1RCxDQUFDLEdBQUcsQ0FBSixJQUFTTCxDQUFDLEdBQUdsRCxDQUFDLEdBQUdJLENBQUosR0FBUVQsQ0FBWixFQUFlVixDQUFDLENBQUM0RSxHQUFGLEtBQVU3RSxDQUFWLElBQWVDLENBQUMsQ0FBQ2dGLE1BQUYsS0FBYWpGLENBQTVCLEtBQWtDb0UsQ0FBQyxHQUFHLENBQUNPLENBQUMsR0FBR1QsQ0FBTCxJQUFVLENBQWhELENBQXhCLElBQThFSyxDQUFDLEdBQUcsQ0FBSixLQUFVbkQsQ0FBQyxHQUFHVCxDQUFDLEdBQUd1RCxDQUFKLEdBQVFsRCxDQUFaLEVBQWVmLENBQUMsQ0FBQzJFLElBQUYsS0FBVzVFLENBQVgsSUFBZ0JDLENBQUMsQ0FBQzhFLEtBQUYsS0FBWS9FLENBQTVCLEtBQWtDbUUsQ0FBQyxHQUFHLENBQUNPLENBQUMsR0FBR3RELENBQUwsSUFBVSxDQUFoRCxDQUF6QixDQUF4SSxLQUF5TixDQUFDbkIsQ0FBQyxDQUFDbUYsT0FBRixJQUFhbkYsQ0FBQyxDQUFDb0YsS0FBaEIsTUFBMkJwRSxDQUFDLEdBQUdOLENBQUMsR0FBR0EsQ0FBQyxJQUFJTSxDQUFiLEVBQWdCRSxDQUFDLEdBQUdILENBQUMsR0FBR0EsQ0FBQyxJQUFJRyxDQUF4RCxHQUE0RGxCLENBQUMsQ0FBQ29GLEtBQUYsSUFBVzVFLENBQUMsSUFBSUYsQ0FBQyxFQUFqQixLQUF3QkEsQ0FBQyxJQUFJRSxDQUFDLEVBQTlCLENBQXJSLENBQW5aLEVBQTRzQmdFLENBQWh0QixFQUFtdEI7QUFDL3NCLFlBQUlKLENBQUMsR0FBR3BFLENBQUMsQ0FBQ3FGLFVBQU4sRUFBa0JqQixDQUFDLEdBQUcsQ0FBSixLQUFVRyxDQUFDLENBQUNlLEtBQUYsQ0FBUS9FLEtBQVIsR0FBZ0J3RCxDQUFDLEdBQUcsSUFBcEIsRUFBMEJRLENBQUMsQ0FBQ2UsS0FBRixDQUFRN0UsTUFBUixHQUFpQnVELENBQUMsR0FBRyxJQUEvQyxFQUFxREQsQ0FBQyxJQUFJSyxDQUExRCxFQUE2REosQ0FBQyxJQUFJSSxDQUFsRSxFQUFxRUcsQ0FBQyxDQUFDbEQsVUFBRixDQUFhLElBQWIsRUFBbUJlLEtBQW5CLENBQXlCZ0MsQ0FBekIsRUFBNEJBLENBQTVCLENBQS9FLENBQWxCLEVBQWtJQyxDQUFDLEdBQUdyRSxDQUFDLENBQUN1RixpQkFBeEksRUFBMkpsQixDQUFDLEdBQUcsQ0FBSixJQUFTQSxDQUFDLEdBQUcsQ0FBYixJQUFrQk4sQ0FBQyxHQUFHNUMsQ0FBdEIsSUFBMkI2QyxDQUFDLEdBQUdDLENBQTlMLEVBQWlNLE9BQU85QyxDQUFDLEdBQUdrRCxDQUFKLEdBQVFOLENBQWY7QUFBbUJRLFVBQUFBLENBQUMsQ0FBQ2hFLEtBQUYsR0FBVVksQ0FBQyxHQUFHa0QsQ0FBZCxFQUFpQkUsQ0FBQyxDQUFDOUQsTUFBRixHQUFXd0QsQ0FBQyxHQUFHSSxDQUFoQyxFQUFtQ2hFLENBQUMsQ0FBQ3VELG1CQUFGLENBQXNCVyxDQUF0QixFQUF5QnpFLENBQXpCLEVBQTRCb0UsQ0FBNUIsRUFBK0JDLENBQS9CLEVBQWtDaEQsQ0FBbEMsRUFBcUM4QyxDQUFyQyxFQUF3QyxDQUF4QyxFQUEyQyxDQUEzQyxFQUE4Q00sQ0FBQyxDQUFDaEUsS0FBaEQsRUFBdURnRSxDQUFDLENBQUM5RCxNQUF6RCxDQUFuQyxFQUFxR1UsQ0FBQyxHQUFHb0QsQ0FBQyxDQUFDaEUsS0FBM0csRUFBa0gwRCxDQUFDLEdBQUdNLENBQUMsQ0FBQzlELE1BQXhILEVBQWdJWCxDQUFDLEdBQUdLLFFBQVEsQ0FBQ2lCLGFBQVQsQ0FBdUIsUUFBdkIsQ0FBcEksRUFBc0t0QixDQUFDLENBQUNTLEtBQUYsR0FBVVksQ0FBaEwsRUFBbUxyQixDQUFDLENBQUNXLE1BQUYsR0FBV3dELENBQTlMLEVBQWlNNUQsQ0FBQyxDQUFDdUQsbUJBQUYsQ0FBc0I5RCxDQUF0QixFQUF5QnlFLENBQXpCLEVBQTRCLENBQTVCLEVBQStCLENBQS9CLEVBQWtDcEQsQ0FBbEMsRUFBcUM4QyxDQUFyQyxFQUF3QyxDQUF4QyxFQUEyQyxDQUEzQyxFQUE4QzlDLENBQTlDLEVBQWlEOEMsQ0FBakQsQ0FBak07QUFBbkI7QUFDak0sZUFBT00sQ0FBQyxDQUFDaEUsS0FBRixHQUFVd0QsQ0FBVixFQUFhUSxDQUFDLENBQUM5RCxNQUFGLEdBQVd1RCxDQUF4QixFQUEyQjNELENBQUMsQ0FBQzhDLG9CQUFGLENBQXVCb0IsQ0FBdkIsRUFBMEJ2RSxDQUExQixDQUEzQixFQUF5REssQ0FBQyxDQUFDdUQsbUJBQUYsQ0FBc0JXLENBQXRCLEVBQXlCekUsQ0FBekIsRUFBNEJvRSxDQUE1QixFQUErQkMsQ0FBL0IsRUFBa0NoRCxDQUFsQyxFQUFxQzhDLENBQXJDLEVBQXdDLENBQXhDLEVBQTJDLENBQTNDLEVBQThDRixDQUE5QyxFQUFpREMsQ0FBakQsQ0FBaEU7QUFDSDs7QUFDRCxhQUFPbEUsQ0FBQyxDQUFDUyxLQUFGLEdBQVV3RCxDQUFWLEVBQWFqRSxDQUFDLENBQUNXLE1BQUYsR0FBV3VELENBQXhCLEVBQTJCbEUsQ0FBbEM7QUFDSCxLQWpDRCxFQWlDR08sQ0FBQyxDQUFDaUMsZUFBRixHQUFvQixVQUFVeEMsQ0FBVixFQUFhO0FBQ2hDLGFBQU8sQ0FBQyxDQUFDUSxDQUFGLElBQU9BLENBQUMsQ0FBQ2dDLGVBQUYsQ0FBa0J4QyxDQUFsQixDQUFkO0FBQ0gsS0FuQ0QsRUFtQ0dPLENBQUMsQ0FBQzhCLGVBQUYsR0FBb0IsVUFBVXJDLENBQVYsRUFBYTtBQUNoQyxhQUFPLENBQUMsQ0FBQ1EsQ0FBRixJQUFPQSxDQUFDLENBQUM2QixlQUFGLENBQWtCckMsQ0FBbEIsQ0FBZDtBQUNILEtBckNELEVBcUNHTyxDQUFDLENBQUNzQyxRQUFGLEdBQWEsVUFBVTdDLENBQVYsRUFBYUMsQ0FBYixFQUFnQkMsQ0FBaEIsRUFBbUI7QUFDL0IsVUFBSTRCLE1BQU0sQ0FBQzRELFVBQVgsRUFBdUI7QUFDbkIsWUFBSW5GLENBQUMsR0FBRyxJQUFJbUYsVUFBSixFQUFSO0FBQ0EsWUFBSW5GLENBQUMsQ0FBQzRCLE1BQUYsR0FBVzVCLENBQUMsQ0FBQzJCLE9BQUYsR0FBWWpDLENBQXZCLEVBQTBCQyxDQUFDLEdBQUdBLENBQUMsSUFBSSxlQUFuQyxFQUFvREssQ0FBQyxDQUFDTCxDQUFELENBQXpELEVBQThELE9BQU9LLENBQUMsQ0FBQ0wsQ0FBRCxDQUFELENBQUtGLENBQUwsR0FBU08sQ0FBaEI7QUFDakU7O0FBQ0QsYUFBTyxDQUFDLENBQVI7QUFDSCxLQTNDRDtBQTRDQSxRQUFJRyxDQUFDLEdBQUdILENBQUMsQ0FBQ3dELGVBQVY7QUFBQSxRQUEyQm5ELENBQUMsR0FBR0wsQ0FBQyxDQUFDOEMsb0JBQWpDO0FBQUEsUUFBdURwQyxDQUFDLEdBQUdWLENBQUMsQ0FBQytDLHFCQUE3RDtBQUNBL0MsSUFBQUEsQ0FBQyxDQUFDd0QsZUFBRixHQUFvQixVQUFVL0QsQ0FBVixFQUFhO0FBQzdCLGFBQU8sQ0FBQyxDQUFDQSxDQUFDLENBQUMyRixXQUFKLElBQW1CakYsQ0FBQyxDQUFDMEMsSUFBRixDQUFPN0MsQ0FBUCxFQUFVUCxDQUFWLENBQTFCO0FBQ0gsS0FGRCxFQUVHTyxDQUFDLENBQUM4QyxvQkFBRixHQUF5QixVQUFVckQsQ0FBVixFQUFhQyxDQUFiLEVBQWdCO0FBQ3hDVyxNQUFBQSxDQUFDLENBQUN3QyxJQUFGLENBQU83QyxDQUFQLEVBQVVQLENBQVYsRUFBYUMsQ0FBYjtBQUNBLFVBQUlDLENBQUMsR0FBR0YsQ0FBQyxDQUFDdUIsVUFBRixDQUFhLElBQWIsQ0FBUjtBQUFBLFVBQTRCZixDQUFDLEdBQUdSLENBQUMsQ0FBQ1MsS0FBbEM7QUFBQSxVQUF5Q0MsQ0FBQyxHQUFHVixDQUFDLENBQUNXLE1BQS9DO0FBQUEsVUFBdURNLENBQUMsR0FBR2pCLENBQUMsQ0FBQ3dGLEtBQUYsQ0FBUS9FLEtBQW5FO0FBQUEsVUFBMEVTLENBQUMsR0FBR2xCLENBQUMsQ0FBQ3dGLEtBQUYsQ0FBUTdFLE1BQXRGO0FBQUEsVUFDSVMsQ0FBQyxHQUFHbkIsQ0FBQyxDQUFDMEYsV0FEVjtBQUVBLFVBQUl2RSxDQUFDLElBQUksRUFBRUEsQ0FBQyxHQUFHLENBQU4sQ0FBVCxFQUFtQixRQUFRQSxDQUFDLEdBQUcsQ0FBSixLQUFVcEIsQ0FBQyxDQUFDUyxLQUFGLEdBQVVDLENBQVYsRUFBYVYsQ0FBQyxDQUFDVyxNQUFGLEdBQVdILENBQXhCLEVBQTJCUixDQUFDLENBQUN3RixLQUFGLENBQVEvRSxLQUFSLEdBQWdCUyxDQUEzQyxFQUE4Q2xCLENBQUMsQ0FBQ3dGLEtBQUYsQ0FBUTdFLE1BQVIsR0FBaUJNLENBQXpFLEdBQTZFRyxDQUFyRjtBQUNmLGFBQUssQ0FBTDtBQUNJbEIsVUFBQUEsQ0FBQyxDQUFDMEYsU0FBRixDQUFZcEYsQ0FBWixFQUFlLENBQWYsR0FBbUJOLENBQUMsQ0FBQ29DLEtBQUYsQ0FBUSxDQUFDLENBQVQsRUFBWSxDQUFaLENBQW5CO0FBQ0E7O0FBQ0osYUFBSyxDQUFMO0FBQ0lwQyxVQUFBQSxDQUFDLENBQUMwRixTQUFGLENBQVlwRixDQUFaLEVBQWVFLENBQWYsR0FBbUJSLENBQUMsQ0FBQzJGLE1BQUYsQ0FBU2hGLElBQUksQ0FBQ2lGLEVBQWQsQ0FBbkI7QUFDQTs7QUFDSixhQUFLLENBQUw7QUFDSTVGLFVBQUFBLENBQUMsQ0FBQzBGLFNBQUYsQ0FBWSxDQUFaLEVBQWVsRixDQUFmLEdBQW1CUixDQUFDLENBQUNvQyxLQUFGLENBQVEsQ0FBUixFQUFXLENBQUMsQ0FBWixDQUFuQjtBQUNBOztBQUNKLGFBQUssQ0FBTDtBQUNJcEMsVUFBQUEsQ0FBQyxDQUFDMkYsTUFBRixDQUFTLEtBQUtoRixJQUFJLENBQUNpRixFQUFuQixHQUF3QjVGLENBQUMsQ0FBQ29DLEtBQUYsQ0FBUSxDQUFSLEVBQVcsQ0FBQyxDQUFaLENBQXhCO0FBQ0E7O0FBQ0osYUFBSyxDQUFMO0FBQ0lwQyxVQUFBQSxDQUFDLENBQUMyRixNQUFGLENBQVMsS0FBS2hGLElBQUksQ0FBQ2lGLEVBQW5CLEdBQXdCNUYsQ0FBQyxDQUFDMEYsU0FBRixDQUFZLENBQVosRUFBZSxDQUFDbEYsQ0FBaEIsQ0FBeEI7QUFDQTs7QUFDSixhQUFLLENBQUw7QUFDSVIsVUFBQUEsQ0FBQyxDQUFDMkYsTUFBRixDQUFTLEtBQUtoRixJQUFJLENBQUNpRixFQUFuQixHQUF3QjVGLENBQUMsQ0FBQzBGLFNBQUYsQ0FBWXBGLENBQVosRUFBZSxDQUFDRSxDQUFoQixDQUF4QixFQUE0Q1IsQ0FBQyxDQUFDb0MsS0FBRixDQUFRLENBQUMsQ0FBVCxFQUFZLENBQVosQ0FBNUM7QUFDQTs7QUFDSixhQUFLLENBQUw7QUFDSXBDLFVBQUFBLENBQUMsQ0FBQzJGLE1BQUYsQ0FBUyxDQUFDLEVBQUQsR0FBTWhGLElBQUksQ0FBQ2lGLEVBQXBCLEdBQXlCNUYsQ0FBQyxDQUFDMEYsU0FBRixDQUFZLENBQUNwRixDQUFiLEVBQWdCLENBQWhCLENBQXpCO0FBcEJXO0FBc0J0QixLQTVCRCxFQTRCR0QsQ0FBQyxDQUFDK0MscUJBQUYsR0FBMEIsVUFBVXRELENBQVYsRUFBYUMsQ0FBYixFQUFnQjtBQUN6QyxVQUFJQyxDQUFKO0FBQUEsVUFBT00sQ0FBUDtBQUFBLFVBQVVFLENBQUMsR0FBR08sQ0FBQyxDQUFDbUMsSUFBRixDQUFPN0MsQ0FBUCxFQUFVUCxDQUFWLEVBQWFDLENBQWIsQ0FBZDtBQUFBLFVBQStCVyxDQUFDLEdBQUdGLENBQUMsQ0FBQ2lGLFdBQXJDO0FBQ0EsVUFBSSxDQUFDL0UsQ0FBRCxJQUFNQSxDQUFDLEdBQUcsQ0FBVixJQUFlLE1BQU1BLENBQXpCLEVBQTRCLE9BQU9GLENBQVA7QUFDNUJSLE1BQUFBLENBQUMsR0FBRyxFQUFKOztBQUNBLFdBQUtNLENBQUwsSUFBVUUsQ0FBVjtBQUFhQSxRQUFBQSxDQUFDLENBQUM4QyxjQUFGLENBQWlCaEQsQ0FBakIsTUFBd0JOLENBQUMsQ0FBQ00sQ0FBRCxDQUFELEdBQU9FLENBQUMsQ0FBQ0YsQ0FBRCxDQUFoQztBQUFiOztBQUNBLGNBQVFFLENBQUMsQ0FBQ2lGLFdBQVY7QUFDSSxhQUFLLENBQUw7QUFDSXpGLFVBQUFBLENBQUMsQ0FBQzJFLElBQUYsR0FBU25FLENBQUMsQ0FBQ3NFLEtBQVgsRUFBa0I5RSxDQUFDLENBQUM4RSxLQUFGLEdBQVV0RSxDQUFDLENBQUNtRSxJQUE5QjtBQUNBOztBQUNKLGFBQUssQ0FBTDtBQUNJM0UsVUFBQUEsQ0FBQyxDQUFDMkUsSUFBRixHQUFTbkUsQ0FBQyxDQUFDc0UsS0FBWCxFQUFrQjlFLENBQUMsQ0FBQzRFLEdBQUYsR0FBUXBFLENBQUMsQ0FBQ3dFLE1BQTVCLEVBQW9DaEYsQ0FBQyxDQUFDOEUsS0FBRixHQUFVdEUsQ0FBQyxDQUFDbUUsSUFBaEQsRUFBc0QzRSxDQUFDLENBQUNnRixNQUFGLEdBQVd4RSxDQUFDLENBQUNvRSxHQUFuRTtBQUNBOztBQUNKLGFBQUssQ0FBTDtBQUNJNUUsVUFBQUEsQ0FBQyxDQUFDNEUsR0FBRixHQUFRcEUsQ0FBQyxDQUFDd0UsTUFBVixFQUFrQmhGLENBQUMsQ0FBQ2dGLE1BQUYsR0FBV3hFLENBQUMsQ0FBQ29FLEdBQS9CO0FBQ0E7O0FBQ0osYUFBSyxDQUFMO0FBQ0k1RSxVQUFBQSxDQUFDLENBQUMyRSxJQUFGLEdBQVNuRSxDQUFDLENBQUNvRSxHQUFYLEVBQWdCNUUsQ0FBQyxDQUFDNEUsR0FBRixHQUFRcEUsQ0FBQyxDQUFDbUUsSUFBMUIsRUFBZ0MzRSxDQUFDLENBQUM4RSxLQUFGLEdBQVV0RSxDQUFDLENBQUN3RSxNQUE1QyxFQUFvRGhGLENBQUMsQ0FBQ2dGLE1BQUYsR0FBV3hFLENBQUMsQ0FBQ3NFLEtBQWpFO0FBQ0E7O0FBQ0osYUFBSyxDQUFMO0FBQ0k5RSxVQUFBQSxDQUFDLENBQUMyRSxJQUFGLEdBQVNuRSxDQUFDLENBQUNvRSxHQUFYLEVBQWdCNUUsQ0FBQyxDQUFDNEUsR0FBRixHQUFRcEUsQ0FBQyxDQUFDc0UsS0FBMUIsRUFBaUM5RSxDQUFDLENBQUM4RSxLQUFGLEdBQVV0RSxDQUFDLENBQUN3RSxNQUE3QyxFQUFxRGhGLENBQUMsQ0FBQ2dGLE1BQUYsR0FBV3hFLENBQUMsQ0FBQ21FLElBQWxFO0FBQ0E7O0FBQ0osYUFBSyxDQUFMO0FBQ0kzRSxVQUFBQSxDQUFDLENBQUMyRSxJQUFGLEdBQVNuRSxDQUFDLENBQUN3RSxNQUFYLEVBQW1CaEYsQ0FBQyxDQUFDNEUsR0FBRixHQUFRcEUsQ0FBQyxDQUFDc0UsS0FBN0IsRUFBb0M5RSxDQUFDLENBQUM4RSxLQUFGLEdBQVV0RSxDQUFDLENBQUNvRSxHQUFoRCxFQUFxRDVFLENBQUMsQ0FBQ2dGLE1BQUYsR0FBV3hFLENBQUMsQ0FBQ21FLElBQWxFO0FBQ0E7O0FBQ0osYUFBSyxDQUFMO0FBQ0kzRSxVQUFBQSxDQUFDLENBQUMyRSxJQUFGLEdBQVNuRSxDQUFDLENBQUN3RSxNQUFYLEVBQW1CaEYsQ0FBQyxDQUFDNEUsR0FBRixHQUFRcEUsQ0FBQyxDQUFDbUUsSUFBN0IsRUFBbUMzRSxDQUFDLENBQUM4RSxLQUFGLEdBQVV0RSxDQUFDLENBQUNvRSxHQUEvQyxFQUFvRDVFLENBQUMsQ0FBQ2dGLE1BQUYsR0FBV3hFLENBQUMsQ0FBQ3NFLEtBQWpFO0FBcEJSOztBQXNCQSxhQUFPdEUsQ0FBQyxDQUFDaUYsV0FBRixHQUFnQixDQUFoQixLQUFzQnpGLENBQUMsQ0FBQzBELFFBQUYsR0FBYWxELENBQUMsQ0FBQ21ELFNBQWYsRUFBMEIzRCxDQUFDLENBQUMyRCxTQUFGLEdBQWNuRCxDQUFDLENBQUNrRCxRQUExQyxFQUFvRDFELENBQUMsQ0FBQ2lGLFFBQUYsR0FBYXpFLENBQUMsQ0FBQzBFLFNBQW5FLEVBQThFbEYsQ0FBQyxDQUFDa0YsU0FBRixHQUFjMUUsQ0FBQyxDQUFDeUUsUUFBOUYsRUFBd0dqRixDQUFDLENBQUM2RSxXQUFGLEdBQWdCckUsQ0FBQyxDQUFDdUUsWUFBMUgsRUFBd0kvRSxDQUFDLENBQUMrRSxZQUFGLEdBQWlCdkUsQ0FBQyxDQUFDcUUsV0FBakwsR0FBK0w3RSxDQUF0TTtBQUNILEtBeEREO0FBeURBLFFBQUlnQixDQUFDLEdBQUdZLE1BQU0sQ0FBQ2lFLElBQVAsS0FBZ0JBLElBQUksQ0FBQy9ELFNBQUwsQ0FBZWdFLEtBQWYsSUFBd0JELElBQUksQ0FBQy9ELFNBQUwsQ0FBZWlFLFdBQXZDLElBQXNERixJQUFJLENBQUMvRCxTQUFMLENBQWVrRSxRQUFyRixDQUFSO0FBQ0EzRixJQUFBQSxDQUFDLENBQUM0RixTQUFGLEdBQWNqRixDQUFDLElBQUksWUFBWTtBQUMzQixVQUFJbEIsQ0FBQyxHQUFHLEtBQUtnRyxLQUFMLElBQWMsS0FBS0MsV0FBbkIsSUFBa0MsS0FBS0MsUUFBL0M7QUFDQSxhQUFPbEcsQ0FBQyxDQUFDb0csS0FBRixDQUFRLElBQVIsRUFBY0MsU0FBZCxDQUFQO0FBQ0gsS0FIRCxFQUdHOUYsQ0FBQyxDQUFDK0YsZUFBRixHQUFvQjtBQUFDQyxNQUFBQSxJQUFJLEVBQUU7QUFBQyxlQUFPO0FBQVI7QUFBUCxLQUh2QixFQUc0Q2hHLENBQUMsQ0FBQ2lHLGFBQUYsR0FBa0IsVUFBVXhHLENBQVYsRUFBYUMsQ0FBYixFQUFnQkMsQ0FBaEIsRUFBbUI7QUFDN0VBLE1BQUFBLENBQUMsR0FBR0EsQ0FBQyxJQUFJLEVBQVQ7QUFDQSxVQUFJTSxDQUFDLEdBQUcsSUFBUjtBQUFBLFVBQWNFLENBQUMsR0FBR1IsQ0FBQyxDQUFDdUcsZUFBRixJQUFxQixNQUF2QztBQUFBLFVBQStDN0YsQ0FBQyxHQUFHLEVBQW5EO0FBQUEsVUFDSUssQ0FBQyxHQUFHLEVBQUVhLE1BQU0sQ0FBQzRFLFFBQVAsSUFBbUIxRyxDQUFuQixJQUF3QkEsQ0FBQyxDQUFDMkcsSUFBRixJQUFVLEVBQWxDLElBQXdDLGlCQUFpQjNHLENBQUMsQ0FBQzBDLElBQTNELElBQW1FbkMsQ0FBQyxDQUFDNEYsU0FBdkUsQ0FEUjtBQUVBLE9BQUNsRixDQUFELElBQU1WLENBQUMsQ0FBQ3NDLFFBQUYsQ0FBV3RDLENBQUMsQ0FBQzRGLFNBQUYsQ0FBWS9DLElBQVosQ0FBaUJwRCxDQUFqQixFQUFvQixDQUFwQixFQUF1QlUsQ0FBdkIsQ0FBWCxFQUFzQyxVQUFVVixDQUFWLEVBQWE7QUFDckQsWUFBSUEsQ0FBQyxDQUFDOEMsTUFBRixDQUFTOEQsS0FBYixFQUFvQixPQUFPLEtBQUszRyxDQUFDLENBQUNXLENBQUQsQ0FBYjtBQUNwQixZQUFJRixDQUFKO0FBQUEsWUFBT08sQ0FBUDtBQUFBLFlBQVVDLENBQVY7QUFBQSxZQUFhRSxDQUFiO0FBQUEsWUFBZ0JDLENBQUMsR0FBR3JCLENBQUMsQ0FBQzhDLE1BQUYsQ0FBU0MsTUFBN0I7QUFBQSxZQUFxQ29CLENBQUMsR0FBRyxJQUFJdUMsUUFBSixDQUFhckYsQ0FBYixDQUF6QztBQUFBLFlBQTBEK0MsQ0FBQyxHQUFHLENBQTlEO0FBQUEsWUFBaUVDLENBQUMsR0FBR0YsQ0FBQyxDQUFDMEMsVUFBRixHQUFlLENBQXBGO0FBQUEsWUFBdUZ2QyxDQUFDLEdBQUdGLENBQTNGOztBQUNBLFlBQUksVUFBVUQsQ0FBQyxDQUFDMkMsU0FBRixDQUFZLENBQVosQ0FBZCxFQUE4QjtBQUMxQixpQkFBTzFDLENBQUMsR0FBR0MsQ0FBSixLQUFVM0QsQ0FBQyxHQUFHeUQsQ0FBQyxDQUFDMkMsU0FBRixDQUFZMUMsQ0FBWixDQUFKLEVBQW9CMUQsQ0FBQyxJQUFJLEtBQUwsSUFBY0EsQ0FBQyxJQUFJLEtBQW5CLElBQTRCLFVBQVVBLENBQXBFLE1BQTJFTyxDQUFDLEdBQUdrRCxDQUFDLENBQUMyQyxTQUFGLENBQVkxQyxDQUFDLEdBQUcsQ0FBaEIsSUFBcUIsQ0FBekIsRUFBNEIsRUFBRUEsQ0FBQyxHQUFHbkQsQ0FBSixHQUFRa0QsQ0FBQyxDQUFDMEMsVUFBWixDQUF2RyxDQUFQLEdBQXlJO0FBQ3JJLGdCQUFJM0YsQ0FBQyxHQUFHWCxDQUFDLENBQUMrRixlQUFGLENBQWtCQyxJQUFsQixDQUF1QjdGLENBQXZCLENBQVIsRUFBbUMsS0FBS1UsQ0FBQyxHQUFHLENBQVQsRUFBWUEsQ0FBQyxHQUFHRixDQUFDLENBQUM2RixNQUFsQixFQUEwQjNGLENBQUMsSUFBSSxDQUEvQjtBQUFrQ0YsY0FBQUEsQ0FBQyxDQUFDRSxDQUFELENBQUQsQ0FBS2dDLElBQUwsQ0FBVTVDLENBQVYsRUFBYTJELENBQWIsRUFBZ0JDLENBQWhCLEVBQW1CbkQsQ0FBbkIsRUFBc0JMLENBQXRCLEVBQXlCVixDQUF6QjtBQUFsQztBQUNuQ2tFLFlBQUFBLENBQUMsSUFBSW5ELENBQUwsRUFBUXFELENBQUMsR0FBR0YsQ0FBWjtBQUNIOztBQUNELFdBQUNsRSxDQUFDLENBQUM4RyxnQkFBSCxJQUF1QjFDLENBQUMsR0FBRyxDQUEzQixLQUFpQ2pELENBQUMsQ0FBQzJFLEtBQUYsR0FBVXBGLENBQUMsQ0FBQ3FHLFNBQUYsR0FBYzVGLENBQUMsQ0FBQzJFLEtBQUYsQ0FBUSxDQUFSLEVBQVcxQixDQUFYLENBQXhCLEdBQXdDMUQsQ0FBQyxDQUFDcUcsU0FBRixHQUFjLElBQUlDLFVBQUosQ0FBZTdGLENBQWYsRUFBa0I4RixRQUFsQixDQUEyQixDQUEzQixFQUE4QjdDLENBQTlCLENBQXZGO0FBQ0g7O0FBQ0RyRSxRQUFBQSxDQUFDLENBQUNXLENBQUQsQ0FBRDtBQUNILE9BWEssRUFXSCxtQkFYRyxDQUFOLElBVzJCWCxDQUFDLENBQUNXLENBQUQsQ0FYNUI7QUFZSCxLQW5CRCxFQW1CR0wsQ0FBQyxDQUFDNkcsT0FBRixHQUFZLFlBQVk7QUFDdkIsYUFBTyxJQUFQO0FBQ0gsS0FyQkQsRUFxQkc3RyxDQUFDLENBQUM2RyxPQUFGLENBQVVwRixTQUFWLENBQW9CcUYsR0FBcEIsR0FBMEI7QUFBQ0MsTUFBQUEsV0FBVyxFQUFFO0FBQWQsS0FyQjdCLEVBcUJpRC9HLENBQUMsQ0FBQzZHLE9BQUYsQ0FBVXBGLFNBQVYsQ0FBb0J1RixHQUFwQixHQUEwQixVQUFVdkgsQ0FBVixFQUFhO0FBQ3BGLGFBQU8sS0FBS0EsQ0FBTCxLQUFXLEtBQUssS0FBS3FILEdBQUwsQ0FBU3JILENBQVQsQ0FBTCxDQUFsQjtBQUNILEtBdkJELEVBdUJHTyxDQUFDLENBQUNpSCxnQkFBRixHQUFxQixVQUFVeEgsQ0FBVixFQUFhQyxDQUFiLEVBQWdCQyxDQUFoQixFQUFtQjtBQUN2QyxVQUFJSyxDQUFKLEVBQU9DLENBQVAsRUFBVUUsQ0FBVjs7QUFDQSxVQUFJUixDQUFDLElBQUksRUFBRUQsQ0FBQyxHQUFHQyxDQUFKLEdBQVFGLENBQUMsQ0FBQzZHLFVBQVosQ0FBVCxFQUFrQztBQUM5QixhQUFLdEcsQ0FBQyxHQUFHLEVBQUosRUFBUUMsQ0FBQyxHQUFHLENBQWpCLEVBQW9CQSxDQUFDLEdBQUdOLENBQXhCLEVBQTJCTSxDQUFDLElBQUksQ0FBaEM7QUFBbUNFLFVBQUFBLENBQUMsR0FBR1YsQ0FBQyxDQUFDeUgsUUFBRixDQUFXeEgsQ0FBQyxHQUFHTyxDQUFmLENBQUosRUFBdUJELENBQUMsQ0FBQ21ILElBQUYsQ0FBTyxDQUFDaEgsQ0FBQyxHQUFHLEVBQUosR0FBUyxHQUFULEdBQWUsRUFBaEIsSUFBc0JBLENBQUMsQ0FBQ3lDLFFBQUYsQ0FBVyxFQUFYLENBQTdCLENBQXZCO0FBQW5DOztBQUNBLGVBQU8sc0JBQXNCNUMsQ0FBQyxDQUFDb0gsSUFBRixDQUFPLEdBQVAsQ0FBN0I7QUFDSDtBQUNKLEtBN0JELEVBNkJHcEgsQ0FBQyxDQUFDcUgsWUFBRixHQUFpQjtBQUNoQixTQUFHO0FBQ0NDLFFBQUFBLFFBQVEsRUFBRSxrQkFBVTdILENBQVYsRUFBYUMsQ0FBYixFQUFnQjtBQUN0QixpQkFBT0QsQ0FBQyxDQUFDeUgsUUFBRixDQUFXeEgsQ0FBWCxDQUFQO0FBQ0gsU0FIRjtBQUdJMEcsUUFBQUEsSUFBSSxFQUFFO0FBSFYsT0FEYTtBQUtiLFNBQUc7QUFDRmtCLFFBQUFBLFFBQVEsRUFBRSxrQkFBVTdILENBQVYsRUFBYUMsQ0FBYixFQUFnQjtBQUN0QixpQkFBTzZILE1BQU0sQ0FBQ0MsWUFBUCxDQUFvQi9ILENBQUMsQ0FBQ3lILFFBQUYsQ0FBV3hILENBQVgsQ0FBcEIsQ0FBUDtBQUNILFNBSEM7QUFHQzBHLFFBQUFBLElBQUksRUFBRSxDQUhQO0FBR1VxQixRQUFBQSxLQUFLLEVBQUUsQ0FBQztBQUhsQixPQUxVO0FBU2IsU0FBRztBQUNGSCxRQUFBQSxRQUFRLEVBQUUsa0JBQVU3SCxDQUFWLEVBQWFDLENBQWIsRUFBZ0JDLENBQWhCLEVBQW1CO0FBQ3pCLGlCQUFPRixDQUFDLENBQUM4RyxTQUFGLENBQVk3RyxDQUFaLEVBQWVDLENBQWYsQ0FBUDtBQUNILFNBSEM7QUFHQ3lHLFFBQUFBLElBQUksRUFBRTtBQUhQLE9BVFU7QUFhYixTQUFHO0FBQ0ZrQixRQUFBQSxRQUFRLEVBQUUsa0JBQVU3SCxDQUFWLEVBQWFDLENBQWIsRUFBZ0JDLENBQWhCLEVBQW1CO0FBQ3pCLGlCQUFPRixDQUFDLENBQUNpSSxTQUFGLENBQVloSSxDQUFaLEVBQWVDLENBQWYsQ0FBUDtBQUNILFNBSEM7QUFHQ3lHLFFBQUFBLElBQUksRUFBRTtBQUhQLE9BYlU7QUFpQmIsU0FBRztBQUNGa0IsUUFBQUEsUUFBUSxFQUFFLGtCQUFVN0gsQ0FBVixFQUFhQyxDQUFiLEVBQWdCQyxDQUFoQixFQUFtQjtBQUN6QixpQkFBT0YsQ0FBQyxDQUFDaUksU0FBRixDQUFZaEksQ0FBWixFQUFlQyxDQUFmLElBQW9CRixDQUFDLENBQUNpSSxTQUFGLENBQVloSSxDQUFDLEdBQUcsQ0FBaEIsRUFBbUJDLENBQW5CLENBQTNCO0FBQ0gsU0FIQztBQUdDeUcsUUFBQUEsSUFBSSxFQUFFO0FBSFAsT0FqQlU7QUFxQmIsU0FBRztBQUNGa0IsUUFBQUEsUUFBUSxFQUFFLGtCQUFVN0gsQ0FBVixFQUFhQyxDQUFiLEVBQWdCQyxDQUFoQixFQUFtQjtBQUN6QixpQkFBT0YsQ0FBQyxDQUFDa0ksUUFBRixDQUFXakksQ0FBWCxFQUFjQyxDQUFkLENBQVA7QUFDSCxTQUhDO0FBR0N5RyxRQUFBQSxJQUFJLEVBQUU7QUFIUCxPQXJCVTtBQXlCYixVQUFJO0FBQ0hrQixRQUFBQSxRQUFRLEVBQUUsa0JBQVU3SCxDQUFWLEVBQWFDLENBQWIsRUFBZ0JDLENBQWhCLEVBQW1CO0FBQ3pCLGlCQUFPRixDQUFDLENBQUNrSSxRQUFGLENBQVdqSSxDQUFYLEVBQWNDLENBQWQsSUFBbUJGLENBQUMsQ0FBQ2tJLFFBQUYsQ0FBV2pJLENBQUMsR0FBRyxDQUFmLEVBQWtCQyxDQUFsQixDQUExQjtBQUNILFNBSEU7QUFHQXlHLFFBQUFBLElBQUksRUFBRTtBQUhOO0FBekJTLEtBN0JwQixFQTJER3BHLENBQUMsQ0FBQ3FILFlBQUYsQ0FBZSxDQUFmLElBQW9CckgsQ0FBQyxDQUFDcUgsWUFBRixDQUFlLENBQWYsQ0EzRHZCLEVBMkQwQ3JILENBQUMsQ0FBQzRILFlBQUYsR0FBaUIsVUFBVW5JLENBQVYsRUFBYUMsQ0FBYixFQUFnQkMsQ0FBaEIsRUFBbUJNLENBQW5CLEVBQXNCRSxDQUF0QixFQUF5QkUsQ0FBekIsRUFBNEI7QUFDbkYsVUFBSUssQ0FBSjtBQUFBLFVBQU9DLENBQVA7QUFBQSxVQUFVRSxDQUFWO0FBQUEsVUFBYUMsQ0FBYjtBQUFBLFVBQWdCOEMsQ0FBaEI7QUFBQSxVQUFtQkMsQ0FBbkI7QUFBQSxVQUFzQkMsQ0FBQyxHQUFHOUQsQ0FBQyxDQUFDcUgsWUFBRixDQUFlcEgsQ0FBZixDQUExQjs7QUFDQSxVQUFJNkQsQ0FBQyxLQUFLcEQsQ0FBQyxHQUFHb0QsQ0FBQyxDQUFDc0MsSUFBRixHQUFTakcsQ0FBYixFQUFnQlEsQ0FBQyxHQUFHRCxDQUFDLEdBQUcsQ0FBSixHQUFRaEIsQ0FBQyxHQUFHRCxDQUFDLENBQUNpSSxTQUFGLENBQVkvSCxDQUFDLEdBQUcsQ0FBaEIsRUFBbUJVLENBQW5CLENBQVosR0FBb0NWLENBQUMsR0FBRyxDQUE1RCxFQUErRCxFQUFFZ0IsQ0FBQyxHQUFHRCxDQUFKLEdBQVFqQixDQUFDLENBQUM2RyxVQUFaLENBQXBFLENBQUwsRUFBbUc7QUFDL0YsWUFBSSxNQUFNbkcsQ0FBVixFQUFhLE9BQU8yRCxDQUFDLENBQUN3RCxRQUFGLENBQVc3SCxDQUFYLEVBQWNrQixDQUFkLEVBQWlCTixDQUFqQixDQUFQOztBQUNiLGFBQUtRLENBQUMsR0FBRyxFQUFKLEVBQVFDLENBQUMsR0FBRyxDQUFqQixFQUFvQkEsQ0FBQyxHQUFHWCxDQUF4QixFQUEyQlcsQ0FBQyxJQUFJLENBQWhDO0FBQW1DRCxVQUFBQSxDQUFDLENBQUNDLENBQUQsQ0FBRCxHQUFPZ0QsQ0FBQyxDQUFDd0QsUUFBRixDQUFXN0gsQ0FBWCxFQUFja0IsQ0FBQyxHQUFHRyxDQUFDLEdBQUdnRCxDQUFDLENBQUNzQyxJQUF4QixFQUE4Qi9GLENBQTlCLENBQVA7QUFBbkM7O0FBQ0EsWUFBSXlELENBQUMsQ0FBQzJELEtBQU4sRUFBYTtBQUNULGVBQUs3RCxDQUFDLEdBQUcsRUFBSixFQUFROUMsQ0FBQyxHQUFHLENBQWpCLEVBQW9CQSxDQUFDLEdBQUdELENBQUMsQ0FBQzJGLE1BQU4sS0FBaUIzQyxDQUFDLEdBQUdoRCxDQUFDLENBQUNDLENBQUQsQ0FBTCxFQUFVLFNBQVMrQyxDQUFwQyxDQUFwQixFQUE0RC9DLENBQUMsSUFBSSxDQUFqRTtBQUFvRThDLFlBQUFBLENBQUMsSUFBSUMsQ0FBTDtBQUFwRTs7QUFDQSxpQkFBT0QsQ0FBUDtBQUNIOztBQUNELGVBQU8vQyxDQUFQO0FBQ0g7QUFDSixLQXRFRCxFQXNFR2IsQ0FBQyxDQUFDNkgsWUFBRixHQUFpQixVQUFVcEksQ0FBVixFQUFhQyxDQUFiLEVBQWdCQyxDQUFoQixFQUFtQk0sQ0FBbkIsRUFBc0JFLENBQXRCLEVBQXlCO0FBQ3pDLFVBQUlFLENBQUMsR0FBR1osQ0FBQyxDQUFDOEcsU0FBRixDQUFZNUcsQ0FBWixFQUFlTSxDQUFmLENBQVI7QUFDQUUsTUFBQUEsQ0FBQyxDQUFDMkgsSUFBRixDQUFPekgsQ0FBUCxJQUFZTCxDQUFDLENBQUM0SCxZQUFGLENBQWVuSSxDQUFmLEVBQWtCQyxDQUFsQixFQUFxQkMsQ0FBckIsRUFBd0JGLENBQUMsQ0FBQzhHLFNBQUYsQ0FBWTVHLENBQUMsR0FBRyxDQUFoQixFQUFtQk0sQ0FBbkIsQ0FBeEIsRUFBK0NSLENBQUMsQ0FBQ2lJLFNBQUYsQ0FBWS9ILENBQUMsR0FBRyxDQUFoQixFQUFtQk0sQ0FBbkIsQ0FBL0MsRUFBc0VBLENBQXRFLENBQVo7QUFDSCxLQXpFRCxFQXlFR0QsQ0FBQyxDQUFDK0gsYUFBRixHQUFrQixVQUFVdEksQ0FBVixFQUFhQyxDQUFiLEVBQWdCQyxDQUFoQixFQUFtQkssQ0FBbkIsRUFBc0JDLENBQXRCLEVBQXlCO0FBQzFDLFVBQUlFLENBQUosRUFBT0UsQ0FBUCxFQUFVSyxDQUFWOztBQUNBLFVBQUksRUFBRWYsQ0FBQyxHQUFHLENBQUosR0FBUUYsQ0FBQyxDQUFDNkcsVUFBVixLQUF5Qm5HLENBQUMsR0FBR1YsQ0FBQyxDQUFDOEcsU0FBRixDQUFZNUcsQ0FBWixFQUFlSyxDQUFmLENBQUosRUFBdUJLLENBQUMsR0FBR1YsQ0FBQyxHQUFHLENBQUosR0FBUSxLQUFLUSxDQUF4QyxFQUEyQ0UsQ0FBQyxHQUFHLENBQUosR0FBUVosQ0FBQyxDQUFDNkcsVUFBOUUsQ0FBRixDQUFKLEVBQWtHO0FBQzlGLGFBQUs1RixDQUFDLEdBQUcsQ0FBVCxFQUFZQSxDQUFDLEdBQUdQLENBQWhCLEVBQW1CTyxDQUFDLElBQUksQ0FBeEI7QUFBMkIsZUFBS21ILFlBQUwsQ0FBa0JwSSxDQUFsQixFQUFxQkMsQ0FBckIsRUFBd0JDLENBQUMsR0FBRyxDQUFKLEdBQVEsS0FBS2UsQ0FBckMsRUFBd0NWLENBQXhDLEVBQTJDQyxDQUEzQztBQUEzQjs7QUFDQSxlQUFPUixDQUFDLENBQUNpSSxTQUFGLENBQVlySCxDQUFaLEVBQWVMLENBQWYsQ0FBUDtBQUNIO0FBQ0osS0EvRUQsRUErRUdBLENBQUMsQ0FBQ2dJLGFBQUYsR0FBa0IsVUFBVXZJLENBQVYsRUFBYUMsQ0FBYixFQUFnQkMsQ0FBaEIsRUFBbUJNLENBQW5CLEVBQXNCRSxDQUF0QixFQUF5QjtBQUMxQyxVQUFJLENBQUNBLENBQUMsQ0FBQzhILFdBQVAsRUFBb0I7QUFDaEIsWUFBSTVILENBQUo7QUFBQSxZQUFPSyxDQUFQO0FBQUEsWUFBVUMsQ0FBVjtBQUFBLFlBQWFFLENBQUMsR0FBR25CLENBQUMsR0FBRyxFQUFyQjs7QUFDQSxZQUFJLGVBQWVELENBQUMsQ0FBQ2lJLFNBQUYsQ0FBWWhJLENBQUMsR0FBRyxDQUFoQixDQUFmLElBQXFDLEVBQUVtQixDQUFDLEdBQUcsQ0FBSixHQUFRcEIsQ0FBQyxDQUFDNkcsVUFBWixDQUFyQyxJQUFnRSxNQUFNN0csQ0FBQyxDQUFDOEcsU0FBRixDQUFZN0csQ0FBQyxHQUFHLENBQWhCLENBQTFFLEVBQThGO0FBQzFGLGtCQUFRRCxDQUFDLENBQUM4RyxTQUFGLENBQVkxRixDQUFaLENBQVI7QUFDSSxpQkFBSyxLQUFMO0FBQ0lSLGNBQUFBLENBQUMsR0FBRyxDQUFDLENBQUw7QUFDQTs7QUFDSixpQkFBSyxLQUFMO0FBQ0lBLGNBQUFBLENBQUMsR0FBRyxDQUFDLENBQUw7QUFDQTs7QUFDSjtBQUNJO0FBUlI7O0FBVUEsaUJBQU9aLENBQUMsQ0FBQzhHLFNBQUYsQ0FBWTFGLENBQUMsR0FBRyxDQUFoQixFQUFtQlIsQ0FBbkIsQ0FBUCxLQUFpQ0ssQ0FBQyxHQUFHakIsQ0FBQyxDQUFDaUksU0FBRixDQUFZN0csQ0FBQyxHQUFHLENBQWhCLEVBQW1CUixDQUFuQixDQUFKLEVBQTJCSixDQUFDLENBQUM2SCxJQUFGLEdBQVMsSUFBSTlILENBQUMsQ0FBQzZHLE9BQU4sRUFBcEMsRUFBbURuRyxDQUFDLEdBQUdWLENBQUMsQ0FBQytILGFBQUYsQ0FBZ0J0SSxDQUFoQixFQUFtQm9CLENBQW5CLEVBQXNCQSxDQUFDLEdBQUdILENBQTFCLEVBQTZCTCxDQUE3QixFQUFnQ0osQ0FBaEMsQ0FBdkQsRUFBMkZTLENBQUMsSUFBSSxDQUFDUCxDQUFDLENBQUMrSCxvQkFBUixLQUFpQ3ZILENBQUMsR0FBRztBQUFDbUgsWUFBQUEsSUFBSSxFQUFFO0FBQVAsV0FBSixFQUFnQnBILENBQUMsR0FBR1YsQ0FBQyxDQUFDK0gsYUFBRixDQUFnQnRJLENBQWhCLEVBQW1Cb0IsQ0FBbkIsRUFBc0JBLENBQUMsR0FBR0gsQ0FBMUIsRUFBNkJMLENBQTdCLEVBQWdDTSxDQUFoQyxDQUFwQixFQUF3REEsQ0FBQyxDQUFDbUgsSUFBRixDQUFPLEdBQVAsTUFBZ0I3SCxDQUFDLENBQUM2SCxJQUFGLENBQU9LLFNBQVAsR0FBbUJuSSxDQUFDLENBQUNpSCxnQkFBRixDQUFtQnhILENBQW5CLEVBQXNCb0IsQ0FBQyxHQUFHRixDQUFDLENBQUNtSCxJQUFGLENBQU8sR0FBUCxDQUExQixFQUF1Q25ILENBQUMsQ0FBQ21ILElBQUYsQ0FBTyxHQUFQLENBQXZDLENBQW5DLENBQXpGLENBQTNGLEVBQThRN0gsQ0FBQyxDQUFDNkgsSUFBRixDQUFPLEtBQVAsS0FBaUIsQ0FBQzNILENBQUMsQ0FBQ2lJLGNBQXBCLElBQXNDcEksQ0FBQyxDQUFDK0gsYUFBRixDQUFnQnRJLENBQWhCLEVBQW1Cb0IsQ0FBbkIsRUFBc0JBLENBQUMsR0FBR1osQ0FBQyxDQUFDNkgsSUFBRixDQUFPLEtBQVAsQ0FBMUIsRUFBeUN6SCxDQUF6QyxFQUE0Q0osQ0FBNUMsQ0FBcFQsRUFBb1dBLENBQUMsQ0FBQzZILElBQUYsQ0FBTyxLQUFQLEtBQWlCLENBQUMzSCxDQUFDLENBQUNrSSxjQUFwQixJQUFzQ3JJLENBQUMsQ0FBQytILGFBQUYsQ0FBZ0J0SSxDQUFoQixFQUFtQm9CLENBQW5CLEVBQXNCQSxDQUFDLEdBQUdaLENBQUMsQ0FBQzZILElBQUYsQ0FBTyxLQUFQLENBQTFCLEVBQXlDekgsQ0FBekMsRUFBNENKLENBQTVDLENBQTNhO0FBQ0g7QUFDSjtBQUNKLEtBaEdELEVBZ0dHRCxDQUFDLENBQUMrRixlQUFGLENBQWtCQyxJQUFsQixDQUF1QixLQUF2QixFQUE4Qm1CLElBQTlCLENBQW1DbkgsQ0FBQyxDQUFDZ0ksYUFBckMsQ0FoR0g7O0FBaUdBLFFBQUluSCxDQUFDLEdBQUcsWUFBWTtBQUNoQixVQUFJcEIsQ0FBQyxHQUFHLEVBQVI7QUFBQSxVQUFZRSxDQUFDLEdBQUcsRUFBaEI7QUFBQSxVQUFvQkssQ0FBQyxHQUFHLEVBQXhCO0FBQUEsVUFBNEJDLENBQUMsR0FBRyxXQUFoQztBQUFBLFVBQTZDRSxDQUFDLEdBQUdvQixNQUFNLENBQUMrRyxnQkFBUCxDQUF3QnhJLFFBQVEsQ0FBQ3lJLGVBQWpDLEVBQWtELEVBQWxELENBQWpEO0FBQUEsVUFDSWxJLENBQUMsR0FBRyxDQUFDbUksS0FBSyxDQUFDL0csU0FBTixDQUFnQmdFLEtBQWhCLENBQXNCNUMsSUFBdEIsQ0FBMkIxQyxDQUEzQixFQUE4QmlILElBQTlCLENBQW1DLEVBQW5DLEVBQXVDcUIsS0FBdkMsQ0FBNkMsbUJBQTdDLEtBQXFFLE9BQU90SSxDQUFDLENBQUN1SSxLQUFULElBQWtCLENBQUMsRUFBRCxFQUFLLEdBQUwsQ0FBeEYsRUFBbUcsQ0FBbkcsQ0FEUjtBQUVBLG1CQUFhckksQ0FBYixLQUFtQkosQ0FBQyxHQUFHLGlCQUF2Qjs7QUFDQSxVQUFJUyxDQUFDLEdBQUcsV0FBVWpCLENBQVYsRUFBYUUsQ0FBYixFQUFnQkssQ0FBaEIsRUFBbUI7QUFDbkIsWUFBSUMsQ0FBQyxHQUFHUixDQUFSOztBQUNBLFlBQUlRLENBQUMsQ0FBQ3VHLE1BQUYsS0FBYTlHLENBQWpCLEVBQW9CO0FBQ2hCLGVBQUssSUFBSVMsQ0FBQyxHQUFHO0FBQ1R3SSxZQUFBQSxRQUFRLEVBQUUsRUFERDtBQUNLQyxZQUFBQSxJQUFJLEVBQUUsY0FBVW5KLENBQVYsRUFBYTtBQUM3QixxQkFBTyxLQUFLb0osTUFBTCxDQUFZcEosQ0FBWixDQUFQO0FBQ0gsYUFIUTtBQUdOb0osWUFBQUEsTUFBTSxFQUFFLGdCQUFVcEosQ0FBVixFQUFhO0FBQ3BCLGtCQUFJQyxDQUFDLEdBQUcsS0FBS2lKLFFBQUwsQ0FBY25DLE1BQXRCO0FBQ0EscUJBQU8sS0FBS21DLFFBQUwsQ0FBY0csT0FBZCxDQUFzQixVQUFVbkosQ0FBVixFQUFhSyxDQUFiLEVBQWdCO0FBQ3pDTCxnQkFBQUEsQ0FBQyxDQUFDa0osTUFBRixDQUFTbEksQ0FBQyxDQUFDbEIsQ0FBRCxFQUFJTyxDQUFKLEVBQU9OLENBQVAsQ0FBVjtBQUNILGVBRk0sR0FFSFMsQ0FGSjtBQUdILGFBUlE7QUFRTjRJLFlBQUFBLFFBQVEsRUFBRSxrQkFBVXRKLENBQVYsRUFBYTtBQUN0QixxQkFBTyxLQUFLa0osUUFBTCxDQUFjRyxPQUFkLENBQXNCLFVBQVVwSixDQUFWLEVBQWE7QUFDdENBLGdCQUFBQSxDQUFDLENBQUNxSixRQUFGLENBQVd0SixDQUFYO0FBQ0gsZUFGTSxHQUVIVSxDQUZKO0FBR0gsYUFaUTtBQVlONkksWUFBQUEsTUFBTSxFQUFFLGtCQUFZO0FBQ25CLHFCQUFPLEtBQUtMLFFBQUwsQ0FBY0csT0FBZCxDQUFzQixVQUFVckosQ0FBVixFQUFhO0FBQ3RDQSxnQkFBQUEsQ0FBQyxDQUFDdUosTUFBRjtBQUNILGVBRk0sR0FFSDdJLENBRko7QUFHSCxhQWhCUTtBQWdCTjhJLFlBQUFBLFFBQVEsRUFBRSxvQkFBWTtBQUNyQixxQkFBTyxLQUFLTixRQUFMLENBQWNHLE9BQWQsQ0FBc0IsVUFBVXJKLENBQVYsRUFBYTtBQUN0Q0EsZ0JBQUFBLENBQUMsQ0FBQ3dKLFFBQUY7QUFDSCxlQUZNLEdBRUg5SSxDQUZKO0FBR0g7QUFwQlEsV0FBUixFQXFCRkUsQ0FBQyxHQUFHLENBckJGLEVBcUJLSyxDQUFDLEdBQUdULENBQUMsQ0FBQ3VHLE1BckJoQixFQXFCd0JuRyxDQUFDLEdBQUdLLENBckI1QixFQXFCK0IsRUFBRUwsQ0FyQmpDO0FBcUJvQyx3QkFBWSxPQUFPVixDQUFuQixHQUF1QlEsQ0FBQyxDQUFDd0ksUUFBRixDQUFXeEIsSUFBWCxDQUFnQnRHLENBQUMsQ0FBQ1osQ0FBQyxDQUFDSSxDQUFELENBQUYsRUFBT1YsQ0FBUCxFQUFVZ0IsQ0FBQyxDQUFDWCxDQUFELEVBQUlLLENBQUosRUFBT0ssQ0FBUCxDQUFYLENBQWpCLENBQXZCLEdBQWlFUCxDQUFDLENBQUN3SSxRQUFGLENBQVd4QixJQUFYLENBQWdCdEcsQ0FBQyxDQUFDWixDQUFDLENBQUNJLENBQUQsQ0FBRixFQUFPTSxDQUFDLENBQUNoQixDQUFELEVBQUlVLENBQUosRUFBT0ssQ0FBUCxDQUFSLEVBQW1CVixDQUFuQixDQUFqQixDQUFqRTtBQXJCcEM7O0FBc0JBLGlCQUFPRyxDQUFQO0FBQ0g7O0FBQ0QsZUFBTyxZQUFZLE9BQU9SLENBQW5CLEdBQXVCa0IsQ0FBQyxDQUFDWixDQUFELEVBQUlOLENBQUosRUFBT2dCLENBQUMsQ0FBQ1gsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLENBQVIsQ0FBeEIsR0FBNkNhLENBQUMsQ0FBQ1osQ0FBRCxFQUFJVSxDQUFDLENBQUNoQixDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsQ0FBTCxFQUFnQkssQ0FBaEIsQ0FBckQ7QUFDSCxPQTVCTDtBQUFBLFVBNEJPVyxDQUFDLEdBQUcsU0FBSkEsQ0FBSSxDQUFVbEIsQ0FBVixFQUFhQyxDQUFiLEVBQWdCQyxDQUFoQixFQUFtQjtBQUN0QixZQUFJLENBQUNGLENBQUwsRUFBUSxPQUFPQSxDQUFQO0FBQ1IsWUFBSU8sQ0FBQyxHQUFHa0osQ0FBQyxDQUFDekosQ0FBRCxDQUFUO0FBQ0EwSixRQUFBQSxDQUFDLENBQUMxSixDQUFDLENBQUMySixLQUFILENBQUQsS0FBZXBKLENBQUMsQ0FBQ29KLEtBQUYsR0FBVTNKLENBQUMsQ0FBQzJKLEtBQUYsQ0FBUTFKLENBQVIsRUFBV0MsQ0FBWCxDQUF6QixHQUF5Q3dKLENBQUMsQ0FBQzFKLENBQUMsQ0FBQzRKLFFBQUgsQ0FBRCxLQUFrQnJKLENBQUMsQ0FBQ3NKLFFBQUYsR0FBYSxZQUFZO0FBQ2hGN0osVUFBQUEsQ0FBQyxDQUFDNEosUUFBRixDQUFXeEcsSUFBWCxDQUFnQixJQUFoQixFQUFzQm5ELENBQXRCLEVBQXlCQyxDQUF6QjtBQUNILFNBRndDLENBQXpDO0FBR0EsWUFBSU0sQ0FBQyxHQUFHa0osQ0FBQyxDQUFDMUosQ0FBQyxDQUFDOEosT0FBSCxDQUFUO0FBQUEsWUFBc0JwSixDQUFDLEdBQUdnSixDQUFDLENBQUMxSixDQUFDLENBQUM2SixRQUFILENBQTNCO0FBQ0EsU0FBQ25KLENBQUMsSUFBSUYsQ0FBTixNQUFhRCxDQUFDLENBQUNzSixRQUFGLEdBQWEsWUFBWTtBQUNsQ25KLFVBQUFBLENBQUMsSUFBSVYsQ0FBQyxDQUFDNkosUUFBRixDQUFXekcsSUFBWCxDQUFnQixJQUFoQixFQUFzQm5ELENBQXRCLEVBQXlCQyxDQUF6QixDQUFMLEVBQWtDTSxDQUFDLElBQUlQLENBQUMsSUFBSUMsQ0FBQyxHQUFHLENBQWQsSUFBbUJGLENBQUMsQ0FBQzhKLE9BQUYsRUFBckQ7QUFDSCxTQUZELEdBRUlKLENBQUMsQ0FBQzFKLENBQUMsQ0FBQytKLFdBQUgsQ0FBRCxLQUFxQnhKLENBQUMsQ0FBQ3dKLFdBQUYsR0FBZ0IsVUFBVXhKLENBQVYsRUFBYUMsQ0FBYixFQUFnQjtBQUNyRCxpQkFBT1IsQ0FBQyxDQUFDK0osV0FBRixDQUFjeEosQ0FBZCxFQUFpQkMsQ0FBakIsRUFBb0JQLENBQXBCLEVBQXVCQyxDQUF2QixDQUFQO0FBQ0gsU0FGRyxDQUZKLEVBSUl3SixDQUFDLENBQUMxSixDQUFDLENBQUNnSyxNQUFILENBQUQsS0FBZ0J6SixDQUFDLENBQUN5SixNQUFGLEdBQVcsVUFBVXpKLENBQVYsRUFBYTtBQUN4QyxpQkFBT1AsQ0FBQyxDQUFDZ0ssTUFBRixDQUFTekosQ0FBVCxFQUFZTixDQUFaLEVBQWVDLENBQWYsQ0FBUDtBQUNILFNBRkcsQ0FKSjtBQU9BLFlBQUlVLENBQUMsR0FBRyxDQUFDLFVBQUQsRUFBYSxVQUFiLEVBQXlCLE1BQXpCLEVBQWlDLGNBQWpDLEVBQWlELE9BQWpELEVBQTBELE9BQTFELEVBQW1FLFFBQW5FLEVBQTZFLFNBQTdFLEVBQXdGLGNBQXhGLEVBQXdHLGNBQXhHLEVBQXdILFVBQXhILEVBQW9JLGtCQUFwSSxFQUF3SixXQUF4SixFQUFxSyxXQUFySyxFQUFrTCxZQUFsTCxFQUFnTSxhQUFoTSxFQUErTSxpQkFBL00sRUFBa08sVUFBbE8sRUFBOE8sT0FBOU8sQ0FBUjtBQUNBLGVBQU9BLENBQUMsQ0FBQ3lJLE9BQUYsQ0FBVSxVQUFVN0ksQ0FBVixFQUFhO0FBQzFCa0osVUFBQUEsQ0FBQyxDQUFDMUosQ0FBQyxDQUFDUSxDQUFELENBQUYsQ0FBRCxLQUFZRCxDQUFDLENBQUNDLENBQUQsQ0FBRCxHQUFPUixDQUFDLENBQUNRLENBQUQsQ0FBRCxDQUFLUCxDQUFMLEVBQVFDLENBQVIsQ0FBbkI7QUFDSCxTQUZNLEdBRUhLLENBRko7QUFHSCxPQTlDTDtBQUFBLFVBOENPYSxDQUFDLEdBQUcsV0FBVXBCLENBQVYsRUFBYUMsQ0FBYixFQUFnQk0sQ0FBaEIsRUFBbUI7QUFDdEIsaUJBQVNDLENBQVQsQ0FBV1AsQ0FBWCxFQUFjO0FBQ1YsY0FBSXFFLENBQUMsQ0FBQzJGLElBQUYsQ0FBT2hLLENBQVAsR0FBV3FFLENBQUMsQ0FBQzRGLGFBQUYsQ0FBZ0JsSyxDQUFoQixDQUFYLEVBQStCLENBQUNzRSxDQUFDLENBQUM2RixTQUFGLEVBQXBDLEVBQW1ELE9BQU83RixDQUFDLENBQUM4RixTQUFGLEtBQWdCLE1BQUsxSixDQUFDLENBQUMySixJQUFGLEdBQVMsQ0FBVCxJQUFjLENBQUMvRixDQUFDLENBQUM2RixTQUFGLEVBQWYsSUFBZ0N6SixDQUFDLENBQUMySixJQUFGLElBQVUsQ0FBVixFQUFhL0YsQ0FBQyxDQUFDZ0csT0FBRixFQUFiLEVBQTBCcEcsQ0FBQyxDQUFDMUQsQ0FBRCxDQUEzRCxLQUFtRUUsQ0FBQyxDQUFDbUosUUFBRixJQUFjbkosQ0FBQyxDQUFDbUosUUFBRixDQUFXekcsSUFBWCxDQUFnQnBELENBQWhCLENBQWQsRUFBa0N1RSxDQUFDLENBQUN3QyxNQUFGLEtBQWFyRyxDQUFDLEdBQUc2RCxDQUFDLENBQUNnRyxHQUFGLEVBQUosRUFBYXRKLENBQUMsR0FBRzBELENBQUMsQ0FBQ2pFLENBQUQsRUFBSVUsQ0FBSixFQUFPLENBQUMsQ0FBUixDQUFsQixFQUE4QkEsQ0FBQyxHQUFHdUQsQ0FBQyxDQUFDakUsQ0FBRCxFQUFJK0ksQ0FBQyxDQUFDckksQ0FBRCxDQUFMLENBQW5DLEVBQThDVixDQUFDLEdBQUdrRSxDQUFDLENBQUMzRCxDQUFELEVBQUlHLENBQUosRUFBT1YsQ0FBUCxDQUFuRCxFQUE4RDRELENBQUMsR0FBR2tHLENBQUMsQ0FBQzlKLENBQUQsQ0FBbkUsRUFBd0VSLENBQUMsQ0FBQ3dILElBQUYsQ0FBTyxDQUFDMUgsQ0FBRCxFQUFJc0UsQ0FBSixDQUFQLENBQXhFLEVBQXdGQSxDQUFDLENBQUMyRixJQUFGLENBQU9oSyxDQUFQLENBQXhGLEVBQW1HaUUsQ0FBQyxDQUFDMUQsQ0FBRCxDQUFqSCxDQUFyRyxDQUFMLENBQWhCLEdBQW9QMEQsQ0FBQyxDQUFDMUQsQ0FBRCxDQUE1UDtBQUN0RDs7QUFFRCxZQUFJLGdCQUFnQlAsQ0FBcEIsRUFBdUIsT0FBT29CLENBQUMsQ0FBQ3JCLENBQUQsRUFBSU8sQ0FBSixDQUFSO0FBQ3ZCLFlBQUksV0FBV04sQ0FBZixFQUFrQixPQUFPa0UsQ0FBQyxDQUFDbkUsQ0FBRCxDQUFSO0FBQ2xCLFlBQUksYUFBYUMsQ0FBakIsRUFBb0IsT0FBT29FLENBQUMsQ0FBQ3JFLENBQUQsQ0FBUjtBQUNwQixZQUFJVSxDQUFDLEdBQUdULENBQVI7QUFDQXVFLFFBQUFBLENBQUM7QUFDRCxZQUFJNUQsQ0FBQyxHQUFHOEQsQ0FBQyxDQUFDMUUsQ0FBRCxDQUFUO0FBQUEsWUFBY2lCLENBQUMsR0FBR0wsQ0FBbEI7QUFDQUssUUFBQUEsQ0FBQyxHQUFHMEQsQ0FBQyxDQUFDakUsQ0FBRCxFQUFJTyxDQUFKLEVBQU8sQ0FBQyxDQUFSLENBQUw7QUFDQSxZQUFJRyxDQUFDLEdBQUdxSSxDQUFDLENBQUM3SSxDQUFELENBQVQ7QUFDQVEsUUFBQUEsQ0FBQyxHQUFHdUQsQ0FBQyxDQUFDakUsQ0FBRCxFQUFJVSxDQUFKLENBQUw7QUFDQSxZQUFJZ0QsQ0FBQyxHQUFHUSxDQUFDLENBQUMzRCxDQUFELEVBQUlHLENBQUosRUFBT1YsQ0FBUCxDQUFUO0FBQUEsWUFBb0I0RCxDQUFDLEdBQUdrRyxDQUFDLENBQUNwRyxDQUFELENBQXpCO0FBQ0FsRSxRQUFBQSxDQUFDLENBQUN3SCxJQUFGLENBQU8sQ0FBQzFILENBQUQsRUFBSXNFLENBQUosQ0FBUCxHQUFnQkEsQ0FBQyxDQUFDNEYsYUFBRixDQUFnQmxLLENBQWhCLEVBQW1CLENBQUMsQ0FBcEIsQ0FBaEI7QUFDQSxZQUFJdUUsQ0FBQyxHQUFHLEVBQVI7QUFBQSxZQUFZRSxDQUFDLEdBQUc7QUFDWjJFLFVBQUFBLE1BQU0sRUFBRSxnQkFBVXBKLENBQVYsRUFBYTtBQUNqQixtQkFBT3VFLENBQUMsQ0FBQ2tHLE9BQUYsQ0FBVXZKLENBQUMsQ0FBQ2xCLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxDQUFYLEdBQXVCeUUsQ0FBOUI7QUFDSCxXQUhXO0FBR1QwRSxVQUFBQSxJQUFJLEVBQUUsY0FBVW5KLENBQVYsRUFBYTtBQUNsQixtQkFBTyxLQUFLb0osTUFBTCxDQUFZcEosQ0FBWixDQUFQO0FBQ0g7QUFMVyxTQUFoQjtBQU9BLGVBQU9rRSxDQUFDLENBQUMxRCxDQUFELENBQUQsRUFBTUUsQ0FBQyxDQUFDZ0ssTUFBRixHQUFXcEcsQ0FBWCxHQUFlRyxDQUE1QjtBQUNILE9BdEVMO0FBQUEsVUFzRU9wRCxDQUFDLEdBQUcsU0FBSkEsQ0FBSSxDQUFVckIsQ0FBVixFQUFhQyxDQUFiLEVBQWdCO0FBQ25CLGlCQUFTTSxDQUFULENBQVdMLENBQVgsRUFBYztBQUNWUSxVQUFBQSxDQUFDLENBQUN1SixJQUFGLENBQU8vSixDQUFQLEdBQVdRLENBQUMsQ0FBQ3dKLGFBQUYsQ0FBZ0JsSyxDQUFoQixDQUFYLEVBQStCVSxDQUFDLENBQUMwSixTQUFGLE1BQWlCbkssQ0FBQyxDQUFDMkosUUFBRixJQUFjM0osQ0FBQyxDQUFDMkosUUFBRixDQUFXNUosQ0FBWCxDQUFkLEVBQTZCQyxDQUFDLENBQUNvSyxJQUFGLElBQVVwSyxDQUFDLENBQUNvSyxJQUFGLEdBQVMsQ0FBbkIsS0FBeUJwSyxDQUFDLENBQUNvSyxJQUFGLElBQVUzSixDQUFDLENBQUM0SixPQUFGLEVBQVYsRUFBdUJwRyxDQUFDLENBQUMzRCxDQUFELENBQWpELENBQTlDLElBQXVHMkQsQ0FBQyxDQUFDM0QsQ0FBRCxDQUF2STtBQUNIOztBQUVELFlBQUlDLENBQUMsR0FBR21FLENBQUMsQ0FBQzFFLENBQUQsRUFBSTBLLENBQUMsQ0FBQyxFQUFELENBQUwsQ0FBVDtBQUNBMUssUUFBQUEsQ0FBQyxDQUFDMkssUUFBRixHQUFhcEssQ0FBYjtBQUNBLFlBQUlFLENBQUMsR0FBR21LLENBQUMsQ0FBQzVLLENBQUQsQ0FBVDtBQUNBQyxRQUFBQSxDQUFDLENBQUN3SCxJQUFGLENBQU8sQ0FBQzFILENBQUQsRUFBSVUsQ0FBSixDQUFQLEdBQWdCd0QsQ0FBQyxDQUFDM0QsQ0FBRCxDQUFqQjtBQUNILE9BL0VMO0FBQUEsVUErRU80RCxDQUFDLEdBQUcsU0FBSkEsQ0FBSSxDQUFVbkUsQ0FBVixFQUFhO0FBQ2hCLGFBQUssSUFBSUMsQ0FBQyxHQUFHLENBQVIsRUFBV00sQ0FBQyxHQUFHTCxDQUFDLENBQUM2RyxNQUF0QixFQUE4QjlHLENBQUMsR0FBR00sQ0FBbEMsRUFBcUMsRUFBRU4sQ0FBdkMsRUFBMEM7QUFDdEMsY0FBSU8sQ0FBQyxHQUFHTixDQUFDLENBQUNELENBQUQsQ0FBVDtBQUFBLGNBQWNTLENBQUMsR0FBR0YsQ0FBQyxDQUFDLENBQUQsQ0FBbkI7QUFBQSxjQUF3QkksQ0FBQyxHQUFHSixDQUFDLENBQUMsQ0FBRCxDQUE3QjtBQUNBRSxVQUFBQSxDQUFDLEtBQUtWLENBQU4sSUFBV1ksQ0FBQyxDQUFDa0ssSUFBRixFQUFYO0FBQ0g7QUFDSixPQXBGTDtBQUFBLFVBb0ZPMUcsQ0FBQyxHQUFHLFNBQUpBLENBQUksQ0FBVXBFLENBQVYsRUFBYUMsQ0FBYixFQUFnQjtBQUNuQixhQUFLLElBQUlDLENBQUMsR0FBRyxDQUFSLEVBQVdLLENBQUMsR0FBR1AsQ0FBQyxDQUFDK0csTUFBdEIsRUFBOEI3RyxDQUFDLEdBQUdLLENBQWxDLEVBQXFDLEVBQUVMLENBQXZDO0FBQTBDLGNBQUlGLENBQUMsQ0FBQ0UsQ0FBRCxDQUFELENBQUssQ0FBTCxNQUFZRCxDQUFoQixFQUFtQixPQUFPQyxDQUFQO0FBQTdEOztBQUNBLGVBQU8sQ0FBQyxDQUFSO0FBQ0gsT0F2Rkw7QUFBQSxVQXVGT21FLENBQUMsR0FBRyxTQUFKQSxDQUFJLENBQVVyRSxDQUFWLEVBQWE7QUFDaEIsWUFBSUMsQ0FBSjtBQUFBLFlBQU9PLENBQVA7QUFBQSxZQUFVRSxDQUFDLEdBQUcsRUFBZDtBQUFBLFlBQWtCRSxDQUFDLEdBQUdWLENBQUMsQ0FBQzZLLE1BQUYsQ0FBU3hLLENBQVQsQ0FBdEI7QUFBQSxZQUFtQ1UsQ0FBQyxHQUFHTCxDQUFDLENBQUNtRyxNQUF6Qzs7QUFDQSxhQUFLdkcsQ0FBQyxHQUFHLENBQVQsRUFBWUEsQ0FBQyxHQUFHUyxDQUFoQixFQUFtQixFQUFFVCxDQUFyQjtBQUF3QlAsVUFBQUEsQ0FBQyxHQUFHVyxDQUFDLENBQUNKLENBQUQsQ0FBRCxDQUFLLENBQUwsQ0FBSixFQUFhLENBQUNSLENBQUMsQ0FBQ2dMLFFBQUYsQ0FBVy9LLENBQVgsS0FBaUJELENBQUMsS0FBS0MsQ0FBeEIsS0FBOEJTLENBQUMsQ0FBQ2dILElBQUYsQ0FBT3pILENBQVAsQ0FBM0M7QUFBeEI7O0FBQ0EsYUFBS2dCLENBQUMsR0FBR1AsQ0FBQyxDQUFDcUcsTUFBTixFQUFjdkcsQ0FBQyxHQUFHLENBQXZCLEVBQTBCQSxDQUFDLEdBQUdTLENBQTlCLEVBQWlDLEVBQUVULENBQW5DO0FBQXNDOEQsVUFBQUEsQ0FBQyxDQUFDNUQsQ0FBQyxDQUFDRixDQUFELENBQUYsQ0FBRDtBQUF0QztBQUNILE9BM0ZMO0FBQUEsVUEyRk84RCxDQUFDLEdBQUcsU0FBSkEsQ0FBSSxDQUFVdEUsQ0FBVixFQUFhO0FBQ2hCbUUsUUFBQUEsQ0FBQyxDQUFDbkUsQ0FBRCxDQUFEO0FBQ0EsWUFBSUMsQ0FBQyxHQUFHbUUsQ0FBQyxDQUFDbEUsQ0FBRCxFQUFJRixDQUFKLENBQVQ7QUFDQUMsUUFBQUEsQ0FBQyxJQUFJLENBQUwsSUFBVUMsQ0FBQyxDQUFDK0ssTUFBRixDQUFTaEwsQ0FBVCxFQUFZLENBQVosQ0FBVixFQUEwQkEsQ0FBQyxHQUFHbUUsQ0FBQyxDQUFDN0QsQ0FBRCxFQUFJUCxDQUFKLENBQS9CLEVBQXVDQyxDQUFDLElBQUksQ0FBTCxJQUFVTSxDQUFDLENBQUMwSyxNQUFGLENBQVNoTCxDQUFULEVBQVksQ0FBWixDQUFqRDtBQUNILE9BL0ZMO0FBQUEsVUErRk9zRSxDQUFDLEdBQUcsU0FBSkEsQ0FBSSxDQUFVdkUsQ0FBVixFQUFhQyxDQUFiLEVBQWdCO0FBQ25CLGFBQUssSUFBSUMsQ0FBQyxHQUFHLENBQVIsRUFBV0ssQ0FBQyxHQUFHUCxDQUFDLENBQUMrRyxNQUF0QixFQUE4QjdHLENBQUMsR0FBR0ssQ0FBbEMsRUFBcUMsRUFBRUwsQ0FBdkMsRUFBMEM7QUFDdEMsY0FBSU0sQ0FBQyxHQUFHUixDQUFDLENBQUNFLENBQUQsQ0FBVDtBQUFBLGNBQWNRLENBQUMsR0FBR0YsQ0FBQyxDQUFDLENBQUQsQ0FBbkI7QUFBQSxjQUF3QkksQ0FBQyxHQUFHSixDQUFDLENBQUMsQ0FBRCxDQUE3Qjs7QUFDQSxjQUFJRSxDQUFDLEtBQUtULENBQVYsRUFBYTtBQUNULGdCQUFJZ0IsQ0FBQyxHQUFHTCxDQUFDLENBQUNzSyxlQUFGLEVBQVI7QUFDQSxtQkFBT3RLLENBQUMsQ0FBQ2tLLElBQUYsSUFBVTdKLENBQWpCO0FBQ0g7QUFDSjtBQUNKLE9BdkdMO0FBQUEsVUF1R091RCxDQUFDLEdBQUcsU0FBSkEsQ0FBSSxHQUFZO0FBQ2ZqRSxRQUFBQSxDQUFDLEdBQUdBLENBQUMsQ0FBQzRLLE1BQUYsQ0FBUyxVQUFVbkwsQ0FBVixFQUFhO0FBQ3RCLGlCQUFPeUUsQ0FBQyxDQUFDekUsQ0FBQyxDQUFDLENBQUQsQ0FBRixDQUFELENBQVFvTCxJQUFmO0FBQ0gsU0FGRyxDQUFKO0FBR0gsT0EzR0w7QUFBQSxVQTJHTzNHLENBQUMsR0FBRyxTQUFKQSxDQUFJLENBQVV6RSxDQUFWLEVBQWE7QUFDaEIsYUFBSyxJQUFJQyxDQUFDLEdBQUdELENBQWIsRUFBZ0JDLENBQUMsQ0FBQ29MLFVBQWxCO0FBQStCcEwsVUFBQUEsQ0FBQyxHQUFHQSxDQUFDLENBQUNvTCxVQUFOO0FBQS9COztBQUNBLGVBQU9wTCxDQUFQO0FBQ0gsT0E5R0w7QUFBQSxVQThHT3lFLENBQUMsR0FBRyxTQUFKQSxDQUFJLENBQVUxRSxDQUFWLEVBQWE7QUFDaEIsWUFBSUMsQ0FBQyxHQUFHc0UsQ0FBQyxDQUFDckUsQ0FBRCxFQUFJRixDQUFKLENBQVQ7O0FBQ0EsZUFBT0MsQ0FBQyxHQUFHQSxDQUFILEdBQU9zRSxDQUFDLENBQUNoRSxDQUFELEVBQUlQLENBQUosQ0FBaEI7QUFDSCxPQWpITDtBQUFBLFVBaUhPMkUsQ0FBQyxHQUFHLFNBQUpBLENBQUksQ0FBVTNFLENBQVYsRUFBYUMsQ0FBYixFQUFnQkMsQ0FBaEIsRUFBbUI7QUFDdEJELFFBQUFBLENBQUMsS0FBS0EsQ0FBQyxHQUFHMEssQ0FBQyxDQUFDO0FBQ1JXLFVBQUFBLFFBQVEsRUFBRSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxDQURGO0FBRVJDLFVBQUFBLFFBQVEsRUFBRSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxDQUZGO0FBR1JDLFVBQUFBLFlBQVksRUFBRSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxDQUhOO0FBSVJsSixVQUFBQSxLQUFLLEVBQUUsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUpDO0FBS1JtSixVQUFBQSxJQUFJLEVBQUUsQ0FBQyxDQUFELEVBQUksQ0FBSjtBQUxFLFNBQUQsQ0FBVixDQUFEO0FBT0EsWUFBSWxMLENBQUMsR0FBRyxVQUFSO0FBQUEsWUFBb0JDLENBQUMsR0FBRyxVQUF4QjtBQUFBLFlBQW9DRSxDQUFDLEdBQUcsTUFBeEM7QUFBQSxZQUFnREUsQ0FBQyxHQUFHLGNBQXBEO0FBQUEsWUFBb0VLLENBQUMsR0FBRyxPQUF4RTtBQUFBLFlBQWlGQyxDQUFDLEdBQUcsV0FBckY7QUFBQSxZQUNJRSxDQUFDLEdBQUcsT0FEUjtBQUFBLFlBQ2lCQyxDQUFDLEdBQUcsUUFEckI7QUFBQSxZQUMrQjhDLENBQUMsR0FBRyxTQURuQztBQUVBLGVBQU9qRSxDQUFDLEtBQUtLLENBQUMsR0FBRyxjQUFKLEVBQW9CQyxDQUFDLEdBQUcsY0FBeEIsRUFBd0NFLENBQUMsR0FBRyxVQUE1QyxFQUF3REUsQ0FBQyxHQUFHLGtCQUE1RCxFQUFnRkssQ0FBQyxHQUFHLFdBQXBGLEVBQWlHQyxDQUFDLEdBQUcsZUFBckcsRUFBc0hFLENBQUMsR0FBRyxXQUExSCxFQUF1SUMsQ0FBQyxHQUFHLFlBQTNJLEVBQXlKOEMsQ0FBQyxHQUFHLGFBQWxLLENBQUQsRUFBbUxsRSxDQUFDLENBQUNxTCxRQUFGLEdBQWFJLENBQUMsQ0FBQzFMLENBQUMsQ0FBQ08sQ0FBRCxDQUFGLEVBQU9OLENBQUMsQ0FBQ3FMLFFBQVQsQ0FBak0sRUFBcU5yTCxDQUFDLENBQUNzTCxRQUFGLEdBQWFHLENBQUMsQ0FBQzFMLENBQUMsQ0FBQ1EsQ0FBRCxDQUFGLEVBQU9QLENBQUMsQ0FBQ3NMLFFBQVQsQ0FBbk8sRUFBdVB0TCxDQUFDLENBQUN1TCxZQUFGLEdBQWlCRSxDQUFDLENBQUMxTCxDQUFDLENBQUNZLENBQUQsQ0FBRixFQUFPWCxDQUFDLENBQUN1TCxZQUFULENBQXpRLEVBQWlTdkwsQ0FBQyxDQUFDd0wsSUFBRixHQUFTQyxDQUFDLENBQUMxTCxDQUFDLENBQUNVLENBQUQsQ0FBRixFQUFPVCxDQUFDLENBQUN3TCxJQUFULENBQTNTLEVBQTJUeEwsQ0FBQyxDQUFDcUMsS0FBRixHQUFVb0osQ0FBQyxDQUFDMUwsQ0FBQyxDQUFDaUIsQ0FBRCxDQUFGLEVBQU9oQixDQUFDLENBQUNxQyxLQUFULENBQXRVLEVBQXVWckMsQ0FBQyxDQUFDMEwsU0FBRixHQUFjRCxDQUFDLENBQUMxTCxDQUFDLENBQUNrQixDQUFELENBQUYsRUFBT2pCLENBQUMsQ0FBQzBMLFNBQVQsQ0FBdFcsRUFBMlgxTCxDQUFDLENBQUMyTCxPQUFGLEdBQVk1TCxDQUFDLENBQUNtRSxDQUFELENBQXhZLEVBQTZZbEUsQ0FBQyxDQUFDUSxLQUFGLEdBQVVULENBQUMsQ0FBQ29CLENBQUQsQ0FBeFosRUFBNlpuQixDQUFDLENBQUNVLE1BQUYsR0FBV1gsQ0FBQyxDQUFDcUIsQ0FBRCxDQUF6YSxFQUE4YXBCLENBQXJiO0FBQ0gsT0E1SEw7QUFBQSxVQTRITzJFLENBQUMsR0FBRyxTQUFKQSxDQUFJLENBQVU1RSxDQUFWLEVBQWFDLENBQWIsRUFBZ0JDLENBQWhCLEVBQW1CO0FBQ3RCLGVBQU9BLENBQUMsQ0FBQzJMLFVBQUYsR0FBZTdMLENBQWYsRUFBa0JFLENBQUMsQ0FBQzRMLFFBQUYsR0FBYTdMLENBQS9CLEVBQWtDQyxDQUF6QztBQUNILE9BOUhMO0FBQUEsVUErSEkrRCxDQUFDLEdBQUduQyxNQUFNLENBQUNpSyxxQkFBUCxJQUFnQ2pLLE1BQU0sQ0FBQ2tLLDJCQUF2QyxJQUFzRWxLLE1BQU0sQ0FBQ21LLHdCQUE3RSxJQUF5R25LLE1BQU0sQ0FBQ29LLHVCQUFoSCxJQUEySSxVQUFVbE0sQ0FBVixFQUFhO0FBQ3hKLGVBQU9tTSxVQUFVLENBQUNuTSxDQUFELEVBQUksTUFBTSxFQUFWLENBQWpCO0FBQ0gsT0FqSUw7QUFBQSxVQWlJT2tFLENBQUMsR0FBRyxTQUFKQSxDQUFJLENBQVVqRSxDQUFWLEVBQWE7QUFDaEIsY0FBTUQsQ0FBQyxDQUFDK0csTUFBUixJQUFrQjlDLENBQUMsQ0FBQ21JLENBQUQsQ0FBbkIsRUFBd0JwTSxDQUFDLENBQUMwSCxJQUFGLENBQU96SCxDQUFQLENBQXhCO0FBQ0gsT0FuSUw7QUFBQSxVQW1JT21NLENBQUMsR0FBRyxTQUFKQSxDQUFJLENBQVVuTSxDQUFWLEVBQWE7QUFDaEIsYUFBSyxJQUFJTyxDQUFDLEdBQUdSLENBQUMsQ0FBQytHLE1BQVYsRUFBa0JyRyxDQUFDLEdBQUcsQ0FBM0IsRUFBOEJBLENBQUMsR0FBR0YsQ0FBbEMsRUFBcUMsRUFBRUUsQ0FBdkM7QUFBMENWLFVBQUFBLENBQUMsQ0FBQ1UsQ0FBRCxDQUFELENBQUtULENBQUw7QUFBMUM7O0FBQ0FELFFBQUFBLENBQUMsQ0FBQ2lMLE1BQUYsQ0FBUyxDQUFULEVBQVl6SyxDQUFaO0FBQ0EsWUFBSUksQ0FBQyxHQUFHVixDQUFDLENBQUNpTCxNQUFGLENBQVMsVUFBVW5MLENBQVYsRUFBYTtBQUMxQixpQkFBT0EsQ0FBQyxDQUFDLENBQUQsQ0FBRCxDQUFLb0ssU0FBTCxFQUFQO0FBQ0gsU0FGTyxDQUFSO0FBR0E3SixRQUFBQSxDQUFDLEdBQUdBLENBQUMsQ0FBQzRLLE1BQUYsQ0FBUyxVQUFVbkwsQ0FBVixFQUFhO0FBQ3RCLGVBQUssSUFBSUMsQ0FBQyxHQUFHLENBQVIsRUFBV0MsQ0FBQyxHQUFHVSxDQUFDLENBQUNtRyxNQUF0QixFQUE4QjlHLENBQUMsR0FBR0MsQ0FBbEMsRUFBcUMsRUFBRUQsQ0FBdkM7QUFBMEMsZ0JBQUlELENBQUMsQ0FBQyxDQUFELENBQUQsS0FBU1ksQ0FBQyxDQUFDWCxDQUFELENBQUQsQ0FBSyxDQUFMLENBQWIsRUFBc0IsT0FBTyxDQUFDLENBQVI7QUFBaEU7O0FBQ0EsaUJBQU8sQ0FBQyxDQUFSO0FBQ0gsU0FIRyxDQUFKLEVBR0lNLENBQUMsR0FBR0EsQ0FBQyxDQUFDd0ssTUFBRixDQUFTbkssQ0FBVCxDQUhSLEVBR3FCVixDQUFDLEdBQUdBLENBQUMsQ0FBQ2lMLE1BQUYsQ0FBUyxVQUFVbkwsQ0FBVixFQUFhO0FBQzNDLGlCQUFPLENBQUNBLENBQUMsQ0FBQyxDQUFELENBQUQsQ0FBS29LLFNBQUwsRUFBUjtBQUNILFNBRndCLENBSHpCLEVBS0ksTUFBTXBLLENBQUMsQ0FBQytHLE1BQVIsSUFBa0I5QyxDQUFDLENBQUNtSSxDQUFELENBTHZCO0FBTUgsT0EvSUw7QUFBQSxVQStJTzVCLENBQUMsR0FBRyxTQUFKQSxDQUFJLENBQVV4SyxDQUFWLEVBQWE7QUFDaEIsWUFBSUUsQ0FBQyxHQUFHRixDQUFDLENBQUM2TCxVQUFWO0FBQUEsWUFBc0J0TCxDQUFDLEdBQUdQLENBQUMsQ0FBQzhMLFFBQTVCO0FBQUEsWUFBc0N0TCxDQUFDLEdBQUdrTCxDQUFDLENBQUMxTCxDQUFDLENBQUNxTSxRQUFILEVBQWEsR0FBYixDQUEzQztBQUFBLFlBQThEM0wsQ0FBQyxHQUFHZ0wsQ0FBQyxDQUFDMUwsQ0FBQyxDQUFDMkosS0FBSCxFQUFVLENBQVYsQ0FBbkU7QUFBQSxZQUFpRi9JLENBQUMsR0FBR1osQ0FBQyxDQUFDc00sV0FBdkY7QUFBQSxZQUNJckwsQ0FBQyxHQUFHc0wsQ0FBQyxDQUFDYixDQUFDLENBQUMxTCxDQUFDLENBQUNnSyxNQUFILEVBQVcsUUFBWCxDQUFGLEVBQXdCaEssQ0FBeEIsQ0FEVDtBQUFBLFlBQ3FDa0IsQ0FBQyxHQUFHLE1BQU1WLENBQU4sR0FBVUQsQ0FBQyxDQUFDaU0sS0FBRixFQUFWLEdBQXNCdE0sQ0FBQyxDQUFDc00sS0FBRixFQUQvRDtBQUVBeE0sUUFBQUEsQ0FBQyxDQUFDeU0sZUFBRjtBQUNBdkwsUUFBQUEsQ0FBQyxDQUFDdUwsZUFBRixHQUFvQnpNLENBQUMsQ0FBQ3lNLGVBQXRCO0FBQ0EsWUFBSXJMLENBQUo7QUFBQSxZQUFPQyxDQUFQO0FBQUEsWUFBVThDLENBQUMsR0FBRyxDQUFkO0FBQUEsWUFBaUJDLENBQUMsR0FBRyxDQUFyQjtBQUFBLFlBQXdCQyxDQUFDLEdBQUcsQ0FBQyxDQUE3QjtBQUFBLFlBQWdDQyxDQUFDLEdBQUcsQ0FBQyxDQUFyQztBQUFBLFlBQXdDQyxDQUFDLEdBQUd2RSxDQUFDLENBQUMwSyxNQUE5QztBQUFBLFlBQXNEbEcsQ0FBQyxHQUFHLENBQTFEO0FBQUEsWUFBNkRDLENBQUMsR0FBRy9ELENBQUMsR0FBR0YsQ0FBckU7QUFDQSxlQUFPYSxDQUFDLEdBQUdyQixDQUFDLENBQUMrSixXQUFGLEdBQWdCMkMsQ0FBQyxDQUFDMU0sQ0FBQyxDQUFDK0osV0FBSCxFQUFnQjdKLENBQWhCLEVBQW1CSyxDQUFuQixFQUFzQlcsQ0FBdEIsQ0FBakIsR0FBNEN5TCxDQUFDLENBQUN6TSxDQUFELEVBQUlLLENBQUosRUFBT1csQ0FBUCxDQUFqRCxFQUE0RDtBQUMvRDRKLFVBQUFBLElBQUksRUFBRSxnQkFBWTtBQUNkekcsWUFBQUEsQ0FBQyxHQUFHLENBQUMsQ0FBTDtBQUNILFdBSDhEO0FBRzVEOEYsVUFBQUEsU0FBUyxFQUFFLHFCQUFZO0FBQ3RCLG1CQUFPOUYsQ0FBUDtBQUNILFdBTDhEO0FBSzVEa0YsVUFBQUEsTUFBTSxFQUFFLGdCQUFVdkosQ0FBVixFQUFhO0FBQ3BCdUUsWUFBQUEsQ0FBQyxHQUFHLENBQUMsQ0FBTDtBQUNBLGdCQUFJdEUsQ0FBQyxHQUFHTyxDQUFDLEdBQUdnRSxDQUFaO0FBQ0FMLFlBQUFBLENBQUMsR0FBR0MsQ0FBQyxHQUFHbkUsQ0FBUixFQUFXbUIsQ0FBQyxHQUFHcEIsQ0FBZixFQUFrQmlCLENBQUMsQ0FBQzJMLFNBQUYsR0FBY3BJLENBQWhDO0FBQ0gsV0FUOEQ7QUFTNURnRixVQUFBQSxRQUFRLEVBQUUsa0JBQVV4SixDQUFWLEVBQWE7QUFDdEJ1RSxZQUFBQSxDQUFDLEdBQUcsQ0FBQyxDQUFMLEVBQVFsRCxDQUFDLENBQUN3TCxVQUFGLEVBQVI7QUFDQSxnQkFBSTVNLENBQUMsR0FBR08sQ0FBQyxJQUFJLElBQUlnRSxDQUFSLENBQVQ7QUFDQUwsWUFBQUEsQ0FBQyxHQUFHQyxDQUFDLEdBQUduRSxDQUFSLEVBQVdtQixDQUFDLEdBQUdwQixDQUFmLEVBQWtCaUIsQ0FBQyxDQUFDMkwsU0FBRixHQUFjcEksQ0FBaEM7QUFDSCxXQWI4RDtBQWE1RDhGLFVBQUFBLE9BQU8sRUFBRSxtQkFBWTtBQUNwQm5HLFlBQUFBLENBQUMsR0FBR2xFLENBQUosRUFBT2dCLENBQUMsQ0FBQzJMLFNBQUYsQ0FBWSxDQUFaLENBQVA7QUFDSCxXQWY4RDtBQWU1RDNDLFVBQUFBLElBQUksRUFBRSxjQUFVakssQ0FBVixFQUFhO0FBQ2xCLGdCQUFJLENBQUNxRSxDQUFMLEVBQVE7QUFDSixrQkFBSUUsQ0FBSixFQUFPLE9BQU9ILENBQUMsR0FBR3BFLENBQUosRUFBTyxLQUFLLEtBQUs4TSxzQkFBTCxFQUFuQjs7QUFDUCxrQkFBSTNJLENBQUMsS0FBS0EsQ0FBQyxHQUFHbkUsQ0FBVCxDQUFELEVBQWNBLENBQUMsR0FBR21FLENBQUosR0FBUXpELENBQTFCLEVBQTZCO0FBQ3pCNEQsZ0JBQUFBLENBQUMsR0FBRyxDQUFDLENBQUwsRUFBUUYsQ0FBQyxHQUFHcEUsQ0FBQyxHQUFHVSxDQUFoQjtBQUNBLG9CQUFJVCxDQUFDLEdBQUdZLElBQUksQ0FBQ0UsR0FBTCxDQUFTRixJQUFJLENBQUNDLEdBQUwsQ0FBUyxDQUFULEVBQVlzRCxDQUFDLEdBQUdELENBQWhCLENBQVQsRUFBNkIzRCxDQUE3QixDQUFSO0FBQ0FTLGdCQUFBQSxDQUFDLENBQUNnSixJQUFGLENBQU9oSyxDQUFDLEdBQUdPLENBQVgsR0FBZSxLQUFLc00sc0JBQUwsRUFBZixFQUE4QyxLQUFLMUMsU0FBTCxNQUFvQmhKLENBQXBCLElBQXlCQSxDQUFDLEVBQXhFO0FBQ0g7QUFDSjtBQUNKLFdBeEI4RDtBQXdCNUQ4SixVQUFBQSxlQUFlLEVBQUUsMkJBQVk7QUFDNUIsbUJBQU9oSyxDQUFQO0FBQ0gsV0ExQjhEO0FBMEI1RG9JLFVBQUFBLFFBQVEsRUFBRSxrQkFBVXRKLENBQVYsRUFBYTtBQUN0QnNFLFlBQUFBLENBQUMsR0FBRyxDQUFDLENBQUwsRUFBUUUsQ0FBQyxHQUFHM0QsSUFBSSxDQUFDRSxHQUFMLENBQVNGLElBQUksQ0FBQ0MsR0FBTCxDQUFTZCxDQUFULEVBQVksSUFBWixDQUFULEVBQTRCLElBQUl5RSxDQUFoQyxDQUFaO0FBQ0gsV0E1QjhEO0FBNEI1RHFJLFVBQUFBLHNCQUFzQixFQUFFLGtDQUFZO0FBQ25DLGdCQUFJOU0sQ0FBQyxHQUFHaUIsQ0FBQyxDQUFDNEcsUUFBRixFQUFSOztBQUNBLGdCQUFJdEQsQ0FBSixFQUFPO0FBQ0gsa0JBQUl0RSxDQUFDLEdBQUdZLElBQUksQ0FBQ0MsR0FBTCxDQUFTLElBQVQsRUFBZTBELENBQUMsR0FBR0MsQ0FBbkIsQ0FBUjtBQUNBeEQsY0FBQUEsQ0FBQyxDQUFDZ0osSUFBRixDQUFPaEssQ0FBUCxHQUFXRCxDQUFDLEdBQUdpQixDQUFDLENBQUM0RyxRQUFGLEVBQWY7QUFDSDs7QUFDRHhHLFlBQUFBLENBQUMsQ0FBQzBMLEtBQUYsQ0FBUS9NLENBQVI7QUFDSCxXQW5DOEQ7QUFtQzVEb0ssVUFBQUEsU0FBUyxFQUFFLHFCQUFZO0FBQ3RCLG1CQUFPLENBQUMsQ0FBQy9GLENBQUYsSUFBTyxNQUFNRixDQUFOLElBQVdsRCxDQUFDLENBQUNtSixTQUFGLEVBQXpCO0FBQ0gsV0FyQzhEO0FBcUM1REYsVUFBQUEsYUFBYSxFQUFFLHVCQUFVbEssQ0FBVixFQUFhQyxDQUFiLEVBQWdCO0FBQzlCLGdCQUFJcUUsQ0FBQyxJQUFJckUsQ0FBVCxFQUFZO0FBQ1Isa0JBQUlDLENBQUMsR0FBR21CLENBQUMsQ0FBQzJMLFFBQUYsRUFBUjtBQUFBLGtCQUFzQnpNLENBQUMsR0FBR2MsQ0FBQyxDQUFDNEwsYUFBRixFQUExQjtBQUNBQyxjQUFBQSxDQUFDLENBQUNsTixDQUFELEVBQUlFLENBQUosRUFBT1UsQ0FBUCxDQUFELEVBQVl1TSxDQUFDLENBQUNuTixDQUFELEVBQUlPLENBQUosQ0FBYjtBQUNIO0FBQ0o7QUExQzhELFNBQW5FO0FBNENILE9Bak1MO0FBQUEsVUFpTU9zSyxDQUFDLEdBQUcsU0FBSkEsQ0FBSSxDQUFVN0ssQ0FBVixFQUFhO0FBQ2hCLFlBQUlFLENBQUMsR0FBR0YsQ0FBQyxDQUFDNEssUUFBVjtBQUNBNUssUUFBQUEsQ0FBQyxDQUFDb04sZUFBRixHQUFvQixFQUFwQixFQUF3QnBOLENBQUMsQ0FBQ3FOLG1CQUFGLEdBQXdCLENBQWhEO0FBQ0EsWUFBSTlNLENBQUMsR0FBRytNLENBQUMsQ0FBQ3ROLENBQUQsQ0FBVDtBQUFBLFlBQWNRLENBQUMsR0FBRyxDQUFDLENBQW5CO0FBQUEsWUFBc0JFLENBQUMsR0FBR1IsQ0FBQyxDQUFDb0wsUUFBNUI7QUFBQSxZQUFzQzFLLENBQUMsR0FBR1YsQ0FBQyxDQUFDcUwsUUFBNUM7QUFBQSxZQUFzRHRLLENBQUMsR0FBR2YsQ0FBQyxDQUFDc0wsWUFBNUQ7QUFBQSxZQUEwRXRLLENBQUMsR0FBR2hCLENBQUMsQ0FBQ29DLEtBQWhGO0FBQUEsWUFBdUZsQixDQUFDLEdBQUdsQixDQUFDLENBQUN1TCxJQUE3RjtBQUFBLFlBQ0lwSyxDQUFDLEdBQUdzSixDQUFDLENBQUM7QUFDRlcsVUFBQUEsUUFBUSxFQUFFNUssQ0FBQyxHQUFHLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLENBQUgsR0FBZVQsQ0FEeEI7QUFFRnNMLFVBQUFBLFFBQVEsRUFBRTNLLENBQUMsR0FBRyxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxDQUFILEdBQWVYLENBRnhCO0FBR0Z1TCxVQUFBQSxZQUFZLEVBQUV2SyxDQUFDLEdBQUcsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsQ0FBSCxHQUFlaEIsQ0FINUI7QUFJRnFDLFVBQUFBLEtBQUssRUFBRXBCLENBQUMsR0FBRyxDQUFDLENBQUQsRUFBSSxDQUFKLENBQUgsR0FBWWpCLENBSmxCO0FBS0Z3TCxVQUFBQSxJQUFJLEVBQUVySyxDQUFDLEdBQUcsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUFILEdBQVluQjtBQUxqQixTQUFELENBRFQ7QUFRQSxlQUFPO0FBQ0g2SyxVQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZHRLLFlBQUFBLENBQUMsR0FBRyxDQUFDLENBQUw7QUFDSCxXQUhFO0FBR0EySixVQUFBQSxTQUFTLEVBQUUsbUJBQVVuSyxDQUFWLEVBQWE7QUFDdkIsbUJBQU9RLENBQVA7QUFDSCxXQUxFO0FBS0F5SixVQUFBQSxJQUFJLEVBQUUsY0FBVWpLLENBQVYsRUFBYTtBQUNsQlEsWUFBQUEsQ0FBQyxJQUFJRCxDQUFDLENBQUNnTixXQUFQLEtBQXVCaE4sQ0FBQyxDQUFDMEosSUFBRixJQUFVLEtBQUt1RCxjQUFMLEVBQWpDO0FBQ0gsV0FQRTtBQU9BQSxVQUFBQSxjQUFjLEVBQUUsMEJBQVk7QUFDM0IsZ0JBQUl4TixDQUFDLEdBQUdPLENBQUMsQ0FBQ3NILFFBQUYsRUFBUjtBQUNBbkgsWUFBQUEsQ0FBQyxLQUFLVyxDQUFDLENBQUNpSyxRQUFGLENBQVcsQ0FBWCxJQUFnQnBMLENBQUMsQ0FBQ29MLFFBQUYsQ0FBVyxDQUFYLElBQWdCdEwsQ0FBaEMsRUFBbUNxQixDQUFDLENBQUNpSyxRQUFGLENBQVcsQ0FBWCxJQUFnQnBMLENBQUMsQ0FBQ29MLFFBQUYsQ0FBVyxDQUFYLElBQWdCdEwsQ0FBbkUsRUFBc0VxQixDQUFDLENBQUNpSyxRQUFGLENBQVcsQ0FBWCxJQUFnQnBMLENBQUMsQ0FBQ29MLFFBQUYsQ0FBVyxDQUFYLElBQWdCdEwsQ0FBM0csQ0FBRCxFQUFnSFksQ0FBQyxLQUFLUyxDQUFDLENBQUNrSyxRQUFGLENBQVcsQ0FBWCxJQUFnQnJMLENBQUMsQ0FBQ3FMLFFBQUYsQ0FBVyxDQUFYLElBQWdCdkwsQ0FBaEMsRUFBbUNxQixDQUFDLENBQUNrSyxRQUFGLENBQVcsQ0FBWCxJQUFnQnJMLENBQUMsQ0FBQ3FMLFFBQUYsQ0FBVyxDQUFYLElBQWdCdkwsQ0FBbkUsRUFBc0VxQixDQUFDLENBQUNrSyxRQUFGLENBQVcsQ0FBWCxJQUFnQnJMLENBQUMsQ0FBQ3FMLFFBQUYsQ0FBVyxDQUFYLElBQWdCdkwsQ0FBM0csQ0FBakgsRUFBZ09pQixDQUFDLEtBQUtJLENBQUMsQ0FBQ21LLFlBQUYsQ0FBZSxDQUFmLElBQW9CdEwsQ0FBQyxDQUFDc0wsWUFBRixDQUFlLENBQWYsSUFBb0J4TCxDQUF4QyxFQUEyQ3FCLENBQUMsQ0FBQ21LLFlBQUYsQ0FBZSxDQUFmLElBQW9CdEwsQ0FBQyxDQUFDc0wsWUFBRixDQUFlLENBQWYsSUFBb0J4TCxDQUFuRixFQUFzRnFCLENBQUMsQ0FBQ21LLFlBQUYsQ0FBZSxDQUFmLElBQW9CdEwsQ0FBQyxDQUFDc0wsWUFBRixDQUFlLENBQWYsSUFBb0J4TCxDQUFuSSxDQUFqTyxFQUF3V2tCLENBQUMsS0FBS0csQ0FBQyxDQUFDaUIsS0FBRixDQUFRLENBQVIsSUFBYSxJQUFJcEMsQ0FBQyxDQUFDb0MsS0FBRixDQUFRLENBQVIsSUFBYXRDLENBQTlCLEVBQWlDcUIsQ0FBQyxDQUFDaUIsS0FBRixDQUFRLENBQVIsSUFBYSxJQUFJcEMsQ0FBQyxDQUFDb0MsS0FBRixDQUFRLENBQVIsSUFBYXRDLENBQXBFLENBQXpXLEVBQWlib0IsQ0FBQyxLQUFLQyxDQUFDLENBQUNvSyxJQUFGLENBQU8sQ0FBUCxJQUFZdkwsQ0FBQyxDQUFDdUwsSUFBRixDQUFPLENBQVAsSUFBWXpMLENBQXhCLEVBQTJCcUIsQ0FBQyxDQUFDb0ssSUFBRixDQUFPLENBQVAsSUFBWXZMLENBQUMsQ0FBQ3VMLElBQUYsQ0FBTyxDQUFQLElBQVl6TCxDQUF4RCxDQUFsYjtBQUNILFdBVkU7QUFVQWtLLFVBQUFBLGFBQWEsRUFBRSx1QkFBVWxLLENBQVYsRUFBYTtBQUMzQmtOLFlBQUFBLENBQUMsQ0FBQ2xOLENBQUQsRUFBSXFCLENBQUMsQ0FBQzJMLFFBQUYsRUFBSixDQUFELEVBQW9CRyxDQUFDLENBQUNuTixDQUFELEVBQUlxQixDQUFDLENBQUM0TCxhQUFGLEVBQUosQ0FBckI7QUFDSCxXQVpFO0FBWUEvQixVQUFBQSxlQUFlLEVBQUUsMkJBQVk7QUFDNUIsbUJBQU83SixDQUFQO0FBQ0gsV0FkRTtBQWNBK0ksVUFBQUEsU0FBUyxFQUFFLHFCQUFZO0FBQ3RCLG1CQUFPN0osQ0FBQyxDQUFDZ04sV0FBRixJQUFpQi9NLENBQXhCO0FBQ0gsV0FoQkU7QUFnQkE4SixVQUFBQSxPQUFPLEVBQUUsbUJBQVk7QUFDcEIvSixZQUFBQSxDQUFDLEdBQUcrTSxDQUFDLENBQUN0TixDQUFELENBQUw7QUFDSDtBQWxCRSxTQUFQO0FBb0JILE9BaE9MO0FBQUEsVUFnT095TixDQUFDLEdBQUcsU0FBSkEsQ0FBSSxDQUFVek4sQ0FBVixFQUFhO0FBQ2hCLGVBQU9BLENBQVA7QUFDSCxPQWxPTDtBQUFBLFVBa09PME4sQ0FBQyxHQUFHLFNBQUpBLENBQUksQ0FBVTFOLENBQVYsRUFBYTtBQUNoQixlQUFPLENBQUNhLElBQUksQ0FBQzhNLEdBQUwsQ0FBUzNOLENBQUMsR0FBR2EsSUFBSSxDQUFDaUYsRUFBVCxHQUFjakYsSUFBSSxDQUFDaUYsRUFBNUIsSUFBa0MsQ0FBbkMsSUFBd0MsQ0FBL0M7QUFDSCxPQXBPTDtBQUFBLFVBb09POEgsQ0FBQyxHQUFHLFNBQUpBLENBQUksQ0FBVTVOLENBQVYsRUFBYTtBQUNoQixlQUFPQSxDQUFDLEdBQUdBLENBQVg7QUFDSCxPQXRPTDtBQUFBLFVBc09PNk4sQ0FBQyxHQUFHLFNBQUpBLENBQUksQ0FBVTdOLENBQVYsRUFBYTtBQUNoQixlQUFPLENBQUNhLElBQUksQ0FBQ2lOLEdBQUwsQ0FBUzlOLENBQUMsR0FBRyxDQUFiLEVBQWdCLENBQWhCLENBQUQsR0FBc0IsQ0FBN0I7QUFDSCxPQXhPTDtBQUFBLFVBd09Pc04sQ0FBQyxHQUFHLFNBQUpBLENBQUksQ0FBVXROLENBQVYsRUFBYTtBQUNoQixZQUFJQyxDQUFDLEdBQUd5TCxDQUFDLENBQUMxTCxDQUFDLENBQUMrTixhQUFILEVBQWtCLENBQWxCLENBQVQ7QUFBQSxZQUErQjdOLENBQUMsR0FBR3dMLENBQUMsQ0FBQzFMLENBQUMsQ0FBQ3FOLG1CQUFILEVBQXdCLENBQXhCLENBQXBDO0FBQUEsWUFBZ0U5TSxDQUFDLEdBQUdtTCxDQUFDLENBQUMxTCxDQUFDLENBQUNvTixlQUFILEVBQW9CLENBQXBCLENBQXJFO0FBQUEsWUFDSTVNLENBQUMsR0FBR2tMLENBQUMsQ0FBQzFMLENBQUMsQ0FBQ2dPLGNBQUgsRUFBbUIsRUFBbkIsQ0FEVDtBQUFBLFlBQ2lDdE4sQ0FBQyxHQUFHZ0wsQ0FBQyxDQUFDMUwsQ0FBQyxDQUFDaU8sa0JBQUgsRUFBdUIsRUFBdkIsQ0FEdEM7QUFBQSxZQUNrRXJOLENBQUMsR0FBRzhLLENBQUMsQ0FBQzFMLENBQUMsQ0FBQ2tPLFVBQUgsRUFBZSxFQUFmLENBRHZFO0FBQUEsWUFDMkZqTixDQUFDLEdBQUcsQ0FBQyxDQURoRztBQUVBLGVBQU87QUFDSGdKLFVBQUFBLElBQUksRUFBRSxjQUFVakssQ0FBVixFQUFhO0FBQ2YsZ0JBQUksTUFBTUEsQ0FBTixJQUFXLENBQUNpQixDQUFoQixFQUFtQjtBQUNmLGtCQUFJQyxDQUFDLEdBQUcsRUFBRWpCLENBQUMsR0FBR0MsQ0FBTixJQUFXTSxDQUFuQjtBQUFBLGtCQUFzQlksQ0FBQyxHQUFHRixDQUFDLEdBQUdOLENBQTlCO0FBQ0FMLGNBQUFBLENBQUMsSUFBSWEsQ0FBTCxFQUFRbkIsQ0FBQyxJQUFJTSxDQUFiLEVBQWdCQSxDQUFDLElBQUlHLENBQXJCLEVBQXdCRyxJQUFJLENBQUNzTixHQUFMLENBQVNsTyxDQUFDLEdBQUdDLENBQWIsSUFBa0IsSUFBbEIsSUFBMEJXLElBQUksQ0FBQ3NOLEdBQUwsQ0FBUzVOLENBQVQsSUFBYyxJQUF4QyxLQUFpRFUsQ0FBQyxHQUFHLENBQUMsQ0FBdEQsQ0FBeEI7QUFDSDtBQUNKLFdBTkU7QUFNQTJMLFVBQUFBLFNBQVMsRUFBRSxtQkFBVTVNLENBQVYsRUFBYTtBQUN2QkMsWUFBQUEsQ0FBQyxHQUFHRCxDQUFKLEVBQU9PLENBQUMsR0FBRyxDQUFYO0FBQ0gsV0FSRTtBQVFBc0gsVUFBQUEsUUFBUSxFQUFFLG9CQUFZO0FBQ3JCLG1CQUFPNUcsQ0FBQyxHQUFHZixDQUFILEdBQU9ELENBQWY7QUFDSCxXQVZFO0FBVUFtSyxVQUFBQSxTQUFTLEVBQUUscUJBQVk7QUFDdEIsbUJBQU9uSixDQUFQO0FBQ0g7QUFaRSxTQUFQO0FBY0gsT0F6UEw7QUFBQSxVQXlQT21OLENBQUMsR0FBRztBQUFDQyxRQUFBQSxNQUFNLEVBQUVaLENBQVQ7QUFBWWEsUUFBQUEsSUFBSSxFQUFFWixDQUFsQjtBQUFxQmEsUUFBQUEsTUFBTSxFQUFFWCxDQUE3QjtBQUFnQ1ksUUFBQUEsT0FBTyxFQUFFWDtBQUF6QyxPQXpQWDtBQUFBLFVBeVB3RHRCLENBQUMsR0FBRyxTQUFKQSxDQUFJLENBQVV2TSxDQUFWLEVBQWFDLENBQWIsRUFBZ0I7QUFDcEUsWUFBSSxZQUFZRCxDQUFoQixFQUFtQixPQUFPc04sQ0FBQyxDQUFDck4sQ0FBRCxDQUFSO0FBQ25CLFlBQUlDLENBQUMsR0FBR0YsQ0FBUjtBQUNBMEosUUFBQUEsQ0FBQyxDQUFDMUosQ0FBRCxDQUFELEtBQVNFLENBQUMsR0FBR2tPLENBQUMsQ0FBQ3BPLENBQUQsQ0FBZDtBQUNBLFlBQUlPLENBQUo7QUFBQSxZQUFPQyxDQUFDLEdBQUdOLENBQVg7QUFBQSxZQUFjUSxDQUFDLEdBQUcsQ0FBbEI7QUFDQSxlQUFPO0FBQ0h1SixVQUFBQSxJQUFJLEVBQUUsY0FBVWpLLENBQVYsRUFBYTtBQUNmVSxZQUFBQSxDQUFDLEdBQUdGLENBQUMsQ0FBQ1IsQ0FBRCxDQUFMLEVBQVVPLENBQUMsR0FBR1AsQ0FBZDtBQUNILFdBSEU7QUFHQTRNLFVBQUFBLFNBQVMsRUFBRSxtQkFBVTVNLENBQVYsRUFBYTtBQUN2Qk8sWUFBQUEsQ0FBQyxHQUFHLENBQUo7QUFDSCxXQUxFO0FBS0FzSCxVQUFBQSxRQUFRLEVBQUUsb0JBQVk7QUFDckIsbUJBQU9uSCxDQUFQO0FBQ0gsV0FQRTtBQU9BMEosVUFBQUEsU0FBUyxFQUFFLHFCQUFZO0FBQ3RCLG1CQUFPN0osQ0FBQyxJQUFJLENBQUwsSUFBVUEsQ0FBakI7QUFDSDtBQVRFLFNBQVA7QUFXSCxPQXpRTDtBQUFBLFVBeVFPa08sQ0FBQyxHQUFHLFNBQUpBLENBQUksQ0FBVXpPLENBQVYsRUFBYUMsQ0FBYixFQUFnQkMsQ0FBaEIsRUFBbUJLLENBQW5CLEVBQXNCO0FBQ3pCUCxRQUFBQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBUCxFQUFVQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBakIsRUFBb0JBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUEzQixFQUE4QkEsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQXJDLEVBQXdDQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBL0MsRUFBa0RBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUF6RCxFQUE0REEsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQW5FLEVBQXNFQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBN0UsRUFBZ0ZBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUF2RixFQUEwRkEsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQWpHLEVBQW9HQSxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVEsQ0FBNUcsRUFBK0dBLENBQUMsQ0FBQyxFQUFELENBQUQsR0FBUSxDQUF2SCxFQUEwSEEsQ0FBQyxDQUFDLEVBQUQsQ0FBRCxHQUFRQyxDQUFsSSxFQUFxSUQsQ0FBQyxDQUFDLEVBQUQsQ0FBRCxHQUFRRSxDQUE3SSxFQUFnSkYsQ0FBQyxDQUFDLEVBQUQsQ0FBRCxHQUFRTyxDQUF4SixFQUEySlAsQ0FBQyxDQUFDLEVBQUQsQ0FBRCxHQUFRLENBQW5LO0FBQ0gsT0EzUUw7QUFBQSxVQTJRTzBPLENBQUMsR0FBRyxTQUFKQSxDQUFJLENBQVUxTyxDQUFWLEVBQWFDLENBQWIsRUFBZ0I7QUFDbkJELFFBQUFBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUFQLEVBQVVBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUFqQixFQUFvQkEsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQTNCLEVBQThCQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBckMsRUFBd0NBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUEvQyxFQUFrREEsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPYSxJQUFJLENBQUM4TSxHQUFMLENBQVMxTixDQUFULENBQXpELEVBQXNFRCxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBQ2EsSUFBSSxDQUFDOE4sR0FBTCxDQUFTMU8sQ0FBVCxDQUE5RSxFQUEyRkQsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQWxHLEVBQXFHQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBNUcsRUFBK0dBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT2EsSUFBSSxDQUFDOE4sR0FBTCxDQUFTMU8sQ0FBVCxDQUF0SCxFQUFtSUQsQ0FBQyxDQUFDLEVBQUQsQ0FBRCxHQUFRYSxJQUFJLENBQUM4TSxHQUFMLENBQVMxTixDQUFULENBQTNJLEVBQXdKRCxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVEsQ0FBaEssRUFBbUtBLENBQUMsQ0FBQyxFQUFELENBQUQsR0FBUSxDQUEzSyxFQUE4S0EsQ0FBQyxDQUFDLEVBQUQsQ0FBRCxHQUFRLENBQXRMLEVBQXlMQSxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVEsQ0FBak0sRUFBb01BLENBQUMsQ0FBQyxFQUFELENBQUQsR0FBUSxDQUE1TTtBQUNILE9BN1FMO0FBQUEsVUE2UU80TyxDQUFDLEdBQUcsU0FBSkEsQ0FBSSxDQUFVNU8sQ0FBVixFQUFhQyxDQUFiLEVBQWdCO0FBQ25CRCxRQUFBQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU9hLElBQUksQ0FBQzhNLEdBQUwsQ0FBUzFOLENBQVQsQ0FBUCxFQUFvQkQsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQTNCLEVBQThCQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU9hLElBQUksQ0FBQzhOLEdBQUwsQ0FBUzFPLENBQVQsQ0FBckMsRUFBa0RELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUF6RCxFQUE0REEsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQW5FLEVBQXNFQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBN0UsRUFBZ0ZBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUF2RixFQUEwRkEsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQWpHLEVBQW9HQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBQ2EsSUFBSSxDQUFDOE4sR0FBTCxDQUFTMU8sQ0FBVCxDQUE1RyxFQUF5SEQsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQWhJLEVBQW1JQSxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVFhLElBQUksQ0FBQzhNLEdBQUwsQ0FBUzFOLENBQVQsQ0FBM0ksRUFBd0pELENBQUMsQ0FBQyxFQUFELENBQUQsR0FBUSxDQUFoSyxFQUFtS0EsQ0FBQyxDQUFDLEVBQUQsQ0FBRCxHQUFRLENBQTNLLEVBQThLQSxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVEsQ0FBdEwsRUFBeUxBLENBQUMsQ0FBQyxFQUFELENBQUQsR0FBUSxDQUFqTSxFQUFvTUEsQ0FBQyxDQUFDLEVBQUQsQ0FBRCxHQUFRLENBQTVNO0FBQ0gsT0EvUUw7QUFBQSxVQStRTzZPLENBQUMsR0FBRyxTQUFKQSxDQUFJLENBQVU3TyxDQUFWLEVBQWFDLENBQWIsRUFBZ0I7QUFDbkJELFFBQUFBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT2EsSUFBSSxDQUFDOE0sR0FBTCxDQUFTMU4sQ0FBVCxDQUFQLEVBQW9CRCxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBQ2EsSUFBSSxDQUFDOE4sR0FBTCxDQUFTMU8sQ0FBVCxDQUE1QixFQUF5Q0QsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQWhELEVBQW1EQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBMUQsRUFBNkRBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT2EsSUFBSSxDQUFDOE4sR0FBTCxDQUFTMU8sQ0FBVCxDQUFwRSxFQUFpRkQsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPYSxJQUFJLENBQUM4TSxHQUFMLENBQVMxTixDQUFULENBQXhGLEVBQXFHRCxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBNUcsRUFBK0dBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUF0SCxFQUF5SEEsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQWhJLEVBQW1JQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBMUksRUFBNklBLENBQUMsQ0FBQyxFQUFELENBQUQsR0FBUSxDQUFySixFQUF3SkEsQ0FBQyxDQUFDLEVBQUQsQ0FBRCxHQUFRLENBQWhLLEVBQW1LQSxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVEsQ0FBM0ssRUFBOEtBLENBQUMsQ0FBQyxFQUFELENBQUQsR0FBUSxDQUF0TCxFQUF5TEEsQ0FBQyxDQUFDLEVBQUQsQ0FBRCxHQUFRLENBQWpNLEVBQW9NQSxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVEsQ0FBNU07QUFDSCxPQWpSTDtBQUFBLFVBaVJPOE8sQ0FBQyxHQUFHLFNBQUpBLENBQUksQ0FBVTlPLENBQVYsRUFBYUMsQ0FBYixFQUFnQkMsQ0FBaEIsRUFBbUI7QUFDdEJGLFFBQUFBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUFQLEVBQVVBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT2EsSUFBSSxDQUFDa08sR0FBTCxDQUFTOU8sQ0FBVCxDQUFqQixFQUE4QkQsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQXJDLEVBQXdDQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBL0MsRUFBa0RBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT2EsSUFBSSxDQUFDa08sR0FBTCxDQUFTN08sQ0FBVCxDQUF6RCxFQUFzRUYsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQTdFLEVBQWdGQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBdkYsRUFBMEZBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUFqRyxFQUFvR0EsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQTNHLEVBQThHQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBckgsRUFBd0hBLENBQUMsQ0FBQyxFQUFELENBQUQsR0FBUSxDQUFoSSxFQUFtSUEsQ0FBQyxDQUFDLEVBQUQsQ0FBRCxHQUFRLENBQTNJLEVBQThJQSxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVEsQ0FBdEosRUFBeUpBLENBQUMsQ0FBQyxFQUFELENBQUQsR0FBUSxDQUFqSyxFQUFvS0EsQ0FBQyxDQUFDLEVBQUQsQ0FBRCxHQUFRLENBQTVLLEVBQStLQSxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVEsQ0FBdkw7QUFDSCxPQW5STDtBQUFBLFVBbVJPZ1AsQ0FBQyxHQUFHLFNBQUpBLENBQUksQ0FBVWhQLENBQVYsRUFBYUMsQ0FBYixFQUFnQkMsQ0FBaEIsRUFBbUI7QUFDdEJGLFFBQUFBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBUCxFQUFVRCxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBakIsRUFBb0JBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUEzQixFQUE4QkEsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQXJDLEVBQXdDQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBL0MsRUFBa0RBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0UsQ0FBekQsRUFBNERGLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUFuRSxFQUFzRUEsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQTdFLEVBQWdGQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBdkYsRUFBMEZBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUFqRyxFQUFvR0EsQ0FBQyxDQUFDLEVBQUQsQ0FBRCxHQUFRLENBQTVHLEVBQStHQSxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVEsQ0FBdkgsRUFBMEhBLENBQUMsQ0FBQyxFQUFELENBQUQsR0FBUSxDQUFsSSxFQUFxSUEsQ0FBQyxDQUFDLEVBQUQsQ0FBRCxHQUFRLENBQTdJLEVBQWdKQSxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVEsQ0FBeEosRUFBMkpBLENBQUMsQ0FBQyxFQUFELENBQUQsR0FBUSxDQUFuSztBQUNILE9BclJMO0FBQUEsVUFxUk9pUCxDQUFDLEdBQUcsU0FBSkEsQ0FBSSxDQUFValAsQ0FBVixFQUFhO0FBQ2hCQSxRQUFBQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBUCxFQUFVQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBakIsRUFBb0JBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUEzQixFQUE4QkEsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQXJDLEVBQXdDQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBL0MsRUFBa0RBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUF6RCxFQUE0REEsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQW5FLEVBQXNFQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sQ0FBN0UsRUFBZ0ZBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUF2RixFQUEwRkEsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLENBQWpHLEVBQW9HQSxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVEsQ0FBNUcsRUFBK0dBLENBQUMsQ0FBQyxFQUFELENBQUQsR0FBUSxDQUF2SCxFQUEwSEEsQ0FBQyxDQUFDLEVBQUQsQ0FBRCxHQUFRLENBQWxJLEVBQXFJQSxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVEsQ0FBN0ksRUFBZ0pBLENBQUMsQ0FBQyxFQUFELENBQUQsR0FBUSxDQUF4SixFQUEySkEsQ0FBQyxDQUFDLEVBQUQsQ0FBRCxHQUFRLENBQW5LO0FBQ0gsT0F2Ukw7QUFBQSxVQXVST2tQLENBQUMsR0FBRyxTQUFKQSxDQUFJLENBQVVsUCxDQUFWLEVBQWFDLENBQWIsRUFBZ0I7QUFDbkJBLFFBQUFBLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0QsQ0FBQyxDQUFDLENBQUQsQ0FBUixFQUFhQyxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU9ELENBQUMsQ0FBQyxDQUFELENBQXJCLEVBQTBCQyxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU9ELENBQUMsQ0FBQyxDQUFELENBQWxDLEVBQXVDQyxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU9ELENBQUMsQ0FBQyxDQUFELENBQS9DLEVBQW9EQyxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU9ELENBQUMsQ0FBQyxDQUFELENBQTVELEVBQWlFQyxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU9ELENBQUMsQ0FBQyxDQUFELENBQXpFLEVBQThFQyxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU9ELENBQUMsQ0FBQyxDQUFELENBQXRGLEVBQTJGQyxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU9ELENBQUMsQ0FBQyxDQUFELENBQW5HLEVBQXdHQyxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU9ELENBQUMsQ0FBQyxDQUFELENBQWhILEVBQXFIQyxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU9ELENBQUMsQ0FBQyxDQUFELENBQTdILEVBQWtJQyxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVFELENBQUMsQ0FBQyxFQUFELENBQTNJLEVBQWlKQyxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVFELENBQUMsQ0FBQyxFQUFELENBQTFKLEVBQWdLQyxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVFELENBQUMsQ0FBQyxFQUFELENBQXpLLEVBQStLQyxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVFELENBQUMsQ0FBQyxFQUFELENBQXhMLEVBQThMQyxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVFELENBQUMsQ0FBQyxFQUFELENBQXZNLEVBQTZNQyxDQUFDLENBQUMsRUFBRCxDQUFELEdBQVFELENBQUMsQ0FBQyxFQUFELENBQXROO0FBQ0gsT0F6Ukw7QUFBQSxVQXlST21QLENBQUMsR0FBRyxTQUFKQSxDQUFJLEdBQVk7QUFDZixZQUFJblAsQ0FBQyxHQUFHLElBQUlvUCxZQUFKLENBQWlCLEVBQWpCLENBQVI7QUFBQSxZQUE4Qm5QLENBQUMsR0FBRyxJQUFJbVAsWUFBSixDQUFpQixFQUFqQixDQUFsQztBQUFBLFlBQXdEbFAsQ0FBQyxHQUFHLElBQUlrUCxZQUFKLENBQWlCLEVBQWpCLENBQTVEO0FBQ0EsZUFBT0gsQ0FBQyxDQUFDalAsQ0FBRCxDQUFELEVBQU07QUFDVHFQLFVBQUFBLElBQUksRUFBRXJQLENBREc7QUFDQXNQLFVBQUFBLEtBQUssRUFBRSxpQkFBWTtBQUN4QixpQkFBSyxJQUFJclAsQ0FBQyxHQUFHLFdBQVIsRUFBcUJDLENBQUMsR0FBRyxDQUE5QixFQUFpQ0EsQ0FBQyxHQUFHLEVBQXJDLEVBQXlDLEVBQUVBLENBQTNDO0FBQThDRCxjQUFBQSxDQUFDLElBQUlZLElBQUksQ0FBQ3NOLEdBQUwsQ0FBU25PLENBQUMsQ0FBQ0UsQ0FBRCxDQUFWLElBQWlCLElBQWpCLEdBQXdCLElBQXhCLEdBQStCRixDQUFDLENBQUNFLENBQUQsQ0FBRCxDQUFLcVAsT0FBTCxDQUFhLEVBQWIsSUFBbUIsR0FBdkQ7QUFBOUM7O0FBQ0EsbUJBQU90UCxDQUFDLElBQUlZLElBQUksQ0FBQ3NOLEdBQUwsQ0FBU25PLENBQUMsQ0FBQyxFQUFELENBQVYsSUFBa0IsSUFBbEIsR0FBeUIsSUFBekIsR0FBZ0NBLENBQUMsQ0FBQyxFQUFELENBQUQsQ0FBTXVQLE9BQU4sQ0FBYyxFQUFkLElBQW9CLEdBQWhFO0FBQ0gsV0FKUTtBQUlOQyxVQUFBQSxLQUFLLEVBQUUsaUJBQVk7QUFDbEJQLFlBQUFBLENBQUMsQ0FBQ2pQLENBQUQsQ0FBRDtBQUNILFdBTlE7QUFNTjRGLFVBQUFBLFNBQVMsRUFBRSxtQkFBVXJGLENBQVYsRUFBYUMsQ0FBYixFQUFnQkUsQ0FBaEIsRUFBbUI7QUFDN0IsbUJBQU93TyxDQUFDLENBQUNsUCxDQUFELEVBQUlDLENBQUosQ0FBRCxFQUFTd08sQ0FBQyxDQUFDdk8sQ0FBRCxFQUFJSyxDQUFKLEVBQU9DLENBQVAsRUFBVUUsQ0FBVixDQUFWLEVBQXdCK08sQ0FBQyxDQUFDeFAsQ0FBRCxFQUFJQyxDQUFKLEVBQU9GLENBQVAsQ0FBekIsRUFBb0MsSUFBM0M7QUFDSCxXQVJRO0FBUU4wUCxVQUFBQSxPQUFPLEVBQUUsaUJBQVVuUCxDQUFWLEVBQWE7QUFDckIsbUJBQU8yTyxDQUFDLENBQUNsUCxDQUFELEVBQUlDLENBQUosQ0FBRCxFQUFTeU8sQ0FBQyxDQUFDeE8sQ0FBRCxFQUFJSyxDQUFKLENBQVYsRUFBa0JrUCxDQUFDLENBQUN4UCxDQUFELEVBQUlDLENBQUosRUFBT0YsQ0FBUCxDQUFuQixFQUE4QixJQUFyQztBQUNILFdBVlE7QUFVTjJQLFVBQUFBLE9BQU8sRUFBRSxpQkFBVXBQLENBQVYsRUFBYTtBQUNyQixtQkFBTzJPLENBQUMsQ0FBQ2xQLENBQUQsRUFBSUMsQ0FBSixDQUFELEVBQVMyTyxDQUFDLENBQUMxTyxDQUFELEVBQUlLLENBQUosQ0FBVixFQUFrQmtQLENBQUMsQ0FBQ3hQLENBQUQsRUFBSUMsQ0FBSixFQUFPRixDQUFQLENBQW5CLEVBQThCLElBQXJDO0FBQ0gsV0FaUTtBQVlONFAsVUFBQUEsT0FBTyxFQUFFLGlCQUFVclAsQ0FBVixFQUFhO0FBQ3JCLG1CQUFPMk8sQ0FBQyxDQUFDbFAsQ0FBRCxFQUFJQyxDQUFKLENBQUQsRUFBUzRPLENBQUMsQ0FBQzNPLENBQUQsRUFBSUssQ0FBSixDQUFWLEVBQWtCa1AsQ0FBQyxDQUFDeFAsQ0FBRCxFQUFJQyxDQUFKLEVBQU9GLENBQVAsQ0FBbkIsRUFBOEIsSUFBckM7QUFDSCxXQWRRO0FBY05zQyxVQUFBQSxLQUFLLEVBQUUsZUFBVS9CLENBQVYsRUFBYUMsQ0FBYixFQUFnQjtBQUN0QixtQkFBTzBPLENBQUMsQ0FBQ2xQLENBQUQsRUFBSUMsQ0FBSixDQUFELEVBQVMrTyxDQUFDLENBQUM5TyxDQUFELEVBQUlLLENBQUosRUFBT0MsQ0FBUCxDQUFWLEVBQXFCaVAsQ0FBQyxDQUFDeFAsQ0FBRCxFQUFJQyxDQUFKLEVBQU9GLENBQVAsQ0FBdEIsRUFBaUMsSUFBeEM7QUFDSCxXQWhCUTtBQWdCTnlMLFVBQUFBLElBQUksRUFBRSxjQUFVbEwsQ0FBVixFQUFhQyxDQUFiLEVBQWdCO0FBQ3JCLG1CQUFPME8sQ0FBQyxDQUFDbFAsQ0FBRCxFQUFJQyxDQUFKLENBQUQsRUFBUzZPLENBQUMsQ0FBQzVPLENBQUQsRUFBSUssQ0FBSixFQUFPQyxDQUFQLENBQVYsRUFBcUJpUCxDQUFDLENBQUN4UCxDQUFELEVBQUlDLENBQUosRUFBT0YsQ0FBUCxDQUF0QixFQUFpQyxJQUF4QztBQUNIO0FBbEJRLFNBQWI7QUFvQkgsT0EvU0w7QUFBQSxVQStTT3lQLENBQUMsR0FBRyxTQUFKQSxDQUFJLENBQVV6UCxDQUFWLEVBQWFDLENBQWIsRUFBZ0JDLENBQWhCLEVBQW1CO0FBQ3RCLGVBQU9BLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0YsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPQyxDQUFDLENBQUMsQ0FBRCxDQUFSLEdBQWNELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLENBQUQsQ0FBdEIsR0FBNEJELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLENBQUQsQ0FBcEMsR0FBMENELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLEVBQUQsQ0FBekQsRUFBK0RDLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0YsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPQyxDQUFDLENBQUMsQ0FBRCxDQUFSLEdBQWNELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLENBQUQsQ0FBdEIsR0FBNEJELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLENBQUQsQ0FBcEMsR0FBMENELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLEVBQUQsQ0FBeEgsRUFBOEhDLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0YsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPQyxDQUFDLENBQUMsQ0FBRCxDQUFSLEdBQWNELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLENBQUQsQ0FBdEIsR0FBNEJELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLEVBQUQsQ0FBcEMsR0FBMkNELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLEVBQUQsQ0FBeEwsRUFBOExDLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0YsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPQyxDQUFDLENBQUMsQ0FBRCxDQUFSLEdBQWNELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLENBQUQsQ0FBdEIsR0FBNEJELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLEVBQUQsQ0FBcEMsR0FBMkNELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLEVBQUQsQ0FBeFAsRUFBOFBDLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0YsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPQyxDQUFDLENBQUMsQ0FBRCxDQUFSLEdBQWNELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLENBQUQsQ0FBdEIsR0FBNEJELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLENBQUQsQ0FBcEMsR0FBMENELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLEVBQUQsQ0FBdlQsRUFBNlRDLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0YsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPQyxDQUFDLENBQUMsQ0FBRCxDQUFSLEdBQWNELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLENBQUQsQ0FBdEIsR0FBNEJELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLENBQUQsQ0FBcEMsR0FBMENELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLEVBQUQsQ0FBdFgsRUFBNFhDLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0YsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPQyxDQUFDLENBQUMsQ0FBRCxDQUFSLEdBQWNELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLENBQUQsQ0FBdEIsR0FBNEJELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLEVBQUQsQ0FBcEMsR0FBMkNELENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBQyxDQUFDLEVBQUQsQ0FBdGIsRUFBNGJDLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0YsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPQyxDQUFDLENBQUMsQ0FBRCxDQUFSLEdBQWNELENBQUMsQ0FB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UCxFQUE1UCxFQUFnUSxFQUFoUSxFQUFvUSxFQUFwUSxFQUF3USxFQUF4USxFQUE0USxFQUE1USxFQUFnUixFQUFoUixFQUFvUixFQUFwUixFQUF3UixFQUF4UixFQUE0UixFQUE1UixFQUFnUyxFQUFoUyxFQUFvUyxFQUFwUyxFQUF3UyxFQUF4UyxFQUE0UyxFQUE1UyxFQUFnVCxFQUFoVCxFQUFvVCxFQUFwVCxFQUF3VCxFQUF4VCxFQUE0VCxFQUE1VCxFQUFnVSxFQUFoVSxFQUFvVSxFQUFwVSxFQUF3VSxFQUF4VSxFQUE0VSxFQUE1VSxFQUFnVixFQUFoVixFQUFvVixFQUFwVixFQUF3VixFQUF4VixFQUE0VixFQUE1VixFQUFnVyxFQUFoVyxFQUFvVyxFQUFwVyxFQUF3VyxFQUF4VyxFQUE0VyxFQUE1VyxFQUFnWCxFQUFoWCxFQUFvWCxFQUFwWCxFQUF3WCxFQUF4WCxFQUE0WCxFQUE1WCxFQUFnWSxFQUFoWSxFQUFvWSxFQUFwWSxFQUF3WSxFQUF4WSxFQUE0WSxFQUE1WSxFQUFnWixFQUFoWixFQUFvWixFQUFwWixFQUF3WixFQUF4WixFQUE0WixFQUE1WixFQUFnYSxFQUFoYSxFQUFvYSxFQUFwYSxFQUF3YSxFQUF4YSxFQUE0YSxFQUE1YSxFQUFnYixFQUFoYixFQUFvYixFQUFwYixFQUF3YixFQUF4YixFQUE0YixFQUE1YixFQUFnYyxFQUFoYyxFQUFvYyxFQUFwYyxFQUF3YyxFQUF4YyxFQUE0YyxFQUE1YyxFQUFnZCxFQUFoZCxFQUFvZCxFQUFwZCxFQUF3ZCxFQUF4ZCxFQUE0ZCxFQUE1ZCxFQUFnZSxFQUFoZSxFQUFvZSxFQUFwZSxFQUF3ZSxFQUF4ZSxFQUE0ZSxFQUE1ZSxFQUFnZixFQUFoZixFQUFvZixFQUFwZixFQUF3ZixFQUF4ZixFQUE0ZixFQUE1ZixFQUFnZ0IsRUFBaGdCLEVBQW9nQixFQUFwZ0IsRUFBd2dCLEVBQXhnQixFQUE0Z0IsRUFBNWdCLEVBQWdoQixFQUFoaEIsRUFBb2hCLEVBQXBoQixFQUF3aEIsRUFBeGhCLEVBQTRoQixFQUE1aEIsRUFBZ2lCLEVBQWhp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IC0gSW1hZ2UgQ3JvcHBpbmcgTWFkZSBFYXN5XHJcbiAqIENvcHlyaWdodCAoYykgMjAxOCBSaWsgU2NoZW5uaW5rIC0gaHR0cDovL3NsaW1pbWFnZWNyb3BwZXIuY29tXHJcbiAqL1xyXG4hZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgIGZ1bmN0aW9uIGkoKSB7XHJcbiAgICAgICAgdC5TbGltLnBhcnNlKGRvY3VtZW50KVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0KSBpZiAodC5TbGltID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIHQodCwgZSkge1xyXG4gICAgICAgICAgICBpZiAoISh0IGluc3RhbmNlb2YgZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGkodCwgZSwgaSwgbikge1xyXG4gICAgICAgICAgICBpZiAoIShlID49IDEpKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBvID0gdC53aWR0aCwgYSA9IHQuaGVpZ2h0LCByID0gTWF0aC5tYXgobi53aWR0aCwgTWF0aC5taW4oaS53aWR0aCwgTWF0aC5yb3VuZCh0LndpZHRoICogZSkpKSwgcyA9IE1hdGgubWF4KG4uaGVpZ2h0LCBNYXRoLm1pbihpLmhlaWdodCwgTWF0aC5yb3VuZCh0LmhlaWdodCAqIGUpKSksIGggPSBzdCh0KSwgdSA9IHZvaWQgMCwgbCA9IHZvaWQgMDsgbyA+IHIgJiYgYSA+IHM7KSB1ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKSwgbyA9IE1hdGgucm91bmQoLjUgKiBoLndpZHRoKSwgYSA9IE1hdGgucm91bmQoLjUgKiBoLmhlaWdodCksIG8gPCByICYmIChvID0gciksIGEgPCBzICYmIChhID0gcyksIHUud2lkdGggPSBvLCB1LmhlaWdodCA9IGEsIGwgPSB1LmdldENvbnRleHQoXCIyZFwiKSwgbC5kcmF3SW1hZ2UoaCwgMCwgMCwgbywgYSksIGggPSBzdCh1KTtcclxuICAgICAgICAgICAgICAgIHQud2lkdGggPSByLCB0LmhlaWdodCA9IHMsIGwgPSB0LmdldENvbnRleHQoXCIyZFwiKSwgbC5kcmF3SW1hZ2UoaCwgMCwgMCwgciwgcylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgIWZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZnVuY3Rpb24gdCh0LCBpKSB7XHJcbiAgICAgICAgICAgICAgICBpID0gaSB8fCB7YnViYmxlczogITEsIGNhbmNlbGFibGU6ICExLCBkZXRhaWw6IGV9O1xyXG4gICAgICAgICAgICAgICAgdmFyIG4gPSBkb2N1bWVudC5jcmVhdGVFdmVudChcIkN1c3RvbUV2ZW50XCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG4uaW5pdEN1c3RvbUV2ZW50KHQsIGkuYnViYmxlcywgaS5jYW5jZWxhYmxlLCBpLmRldGFpbCksIG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ICYmICh0LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGUsIHZvaWQod2luZG93LkN1c3RvbUV2ZW50ID0gdCkpXHJcbiAgICAgICAgfSgpO1xyXG4gICAgICAgIHZhciBuID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcclxuICAgICAgICAgICAgICAgIHZhciBvLCBhLCByID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcclxuICAgICAgICAgICAgICAgIGlmIChyLm9uZXJyb3IgPSBlLCByLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAhYSB8fCBpICYmIGkubm9SZXZva2UgfHwgbi5yZXZva2VPYmplY3RVUkwoYSksIGUgJiYgZShuLnNjYWxlKHIsIGkpKVxyXG4gICAgICAgICAgICAgICAgfSwgbi5pc0luc3RhbmNlT2YoXCJCbG9iXCIsIHQpIHx8IG4uaXNJbnN0YW5jZU9mKFwiRmlsZVwiLCB0KSkgbyA9IGEgPSBuLmNyZWF0ZU9iamVjdFVSTCh0KSwgci5fdHlwZSA9IHQudHlwZTsgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgIT0gdHlwZW9mIHQpIHJldHVybiAhMTtcclxuICAgICAgICAgICAgICAgICAgICBvID0gdCwgaSAmJiBpLmNyb3NzT3JpZ2luICYmIChyLmNyb3NzT3JpZ2luID0gaS5jcm9zc09yaWdpbilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBvID8gKHIuc3JjID0gbywgcikgOiBuLnJlYWRGaWxlKHQsIGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LnRhcmdldDtcclxuICAgICAgICAgICAgICAgICAgICBpICYmIGkucmVzdWx0ID8gci5zcmMgPSBpLnJlc3VsdCA6IGUgJiYgZSh0KVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbyA9IHdpbmRvdy5jcmVhdGVPYmplY3RVUkwgJiYgd2luZG93IHx8IHdpbmRvdy5VUkwgJiYgVVJMLnJldm9rZU9iamVjdFVSTCAmJiBVUkwgfHwgd2luZG93LndlYmtpdFVSTCAmJiB3ZWJraXRVUkw7XHJcbiAgICAgICAgbi5pc0luc3RhbmNlT2YgPSBmdW5jdGlvbiAodCwgZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpID09PSBcIltvYmplY3QgXCIgKyB0ICsgXCJdXCJcclxuICAgICAgICB9LCBuLnRyYW5zZm9ybUNvb3JkaW5hdGVzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIH0sIG4uZ2V0VHJhbnNmb3JtZWRPcHRpb25zID0gZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgICAgICAgICAgdmFyIGksIG4sIG8sIGEsIHIgPSBlLmFzcGVjdFJhdGlvO1xyXG4gICAgICAgICAgICBpZiAoIXIpIHJldHVybiBlO1xyXG4gICAgICAgICAgICBpID0ge307XHJcbiAgICAgICAgICAgIGZvciAobiBpbiBlKSBlLmhhc093blByb3BlcnR5KG4pICYmIChpW25dID0gZVtuXSk7XHJcbiAgICAgICAgICAgIHJldHVybiBpLmNyb3AgPSAhMCwgbyA9IHQubmF0dXJhbFdpZHRoIHx8IHQud2lkdGgsIGEgPSB0Lm5hdHVyYWxIZWlnaHQgfHwgdC5oZWlnaHQsIG8gLyBhID4gciA/IChpLm1heFdpZHRoID0gYSAqIHIsIGkubWF4SGVpZ2h0ID0gYSkgOiAoaS5tYXhXaWR0aCA9IG8sIGkubWF4SGVpZ2h0ID0gbyAvIHIpLCBpXHJcbiAgICAgICAgfSwgbi5yZW5kZXJJbWFnZVRvQ2FudmFzID0gZnVuY3Rpb24gKHQsIGUsIGksIG4sIG8sIGEsIHIsIHMsIGgsIHUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHQuZ2V0Q29udGV4dChcIjJkXCIpLmRyYXdJbWFnZShlLCBpLCBuLCBvLCBhLCByLCBzLCBoLCB1KSwgdFxyXG4gICAgICAgIH0sIG4uaGFzQ2FudmFzT3B0aW9uID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHQuY2FudmFzIHx8IHQuY3JvcCB8fCAhIXQuYXNwZWN0UmF0aW9cclxuICAgICAgICB9LCBuLnNjYWxlID0gZnVuY3Rpb24gKHQsIGkpIHtcclxuICAgICAgICAgICAgZnVuY3Rpb24gbygpIHtcclxuICAgICAgICAgICAgICAgIHZhciB0ID0gTWF0aC5tYXgoKGggfHwgYikgLyBiLCAodSB8fCBrKSAvIGspO1xyXG4gICAgICAgICAgICAgICAgdCA+IDEgJiYgKGIgKj0gdCwgayAqPSB0KVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiBhKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHQgPSBNYXRoLm1pbigociB8fCBiKSAvIGIsIChzIHx8IGspIC8gayk7XHJcbiAgICAgICAgICAgICAgICB0IDwgMSAmJiAoYiAqPSB0LCBrICo9IHQpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGkgPSBpIHx8IHt9O1xyXG4gICAgICAgICAgICB2YXIgciwgcywgaCwgdSwgbCwgcCwgYywgZCwgZiwgXywgbSwgZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiksXHJcbiAgICAgICAgICAgICAgICB2ID0gdC5nZXRDb250ZXh0IHx8IG4uaGFzQ2FudmFzT3B0aW9uKGkpICYmIGcuZ2V0Q29udGV4dCwgeSA9IHQubmF0dXJhbFdpZHRoIHx8IHQud2lkdGgsXHJcbiAgICAgICAgICAgICAgICB3ID0gdC5uYXR1cmFsSGVpZ2h0IHx8IHQuaGVpZ2h0LCBiID0geSwgayA9IHc7XHJcbiAgICAgICAgICAgIGlmICh2ICYmIChpID0gbi5nZXRUcmFuc2Zvcm1lZE9wdGlvbnModCwgaSksIGMgPSBpLmxlZnQgfHwgMCwgZCA9IGkudG9wIHx8IDAsIGkuc291cmNlV2lkdGggPyAobCA9IGkuc291cmNlV2lkdGgsIGkucmlnaHQgIT09IGUgJiYgaS5sZWZ0ID09PSBlICYmIChjID0geSAtIGwgLSBpLnJpZ2h0KSkgOiBsID0geSAtIGMgLSAoaS5yaWdodCB8fCAwKSwgaS5zb3VyY2VIZWlnaHQgPyAocCA9IGkuc291cmNlSGVpZ2h0LCBpLmJvdHRvbSAhPT0gZSAmJiBpLnRvcCA9PT0gZSAmJiAoZCA9IHcgLSBwIC0gaS5ib3R0b20pKSA6IHAgPSB3IC0gZCAtIChpLmJvdHRvbSB8fCAwKSwgYiA9IGwsIGsgPSBwKSwgciA9IGkubWF4V2lkdGgsIHMgPSBpLm1heEhlaWdodCwgaCA9IGkubWluV2lkdGgsIHUgPSBpLm1pbkhlaWdodCwgdiAmJiByICYmIHMgJiYgaS5jcm9wID8gKGIgPSByLCBrID0gcywgbSA9IGwgLyBwIC0gciAvIHMsIG0gPCAwID8gKHAgPSBzICogbCAvIHIsIGkudG9wID09PSBlICYmIGkuYm90dG9tID09PSBlICYmIChkID0gKHcgLSBwKSAvIDIpKSA6IG0gPiAwICYmIChsID0gciAqIHAgLyBzLCBpLmxlZnQgPT09IGUgJiYgaS5yaWdodCA9PT0gZSAmJiAoYyA9ICh5IC0gbCkgLyAyKSkpIDogKChpLmNvbnRhaW4gfHwgaS5jb3ZlcikgJiYgKGggPSByID0gciB8fCBoLCB1ID0gcyA9IHMgfHwgdSksIGkuY292ZXIgPyAoYSgpLCBvKCkpIDogKG8oKSwgYSgpKSksIHYpIHtcclxuICAgICAgICAgICAgICAgIGlmIChmID0gaS5waXhlbFJhdGlvLCBmID4gMSAmJiAoZy5zdHlsZS53aWR0aCA9IGIgKyBcInB4XCIsIGcuc3R5bGUuaGVpZ2h0ID0gayArIFwicHhcIiwgYiAqPSBmLCBrICo9IGYsIGcuZ2V0Q29udGV4dChcIjJkXCIpLnNjYWxlKGYsIGYpKSwgXyA9IGkuZG93bnNhbXBsaW5nUmF0aW8sIF8gPiAwICYmIF8gPCAxICYmIGIgPCBsICYmIGsgPCBwKSBmb3IgKDsgbCAqIF8gPiBiOykgZy53aWR0aCA9IGwgKiBfLCBnLmhlaWdodCA9IHAgKiBfLCBuLnJlbmRlckltYWdlVG9DYW52YXMoZywgdCwgYywgZCwgbCwgcCwgMCwgMCwgZy53aWR0aCwgZy5oZWlnaHQpLCBsID0gZy53aWR0aCwgcCA9IGcuaGVpZ2h0LCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKSwgdC53aWR0aCA9IGwsIHQuaGVpZ2h0ID0gcCwgbi5yZW5kZXJJbWFnZVRvQ2FudmFzKHQsIGcsIDAsIDAsIGwsIHAsIDAsIDAsIGwsIHApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGcud2lkdGggPSBiLCBnLmhlaWdodCA9IGssIG4udHJhbnNmb3JtQ29vcmRpbmF0ZXMoZywgaSksIG4ucmVuZGVySW1hZ2VUb0NhbnZhcyhnLCB0LCBjLCBkLCBsLCBwLCAwLCAwLCBiLCBrKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0LndpZHRoID0gYiwgdC5oZWlnaHQgPSBrLCB0XHJcbiAgICAgICAgfSwgbi5jcmVhdGVPYmplY3RVUkwgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICByZXR1cm4gISFvICYmIG8uY3JlYXRlT2JqZWN0VVJMKHQpXHJcbiAgICAgICAgfSwgbi5yZXZva2VPYmplY3RVUkwgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICByZXR1cm4gISFvICYmIG8ucmV2b2tlT2JqZWN0VVJMKHQpXHJcbiAgICAgICAgfSwgbi5yZWFkRmlsZSA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XHJcbiAgICAgICAgICAgIGlmICh3aW5kb3cuRmlsZVJlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgRmlsZVJlYWRlcjtcclxuICAgICAgICAgICAgICAgIGlmIChuLm9ubG9hZCA9IG4ub25lcnJvciA9IGUsIGkgPSBpIHx8IFwicmVhZEFzRGF0YVVSTFwiLCBuW2ldKSByZXR1cm4gbltpXSh0KSwgblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAhMVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmFyIGEgPSBuLmhhc0NhbnZhc09wdGlvbiwgciA9IG4udHJhbnNmb3JtQ29vcmRpbmF0ZXMsIHMgPSBuLmdldFRyYW5zZm9ybWVkT3B0aW9ucztcclxuICAgICAgICBuLmhhc0NhbnZhc09wdGlvbiA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiAhIXQub3JpZW50YXRpb24gfHwgYS5jYWxsKG4sIHQpXHJcbiAgICAgICAgfSwgbi50cmFuc2Zvcm1Db29yZGluYXRlcyA9IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgIHIuY2FsbChuLCB0LCBlKTtcclxuICAgICAgICAgICAgdmFyIGkgPSB0LmdldENvbnRleHQoXCIyZFwiKSwgbyA9IHQud2lkdGgsIGEgPSB0LmhlaWdodCwgcyA9IHQuc3R5bGUud2lkdGgsIGggPSB0LnN0eWxlLmhlaWdodCxcclxuICAgICAgICAgICAgICAgIHUgPSBlLm9yaWVudGF0aW9uO1xyXG4gICAgICAgICAgICBpZiAodSAmJiAhKHUgPiA4KSkgc3dpdGNoICh1ID4gNCAmJiAodC53aWR0aCA9IGEsIHQuaGVpZ2h0ID0gbywgdC5zdHlsZS53aWR0aCA9IGgsIHQuc3R5bGUuaGVpZ2h0ID0gcyksIHUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgICAgICBpLnRyYW5zbGF0ZShvLCAwKSwgaS5zY2FsZSgtMSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgaS50cmFuc2xhdGUobywgYSksIGkucm90YXRlKE1hdGguUEkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgICAgICAgIGkudHJhbnNsYXRlKDAsIGEpLCBpLnNjYWxlKDEsIC0xKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNTpcclxuICAgICAgICAgICAgICAgICAgICBpLnJvdGF0ZSguNSAqIE1hdGguUEkpLCBpLnNjYWxlKDEsIC0xKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNjpcclxuICAgICAgICAgICAgICAgICAgICBpLnJvdGF0ZSguNSAqIE1hdGguUEkpLCBpLnRyYW5zbGF0ZSgwLCAtYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6XHJcbiAgICAgICAgICAgICAgICAgICAgaS5yb3RhdGUoLjUgKiBNYXRoLlBJKSwgaS50cmFuc2xhdGUobywgLWEpLCBpLnNjYWxlKC0xLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgODpcclxuICAgICAgICAgICAgICAgICAgICBpLnJvdGF0ZSgtLjUgKiBNYXRoLlBJKSwgaS50cmFuc2xhdGUoLW8sIDApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBuLmdldFRyYW5zZm9ybWVkT3B0aW9ucyA9IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgIHZhciBpLCBvLCBhID0gcy5jYWxsKG4sIHQsIGUpLCByID0gYS5vcmllbnRhdGlvbjtcclxuICAgICAgICAgICAgaWYgKCFyIHx8IHIgPiA4IHx8IDEgPT09IHIpIHJldHVybiBhO1xyXG4gICAgICAgICAgICBpID0ge307XHJcbiAgICAgICAgICAgIGZvciAobyBpbiBhKSBhLmhhc093blByb3BlcnR5KG8pICYmIChpW29dID0gYVtvXSk7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoYS5vcmllbnRhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgICAgIGkubGVmdCA9IGEucmlnaHQsIGkucmlnaHQgPSBhLmxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgaS5sZWZ0ID0gYS5yaWdodCwgaS50b3AgPSBhLmJvdHRvbSwgaS5yaWdodCA9IGEubGVmdCwgaS5ib3R0b20gPSBhLnRvcDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDpcclxuICAgICAgICAgICAgICAgICAgICBpLnRvcCA9IGEuYm90dG9tLCBpLmJvdHRvbSA9IGEudG9wO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OlxyXG4gICAgICAgICAgICAgICAgICAgIGkubGVmdCA9IGEudG9wLCBpLnRvcCA9IGEubGVmdCwgaS5yaWdodCA9IGEuYm90dG9tLCBpLmJvdHRvbSA9IGEucmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDY6XHJcbiAgICAgICAgICAgICAgICAgICAgaS5sZWZ0ID0gYS50b3AsIGkudG9wID0gYS5yaWdodCwgaS5yaWdodCA9IGEuYm90dG9tLCBpLmJvdHRvbSA9IGEubGVmdDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNzpcclxuICAgICAgICAgICAgICAgICAgICBpLmxlZnQgPSBhLmJvdHRvbSwgaS50b3AgPSBhLnJpZ2h0LCBpLnJpZ2h0ID0gYS50b3AsIGkuYm90dG9tID0gYS5sZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA4OlxyXG4gICAgICAgICAgICAgICAgICAgIGkubGVmdCA9IGEuYm90dG9tLCBpLnRvcCA9IGEubGVmdCwgaS5yaWdodCA9IGEudG9wLCBpLmJvdHRvbSA9IGEucmlnaHRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYS5vcmllbnRhdGlvbiA+IDQgJiYgKGkubWF4V2lkdGggPSBhLm1heEhlaWdodCwgaS5tYXhIZWlnaHQgPSBhLm1heFdpZHRoLCBpLm1pbldpZHRoID0gYS5taW5IZWlnaHQsIGkubWluSGVpZ2h0ID0gYS5taW5XaWR0aCwgaS5zb3VyY2VXaWR0aCA9IGEuc291cmNlSGVpZ2h0LCBpLnNvdXJjZUhlaWdodCA9IGEuc291cmNlV2lkdGgpLCBpXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgaCA9IHdpbmRvdy5CbG9iICYmIChCbG9iLnByb3RvdHlwZS5zbGljZSB8fCBCbG9iLnByb3RvdHlwZS53ZWJraXRTbGljZSB8fCBCbG9iLnByb3RvdHlwZS5tb3pTbGljZSk7XHJcbiAgICAgICAgbi5ibG9iU2xpY2UgPSBoICYmIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHQgPSB0aGlzLnNsaWNlIHx8IHRoaXMud2Via2l0U2xpY2UgfHwgdGhpcy5tb3pTbGljZTtcclxuICAgICAgICAgICAgcmV0dXJuIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxyXG4gICAgICAgIH0sIG4ubWV0YURhdGFQYXJzZXJzID0ge2pwZWc6IHs2NTUwNTogW119fSwgbi5wYXJzZU1ldGFEYXRhID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcclxuICAgICAgICAgICAgaSA9IGkgfHwge307XHJcbiAgICAgICAgICAgIHZhciBvID0gdGhpcywgYSA9IGkubWF4TWV0YURhdGFTaXplIHx8IDI2MjE0NCwgciA9IHt9LFxyXG4gICAgICAgICAgICAgICAgcyA9ICEod2luZG93LkRhdGFWaWV3ICYmIHQgJiYgdC5zaXplID49IDEyICYmIFwiaW1hZ2UvanBlZ1wiID09PSB0LnR5cGUgJiYgbi5ibG9iU2xpY2UpO1xyXG4gICAgICAgICAgICAhcyAmJiBuLnJlYWRGaWxlKG4uYmxvYlNsaWNlLmNhbGwodCwgMCwgYSksIGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodC50YXJnZXQuZXJyb3IpIHJldHVybiB2b2lkIGUocik7XHJcbiAgICAgICAgICAgICAgICB2YXIgYSwgcywgaCwgdSwgbCA9IHQudGFyZ2V0LnJlc3VsdCwgcCA9IG5ldyBEYXRhVmlldyhsKSwgYyA9IDIsIGQgPSBwLmJ5dGVMZW5ndGggLSA0LCBmID0gYztcclxuICAgICAgICAgICAgICAgIGlmICg2NTQ5NiA9PT0gcC5nZXRVaW50MTYoMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKDsgYyA8IGQgJiYgKGEgPSBwLmdldFVpbnQxNihjKSwgYSA+PSA2NTUwNCAmJiBhIDw9IDY1NTE5IHx8IDY1NTM0ID09PSBhKSAmJiAocyA9IHAuZ2V0VWludDE2KGMgKyAyKSArIDIsICEoYyArIHMgPiBwLmJ5dGVMZW5ndGgpKTspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggPSBuLm1ldGFEYXRhUGFyc2Vycy5qcGVnW2FdKSBmb3IgKHUgPSAwOyB1IDwgaC5sZW5ndGg7IHUgKz0gMSkgaFt1XS5jYWxsKG8sIHAsIGMsIHMsIHIsIGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjICs9IHMsIGYgPSBjXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICFpLmRpc2FibGVJbWFnZUhlYWQgJiYgZiA+IDYgJiYgKGwuc2xpY2UgPyByLmltYWdlSGVhZCA9IGwuc2xpY2UoMCwgZikgOiByLmltYWdlSGVhZCA9IG5ldyBVaW50OEFycmF5KGwpLnN1YmFycmF5KDAsIGYpKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZShyKVxyXG4gICAgICAgICAgICB9LCBcInJlYWRBc0FycmF5QnVmZmVyXCIpIHx8IGUocilcclxuICAgICAgICB9LCBuLkV4aWZNYXAgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzXHJcbiAgICAgICAgfSwgbi5FeGlmTWFwLnByb3RvdHlwZS5tYXAgPSB7T3JpZW50YXRpb246IDI3NH0sIG4uRXhpZk1hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXNbdF0gfHwgdGhpc1t0aGlzLm1hcFt0XV1cclxuICAgICAgICB9LCBuLmdldEV4aWZUaHVtYm5haWwgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xyXG4gICAgICAgICAgICB2YXIgbiwgbywgYTtcclxuICAgICAgICAgICAgaWYgKGkgJiYgIShlICsgaSA+IHQuYnl0ZUxlbmd0aCkpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobiA9IFtdLCBvID0gMDsgbyA8IGk7IG8gKz0gMSkgYSA9IHQuZ2V0VWludDgoZSArIG8pLCBuLnB1c2goKGEgPCAxNiA/IFwiMFwiIDogXCJcIikgKyBhLnRvU3RyaW5nKDE2KSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJkYXRhOmltYWdlL2pwZWcsJVwiICsgbi5qb2luKFwiJVwiKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgbi5leGlmVGFnVHlwZXMgPSB7XHJcbiAgICAgICAgICAgIDE6IHtcclxuICAgICAgICAgICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbiAodCwgZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldFVpbnQ4KGUpXHJcbiAgICAgICAgICAgICAgICB9LCBzaXplOiAxXHJcbiAgICAgICAgICAgIH0sIDI6IHtcclxuICAgICAgICAgICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbiAodCwgZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHQuZ2V0VWludDgoZSkpXHJcbiAgICAgICAgICAgICAgICB9LCBzaXplOiAxLCBhc2NpaTogITBcclxuICAgICAgICAgICAgfSwgMzoge1xyXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICh0LCBlLCBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZ2V0VWludDE2KGUsIGkpXHJcbiAgICAgICAgICAgICAgICB9LCBzaXplOiAyXHJcbiAgICAgICAgICAgIH0sIDQ6IHtcclxuICAgICAgICAgICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbiAodCwgZSwgaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldFVpbnQzMihlLCBpKVxyXG4gICAgICAgICAgICAgICAgfSwgc2l6ZTogNFxyXG4gICAgICAgICAgICB9LCA1OiB7XHJcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKHQsIGUsIGkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5nZXRVaW50MzIoZSwgaSkgLyB0LmdldFVpbnQzMihlICsgNCwgaSlcclxuICAgICAgICAgICAgICAgIH0sIHNpemU6IDhcclxuICAgICAgICAgICAgfSwgOToge1xyXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICh0LCBlLCBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZ2V0SW50MzIoZSwgaSlcclxuICAgICAgICAgICAgICAgIH0sIHNpemU6IDRcclxuICAgICAgICAgICAgfSwgMTA6IHtcclxuICAgICAgICAgICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbiAodCwgZSwgaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldEludDMyKGUsIGkpIC8gdC5nZXRJbnQzMihlICsgNCwgaSlcclxuICAgICAgICAgICAgICAgIH0sIHNpemU6IDhcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIG4uZXhpZlRhZ1R5cGVzWzddID0gbi5leGlmVGFnVHlwZXNbMV0sIG4uZ2V0RXhpZlZhbHVlID0gZnVuY3Rpb24gKHQsIGUsIGksIG8sIGEsIHIpIHtcclxuICAgICAgICAgICAgdmFyIHMsIGgsIHUsIGwsIHAsIGMsIGQgPSBuLmV4aWZUYWdUeXBlc1tvXTtcclxuICAgICAgICAgICAgaWYgKGQgJiYgKHMgPSBkLnNpemUgKiBhLCBoID0gcyA+IDQgPyBlICsgdC5nZXRVaW50MzIoaSArIDgsIHIpIDogaSArIDgsICEoaCArIHMgPiB0LmJ5dGVMZW5ndGgpKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKDEgPT09IGEpIHJldHVybiBkLmdldFZhbHVlKHQsIGgsIHIpO1xyXG4gICAgICAgICAgICAgICAgZm9yICh1ID0gW10sIGwgPSAwOyBsIDwgYTsgbCArPSAxKSB1W2xdID0gZC5nZXRWYWx1ZSh0LCBoICsgbCAqIGQuc2l6ZSwgcik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZC5hc2NpaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAocCA9IFwiXCIsIGwgPSAwOyBsIDwgdS5sZW5ndGggJiYgKGMgPSB1W2xdLCBcIlxcMFwiICE9PSBjKTsgbCArPSAxKSBwICs9IGM7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB1XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBuLnBhcnNlRXhpZlRhZyA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvLCBhKSB7XHJcbiAgICAgICAgICAgIHZhciByID0gdC5nZXRVaW50MTYoaSwgbyk7XHJcbiAgICAgICAgICAgIGEuZXhpZltyXSA9IG4uZ2V0RXhpZlZhbHVlKHQsIGUsIGksIHQuZ2V0VWludDE2KGkgKyAyLCBvKSwgdC5nZXRVaW50MzIoaSArIDQsIG8pLCBvKVxyXG4gICAgICAgIH0sIG4ucGFyc2VFeGlmVGFncyA9IGZ1bmN0aW9uICh0LCBlLCBpLCBuLCBvKSB7XHJcbiAgICAgICAgICAgIHZhciBhLCByLCBzO1xyXG4gICAgICAgICAgICBpZiAoIShpICsgNiA+IHQuYnl0ZUxlbmd0aCB8fCAoYSA9IHQuZ2V0VWludDE2KGksIG4pLCByID0gaSArIDIgKyAxMiAqIGEsIHIgKyA0ID4gdC5ieXRlTGVuZ3RoKSkpIHtcclxuICAgICAgICAgICAgICAgIGZvciAocyA9IDA7IHMgPCBhOyBzICs9IDEpIHRoaXMucGFyc2VFeGlmVGFnKHQsIGUsIGkgKyAyICsgMTIgKiBzLCBuLCBvKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0LmdldFVpbnQzMihyLCBuKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgbi5wYXJzZUV4aWZEYXRhID0gZnVuY3Rpb24gKHQsIGUsIGksIG8sIGEpIHtcclxuICAgICAgICAgICAgaWYgKCFhLmRpc2FibGVFeGlmKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgciwgcywgaCwgdSA9IGUgKyAxMDtcclxuICAgICAgICAgICAgICAgIGlmICgxMTY1NTE5MjA2ID09PSB0LmdldFVpbnQzMihlICsgNCkgJiYgISh1ICsgOCA+IHQuYnl0ZUxlbmd0aCkgJiYgMCA9PT0gdC5nZXRVaW50MTYoZSArIDgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0LmdldFVpbnQxNih1KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4NzYxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9ICEwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk3ODk6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gITE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICA0MiA9PT0gdC5nZXRVaW50MTYodSArIDIsIHIpICYmIChzID0gdC5nZXRVaW50MzIodSArIDQsIHIpLCBvLmV4aWYgPSBuZXcgbi5FeGlmTWFwLCBzID0gbi5wYXJzZUV4aWZUYWdzKHQsIHUsIHUgKyBzLCByLCBvKSwgcyAmJiAhYS5kaXNhYmxlRXhpZlRodW1ibmFpbCAmJiAoaCA9IHtleGlmOiB7fX0sIHMgPSBuLnBhcnNlRXhpZlRhZ3ModCwgdSwgdSArIHMsIHIsIGgpLCBoLmV4aWZbNTEzXSAmJiAoby5leGlmLlRodW1ibmFpbCA9IG4uZ2V0RXhpZlRodW1ibmFpbCh0LCB1ICsgaC5leGlmWzUxM10sIGguZXhpZls1MTRdKSkpLCBvLmV4aWZbMzQ2NjVdICYmICFhLmRpc2FibGVFeGlmU3ViICYmIG4ucGFyc2VFeGlmVGFncyh0LCB1LCB1ICsgby5leGlmWzM0NjY1XSwgciwgbyksIG8uZXhpZlszNDg1M10gJiYgIWEuZGlzYWJsZUV4aWZHcHMgJiYgbi5wYXJzZUV4aWZUYWdzKHQsIHUsIHUgKyBvLmV4aWZbMzQ4NTNdLCByLCBvKSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIG4ubWV0YURhdGFQYXJzZXJzLmpwZWdbNjU1MDVdLnB1c2gobi5wYXJzZUV4aWZEYXRhKTtcclxuICAgICAgICB2YXIgdSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHQgPSBbXSwgaSA9IFtdLCBuID0gW10sIG8gPSBcInRyYW5zZm9ybVwiLCBhID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBcIlwiKSxcclxuICAgICAgICAgICAgICAgIHIgPSAoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSkuam9pbihcIlwiKS5tYXRjaCgvLShtb3p8d2Via2l0fG1zKS0vKSB8fCBcIlwiID09PSBhLk9MaW5rICYmIFtcIlwiLCBcIm9cIl0pWzFdO1xyXG4gICAgICAgICAgICBcIndlYmtpdFwiID09PSByICYmIChvID0gXCJ3ZWJraXRUcmFuc2Zvcm1cIik7XHJcbiAgICAgICAgICAgIHZhciBzID0gZnVuY3Rpb24gKHQsIGksIG4pIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG8ubGVuZ3RoICE9PSBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbmVyczogW10sIHRoZW46IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc25hYmJ0KHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzbmFiYnQ6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmNoYWluZXJzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFpbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChpLCBuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuc25hYmJ0KGgodCwgbiwgZSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHNldFZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYWluZXJzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXRWYWx1ZSh0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmaW5pc2g6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFpbmVycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZmluaXNoKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm9sbGJhY2s6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFpbmVycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucm9sbGJhY2soKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIgPSAwLCBzID0gby5sZW5ndGg7IHIgPCBzOyArK3IpIFwic3RyaW5nXCIgPT0gdHlwZW9mIGkgPyBhLmNoYWluZXJzLnB1c2godShvW3JdLCBpLCBoKG4sIHIsIHMpKSkgOiBhLmNoYWluZXJzLnB1c2godShvW3JdLCBoKGksIHIsIHMpLCBuKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcInN0cmluZ1wiID09IHR5cGVvZiBpID8gdShvLCBpLCBoKG4sIDAsIDEpKSA6IHUobywgaChpLCAwLCAxKSwgbilcclxuICAgICAgICAgICAgICAgIH0sIGggPSBmdW5jdGlvbiAodCwgZSwgaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdCkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAkKHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIEoodC5kZWxheSkgJiYgKG4uZGVsYXkgPSB0LmRlbGF5KGUsIGkpKSwgSih0LmNhbGxiYWNrKSAmJiAobi5jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdC5jYWxsYmFjay5jYWxsKHRoaXMsIGUsIGkpXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBKKHQuYWxsRG9uZSksIGEgPSBKKHQuY29tcGxldGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIChhIHx8IG8pICYmIChuLmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhICYmIHQuY29tcGxldGUuY2FsbCh0aGlzLCBlLCBpKSwgbyAmJiBlID09IGkgLSAxICYmIHQuYWxsRG9uZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSksIEoodC52YWx1ZUZlZWRlcikgJiYgKG4udmFsdWVGZWVkZXIgPSBmdW5jdGlvbiAobiwgbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC52YWx1ZUZlZWRlcihuLCBvLCBlLCBpKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pLCBKKHQuZWFzaW5nKSAmJiAobi5lYXNpbmcgPSBmdW5jdGlvbiAobikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5lYXNpbmcobiwgZSwgaSlcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFtcInBvc2l0aW9uXCIsIFwicm90YXRpb25cIiwgXCJza2V3XCIsIFwicm90YXRpb25Qb3N0XCIsIFwic2NhbGVcIiwgXCJ3aWR0aFwiLCBcImhlaWdodFwiLCBcIm9wYWNpdHlcIiwgXCJmcm9tUG9zaXRpb25cIiwgXCJmcm9tUm90YXRpb25cIiwgXCJmcm9tU2tld1wiLCBcImZyb21Sb3RhdGlvblBvc3RcIiwgXCJmcm9tU2NhbGVcIiwgXCJmcm9tV2lkdGhcIiwgXCJmcm9tSGVpZ2h0XCIsIFwiZnJvbU9wYWNpdHlcIiwgXCJ0cmFuc2Zvcm1PcmlnaW5cIiwgXCJkdXJhdGlvblwiLCBcImRlbGF5XCJdO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByLmZvckVhY2goZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgSih0W29dKSAmJiAobltvXSA9IHRbb10oZSwgaSkpXHJcbiAgICAgICAgICAgICAgICAgICAgfSksIG5cclxuICAgICAgICAgICAgICAgIH0sIHUgPSBmdW5jdGlvbiAodCwgZSwgbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi50aWNrKGUpLCBmLnVwZGF0ZUVsZW1lbnQodCksICFmLmlzU3RvcHBlZCgpKSByZXR1cm4gZi5jb21wbGV0ZWQoKSA/IHZvaWQoYS5sb29wID4gMSAmJiAhZi5pc1N0b3BwZWQoKSA/IChhLmxvb3AgLT0gMSwgZi5yZXN0YXJ0KCksIGsobykpIDogKGEuY29tcGxldGUgJiYgYS5jb21wbGV0ZS5jYWxsKHQpLCBfLmxlbmd0aCAmJiAoYSA9IF8ucG9wKCksIHMgPSB5KGEsIHUsICEwKSwgdSA9IHkoYSwgJCh1KSksIGEgPSB3KHMsIHUsIGEpLCBmID0gUyhhKSwgaS5wdXNoKFt0LCBmXSksIGYudGljayhlKSwgayhvKSkpKSA6IGsobylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcImF0dGVudGlvblwiID09PSBlKSByZXR1cm4gbCh0LCBuKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoXCJzdG9wXCIgPT09IGUpIHJldHVybiBwKHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcImRldGFjaFwiID09PSBlKSByZXR1cm4gZCh0KTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByID0gdih0KSwgcyA9IHI7XHJcbiAgICAgICAgICAgICAgICAgICAgcyA9IHkoYSwgcywgITApO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB1ID0gJChyKTtcclxuICAgICAgICAgICAgICAgICAgICB1ID0geShhLCB1KTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHcocywgdSwgYSksIGYgPSBTKGMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGkucHVzaChbdCwgZl0pLCBmLnVwZGF0ZUVsZW1lbnQodCwgITApO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBfID0gW10sIGcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNuYWJidDogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfLnVuc2hpZnQoaCh0LCAwLCAxKSksIGdcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhlbjogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNuYWJidCh0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gayhvKSwgYS5tYW51YWwgPyBmIDogZ1xyXG4gICAgICAgICAgICAgICAgfSwgbCA9IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbihpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGEudGljayhpKSwgYS51cGRhdGVFbGVtZW50KHQpLCBhLmNvbXBsZXRlZCgpID8gKGUuY2FsbGJhY2sgJiYgZS5jYWxsYmFjayh0KSwgZS5sb29wICYmIGUubG9vcCA+IDEgJiYgKGUubG9vcC0tLCBhLnJlc3RhcnQoKSwgayhuKSkpIDogayhuKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB5KGUsIHEoe30pKTtcclxuICAgICAgICAgICAgICAgICAgICBlLm1vdmVtZW50ID0gbztcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IEUoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaS5wdXNoKFt0LCBhXSksIGsobilcclxuICAgICAgICAgICAgICAgIH0sIHAgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwLCBuID0gaS5sZW5ndGg7IGUgPCBuOyArK2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBpW2VdLCBhID0gb1swXSwgciA9IG9bMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGEgPT09IHQgJiYgci5zdG9wKClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCBjID0gZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSBpZiAodFtpXVswXSA9PT0gZSkgcmV0dXJuIGk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xXHJcbiAgICAgICAgICAgICAgICB9LCBkID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZSwgbywgYSA9IFtdLCByID0gaS5jb25jYXQobiksIHMgPSByLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKG8gPSAwOyBvIDwgczsgKytvKSBlID0gcltvXVswXSwgKHQuY29udGFpbnMoZSkgfHwgdCA9PT0gZSkgJiYgYS5wdXNoKGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAocyA9IGEubGVuZ3RoLCBvID0gMDsgbyA8IHM7ICsrbykgZihhW29dKVxyXG4gICAgICAgICAgICAgICAgfSwgZiA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcCh0KTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGMoaSwgdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZSA+PSAwICYmIGkuc3BsaWNlKGUsIDEpLCBlID0gYyhuLCB0KSwgZSA+PSAwICYmIG4uc3BsaWNlKGUsIDEpXHJcbiAgICAgICAgICAgICAgICB9LCBfID0gZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gdFtpXSwgYSA9IG9bMF0sIHIgPSBvWzFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PT0gZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSByLmdldEN1cnJlbnRTdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuc3RvcCgpLCBzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCBtID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG4gPSBuLmZpbHRlcihmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyh0WzBdKS5ib2R5XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH0sIGcgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB0OyBlLnBhcmVudE5vZGU7KSBlID0gZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlXHJcbiAgICAgICAgICAgICAgICB9LCB2ID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IF8oaSwgdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPyBlIDogXyhuLCB0KVxyXG4gICAgICAgICAgICAgICAgfSwgeSA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZSB8fCAoZSA9IHEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogWzAsIDAsIDBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbjogWzAsIDAsIDBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvblBvc3Q6IFswLCAwLCAwXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IFsxLCAxXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2tldzogWzAsIDBdXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBuID0gXCJwb3NpdGlvblwiLCBvID0gXCJyb3RhdGlvblwiLCBhID0gXCJza2V3XCIsIHIgPSBcInJvdGF0aW9uUG9zdFwiLCBzID0gXCJzY2FsZVwiLCBoID0gXCJzY2FsZVBvc3RcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFwid2lkdGhcIiwgbCA9IFwiaGVpZ2h0XCIsIHAgPSBcIm9wYWNpdHlcIjtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSAmJiAobiA9IFwiZnJvbVBvc2l0aW9uXCIsIG8gPSBcImZyb21Sb3RhdGlvblwiLCBhID0gXCJmcm9tU2tld1wiLCByID0gXCJmcm9tUm90YXRpb25Qb3N0XCIsIHMgPSBcImZyb21TY2FsZVwiLCBoID0gXCJmcm9tU2NhbGVQb3N0XCIsIHUgPSBcImZyb21XaWR0aFwiLCBsID0gXCJmcm9tSGVpZ2h0XCIsIHAgPSBcImZyb21PcGFjaXR5XCIpLCBlLnBvc2l0aW9uID0gRyh0W25dLCBlLnBvc2l0aW9uKSwgZS5yb3RhdGlvbiA9IEcodFtvXSwgZS5yb3RhdGlvbiksIGUucm90YXRpb25Qb3N0ID0gRyh0W3JdLCBlLnJvdGF0aW9uUG9zdCksIGUuc2tldyA9IEcodFthXSwgZS5za2V3KSwgZS5zY2FsZSA9IEcodFtzXSwgZS5zY2FsZSksIGUuc2NhbGVQb3N0ID0gRyh0W2hdLCBlLnNjYWxlUG9zdCksIGUub3BhY2l0eSA9IHRbcF0sIGUud2lkdGggPSB0W3VdLCBlLmhlaWdodCA9IHRbbF0sIGVcclxuICAgICAgICAgICAgICAgIH0sIHcgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnN0YXJ0U3RhdGUgPSB0LCBpLmVuZFN0YXRlID0gZSwgaVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGIgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCB3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dCh0LCAxZTMgLyA2MClcclxuICAgICAgICAgICAgICAgIH0sIGsgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIDAgPT09IHQubGVuZ3RoICYmIGIoeCksIHQucHVzaChlKVxyXG4gICAgICAgICAgICAgICAgfSwgeCA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbyA9IHQubGVuZ3RoLCBhID0gMDsgYSA8IG87ICsrYSkgdFthXShlKTtcclxuICAgICAgICAgICAgICAgICAgICB0LnNwbGljZSgwLCBvKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGkuZmlsdGVyKGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0WzFdLmNvbXBsZXRlZCgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbiA9IG4uZmlsdGVyKGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwLCBpID0gci5sZW5ndGg7IGUgPCBpOyArK2UpIGlmICh0WzBdID09PSByW2VdWzBdKSByZXR1cm4gITE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMFxyXG4gICAgICAgICAgICAgICAgICAgIH0pLCBuID0gbi5jb25jYXQociksIGkgPSBpLmZpbHRlcihmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXRbMV0uY29tcGxldGVkKClcclxuICAgICAgICAgICAgICAgICAgICB9KSwgMCAhPT0gdC5sZW5ndGggJiYgYih4KVxyXG4gICAgICAgICAgICAgICAgfSwgUyA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LnN0YXJ0U3RhdGUsIG4gPSB0LmVuZFN0YXRlLCBvID0gRyh0LmR1cmF0aW9uLCA1MDApLCBhID0gRyh0LmRlbGF5LCAwKSwgciA9IHQucGVyc3BlY3RpdmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBMKEcodC5lYXNpbmcsIFwibGluZWFyXCIpLCB0KSwgaCA9IDAgPT09IG8gPyBuLmNsb25lKCkgOiBpLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdC50cmFuc2Zvcm1PcmlnaW47XHJcbiAgICAgICAgICAgICAgICAgICAgaC50cmFuc2Zvcm1PcmlnaW4gPSB0LnRyYW5zZm9ybU9yaWdpbjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdSwgbCwgcCA9IDAsIGMgPSAwLCBkID0gITEsIGYgPSAhMSwgXyA9IHQubWFudWFsLCBtID0gMCwgZyA9IGEgLyBvO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsID0gdC52YWx1ZUZlZWRlciA/IFYodC52YWx1ZUZlZWRlciwgaSwgbiwgaCkgOiBqKGksIG4sIGgpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3A6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSAhMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBpc1N0b3BwZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZpbmlzaDogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gPSAhMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbyAqIG07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gYyAtIGUsIHUgPSB0LCBzLnJlc2V0RnJvbSA9IG1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm9sbGJhY2s6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfID0gITEsIGwuc2V0UmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBvICogKDEgLSBtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBjIC0gZSwgdSA9IHQsIHMucmVzZXRGcm9tID0gbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByZXN0YXJ0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gZSwgcy5yZXNldEZyb20oMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGljazogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfKSByZXR1cm4gYyA9IHQsIHZvaWQgdGhpcy51cGRhdGVDdXJyZW50VHJhbnNmb3JtKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAgfHwgKHAgPSB0KSwgdCAtIHAgPiBhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSAhMCwgYyA9IHQgLSBhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IE1hdGgubWluKE1hdGgubWF4KDAsIGMgLSBwKSwgbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudGljayhlIC8gbyksIHRoaXMudXBkYXRlQ3VycmVudFRyYW5zZm9ybSgpLCB0aGlzLmNvbXBsZXRlZCgpICYmIHUgJiYgdSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBnZXRDdXJyZW50U3RhdGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHNldFZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9ICEwLCBtID0gTWF0aC5taW4oTWF0aC5tYXgodCwgMWUtNCksIDEgKyBnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB1cGRhdGVDdXJyZW50VHJhbnNmb3JtOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHMuZ2V0VmFsdWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBNYXRoLm1heCgxZS01LCBtIC0gZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy50aWNrKGUpLCB0ID0gcy5nZXRWYWx1ZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLnR3ZWVuKHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGNvbXBsZXRlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhZCB8fCAwICE9PSBwICYmIHMuY29tcGxldGVkKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdXBkYXRlRWxlbWVudDogZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmIHx8IGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGwuYXNNYXRyaXgoKSwgbiA9IGwuZ2V0UHJvcGVydGllcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgodCwgaSwgciksIFkodCwgbilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIEUgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5tb3ZlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICB0LmluaXRpYWxWZWxvY2l0eSA9IC4xLCB0LmVxdWlsaWJyaXVtUG9zaXRpb24gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBuID0gVCh0KSwgbyA9ICExLCBhID0gaS5wb3NpdGlvbiwgciA9IGkucm90YXRpb24sIHMgPSBpLnJvdGF0aW9uUG9zdCwgaCA9IGkuc2NhbGUsIHUgPSBpLnNrZXcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBxKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhID8gWzAsIDAsIDBdIDogZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiByID8gWzAsIDAsIDBdIDogZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uUG9zdDogcyA/IFswLCAwLCAwXSA6IGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZTogaCA/IFswLCAwXSA6IGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2V3OiB1ID8gWzAsIDBdIDogZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9wOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gITBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgaXNTdG9wcGVkOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGljazogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gfHwgbi5lcXVpbGlicml1bSB8fCAobi50aWNrKCksIHRoaXMudXBkYXRlTW92ZW1lbnQoKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdXBkYXRlTW92ZW1lbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbi5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAmJiAobC5wb3NpdGlvblswXSA9IGkucG9zaXRpb25bMF0gKiB0LCBsLnBvc2l0aW9uWzFdID0gaS5wb3NpdGlvblsxXSAqIHQsIGwucG9zaXRpb25bMl0gPSBpLnBvc2l0aW9uWzJdICogdCksIHIgJiYgKGwucm90YXRpb25bMF0gPSBpLnJvdGF0aW9uWzBdICogdCwgbC5yb3RhdGlvblsxXSA9IGkucm90YXRpb25bMV0gKiB0LCBsLnJvdGF0aW9uWzJdID0gaS5yb3RhdGlvblsyXSAqIHQpLCBzICYmIChsLnJvdGF0aW9uUG9zdFswXSA9IGkucm90YXRpb25Qb3N0WzBdICogdCwgbC5yb3RhdGlvblBvc3RbMV0gPSBpLnJvdGF0aW9uUG9zdFsxXSAqIHQsIGwucm90YXRpb25Qb3N0WzJdID0gaS5yb3RhdGlvblBvc3RbMl0gKiB0KSwgaCAmJiAobC5zY2FsZVswXSA9IDEgKyBpLnNjYWxlWzBdICogdCwgbC5zY2FsZVsxXSA9IDEgKyBpLnNjYWxlWzFdICogdCksIHUgJiYgKGwuc2tld1swXSA9IGkuc2tld1swXSAqIHQsIGwuc2tld1sxXSA9IGkuc2tld1sxXSAqIHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHVwZGF0ZUVsZW1lbnQ6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKHQsIGwuYXNNYXRyaXgoKSksIFkodCwgbC5nZXRQcm9wZXJ0aWVzKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGdldEN1cnJlbnRTdGF0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgY29tcGxldGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5lcXVpbGlicml1bSB8fCBvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJlc3RhcnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBUKHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCBDID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFxyXG4gICAgICAgICAgICAgICAgfSwgUCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChNYXRoLmNvcyh0ICogTWF0aC5QSSArIE1hdGguUEkpICsgMSkgLyAyXHJcbiAgICAgICAgICAgICAgICB9LCBNID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAqIHRcclxuICAgICAgICAgICAgICAgIH0sIFIgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtTWF0aC5wb3codCAtIDEsIDIpICsgMVxyXG4gICAgICAgICAgICAgICAgfSwgVCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBHKHQuc3RhcnRQb3NpdGlvbiwgMCksIGkgPSBHKHQuZXF1aWxpYnJpdW1Qb3NpdGlvbiwgMSksIG4gPSBHKHQuaW5pdGlhbFZlbG9jaXR5LCAwKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbyA9IEcodC5zcHJpbmdDb25zdGFudCwgLjgpLCBhID0gRyh0LnNwcmluZ0RlY2VsZXJhdGlvbiwgLjkpLCByID0gRyh0LnNwcmluZ01hc3MsIDEwKSwgcyA9ICExO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2s6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCAhPT0gdCAmJiAhcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gLShlIC0gaSkgKiBvLCB1ID0gaCAvIHI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiArPSB1LCBlICs9IG4sIG4gKj0gYSwgTWF0aC5hYnMoZSAtIGkpIDwgLjAwMSAmJiBNYXRoLmFicyhuKSA8IC4wMDEgJiYgKHMgPSAhMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcmVzZXRGcm9tOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHQsIG4gPSAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGdldFZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyA/IGkgOiBlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGNvbXBsZXRlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIEkgPSB7bGluZWFyOiBDLCBlYXNlOiBQLCBlYXNlSW46IE0sIGVhc2VPdXQ6IFJ9LCBMID0gZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoXCJzcHJpbmdcIiA9PSB0KSByZXR1cm4gVChlKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgSih0KSB8fCAoaSA9IElbdF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBuLCBvID0gaSwgYSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGljazogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBvKHQpLCBuID0gdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByZXNldEZyb206IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBnZXRWYWx1ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgY29tcGxldGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA+PSAxICYmIG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIE8gPSBmdW5jdGlvbiAodCwgZSwgaSwgbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRbMF0gPSAxLCB0WzFdID0gMCwgdFsyXSA9IDAsIHRbM10gPSAwLCB0WzRdID0gMCwgdFs1XSA9IDEsIHRbNl0gPSAwLCB0WzddID0gMCwgdFs4XSA9IDAsIHRbOV0gPSAwLCB0WzEwXSA9IDEsIHRbMTFdID0gMCwgdFsxMl0gPSBlLCB0WzEzXSA9IGksIHRbMTRdID0gbiwgdFsxNV0gPSAxXHJcbiAgICAgICAgICAgICAgICB9LCB6ID0gZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0WzBdID0gMSwgdFsxXSA9IDAsIHRbMl0gPSAwLCB0WzNdID0gMCwgdFs0XSA9IDAsIHRbNV0gPSBNYXRoLmNvcyhlKSwgdFs2XSA9IC1NYXRoLnNpbihlKSwgdFs3XSA9IDAsIHRbOF0gPSAwLCB0WzldID0gTWF0aC5zaW4oZSksIHRbMTBdID0gTWF0aC5jb3MoZSksIHRbMTFdID0gMCwgdFsxMl0gPSAwLCB0WzEzXSA9IDAsIHRbMTRdID0gMCwgdFsxNV0gPSAxXHJcbiAgICAgICAgICAgICAgICB9LCBEID0gZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0WzBdID0gTWF0aC5jb3MoZSksIHRbMV0gPSAwLCB0WzJdID0gTWF0aC5zaW4oZSksIHRbM10gPSAwLCB0WzRdID0gMCwgdFs1XSA9IDEsIHRbNl0gPSAwLCB0WzddID0gMCwgdFs4XSA9IC1NYXRoLnNpbihlKSwgdFs5XSA9IDAsIHRbMTBdID0gTWF0aC5jb3MoZSksIHRbMTFdID0gMCwgdFsxMl0gPSAwLCB0WzEzXSA9IDAsIHRbMTRdID0gMCwgdFsxNV0gPSAxXHJcbiAgICAgICAgICAgICAgICB9LCBBID0gZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0WzBdID0gTWF0aC5jb3MoZSksIHRbMV0gPSAtTWF0aC5zaW4oZSksIHRbMl0gPSAwLCB0WzNdID0gMCwgdFs0XSA9IE1hdGguc2luKGUpLCB0WzVdID0gTWF0aC5jb3MoZSksIHRbNl0gPSAwLCB0WzddID0gMCwgdFs4XSA9IDAsIHRbOV0gPSAwLCB0WzEwXSA9IDEsIHRbMTFdID0gMCwgdFsxMl0gPSAwLCB0WzEzXSA9IDAsIHRbMTRdID0gMCwgdFsxNV0gPSAxXHJcbiAgICAgICAgICAgICAgICB9LCBVID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0WzBdID0gMSwgdFsxXSA9IE1hdGgudGFuKGUpLCB0WzJdID0gMCwgdFszXSA9IDAsIHRbNF0gPSBNYXRoLnRhbihpKSwgdFs1XSA9IDEsIHRbNl0gPSAwLCB0WzddID0gMCwgdFs4XSA9IDAsIHRbOV0gPSAwLCB0WzEwXSA9IDEsIHRbMTFdID0gMCwgdFsxMl0gPSAwLCB0WzEzXSA9IDAsIHRbMTRdID0gMCwgdFsxNV0gPSAxXHJcbiAgICAgICAgICAgICAgICB9LCBIID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0WzBdID0gZSwgdFsxXSA9IDAsIHRbMl0gPSAwLCB0WzNdID0gMCwgdFs0XSA9IDAsIHRbNV0gPSBpLCB0WzZdID0gMCwgdFs3XSA9IDAsIHRbOF0gPSAwLCB0WzldID0gMCwgdFsxMF0gPSAxLCB0WzExXSA9IDAsIHRbMTJdID0gMCwgdFsxM10gPSAwLCB0WzE0XSA9IDAsIHRbMTVdID0gMVxyXG4gICAgICAgICAgICAgICAgfSwgTiA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdFswXSA9IDEsIHRbMV0gPSAwLCB0WzJdID0gMCwgdFszXSA9IDAsIHRbNF0gPSAwLCB0WzVdID0gMSwgdFs2XSA9IDAsIHRbN10gPSAwLCB0WzhdID0gMCwgdFs5XSA9IDAsIHRbMTBdID0gMSwgdFsxMV0gPSAwLCB0WzEyXSA9IDAsIHRbMTNdID0gMCwgdFsxNF0gPSAwLCB0WzE1XSA9IDFcclxuICAgICAgICAgICAgICAgIH0sIEIgPSBmdW5jdGlvbiAodCwgZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVbMF0gPSB0WzBdLCBlWzFdID0gdFsxXSwgZVsyXSA9IHRbMl0sIGVbM10gPSB0WzNdLCBlWzRdID0gdFs0XSwgZVs1XSA9IHRbNV0sIGVbNl0gPSB0WzZdLCBlWzddID0gdFs3XSwgZVs4XSA9IHRbOF0sIGVbOV0gPSB0WzldLCBlWzEwXSA9IHRbMTBdLCBlWzExXSA9IHRbMTFdLCBlWzEyXSA9IHRbMTJdLCBlWzEzXSA9IHRbMTNdLCBlWzE0XSA9IHRbMTRdLCBlWzE1XSA9IHRbMTVdXHJcbiAgICAgICAgICAgICAgICB9LCBGID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbmV3IEZsb2F0MzJBcnJheSgxNiksIGUgPSBuZXcgRmxvYXQzMkFycmF5KDE2KSwgaSA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBOKHQpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHQsIGFzQ1NTOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gXCJtYXRyaXgzZChcIiwgaSA9IDA7IGkgPCAxNTsgKytpKSBlICs9IE1hdGguYWJzKHRbaV0pIDwgMWUtNCA/IFwiMCxcIiA6IHRbaV0udG9GaXhlZCgxMCkgKyBcIixcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICs9IE1hdGguYWJzKHRbMTVdKSA8IDFlLTQgPyBcIjApXCIgOiB0WzE1XS50b0ZpeGVkKDEwKSArIFwiKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGNsZWFyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOKHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRyYW5zbGF0ZTogZnVuY3Rpb24gKG4sIG8sIGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCKHQsIGUpLCBPKGksIG4sIG8sIGEpLCBXKGUsIGksIHQpLCB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvdGF0ZVg6IGZ1bmN0aW9uIChuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQih0LCBlKSwgeihpLCBuKSwgVyhlLCBpLCB0KSwgdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByb3RhdGVZOiBmdW5jdGlvbiAobikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEIodCwgZSksIEQoaSwgbiksIFcoZSwgaSwgdCksIHRoaXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm90YXRlWjogZnVuY3Rpb24gKG4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCKHQsIGUpLCBBKGksIG4pLCBXKGUsIGksIHQpLCB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHNjYWxlOiBmdW5jdGlvbiAobiwgbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEIodCwgZSksIEgoaSwgbiwgbyksIFcoZSwgaSwgdCksIHRoaXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgc2tldzogZnVuY3Rpb24gKG4sIG8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCKHQsIGUpLCBVKGksIG4sIG8pLCBXKGUsIGksIHQpLCB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCBXID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVswXSA9IHRbMF0gKiBlWzBdICsgdFsxXSAqIGVbNF0gKyB0WzJdICogZVs4XSArIHRbM10gKiBlWzEyXSwgaVsxXSA9IHRbMF0gKiBlWzFdICsgdFsxXSAqIGVbNV0gKyB0WzJdICogZVs5XSArIHRbM10gKiBlWzEzXSwgaVsyXSA9IHRbMF0gKiBlWzJdICsgdFsxXSAqIGVbNl0gKyB0WzJdICogZVsxMF0gKyB0WzNdICogZVsxNF0sIGlbM10gPSB0WzBdICogZVszXSArIHRbMV0gKiBlWzddICsgdFsyXSAqIGVbMTFdICsgdFszXSAqIGVbMTVdLCBpWzRdID0gdFs0XSAqIGVbMF0gKyB0WzVdICogZVs0XSArIHRbNl0gKiBlWzhdICsgdFs3XSAqIGVbMTJdLCBpWzVdID0gdFs0XSAqIGVbMV0gKyB0WzVdICogZVs1XSArIHRbNl0gKiBlWzldICsgdFs3XSAqIGVbMTNdLCBpWzZdID0gdFs0XSAqIGVbMl0gKyB0WzVdICogZVs2XSArIHRbNl0gKiBlWzEwXSArIHRbN10gKiBlWzE0XSwgaVs3XSA9IHRbNF0gKiBlWzNdICsgdFs1XSAqIGVbN10gKyB0WzZdICogZVsxMV0gKyB0WzddICogZVsxNV0sIGlbOF0gPSB0WzhdICogZVswXSArIHRbOV0gKiBlWzRdICsgdFsxMF0gKiBlWzhdICsgdFsxMV0gKiBlWzEyXSwgaVs5XSA9IHRbOF0gKiBlWzFdICsgdFs5XSAqIGVbNV0gKyB0WzEwXSAqIGVbOV0gKyB0WzExXSAqIGVbMTNdLCBpWzEwXSA9IHRbOF0gKiBlWzJdICsgdFs5XSAqIGVbNl0gKyB0WzEwXSAqIGVbMTBdICsgdFsxMV0gKiBlWzE0XSwgaVsxMV0gPSB0WzhdICogZVszXSArIHRbOV0gKiBlWzddICsgdFsxMF0gKiBlWzExXSArIHRbMTFdICogZVsxNV0sIGlbMTJdID0gdFsxMl0gKiBlWzBdICsgdFsxM10gKiBlWzRdICsgdFsxNF0gKiBlWzhdICsgdFsxNV0gKiBlWzEyXSwgaVsxM10gPSB0WzEyXSAqIGVbMV0gKyB0WzEzXSAqIGVbNV0gKyB0WzE0XSAqIGVbOV0gKyB0WzE1XSAqIGVbMTNdLCBpWzE0XSA9IHRbMTJdICogZVsyXSArIHRbMTNdICogZVs2XSArIHRbMTRdICogZVsxMF0gKyB0WzE1XSAqIGVbMTRdLCBpWzE1XSA9IHRbMTJdICogZVszXSArIHRbMTNdICogZVs3XSArIHRbMTRdICogZVsxMV0gKyB0WzE1XSAqIGVbMTVdLCBpXHJcbiAgICAgICAgICAgICAgICB9LCBxID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IEYoKSwgbiA9IHtvcGFjaXR5OiBlLCB3aWR0aDogZSwgaGVpZ2h0OiBlfTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogdC5wb3NpdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb246IHQucm90YXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uUG9zdDogdC5yb3RhdGlvblBvc3QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNrZXc6IHQuc2tldyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IHQuc2NhbGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlUG9zdDogdC5zY2FsZVBvc3QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IHQub3BhY2l0eSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHQud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdC5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb24gPyB0aGlzLnBvc2l0aW9uLnNsaWNlKDApIDogZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbiA/IHRoaXMucm90YXRpb24uc2xpY2UoMCkgOiBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uUG9zdDogdGhpcy5yb3RhdGlvblBvc3QgPyB0aGlzLnJvdGF0aW9uUG9zdC5zbGljZSgwKSA6IGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tldzogdGhpcy5za2V3ID8gdGhpcy5za2V3LnNsaWNlKDApIDogZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZTogdGhpcy5zY2FsZSA/IHRoaXMuc2NhbGUuc2xpY2UoMCkgOiBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlUG9zdDogdGhpcy5zY2FsZVBvc3QgPyB0aGlzLnNjYWxlUG9zdC5zbGljZSgwKSA6IGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy53aWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiB0aGlzLm9wYWNpdHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzTWF0cml4OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jbGVhcigpLCB0aGlzLnRyYW5zZm9ybU9yaWdpbiAmJiB0LnRyYW5zbGF0ZSgtdGhpcy50cmFuc2Zvcm1PcmlnaW5bMF0sIC10aGlzLnRyYW5zZm9ybU9yaWdpblsxXSwgLXRoaXMudHJhbnNmb3JtT3JpZ2luWzJdKSwgdGhpcy5zY2FsZSAmJiB0LnNjYWxlKHRoaXMuc2NhbGVbMF0sIHRoaXMuc2NhbGVbMV0pLCB0aGlzLnNrZXcgJiYgdC5za2V3KHRoaXMuc2tld1swXSwgdGhpcy5za2V3WzFdKSwgdGhpcy5yb3RhdGlvbiAmJiAodC5yb3RhdGVYKHRoaXMucm90YXRpb25bMF0pLCB0LnJvdGF0ZVkodGhpcy5yb3RhdGlvblsxXSksIHQucm90YXRlWih0aGlzLnJvdGF0aW9uWzJdKSksIHRoaXMucG9zaXRpb24gJiYgdC50cmFuc2xhdGUodGhpcy5wb3NpdGlvblswXSwgdGhpcy5wb3NpdGlvblsxXSwgdGhpcy5wb3NpdGlvblsyXSksIHRoaXMucm90YXRpb25Qb3N0ICYmICh0LnJvdGF0ZVgodGhpcy5yb3RhdGlvblBvc3RbMF0pLCB0LnJvdGF0ZVkodGhpcy5yb3RhdGlvblBvc3RbMV0pLCB0LnJvdGF0ZVoodGhpcy5yb3RhdGlvblBvc3RbMl0pKSwgdGhpcy5zY2FsZVBvc3QgJiYgdC5zY2FsZSh0aGlzLnNjYWxlUG9zdFswXSwgdGhpcy5zY2FsZVBvc3RbMV0pLCB0aGlzLnRyYW5zZm9ybU9yaWdpbiAmJiB0LnRyYW5zbGF0ZSh0aGlzLnRyYW5zZm9ybU9yaWdpblswXSwgdGhpcy50cmFuc2Zvcm1PcmlnaW5bMV0sIHRoaXMudHJhbnNmb3JtT3JpZ2luWzJdKSwgdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0aWVzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5vcGFjaXR5ID0gdGhpcy5vcGFjaXR5LCBuLndpZHRoID0gdGhpcy53aWR0aCArIFwicHhcIiwgbi5oZWlnaHQgPSB0aGlzLmhlaWdodCArIFwicHhcIiwgblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgaiA9IGZ1bmN0aW9uICh0LCBpLCBuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB0LCBhID0gaSwgciA9IG4sIHMgPSBhLnBvc2l0aW9uICE9PSBlLCBoID0gYS5yb3RhdGlvbiAhPT0gZSwgdSA9IGEucm90YXRpb25Qb3N0ICE9PSBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsID0gYS5zY2FsZSAhPT0gZSwgcCA9IGEuc2tldyAhPT0gZSwgYyA9IGEud2lkdGggIT09IGUsIGQgPSBhLmhlaWdodCAhPT0gZSwgZiA9IGEub3BhY2l0eSAhPT0gZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0d2VlbjogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhLnBvc2l0aW9uWzBdIC0gby5wb3NpdGlvblswXSwgaSA9IGEucG9zaXRpb25bMV0gLSBvLnBvc2l0aW9uWzFdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gYS5wb3NpdGlvblsyXSAtIG8ucG9zaXRpb25bMl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5wb3NpdGlvblswXSA9IG8ucG9zaXRpb25bMF0gKyB0ICogZSwgci5wb3NpdGlvblsxXSA9IG8ucG9zaXRpb25bMV0gKyB0ICogaSwgci5wb3NpdGlvblsyXSA9IG8ucG9zaXRpb25bMl0gKyB0ICogblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyA9IGEucm90YXRpb25bMF0gLSBvLnJvdGF0aW9uWzBdLCBtID0gYS5yb3RhdGlvblsxXSAtIG8ucm90YXRpb25bMV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBhLnJvdGF0aW9uWzJdIC0gby5yb3RhdGlvblsyXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnJvdGF0aW9uWzBdID0gby5yb3RhdGlvblswXSArIHQgKiBfLCByLnJvdGF0aW9uWzFdID0gby5yb3RhdGlvblsxXSArIHQgKiBtLCByLnJvdGF0aW9uWzJdID0gby5yb3RhdGlvblsyXSArIHQgKiBnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2ID0gYS5yb3RhdGlvblBvc3RbMF0gLSBvLnJvdGF0aW9uUG9zdFswXSwgeSA9IGEucm90YXRpb25Qb3N0WzFdIC0gby5yb3RhdGlvblBvc3RbMV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBhLnJvdGF0aW9uUG9zdFsyXSAtIG8ucm90YXRpb25Qb3N0WzJdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIucm90YXRpb25Qb3N0WzBdID0gby5yb3RhdGlvblBvc3RbMF0gKyB0ICogdiwgci5yb3RhdGlvblBvc3RbMV0gPSBvLnJvdGF0aW9uUG9zdFsxXSArIHQgKiB5LCByLnJvdGF0aW9uUG9zdFsyXSA9IG8ucm90YXRpb25Qb3N0WzJdICsgdCAqIHdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBhLnNjYWxlWzBdIC0gby5zY2FsZVswXSwgayA9IGEuc2NhbGVbMV0gLSBvLnNjYWxlWzFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc2NhbGVbMF0gPSBvLnNjYWxlWzBdICsgdCAqIGIsIHIuc2NhbGVbMV0gPSBvLnNjYWxlWzFdICsgdCAqIGtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBhLnNrZXdbMF0gLSBvLnNrZXdbMF0sIFMgPSBhLnNrZXdbMV0gLSBvLnNrZXdbMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5za2V3WzBdID0gby5za2V3WzBdICsgdCAqIHgsIHIuc2tld1sxXSA9IG8uc2tld1sxXSArIHQgKiBTXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBFID0gYS53aWR0aCAtIG8ud2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci53aWR0aCA9IG8ud2lkdGggKyB0ICogRVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQyA9IGEuaGVpZ2h0IC0gby5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5oZWlnaHQgPSBvLmhlaWdodCArIHQgKiBDXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBQID0gYS5vcGFjaXR5IC0gby5vcGFjaXR5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIub3BhY2l0eSA9IG8ub3BhY2l0eSArIHQgKiBQXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGFzTWF0cml4OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5hc01hdHJpeCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGdldFByb3BlcnRpZXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmdldFByb3BlcnRpZXMoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBzZXRSZXZlcnNlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gYSwgYSA9IHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIFYgPSBmdW5jdGlvbiAodCwgaSwgbiwgbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhID0gdCgwLCBGKCkpLCByID0gaSwgcyA9IG4sIGggPSBvLCB1ID0gITE7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHdlZW46IGZ1bmN0aW9uIChpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ICYmIChpID0gMSAtIGkpLCBhLmNsZWFyKCksIGEgPSB0KGksIGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzLndpZHRoIC0gci53aWR0aCwgbyA9IHMuaGVpZ2h0IC0gci5oZWlnaHQsIGwgPSBzLm9wYWNpdHkgLSByLm9wYWNpdHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLndpZHRoICE9PSBlICYmIChoLndpZHRoID0gci53aWR0aCArIGkgKiBuKSwgcy5oZWlnaHQgIT09IGUgJiYgKGguaGVpZ2h0ID0gci5oZWlnaHQgKyBpICogbyksIHMub3BhY2l0eSAhPT0gZSAmJiAoaC5vcGFjaXR5ID0gci5vcGFjaXR5ICsgaSAqIGwpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGFzTWF0cml4OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBnZXRQcm9wZXJ0aWVzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaC5nZXRQcm9wZXJ0aWVzKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgc2V0UmV2ZXJzZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9ICEwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCBHID0gZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2YgdCA/IGUgOiB0XHJcbiAgICAgICAgICAgICAgICB9LCBYID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgaSAmJiAobiA9IFwicGVyc3BlY3RpdmUoXCIgKyBpICsgXCJweCkgXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhID0gZS5hc0NTUygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHQuc3R5bGVbb10gPSBuICsgYVxyXG4gICAgICAgICAgICAgICAgfSwgWSA9IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBlKSB0LnN0eWxlW2ldID0gZVtpXVxyXG4gICAgICAgICAgICAgICAgfSwgSiA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdFxyXG4gICAgICAgICAgICAgICAgfSwgJCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0KSByZXR1cm4gdDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdCkgZVtpXSA9IHRbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJldHVybiBzLmNyZWF0ZU1hdHJpeCA9IEYsIHMuc2V0RWxlbWVudFRyYW5zZm9ybSA9IFgsIHNcclxuICAgICAgICB9KCksIGwgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgZSwgaSwgbiwgbykge1xyXG4gICAgICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpIHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KTsgZWxzZSBpZiAoIXQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgdmFyIGEsIHIgPSB0LmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYSA9IHIuZ2V0SW1hZ2VEYXRhKGUsIGksIG4sIG8pXHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmFibGUgdG8gYWNjZXNzIGxvY2FsIGltYWdlIGRhdGE6IFwiICsgcylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5hYmxlIHRvIGFjY2VzcyBpbWFnZSBkYXRhOiBcIiArIHMpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiBlKGUsIG4sIG8sIGEsIHIsIHMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghKGlzTmFOKHMpIHx8IHMgPCAxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHMgfD0gMDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IHQoZSwgbiwgbywgYSwgcik7XHJcbiAgICAgICAgICAgICAgICAgICAgaCA9IGkoaCwgbiwgbywgYSwgciwgcyksIGUuZ2V0Q29udGV4dChcIjJkXCIpLnB1dEltYWdlRGF0YShoLCBuLCBvKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiBpKHQsIGUsIGksIHIsIHMsIGgpIHtcclxuICAgICAgICAgICAgICAgIHZhciB1LCBsLCBwLCBjLCBkLCBmLCBfLCBtLCBnLCB2LCB5LCB3LCBiLCBrLCB4LCBTLCBFLCBDLCBQLCBNLCBSLCBULCBJLCBMLCBPID0gdC5kYXRhLCB6ID0gaCArIGggKyAxLFxyXG4gICAgICAgICAgICAgICAgICAgIEQgPSByIC0gMSwgQSA9IHMgLSAxLCBVID0gaCArIDEsIEggPSBVICogKFUgKyAxKSAvIDIsIE4gPSBuZXcgbiwgQiA9IE47XHJcbiAgICAgICAgICAgICAgICBmb3IgKHAgPSAxOyBwIDwgejsgcCsrKSBpZiAoQiA9IEIubmV4dCA9IG5ldyBuLCBwID09IFUpIHZhciBGID0gQjtcclxuICAgICAgICAgICAgICAgIEIubmV4dCA9IE47XHJcbiAgICAgICAgICAgICAgICB2YXIgVyA9IG51bGwsIHEgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgXyA9IGYgPSAwO1xyXG4gICAgICAgICAgICAgICAgdmFyIGogPSBvW2hdLCBWID0gYVtoXTtcclxuICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBzOyBsKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKFMgPSBFID0gQyA9IFAgPSBtID0gZyA9IHYgPSB5ID0gMCwgdyA9IFUgKiAoTSA9IE9bZl0pLCBiID0gVSAqIChSID0gT1tmICsgMV0pLCBrID0gVSAqIChUID0gT1tmICsgMl0pLCB4ID0gVSAqIChJID0gT1tmICsgM10pLCBtICs9IEggKiBNLCBnICs9IEggKiBSLCB2ICs9IEggKiBULCB5ICs9IEggKiBJLCBCID0gTiwgcCA9IDA7IHAgPCBVOyBwKyspIEIuciA9IE0sIEIuZyA9IFIsIEIuYiA9IFQsIEIuYSA9IEksIEIgPSBCLm5leHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChwID0gMTsgcCA8IFU7IHArKykgYyA9IGYgKyAoKEQgPCBwID8gRCA6IHApIDw8IDIpLCBtICs9IChCLnIgPSBNID0gT1tjXSkgKiAoTCA9IFUgLSBwKSwgZyArPSAoQi5nID0gUiA9IE9bYyArIDFdKSAqIEwsIHYgKz0gKEIuYiA9IFQgPSBPW2MgKyAyXSkgKiBMLCB5ICs9IChCLmEgPSBJID0gT1tjICsgM10pICogTCwgUyArPSBNLCBFICs9IFIsIEMgKz0gVCwgUCArPSBJLCBCID0gQi5uZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoVyA9IE4sIHEgPSBGLCB1ID0gMDsgdSA8IHI7IHUrKykgT1tmICsgM10gPSBJID0geSAqIGogPj4gViwgMCAhPSBJID8gKEkgPSAyNTUgLyBJLCBPW2ZdID0gKG0gKiBqID4+IFYpICogSSwgT1tmICsgMV0gPSAoZyAqIGogPj4gVikgKiBJLCBPW2YgKyAyXSA9ICh2ICogaiA+PiBWKSAqIEkpIDogT1tmXSA9IE9bZiArIDFdID0gT1tmICsgMl0gPSAwLCBtIC09IHcsIGcgLT0gYiwgdiAtPSBrLCB5IC09IHgsIHcgLT0gVy5yLCBiIC09IFcuZywgayAtPSBXLmIsIHggLT0gVy5hLCBjID0gXyArICgoYyA9IHUgKyBoICsgMSkgPCBEID8gYyA6IEQpIDw8IDIsIFMgKz0gVy5yID0gT1tjXSwgRSArPSBXLmcgPSBPW2MgKyAxXSwgQyArPSBXLmIgPSBPW2MgKyAyXSwgUCArPSBXLmEgPSBPW2MgKyAzXSwgbSArPSBTLCBnICs9IEUsIHYgKz0gQywgeSArPSBQLCBXID0gVy5uZXh0LCB3ICs9IE0gPSBxLnIsIGIgKz0gUiA9IHEuZywgayArPSBUID0gcS5iLCB4ICs9IEkgPSBxLmEsIFMgLT0gTSwgRSAtPSBSLCBDIC09IFQsIFAgLT0gSSwgcSA9IHEubmV4dCwgZiArPSA0O1xyXG4gICAgICAgICAgICAgICAgICAgIF8gKz0gclxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yICh1ID0gMDsgdSA8IHI7IHUrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoRSA9IEMgPSBQID0gUyA9IGcgPSB2ID0geSA9IG0gPSAwLCBmID0gdSA8PCAyLCB3ID0gVSAqIChNID0gT1tmXSksIGIgPSBVICogKFIgPSBPW2YgKyAxXSksIGsgPSBVICogKFQgPSBPW2YgKyAyXSksIHggPSBVICogKEkgPSBPW2YgKyAzXSksIG0gKz0gSCAqIE0sIGcgKz0gSCAqIFIsIHYgKz0gSCAqIFQsIHkgKz0gSCAqIEksIEIgPSBOLCBwID0gMDsgcCA8IFU7IHArKykgQi5yID0gTSwgQi5nID0gUiwgQi5iID0gVCwgQi5hID0gSSwgQiA9IEIubmV4dDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGQgPSByLCBwID0gMTsgcCA8PSBoOyBwKyspIGYgPSBkICsgdSA8PCAyLCBtICs9IChCLnIgPSBNID0gT1tmXSkgKiAoTCA9IFUgLSBwKSwgZyArPSAoQi5nID0gUiA9IE9bZiArIDFdKSAqIEwsIHYgKz0gKEIuYiA9IFQgPSBPW2YgKyAyXSkgKiBMLCB5ICs9IChCLmEgPSBJID0gT1tmICsgM10pICogTCwgUyArPSBNLCBFICs9IFIsIEMgKz0gVCwgUCArPSBJLCBCID0gQi5uZXh0LCBwIDwgQSAmJiAoZCArPSByKTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGYgPSB1LCBXID0gTiwgcSA9IEYsIGwgPSAwOyBsIDwgczsgbCsrKSBjID0gZiA8PCAyLCBPW2MgKyAzXSA9IEkgPSB5ICogaiA+PiBWLCBJID4gMCA/IChJID0gMjU1IC8gSSwgT1tjXSA9IChtICogaiA+PiBWKSAqIEksIE9bYyArIDFdID0gKGcgKiBqID4+IFYpICogSSwgT1tjICsgMl0gPSAodiAqIGogPj4gVikgKiBJKSA6IE9bY10gPSBPW2MgKyAxXSA9IE9bYyArIDJdID0gMCwgbSAtPSB3LCBnIC09IGIsIHYgLT0gaywgeSAtPSB4LCB3IC09IFcuciwgYiAtPSBXLmcsIGsgLT0gVy5iLCB4IC09IFcuYSwgYyA9IHUgKyAoKGMgPSBsICsgVSkgPCBBID8gYyA6IEEpICogciA8PCAyLCBtICs9IFMgKz0gVy5yID0gT1tjXSwgZyArPSBFICs9IFcuZyA9IE9bYyArIDFdLCB2ICs9IEMgKz0gVy5iID0gT1tjICsgMl0sIHkgKz0gUCArPSBXLmEgPSBPW2MgKyAzXSwgVyA9IFcubmV4dCwgdyArPSBNID0gcS5yLCBiICs9IFIgPSBxLmcsIGsgKz0gVCA9IHEuYiwgeCArPSBJID0gcS5hLCBTIC09IE0sIEUgLT0gUiwgQyAtPSBULCBQIC09IEksIHEgPSBxLm5leHQsIGYgKz0gclxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gbigpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuciA9IDAsIHRoaXMuZyA9IDAsIHRoaXMuYiA9IDAsIHRoaXMuYSA9IDAsIHRoaXMubmV4dCA9IG51bGxcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIG8gPSBbNTEyLCA1MTIsIDQ1NiwgNTEyLCAzMjgsIDQ1NiwgMzM1LCA1MTIsIDQwNSwgMzI4LCAyNzEsIDQ1NiwgMzg4LCAzMzUsIDI5MiwgNTEyLCA0NTQsIDQwNSwgMzY0LCAzMjgsIDI5OCwgMjcxLCA0OTYsIDQ1NiwgNDIwLCAzODgsIDM2MCwgMzM1LCAzMTIsIDI5MiwgMjczLCA1MTIsIDQ4MiwgNDU0LCA0MjgsIDQwNSwgMzgzLCAzNjQsIDM0NSwgMzI4LCAzMTIsIDI5OCwgMjg0LCAyNzEsIDI1OSwgNDk2LCA0NzUsIDQ1NiwgNDM3LCA0MjAsIDQwNCwgMzg4LCAzNzQsIDM2MCwgMzQ3LCAzMzUsIDMyMywgMzEyLCAzMDIsIDI5MiwgMjgyLCAyNzMsIDI2NSwgNTEyLCA0OTcsIDQ4MiwgNDY4LCA0NTQsIDQ0MSwgNDI4LCA0MTcsIDQwNSwgMzk0LCAzODMsIDM3MywgMzY0LCAzNTQsIDM0NSwgMzM3LCAzMjgsIDMyMCwgMzEyLCAzMDUsIDI5OCwgMjkxLCAyODQsIDI3OCwgMjcxLCAyNjUsIDI1OSwgNTA3LCA0OTYsIDQ4NSwgNDc1LCA0NjUsIDQ1NiwgNDQ2LCA0MzcsIDQyOCwgNDIwLCA0MTIsIDQwNCwgMzk2LCAzODgsIDM4MSwgMzc0LCAzNjcsIDM2MCwgMzU0LCAzNDcsIDM0MSwgMzM1LCAzMjksIDMyMywgMzE4LCAzMTIsIDMwNywgMzAyLCAyOTcsIDI5MiwgMjg3LCAyODIsIDI3OCwgMjczLCAyNjksIDI2NSwgMjYxLCA1MTIsIDUwNSwgNDk3LCA0ODksIDQ4MiwgNDc1LCA0NjgsIDQ2MSwgNDU0LCA0NDcsIDQ0MSwgNDM1LCA0MjgsIDQyMiwgNDE3LCA0MTEsIDQwNSwgMzk5LCAzOTQsIDM4OSwgMzgzLCAzNzgsIDM3MywgMzY4LCAzNjQsIDM1OSwgMzU0LCAzNTAsIDM0NSwgMzQxLCAzMzcsIDMzMiwgMzI4LCAzMjQsIDMyMCwgMzE2LCAzMTIsIDMwOSwgMzA1LCAzMDEsIDI5OCwgMjk0LCAyOTEsIDI4NywgMjg0LCAyODEsIDI3OCwgMjc0LCAyNzEsIDI2OCwgMjY1LCAyNjIsIDI1OSwgMjU3LCA1MDcsIDUwMSwgNDk2LCA0OTEsIDQ4NSwgNDgwLCA0NzUsIDQ3MCwgNDY1LCA0NjAsIDQ1NiwgNDUxLCA0NDYsIDQ0MiwgNDM3LCA0MzMsIDQyOCwgNDI0LCA0MjAsIDQxNiwgNDEyLCA0MDgsIDQwNCwgNDAwLCAzOTYsIDM5MiwgMzg4LCAzODUsIDM4MSwgMzc3LCAzNzQsIDM3MCwgMzY3LCAzNjMsIDM2MCwgMzU3LCAzNTQsIDM1MCwgMzQ3LCAzNDQsIDM0MSwgMzM4LCAzMzUsIDMzMiwgMzI5LCAzMjYsIDMyMywgMzIwLCAzMTgsIDMxNSwgMzEyLCAzMTAsIDMwNywgMzA0LCAzMDIsIDI5OSwgMjk3LCAyOTQsIDI5MiwgMjg5LCAyODcsIDI4NSwgMjgyLCAyODAsIDI3OCwgMjc1LCAyNzMsIDI3MSwgMjY5LCAyNjcsIDI2NSwgMjYzLCAyNjEsIDI1OV0sXHJcbiAgICAgICAgICAgICAgICBhID0gWzksIDExLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNF07XHJcbiAgICAgICAgICAgIHJldHVybiBlXHJcbiAgICAgICAgfSgpO1xyXG4gICAgICAgIEhUTUxDYW52YXNFbGVtZW50LnByb3RvdHlwZS50b0Jsb2IgfHwgT2JqZWN0LmRlZmluZVByb3BlcnR5KEhUTUxDYW52YXNFbGVtZW50LnByb3RvdHlwZSwgXCJ0b0Jsb2JcIiwge1xyXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKHQsIGUsIGkpIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSBhdG9iKHRoaXMudG9EYXRhVVJMKGUsIGkpLnNwbGl0KFwiLFwiKVsxXSksIG8gPSBuLmxlbmd0aCwgYSA9IG5ldyBVaW50OEFycmF5KG8pLCByID0gMDsgciA8IG87IHIrKykgYVtyXSA9IG4uY2hhckNvZGVBdChyKTtcclxuICAgICAgICAgICAgICAgIHQobmV3IEJsb2IoW2FdLCB7dHlwZTogZSB8fCBcImltYWdlL3BuZ1wifSkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB2YXIgcCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGVbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG4uZW51bWVyYWJsZSA9IG4uZW51bWVyYWJsZSB8fCAhMSwgbi5jb25maWd1cmFibGUgPSAhMCwgXCJ2YWx1ZVwiIGluIG4gJiYgKG4ud3JpdGFibGUgPSAhMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBuLmtleSwgbilcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlLCBpLCBuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgJiYgdChlLnByb3RvdHlwZSwgaSksIG4gJiYgdChlLCBuKSwgZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KCksIGMgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB0XHJcbiAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgdC5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIHQgIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIHRcclxuICAgICAgICAgICAgfSwgZCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2YgdC5kYXRhc2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGUsIGksIG4gPSB7fSwgbyA9IHQuYXR0cmlidXRlcztcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGUgaW4gbykgby5oYXNPd25Qcm9wZXJ0eShlKSAmJiBvW2VdLm5hbWUgJiYgL15kYXRhLVthLXpfXFwtXFxkXSokL2kudGVzdChvW2VdLm5hbWUpICYmIChpID0gZihvW2VdLm5hbWUuc3Vic3RyKDUpKSwgbltpXSA9IG9bZV0udmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5kYXRhc2V0XHJcbiAgICAgICAgICAgIH0sIGYgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHQucmVwbGFjZSgvXFwtLi9nLCBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmNoYXJBdCgxKS50b1VwcGVyQ2FzZSgpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCBfID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBbXSwgaSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQuYXR0cmlidXRlcyksIG4gPSBpLmxlbmd0aCwgbyA9IDA7IG8gPCBuOyBvKyspIGUucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogaVtvXS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpW29dLnZhbHVlXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlXHJcbiAgICAgICAgICAgIH0sIG0gPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICB4OiBcInVuZGVmaW5lZFwiID09IHR5cGVvZiB0Lm9mZnNldFggPyB0LmxheWVyWCA6IHQub2Zmc2V0WCxcclxuICAgICAgICAgICAgICAgICAgICB5OiBcInVuZGVmaW5lZFwiID09IHR5cGVvZiB0Lm9mZnNldFkgPyB0LmxheWVyWSA6IHQub2Zmc2V0WVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBnID0gZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpLCBuID0ge30sIG8gPSBlIHx8IHt9O1xyXG4gICAgICAgICAgICAgICAgZm9yIChpIGluIHQpIHQuaGFzT3duUHJvcGVydHkoaSkgJiYgKG5baV0gPSBcInVuZGVmaW5lZFwiID09IHR5cGVvZiBvW2ldID8gdFtpXSA6IG9baV0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5cclxuICAgICAgICAgICAgfSwgdiA9IHtFU0M6IDI3LCBSRVRVUk46IDEzfSwgeSA9IHtcclxuICAgICAgICAgICAgICAgIERPV046IFtcInRvdWNoc3RhcnRcIiwgXCJwb2ludGVyZG93blwiLCBcIm1vdXNlZG93blwiXSxcclxuICAgICAgICAgICAgICAgIE1PVkU6IFtcInRvdWNobW92ZVwiLCBcInBvaW50ZXJtb3ZlXCIsIFwibW91c2Vtb3ZlXCJdLFxyXG4gICAgICAgICAgICAgICAgVVA6IFtcInRvdWNoZW5kXCIsIFwidG91Y2hjYW5jZWxcIiwgXCJwb2ludGVydXBcIiwgXCJtb3VzZXVwXCJdXHJcbiAgICAgICAgICAgIH0sIHcgPSB7XHJcbiAgICAgICAgICAgICAgICBqcGVnOiBcImltYWdlL2pwZWdcIixcclxuICAgICAgICAgICAgICAgIGpwZzogXCJpbWFnZS9qcGVnXCIsXHJcbiAgICAgICAgICAgICAgICBqcGU6IFwiaW1hZ2UvanBlZ1wiLFxyXG4gICAgICAgICAgICAgICAgcG5nOiBcImltYWdlL3BuZ1wiLFxyXG4gICAgICAgICAgICAgICAgZ2lmOiBcImltYWdlL2dpZlwiLFxyXG4gICAgICAgICAgICAgICAgYm1wOiBcImltYWdlL2JtcFwiXHJcbiAgICAgICAgICAgIH0sIGIgPSAvKFxcLnBuZ3xcXC5ibXB8XFwuZ2lmfFxcLmpwZ3xcXC5qcGV8XFwuanBnfFxcLmpwZWcpJC8sIGsgPSBmdW5jdGlvbiAodCwgZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgKGkuY2xhc3NOYW1lID0gZSksIGlcclxuICAgICAgICAgICAgfSwgeCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XHJcbiAgICAgICAgICAgICAgICBlLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0LmFkZEV2ZW50TGlzdGVuZXIoZSwgaSwgITEpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCBTID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcclxuICAgICAgICAgICAgICAgIGUuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLCBpLCAhMSlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sIEUgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGUgPSB0LmNoYW5nZWRUb3VjaGVzID8gdC5jaGFuZ2VkVG91Y2hlc1swXSA6IHQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoZSkgcmV0dXJuIHt4OiBlLnBhZ2VYLCB5OiBlLnBhZ2VZfVxyXG4gICAgICAgICAgICB9LCBDID0gZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpID0gLjUsIG4gPSAuNSwgbyA9IE1hdGguUEkgLyAxODAgKiBlLCBhID0gTWF0aC5jb3MobyksIHIgPSBNYXRoLnNpbihvKSwgcyA9IHQueCwgaCA9IHQueSxcclxuICAgICAgICAgICAgICAgICAgICB1ID0gdC54ICsgdC53aWR0aCwgbCA9IHQueSArIHQuaGVpZ2h0LCBwID0gYSAqIChzIC0gaSkgKyByICogKGggLSBuKSArIGksXHJcbiAgICAgICAgICAgICAgICAgICAgYyA9IGEgKiAoaCAtIG4pIC0gciAqIChzIC0gaSkgKyBuLCBkID0gYSAqICh1IC0gaSkgKyByICogKGwgLSBuKSArIGksIGYgPSBhICogKGwgLSBuKSAtIHIgKiAodSAtIGkpICsgbjtcclxuICAgICAgICAgICAgICAgIHAgPD0gZCA/ICh0LnggPSBwLCB0LndpZHRoID0gZCAtIHApIDogKHQueCA9IGQsIHQud2lkdGggPSBwIC0gZCksIGMgPD0gZiA/ICh0LnkgPSBjLCB0LmhlaWdodCA9IGYgLSBjKSA6ICh0LnkgPSBmLCB0LmhlaWdodCA9IGMgLSBmKVxyXG4gICAgICAgICAgICB9LCBQID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBlID0gRSh0KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlLnggLT0gd2luZG93LnBhZ2VYT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LCBlLnkgLT0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AsIGVcclxuICAgICAgICAgICAgfSwgTSA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHQuc2xpY2UoMSlcclxuICAgICAgICAgICAgfSwgUiA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHQuc2xpY2UoMSlcclxuICAgICAgICAgICAgfSwgVCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdFt0Lmxlbmd0aCAtIDFdXHJcbiAgICAgICAgICAgIH0sIEkgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KGUsIE1hdGgubWluKGksIHQpKVxyXG4gICAgICAgICAgICB9LCBMID0gZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghZSkgcmV0dXJuICExO1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlLmxlbmd0aDsgaSsrKSBpZiAoZVtpXSA9PT0gdCkgcmV0dXJuICEwO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICExXHJcbiAgICAgICAgICAgIH0sIE8gPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IGUgPyBhcmd1bWVudHNbMV0gOiBcIlBPU1RcIiwgbiA9IGFyZ3VtZW50c1syXSxcclxuICAgICAgICAgICAgICAgICAgICBvID0gYXJndW1lbnRzWzNdLCBhID0gYXJndW1lbnRzWzRdLCByID0gYXJndW1lbnRzWzVdLCBzID0gYXJndW1lbnRzWzZdLCBoID0gbmV3IFhNTEh0dHBSZXF1ZXN0O1xyXG4gICAgICAgICAgICAgICAgYSAmJiBoLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKFwicHJvZ3Jlc3NcIiwgZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBhKHQubG9hZGVkLCB0LnRvdGFsKVxyXG4gICAgICAgICAgICAgICAgfSksIGgub3BlbihpLCB0LCAhMCksIG8gJiYgbyhoLCBuKSwgaC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKDQgPT09IGgucmVhZHlTdGF0ZSAmJiBoLnN0YXR1cyA+PSAyMDAgJiYgaC5zdGF0dXMgPCAzMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBoLnJlc3BvbnNlVGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0Lmxlbmd0aCkgcmV0dXJuIHZvaWQgcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5pbmRleE9mKFwiQ29udGVudC1MZW5ndGhcIikgIT09IC0xKSByZXR1cm4gdm9pZCBzKFwiZmlsZS10b28tYmlnXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHZvaWQgMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBKU09OLnBhcnNlKGgucmVzcG9uc2VUZXh0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwib2JqZWN0XCIgPT09IChcInVuZGVmaW5lZFwiID09IHR5cGVvZiBlID8gXCJ1bmRlZmluZWRcIiA6IGMoZSkpICYmIFwiZmFpbHVyZVwiID09PSBlLnN0YXR1cykgcmV0dXJuIHZvaWQgcyhlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByKGUgfHwgdClcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKDQgPT09IGgucmVhZHlTdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHZvaWQgMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBKU09OLnBhcnNlKGgucmVzcG9uc2VUZXh0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwib2JqZWN0XCIgPT09IChcInVuZGVmaW5lZFwiID09IHR5cGVvZiBuID8gXCJ1bmRlZmluZWRcIiA6IGMobikpICYmIFwiZmFpbHVyZVwiID09PSBuLnN0YXR1cykgcmV0dXJuIHZvaWQgcyhuLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzKFwiZmFpbFwiKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIGguc2VuZChuKVxyXG4gICAgICAgICAgICB9LCB6ID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgIHQgJiYgKHQuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gXCJcIiwgdC5zdHlsZS50cmFuc2Zvcm0gPSBcIlwiKVxyXG4gICAgICAgICAgICB9LCBEID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0IC8gMWU2XHJcbiAgICAgICAgICAgIH0sIEEgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdCA9IFtdLCBlID0gdm9pZCAwLCBpID0gdm9pZCAwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChlIGluIHcpIHcuaGFzT3duUHJvcGVydHkoZSkgJiYgKGkgPSB3W2VdLCB0LmluZGV4T2YoaSkgPT0gLTEgJiYgdC5wdXNoKGkpKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0XHJcbiAgICAgICAgICAgIH0sIFUgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW1hZ2UvanBlZ1wiID09PSB0XHJcbiAgICAgICAgICAgIH0sIEggPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGUgPSB2b2lkIDA7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGUgaW4gdykgaWYgKHcuaGFzT3duUHJvcGVydHkoZSkgJiYgd1tlXSA9PT0gdCkgcmV0dXJuIGU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdFxyXG4gICAgICAgICAgICB9LCBOID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBlID0gdm9pZCAwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChlIGluIHcpIGlmICh3Lmhhc093blByb3BlcnR5KGUpICYmIHQuaW5kZXhPZih3W2VdKSAhPT0gLTEpIHJldHVybiB3W2VdO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgfSwgQiA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5zcGxpdChcIi9cIikucG9wKCkuc3BsaXQoXCI/XCIpLnNoaWZ0KClcclxuICAgICAgICAgICAgfSwgRiA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gZSA/IGFyZ3VtZW50c1sxXSA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKGkgKyB0KS5zbGljZSgtaS5sZW5ndGgpXHJcbiAgICAgICAgICAgIH0sIFcgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHQuZ2V0RnVsbFllYXIoKSArIFwiLVwiICsgRih0LmdldE1vbnRoKCkgKyAxLCBcIjAwXCIpICsgXCItXCIgKyBGKHQuZ2V0RGF0ZSgpLCBcIjAwXCIpICsgXCJfXCIgKyBGKHQuZ2V0SG91cnMoKSwgXCIwMFwiKSArIFwiLVwiICsgRih0LmdldE1pbnV0ZXMoKSwgXCIwMFwiKSArIFwiLVwiICsgRih0LmdldFNlY29uZHMoKSwgXCIwMFwiKVxyXG4gICAgICAgICAgICB9LCBxID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiID09IHR5cGVvZiB0Lm5hbWUgPyBXKG5ldyBEYXRlKSArIFwiLlwiICsgSChqKHQpKSA6IHQubmFtZVxyXG4gICAgICAgICAgICB9LCBqID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0LnR5cGUgfHwgXCJpbWFnZS9qcGVnXCJcclxuICAgICAgICAgICAgfSwgViA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXCJzdHJpbmdcIiAhPSB0eXBlb2YgdCkgcmV0dXJuIFcobmV3IERhdGUpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGUgPSBCKHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuc3BsaXQoXCIuXCIpLnNoaWZ0KClcclxuICAgICAgICAgICAgfSwgRyA9IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShbdF0sIGUsIHt0eXBlOiB0LnR5cGUsIGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKX0pXHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubGFzdE1vZGlmaWVkID0gbmV3IERhdGUsIHQubmFtZSA9IGUsIHRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgWCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gL15kYXRhOmltYWdlLy50ZXN0KHQpXHJcbiAgICAgICAgICAgIH0sIFkgPSBmdW5jdGlvbiAodCwgZSwgaSwgbiwgbywgYSkge1xyXG4gICAgICAgICAgICAgICAgdCA9IFwiXCIgKyB0ICsgKHQuaW5kZXhPZihcIj9cIikgIT09IC0xID8gXCImXCIgOiBcIj9cIikgKyBcInVybD1cIiArIG47XHJcbiAgICAgICAgICAgICAgICB2YXIgciA9IG5ldyBYTUxIdHRwUmVxdWVzdDtcclxuICAgICAgICAgICAgICAgIHIub3BlbihcIkdFVFwiLCB0LCAhMCksIGUociksIHIucmVzcG9uc2VUeXBlID0gXCJqc29uXCIsIHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImZhaWx1cmVcIiA9PT0gdGhpcy5yZXNwb25zZS5zdGF0dXMgPyB2b2lkIG8odGhpcy5yZXNwb25zZS5tZXNzYWdlKSA6IHZvaWQgSih0aGlzLnJlc3BvbnNlLmJvZHksIGksIGEpXHJcbiAgICAgICAgICAgICAgICB9LCByLnNlbmQoKVxyXG4gICAgICAgICAgICB9LCBKID0gZnVuY3Rpb24gKHQsIGUsIGksIG4pIHtcclxuICAgICAgICAgICAgICAgIHZhciBvID0gbmV3IFhNTEh0dHBSZXF1ZXN0O1xyXG4gICAgICAgICAgICAgICAgby5vcGVuKFwiR0VUXCIsIHQsICEwKSwgZShvKSwgby5yZXNwb25zZVR5cGUgPSBcImJsb2JcIiwgby5vbmxvYWQgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvLnN0YXR1cyA+PSAyMDAgJiYgby5zdGF0dXMgPCAzMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBCKHQpLCByID0gTih0aGlzLnJlc3BvbnNlLnR5cGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiLnRlc3QoYSkgfHwgKGEgKz0gXCIuXCIgKyBIKHIpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBHKHRoaXMucmVzcG9uc2UsIGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpKGd0KHMsIHIpKVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBuKG8uc3RhdHVzICsgXCI6IFwiICsgby5zdGF0dXNUZXh0KVxyXG4gICAgICAgICAgICAgICAgfSwgby5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG4oKVxyXG4gICAgICAgICAgICAgICAgfSwgby5zZW5kKClcclxuICAgICAgICAgICAgfSwgJCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZSA9IHQuc3BsaXQoXCIsXCIpWzFdLCBpID0gZS5yZXBsYWNlKC9cXHMvZywgXCJcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXRvYihpKVxyXG4gICAgICAgICAgICB9LCBaID0gZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAkKHQpLCBuID0gbmV3IEFycmF5QnVmZmVyKGkubGVuZ3RoKSwgbyA9IG5ldyBVaW50OEFycmF5KG4pLCBhID0gMDsgYSA8IGkubGVuZ3RoOyBhKyspIG9bYV0gPSBpLmNoYXJDb2RlQXQoYSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgciA9IHd0KHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCIgPT0gdHlwZW9mIGUgJiYgKGUgPSBXKG5ldyBEYXRlKSArIFwiLlwiICsgSChyKSksIEcoSyhuLCByKSwgZSlcclxuICAgICAgICAgICAgfSwgSyA9IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaSA9IHdpbmRvdy5CbG9iQnVpbGRlciA9IHdpbmRvdy5CbG9iQnVpbGRlciB8fCB3aW5kb3cuV2ViS2l0QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1vekJsb2JCdWlsZGVyIHx8IHdpbmRvdy5NU0Jsb2JCdWlsZGVyO1xyXG4gICAgICAgICAgICAgICAgaWYgKGkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IG5ldyBpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmFwcGVuZCh0KSwgbi5nZXRCbG9iKGUpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJsb2IoW3RdLCB7dHlwZTogZX0pXHJcbiAgICAgICAgICAgIH0sIFEgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG8gPSBcInN0cmluZ1wiICE9IHR5cGVvZiB0IHx8IDAgIT09IHQuaW5kZXhPZihcImRhdGE6aW1hZ2VcIik7XHJcbiAgICAgICAgICAgICAgICBuLnBhcnNlTWV0YURhdGEodCwgZnVuY3Rpb24gKGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHtjYW52YXM6ICEwLCBjcm9zc09yaWdpbjogb307XHJcbiAgICAgICAgICAgICAgICAgICAgZSAmJiAoci5tYXhXaWR0aCA9IGUud2lkdGgsIHIubWF4SGVpZ2h0ID0gZS5oZWlnaHQpLCBhLmV4aWYgJiYgKHIub3JpZW50YXRpb24gPSBhLmV4aWYuZ2V0KFwiT3JpZW50YXRpb25cIikpLCBuKHQsIGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcImVycm9yXCIgPT09IHQudHlwZSA/IHZvaWQgaSgpIDogdm9pZCBpKHQsIGEpXHJcbiAgICAgICAgICAgICAgICAgICAgfSwgcilcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sIHR0ID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcclxuICAgICAgICAgICAgICAgIHZhciBuLCBvLCBhLCByLCBzID0gZSAvIHQ7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcyA8IGkgPyAociA9IGUsIGEgPSByIC8gaSwgbiA9IC41ICogKHQgLSBhKSwgbyA9IDApIDogKGEgPSB0LCByID0gYSAqIGksIG4gPSAwLCBvID0gLjUgKiAoZSAtIHIpKSwge1xyXG4gICAgICAgICAgICAgICAgICAgIHg6IG4sIHk6IG8sIGhlaWdodDogciwgd2lkdGg6IGFcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgZXQgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IGUgPyBhcmd1bWVudHNbMV0gOiB7fSwgbyA9IGFyZ3VtZW50c1syXSwgYSA9IGsoXCJjYW52YXNcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgciA9IG4ucm90YXRpb24sIHMgPSBuLmNyb3AsIGggPSBuLnNpemUsIHUgPSBuLmZpbHRlcnMsIGwgPSBuLm1pblNpemU7XHJcbiAgICAgICAgICAgICAgICBpZiAocykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwID0gciAlIDE4MCAhPT0gMCwgYyA9IHt3aWR0aDogcCA/IHQuaGVpZ2h0IDogdC53aWR0aCwgaGVpZ2h0OiBwID8gdC53aWR0aCA6IHQuaGVpZ2h0fTtcclxuICAgICAgICAgICAgICAgICAgICBzLnggPCAwICYmIChzLnggPSAwKSwgcy55IDwgMCAmJiAocy55ID0gMCksIHMud2lkdGggPiBjLndpZHRoICYmIChzLndpZHRoID0gYy53aWR0aCksIHMuaGVpZ2h0ID4gYy5oZWlnaHQgJiYgKHMuaGVpZ2h0ID0gYy5oZWlnaHQpLCBzLnkgKyBzLmhlaWdodCA+IGMuaGVpZ2h0ICYmIChzLnkgPSBNYXRoLm1heCgwLCBjLmhlaWdodCAtIHMuaGVpZ2h0KSksIHMueCArIHMud2lkdGggPiBjLndpZHRoICYmIChzLnggPSBNYXRoLm1heCgwLCBjLndpZHRoIC0gcy53aWR0aCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkID0gcy54IC8gYy53aWR0aCwgZiA9IHMueSAvIGMuaGVpZ2h0LCBfID0gcy53aWR0aCAvIGMud2lkdGgsIG0gPSBzLmhlaWdodCAvIGMuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIGEud2lkdGggPSBzLndpZHRoLCBhLmhlaWdodCA9IHMuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBnID0gYS5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgOTAgPT09IHIgPyAoZy50cmFuc2xhdGUoLjUgKiBhLndpZHRoLCAuNSAqIGEuaGVpZ2h0KSwgZy5yb3RhdGUoLTkwICogTWF0aC5QSSAvIDE4MCksIGcuZHJhd0ltYWdlKHQsICgxIC0gZikgKiB0LndpZHRoIC0gdC53aWR0aCAqIG0sIHMueCwgcy5oZWlnaHQsIHMud2lkdGgsIC41ICogLWEuaGVpZ2h0LCAuNSAqIC1hLndpZHRoLCBhLmhlaWdodCwgYS53aWR0aCkpIDogMTgwID09PSByID8gKGcudHJhbnNsYXRlKC41ICogYS53aWR0aCwgLjUgKiBhLmhlaWdodCksIGcucm90YXRlKC0xODAgKiBNYXRoLlBJIC8gMTgwKSwgZy5kcmF3SW1hZ2UodCwgKDEgLSAoZCArIF8pKSAqIGMud2lkdGgsICgxIC0gKGYgKyBtKSkgKiBjLmhlaWdodCwgXyAqIGMud2lkdGgsIG0gKiBjLmhlaWdodCwgLjUgKiAtYS53aWR0aCwgLjUgKiAtYS5oZWlnaHQsIGEud2lkdGgsIGEuaGVpZ2h0KSkgOiAyNzAgPT09IHIgPyAoZy50cmFuc2xhdGUoLjUgKiBhLndpZHRoLCAuNSAqIGEuaGVpZ2h0KSwgZy5yb3RhdGUoLTI3MCAqIE1hdGguUEkgLyAxODApLCBnLmRyYXdJbWFnZSh0LCBzLnksICgxIC0gZCkgKiB0LmhlaWdodCAtIHQuaGVpZ2h0ICogXywgcy5oZWlnaHQsIHMud2lkdGgsIC41ICogLWEuaGVpZ2h0LCAuNSAqIC1hLndpZHRoLCBhLmhlaWdodCwgYS53aWR0aCkpIDogZy5kcmF3SW1hZ2UodCwgcy54LCBzLnksIHMud2lkdGgsIHMuaGVpZ2h0LCAwLCAwLCBhLndpZHRoLCBhLmhlaWdodClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBoLndpZHRoIC8gYS53aWR0aCwgeSA9IGguaGVpZ2h0IC8gYS5oZWlnaHQsIHcgPSBNYXRoLm1pbih2LCB5KTtcclxuICAgICAgICAgICAgICAgICAgICBpKGEsIHcsIGgsIGwpLCB1LnNoYXJwZW4gPiAwICYmIG50KGEsIGF0KHUuc2hhcnBlbikpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvKGEpXHJcbiAgICAgICAgICAgIH0sIGl0ID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBlID0gdC5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRJbWFnZURhdGEoMCwgMCwgdC53aWR0aCwgdC5oZWlnaHQpXHJcbiAgICAgICAgICAgIH0sIG50ID0gZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpID0gdC5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICAgICAgICBpLnB1dEltYWdlRGF0YShlKGl0KHQpLCB0LndpZHRoLCB0LmhlaWdodCksIDAsIDApXHJcbiAgICAgICAgICAgIH0sIG90ID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcclxuICAgICAgICAgICAgICAgIHZhciBuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuICAgICAgICAgICAgICAgIG4ud2lkdGggPSB0LCBuLmhlaWdodCA9IGU7XHJcbiAgICAgICAgICAgICAgICB2YXIgbyA9IG4uZ2V0Q29udGV4dChcIjJkXCIpLCBhID0gby5jcmVhdGVJbWFnZURhdGEobi53aWR0aCwgbi5oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgJiYgYS5zZXQoaS5kYXRhKSwgYVxyXG4gICAgICAgICAgICB9LCBhdCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIGksIG4pIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBvID0gWzAsIC0xLCAwLCAtMSwgNSwgLTEsIDAsIC0xLCAwXSwgYSA9IE1hdGgucm91bmQoTWF0aC5zcXJ0KG8ubGVuZ3RoKSksIHIgPSAuNSAqIGEgfCAwLCBzID0gb3QoaSwgbiksIGggPSBzLmRhdGEsIHUgPSBlLmRhdGEsIGwgPSBuLCBwID0gdm9pZCAwOyBsLS07KSBmb3IgKHAgPSBpOyBwLS07KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSBsLCBkID0gcCwgZiA9IDQgKiAobCAqIGkgKyBwKSwgXyA9IDAsIG0gPSAwLCBnID0gMCwgdiA9IDAsIHkgPSAwOyB5IDwgYTsgeSsrKSBmb3IgKHZhciB3ID0gMDsgdyA8IGE7IHcrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBjICsgeSAtIHIsIGsgPSBkICsgdyAtIHI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiA+PSAwICYmIGIgPCBuICYmIGsgPj0gMCAmJiBrIDwgaSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gNCAqIChiICogaSArIGspLCBTID0gb1t5ICogYSArIHddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gKz0gdVt4XSAqIFMsIG0gKz0gdVt4ICsgMV0gKiBTLCBnICs9IHVbeCArIDJdICogUywgdiArPSB1W3ggKyAzXSAqIFNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoW2ZdID0gXyAqIHQgKyB1W2ZdICogKDEgLSB0KSwgaFtmICsgMV0gPSBtICogdCArIHVbZiArIDFdICogKDEgLSB0KSwgaFtmICsgMl0gPSBnICogdCArIHVbZiArIDJdICogKDEgLSB0KSwgaFtmICsgM10gPSB1W2YgKyAzXVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBydCA9IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaSA9IE1hdGguYWJzKHQud2lkdGggLSBlLndpZHRoKSwgbiA9IE1hdGguYWJzKHQuaGVpZ2h0IC0gZS5oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KGksIG4pXHJcbiAgICAgICAgICAgIH0sIHN0ID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBodCh0LCAxKVxyXG4gICAgICAgICAgICB9LCBodCA9IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXQpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgdmFyIG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLCBvID0gbi5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbi53aWR0aCA9IHQud2lkdGgsIG4uaGVpZ2h0ID0gdC5oZWlnaHQsIG8uZHJhd0ltYWdlKHQsIDAsIDApLCBlID4gMCAmJiAxICE9PSBlICYmIGkobiwgZSwge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBNYXRoLnJvdW5kKHQud2lkdGggKiBlKSxcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IE1hdGgucm91bmQodC5oZWlnaHQgKiBlKVxyXG4gICAgICAgICAgICAgICAgfSwge3dpZHRoOiAwLCBoZWlnaHQ6IDB9KSwgblxyXG4gICAgICAgICAgICB9LCB1dCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdC53aWR0aCAmJiB0LmhlaWdodFxyXG4gICAgICAgICAgICB9LCBsdCA9IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaSA9IGUuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICAgICAgICAgICAgdXQoZSkgPyBpLmRyYXdJbWFnZSh0LCAwLCAwLCBlLndpZHRoLCBlLmhlaWdodCkgOiAoZS53aWR0aCA9IHQud2lkdGgsIGUuaGVpZ2h0ID0gdC5oZWlnaHQsIGkuZHJhd0ltYWdlKHQsIDAsIDApKVxyXG4gICAgICAgICAgICB9LCBwdCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICBsKHQsIDAsIDAsIHQud2lkdGgsIHQuaGVpZ2h0LCAzKVxyXG4gICAgICAgICAgICB9LCBjdCA9IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodC53aWR0aCwgMTApID49IGUud2lkdGggJiYgcGFyc2VJbnQodC5oZWlnaHQsIDEwKSA+PSBlLmhlaWdodFxyXG4gICAgICAgICAgICB9LCBkdCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge3g6IHQueCAqIGUsIHk6IHQueSAqIGksIHdpZHRoOiB0LndpZHRoICogZSwgaGVpZ2h0OiB0LmhlaWdodCAqIGl9XHJcbiAgICAgICAgICAgIH0sIGZ0ID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7eDogdC54IC8gZSwgeTogdC55IC8gaSwgd2lkdGg6IHQud2lkdGggLyBlLCBoZWlnaHQ6IHQuaGVpZ2h0IC8gaX1cclxuICAgICAgICAgICAgfSwgX3QgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHQgJiYgXCJcIiAhPT0gdC52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHQudmFsdWUgPSBcIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodC52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmb3JtXCIpLCBuID0gdC5wYXJlbnROb2RlLCBvID0gdC5uZXh0U2libGluZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaS5hcHBlbmRDaGlsZCh0KSwgaS5yZXNldCgpLCBvID8gbi5pbnNlcnRCZWZvcmUodCwgbykgOiBuLmFwcGVuZENoaWxkKHQpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBtdCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvYmplY3RcIiA9PT0gKFwidW5kZWZpbmVkXCIgPT0gdHlwZW9mIHZhbHVlID8gXCJ1bmRlZmluZWRcIiA6IGModmFsdWUpKSAmJiBudWxsICE9PSB2YWx1ZSA/IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodCkpIDogdFxyXG4gICAgICAgICAgICB9LCBndCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gZSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXQpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgdmFyIG4gPSB0LnNsaWNlKDAsIHQuc2l6ZSwgaSB8fCB0LnR5cGUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG4ubmFtZSA9IHQubmFtZSwgbi5sYXN0TW9kaWZpZWQgPSBuZXcgRGF0ZSh0Lmxhc3RNb2RpZmllZCksIG5cclxuICAgICAgICAgICAgfSwgdnQgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGUgPSBtdCh0KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlLmlucHV0LmZpbGUgPSBndCh0LmlucHV0LmZpbGUpLCBlLm91dHB1dC5pbWFnZSA9IHN0KHQub3V0cHV0LmltYWdlKSwgZVxyXG4gICAgICAgICAgICB9LCB5dCA9IGZ1bmN0aW9uICh0LCBpLCBuKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiBpID8gdC50b0RhdGFVUkwoaSwgVShpKSAmJiBcIm51bWJlclwiID09IHR5cGVvZiBuID8gbiAvIDEwMCA6IGUpIDogbnVsbFxyXG4gICAgICAgICAgICB9LCB3dCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXQpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgdmFyIGUgPSB0LnN1YnN0cigwLCAxNikubWF0Y2goL14uKzsvKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlLmxlbmd0aCA/IGVbMF0uc3Vic3RyaW5nKDUsIGVbMF0ubGVuZ3RoIC0gMSkgOiBudWxsXHJcbiAgICAgICAgICAgIH0sIGJ0ID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSBlID8gYXJndW1lbnRzWzFdIDogW10sIG4gPSBhcmd1bWVudHNbMl0sIG8gPSBhcmd1bWVudHNbM10sXHJcbiAgICAgICAgICAgICAgICAgICAgYSA9IGFyZ3VtZW50c1s0XSwgciA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyOiBtdCh0LnNlcnZlciksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGE6IG10KHQubWV0YSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0LmlucHV0Lm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0LmlucHV0LnR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiB0LmlucHV0LnNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdC5pbnB1dC53aWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdC5pbnB1dC5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogdC5pbnB1dC5maWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBMKFwiaW5wdXRcIiwgaSkgJiYgIWEgJiYgKHIuaW5wdXQuaW1hZ2UgPSB5dCh0LmlucHV0LmltYWdlLCB0LmlucHV0LnR5cGUpKSwgTChcIm91dHB1dFwiLCBpKSAmJiAoci5vdXRwdXQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbyA/IFYodC5pbnB1dC5uYW1lKSArIFwiLlwiICsgbyA6IHQuaW5wdXQubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiB3W29dIHx8IHQuaW5wdXQudHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogdC5vdXRwdXQud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB0Lm91dHB1dC5oZWlnaHRcclxuICAgICAgICAgICAgICAgIH0sIHIub3V0cHV0LmltYWdlID0geXQodC5vdXRwdXQuaW1hZ2UsIHIub3V0cHV0LnR5cGUsIG4pLCByLm91dHB1dC50eXBlID0gd3Qoci5vdXRwdXQuaW1hZ2UpLCBcImltYWdlL3BuZ1wiID09PSByLm91dHB1dC50eXBlICYmIChyLm91dHB1dC5uYW1lID0gVihyLmlucHV0Lm5hbWUpICsgXCIucG5nXCIpKSwgTChcImFjdGlvbnNcIiwgaSkgJiYgKHIuYWN0aW9ucyA9IG10KHQuYWN0aW9ucykpLCByXHJcbiAgICAgICAgICAgIH0sIGt0ID0gZnVuY3Rpb24gKHQsIGksIG4pIHtcclxuICAgICAgICAgICAgICAgIHZhciBvID0gdC5vdXRwdXQuaW1hZ2UsIGEgPSBuID8gVih0LmlucHV0Lm5hbWUpICsgXCIuXCIgKyBuIDogdC5pbnB1dC5uYW1lLCByID0gd1tuXSB8fCB0LmlucHV0LnR5cGU7XHJcbiAgICAgICAgICAgICAgICBcImltYWdlL3BuZ1wiID09PSByICYmIChhID0gVih0LmlucHV0Lm5hbWUpICsgXCIucG5nXCIpLCBvLnRvQmxvYihmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcIm1zU2F2ZUJsb2JcIiBpbiB3aW5kb3cubmF2aWdhdG9yKSByZXR1cm4gdm9pZCB3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IodCwgYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAod2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMKS5jcmVhdGVPYmplY3RVUkwodCksIGkgPSBrKFwiYVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIiwgaS5kb3dubG9hZCA9IGEsIGkuaHJlZiA9IGUsIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaSksIGkuY2xpY2soKSwgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaSksICh3aW5kb3cuVVJMIHx8IHdpbmRvdy53ZWJraXRVUkwpLnJldm9rZU9iamVjdFVSTChlKVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIDApXHJcbiAgICAgICAgICAgICAgICB9LCByLCBcIm51bWJlclwiID09IHR5cGVvZiBpID8gaSAvIDEwMCA6IGUpXHJcbiAgICAgICAgICAgIH0sIHh0ID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcclxuICAgICAgICAgICAgICAgIHZhciBuID0gaS5xdWVyeVNlbGVjdG9yKHQpO1xyXG4gICAgICAgICAgICAgICAgbiAmJiAobi5zdHlsZS5kaXNwbGF5ID0gZSA/IFwiXCIgOiBcIm5vbmVcIilcclxuICAgICAgICAgICAgfSwgU3QgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpXHJcbiAgICAgICAgICAgIH0sIEV0ID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgIHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KVxyXG4gICAgICAgICAgICB9LCBDdCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZSA9IGsoXCJkaXZcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5wYXJlbnROb2RlICYmICh0Lm5leHRTaWJsaW5nID8gdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLCB0Lm5leHRTaWJsaW5nKSA6IHQucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChlKSksIGUuYXBwZW5kQ2hpbGQodCksIGVcclxuICAgICAgICAgICAgfSwgUHQgPSBmdW5jdGlvbiAodCwgZSwgaSwgbikge1xyXG4gICAgICAgICAgICAgICAgdmFyIG8gPSAobiAtIDkwKSAqIE1hdGguUEkgLyAxODA7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge3g6IHQgKyBpICogTWF0aC5jb3MobyksIHk6IGUgKyBpICogTWF0aC5zaW4obyl9XHJcbiAgICAgICAgICAgIH0sIE10ID0gZnVuY3Rpb24gKHQsIGUsIGksIG4sIG8pIHtcclxuICAgICAgICAgICAgICAgIHZhciBhID0gUHQodCwgZSwgaSwgbyksIHIgPSBQdCh0LCBlLCBpLCBuKSwgcyA9IG8gLSBuIDw9IDE4MCA/IFwiMFwiIDogXCIxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgaCA9IFtcIk1cIiwgYS54LCBhLnksIFwiQVwiLCBpLCBpLCAwLCBzLCAwLCByLngsIHIueV0uam9pbihcIiBcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaFxyXG4gICAgICAgICAgICB9LCBSdCA9IGZ1bmN0aW9uICh0LCBlLCBpLCBuKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gTXQodCwgZSwgaSwgMCwgMzYwICogbilcclxuICAgICAgICAgICAgfSwgVHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBuOiBmdW5jdGlvbiAodCwgZSwgaSwgbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbywgYSwgciwgcywgaCwgdSwgbCwgcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgPSB0LnkgKyB0LmhlaWdodCwgbyA9IEkoZS55LCAwLCByKSwgciAtIG8gPCBpLm1pbi5oZWlnaHQgJiYgKG8gPSByIC0gaS5taW4uaGVpZ2h0KSwgaCA9IG4gPyAociAtIG8pIC8gbiA6IHQud2lkdGgsIGggPCBpLm1pbi53aWR0aCAmJiAoaCA9IGkubWluLndpZHRoLCBvID0gciAtIGggKiBuKSwgbCA9IC41ICogKGggLSB0LndpZHRoKSwgcyA9IHQueCAtIGwsIGEgPSB0LnggKyB0LndpZHRoICsgbCwgKHMgPCAwIHx8IE1hdGgucm91bmQoYSkgPiBNYXRoLnJvdW5kKGkud2lkdGgpKSAmJiAocCA9IE1hdGgubWluKHQueCwgaS53aWR0aCAtICh0LnggKyB0LndpZHRoKSksIHMgPSB0LnggLSBwLCBhID0gdC54ICsgdC53aWR0aCArIHAsIGggPSBhIC0gcywgdSA9IGggKiBuLCBvID0gciAtIHUpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBhIC0gcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogciAtIG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHM6IGZ1bmN0aW9uICh0LCBlLCBpLCBuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvLCBhLCByLCBzLCBoLCB1LCBsLCBwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyA9IHQueSwgciA9IEkoZS55LCBvLCBpLmhlaWdodCksIHIgLSBvIDwgaS5taW4uaGVpZ2h0ICYmIChyID0gbyArIGkubWluLmhlaWdodCksIGggPSBuID8gKHIgLSBvKSAvIG4gOiB0LndpZHRoLCBoIDwgaS5taW4ud2lkdGggJiYgKGggPSBpLm1pbi53aWR0aCwgciA9IG8gKyBoICogbiksIGwgPSAuNSAqIChoIC0gdC53aWR0aCksIHMgPSB0LnggLSBsLCBhID0gdC54ICsgdC53aWR0aCArIGwsIChzIDwgMCB8fCBNYXRoLnJvdW5kKGEpID4gTWF0aC5yb3VuZChpLndpZHRoKSkgJiYgKHAgPSBNYXRoLm1pbih0LngsIGkud2lkdGggLSAodC54ICsgdC53aWR0aCkpLCBzID0gdC54IC0gcCwgYSA9IHQueCArIHQud2lkdGggKyBwLCBoID0gYSAtIHMsIHUgPSBoICogbiwgciA9IG8gKyB1KSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IG8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYSAtIHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHIgLSBvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCBlOiBmdW5jdGlvbiAodCwgZSwgaSwgbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbywgYSwgciwgcywgaCwgdSwgbCwgcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMgPSB0LngsIGEgPSBJKGUueCwgcywgaS53aWR0aCksIGEgLSBzIDwgaS5taW4ud2lkdGggJiYgKGEgPSBzICsgaS5taW4ud2lkdGgpLCB1ID0gbiA/IChhIC0gcykgKiBuIDogdC5oZWlnaHQsIHUgPCBpLm1pbi5oZWlnaHQgJiYgKHUgPSBpLm1pbi5oZWlnaHQsIGEgPSBzICsgdSAvIG4pLCBsID0gLjUgKiAodSAtIHQuaGVpZ2h0KSwgbyA9IHQueSAtIGwsIHIgPSB0LnkgKyB0LmhlaWdodCArIGwsIChvIDwgMCB8fCBNYXRoLnJvdW5kKHIpID4gTWF0aC5yb3VuZChpLmhlaWdodCkpICYmIChwID0gTWF0aC5taW4odC55LCBpLmhlaWdodCAtICh0LnkgKyB0LmhlaWdodCkpLCBvID0gdC55IC0gcCwgciA9IHQueSArIHQuaGVpZ2h0ICsgcCwgdSA9IHIgLSBvLCBoID0gdSAvIG4sIGEgPSBzICsgaCksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGEgLSBzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByIC0gb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgdzogZnVuY3Rpb24gbih0LCBlLCBpLCBvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhLCByLCBzLCBoLCBuLCB1LCBsLCBwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciA9IHQueCArIHQud2lkdGgsIGggPSBJKGUueCwgMCwgciksIHIgLSBoIDwgaS5taW4ud2lkdGggJiYgKGggPSByIC0gaS5taW4ud2lkdGgpLCB1ID0gbyA/IChyIC0gaCkgKiBvIDogdC5oZWlnaHQsIHUgPCBpLm1pbi5oZWlnaHQgJiYgKHUgPSBpLm1pbi5oZWlnaHQsIGggPSByIC0gdSAvIG8pLCBsID0gLjUgKiAodSAtIHQuaGVpZ2h0KSwgYSA9IHQueSAtIGwsIHMgPSB0LnkgKyB0LmhlaWdodCArIGwsIChhIDwgMCB8fCBNYXRoLnJvdW5kKHMpID4gTWF0aC5yb3VuZChpLmhlaWdodCkpICYmIChwID0gTWF0aC5taW4odC55LCBpLmhlaWdodCAtICh0LnkgKyB0LmhlaWdodCkpLCBhID0gdC55IC0gcCwgcyA9IHQueSArIHQuaGVpZ2h0ICsgcCwgdSA9IHMgLSBhLCBuID0gdSAvIG8sIGggPSByIC0gbiksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHIgLSBoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzIC0gYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgbmU6IGZ1bmN0aW9uICh0LCBlLCBpLCBuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvLCBhLCByLCBzLCBoLCB1LCBsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyA9IHQueCwgciA9IHQueSArIHQuaGVpZ2h0LCBhID0gSShlLngsIHMsIGkud2lkdGgpLCBhIC0gcyA8IGkubWluLndpZHRoICYmIChhID0gcyArIGkubWluLndpZHRoKSwgdSA9IG4gPyAoYSAtIHMpICogbiA6IEkociAtIGUueSwgaS5taW4uaGVpZ2h0LCByKSwgdSA8IGkubWluLmhlaWdodCAmJiAodSA9IGkubWluLmhlaWdodCwgYSA9IHMgKyB1IC8gbiksIG8gPSB0LnkgLSAodSAtIHQuaGVpZ2h0KSwgKG8gPCAwIHx8IE1hdGgucm91bmQocikgPiBNYXRoLnJvdW5kKGkuaGVpZ2h0KSkgJiYgKGwgPSBNYXRoLm1pbih0LnksIGkuaGVpZ2h0IC0gKHQueSArIHQuaGVpZ2h0KSksIG8gPSB0LnkgLSBsLCB1ID0gciAtIG8sIGggPSB1IC8gbiwgYSA9IHMgKyBoKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IG8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYSAtIHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHIgLSBvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCBzZTogZnVuY3Rpb24gKHQsIGUsIGksIG4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8sIGEsIHIsIHMsIGgsIHUsIGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzID0gdC54LCBvID0gdC55LCBhID0gSShlLngsIHMsIGkud2lkdGgpLCBhIC0gcyA8IGkubWluLndpZHRoICYmIChhID0gcyArIGkubWluLndpZHRoKSwgdSA9IG4gPyAoYSAtIHMpICogbiA6IEkoZS55IC0gdC55LCBpLm1pbi5oZWlnaHQsIGkuaGVpZ2h0IC0gbyksIHUgPCBpLm1pbi5oZWlnaHQgJiYgKHUgPSBpLm1pbi5oZWlnaHQsIGEgPSBzICsgdSAvIG4pLCByID0gdC55ICsgdC5oZWlnaHQgKyAodSAtIHQuaGVpZ2h0KSwgKG8gPCAwIHx8IE1hdGgucm91bmQocikgPiBNYXRoLnJvdW5kKGkuaGVpZ2h0KSkgJiYgKGwgPSBNYXRoLm1pbih0LnksIGkuaGVpZ2h0IC0gKHQueSArIHQuaGVpZ2h0KSksIHIgPSB0LnkgKyB0LmhlaWdodCArIGwsIHUgPSByIC0gbywgaCA9IHUgLyBuLCBhID0gcyArIGgpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBhIC0gcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogciAtIG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHN3OiBmdW5jdGlvbiAodCwgZSwgaSwgbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbywgYSwgciwgcywgaCwgdSwgbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPSB0LnggKyB0LndpZHRoLCBvID0gdC55LCBzID0gSShlLngsIDAsIGEpLCBhIC0gcyA8IGkubWluLndpZHRoICYmIChzID0gYSAtIGkubWluLndpZHRoKSwgdSA9IG4gPyAoYSAtIHMpICogbiA6IEkoZS55IC0gdC55LCBpLm1pbi5oZWlnaHQsIGkuaGVpZ2h0IC0gbyksIHUgPCBpLm1pbi5oZWlnaHQgJiYgKHUgPSBpLm1pbi5oZWlnaHQsIHMgPSBhIC0gdSAvIG4pLCByID0gdC55ICsgdC5oZWlnaHQgKyAodSAtIHQuaGVpZ2h0KSwgKG8gPCAwIHx8IE1hdGgucm91bmQocikgPiBNYXRoLnJvdW5kKGkuaGVpZ2h0KSkgJiYgKGwgPSBNYXRoLm1pbih0LnksIGkuaGVpZ2h0IC0gKHQueSArIHQuaGVpZ2h0KSksIHIgPSB0LnkgKyB0LmhlaWdodCArIGwsIHUgPSByIC0gbywgaCA9IHUgLyBuLCBzID0gYSAtIGgpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBhIC0gcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogciAtIG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIG53OiBmdW5jdGlvbiAodCwgZSwgaSwgbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbywgYSwgciwgcywgaCwgdSwgbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPSB0LnggKyB0LndpZHRoLCByID0gdC55ICsgdC5oZWlnaHQsIHMgPSBJKGUueCwgMCwgYSksIGEgLSBzIDwgaS5taW4ud2lkdGggJiYgKHMgPSBhIC0gaS5taW4ud2lkdGgpLCB1ID0gbiA/IChhIC0gcykgKiBuIDogSShyIC0gZS55LCBpLm1pbi5oZWlnaHQsIHIpLCB1IDwgaS5taW4uaGVpZ2h0ICYmICh1ID0gaS5taW4uaGVpZ2h0LCBzID0gYSAtIHUgLyBuKSwgbyA9IHQueSAtICh1IC0gdC5oZWlnaHQpLCAobyA8IDAgfHwgTWF0aC5yb3VuZChyKSA+IE1hdGgucm91bmQoaS5oZWlnaHQpKSAmJiAobCA9IE1hdGgubWluKHQueSwgaS5oZWlnaHQgLSAodC55ICsgdC5oZWlnaHQpKSwgbyA9IHQueSAtIGwsIHUgPSByIC0gbywgaCA9IHUgLyBuLCBzID0gYSAtIGgpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBhIC0gcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogciAtIG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSBlID8gYXJndW1lbnRzWzBdIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdCh0aGlzLCBuKSwgdGhpcy5fZWxlbWVudCA9IGksIHRoaXMuX2ludGVyYWN0aW9uID0gbnVsbCwgdGhpcy5fbWluV2lkdGggPSAxLCB0aGlzLl9taW5IZWlnaHQgPSAxLCB0aGlzLl9yYXRpbyA9IG51bGwsIHRoaXMuX3JlY3QgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuX3NwYWNlID0ge3dpZHRoOiAwLCBoZWlnaHQ6IDB9LCB0aGlzLl9yZWN0Q2hhbmdlZCA9ICExLCB0aGlzLl9pbml0KClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwKG4sIFt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJfaW5pdFwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc05hbWUgPSBcInNsaW0tY3JvcC1hcmVhXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGsoXCJkaXZcIiwgXCJncmlkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgaW4gaSkgaWYgKGkuaGFzT3duUHJvcGVydHkoZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGsoXCJidXR0b25cIiwgZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZChuKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBrKFwiYnV0dG9uXCIsIFwiY1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQobyksIHgoZG9jdW1lbnQsIHkuRE9XTiwgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcInJlc2V0XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcmFjdGlvbiA9IG51bGwsIHRoaXMuX3JlY3QgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5fcmVjdENoYW5nZWQgPSAhMCwgdGhpcy5fcmVkcmF3KCksIHRoaXMuX2VsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJjaGFuZ2VcIikpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJyZXNjYWxlXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAhPT0gdCAmJiAodGhpcy5faW50ZXJhY3Rpb24gPSBudWxsLCB0aGlzLl9yZWN0Q2hhbmdlZCA9ICEwLCB0aGlzLl9yZWN0LnggKj0gdCwgdGhpcy5fcmVjdC55ICo9IHQsIHRoaXMuX3JlY3Qud2lkdGggKj0gdCwgdGhpcy5fcmVjdC5oZWlnaHQgKj0gdCwgdGhpcy5fcmVkcmF3KCksIHRoaXMuX2VsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJjaGFuZ2VcIikpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwibGltaXRcIiwgdmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zcGFjZS53aWR0aCA9IHQsIHRoaXMuX3NwYWNlLmhlaWdodCA9IGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIm9mZnNldFwiLCB2YWx1ZTogZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NwYWNlLnggPSB0LCB0aGlzLl9zcGFjZS55ID0gZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwicmVzaXplXCIsIHZhbHVlOiBmdW5jdGlvbiAodCwgZSwgaSwgbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW50ZXJhY3Rpb24gPSBudWxsLCB0aGlzLl9yZWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IEkodCwgMCwgdGhpcy5fc3BhY2Uud2lkdGggLSB0aGlzLl9taW5XaWR0aCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogSShlLCAwLCB0aGlzLl9zcGFjZS5oZWlnaHQgLSB0aGlzLl9taW5IZWlnaHQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBJKGksIHRoaXMuX21pbldpZHRoLCB0aGlzLl9zcGFjZS53aWR0aCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBJKG4sIHRoaXMuX21pbkhlaWdodCwgdGhpcy5fc3BhY2UuaGVpZ2h0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5fcmVjdENoYW5nZWQgPSAhMCwgdGhpcy5fcmVkcmF3KCksIHRoaXMuX2VsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJjaGFuZ2VcIikpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJoYW5kbGVFdmVudFwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodC50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwidG91Y2hzdGFydFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcInBvaW50ZXJkb3duXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwibW91c2Vkb3duXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uU3RhcnREcmFnKHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJ0b3VjaG1vdmVcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJwb2ludGVybW92ZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcIm1vdXNlbW92ZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkRyYWcodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcInRvdWNoZW5kXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwidG91Y2hjYW5jZWxcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJwb2ludGVydXBcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJtb3VzZXVwXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uU3RvcERyYWcodClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vblN0YXJ0RHJhZ1wiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY29udGFpbnModC50YXJnZXQpICYmICh0LnByZXZlbnREZWZhdWx0KCksIHgoZG9jdW1lbnQsIHkuTU9WRSwgdGhpcyksIHgoZG9jdW1lbnQsIHkuVVAsIHRoaXMpLCB0aGlzLl9pbnRlcmFjdGlvbiA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0LnRhcmdldC5jbGFzc05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBQKHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLl9pbnRlcmFjdGlvbi5vZmZzZXQueCAtPSB0aGlzLl9yZWN0LngsIHRoaXMuX2ludGVyYWN0aW9uLm9mZnNldC55IC09IHRoaXMuX3JlY3QueSwgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWRyYWdnaW5nXCIsIFwidHJ1ZVwiKSwgdGhpcy5fcmVkcmF3KCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJfb25EcmFnXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBQKHQpLCBuID0gdGhpcy5faW50ZXJhY3Rpb24udHlwZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY1wiID09PSBuID8gKHRoaXMuX3JlY3QueCA9IEkoZS54IC0gdGhpcy5faW50ZXJhY3Rpb24ub2Zmc2V0LngsIDAsIHRoaXMuX3NwYWNlLndpZHRoIC0gdGhpcy5fcmVjdC53aWR0aCksIHRoaXMuX3JlY3QueSA9IEkoZS55IC0gdGhpcy5faW50ZXJhY3Rpb24ub2Zmc2V0LnksIDAsIHRoaXMuX3NwYWNlLmhlaWdodCAtIHRoaXMuX3JlY3QuaGVpZ2h0KSkgOiBpW25dICYmICh0aGlzLl9yZWN0ID0gaVtuXSh0aGlzLl9yZWN0LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogZS54IC0gdGhpcy5fc3BhY2UueCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBlLnkgLSB0aGlzLl9zcGFjZS55XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLl9zcGFjZS53aWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuX3NwYWNlLmhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW46IHt3aWR0aDogdGhpcy5fbWluV2lkdGgsIGhlaWdodDogdGhpcy5fbWluSGVpZ2h0fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5fcmF0aW8pKSwgdGhpcy5fcmVjdENoYW5nZWQgPSAhMCwgdGhpcy5fZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImlucHV0XCIpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uU3RvcERyYWdcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnByZXZlbnREZWZhdWx0KCksIFMoZG9jdW1lbnQsIHkuTU9WRSwgdGhpcyksIFMoZG9jdW1lbnQsIHkuVVAsIHRoaXMpLCB0aGlzLl9pbnRlcmFjdGlvbiA9IG51bGwsIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1kcmFnZ2luZ1wiLCBcImZhbHNlXCIpLCB0aGlzLl9lbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiY2hhbmdlXCIpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3JlZHJhd1wiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3JlY3RDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBcInRyYW5zbGF0ZShcIiArIHRoaXMuX3JlY3QueCArIFwicHgsXCIgKyB0aGlzLl9yZWN0LnkgKyBcInB4KTtcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmNzc1RleHQgPSBcIlxcblxcdFxcdFxcdFxcdFxcdC13ZWJraXQtdHJhbnNmb3JtOiBcIiArIGUgKyBcIjtcXG5cXHRcXHRcXHRcXHRcXHR0cmFuc2Zvcm06IFwiICsgZSArIFwiO1xcblxcdFxcdFxcdFxcdFxcdHdpZHRoOlwiICsgdGhpcy5fcmVjdC53aWR0aCArIFwicHg7XFxuXFx0XFx0XFx0XFx0XFx0aGVpZ2h0OlwiICsgdGhpcy5fcmVjdC5oZWlnaHQgKyBcInB4O1xcblxcdFxcdFxcdFxcdFwiLCB0aGlzLl9yZWN0Q2hhbmdlZCA9ICExXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcmFjdGlvbiAmJiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Ll9yZWRyYXcoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImRlc3Ryb3lcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludGVyYWN0aW9uID0gITEsIHRoaXMuX3JlY3RDaGFuZ2VkID0gITEsIFMoZG9jdW1lbnQsIHkuRE9XTiwgdGhpcyksIFMoZG9jdW1lbnQsIHkuTU9WRSwgdGhpcyksIFMoZG9jdW1lbnQsIHkuVVAsIHRoaXMpLCBFdCh0aGlzLl9lbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZWxlbWVudFwiLCBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJzcGFjZVwiLCBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zcGFjZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiYXJlYVwiLCBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5fcmVjdC54IC8gdGhpcy5fc3BhY2Uud2lkdGgsIGUgPSB0aGlzLl9yZWN0LnkgLyB0aGlzLl9zcGFjZS5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHRoaXMuX3JlY3Qud2lkdGggLyB0aGlzLl9zcGFjZS53aWR0aCwgbiA9IHRoaXMuX3JlY3QuaGVpZ2h0IC8gdGhpcy5fc3BhY2UuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt4OiB0LCB5OiBlLCB3aWR0aDogaSwgaGVpZ2h0OiBufVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZGlydHlcIiwgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAhPT0gdGhpcy5fcmVjdC54IHx8IDAgIT09IHRoaXMuX3JlY3QueSB8fCAwICE9PSB0aGlzLl9yZWN0LndpZHRoIHx8IDAgIT09IHRoaXMuX3JlY3QuaGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJtaW5XaWR0aFwiLCBzZXQ6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9taW5XaWR0aCA9IE1hdGgubWF4KHQsIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJtaW5IZWlnaHRcIiwgc2V0OiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWluSGVpZ2h0ID0gTWF0aC5tYXgodCwgMSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcInJhdGlvXCIsIHNldDogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JhdGlvID0gdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfV0pLCBuXHJcbiAgICAgICAgICAgICAgICB9KClcclxuICAgICAgICAgICAgfSgpLCBJdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpID0gW1wiaW5wdXRcIiwgXCJjaGFuZ2VcIl0sIG4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IGUgPyBhcmd1bWVudHNbMF0gOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gZSA/IGFyZ3VtZW50c1sxXSA6IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0KHRoaXMsIG4pLCB0aGlzLl9lbGVtZW50ID0gaSwgdGhpcy5fb3B0aW9ucyA9IGcobi5vcHRpb25zKCksIG8pLCB0aGlzLl9yYXRpbyA9IG51bGwsIHRoaXMuX291dHB1dCA9IG51bGwsIHRoaXMuX3JvdGF0aW5nID0gITEsIHRoaXMuX2lucHV0ID0gbnVsbCwgdGhpcy5fcHJldmlldyA9IG51bGwsIHRoaXMuX3ByZXZpZXdCbHVycmVkID0gbnVsbCwgdGhpcy5fYmx1cnJlZFByZXZpZXcgPSAhMSwgdGhpcy5fY3JvcHBlciA9IG51bGwsIHRoaXMuX3N0cmFpZ2h0Q3JvcCA9IG51bGwsIHRoaXMuX3ByZXZpZXdXcmFwcGVyID0gbnVsbCwgdGhpcy5fY3VycmVudFdpbmRvd1NpemUgPSB7fSwgdGhpcy5fYnRuR3JvdXAgPSBudWxsLCB0aGlzLl9tYXNrRnJhbWUgPSBudWxsLCB0aGlzLl9kaXJ0eSA9ICExLCB0aGlzLl93cmFwcGVyUm90YXRpb24gPSAwLCB0aGlzLl93cmFwcGVyU2NhbGUgPSAxLCB0aGlzLl9pbml0KClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwKG4sIFt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJfaW5pdFwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc05hbWUgPSBcInNsaW0taW1hZ2UtZWRpdG9yXCIsIHRoaXMuX2NvbnRhaW5lciA9IGsoXCJkaXZcIiwgXCJzbGltLWNvbnRhaW5lclwiKSwgdGhpcy5fd3JhcHBlciA9IGsoXCJkaXZcIiwgXCJzbGltLXdyYXBwZXJcIiksIHRoaXMuX3N0YWdlID0gayhcImRpdlwiLCBcInNsaW0tc3RhZ2VcIiksIHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9zdGFnZSksIHRoaXMuX2Nyb3BwZXIgPSBuZXcgVHQsIGkuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX2Nyb3BwZXIuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGUsIHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5fc3RhZ2UuYXBwZW5kQ2hpbGQodGhpcy5fY3JvcHBlci5lbGVtZW50KSwgdGhpcy5fcHJldmlld1dyYXBwZXIgPSBrKFwiZGl2XCIsIFwic2xpbS1pbWFnZS1lZGl0b3ItcHJldmlldyBzbGltLWNyb3AtcHJldmlld1wiKSwgdGhpcy5fcHJldmlld0JsdXJyZWQgPSBrKFwiY2FudmFzXCIsIFwic2xpbS1jcm9wLWJsdXJcIiksIHRoaXMuX3ByZXZpZXdXcmFwcGVyLmFwcGVuZENoaWxkKHRoaXMuX3ByZXZpZXdCbHVycmVkKSwgdGhpcy5fd3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLl9wcmV2aWV3V3JhcHBlciksIHRoaXMuX3ByZXZpZXdNYXNrID0gayhcImRpdlwiLCBcInNsaW0tY3JvcC1tYXNrXCIpLCB0aGlzLl9wcmV2aWV3ID0gayhcImltZ1wiKSwgdGhpcy5fcHJldmlld01hc2suYXBwZW5kQ2hpbGQodGhpcy5fcHJldmlldyksIHRoaXMuX2Nyb3BwZXIuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9wcmV2aWV3TWFzayksIHRoaXMuX2J0bkdyb3VwID0gayhcImRpdlwiLCBcInNsaW0tZWRpdG9yLWJ0bi1ncm91cFwiKSwgbi5CdXR0b25zLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IFIoZSksIG4gPSB0Ll9vcHRpb25zW1wiYnV0dG9uXCIgKyBpICsgXCJMYWJlbFwiXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IHQuX29wdGlvbnNbXCJidXR0b25cIiArIGkgKyBcIlRpdGxlXCJdLCBhID0gdC5fb3B0aW9uc1tcImJ1dHRvblwiICsgaSArIFwiQ2xhc3NOYW1lXCJdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gayhcImJ1dHRvblwiLCBcInNsaW0tZWRpdG9yLWJ0biBzbGltLWJ0bi1cIiArIGUgKyAoYSA/IFwiIFwiICsgYSA6IFwiXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmlubmVySFRNTCA9IG4sIHIudGl0bGUgPSBvIHx8IG4sIHIudHlwZSA9IFwiYnV0dG9uXCIsIHIuc2V0QXR0cmlidXRlKFwiZGF0YS1hY3Rpb25cIiwgZSksIHIuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHQpLCB0Ll9idG5Hcm91cC5hcHBlbmRDaGlsZChyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuX3V0aWxzR3JvdXAgPSBrKFwiZGl2XCIsIFwic2xpbS1lZGl0b3ItdXRpbHMtZ3JvdXBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGsoXCJidXR0b25cIiwgXCJzbGltLWVkaXRvci11dGlscy1idG4gc2xpbS1idG4tcm90YXRlXCIgKyAodGhpcy5fb3B0aW9ucy5idXR0b25Sb3RhdGVDbGFzc05hbWUgPyBcIiBcIiArIHRoaXMuX29wdGlvbnMuYnV0dG9uUm90YXRlQ2xhc3NOYW1lIDogXCJcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWFjdGlvblwiLCBcInJvdGF0ZVwiKSwgZS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcyksIGUudGl0bGUgPSB0aGlzLl9vcHRpb25zLmJ1dHRvblJvdGF0ZVRpdGxlLCB0aGlzLl91dGlsc0dyb3VwLmFwcGVuZENoaWxkKGUpLCB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fd3JhcHBlciksIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY29udGFpbmVyKSwgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl91dGlsc0dyb3VwKSwgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9idG5Hcm91cClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImRpcnR5XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXJ0eSA9ICEwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJoYW5kbGVFdmVudFwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodC50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiY2xpY2tcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DbGljayh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiY2hhbmdlXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uR3JpZENoYW5nZSh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiaW5wdXRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25HcmlkSW5wdXQodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcImtleWRvd25cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25LZXlEb3duKHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJyZXNpemVcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25SZXNpemUodClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbktleURvd25cIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQua2V5Q29kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugdi5SRVRVUk46XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpcm0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB2LkVTQzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FuY2VsKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbkNsaWNrXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKFwic2xpbS1idG4tY2FuY2VsXCIpICYmIHRoaXMuX2NhbmNlbCgpLCB0LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoXCJzbGltLWJ0bi1jb25maXJtXCIpICYmIHRoaXMuX2NvbmZpcm0oKSwgdC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKFwic2xpbS1idG4tcm90YXRlXCIpICYmIHRoaXMuX3JvdGF0ZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJfb25SZXNpemVcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRXaW5kb3dTaXplID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5fcmVkcmF3KCksIHRoaXMuX3JlZHJhd0Nyb3BwZXIodGhpcy5fY3JvcHBlci5hcmVhKSwgdGhpcy5fdXBkYXRlV3JhcHBlclNjYWxlKCksIHRoaXMuX3JlZHJhd1dyYXBwZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3JlZHJhd1dyYXBwZXJcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdS5jcmVhdGVNYXRyaXgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2NhbGUodGhpcy5fd3JhcHBlclNjYWxlLCB0aGlzLl93cmFwcGVyU2NhbGUpLCB0LnJvdGF0ZVoodGhpcy5fd3JhcHBlclJvdGF0aW9uICogKE1hdGguUEkgLyAxODApKSwgdS5zZXRFbGVtZW50VHJhbnNmb3JtKHRoaXMuX3ByZXZpZXdXcmFwcGVyLCB0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uR3JpZElucHV0XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWRyYXdDcm9wTWFzaygpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJfb25HcmlkQ2hhbmdlXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWRyYXdDcm9wTWFzaygpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJfdXBkYXRlV3JhcHBlclJvdGF0aW9uXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLm1pblNpemUud2lkdGggPiB0aGlzLl9pbnB1dC5oZWlnaHQgfHwgdGhpcy5fb3B0aW9ucy5taW5TaXplLmhlaWdodCA+IHRoaXMuX2lucHV0LndpZHRoID8gdGhpcy5fd3JhcHBlclJvdGF0aW9uICs9IDE4MCA6IHRoaXMuX3dyYXBwZXJSb3RhdGlvbiArPSA5MFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3VwZGF0ZVdyYXBwZXJTY2FsZVwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLl93cmFwcGVyUm90YXRpb24gJSAxODAgIT09IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5fY29udGFpbmVyLm9mZnNldFdpZHRoLCBpID0gdGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHRoaXMuX3dyYXBwZXIub2Zmc2V0SGVpZ2h0LCBvID0gdGhpcy5fd3JhcHBlci5vZmZzZXRXaWR0aCwgYSA9IGUgLyBuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgKiBvID4gaSAmJiAoYSA9IGkgLyBvKSwgdGhpcy5fd3JhcHBlclNjYWxlID0gYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHRoaXMuX3dyYXBwZXJTY2FsZSA9IDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9jYW5jZWxcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JvdGF0aW5nIHx8IHRoaXMuX2VsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJjYW5jZWxcIikpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJfY29uZmlybVwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9yb3RhdGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5fd3JhcHBlclJvdGF0aW9uICUgMTgwICE9PSAwLCBlID0gdGhpcy5fY3JvcHBlci5hcmVhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZHQoZSwgdCA/IHRoaXMuX2lucHV0LmhlaWdodCA6IHRoaXMuX2lucHV0LndpZHRoLCB0ID8gdGhpcy5faW5wdXQud2lkdGggOiB0aGlzLl9pbnB1dC5oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJjb25maXJtXCIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbjogdGhpcy5fd3JhcHBlclJvdGF0aW9uICUgMzYwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcDogaVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJfcm90YXRlXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3JvdGF0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcm90YXRpbmcgPSAhMCwgdGhpcy5fdXBkYXRlV3JhcHBlclJvdGF0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAxID09PSB0aGlzLnJhdGlvIHx8IG51bGwgPT09IHRoaXMuX3JhdGlvID8gdGhpcy5fY3JvcHBlci5hcmVhIDogbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIEMoZSwgOTApLCB0aGlzLl91cGRhdGVXcmFwcGVyU2NhbGUoKSwgdGhpcy5faGlkZUNyb3BwZXIoKSwgdSh0aGlzLl9wcmV2aWV3V3JhcHBlciwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbjogWzAsIDAsIHRoaXMuX3dyYXBwZXJSb3RhdGlvbiAqIChNYXRoLlBJIC8gMTgwKV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiBbdGhpcy5fd3JhcHBlclNjYWxlLCB0aGlzLl93cmFwcGVyU2NhbGVdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXNpbmc6IFwic3ByaW5nXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmluZ0NvbnN0YW50OiAuOCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nRGVjZWxlcmF0aW9uOiAuNjUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9yZWRyYXdDcm9wcGVyKGUpLCB0Ll9zaG93Q3JvcHBlcigpLCB0Ll9yb3RhdGluZyA9ICExXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3Nob3dDcm9wcGVyXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KHRoaXMuX3N0YWdlLCB7ZWFzaW5nOiBcImVhc2VcIiwgZHVyYXRpb246IDI1MCwgZnJvbU9wYWNpdHk6IDAsIG9wYWNpdHk6IDF9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2hpZGVDcm9wcGVyXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KHRoaXMuX3N0YWdlLCB7ZHVyYXRpb246IDAsIGZyb21PcGFjaXR5OiAwLCBvcGFjaXR5OiAwfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9yZWRyYXdDcm9wTWFza1wiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLCBlID0gdGhpcy5fd3JhcHBlclJvdGF0aW9uICUgMzYwLCBpID0gdGhpcy5fd3JhcHBlclNjYWxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB7d2lkdGg6IHRoaXMuX3dyYXBwZXIub2Zmc2V0V2lkdGgsIGhlaWdodDogdGhpcy5fd3JhcHBlci5vZmZzZXRIZWlnaHR9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSB0aGlzLl9jcm9wcGVyLmFyZWEsIGEgPSB7eDogMCwgeTogMH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID09PSBlID8gKGEueCA9IC1vLngsIGEueSA9IC1vLnkpIDogOTAgPT09IGUgPyAoYS54ID0gLSgxIC0gby55KSwgYS55ID0gLW8ueCkgOiAxODAgPT09IGUgPyAoYS54ID0gLSgxIC0gby54KSwgYS55ID0gLSgxIC0gby55KSkgOiAyNzAgPT09IGUgJiYgKGEueCA9IC1vLnksIGEueSA9IC0oMSAtIG8ueCkpLCBhLnggKj0gbi53aWR0aCwgYS55ICo9IG4uaGVpZ2h0LCBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9tYXNrRnJhbWUpLCB0aGlzLl9tYXNrRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gXCJzY2FsZShcIiArIGkgKyBcIikgcm90YXRlKFwiICsgLWUgKyBcImRlZykgdHJhbnNsYXRlKFwiICsgYS54ICsgXCJweCwgXCIgKyBhLnkgKyBcInB4KTtcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9wcmV2aWV3LnN0eWxlLmNzc1RleHQgPSBcIlxcblxcdFxcdFxcdFxcdFxcdHdpZHRoOiBcIiArIHQuX3ByZXZpZXdTaXplLndpZHRoICsgXCJweDtcXG5cXHRcXHRcXHRcXHRcXHRoZWlnaHQ6IFwiICsgdC5fcHJldmlld1NpemUuaGVpZ2h0ICsgXCJweDtcXG5cXHRcXHRcXHRcXHRcXHQtd2Via2l0LXRyYW5zZm9ybTogXCIgKyBuICsgXCI7XFxuXFx0XFx0XFx0XFx0XFx0dHJhbnNmb3JtOiBcIiArIG4gKyBcIjtcXG5cXHRcXHRcXHRcXHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIm9wZW5cIiwgdmFsdWU6IGZ1bmN0aW9uICh0LCBlLCBpLCBuLCBvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5wdXQgJiYgIXRoaXMuX2RpcnR5ICYmIHRoaXMuX3JhdGlvID09PSBlKSByZXR1cm4gdm9pZCBvKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50V2luZG93U2l6ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuX2RpcnR5ID0gITEsIHRoaXMuX3dyYXBwZXJSb3RhdGlvbiA9IG4gfHwgMCwgdGhpcy5fYmx1cnJlZFByZXZpZXcgPSAhMSwgdGhpcy5fcmF0aW8gPSBlLCB0aGlzLl9wcmV2aWV3U2l6ZSA9IG51bGwsIHRoaXMuX2VsZW1lbnQuc3R5bGUub3BhY2l0eSA9IFwiMFwiLCB0aGlzLl9pbnB1dCA9IHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4gJSAxODAgIT09IDAsIHMgPSBmdChpLCByID8gdC5oZWlnaHQgOiB0LndpZHRoLCByID8gdC53aWR0aCA6IHQuaGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZpZXcub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuX3ByZXZpZXcub25sb2FkID0gbnVsbCwgYS5fY3JvcHBlci5yYXRpbyA9IGEucmF0aW8sIGEuX3JlZHJhdygpLCBhLl9yZWRyYXdDcm9wcGVyKHMpLCBvKCksIGEuX2VsZW1lbnQuc3R5bGUub3BhY2l0eSA9IFwiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuX3ByZXZpZXcuc3JjID0gXCJcIiwgdGhpcy5fcHJldmlldy5zcmMgPSBodCh0aGlzLl9pbnB1dCwgTWF0aC5taW4odGhpcy5fY29udGFpbmVyLm9mZnNldFdpZHRoIC8gdGhpcy5faW5wdXQud2lkdGgsIHRoaXMuX2NvbnRhaW5lci5vZmZzZXRIZWlnaHQgLyB0aGlzLl9pbnB1dC5oZWlnaHQpICogdGhpcy5fb3B0aW9ucy5kZXZpY2VQaXhlbFJhdGlvKS50b0RhdGFVUkwoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3JlZHJhd0Nyb3BwZXJcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuX3dyYXBwZXJSb3RhdGlvbiAlIDE4MCAhPT0gMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZSA/IHRoaXMuX2lucHV0LmhlaWdodCAvIHRoaXMuX2lucHV0LndpZHRoIDogdGhpcy5faW5wdXQud2lkdGggLyB0aGlzLl9pbnB1dC5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHRoaXMuX3dyYXBwZXIub2Zmc2V0V2lkdGgsIG8gPSB0aGlzLl93cmFwcGVyLm9mZnNldEhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gdGhpcy5fY29udGFpbmVyLm9mZnNldFdpZHRoLCByID0gdGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVdyYXBwZXJTY2FsZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB0aGlzLl93cmFwcGVyU2NhbGUgKiAoZSA/IG8gOiBuKSwgaCA9IHRoaXMuX3dyYXBwZXJTY2FsZSAqIChlID8gbiA6IG8pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBlID8gLjUgKiAoYSAtIHMpIDogdGhpcy5fd3JhcHBlci5vZmZzZXRMZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBlID8gLjUgKiAociAtIGgpIDogdGhpcy5fd3JhcHBlci5vZmZzZXRUb3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFnZS5zdHlsZS5jc3NUZXh0ID0gXCJcXG5cXHRcXHRcXHRcXHRsZWZ0OlwiICsgdSArIFwicHg7XFxuXFx0XFx0XFx0XFx0dG9wOlwiICsgbCArIFwicHg7XFxuXFx0XFx0XFx0XFx0d2lkdGg6XCIgKyBzICsgXCJweDtcXG5cXHRcXHRcXHRcXHRoZWlnaHQ6XCIgKyBoICsgXCJweDtcXG5cXHRcXHRcXHRcIiwgdGhpcy5fY3JvcHBlci5saW1pdChzLCBzIC8gaSksIHRoaXMuX2Nyb3BwZXIub2Zmc2V0KHUgKyB0aGlzLl9lbGVtZW50Lm9mZnNldExlZnQsIGwgKyB0aGlzLl9lbGVtZW50Lm9mZnNldFRvcCksIHRoaXMuX2Nyb3BwZXIubWluV2lkdGggPSB0aGlzLl93cmFwcGVyU2NhbGUgKiB0aGlzLl9vcHRpb25zLm1pblNpemUud2lkdGggKiB0aGlzLnNjYWxhciwgdGhpcy5fY3JvcHBlci5taW5IZWlnaHQgPSB0aGlzLl93cmFwcGVyU2NhbGUgKiB0aGlzLl9vcHRpb25zLm1pblNpemUuaGVpZ2h0ICogdGhpcy5zY2FsYXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gdCA/IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiB0LnggKiBzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHQueSAqIGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHQud2lkdGggKiBzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdC5oZWlnaHQgKiBoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogdHQocywgaCwgdGhpcy5fcmF0aW8gfHwgaCAvIHMpLCB0aGlzLl9jcm9wcGVyLnJlc2l6ZShwLngsIHAueSwgcC53aWR0aCwgcC5oZWlnaHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJfcmVkcmF3XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX2lucHV0LmhlaWdodCAvIHRoaXMuX2lucHV0LndpZHRoLCBlID0gdGhpcy5fY29udGFpbmVyLmNsaWVudFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLl9jb250YWluZXIuY2xpZW50SGVpZ2h0LCBuID0gZSwgbyA9IG4gKiB0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA+IGkgJiYgKG8gPSBpLCBuID0gbyAvIHQpLCBuID0gTWF0aC5yb3VuZChuKSwgbyA9IE1hdGgucm91bmQobyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IChlIC0gbikgLyAyLCByID0gKGkgLSBvKSAvIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl93cmFwcGVyLnN0eWxlLmNzc1RleHQgPSBcIlxcblxcdFxcdFxcdFxcdGxlZnQ6XCIgKyBhICsgXCJweDtcXG5cXHRcXHRcXHRcXHR0b3A6XCIgKyByICsgXCJweDtcXG5cXHRcXHRcXHRcXHR3aWR0aDpcIiArIG4gKyBcInB4O1xcblxcdFxcdFxcdFxcdGhlaWdodDpcIiArIG8gKyBcInB4O1xcblxcdFxcdFxcdFwiLCB0aGlzLl9wcmV2aWV3Qmx1cnJlZC5zdHlsZS5jc3NUZXh0ID0gXCJcXG5cXHRcXHRcXHRcXHR3aWR0aDpcIiArIG4gKyBcInB4O1xcblxcdFxcdFxcdFxcdGhlaWdodDpcIiArIG8gKyBcInB4O1xcblxcdFxcdFxcdFwiLCB0aGlzLl9wcmV2aWV3LnN0eWxlLmNzc1RleHQgPSBcIlxcblxcdFxcdFxcdFxcdHdpZHRoOlwiICsgbiArIFwicHg7XFxuXFx0XFx0XFx0XFx0aGVpZ2h0OlwiICsgbyArIFwicHg7XFxuXFx0XFx0XFx0XCIsIHRoaXMuX3ByZXZpZXdTaXplID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5fYmx1cnJlZFByZXZpZXcgfHwgKHRoaXMuX3ByZXZpZXdCbHVycmVkLndpZHRoID0gMzAwLCB0aGlzLl9wcmV2aWV3Qmx1cnJlZC5oZWlnaHQgPSB0aGlzLl9wcmV2aWV3Qmx1cnJlZC53aWR0aCAqIHQsIGx0KHRoaXMuX2lucHV0LCB0aGlzLl9wcmV2aWV3Qmx1cnJlZCksIHB0KHRoaXMuX3ByZXZpZXdCbHVycmVkLCAzKSwgdGhpcy5fYmx1cnJlZFByZXZpZXcgPSAhMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcInNob3dcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSBlID8gYXJndW1lbnRzWzBdIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRXaW5kb3dTaXplLndpZHRoID09PSB3aW5kb3cuaW5uZXJXaWR0aCAmJiB0aGlzLl9jdXJyZW50V2luZG93U2l6ZS5oZWlnaHQgPT09IHdpbmRvdy5pbm5lckhlaWdodCB8fCAodGhpcy5fcmVkcmF3KCksIHRoaXMuX3JlZHJhd0Nyb3BwZXIodGhpcy5fY3JvcHBlci5hcmVhKSksIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMpLCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5fd3JhcHBlclJvdGF0aW9uICogKE1hdGguUEkgLyAxODApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSh0aGlzLl9wcmV2aWV3V3JhcHBlciwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21Sb3RhdGlvbjogWzAsIDAsIGldLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiBbMCwgMCwgaV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVBvc2l0aW9uOiBbMCwgMCwgMF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IFswLCAwLCAwXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tT3BhY2l0eTogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21TY2FsZTogW3RoaXMuX3dyYXBwZXJTY2FsZSAtIC4wMiwgdGhpcy5fd3JhcHBlclNjYWxlIC0gLjAyXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZTogW3RoaXMuX3dyYXBwZXJTY2FsZSwgdGhpcy5fd3JhcHBlclNjYWxlXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXNpbmc6IFwic3ByaW5nXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nQ29uc3RhbnQ6IC4zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmluZ0RlY2VsZXJhdGlvbjogLjg1LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5OiA0NTAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5fY3JvcHBlci5kaXJ0eSA/IHUodGhpcy5fc3RhZ2UsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tUG9zaXRpb246IFswLCAwLCAwXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogWzAsIDAsIDBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21PcGFjaXR5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDI1MCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheTogODUwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHoodGhpcyksIHQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogdSh0aGlzLl9zdGFnZSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21Qb3NpdGlvbjogWzAsIDAsIDBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBbMCwgMCwgMF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wYWNpdHk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMjUwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5OiAxZTMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeih0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB1KHRoaXMuX2J0bkdyb3VwLmNoaWxkTm9kZXMsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tU2NhbGU6IFsuOSwgLjldLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiBbMSwgMV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wYWNpdHk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheTogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDFlMyArIDEwMCAqIHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhc2luZzogXCJzcHJpbmdcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbmdDb25zdGFudDogLjMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nRGVjZWxlcmF0aW9uOiAuODUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeih0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB1KHRoaXMuX3V0aWxzR3JvdXAuY2hpbGROb2Rlcywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21TY2FsZTogWy45LCAuOV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IFsxLCAxXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tT3BhY2l0eTogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhc2luZzogXCJzcHJpbmdcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbmdDb25zdGFudDogLjMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nRGVjZWxlcmF0aW9uOiAuODUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXk6IDEyNTAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeih0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJoaWRlXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gZSA/IGFyZ3VtZW50c1swXSA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzKSwgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcyksIHUodGhpcy5fdXRpbHNHcm91cC5jaGlsZE5vZGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wYWNpdHk6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMjUwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdSh0aGlzLl9idG5Hcm91cC5jaGlsZE5vZGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wYWNpdHk6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheTogMjAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzNTBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB1KFt0aGlzLl9zdGFnZSwgdGhpcy5fcHJldmlld1dyYXBwZXJdLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVBvc2l0aW9uOiBbMCwgMCwgMF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IFswLCAtMjUwLCAwXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tT3BhY2l0eTogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhc2luZzogXCJzcHJpbmdcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbmdDb25zdGFudDogLjMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nRGVjZWxlcmF0aW9uOiAuNzUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXk6IDI1MCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxEb25lOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJkZXN0cm95XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdCh0aGlzLl9idG5Hcm91cC5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fY3JvcHBlci5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSwgdClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl9jcm9wcGVyLmRlc3Ryb3koKSwgdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlICYmIEV0KHRoaXMuX2VsZW1lbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJzaG93Um90YXRlQnV0dG9uXCIsIHNldDogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPyB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJzbGltLXJvdGF0aW9uLWRpc2FibGVkXCIpIDogdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwic2xpbS1yb3RhdGlvbi1kaXNhYmxlZFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZWxlbWVudFwiLCBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJyYXRpb1wiLCBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcImlucHV0XCIgPT09IHRoaXMuX3JhdGlvID8gdGhpcy5faW5wdXQuaGVpZ2h0IC8gdGhpcy5faW5wdXQud2lkdGggOiB0aGlzLl9yYXRpb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwib2Zmc2V0XCIsIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIm9yaWdpbmFsXCIsIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJzY2FsYXJcIiwgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJldmlld1NpemUud2lkdGggLyB0aGlzLl9pbnB1dC53aWR0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfV0sIFt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJvcHRpb25zXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNhbmNlbENsYXNzTmFtZTogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25Db25maXJtQ2xhc3NOYW1lOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNhbmNlbExhYmVsOiBcIkNhbmNlbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNvbmZpcm1MYWJlbDogXCJDb25maXJtXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ2FuY2VsVGl0bGU6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ29uZmlybVRpdGxlOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblJvdGF0ZVRpdGxlOiBcIlJvdGF0ZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblJvdGF0ZUNsYXNzTmFtZTogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VQaXhlbFJhdGlvOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblNpemU6IHt3aWR0aDogMCwgaGVpZ2h0OiAwfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfV0pLCBuXHJcbiAgICAgICAgICAgICAgICB9KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5CdXR0b25zID0gW1wiY2FuY2VsXCIsIFwiY29uZmlybVwiXSwgblxyXG4gICAgICAgICAgICB9KFR0KSwgTHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaSA9IFtcImRyYWdlbnRlclwiLCBcImRyYWdvdmVyXCIsIFwiZHJhZ2xlYXZlXCIsIFwiZHJvcFwiXTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IGUgPyBhcmd1bWVudHNbMF0gOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0KHRoaXMsIG4pLCB0aGlzLl9lbGVtZW50ID0gaSwgdGhpcy5fYWNjZXB0ID0gW10sIHRoaXMuX2FsbG93VVJMcyA9ICExLCB0aGlzLl9kcmFnUGF0aCA9IG51bGwsIHRoaXMuX2luaXQoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAobiwgW3tcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImlzVmFsaWREYXRhVHJhbnNmZXJcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5maWxlcyAmJiB0LmZpbGVzLmxlbmd0aCA/IHRoaXMuYXJlVmFsaWREYXRhVHJhbnNmZXJGaWxlcyh0LmZpbGVzKSA6IHQuaXRlbXMgJiYgdC5pdGVtcy5sZW5ndGggPyB0aGlzLmFyZVZhbGlkRGF0YVRyYW5zZmVySXRlbXModC5pdGVtcykgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJhcmVWYWxpZERhdGFUcmFuc2ZlckZpbGVzXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLl9hY2NlcHQubGVuZ3RoIHx8ICF0IHx8IHRoaXMuX2FjY2VwdC5pbmRleE9mKHRbMF0udHlwZSkgIT09IC0xXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJhcmVWYWxpZERhdGFUcmFuc2Zlckl0ZW1zXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLl9hY2NlcHQubGVuZ3RoIHx8ICF0IHx8ICh0aGlzLl9hbGxvd1VSTHMgJiYgXCJzdHJpbmdcIiA9PT0gdFswXS5raW5kID8gbnVsbCA6IHRbMF0udHlwZSAmJiAwID09PSB0WzBdLnR5cGUuaW5kZXhPZihcImFwcGxpY2F0aW9uXCIpID8gbnVsbCA6IHRoaXMuX2FjY2VwdC5pbmRleE9mKHRbMF0udHlwZSkgIT09IC0xKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwicmVzZXRcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuZmlsZXMgPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJfaW5pdFwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc05hbWUgPSBcInNsaW0tZmlsZS1ob3BwZXJcIiwgaS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGUsIHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiaGFuZGxlRXZlbnRcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQudHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcImRyYWdlbnRlclwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcImRyYWdvdmVyXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRHJhZ092ZXIodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcImRyYWdsZWF2ZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkRyYWdMZWF2ZSh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiZHJvcFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkRyb3AodClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbkRyb3BcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fYWxsb3dVUkxzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB2b2lkIDAsIG4gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHQuZGF0YVRyYW5zZmVyLmdldERhdGEoXCJ1cmxcIiksIG4gPSB0LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dC9odG1sXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAmJiBuLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG4ubWF0Y2goL3NyY1xccyo9XFxzKlwiKC4rPylcIi8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvICYmIChlID0gb1sxXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaSAmJiBpLmxlbmd0aCAmJiAoZSA9IGkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgdGhpcy5fZWxlbWVudC5maWxlcyA9IFt7cmVtb3RlOiBlfV07IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdGhpcy5pc1ZhbGlkRGF0YVRyYW5zZmVyKHQuZGF0YVRyYW5zZmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEpIHJldHVybiB0aGlzLl9lbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiZmlsZS1pbnZhbGlkLWRyb3BcIikpLCB2b2lkKHRoaXMuX2RyYWdQYXRoID0gbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5maWxlcyA9IHQuZGF0YVRyYW5zZmVyLmZpbGVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiZmlsZS1kcm9wXCIsIHtkZXRhaWw6IG0odCl9KSksIHRoaXMuX2VsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJjaGFuZ2VcIikpLCB0aGlzLl9kcmFnUGF0aCA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbkRyYWdPdmVyXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpLCB0LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gXCJjb3B5XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuaXNWYWxpZERhdGFUcmFuc2Zlcih0LmRhdGFUcmFuc2Zlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PT0gZSB8fCBlID8gKHRoaXMuX2RyYWdQYXRoIHx8ICh0aGlzLl9kcmFnUGF0aCA9IFtdKSwgdGhpcy5fZHJhZ1BhdGgucHVzaChtKHQpKSwgdm9pZCB0aGlzLl9lbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiZmlsZS1vdmVyXCIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogVCh0aGlzLl9kcmFnUGF0aCkueCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogVCh0aGlzLl9kcmFnUGF0aCkueVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSkgOiAodC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IFwibm9uZVwiLCB2b2lkIHRoaXMuX2VsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJmaWxlLWludmFsaWRcIikpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uRHJhZ0xlYXZlXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImZpbGUtb3V0XCIsIHtkZXRhaWw6IG0odCl9KSksIHRoaXMuX2RyYWdQYXRoID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZGVzdHJveVwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGUsIHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgRXQodGhpcy5fZWxlbWVudCksIHRoaXMuX2VsZW1lbnQgPSBudWxsLCB0aGlzLl9kcmFnUGF0aCA9IG51bGwsIHRoaXMuX2FjY2VwdCA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImVsZW1lbnRcIiwgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZHJhZ1BhdGhcIiwgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZHJhZ1BhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImVuYWJsZWRcIiwgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiA9PT0gdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHNldDogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IHQgPyBcIlwiIDogXCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImFsbG93VVJMc1wiLCBzZXQ6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hbGxvd1VSTHMgPSB0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJhY2NlcHRcIiwgc2V0OiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWNjZXB0ID0gdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hY2NlcHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1dKSwgblxyXG4gICAgICAgICAgICAgICAgfSgpXHJcbiAgICAgICAgICAgIH0oKSwgT3QgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHQodGhpcywgaSksIHRoaXMuX2VsZW1lbnQgPSBudWxsLCB0aGlzLl9pbm5lciA9IG51bGwsIHRoaXMuX2luaXQoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAoaSwgW3tcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9pbml0XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50ID0gayhcImRpdlwiLCBcInNsaW0tcG9wb3ZlclwiKSwgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXN0YXRlXCIsIFwib2ZmXCIpLCBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpLCB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICEwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwic2hvd1wiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLCBpID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSBlID8gYXJndW1lbnRzWzBdIDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1zdGF0ZVwiLCBcIm9uXCIpLCB1KHRoaXMuX2VsZW1lbnQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tT3BhY2l0eTogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzNTAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeih0Ll9lbGVtZW50KSwgaSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcImhpZGVcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcywgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gZSA/IGFyZ3VtZW50c1swXSA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KHRoaXMuX2VsZW1lbnQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tT3BhY2l0eTogMSwgb3BhY2l0eTogMCwgZHVyYXRpb246IDUwMCwgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeih0Ll9lbGVtZW50KSwgdC5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXN0YXRlXCIsIFwib2ZmXCIpLCBpKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZGVzdHJveVwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlICYmICh0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fZWxlbWVudCksIHRoaXMuX2VsZW1lbnQgPSBudWxsLCB0aGlzLl9pbm5lciA9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJpbm5lclwiLCBzZXQ6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbm5lciA9IHQsIHRoaXMuX2VsZW1lbnQuZmlyc3RDaGlsZCAmJiB0aGlzLl9lbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuX2VsZW1lbnQuZmlyc3RDaGlsZCksIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5faW5uZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJjbGFzc05hbWVcIiwgc2V0OiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc05hbWUgPSBcInNsaW0tcG9wb3ZlclwiICsgKG51bGwgPT09IHQgPyBcIlwiIDogXCIgXCIgKyB0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfV0pLCBpXHJcbiAgICAgICAgICAgICAgICB9KClcclxuICAgICAgICAgICAgfSgpLCB6dCA9IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5zcGxpdChlKS5tYXAoZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodCwgMTApXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCBEdCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJESVZcIiA9PT0gdC5ub2RlTmFtZSB8fCBcIlNQQU5cIiA9PT0gdC5ub2RlTmFtZVxyXG4gICAgICAgICAgICB9LCBBdCA9IHtBVVRPOiBcImF1dG9cIiwgSU5JVElBTDogXCJpbml0aWFsXCIsIE1BTlVBTDogXCJtYW51YWxcIn0sIFV0ID0gW1wieFwiLCBcInlcIiwgXCJ3aWR0aFwiLCBcImhlaWdodFwiXSxcclxuICAgICAgICAgICAgSHQgPSBbXCJmaWxlLWludmFsaWQtZHJvcFwiLCBcImZpbGUtaW52YWxpZFwiLCBcImZpbGUtZHJvcFwiLCBcImZpbGUtb3ZlclwiLCBcImZpbGUtb3V0XCIsIFwiY2xpY2tcIl0sXHJcbiAgICAgICAgICAgIE50ID0gW1wiY2FuY2VsXCIsIFwiY29uZmlybVwiXSwgQnQgPSBbXCJyZW1vdmVcIiwgXCJlZGl0XCIsIFwiZG93bmxvYWRcIiwgXCJ1cGxvYWRcIl0sIEZ0ID0gbnVsbCwgV3QgPSAwLFxyXG4gICAgICAgICAgICBxdCA9ICdcXG48ZGl2IGNsYXNzPVwic2xpbS1sb2FkZXJcIj5cXG5cXHQ8c3ZnPlxcblxcdFxcdDxwYXRoIGNsYXNzPVwic2xpbS1sb2FkZXItYmFja2dyb3VuZFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiM1wiIC8+XFxuXFx0XFx0PHBhdGggY2xhc3M9XCJzbGltLWxvYWRlci1mb3JlZ3JvdW5kXCIgZmlsbD1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCIzXCIgLz5cXG5cXHQ8L3N2Zz5cXG48L2Rpdj5cXG4nLFxyXG4gICAgICAgICAgICBqdCA9ICdcXG48ZGl2IGNsYXNzPVwic2xpbS11cGxvYWQtc3RhdHVzXCI+PC9kaXY+XFxuJywgVnQgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGUgPSB0LnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7d2lkdGg6IHBhcnNlSW50KGVbMF0sIDEwKSwgaGVpZ2h0OiBwYXJzZUludChlWzFdLCAxMCl9XHJcbiAgICAgICAgICAgIH0sIEd0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gaShuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IGUgPyBhcmd1bWVudHNbMV0gOiB7fTtcclxuICAgICAgICAgICAgICAgICAgICB0KHRoaXMsIGkpLCBGdCB8fCAoRnQgPSBuZXcgT3QpLCB0aGlzLl91aWQgPSBXdCsrLCB0aGlzLl9vcHRpb25zID0gZyhpLm9wdGlvbnMoKSwgbyksIHRoaXMuX29wdGlvbnMuZm9yY2VTaXplICYmIChcInN0cmluZ1wiID09IHR5cGVvZiB0aGlzLl9vcHRpb25zLmZvcmNlU2l6ZSAmJiAodGhpcy5fb3B0aW9ucy5mb3JjZVNpemUgPSBWdCh0aGlzLl9vcHRpb25zLmZvcmNlU2l6ZSkpLCB0aGlzLl9vcHRpb25zLnJhdGlvID0gdGhpcy5fb3B0aW9ucy5mb3JjZVNpemUud2lkdGggKyBcIjpcIiArIHRoaXMuX29wdGlvbnMuZm9yY2VTaXplLmhlaWdodCwgdGhpcy5fb3B0aW9ucy5zaXplID0gbXQodGhpcy5fb3B0aW9ucy5mb3JjZVNpemUpKSwgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdGhpcy5fb3B0aW9ucy5zaXplICYmICh0aGlzLl9vcHRpb25zLnNpemUgPSBWdCh0aGlzLl9vcHRpb25zLnNpemUpKSwgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdGhpcy5fb3B0aW9ucy5taW5TaXplICYmICh0aGlzLl9vcHRpb25zLm1pblNpemUgPSBWdCh0aGlzLl9vcHRpb25zLm1pblNpemUpKSwgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdGhpcy5fb3B0aW9ucy5wb3N0ICYmICh0aGlzLl9vcHRpb25zLnBvc3QgPSB0aGlzLl9vcHRpb25zLnBvc3Quc3BsaXQoXCIsXCIpLm1hcChmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC50cmltKClcclxuICAgICAgICAgICAgICAgICAgICB9KSksIHRoaXMuX29yaWdpbmFsRWxlbWVudCA9IG4sIHRoaXMuX29yaWdpbmFsRWxlbWVudElubmVyID0gbi5pbm5lckhUTUwsIHRoaXMuX29yaWdpbmFsRWxlbWVudEF0dHJpYnV0ZXMgPSBfKG4pLCBEdChuKSA/IHRoaXMuX2VsZW1lbnQgPSBuIDogKHRoaXMuX2VsZW1lbnQgPSBDdChuKSwgdGhpcy5fZWxlbWVudC5jbGFzc05hbWUgPSBuLmNsYXNzTmFtZSwgbi5jbGFzc05hbWUgPSBcIlwiLCB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtcmF0aW9cIiwgdGhpcy5fb3B0aW9ucy5yYXRpbykpLCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJzbGltXCIpLCB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtc3RhdGVcIiwgXCJpbml0XCIpLCB0aGlzLl9zdGF0ZSA9IFtdLCB0aGlzLl90aW1lcnMgPSBbXSwgdGhpcy5faW5wdXQgPSBudWxsLCB0aGlzLl9pbnB1dFJlZmVyZW5jZSA9IG51bGwsIHRoaXMuX291dHB1dCA9IG51bGwsIHRoaXMuX3JhdGlvID0gbnVsbCwgdGhpcy5faXNSZXF1aXJlZCA9ICExLCB0aGlzLl9pbWFnZUhvcHBlciA9IG51bGwsIHRoaXMuX2ltYWdlRWRpdG9yID0gbnVsbCwgdGhpcy5fcHJvZ3Jlc3NFbmFibGVkID0gITAsIHRoaXMuX2RhdGEgPSB7fSwgdGhpcy5fcmVzZXREYXRhKCksIHRoaXMuX2RyaXAgPSBudWxsLCB0aGlzLl9oYXNJbml0aWFsSW1hZ2UgPSAhMSwgdGhpcy5faW5pdGlhbENyb3AgPSB0aGlzLl9vcHRpb25zLmNyb3AsIHRoaXMuX2luaXRpYWxSb3RhdGlvbiA9IHRoaXMuX29wdGlvbnMucm90YXRpb24gJiYgdGhpcy5fb3B0aW9ucy5yb3RhdGlvbiAlIDkwID09PSAwID8gdGhpcy5fb3B0aW9ucy5yb3RhdGlvbiA6IG51bGwsIHRoaXMuX2lzQmVpbmdEZXN0cm95ZWQgPSAhMSwgaS5zdXBwb3J0ZWQgPyB0aGlzLl9pbml0KCkgOiB0aGlzLl9mYWxsYmFjaygpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHAoaSwgW3tcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwic2V0Um90YXRpb25cIiwgdmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcIm51bWJlclwiID09IHR5cGVvZiB0IHx8IHQgJSA5MCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YS5hY3Rpb25zLnJvdGF0aW9uID0gdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5fZGF0YS5hY3Rpb25zLnJvdGF0aW9uICUgMTgwICE9PSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGEuaW5wdXQuaW1hZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGkgPyB0aGlzLl9kYXRhLmlucHV0LmltYWdlLmhlaWdodCA6IHRoaXMuX2RhdGEuaW5wdXQuaW1hZ2Uud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBpID8gdGhpcy5fZGF0YS5pbnB1dC5pbWFnZS53aWR0aCA6IHRoaXMuX2RhdGEuaW5wdXQuaW1hZ2UuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGEuYWN0aW9ucy5jcm9wID0gdHQobiwgbywgdGhpcy5fcmF0aW8pLCB0aGlzLl9kYXRhLmFjdGlvbnMuY3JvcC50eXBlID0gQXQuQVVUT1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YS5pbnB1dC5pbWFnZSAmJiBlICYmIHRoaXMuX21hbnVhbFRyYW5zZm9ybShlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJzZXRTaXplXCIsIHZhbHVlOiBmdW5jdGlvbiAodCwgZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInN0cmluZ1wiID09IHR5cGVvZiB0ICYmICh0ID0gVnQodCkpLCB0ICYmIHQud2lkdGggJiYgdC5oZWlnaHQgJiYgKHRoaXMuX29wdGlvbnMuc2l6ZSA9IG10KHQpLCB0aGlzLl9kYXRhLmFjdGlvbnMuc2l6ZSA9IG10KHQpLCB0aGlzLl9kYXRhLmlucHV0LmltYWdlICYmIGUgJiYgdGhpcy5fbWFudWFsVHJhbnNmb3JtKGUpKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwic2V0Rm9yY2VTaXplXCIsIHZhbHVlOiBmdW5jdGlvbiAodCwgZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInN0cmluZ1wiID09IHR5cGVvZiB0ICYmICh0ID0gVnQodCkpLCB0ICYmIHQud2lkdGggJiYgdC5oZWlnaHQgJiYgKHRoaXMuX29wdGlvbnMuc2l6ZSA9IG10KHQpLCB0aGlzLl9vcHRpb25zLmZvcmNlU2l6ZSA9IG10KHQpLCB0aGlzLl9kYXRhLmFjdGlvbnMuc2l6ZSA9IG10KHQpLCB0aGlzLnNldFJhdGlvKHRoaXMuX29wdGlvbnMuZm9yY2VTaXplLndpZHRoICsgXCI6XCIgKyB0aGlzLl9vcHRpb25zLmZvcmNlU2l6ZS5oZWlnaHQsIGUpKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwic2V0UmF0aW9cIiwgdmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCAmJiAodGhpcy5fb3B0aW9ucy5yYXRpbyA9IHQsIHRoaXMuX2lzRml4ZWRSYXRpbygpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB6dCh0aGlzLl9vcHRpb25zLnJhdGlvLCBcIjpcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yYXRpbyA9IG5bMV0gLyBuWzBdLCB0aGlzLl9kYXRhLmlucHV0LmltYWdlICYmIGUgPyB0aGlzLl9jcm9wQXV0byhmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuX3NjYWxlRHJvcEFyZWEoaS5fcmF0aW8pLCBlICYmIGUodClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogKHRoaXMuX2RhdGEuaW5wdXQuaW1hZ2UgJiYgKHRoaXMuX2RhdGEuYWN0aW9ucy5jcm9wID0gdHQodGhpcy5fZGF0YS5pbnB1dC5pbWFnZS53aWR0aCwgdGhpcy5fZGF0YS5pbnB1dC5pbWFnZS5oZWlnaHQsIHRoaXMuX3JhdGlvKSwgdGhpcy5fZGF0YS5hY3Rpb25zLmNyb3AudHlwZSA9IEF0LkFVVE8pLCB0aGlzLl9zY2FsZURyb3BBcmVhKHRoaXMuX3JhdGlvKSwgZSAmJiBlKG51bGwpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJpc0F0dGFjaGVkVG9cIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50ID09PSB0IHx8IHRoaXMuX29yaWdpbmFsRWxlbWVudCA9PT0gdDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcImlzRGV0YWNoZWRcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT09IHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwibG9hZFwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IGUgPyBhcmd1bWVudHNbMV0gOiB7fSwgbiA9IGFyZ3VtZW50c1syXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09IHR5cGVvZiBpID8gbiA9IGkgOiAodGhpcy5fb3B0aW9ucy5jcm9wID0gaS5jcm9wLCB0aGlzLl9vcHRpb25zLnJvdGF0aW9uID0gaS5yb3RhdGlvbiwgdGhpcy5faW5pdGlhbFJvdGF0aW9uID0gaS5yb3RhdGlvbiAmJiBpLnJvdGF0aW9uICUgOTAgPT09IDAgPyBpLnJvdGF0aW9uIDogbnVsbCwgdGhpcy5faW5pdGlhbENyb3AgPSB0aGlzLl9vcHRpb25zLmNyb3ApLCB0aGlzLl9sb2FkKHQsIG4sIHtibG9ja1B1c2g6IGkuYmxvY2tQdXNofSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcInVwbG9hZFwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZG9VcGxvYWQodClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcImRvd25sb2FkXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RvRG93bmxvYWQoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwicmVtb3ZlXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kb1JlbW92ZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJkZXN0cm95XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RvRGVzdHJveSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJlZGl0XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RvRWRpdCgpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJjcm9wXCIsIHZhbHVlOiBmdW5jdGlvbiAodCwgZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jcm9wKHQueCwgdC55LCB0LndpZHRoLCB0LmhlaWdodCwgZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcImNvbnRhaW5zSW1hZ2VcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IHRoaXMuX2RhdGEuaW5wdXQubmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2Nhbkluc3RhbnRFZGl0XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zLmluc3RhbnRFZGl0ICYmICF0aGlzLl9pc0luaXRpYWxpc2luZ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2dldEZpbGVJbnB1dFwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRbdHlwZT1maWxlXVwiKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2dldEluaXRpYWxJbWFnZVwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiaW1nXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfZ2V0SW5wdXRFbGVtZW50XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRGaWxlSW5wdXQoKSB8fCB0aGlzLl9nZXRJbml0aWFsSW1hZ2UoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2dldFJhdGlvU3BhY2VyRWxlbWVudFwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jaGlsZHJlblswXVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2lzSW1hZ2VPbmx5XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIklOUFVUXCIgIT09IHRoaXMuX2lucHV0Lm5vZGVOYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfaXNGaXhlZFJhdGlvXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zLnJhdGlvLmluZGV4T2YoXCI6XCIpICE9PSAtMVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2lzQXV0b0Nyb3BcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEuYWN0aW9ucy5jcm9wLnR5cGUgPT09IEF0LkFVVE9cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl90b2dnbGVCdXR0b25cIiwgdmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHh0KCcuc2xpbS1idG5bZGF0YS1hY3Rpb249XCInICsgdCArICdcIl0nLCBlLCB0aGlzLl9lbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2NsZWFyU3RhdGVcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBbXSwgdGhpcy5fdXBkYXRlU3RhdGUoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3JlbW92ZVN0YXRlXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IHRoaXMuX3N0YXRlLmZpbHRlcihmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgIT09IHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuX3VwZGF0ZVN0YXRlKClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9hZGRTdGF0ZVwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTCh0LCB0aGlzLl9zdGF0ZSkgfHwgKHRoaXMuX3N0YXRlLnB1c2godCksIHRoaXMuX3VwZGF0ZVN0YXRlKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfdXBkYXRlU3RhdGVcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudCAmJiB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtc3RhdGVcIiwgdGhpcy5fc3RhdGUuam9pbihcIixcIikpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfcmVzZXREYXRhXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXI6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhOiBtdCh0aGlzLl9vcHRpb25zLm1ldGEpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHtmaWVsZDogdGhpcy5faW5wdXRSZWZlcmVuY2UsIG5hbWU6IG51bGwsIHR5cGU6IG51bGwsIHdpZHRoOiAwLCBoZWlnaHQ6IDAsIGZpbGU6IG51bGx9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiB7aW1hZ2U6IG51bGwsIHdpZHRoOiAwLCBoZWlnaHQ6IDB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uczoge3JvdGF0aW9uOiBudWxsLCBjcm9wOiBudWxsLCBzaXplOiBudWxsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLl9vdXRwdXQgJiYgKHRoaXMuX291dHB1dC52YWx1ZSA9IFwiXCIpLCBfdCh0aGlzLl9nZXRGaWxlSW5wdXQoKSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9pbml0XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGlzaW5nID0gITAsIHRoaXMuX2FkZFN0YXRlKFwiZW1wdHlcIiksIEwoXCJpbnB1dFwiLCB0aGlzLl9vcHRpb25zLnBvc3QpICYmICh0aGlzLl9pbnB1dFJlZmVyZW5jZSA9IFwic2xpbV9pbnB1dF9cIiArIHRoaXMuX3VpZCksIHRoaXMuX2lucHV0ID0gdGhpcy5fZ2V0SW5wdXRFbGVtZW50KCksIHRoaXMuX2lucHV0IHx8ICh0aGlzLl9pbnB1dCA9IGsoXCJpbnB1dFwiKSwgdGhpcy5faW5wdXQudHlwZSA9IFwiZmlsZVwiLCB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2lucHV0KSksIHRoaXMuX2lzUmVxdWlyZWQgPSB0aGlzLl9pbnB1dC5yZXF1aXJlZCA9PT0gITAsIHRoaXMuX291dHB1dCA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihcImlucHV0W3R5cGU9aGlkZGVuXVwiKSwgdGhpcy5fb3V0cHV0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBKU09OLnBhcnNlKHRoaXMuX291dHB1dC52YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgSW1hZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5zcmMgPSBlLm91dHB1dC5pbWFnZSwgbi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWZpbGVuYW1lXCIsIGUub3V0cHV0Lm5hbWUpLCB0aGlzLl9lbGVtZW50Lmluc2VydEJlZm9yZShuLCB0aGlzLl9lbGVtZW50LmZpcnN0Q2hpbGQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLl9vdXRwdXQgPSBrKFwiaW5wdXRcIiksIHRoaXMuX291dHB1dC50eXBlID0gXCJoaWRkZW5cIiwgdGhpcy5fb3V0cHV0Lm5hbWUgPSB0aGlzLl9pbnB1dC5uYW1lIHx8IHRoaXMuX29wdGlvbnMuZGVmYXVsdElucHV0TmFtZSwgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9vdXRwdXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dC5yZW1vdmVBdHRyaWJ1dGUoXCJuYW1lXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGsoXCJkaXZcIiwgXCJzbGltLWFyZWFcIiksIGEgPSB0aGlzLl9nZXRJbml0aWFsSW1hZ2UoKSwgciA9IChhIHx8IHt9KS5zcmMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gYSA/IGEuZ2V0QXR0cmlidXRlKFwiZGF0YS1maWxlbmFtZVwiKSA6IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIgPyB0aGlzLl9oYXNJbml0aWFsSW1hZ2UgPSAhMCA6ICh0aGlzLl9pbml0aWFsQ3JvcCA9IG51bGwsIHRoaXMuX2luaXRpYWxSb3RhdGlvbiA9IG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9ICdcXG5cXHRcXHQ8ZGl2IGNsYXNzPVwic2xpbS1yZXN1bHRcIj5cXG5cXHRcXHRcXHQ8aW1nIGNsYXNzPVwiaW5cIiBzdHlsZT1cIm9wYWNpdHk6MFwiICcgKyAociA/ICdzcmM9XCInICsgciArICdcIicgOiBcIlwiKSArICc+PGltZz48aW1nIHN0eWxlPVwib3BhY2l0eTowXCI+XFxuXFx0XFx0PC9kaXY+JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzSW1hZ2VPbmx5KCkpIG8uaW5uZXJIVE1MID0gXCJcXG5cXHRcXHRcXHRcXHRcIiArIHF0ICsgXCJcXG5cXHRcXHRcXHRcXHRcIiArIGp0ICsgXCJcXG5cXHRcXHRcXHRcXHRcIiArIGggKyAnXFxuXFx0XFx0XFx0XFx0PGRpdiBjbGFzcz1cInNsaW0tc3RhdHVzXCI+PGRpdiBjbGFzcz1cInNsaW0tbGFiZWwtbG9hZGluZ1wiPicgKyAodGhpcy5fb3B0aW9ucy5sYWJlbExvYWRpbmcgfHwgXCJcIikgKyBcIjwvZGl2PjwvZGl2PlxcblxcdFxcdFxcdFwiOyBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwoXCJpbnB1dFwiLCB0aGlzLl9vcHRpb25zLnBvc3QpICYmICh0aGlzLl9kYXRhLmlucHV0LmZpZWxkID0gdGhpcy5faW5wdXRSZWZlcmVuY2UsIHRoaXMuX29wdGlvbnMuc2VydmljZSB8fCAodGhpcy5faW5wdXQubmFtZSA9IHRoaXMuX2lucHV0UmVmZXJlbmNlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IHZvaWQgMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0Lmhhc0F0dHJpYnV0ZShcImFjY2VwdFwiKSAmJiBcImltYWdlLypcIiAhPT0gdGhpcy5faW5wdXQuZ2V0QXR0cmlidXRlKFwiYWNjZXB0XCIpID8gdSA9IHRoaXMuX2lucHV0LmFjY2VwdC5zcGxpdChcIixcIikubWFwKGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudHJpbSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6ICh1ID0gQSgpLCB0aGlzLl9pbnB1dC5zZXRBdHRyaWJ1dGUoXCJhY2NlcHRcIiwgdS5qb2luKFwiLFwiKSkpLCB0aGlzLl9pbWFnZUhvcHBlciA9IG5ldyBMdCwgdGhpcy5faW1hZ2VIb3BwZXIuYWNjZXB0ID0gdSwgdGhpcy5faW1hZ2VIb3BwZXIuYWxsb3dVUkxzID0gXCJzdHJpbmdcIiA9PSB0eXBlb2YgdGhpcy5fb3B0aW9ucy5mZXRjaGVyLCB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2ltYWdlSG9wcGVyLmVsZW1lbnQpLCBIdC5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5faW1hZ2VIb3BwZXIuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGUsIHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgby5pbm5lckhUTUwgPSBcIlxcblxcdFxcdFxcdFxcdFwiICsgcXQgKyBcIlxcblxcdFxcdFxcdFxcdFwiICsganQgKyAnXFxuXFx0XFx0XFx0XFx0PGRpdiBjbGFzcz1cInNsaW0tZHJpcFwiPjxzcGFuPjxzcGFuPjwvc3Bhbj48L3NwYW4+PC9kaXY+XFxuXFx0XFx0XFx0XFx0PGRpdiBjbGFzcz1cInNsaW0tc3RhdHVzXCI+PGRpdiBjbGFzcz1cInNsaW0tbGFiZWxcIj4nICsgKHRoaXMuX29wdGlvbnMubGFiZWwgfHwgXCJcIikgKyAnPC9kaXY+PGRpdiBjbGFzcz1cInNsaW0tbGFiZWwtbG9hZGluZ1wiPicgKyAodGhpcy5fb3B0aW9ucy5sYWJlbExvYWRpbmcgfHwgXCJcIikgKyBcIjwvZGl2PjwvZGl2PlxcblxcdFxcdFxcdFxcdFwiICsgaCArIFwiXFxuXFx0XFx0XFx0XCIsIHRoaXMuX2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgdGhpcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZChvKSwgdGhpcy5fYnRuR3JvdXAgPSBrKFwiZGl2XCIsIFwic2xpbS1idG4tZ3JvdXBcIiksIHRoaXMuX2J0bkdyb3VwLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIiwgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9idG5Hcm91cCksIEJ0LmZpbHRlcihmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuX2lzQnV0dG9uQWxsb3dlZChlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IFIoZSksIG4gPSB0Ll9vcHRpb25zW1wiYnV0dG9uXCIgKyBpICsgXCJMYWJlbFwiXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gdC5fb3B0aW9uc1tcImJ1dHRvblwiICsgaSArIFwiVGl0bGVcIl0gfHwgbiwgYSA9IHQuX29wdGlvbnNbXCJidXR0b25cIiArIGkgKyBcIkNsYXNzTmFtZVwiXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gayhcImJ1dHRvblwiLCBcInNsaW0tYnRuIHNsaW0tYnRuLVwiICsgZSArIChhID8gXCIgXCIgKyBhIDogXCJcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5pbm5lckhUTUwgPSBuLCByLnRpdGxlID0gbywgci50eXBlID0gXCJidXR0b25cIiwgci5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdCksIHIuc2V0QXR0cmlidXRlKFwiZGF0YS1hY3Rpb25cIiwgZSksIHQuX2J0bkdyb3VwLmFwcGVuZENoaWxkKHIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl9pc0ZpeGVkUmF0aW8oKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSB6dCh0aGlzLl9vcHRpb25zLnJhdGlvLCBcIjpcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yYXRpbyA9IGxbMV0gLyBsWzBdLCB0aGlzLl9zY2FsZURyb3BBcmVhKHRoaXMuX3JhdGlvKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVByb2dyZXNzKC41KSwgciA/IHRoaXMuX2xvYWQociwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fb25Jbml0KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwge25hbWU6IHN9KSA6IHRoaXMuX29uSW5pdCgpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfb25Jbml0XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXNpbmcgPSAhMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX29wdGlvbnMuZGlkSW5pdC5hcHBseSh0LCBbdC5kYXRhLCB0XSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fdGltZXJzLnB1c2goZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5zYXZlSW5pdGlhbEltYWdlICYmIHRoaXMuY29udGFpbnNJbWFnZSgpID8gdGhpcy5fb3B0aW9ucy5zZXJ2aWNlIHx8IHRoaXMuX3NhdmUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sICExKSA6ICh0aGlzLl9vcHRpb25zLnNlcnZpY2UgJiYgdGhpcy5jb250YWluc0ltYWdlKCkgJiYgdGhpcy5fdG9nZ2xlQnV0dG9uKFwidXBsb2FkXCIsICExKSwgZSgpKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3VwZGF0ZVByb2dyZXNzXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9IE1hdGgubWluKC45OTk5OSwgdCksIHRoaXMuX2VsZW1lbnQgJiYgdGhpcy5fcHJvZ3Jlc3NFbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zbGltLWxvYWRlclwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBlLm9mZnNldFdpZHRoLCBuID0gZS5xdWVyeVNlbGVjdG9yQWxsKFwicGF0aFwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IHBhcnNlSW50KG5bMF0uZ2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIpLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblswXS5zZXRBdHRyaWJ1dGUoXCJkXCIsIFJ0KC41ICogaSwgLjUgKiBpLCAuNSAqIGkgLSBvLCAuOTk5OSkpLCBuWzFdLnNldEF0dHJpYnV0ZShcImRcIiwgUnQoLjUgKiBpLCAuNSAqIGksIC41ICogaSAtIG8sIHQpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfc3RhcnRQcm9ncmVzc1wiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3NFbmFibGVkID0gITE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zbGltLWxvYWRlclwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBpLmNoaWxkcmVuWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0b3BQcm9ncmVzc0xvb3AoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpLCBuLnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpLCBlLl9wcm9ncmVzc0VuYWJsZWQgPSAhMCwgZS5fdXBkYXRlUHJvZ3Jlc3MoMCksIGUuX3Byb2dyZXNzRW5hYmxlZCA9ICExLCB1KG4sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21PcGFjaXR5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAyNTAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX3Byb2dyZXNzRW5hYmxlZCA9ICEwLCB0ICYmIHQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9zdG9wUHJvZ3Jlc3NcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc2xpbS1sb2FkZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZS5jaGlsZHJlblswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVQcm9ncmVzcygxKSwgdShpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21PcGFjaXR5OiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMjUwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yZW1vdmVBdHRyaWJ1dGUoXCJzdHlsZVwiKSwgaS5yZW1vdmVBdHRyaWJ1dGUoXCJzdHlsZVwiKSwgdC5fdXBkYXRlUHJvZ3Jlc3MoLjUpLCB0Ll9wcm9ncmVzc0VuYWJsZWQgPSAhMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3N0YXJ0UHJvZ3Jlc3NMb29wXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zbGltLWxvYWRlclwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0LmNoaWxkcmVuWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucmVtb3ZlQXR0cmlidXRlKFwic3R5bGVcIiksIGUucmVtb3ZlQXR0cmlidXRlKFwic3R5bGVcIiksIHRoaXMuX3VwZGF0ZVByb2dyZXNzKC41KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IDFlMztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KHQsIFwic3RvcFwiKSwgdSh0LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiBbMCwgMCwgLSgyICogTWF0aC5QSSkgKiBpXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFzaW5nOiBcImxpbmVhclwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMWUzICogaVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB1KGUsIHtmcm9tT3BhY2l0eTogMCwgb3BhY2l0eTogMSwgZHVyYXRpb246IDI1MH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9zdG9wUHJvZ3Jlc3NMb29wXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc2xpbS1sb2FkZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZS5jaGlsZHJlblswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KGksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wYWNpdHk6IHBhcnNlRmxvYXQoaS5zdHlsZS5vcGFjaXR5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDI1MCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUoZSwgXCJzdG9wXCIpLCBlLnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpLCBpLnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpLCB0ICYmIHQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2lzQnV0dG9uQWxsb3dlZFwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZWRpdFwiID09PSB0ID8gdGhpcy5fb3B0aW9ucy5lZGl0IDogXCJkb3dubG9hZFwiID09PSB0ID8gdGhpcy5fb3B0aW9ucy5kb3dubG9hZCA6IFwidXBsb2FkXCIgPT09IHQgPyAhIXRoaXMuX29wdGlvbnMuc2VydmljZSAmJiAhdGhpcy5fb3B0aW9ucy5wdXNoIDogXCJyZW1vdmVcIiAhPT0gdCB8fCAhdGhpcy5faXNJbWFnZU9ubHkoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2ZhbGxiYWNrXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gayhcImRpdlwiLCBcInNsaW0tYXJlYVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdC5pbm5lckhUTUwgPSAnXFxuXFx0XFx0XFx0PGRpdiBjbGFzcz1cInNsaW0tc3RhdHVzXCI+PGRpdiBjbGFzcz1cInNsaW0tbGFiZWxcIj4nICsgKHRoaXMuX29wdGlvbnMubGFiZWwgfHwgXCJcIikgKyBcIjwvZGl2PjwvZGl2PlxcblxcdFxcdFwiLCB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHQpLCB0aGlzLl90aHJvd0Vycm9yKHRoaXMuX29wdGlvbnMuc3RhdHVzTm9TdXBwb3J0KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiaGFuZGxlRXZlbnRcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodC50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJjbGlja1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2xpY2sodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJjaGFuZ2VcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcImNhbmNlbFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2FuY2VsKHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiY29uZmlybVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ29uZmlybSh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcImZpbGUtb3ZlclwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRmlsZU92ZXIodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJmaWxlLW91dFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRmlsZU91dCh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcImZpbGUtZHJvcFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRHJvcEZpbGUodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJmaWxlLWludmFsaWRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkludmFsaWRGaWxlKHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiZmlsZS1pbnZhbGlkLWRyb3BcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkludmFsaWRGaWxlRHJvcCh0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfZ2V0SW50cm9cIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zbGltLXJlc3VsdCAuaW5cIilcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9nZXRPdXRyb1wiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLnNsaW0tcmVzdWx0IC5vdXRcIilcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9nZXRJbk91dFwiLCB2YWx1ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLnNsaW0tcmVzdWx0IGltZ1wiKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2dldERyaXBcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RyaXAgfHwgKHRoaXMuX2RyaXAgPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc2xpbS1kcmlwID4gc3BhblwiKSksIHRoaXMuX2RyaXBcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl90aHJvd0Vycm9yXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRTdGF0ZShcImVycm9yXCIpLCB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc2xpbS1sYWJlbFwiKS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLnNsaW0tZXJyb3JcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgfHwgKGUgPSBrKFwiZGl2XCIsIFwic2xpbS1lcnJvclwiKSwgdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLnNsaW0tc3RhdHVzXCIpLmFwcGVuZENoaWxkKGUpKSwgZS5pbm5lckhUTUwgPSB0LCB0aGlzLl9vcHRpb25zLmRpZFRocm93RXJyb3IuYXBwbHkodGhpcywgW3RdKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3JlbW92ZUVycm9yXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZVN0YXRlKFwiZXJyb3JcIiksIHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zbGltLWxhYmVsXCIpLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zbGltLWVycm9yXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ICYmIHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29wZW5GaWxlRGlhbG9nXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZUVycm9yKCksIHRoaXMuX2lucHV0LmNsaWNrKClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbkNsaWNrXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMsIGkgPSB0LnRhcmdldC5jbGFzc0xpc3QsIG4gPSB0LnRhcmdldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkuY29udGFpbnMoXCJzbGltLWZpbGUtaG9wcGVyXCIpKSByZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLCB2b2lkIHRoaXMuX29wZW5GaWxlRGlhbG9nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobi5nZXRBdHRyaWJ1dGUoXCJkYXRhLWFjdGlvblwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwicmVtb3ZlXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy53aWxsUmVtb3ZlLmFwcGx5KHRoaXMsIFt0aGlzLmRhdGEsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fZG9SZW1vdmUoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcImVkaXRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kb0VkaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcImRvd25sb2FkXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZG9Eb3dubG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwidXBsb2FkXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZG9VcGxvYWQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfb25JbnZhbGlkRmlsZURyb3BcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25JbnZhbGlkRmlsZSgpLCB0aGlzLl9yZW1vdmVTdGF0ZShcImZpbGUtb3ZlclwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLl9nZXREcmlwKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHUodC5maXJzdENoaWxkLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tU2NhbGU6IFsuNSwgLjVdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IFswLCAwXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21PcGFjaXR5OiAuNSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMTUwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6KHQuZmlyc3RDaGlsZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbkludmFsaWRGaWxlXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5faW1hZ2VIb3BwZXIuYWNjZXB0Lm1hcChIKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0aGlzLl9vcHRpb25zLnN0YXR1c0ZpbGVUeXBlLnJlcGxhY2UoXCIkMFwiLCB0LmpvaW4oXCIsIFwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rocm93RXJyb3IoZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbkltYWdlVG9vU21hbGxcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLl9vcHRpb25zLnN0YXR1c0ltYWdlVG9vU21hbGwucmVwbGFjZShcIiQwXCIsIHRoaXMuX29wdGlvbnMubWluU2l6ZS53aWR0aCArIFwiIMOXIFwiICsgdGhpcy5fb3B0aW9ucy5taW5TaXplLmhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rocm93RXJyb3IodClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbk92ZXJXZWlnaHRGaWxlXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5fb3B0aW9ucy5zdGF0dXNGaWxlU2l6ZS5yZXBsYWNlKFwiJDBcIiwgdGhpcy5fb3B0aW9ucy5tYXhGaWxlU2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rocm93RXJyb3IodClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbkxvY2FsVVJMUHJvYmxlbVwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGhyb3dFcnJvcih0aGlzLl9vcHRpb25zLnN0YXR1c0xvY2FsVXJsUHJvYmxlbSB8fCB0KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uUmVtb3RlVVJMUHJvYmxlbVwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGhyb3dFcnJvcih0KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uRmlsZU92ZXJcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZFN0YXRlKFwiZmlsZS1vdmVyXCIpLCB0aGlzLl9yZW1vdmVFcnJvcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuX2dldERyaXAoKSwgaSA9IHUuY3JlYXRlTWF0cml4KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkudHJhbnNsYXRlKHQuZGV0YWlsLngsIHQuZGV0YWlsLnksIDApLCB1LnNldEVsZW1lbnRUcmFuc2Zvcm0oZSwgaSksIDEgPT0gdGhpcy5faW1hZ2VIb3BwZXIuZHJhZ1BhdGgubGVuZ3RoICYmIChlLnN0eWxlLm9wYWNpdHkgPSAxLCB1KGUuZmlyc3RDaGlsZCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wYWNpdHk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAuNSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21TY2FsZTogWzAsIDBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IFsuNSwgLjVdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDE1MFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbkZpbGVPdXRcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZVN0YXRlKFwiZmlsZS1vdmVyXCIpLCB0aGlzLl9yZW1vdmVTdGF0ZShcImZpbGUtaW52YWxpZFwiKSwgdGhpcy5fcmVtb3ZlRXJyb3IoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLl9nZXREcmlwKCksIGkgPSB1LmNyZWF0ZU1hdHJpeCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpLnRyYW5zbGF0ZSh0LmRldGFpbC54LCB0LmRldGFpbC55LCAwKSwgdS5zZXRFbGVtZW50VHJhbnNmb3JtKGUsIGkpLCB1KGUuZmlyc3RDaGlsZCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVNjYWxlOiBbLjUsIC41XSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiBbMCwgMF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tT3BhY2l0eTogLjUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDE1MCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeihlLmZpcnN0Q2hpbGQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfb25Ecm9wRmlsZVwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVTdGF0ZShcImZpbGUtb3ZlclwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLl9nZXREcmlwKCksIG4gPSB1LmNyZWF0ZU1hdHJpeCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuLnRyYW5zbGF0ZSh0LmRldGFpbC54LCB0LmRldGFpbC55LCAwKSwgdS5zZXRFbGVtZW50VHJhbnNmb3JtKGksIG4pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHRoaXMuX2ltYWdlSG9wcGVyLmRyYWdQYXRoLmxlbmd0aCwgYSA9IHRoaXMuX2ltYWdlSG9wcGVyLmRyYWdQYXRoW28gLSBNYXRoLm1pbigxMCwgbyldLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHQuZGV0YWlsLnggLSBhLngsIHMgPSB0LmRldGFpbC55IC0gYS55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1KGksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21Qb3NpdGlvbjogW3QuZGV0YWlsLngsIHQuZGV0YWlsLnksIDBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IFt0LmRldGFpbC54ICsgciwgdC5kZXRhaWwueSArIHMsIDBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDIwMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSwgdShpLmZpcnN0Q2hpbGQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21TY2FsZTogWy41LCAuNV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZTogWzIsIDJdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wYWNpdHk6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeihpLmZpcnN0Q2hpbGQpLCBlLl9sb2FkKHQudGFyZ2V0LmZpbGVzWzBdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uQ2hhbmdlXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0LnRhcmdldC5maWxlcy5sZW5ndGggJiYgdGhpcy5fbG9hZCh0LnRhcmdldC5maWxlc1swXSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9sb2FkXCIsIHZhbHVlOiBmdW5jdGlvbiAodCwgaSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRoaXMsIG8gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IGUgPyBhcmd1bWVudHNbMl0gOiB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0JlaW5nRGVzdHJveWVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250YWluc0ltYWdlKCkpIHJldHVybiBjbGVhclRpbWVvdXQodGhpcy5fcmVwbGFjZVRpbWVvdXQpLCB2b2lkIHRoaXMuX2RvUmVtb3ZlKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLl9yZXBsYWNlVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLl9sb2FkKHQsIGksIG8pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVTdGF0ZShcImVtcHR5XCIpLCB0aGlzLl9hZGRTdGF0ZShcImJ1c3lcIiksIHRoaXMuX3N0YXJ0UHJvZ3Jlc3NMb29wKCksIHRoaXMuX2ltYWdlSG9wcGVyICYmICh0aGlzLl9pbWFnZUhvcHBlci5lbmFibGVkID0gITEpLCBjbGVhclRpbWVvdXQodGhpcy5fbG9hZFRpbWVvdXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KG4uX2xvYWRUaW1lb3V0KSwgbi5fbG9hZFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5faXNCZWluZ0Rlc3Ryb3llZCB8fCAobi5fYWRkU3RhdGUoXCJsb2FkaW5nXCIpLCB1KG4uX2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zbGltLWxhYmVsLWxvYWRpbmdcIiksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21PcGFjaXR5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAyNTBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgNTAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLl9pbWFnZUhvcHBlciAmJiAobi5faW1hZ2VIb3BwZXIuZW5hYmxlZCA9ICEwKSwgbi5fcmVtb3ZlU3RhdGUoXCJsb2FkaW5nXCIpLCBuLl9yZW1vdmVTdGF0ZShcImJ1c3lcIiksIG4uX2FkZFN0YXRlKFwiZW1wdHlcIiksIG4uX3N0b3BQcm9ncmVzc0xvb3AoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiB0KSByZXR1cm4gdm9pZChYKHQpID8gdGhpcy5fbG9hZChaKHQpLCBpLCBvKSA6IChhKCksIEoodCwgdGhpcy5fb3B0aW9ucy53aWxsTG9hZCwgZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLl9sb2FkKHQsIGksIG8pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKCksIG4uX29uTG9jYWxVUkxQcm9ibGVtKFwiPHA+XCIgKyB0ICsgXCI8L3A+XCIpLCBpICYmIGkuYXBwbHkobiwgW1wibG9jYWwtdXJsLXByb2JsZW1cIl0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgNTAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcInVuZGVmaW5lZFwiICE9IHR5cGVvZiB0LnJlbW90ZSkgcmV0dXJuIFgodC5yZW1vdGUpID8gdm9pZCB0aGlzLl9sb2FkKFoodC5yZW1vdGUpLCBpLCBvKSA6IHZvaWQodGhpcy5fb3B0aW9ucy5mZXRjaGVyICYmIFkodGhpcy5fb3B0aW9ucy5mZXRjaGVyLCB0aGlzLl9vcHRpb25zLndpbGxGZXRjaCwgdGhpcy5fb3B0aW9ucy53aWxsTG9hZCwgdC5yZW1vdGUsIGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcigpLCBuLl9vblJlbW90ZVVSTFByb2JsZW0oXCI8cD5cIiArIHQgKyBcIjwvcD5cIiksIGkgJiYgaS5hcHBseShuLCBbXCJyZW1vdGUtdXJsLXByb2JsZW1cIl0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uX2xvYWQodCwgaSwgbylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbWFnZUhvcHBlciAmJiB0aGlzLl9pbWFnZUhvcHBlci5hY2NlcHQuaW5kZXhPZihzLnR5cGUpID09PSAtMSkgcmV0dXJuIHIoKSwgdGhpcy5fb25JbnZhbGlkRmlsZSgpLCB2b2lkKGkgJiYgaS5hcHBseSh0aGlzLCBbXCJmaWxlLWludmFsaWRcIl0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLnNpemUgJiYgdGhpcy5fb3B0aW9ucy5tYXhGaWxlU2l6ZSAmJiBEKHMuc2l6ZSkgPiB0aGlzLl9vcHRpb25zLm1heEZpbGVTaXplKSByZXR1cm4gcigpLCB0aGlzLl9vbk92ZXJXZWlnaHRGaWxlKCksIHZvaWQoaSAmJiBpLmFwcGx5KHRoaXMsIFtcImZpbGUtdG9vLWJpZ1wiXSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW1hZ2VFZGl0b3IgJiYgdGhpcy5faW1hZ2VFZGl0b3IuZGlydHkoKSwgdGhpcy5fZGF0YS5pbnB1dC5uYW1lID0gbyAmJiBvLm5hbWUgPyBvLm5hbWUgOiBxKHMpLCB0aGlzLl9kYXRhLmlucHV0LnR5cGUgPSBqKHMpLCB0aGlzLl9kYXRhLmlucHV0LnNpemUgPSBzLnNpemUsIHRoaXMuX2RhdGEuaW5wdXQuZmlsZSA9IHMsIFEocywgdGhpcy5fb3B0aW9ucy5pbnRlcm5hbENhbnZhc1NpemUsIGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uX2ltYWdlSG9wcGVyICYmIChuLl9pbWFnZUhvcHBlci5lbmFibGVkID0gITApLCBuLl9yZW1vdmVTdGF0ZShcImxvYWRpbmdcIiksIG4uX3JlbW92ZVN0YXRlKFwiYnVzeVwiKSwgbi5fYWRkU3RhdGUoXCJlbXB0eVwiKSwgbi5fc3RvcFByb2dyZXNzTG9vcCgpLCBuLl9yZXNldERhdGEoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0KSByZXR1cm4gYSgpLCB2b2lkKGkgJiYgaS5hcHBseShuLCBbXCJmaWxlLW5vdC1mb3VuZFwiXSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3QodCwgbi5fb3B0aW9ucy5taW5TaXplKSkgcmV0dXJuIGEoKSwgbi5fb25JbWFnZVRvb1NtYWxsKCksIHZvaWQoaSAmJiBpLmFwcGx5KG4sIFtcImltYWdlLXRvby1zbWFsbFwiXSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbi5fb3B0aW9ucy5kaWRMb2FkLmFwcGx5KG4sIFtzLCB0LCBlLCBuXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT09ICEwKSByZXR1cm4gYSgpLCByICE9PSAhMSAmJiBuLl90aHJvd0Vycm9yKHIpLCB2b2lkKGkgJiYgaS5hcHBseShuLCBbcl0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLl9yZW1vdmVTdGF0ZShcImxvYWRpbmdcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLl9pbWFnZUhvcHBlciAmJiBuLl9vcHRpb25zLmRyb3BSZXBsYWNlICYmIChuLl9pbWFnZUhvcHBlci5lbmFibGVkID0gITApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG4uX2dldEludHJvKCksIGkgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tU2NhbGU6IFsxLjI1LCAxLjI1XSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiBbMSwgMV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tT3BhY2l0eTogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHooZSksIGUuc3R5bGUub3BhY2l0eSA9IDEsIHQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmlzRGV0YWNoZWQoKSA/IGkuZHVyYXRpb24gPSAxIDogKGkuZWFzaW5nID0gXCJzcHJpbmdcIiwgaS5zcHJpbmdDb25zdGFudCA9IC4zLCBpLnNwcmluZ0RlY2VsZXJhdGlvbiA9IC43KSwgbi5fY2FuSW5zdGFudEVkaXQoKSAmJiAoaS5kZWxheSA9IDUwMCwgaS5kdXJhdGlvbiA9IDEsIG4uX2RvRWRpdCgpKSwgdShlLCBpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5fbG9hZENhbnZhcyh0LCBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLl9hZGRTdGF0ZShcInByZXZpZXdcIiksIGgoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5fY2FuSW5zdGFudEVkaXQoKSB8fCB0IHx8IG4uX3Nob3dCdXR0b25zKCksIHQgfHwgKG4uX3N0b3BQcm9ncmVzc0xvb3AoKSwgbi5fcmVtb3ZlU3RhdGUoXCJidXN5XCIpKSwgaSAmJiBpLmFwcGx5KG4sIFtudWxsLCBuLmRhdGFdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5fY2FuSW5zdGFudEVkaXQoKSB8fCBuLl9zaG93QnV0dG9ucygpLCBuLl9yZW1vdmVTdGF0ZShcImJ1c3lcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7YmxvY2tQdXNoOiBvLmJsb2NrUHVzaH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfbG9hZENhbnZhc1wiLCB2YWx1ZTogZnVuY3Rpb24gKHQsIGUsIGksIG4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobiB8fCAobiA9IHt9KSwgIXRoaXMuX2lzQmVpbmdEZXN0cm95ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGEuaW5wdXQuaW1hZ2UgPSB0LCB0aGlzLl9kYXRhLmlucHV0LndpZHRoID0gdC53aWR0aCwgdGhpcy5fZGF0YS5pbnB1dC5oZWlnaHQgPSB0LmhlaWdodCwgdGhpcy5faW5pdGlhbFJvdGF0aW9uICYmICh0aGlzLl9kYXRhLmFjdGlvbnMucm90YXRpb24gPSB0aGlzLl9pbml0aWFsUm90YXRpb24sIHRoaXMuX2luaXRpYWxSb3RhdGlvbiA9IG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB0aGlzLl9kYXRhLmFjdGlvbnMucm90YXRpb24gJSAxODAgIT09IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0ZpeGVkUmF0aW8oKSB8fCAodGhpcy5faW5pdGlhbENyb3AgPyB0aGlzLl9yYXRpbyA9IHRoaXMuX2luaXRpYWxDcm9wLmhlaWdodCAvIHRoaXMuX2luaXRpYWxDcm9wLndpZHRoIDogdGhpcy5fcmF0aW8gPSBhID8gdC53aWR0aCAvIHQuaGVpZ2h0IDogdC5oZWlnaHQgLyB0LndpZHRoLCB0aGlzLl9zY2FsZURyb3BBcmVhKHRoaXMuX3JhdGlvKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLl9vcHRpb25zLnNpemUgJiYgKG8uX2RhdGEuYWN0aW9ucy5zaXplID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogby5fb3B0aW9ucy5zaXplLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IG8uX29wdGlvbnMuc2l6ZS5oZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgby5fYXBwbHlUcmFuc2Zvcm1zKHQsIGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gby5fZ2V0SW50cm8oKSwgciA9IGEub2Zmc2V0V2lkdGggLyB0LndpZHRoLCBzID0gITE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uX29wdGlvbnMuc2VydmljZSAmJiBvLl9vcHRpb25zLnB1c2ggJiYgIW4uYmxvY2tQdXNoICYmIChvLl9oYXNJbml0aWFsSW1hZ2UgfHwgby5fY2FuSW5zdGFudEVkaXQoKSB8fCAocyA9ICEwLCBvLl9zdG9wUHJvZ3Jlc3NMb29wKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uX3N0YXJ0UHJvZ3Jlc3MoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uX3VwZGF0ZVByb2dyZXNzKC4xKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKSwgby5fY2FuSW5zdGFudEVkaXQoKSB8fCBvLl9zYXZlKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uX2lzQmVpbmdEZXN0cm95ZWQgfHwgcyAmJiAoby5fc3RvcFByb2dyZXNzKCksIGkoKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gXCJhdXRvXCIgPT09IG8uX29wdGlvbnMuZGV2aWNlUGl4ZWxSYXRpbyA/IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIDogby5fb3B0aW9ucy5kZXZpY2VQaXhlbFJhdGlvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnNyYyA9IFwiXCIsIGEuc3JjID0gaHQodCwgciAqIGgpLnRvRGF0YVVSTCgpLCBhLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEub25sb2FkID0gbnVsbCwgby5faXNCZWluZ0Rlc3Ryb3llZCB8fCBlICYmIGUocylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbENyb3AgPyAodGhpcy5fZGF0YS5hY3Rpb25zLmNyb3AgPSBtdCh0aGlzLl9pbml0aWFsQ3JvcCksIHRoaXMuX2RhdGEuYWN0aW9ucy5jcm9wLnR5cGUgPSBBdC5JTklUSUFMLCB0aGlzLl9pbml0aWFsQ3JvcCA9IG51bGwsIHIoKSkgOiB0aGlzLl9vcHRpb25zLndpbGxDcm9wSW5pdGlhbC5hcHBseSh0aGlzLCBbdGhpcy5kYXRhLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPyAoby5fZGF0YS5hY3Rpb25zLmNyb3AgPSBlLCBvLl9kYXRhLmFjdGlvbnMuY3JvcC50eXBlID0gQXQuSU5JVElBTCkgOiAoby5fZGF0YS5hY3Rpb25zLmNyb3AgPSB0dChhID8gdC5oZWlnaHQgOiB0LndpZHRoLCBhID8gdC53aWR0aCA6IHQuaGVpZ2h0LCBvLl9yYXRpbyksIG8uX2RhdGEuYWN0aW9ucy5jcm9wLnR5cGUgPSBBdC5BVVRPKSwgcigpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2FwcGx5VHJhbnNmb3Jtc1wiLCB2YWx1ZTogZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLCBuID0gbXQodGhpcy5fZGF0YS5hY3Rpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbi5maWx0ZXJzID0ge3NoYXJwZW46IHRoaXMuX29wdGlvbnMuZmlsdGVyU2hhcnBlbiAvIDEwMH0sIHRoaXMuX29wdGlvbnMuZm9yY2VNaW5TaXplID8gbi5taW5TaXplID0gdGhpcy5fb3B0aW9ucy5taW5TaXplIDogbi5taW5TaXplID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZXQodCwgbiwgZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLl9vcHRpb25zLmZvcmNlU2l6ZSB8fCBpLl9vcHRpb25zLnNpemUgJiYgMSA9PSBydChpLl9vcHRpb25zLnNpemUsIHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGsoXCJjYW52YXNcIiksIG4ud2lkdGggPSBpLl9vcHRpb25zLnNpemUud2lkdGgsIG4uaGVpZ2h0ID0gaS5fb3B0aW9ucy5zaXplLmhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG4uZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uZHJhd0ltYWdlKHQsIDAsIDAsIGkuX29wdGlvbnMuc2l6ZS53aWR0aCwgaS5fb3B0aW9ucy5zaXplLmhlaWdodClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLl9vcHRpb25zLmZvcmNlTWluU2l6ZSAmJiBpLl9vcHRpb25zLnNpemUgJiYgaS5fb3B0aW9ucy5taW5TaXplLndpZHRoID09PSBpLl9vcHRpb25zLnNpemUud2lkdGggJiYgaS5fb3B0aW9ucy5taW5TaXplLmhlaWdodCA9PT0gaS5fb3B0aW9ucy5zaXplLmhlaWdodCAmJiAobi53aWR0aCA8IGkuX29wdGlvbnMubWluU2l6ZS53aWR0aCB8fCBuLmhlaWdodCA8IGkuX29wdGlvbnMubWluU2l6ZS5oZWlnaHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBNYXRoLm1heChuLndpZHRoLCBpLl9vcHRpb25zLm1pblNpemUud2lkdGgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gTWF0aC5tYXgobi5oZWlnaHQsIGkuX29wdGlvbnMubWluU2l6ZS5oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBrKFwiY2FudmFzXCIpLCBuLndpZHRoID0gYSwgbi5oZWlnaHQgPSByO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gbi5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5kcmF3SW1hZ2UodCwgMCwgMCwgYSwgcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLl9vcHRpb25zLmZvcmNlTWluU2l6ZSAmJiAxID09PSBpLl9yYXRpbyAmJiAobi53aWR0aCA8IGkuX29wdGlvbnMubWluU2l6ZS53aWR0aCB8fCBuLmhlaWdodCA8IGkuX29wdGlvbnMubWluU2l6ZS5oZWlnaHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGsoXCJjYW52YXNcIiksIG4ud2lkdGggPSBpLl9vcHRpb25zLm1pblNpemUud2lkdGgsIG4uaGVpZ2h0ID0gaS5fb3B0aW9ucy5taW5TaXplLmhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IG4uZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGguZHJhd0ltYWdlKHQsIDAsIDAsIG4ud2lkdGgsIG4uaGVpZ2h0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5fZGF0YS5vdXRwdXQud2lkdGggPSBuLndpZHRoLCBpLl9kYXRhLm91dHB1dC5oZWlnaHQgPSBuLmhlaWdodCwgaS5fZGF0YS5vdXRwdXQuaW1hZ2UgPSBuLCBpLl9vblRyYW5zZm9ybUNhbnZhcyhmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuX2RhdGEgPSB0LCBpLl9vcHRpb25zLmRpZFRyYW5zZm9ybS5hcHBseShpLCBbaS5kYXRhLCBpXSksIGUoaS5fZGF0YS5vdXRwdXQuaW1hZ2UpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX29uVHJhbnNmb3JtQ2FudmFzXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLndpbGxUcmFuc2Zvcm0uYXBwbHkodGhpcywgW3RoaXMuZGF0YSwgdCwgdGhpc10pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfYXBwZW5kRWRpdG9yXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW1hZ2VFZGl0b3IgfHwgKHRoaXMuX2ltYWdlRWRpdG9yID0gbmV3IEl0KGsoXCJkaXZcIiksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblNpemU6IHRoaXMuX29wdGlvbnMubWluU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVBpeGVsUmF0aW86IHRoaXMuX29wdGlvbnMuZGV2aWNlUGl4ZWxSYXRpbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNvbmZpcm1DbGFzc05hbWU6IHRoaXMuX29wdGlvbnMuYnV0dG9uQ29uZmlybUNsYXNzTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNhbmNlbENsYXNzTmFtZTogdGhpcy5fb3B0aW9ucy5idXR0b25DYW5jZWxDbGFzc05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25Sb3RhdGVDbGFzc05hbWU6IHRoaXMuX29wdGlvbnMuYnV0dG9uUm90YXRlQ2xhc3NOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ29uZmlybUxhYmVsOiB0aGlzLl9vcHRpb25zLmJ1dHRvbkNvbmZpcm1MYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNhbmNlbExhYmVsOiB0aGlzLl9vcHRpb25zLmJ1dHRvbkNhbmNlbExhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uUm90YXRlTGFiZWw6IHRoaXMuX29wdGlvbnMuYnV0dG9uUm90YXRlTGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25Db25maXJtVGl0bGU6IHRoaXMuX29wdGlvbnMuYnV0dG9uQ29uZmlybVRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ2FuY2VsVGl0bGU6IHRoaXMuX29wdGlvbnMuYnV0dG9uQ2FuY2VsVGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25Sb3RhdGVUaXRsZTogdGhpcy5fb3B0aW9ucy5idXR0b25Sb3RhdGVUaXRsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSwgTnQuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5faW1hZ2VFZGl0b3IuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGUsIHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3NjYWxlRHJvcEFyZWFcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5fZ2V0UmF0aW9TcGFjZXJFbGVtZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgdGhpcy5fZWxlbWVudCAmJiAoZS5zdHlsZS5tYXJnaW5Cb3R0b20gPSAxMDAgKiB0ICsgXCIlXCIsIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1yYXRpb1wiLCBcIjE6XCIgKyB0KSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9vbkNhbmNlbFwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlU3RhdGUoXCJlZGl0b3JcIiksIHRoaXMuX29wdGlvbnMuZGlkQ2FuY2VsLmFwcGx5KHRoaXMsIFt0aGlzXSksIHRoaXMuX3Nob3dCdXR0b25zKCksIHRoaXMuX2hpZGVFZGl0b3IoKSwgdGhpcy5fb3B0aW9ucy5pbnN0YW50RWRpdCAmJiAhdGhpcy5faGFzSW5pdGlhbEltYWdlICYmIHRoaXMuX2lzQXV0b0Nyb3AoKSAmJiB0aGlzLl9kb1JlbW92ZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfb25Db25maXJtXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMsIGkgPSB0aGlzLl9vcHRpb25zLnNlcnZpY2UgJiYgdGhpcy5fb3B0aW9ucy5wdXNoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpID8gdGhpcy5fc3RhcnRQcm9ncmVzcyhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl91cGRhdGVQcm9ncmVzcyguMSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiB0aGlzLl9zdGFydFByb2dyZXNzTG9vcCgpLCB0aGlzLl9yZW1vdmVTdGF0ZShcImVkaXRvclwiKSwgdGhpcy5fYWRkU3RhdGUoXCJidXN5XCIpLCB0aGlzLl9vdXRwdXQudmFsdWUgPSBcIlwiLCB0aGlzLl9kYXRhLmFjdGlvbnMucm90YXRpb24gPSB0LmRldGFpbC5yb3RhdGlvbiwgdGhpcy5fZGF0YS5hY3Rpb25zLmNyb3AgPSB0LmRldGFpbC5jcm9wLCB0aGlzLl9kYXRhLmFjdGlvbnMuY3JvcC50eXBlID0gQXQuTUFOVUFMLCB0aGlzLl9hcHBseVRyYW5zZm9ybXModGhpcy5fZGF0YS5pbnB1dC5pbWFnZSwgZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX29wdGlvbnMuZGlkQ29uZmlybS5hcHBseShlLCBbZS5kYXRhLCBlXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuX2dldEluT3V0KCksIG8gPSBcIm91dFwiID09PSBuWzBdLmNsYXNzTmFtZSA/IG5bMF0gOiBuWzFdLCBhID0gbyA9PT0gblswXSA/IG5bMV0gOiBuWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgby5jbGFzc05hbWUgPSBcImluXCIsIG8uc3R5bGUub3BhY2l0eSA9IFwiMFwiLCBvLnN0eWxlLnpJbmRleCA9IFwiMlwiLCBhLmNsYXNzTmFtZSA9IFwib3V0XCIsIGEuc3R5bGUuekluZGV4ID0gXCIxXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFwiYXV0b1wiID09PSBlLl9vcHRpb25zLmRldmljZVBpeGVsUmF0aW8gPyB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA6IGUuX29wdGlvbnMuZGV2aWNlUGl4ZWxSYXRpbztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uc3JjID0gXCJcIiwgby5zcmMgPSBodCh0LCBvLm9mZnNldFdpZHRoIC8gdC53aWR0aCAqIHIpLnRvRGF0YVVSTCgpLCBvLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLm9ubG9hZCA9IG51bGwsIFwiZnJlZVwiID09PSBlLl9vcHRpb25zLnJhdGlvICYmIChlLl9yYXRpbyA9IG8ubmF0dXJhbEhlaWdodCAvIG8ubmF0dXJhbFdpZHRoLCBlLl9zY2FsZURyb3BBcmVhKGUuX3JhdGlvKSksIGUuX2hpZGVFZGl0b3IoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9zaG93UHJldmlldyhvLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9zYXZlKGZ1bmN0aW9uICh0LCBuLCBvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fdG9nZ2xlQnV0dG9uKFwidXBsb2FkXCIsICEwKSwgaSA/IGUuX3N0b3BQcm9ncmVzcygpIDogZS5fc3RvcFByb2dyZXNzTG9vcCgpLCBlLl9yZW1vdmVTdGF0ZShcImJ1c3lcIiksIGUuX3Nob3dCdXR0b25zKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjUwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl90aW1lcnMucHVzaCh0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2Nyb3BBdXRvXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSBlID8gYXJndW1lbnRzWzBdIDogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkgPSB0aGlzLl9kYXRhLmFjdGlvbnMucm90YXRpb24gJSAxODAgIT09IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gdHQoaSA/IHRoaXMuX2RhdGEuaW5wdXQuaW1hZ2UuaGVpZ2h0IDogdGhpcy5fZGF0YS5pbnB1dC5pbWFnZS53aWR0aCwgaSA/IHRoaXMuX2RhdGEuaW5wdXQuaW1hZ2Uud2lkdGggOiB0aGlzLl9kYXRhLmlucHV0LmltYWdlLmhlaWdodCwgdGhpcy5fcmF0aW8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jcm9wKG4ueCwgbi55LCBuLndpZHRoLCBuLmhlaWdodCwgdCwgQXQuQVVUTylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9jcm9wXCIsIHZhbHVlOiBmdW5jdGlvbiAodCwgaSwgbiwgbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gZSA/IGFyZ3VtZW50c1s0XSA6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IGUgPyBhcmd1bWVudHNbNV0gOiBBdC5NQU5VQUw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX291dHB1dC52YWx1ZSA9IFwiXCIsIHRoaXMuX2RhdGEuYWN0aW9ucy5jcm9wID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IGksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLl9kYXRhLmFjdGlvbnMuY3JvcC50eXBlID0gciwgdGhpcy5fbWFudWFsVHJhbnNmb3JtKGEpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfbWFudWFsVHJhbnNmb3JtXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0UHJvZ3Jlc3NMb29wKCksIHRoaXMuX2FkZFN0YXRlKFwiYnVzeVwiKSwgdGhpcy5fYXBwbHlUcmFuc2Zvcm1zKHRoaXMuX2RhdGEuaW5wdXQuaW1hZ2UsIGZ1bmN0aW9uIChpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuX2dldEluT3V0KCksIG8gPSBcIm91dFwiID09PSBuWzBdLmNsYXNzTmFtZSA/IG5bMF0gOiBuWzFdLCBhID0gbyA9PT0gblswXSA/IG5bMV0gOiBuWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgby5jbGFzc05hbWUgPSBcImluXCIsIG8uc3R5bGUub3BhY2l0eSA9IFwiMVwiLCBvLnN0eWxlLnpJbmRleCA9IFwiMlwiLCBhLmNsYXNzTmFtZSA9IFwib3V0XCIsIGEuc3R5bGUuekluZGV4ID0gXCIwXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFwiYXV0b1wiID09PSBlLl9vcHRpb25zLmRldmljZVBpeGVsUmF0aW8gPyB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA6IGUuX29wdGlvbnMuZGV2aWNlUGl4ZWxSYXRpbztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uc3JjID0gXCJcIiwgby5zcmMgPSBodChpLCBvLm9mZnNldFdpZHRoIC8gaS53aWR0aCAqIHIpLnRvRGF0YVVSTCgpLCBvLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLm9ubG9hZCA9IG51bGwsIFwiZnJlZVwiID09PSBlLl9vcHRpb25zLnJhdGlvICYmIChlLl9yYXRpbyA9IG8ubmF0dXJhbEhlaWdodCAvIG8ubmF0dXJhbFdpZHRoLCBlLl9zY2FsZURyb3BBcmVhKGUuX3JhdGlvKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBlLl9vcHRpb25zLnNlcnZpY2UgJiYgZS5fb3B0aW9ucy5wdXNoLCBuID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9zYXZlKGZ1bmN0aW9uIChuLCBvLCBhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIHx8IGUuX3N0b3BQcm9ncmVzc0xvb3AoKSwgZS5fcmVtb3ZlU3RhdGUoXCJidXN5XCIpLCB0LmFwcGx5KGUsIFtlLmRhdGFdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA/IGUuX3N0YXJ0UHJvZ3Jlc3MobikgOiBuKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9zYXZlXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcywgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gZSA/IGFyZ3VtZW50c1swXSA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgbiA9ICEoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSBlKSB8fCBhcmd1bWVudHNbMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5faXNCZWluZ0Rlc3Ryb3llZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB0aGlzLmRhdGFCYXNlNjQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLnNlcnZpY2UgfHwgdGhpcy5faXNJbml0aWFsaXNpbmcgJiYgIXRoaXMuX2lzSW1hZ2VPbmx5KCkgfHwgdGhpcy5fb3B0aW9ucy53aWxsU2F2ZS5hcHBseSh0aGlzLCBbbywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9zdG9yZShlKSwgdC5fb3B0aW9ucy5kaWRTYXZlLmFwcGx5KHQsIFtlLCB0XSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXNdKSwgdGhpcy5faXNCZWluZ0Rlc3Ryb3llZCB8fCAodGhpcy5fb3B0aW9ucy5zZXJ2aWNlICYmIG4gJiYgdGhpcy5fb3B0aW9ucy53aWxsU2F2ZS5hcHBseSh0aGlzLCBbbywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9hZGRTdGF0ZShcInVwbG9hZFwiKSwgdC5faW1hZ2VIb3BwZXIgJiYgdC5fb3B0aW9ucy5kcm9wUmVwbGFjZSAmJiAodC5faW1hZ2VIb3BwZXIuZW5hYmxlZCA9ICExKSwgdC5fdXBsb2FkKGUsIGZ1bmN0aW9uIChuLCBvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX2ltYWdlSG9wcGVyICYmIHQuX29wdGlvbnMuZHJvcFJlcGxhY2UgJiYgKHQuX2ltYWdlSG9wcGVyLmVuYWJsZWQgPSAhMCksIG4gfHwgdC5fc3RvcmVTZXJ2ZXJSZXNwb25zZShvKSwgdC5fb3B0aW9ucy5kaWRVcGxvYWQuYXBwbHkodCwgW24sIGUsIG8sIHRdKSwgdC5fcmVtb3ZlU3RhdGUoXCJ1cGxvYWRcIiksIGkobiwgZSwgbylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpc10pLCB0aGlzLl9vcHRpb25zLnNlcnZpY2UgJiYgbiB8fCBpKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9zdG9yZVNlcnZlclJlc3BvbnNlXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1JlcXVpcmVkICYmICh0aGlzLl9pbnB1dC5yZXF1aXJlZCA9ICExKSwgdGhpcy5fZGF0YS5zZXJ2ZXIgPSB0LCB0aGlzLl9vdXRwdXQudmFsdWUgPSBcIm9iamVjdFwiID09PSAoXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2YgdCA/IFwidW5kZWZpbmVkXCIgOiBjKHQpKSA/IEpTT04uc3RyaW5naWZ5KHRoaXMuX2RhdGEuc2VydmVyKSA6IHRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcIl9zdG9yZVwiLCB2YWx1ZTogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNSZXF1aXJlZCAmJiAodGhpcy5faW5wdXQucmVxdWlyZWQgPSAhMSksIHRoaXMuX291dHB1dC52YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHQpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfdXBsb2FkXCIsIHZhbHVlOiBmdW5jdGlvbiAodCwgZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdE91dHB1dChmdW5jdGlvbiAodCwgbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBpLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc2xpbS11cGxvYWQtc3RhdHVzXCIpLCBhID0gaS5fb3B0aW9ucy53aWxsUmVxdWVzdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gZnVuY3Rpb24gKHQsIGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5fdXBkYXRlUHJvZ3Jlc3MoTWF0aC5tYXgoLjEsIHQgLyBlKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaS5faXNCZWluZ0Rlc3Ryb3llZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uaW5uZXJIVE1MID0gaS5fb3B0aW9ucy5zdGF0dXNVcGxvYWRTdWNjZXNzLCBvLnNldEF0dHJpYnV0ZShcImRhdGEtc3RhdGVcIiwgXCJzdWNjZXNzXCIpLCBvLnN0eWxlLm9wYWNpdHkgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uc3R5bGUub3BhY2l0eSA9IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyZTMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuX3RpbWVycy5wdXNoKHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuX3RpbWVycy5wdXNoKG4pLCBlKG51bGwsIHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IFwiZmlsZS10b28tYmlnXCIgPT09IHQgPyBpLl9vcHRpb25zLnN0YXR1c0NvbnRlbnRMZW5ndGggOiBpLl9vcHRpb25zLmRpZFJlY2VpdmVTZXJ2ZXJFcnJvci5hcHBseShpLCBbdCwgaS5fb3B0aW9ucy5zdGF0dXNVbmtub3duUmVzcG9uc2UsIGldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uaW5uZXJIVE1MID0gbiwgby5zZXRBdHRyaWJ1dGUoXCJkYXRhLXN0YXRlXCIsIFwiZXJyb3JcIiksIG8uc3R5bGUub3BhY2l0eSA9IDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjUwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5fdGltZXJzLnB1c2goYSksIGUodClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzdHJpbmdcIiA9PSB0eXBlb2YgaS5fb3B0aW9ucy5zZXJ2aWNlID8gTyhpLl9vcHRpb25zLnNlcnZpY2UsIGkuX29wdGlvbnMudXBsb2FkTWV0aG9kLCBuLCBhLCByLCBzLCBoKSA6IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgaS5fb3B0aW9ucy5zZXJ2aWNlICYmIGkuX29wdGlvbnMuc2VydmljZS5hcHBseShpLCBbXCJmaWxlXCIgPT09IGkuX29wdGlvbnMuc2VydmljZUZvcm1hdCA/IHQgOiBuLCByLCBzLCBoLCBpXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcInJlcXVlc3RPdXRwdXRcIiwgdmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEuaW5wdXQuZmlsZSA/IChlIHx8IChlID0gdGhpcy5kYXRhQmFzZTY0KSwgdm9pZCBuLnBhcnNlTWV0YURhdGEodGhpcy5fZGF0YS5pbnB1dC5maWxlLCBmdW5jdGlvbiAobykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBbXSwgciA9IG5ldyBGb3JtRGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMKFwiaW5wdXRcIiwgaS5fb3B0aW9ucy5wb3N0KSAmJiAoYS5wdXNoKGkuX2RhdGEuaW5wdXQuZmlsZSksIHIuYXBwZW5kKGkuX2lucHV0UmVmZXJlbmNlLCBpLl9kYXRhLmlucHV0LmZpbGUsIGkuX2RhdGEuaW5wdXQuZmlsZS5uYW1lKSksIEwoXCJvdXRwdXRcIiwgaS5fb3B0aW9ucy5wb3N0KSAmJiBudWxsICE9PSBpLl9kYXRhLm91dHB1dC5pbWFnZSAmJiBpLl9vcHRpb25zLnVwbG9hZEJhc2U2NCA9PT0gITEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IFooZS5vdXRwdXQuaW1hZ2UsIGUub3V0cHV0Lm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvLmltYWdlSGVhZCAmJiBpLl9vcHRpb25zLmNvcHlJbWFnZUhlYWQpIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBuZXcgQmxvYihbby5pbWFnZUhlYWQsIG4uYmxvYlNsaWNlLmNhbGwocywgMjApXSwge3R5cGU6IHd0KGUub3V0cHV0LmltYWdlKX0pLCBzID0gRyhzLCBlLm91dHB1dC5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5wdXNoKHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gXCJzbGltX291dHB1dF9cIiArIGkuX3VpZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm91dHB1dC5pbWFnZSA9IG51bGwsIGUub3V0cHV0LmZpZWxkID0gdSwgci5hcHBlbmQodSwgcywgZS5vdXRwdXQubmFtZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuYXBwZW5kKGkuX291dHB1dC5uYW1lLCBKU09OLnN0cmluZ2lmeShlKSksIHQoYSwgcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwge21heE1ldGFEYXRhU2l6ZTogMjYyMTQ0LCBkaXNhYmxlSW1hZ2VIZWFkOiAhMX0pKSA6IHZvaWQgdChudWxsLCBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX3Nob3dFZGl0b3JcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgRnQuY2xhc3NOYW1lID0gdGhpcy5fb3B0aW9ucy5wb3BvdmVyQ2xhc3NOYW1lLCBGdC5zaG93KCksIHRoaXMuX2ltYWdlRWRpdG9yLnNob3coKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2hpZGVFZGl0b3JcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW1hZ2VFZGl0b3IuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRnQuaGlkZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpbWVycy5wdXNoKHQpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfc2hvd1ByZXZpZXdcIiwgdmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHUodCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVBvc2l0aW9uOiBbMCwgNTAsIDBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IFswLCAwLCAwXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21TY2FsZTogWzEuNSwgMS41XSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiBbMSwgMV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tT3BhY2l0eTogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXNpbmc6IFwic3ByaW5nXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbmdDb25zdGFudDogLjMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbmdEZWNlbGVyYXRpb246IC43LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6KHQpLCBlICYmIGUoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2hpZGVSZXN1bHRcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5fZ2V0SW50cm8oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiB1KGUsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21TY2FsZTogWzEsIDFdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IFsuNSwgLjVdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wYWNpdHk6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFzaW5nOiBcInNwcmluZ1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nQ29uc3RhbnQ6IC4zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nRGVjZWxlcmF0aW9uOiAuNzUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHooZSksIHQgJiYgdCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfc2hvd0J1dHRvbnNcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9idG5Hcm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnRuR3JvdXAuc3R5bGUuZGlzcGxheSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tU2NhbGU6IFsuNSwgLjVdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiBbMSwgMV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVBvc2l0aW9uOiBbMCwgMTAsIDBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBbMCwgMCwgMF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9wYWNpdHk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6KHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxEb25lOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgdCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNEZXRhY2hlZCgpID8gZS5kdXJhdGlvbiA9IDEgOiAoZS5kZWxheSA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI1MCArIDUwICogdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5lYXNpbmcgPSBcInNwcmluZ1wiLCBlLnNwcmluZ0NvbnN0YW50ID0gLjMsIGUuc3ByaW5nRGVjZWxlcmF0aW9uID0gLjg1KSwgdSh0aGlzLl9idG5Hcm91cC5jaGlsZE5vZGVzLCBlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfaGlkZUJ1dHRvbnNcIiwgdmFsdWU6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2J0bkdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tU2NhbGU6IFsxLCAxXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZTogWy44NSwgLjg1XSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tT3BhY2l0eTogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbERvbmU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fYnRuR3JvdXAuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiLCB0ICYmIHQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzRGV0YWNoZWQoKSA/IGkuZHVyYXRpb24gPSAxIDogKGkuZWFzaW5nID0gXCJzcHJpbmdcIiwgaS5zcHJpbmdDb25zdGFudCA9IC4zLCBpLnNwcmluZ0RlY2VsZXJhdGlvbiA9IC43NSksIHUodGhpcy5fYnRuR3JvdXAuY2hpbGROb2RlcywgaSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2hpZGVTdGF0dXNcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc2xpbS11cGxvYWQtc3RhdHVzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0LnN0eWxlLm9wYWNpdHkgPSAwXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfZG9FZGl0XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YS5pbnB1dC5pbWFnZSAmJiAodGhpcy5fYWRkU3RhdGUoXCJlZGl0b3JcIiksIHRoaXMuX2ltYWdlRWRpdG9yIHx8IHRoaXMuX2FwcGVuZEVkaXRvcigpLCB0aGlzLl9pbWFnZUVkaXRvci5zaG93Um90YXRlQnV0dG9uID0gdGhpcy5fb3B0aW9ucy5yb3RhdGVCdXR0b24sIEZ0LmlubmVyID0gdGhpcy5faW1hZ2VFZGl0b3IuZWxlbWVudCwgdGhpcy5faW1hZ2VFZGl0b3Iub3BlbihzdCh0aGlzLl9kYXRhLmlucHV0LmltYWdlKSwgXCJmcmVlXCIgPT09IHRoaXMuX29wdGlvbnMucmF0aW8gPyBudWxsIDogdGhpcy5fcmF0aW8sIHRoaXMuX2RhdGEuYWN0aW9ucy5jcm9wLCB0aGlzLl9kYXRhLmFjdGlvbnMucm90YXRpb24sIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX3Nob3dFZGl0b3IoKSwgdC5faGlkZUJ1dHRvbnMoKSwgdC5faGlkZVN0YXR1cygpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2RvUmVtb3ZlXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5faXNJbWFnZU9ubHkoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2xlYXJTdGF0ZSgpLCB0aGlzLl9hZGRTdGF0ZShcImVtcHR5XCIpLCB0aGlzLl9oYXNJbml0aWFsSW1hZ2UgPSAhMSwgdGhpcy5faW1hZ2VIb3BwZXIgJiYgKHRoaXMuX2ltYWdlSG9wcGVyLmVuYWJsZWQgPSAhMCksIHRoaXMuX2lzUmVxdWlyZWQgJiYgKHRoaXMuX2lucHV0LnJlcXVpcmVkID0gITApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLl9nZXRPdXRybygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiAoaS5zdHlsZS5vcGFjaXR5ID0gXCIwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXNldERhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5faXNCZWluZ0Rlc3Ryb3llZCB8fCAoZS5faGlkZUJ1dHRvbnMoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl90b2dnbGVCdXR0b24oXCJ1cGxvYWRcIiwgITApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUuX2hpZGVTdGF0dXMoKSwgZS5faGlkZVJlc3VsdCgpLCBlLl9vcHRpb25zLmRpZFJlbW92ZS5hcHBseShlLCBbbiwgZV0pLCB0ICYmIHQoKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuaXNEZXRhY2hlZCgpID8gMCA6IDI1MCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdGltZXJzLnB1c2gobyksIG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2RvVXBsb2FkXCIsIHZhbHVlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGEuaW5wdXQuaW1hZ2UgJiYgKHRoaXMuX2FkZFN0YXRlKFwidXBsb2FkXCIpLCB0aGlzLl9zdGFydFByb2dyZXNzKCksIHRoaXMuX2hpZGVCdXR0b25zKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX3RvZ2dsZUJ1dHRvbihcInVwbG9hZFwiLCAhMSksIGUuX3NhdmUoZnVuY3Rpb24gKGksIG4sIG8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9yZW1vdmVTdGF0ZShcInVwbG9hZFwiKSwgZS5fc3RvcFByb2dyZXNzKCksIHQgJiYgdC5hcHBseShlLCBbaSwgbiwgb10pLCBpICYmIGUuX3RvZ2dsZUJ1dHRvbihcInVwbG9hZFwiLCAhMCksIGUuX3Nob3dCdXR0b25zKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiX2RvRG93bmxvYWRcIiwgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLl9kYXRhLm91dHB1dC5pbWFnZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiBrdCh0aGlzLl9kYXRhLCB0aGlzLl9vcHRpb25zLmpwZWdDb21wcmVzc2lvbiwgdGhpcy5fb3B0aW9ucy5mb3JjZVR5cGUpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJfZG9EZXN0cm95XCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgIT09IGUuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubmFtZSA9PT0gZS5uYW1lICYmIHQudmFsdWUgPT09IGUudmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQmVpbmdEZXN0cm95ZWQgPSAhMCwgdGhpcy5fdGltZXJzLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5fdGltZXJzID0gW10sIHUodGhpcy5fZWxlbWVudCwgXCJkZXRhY2hcIiksIHRoaXMuX2ltYWdlSG9wcGVyICYmIChIdC5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9pbWFnZUhvcHBlci5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodCwgZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuX2ltYWdlSG9wcGVyLmRlc3Ryb3koKSwgdGhpcy5faW1hZ2VIb3BwZXIgPSBudWxsKSwgdGhpcy5faW1hZ2VFZGl0b3IgJiYgKE50LmZvckVhY2goZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX2ltYWdlRWRpdG9yLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LCBlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5faW1hZ2VFZGl0b3IuZGVzdHJveSgpLCB0aGlzLl9pbWFnZUVkaXRvciA9IG51bGwpLCBTdCh0aGlzLl9idG5Hcm91cC5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuX2lucHV0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgdGhpcyksIHRoaXMuX2VsZW1lbnQgIT09IHRoaXMuX29yaWdpbmFsRWxlbWVudCAmJiB0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUgJiYgdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLl9vcmlnaW5hbEVsZW1lbnQsIHRoaXMuX2VsZW1lbnQpLCB0aGlzLl9vcmlnaW5hbEVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy5fb3JpZ2luYWxFbGVtZW50SW5uZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gXyh0aGlzLl9vcmlnaW5hbEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpLmZvckVhY2goZnVuY3Rpb24gKGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoaSwgZS5fb3JpZ2luYWxFbGVtZW50QXR0cmlidXRlcykgfHwgZS5fb3JpZ2luYWxFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShpLm5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl9vcmlnaW5hbEVsZW1lbnRBdHRyaWJ1dGVzLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQobiwgaSkgfHwgZS5fb3JpZ2luYWxFbGVtZW50LnNldEF0dHJpYnV0ZShuLm5hbWUsIG4udmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBXdCA9IE1hdGgubWF4KDAsIFd0IC0gMSksIEZ0ICYmIDAgPT09IFd0ICYmIChGdC5kZXN0cm95KCksIEZ0ID0gbnVsbCksIHRoaXMuX29yaWdpbmFsRWxlbWVudCA9IG51bGwsIHRoaXMuX2VsZW1lbnQgPSBudWxsLCB0aGlzLl9pbnB1dCA9IG51bGwsIHRoaXMuX291dHB1dCA9IG51bGwsIHRoaXMuX2J0bkdyb3VwID0gbnVsbCwgdGhpcy5fb3B0aW9ucyA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcImRhdGFCYXNlNjRcIiwgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidCh0aGlzLl9kYXRhLCB0aGlzLl9vcHRpb25zLnBvc3QsIHRoaXMuX29wdGlvbnMuanBlZ0NvbXByZXNzaW9uLCB0aGlzLl9vcHRpb25zLmZvcmNlVHlwZSwgbnVsbCAhPT0gdGhpcy5fb3B0aW9ucy5zZXJ2aWNlKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZGF0YVwiLCBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZ0KHRoaXMuX2RhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJlbGVtZW50XCIsIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwic2VydmljZVwiLCBzZXQ6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuc2VydmljZSA9IHRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcInNpemVcIiwgc2V0OiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNpemUodCwgbnVsbClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcInJvdGF0aW9uXCIsIHNldDogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRSb3RhdGlvbih0LCBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IFwiZm9yY2VTaXplXCIsIHNldDogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRGb3JjZVNpemUodCwgbnVsbClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5OiBcInJhdGlvXCIsIHNldDogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRSYXRpbyh0LCBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1dLCBbe1xyXG4gICAgICAgICAgICAgICAgICAgIGtleTogXCJvcHRpb25zXCIsIHZhbHVlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdDogITAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW50RWRpdDogITEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWRCYXNlNjQ6ICExLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YToge30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpbzogXCJmcmVlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VQaXhlbFJhdGlvOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Q6IFtcIm91dHB1dFwiLCBcImFjdGlvbnNcIl0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUZvcm1hdDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclNoYXJwZW46IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoOiAhMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRJbnB1dE5hbWU6IFwic2xpbVtdXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5TaXplOiB7d2lkdGg6IDAsIGhlaWdodDogMH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhGaWxlU2l6ZTogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdDb21wcmVzc2lvbjogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZE1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZDogITEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlSW5pdGlhbEltYWdlOiAhMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlVHlwZTogITEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVNpemU6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZU1pblNpemU6ICEwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcFJlcGxhY2U6ICEwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hlcjogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsQ2FudmFzU2l6ZToge3dpZHRoOiA0MDk2LCBoZWlnaHQ6IDQwOTZ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weUltYWdlSGVhZDogITEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVCdXR0b246ICEwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wb3ZlckNsYXNzTmFtZTogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBcIjxwPkRyb3AgeW91ciBpbWFnZSBoZXJlPC9wPlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxMb2FkaW5nOiBcIjxwPkxvYWRpbmcgaW1hZ2UuLi48L3A+XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNGaWxlVHlwZTogXCI8cD5JbnZhbGlkIGZpbGUgdHlwZSwgZXhwZWN0czogJDAuPC9wPlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzRmlsZVNpemU6IFwiPHA+RmlsZSBpcyB0b28gYmlnLCBtYXhpbXVtIGZpbGUgc2l6ZTogJDAgTUIuPC9wPlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzTm9TdXBwb3J0OiBcIjxwPllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGltYWdlIGNyb3BwaW5nLjwvcD5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0ltYWdlVG9vU21hbGw6IFwiPHA+SW1hZ2UgaXMgdG9vIHNtYWxsLCBtaW5pbXVtIHNpemUgaXM6ICQwIHBpeGVscy48L3A+XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb250ZW50TGVuZ3RoOiAnPHNwYW4gY2xhc3M9XCJzbGltLXVwbG9hZC1zdGF0dXMtaWNvblwiPjwvc3Bhbj4gVGhlIGZpbGUgaXMgcHJvYmFibHkgdG9vIGJpZycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNVbmtub3duUmVzcG9uc2U6ICc8c3BhbiBjbGFzcz1cInNsaW0tdXBsb2FkLXN0YXR1cy1pY29uXCI+PC9zcGFuPiBBbiB1bmtub3duIGVycm9yIG9jY3VycmVkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1VwbG9hZFN1Y2Nlc3M6ICc8c3BhbiBjbGFzcz1cInNsaW0tdXBsb2FkLXN0YXR1cy1pY29uXCI+PC9zcGFuPiBTYXZlZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNMb2NhbFVybFByb2JsZW06IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWRJbml0OiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZExvYWQ6IGZ1bmN0aW9uICh0LCBlLCBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkU2F2ZTogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWRVcGxvYWQ6IGZ1bmN0aW9uICh0LCBlLCBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkUmVjZWl2ZVNlcnZlckVycm9yOiBmdW5jdGlvbiAodCwgZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkUmVtb3ZlOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFRyYW5zZm9ybTogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWRDb25maXJtOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZENhbmNlbDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFRocm93RXJyb3I6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsQ3JvcEluaXRpYWw6IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZShudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGxUcmFuc2Zvcm06IGZ1bmN0aW9uICh0LCBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSh0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGxTYXZlOiBmdW5jdGlvbiAodCwgZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUodClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsUmVtb3ZlOiBmdW5jdGlvbiAodCwgZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGxSZXF1ZXN0OiBmdW5jdGlvbiAodCwgZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGxGZXRjaDogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsTG9hZDogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJ0LmNvbmNhdChJdC5CdXR0b25zKS5jb25jYXQoXCJyb3RhdGVcIikuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBSKGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtcImJ1dHRvblwiICsgaSArIFwiQ2xhc3NOYW1lXCJdID0gbnVsbCwgdFtcImJ1dHRvblwiICsgaSArIFwiTGFiZWxcIl0gPSBpLCB0W1wiYnV0dG9uXCIgKyBpICsgXCJUaXRsZVwiXSA9IGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XSksIGlcclxuICAgICAgICAgICAgfSgpO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHQgPyBcIjxwPlwiICsgdCArIFwiPC9wPlwiIDogbnVsbFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiBlKHQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBlID0gd2luZG93LCBpID0gdC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaS5mb3JFYWNoKGZ1bmN0aW9uICh0LCBuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZVtpW25dXSAmJiAoZSA9IGVbaVtuXV0pXHJcbiAgICAgICAgICAgICAgICB9KSwgZSAhPT0gd2luZG93ID8gZSA6IG51bGxcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGkgPSBbXSwgbiA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMCwgbiA9IGkubGVuZ3RoOyBlIDwgbjsgZSsrKSBpZiAoaVtlXS5pc0F0dGFjaGVkVG8odCkpIHJldHVybiBlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xXHJcbiAgICAgICAgICAgIH0sIG8gPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRcclxuICAgICAgICAgICAgfSwgYSA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJ0cnVlXCIgPT09IHRcclxuICAgICAgICAgICAgfSwgciA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gIXQgfHwgXCJ0cnVlXCIgPT09IHRcclxuICAgICAgICAgICAgfSwgcyA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdChlKVxyXG4gICAgICAgICAgICB9LCBoID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0ID8gZSh0KSA6IG51bGxcclxuICAgICAgICAgICAgfSwgdSA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXQpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgdmFyIGUgPSB6dCh0LCBcIixcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBlWzBdLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogZVsxXVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBsID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0ID8gcGFyc2VGbG9hdCh0KSA6IG51bGxcclxuICAgICAgICAgICAgfSwgcCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdCA/IHBhcnNlSW50KHQsIDEwKSA6IG51bGxcclxuICAgICAgICAgICAgfSwgYyA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXQpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgdmFyIGUgPSB7fTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0LnNwbGl0KFwiLFwiKS5tYXAoZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodCwgMTApXHJcbiAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uICh0LCBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZVtVdFtpXV0gPSB0XHJcbiAgICAgICAgICAgICAgICB9KSwgZVxyXG4gICAgICAgICAgICB9LCBmID0ge1xyXG4gICAgICAgICAgICAgICAgZG93bmxvYWQ6IGEsXHJcbiAgICAgICAgICAgICAgICBlZGl0OiByLFxyXG4gICAgICAgICAgICAgICAgaW5zdGFudEVkaXQ6IGEsXHJcbiAgICAgICAgICAgICAgICBtaW5TaXplOiB1LFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogdSxcclxuICAgICAgICAgICAgICAgIGZvcmNlU2l6ZTogdSxcclxuICAgICAgICAgICAgICAgIGZvcmNlTWluU2l6ZTogcixcclxuICAgICAgICAgICAgICAgIGludGVybmFsQ2FudmFzU2l6ZTogdSxcclxuICAgICAgICAgICAgICAgIHNlcnZpY2U6IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgPT0gdHlwZW9mIHQpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0gZSh0KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSA/IGkgOiB0XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc2VydmljZUZvcm1hdDogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2YgdCA/IG51bGwgOiB0XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmV0Y2hlcjogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2YgdCA/IG51bGwgOiB0XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgcHVzaDogYSxcclxuICAgICAgICAgICAgICAgIHJvdGF0aW9uOiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiID09IHR5cGVvZiB0ID8gbnVsbCA6IHBhcnNlSW50KHQsIDEwKVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNyb3A6IGMsXHJcbiAgICAgICAgICAgICAgICBwb3N0OiBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID8gdC5zcGxpdChcIixcIikubWFwKGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRJbnB1dE5hbWU6IG8sXHJcbiAgICAgICAgICAgICAgICByYXRpbzogZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA/IHQgOiBudWxsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgbWF4RmlsZVNpemU6IGwsXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJTaGFycGVuOiBwLFxyXG4gICAgICAgICAgICAgICAganBlZ0NvbXByZXNzaW9uOiBwLFxyXG4gICAgICAgICAgICAgICAgdXBsb2FkQmFzZTY0OiBhLFxyXG4gICAgICAgICAgICAgICAgZm9yY2VUeXBlOiBvLFxyXG4gICAgICAgICAgICAgICAgZHJvcFJlcGxhY2U6IHIsXHJcbiAgICAgICAgICAgICAgICBzYXZlSW5pdGlhbEltYWdlOiBhLFxyXG4gICAgICAgICAgICAgICAgY29weUltYWdlSGVhZDogYSxcclxuICAgICAgICAgICAgICAgIHJvdGF0ZUJ1dHRvbjogcixcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBzLFxyXG4gICAgICAgICAgICAgICAgbGFiZWxMb2FkaW5nOiBzLFxyXG4gICAgICAgICAgICAgICAgcG9wb3ZlckNsYXNzTmFtZTogbyxcclxuICAgICAgICAgICAgICAgIGRldmljZVBpeGVsUmF0aW86IG8sXHJcbiAgICAgICAgICAgICAgICB1cGxvYWRNZXRob2Q6IG9cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgW1wiRmlsZVNpemVcIiwgXCJGaWxlVHlwZVwiLCBcIk5vU3VwcG9ydFwiLCBcIkltYWdlVG9vU21hbGxcIl0uZm9yRWFjaChmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgZltcInN0YXR1c1wiICsgdF0gPSBzXHJcbiAgICAgICAgICAgIH0pLCBbXCJDb250ZW50TGVuZ3RoXCIsIFwiVW5rbm93blJlc3BvbnNlXCIsIFwiVXBsb2FkU3VjY2Vzc1wiLCBcImxvY2FsVXJsUHJvYmxlbVwiXS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICBmW1wic3RhdHVzXCIgKyB0XSA9IG9cclxuICAgICAgICAgICAgfSksIFtcIkluaXRcIiwgXCJMb2FkXCIsIFwiU2F2ZVwiLCBcIlVwbG9hZFwiLCBcIlJlbW92ZVwiLCBcIlRyYW5zZm9ybVwiLCBcIlJlY2VpdmVTZXJ2ZXJFcnJvclwiLCBcIkNvbmZpcm1cIiwgXCJDYW5jZWxcIiwgXCJUaHJvd0Vycm9yXCJdLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgIGZbXCJkaWRcIiArIHRdID0gaFxyXG4gICAgICAgICAgICB9KSwgW1wiQ3JvcEluaXRpYWxcIiwgXCJUcmFuc2Zvcm1cIiwgXCJTYXZlXCIsIFwiUmVtb3ZlXCIsIFwiUmVxdWVzdFwiLCBcIkxvYWRcIiwgXCJGZXRjaFwiXS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICBmW1wid2lsbFwiICsgdF0gPSBoXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB2YXIgXyA9IFtcIkNsYXNzTmFtZVwiLCBcIkxhYmVsXCIsIFwiVGl0bGVcIl07XHJcbiAgICAgICAgICAgIEJ0LmNvbmNhdChJdC5CdXR0b25zKS5jb25jYXQoXCJyb3RhdGVcIikuZm9yRWFjaChmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGUgPSBSKHQpO1xyXG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZltcImJ1dHRvblwiICsgZSArIHRdID0gb1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSksIEd0LnN1cHBvcnRlZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAhKFwiW29iamVjdCBPcGVyYU1pbmldXCIgPT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3aW5kb3cub3BlcmFtaW5pKSB8fCBcInVuZGVmaW5lZFwiID09IHR5cGVvZiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciB8fCBcInVuZGVmaW5lZFwiID09IHR5cGVvZiB3aW5kb3cuRmlsZVJlYWRlciB8fCAhKFwic2xpY2VcIiBpbiBCbG9iLnByb3RvdHlwZSkgfHwgXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2Ygd2luZG93LlVSTCB8fCBcInVuZGVmaW5lZFwiID09IHR5cGVvZiB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTClcclxuICAgICAgICAgICAgfSgpLCBHdC5wYXJzZSA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZSwgaSwgbiwgbyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChlID0gdC5xdWVyeVNlbGVjdG9yQWxsKFwiLnNsaW06bm90KFtkYXRhLXN0YXRlXSlcIiksIG4gPSBlLmxlbmd0aDsgbi0tOykgaSA9IGVbbl0sIG8ucHVzaChHdC5jcmVhdGUoaSwgR3QuZ2V0T3B0aW9uc0Zyb21BdHRyaWJ1dGVzKGkpKSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1xyXG4gICAgICAgICAgICB9LCBHdC5nZXRPcHRpb25zRnJvbUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGUgPSBkKHQpLCBpID0ge21ldGE6IHt9fTtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvID0gZltuXSwgYSA9IGVbbl07XHJcbiAgICAgICAgICAgICAgICAgICAgbyA/IChhID0gbyhhKSwgYSA9IG51bGwgPT09IGEgPyBtdChHdC5vcHRpb25zKClbbl0pIDogYSwgaVtuXSA9IGEpIDogMCA9PT0gbi5pbmRleE9mKFwibWV0YVwiKSAmJiAoaS5tZXRhW00obi5zdWJzdHIoNCkpXSA9IGEpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaVxyXG4gICAgICAgICAgICB9LCBHdC5maW5kID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBlID0gaS5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5pc0F0dGFjaGVkVG8odClcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGUgPyBlWzBdIDogbnVsbFxyXG4gICAgICAgICAgICB9LCBHdC5jcmVhdGUgPSBmdW5jdGlvbiAodCwgZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFHdC5maW5kKHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZSB8fCAoZSA9IEd0LmdldE9wdGlvbnNGcm9tQXR0cmlidXRlcyh0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgR3QodCwgZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkucHVzaChuKSwgblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBHdC5kZXN0cm95ID0gZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBlID0gbih0KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAhKGUgPCAwKSAmJiAoaVtlXS5kZXN0cm95KCksIGkuc3BsaWNlKGUsIDEpLCAhMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0oKSwgR3RcclxuICAgIH0oKSwgdC5TbGltLnN1cHBvcnRlZCkgXCJsb2FkaW5nXCIgIT09IGRvY3VtZW50LnJlYWR5U3RhdGUgPyBpKCkgOiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBpKTsgZWxzZSB7XHJcbiAgICAgICAgdmFyIG4gPSB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJzbGltXCIpLCBvID0gMCwgYSA9IG4ubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobyA9IDA7IG8gPCBhOyBvKyspIG5bb10uY2xhc3NOYW1lID0gXCJcIlxyXG4gICAgfVxyXG59KHdpbmRvdyk7XHJcbiJdLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvc2xpbS5raWNrc3RhcnQubWluLmpzLmpzIiwic291cmNlUm9vdCI6IiJ9\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.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 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 return Constructor;\n }\n\n function _extends() {\n _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 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 subClass.__proto__ = superClass;\n }\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.0): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n /**\n * ------------------------------------------------------------------------\n * Private TransitionEnd Helpers\n * ------------------------------------------------------------------------\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 * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\n\n var Util = {\n TRANSITION_END: 'bsTransitionEnd',\n getUID: function getUID(prefix) {\n do {\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 * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\n var NAME = 'alert';\n var VERSION = '4.6.0';\n var DATA_KEY = 'bs.alert';\n var EVENT_KEY = \".\" + DATA_KEY;\n var DATA_API_KEY = '.data-api';\n var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];\n var SELECTOR_DISMISS = '[data-dismiss=\"alert\"]';\n var EVENT_CLOSE = \"close\" + EVENT_KEY;\n var EVENT_CLOSED = \"closed\" + EVENT_KEY;\n var EVENT_CLICK_DATA_API = \"click\" + EVENT_KEY + DATA_API_KEY;\n var CLASS_NAME_ALERT = 'alert';\n var CLASS_NAME_FADE = 'fade';\n var CLASS_NAME_SHOW = 'show';\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\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);\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);\n\n if (!$__default['default'](element).hasClass(CLASS_NAME_FADE)) {\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);\n\n if (!data) {\n data = new Alert(this);\n $element.data(DATA_KEY, 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;\n }\n }]);\n\n return Alert;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $__default['default'](document).on(EVENT_CLICK_DATA_API, SELECTOR_DISMISS, Alert._handleDismiss(new Alert()));\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $__default['default'].fn[NAME] = Alert._jQueryInterface;\n $__default['default'].fn[NAME].Constructor = Alert;\n\n $__default['default'].fn[NAME].noConflict = function () {\n $__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;\n return Alert._jQueryInterface;\n };\n\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\n var NAME$1 = 'button';\n var VERSION$1 = '4.6.0';\n var DATA_KEY$1 = 'bs.button';\n var EVENT_KEY$1 = \".\" + DATA_KEY$1;\n var DATA_API_KEY$1 = '.data-api';\n var JQUERY_NO_CONFLICT$1 = $__default['default'].fn[NAME$1];\n var CLASS_NAME_ACTIVE = 'active';\n var CLASS_NAME_BUTTON = 'btn';\n var CLASS_NAME_FOCUS = 'focus';\n var SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^=\"button\"]';\n var SELECTOR_DATA_TOGGLES = '[data-toggle=\"buttons\"]';\n var SELECTOR_DATA_TOGGLE = '[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 = '.active';\n var SELECTOR_BUTTON = '.btn';\n var EVENT_CLICK_DATA_API$1 = \"click\" + EVENT_KEY$1 + DATA_API_KEY$1;\n var EVENT_FOCUS_BLUR_DATA_API = \"focus\" + EVENT_KEY$1 + DATA_API_KEY$1 + \" \" + (\"blur\" + EVENT_KEY$1 + DATA_API_KEY$1);\n var EVENT_LOAD_DATA_API = \"load\" + EVENT_KEY$1 + DATA_API_KEY$1;\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\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)) {\n triggerChangeEvent = false;\n } else {\n var activeElement = rootElement.querySelector(SELECTOR_ACTIVE);\n\n if (activeElement) {\n $__default['default'](activeElement).removeClass(CLASS_NAME_ACTIVE);\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);\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));\n }\n\n if (triggerChangeEvent) {\n $__default['default'](this._element).toggleClass(CLASS_NAME_ACTIVE);\n }\n }\n };\n\n _proto.dispose = function dispose() {\n $__default['default'].removeData(this._element, DATA_KEY$1);\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$1);\n\n if (!data) {\n data = new Button(this);\n $element.data(DATA_KEY$1, 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$1;\n }\n }]);\n\n return Button;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $__default['default'](document).on(EVENT_CLICK_DATA_API$1, 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, 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);\n } else {\n button.classList.remove(CLASS_NAME_ACTIVE);\n }\n } // find all button toggles\n\n\n buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE));\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);\n } else {\n _button.classList.remove(CLASS_NAME_ACTIVE);\n }\n }\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $__default['default'].fn[NAME$1] = Button._jQueryInterface;\n $__default['default'].fn[NAME$1].Constructor = Button;\n\n $__default['default'].fn[NAME$1].noConflict = function () {\n $__default['default'].fn[NAME$1] = JQUERY_NO_CONFLICT$1;\n return Button._jQueryInterface;\n };\n\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\n var NAME$2 = 'carousel';\n var VERSION$2 = '4.6.0';\n var DATA_KEY$2 = 'bs.carousel';\n var EVENT_KEY$2 = \".\" + DATA_KEY$2;\n var DATA_API_KEY$2 = '.data-api';\n var JQUERY_NO_CONFLICT$2 = $__default['default'].fn[NAME$2];\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 Default = {\n interval: 5000,\n keyboard: true,\n slide: false,\n pause: 'hover',\n wrap: true,\n touch: true\n };\n var DefaultType = {\n interval: '(number|boolean)',\n keyboard: 'boolean',\n slide: '(boolean|string)',\n pause: '(string|boolean)',\n wrap: 'boolean',\n touch: 'boolean'\n };\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$2;\n var EVENT_SLID = \"slid\" + EVENT_KEY$2;\n var EVENT_KEYDOWN = \"keydown\" + EVENT_KEY$2;\n var EVENT_MOUSEENTER = \"mouseenter\" + EVENT_KEY$2;\n var EVENT_MOUSELEAVE = \"mouseleave\" + EVENT_KEY$2;\n var EVENT_TOUCHSTART = \"touchstart\" + EVENT_KEY$2;\n var EVENT_TOUCHMOVE = \"touchmove\" + EVENT_KEY$2;\n var EVENT_TOUCHEND = \"touchend\" + EVENT_KEY$2;\n var EVENT_POINTERDOWN = \"pointerdown\" + EVENT_KEY$2;\n var EVENT_POINTERUP = \"pointerup\" + EVENT_KEY$2;\n var EVENT_DRAG_START = \"dragstart\" + EVENT_KEY$2;\n var EVENT_LOAD_DATA_API$1 = \"load\" + EVENT_KEY$2 + DATA_API_KEY$2;\n var EVENT_CLICK_DATA_API$2 = \"click\" + EVENT_KEY$2 + DATA_API_KEY$2;\n var CLASS_NAME_CAROUSEL = 'carousel';\n var CLASS_NAME_ACTIVE$1 = '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 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 PointerType = {\n TOUCH: 'touch',\n PEN: 'pen'\n };\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\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$2);\n $__default['default'].removeData(this._element, DATA_KEY$2);\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, config);\n Util.typeCheckConfig(NAME$2, config, DefaultType);\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 if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n _this3.touchDeltaX = 0;\n } else {\n _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX;\n }\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$1);\n\n var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\n\n if (nextIndicator) {\n $__default['default'](nextIndicator).addClass(CLASS_NAME_ACTIVE$1);\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$1)) {\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$1);\n $__default['default'](activeElement).removeClass(CLASS_NAME_ACTIVE$1 + \" \" + 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$1);\n $__default['default'](nextElement).addClass(CLASS_NAME_ACTIVE$1);\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$2);\n\n var _config = _extends({}, Default, $__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$2, 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$2).to(slideIndex);\n }\n\n event.preventDefault();\n };\n\n _createClass(Carousel, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION$2;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default;\n }\n }]);\n\n return Carousel;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $__default['default'](document).on(EVENT_CLICK_DATA_API$2, 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 * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $__default['default'].fn[NAME$2] = Carousel._jQueryInterface;\n $__default['default'].fn[NAME$2].Constructor = Carousel;\n\n $__default['default'].fn[NAME$2].noConflict = function () {\n $__default['default'].fn[NAME$2] = JQUERY_NO_CONFLICT$2;\n return Carousel._jQueryInterface;\n };\n\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\n var NAME$3 = 'collapse';\n var VERSION$3 = '4.6.0';\n var DATA_KEY$3 = 'bs.collapse';\n var EVENT_KEY$3 = \".\" + DATA_KEY$3;\n var DATA_API_KEY$3 = '.data-api';\n var JQUERY_NO_CONFLICT$3 = $__default['default'].fn[NAME$3];\n var Default$1 = {\n toggle: true,\n parent: ''\n };\n var DefaultType$1 = {\n toggle: 'boolean',\n parent: '(string|element)'\n };\n var EVENT_SHOW = \"show\" + EVENT_KEY$3;\n var EVENT_SHOWN = \"shown\" + EVENT_KEY$3;\n var EVENT_HIDE = \"hide\" + EVENT_KEY$3;\n var EVENT_HIDDEN = \"hidden\" + EVENT_KEY$3;\n var EVENT_CLICK_DATA_API$3 = \"click\" + EVENT_KEY$3 + DATA_API_KEY$3;\n var CLASS_NAME_SHOW$1 = '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 SELECTOR_ACTIVES = '.show, .collapsing';\n var SELECTOR_DATA_TOGGLE$1 = '[data-toggle=\"collapse\"]';\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\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$1));\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$1)) {\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$1)) {\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$3);\n\n if (activesData && activesData._isTransitioning) {\n return;\n }\n }\n\n var startEvent = $__default['default'].Event(EVENT_SHOW);\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$3, 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$1);\n _this._element.style[dimension] = '';\n\n _this.setTransitioning(false);\n\n $__default['default'](_this._element).trigger(EVENT_SHOWN);\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$1)) {\n return;\n }\n\n var startEvent = $__default['default'].Event(EVENT_HIDE);\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$1);\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$1)) {\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);\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$3);\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$1, config);\n config.toggle = Boolean(config.toggle); // Coerce string values\n\n Util.typeCheckConfig(NAME$3, config, DefaultType$1);\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$1);\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$3);\n\n var _config = _extends({}, Default$1, $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$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(Collapse, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION$3;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default$1;\n }\n }]);\n\n return Collapse;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $__default['default'](document).on(EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$1, 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$3);\n var config = data ? 'toggle' : $trigger.data();\n\n Collapse._jQueryInterface.call($target, config);\n });\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $__default['default'].fn[NAME$3] = Collapse._jQueryInterface;\n $__default['default'].fn[NAME$3].Constructor = Collapse;\n\n $__default['default'].fn[NAME$3].noConflict = function () {\n $__default['default'].fn[NAME$3] = JQUERY_NO_CONFLICT$3;\n return Collapse._jQueryInterface;\n };\n\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\n var NAME$4 = 'dropdown';\n var VERSION$4 = '4.6.0';\n var DATA_KEY$4 = 'bs.dropdown';\n var EVENT_KEY$4 = \".\" + DATA_KEY$4;\n var DATA_API_KEY$4 = '.data-api';\n var JQUERY_NO_CONFLICT$4 = $__default['default'].fn[NAME$4];\n var ESCAPE_KEYCODE = 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);\n var EVENT_HIDE$1 = \"hide\" + EVENT_KEY$4;\n var EVENT_HIDDEN$1 = \"hidden\" + EVENT_KEY$4;\n var EVENT_SHOW$1 = \"show\" + EVENT_KEY$4;\n var EVENT_SHOWN$1 = \"shown\" + EVENT_KEY$4;\n var EVENT_CLICK = \"click\" + EVENT_KEY$4;\n var EVENT_CLICK_DATA_API$4 = \"click\" + EVENT_KEY$4 + DATA_API_KEY$4;\n var EVENT_KEYDOWN_DATA_API = \"keydown\" + EVENT_KEY$4 + DATA_API_KEY$4;\n var EVENT_KEYUP_DATA_API = \"keyup\" + EVENT_KEY$4 + DATA_API_KEY$4;\n var CLASS_NAME_DISABLED = 'disabled';\n var CLASS_NAME_SHOW$2 = '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 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$2 = {\n offset: 0,\n flip: true,\n boundary: 'scrollParent',\n reference: 'toggle',\n display: 'dynamic',\n popperConfig: null\n };\n var DefaultType$2 = {\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 * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\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)) {\n return;\n }\n\n var isActive = $__default['default'](this._menu).hasClass(CLASS_NAME_SHOW$2);\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) || $__default['default'](this._menu).hasClass(CLASS_NAME_SHOW$2)) {\n return;\n }\n\n var relatedTarget = {\n relatedTarget: this._element\n };\n var showEvent = $__default['default'].Event(EVENT_SHOW$1, 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 /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\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$2);\n $__default['default'](parent).toggleClass(CLASS_NAME_SHOW$2).trigger($__default['default'].Event(EVENT_SHOWN$1, relatedTarget));\n };\n\n _proto.hide = function hide() {\n if (this._element.disabled || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED) || !$__default['default'](this._menu).hasClass(CLASS_NAME_SHOW$2)) {\n return;\n }\n\n var relatedTarget = {\n relatedTarget: this._element\n };\n var hideEvent = $__default['default'].Event(EVENT_HIDE$1, 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$2);\n $__default['default'](parent).toggleClass(CLASS_NAME_SHOW$2).trigger($__default['default'].Event(EVENT_HIDDEN$1, relatedTarget));\n };\n\n _proto.dispose = function dispose() {\n $__default['default'].removeData(this._element, DATA_KEY$4);\n $__default['default'](this._element).off(EVENT_KEY$4);\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$4, 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$4);\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$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 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$4);\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$2)) {\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$1, 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$2);\n $__default['default'](parent).removeClass(CLASS_NAME_SHOW$2).trigger($__default['default'].Event(EVENT_HIDDEN$1, 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 && (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)) {\n return;\n }\n\n var parent = Dropdown._getParentFromElement(this);\n\n var isActive = $__default['default'](parent).hasClass(CLASS_NAME_SHOW$2);\n\n if (!isActive && event.which === ESCAPE_KEYCODE) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n if (!isActive || event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE) {\n if (event.which === ESCAPE_KEYCODE) {\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$4;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default$2;\n }\n }, {\n key: \"DefaultType\",\n get: function get() {\n return DefaultType$2;\n }\n }]);\n\n return Dropdown;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\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$4 + \" \" + EVENT_KEYUP_DATA_API, Dropdown._clearMenus).on(EVENT_CLICK_DATA_API$4, 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$4, SELECTOR_FORM_CHILD, function (e) {\n e.stopPropagation();\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $__default['default'].fn[NAME$4] = Dropdown._jQueryInterface;\n $__default['default'].fn[NAME$4].Constructor = Dropdown;\n\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 * Constants\n * ------------------------------------------------------------------------\n */\n\n var NAME$5 = 'modal';\n var VERSION$5 = '4.6.0';\n var DATA_KEY$5 = 'bs.modal';\n var EVENT_KEY$5 = \".\" + DATA_KEY$5;\n var DATA_API_KEY$5 = '.data-api';\n var JQUERY_NO_CONFLICT$5 = $__default['default'].fn[NAME$5];\n var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n var Default$3 = {\n backdrop: true,\n keyboard: true,\n focus: true,\n show: true\n };\n var DefaultType$3 = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n focus: 'boolean',\n show: 'boolean'\n };\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 = \"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$5 = \"click\" + EVENT_KEY$5 + DATA_API_KEY$5;\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$1 = 'fade';\n var CLASS_NAME_SHOW$3 = 'show';\n var CLASS_NAME_STATIC = 'modal-static';\n var SELECTOR_DIALOG = '.modal-dialog';\n var SELECTOR_MODAL_BODY = '.modal-body';\n var SELECTOR_DATA_TOGGLE$3 = '[data-toggle=\"modal\"]';\n var SELECTOR_DATA_DISMISS = '[data-dismiss=\"modal\"]';\n var SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\n var SELECTOR_STICKY_CONTENT = '.sticky-top';\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\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 if ($__default['default'](this._element).hasClass(CLASS_NAME_FADE$1)) {\n this._isTransitioning = true;\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 (this._isShown || showEvent.isDefaultPrevented()) {\n return;\n }\n\n this._isShown = true;\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, SELECTOR_DATA_DISMISS, 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$1);\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$3);\n $__default['default'](this._element).off(EVENT_CLICK_DISMISS);\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$3, config);\n Util.typeCheckConfig(NAME$5, config, DefaultType$3);\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$1);\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$3);\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$1) {\n event.preventDefault();\n\n _this6.hide();\n } else if (!_this6._config.keyboard && event.which === ESCAPE_KEYCODE$1) {\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$1) ? CLASS_NAME_FADE$1 : '';\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, 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$3);\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$3);\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$1)) {\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$3, $__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$3;\n }\n }]);\n\n return Modal;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $__default['default'](document).on(EVENT_CLICK_DATA_API$5, SELECTOR_DATA_TOGGLE$3, 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 * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\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.0): 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 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\n\n var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/gi;\n /**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/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(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN));\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 (attrName.match(regExp[i])) {\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);\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 * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\n var NAME$6 = 'tooltip';\n var VERSION$6 = '4.6.0';\n var DATA_KEY$6 = 'bs.tooltip';\n var EVENT_KEY$6 = \".\" + DATA_KEY$6;\n var JQUERY_NO_CONFLICT$6 = $__default['default'].fn[NAME$6];\n var CLASS_PREFIX = 'bs-tooltip';\n var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];\n var DefaultType$4 = {\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 AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: 'right',\n BOTTOM: 'bottom',\n LEFT: 'left'\n };\n var Default$4 = {\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 HOVER_STATE_SHOW = 'show';\n var HOVER_STATE_OUT = 'out';\n var Event = {\n HIDE: \"hide\" + EVENT_KEY$6,\n HIDDEN: \"hidden\" + EVENT_KEY$6,\n SHOW: \"show\" + EVENT_KEY$6,\n SHOWN: \"shown\" + EVENT_KEY$6,\n INSERTED: \"inserted\" + EVENT_KEY$6,\n CLICK: \"click\" + EVENT_KEY$6,\n FOCUSIN: \"focusin\" + EVENT_KEY$6,\n FOCUSOUT: \"focusout\" + EVENT_KEY$6,\n MOUSEENTER: \"mouseenter\" + EVENT_KEY$6,\n MOUSELEAVE: \"mouseleave\" + EVENT_KEY$6\n };\n var CLASS_NAME_FADE$2 = 'fade';\n var CLASS_NAME_SHOW$4 = 'show';\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 /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\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$4)) {\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$2);\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$4);\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$2)) {\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$4); // 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$2)) {\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 + \"-\" + 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$2 + \" \" + CLASS_NAME_SHOW$4);\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$4) || 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$6, 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);\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$2);\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$6);\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$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 _createClass(Tooltip, null, [{\n key: \"VERSION\",\n get: function get() {\n return VERSION$6;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default$4;\n }\n }, {\n key: \"NAME\",\n get: function get() {\n return NAME$6;\n }\n }, {\n key: \"DATA_KEY\",\n get: function get() {\n return DATA_KEY$6;\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$6;\n }\n }, {\n key: \"DefaultType\",\n get: function get() {\n return DefaultType$4;\n }\n }]);\n\n return Tooltip;\n }();\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n\n $__default['default'].fn[NAME$6] = Tooltip._jQueryInterface;\n $__default['default'].fn[NAME$6].Constructor = Tooltip;\n\n $__default['default'].fn[NAME$6].noConflict = function () {\n $__default['default'].fn[NAME$6] = JQUERY_NO_CONFLICT$6;\n return Tooltip._jQueryInterface;\n };\n\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\n var NAME$7 = 'popover';\n var VERSION$7 = '4.6.0';\n var DATA_KEY$7 = 'bs.popover';\n var EVENT_KEY$7 = \".\" + DATA_KEY$7;\n var JQUERY_NO_CONFLICT$7 = $__default['default'].fn[NAME$7];\n var CLASS_PREFIX$1 = 'bs-popover';\n var BSCLS_PREFIX_REGEX$1 = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX$1 + \"\\\\S+\", 'g');\n\n var Default$5 = _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$5 = _extends({}, Tooltip.DefaultType, {\n content: '(string|element|function)'\n });\n\n var CLASS_NAME_FADE$3 = 'fade';\n var CLASS_NAME_SHOW$5 = 'show';\n var SELECTOR_TITLE = '.popover-header';\n var SELECTOR_CONTENT = '.popover-body';\n var Event$1 = {\n HIDE: \"hide\" + EVENT_KEY$7,\n HIDDEN: \"hidden\" + EVENT_KEY$7,\n SHOW: \"show\" + EVENT_KEY$7,\n SHOWN: \"shown\" + EVENT_KEY$7,\n INSERTED: \"inserted\" + EVENT_KEY$7,\n CLICK: \"click\" + EVENT_KEY$7,\n FOCUSIN: \"focusin\" + EVENT_KEY$7,\n FOCUSOUT: \"focusout\" + EVENT_KEY$7,\n MOUSEENTER: \"mouseenter\" + EVENT_KEY$7,\n MOUSELEAVE: \"mouseleave\" + EVENT_KEY$7\n };\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\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$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 = $__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$3 + \" \" + CLASS_NAME_SHOW$5);\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$1);\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$7);\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$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(Popover, null, [{\n key: \"VERSION\",\n // Getters\n get: function get() {\n return VERSION$7;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default$5;\n }\n }, {\n key: \"NAME\",\n get: function get() {\n return NAME$7;\n }\n }, {\n key: \"DATA_KEY\",\n get: function get() {\n return DATA_KEY$7;\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$7;\n }\n }, {\n key: \"DefaultType\",\n get: function get() {\n return DefaultType$5;\n }\n }]);\n\n return Popover;\n }(Tooltip);\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n\n $__default['default'].fn[NAME$7] = Popover._jQueryInterface;\n $__default['default'].fn[NAME$7].Constructor = Popover;\n\n $__default['default'].fn[NAME$7].noConflict = function () {\n $__default['default'].fn[NAME$7] = JQUERY_NO_CONFLICT$7;\n return Popover._jQueryInterface;\n };\n\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\n var NAME$8 = 'scrollspy';\n var VERSION$8 = '4.6.0';\n var DATA_KEY$8 = 'bs.scrollspy';\n var EVENT_KEY$8 = \".\" + DATA_KEY$8;\n var DATA_API_KEY$6 = '.data-api';\n var JQUERY_NO_CONFLICT$8 = $__default['default'].fn[NAME$8];\n var Default$6 = {\n offset: 10,\n method: 'auto',\n target: ''\n };\n var DefaultType$6 = {\n offset: 'number',\n method: 'string',\n target: '(string|element)'\n };\n var EVENT_ACTIVATE = \"activate\" + EVENT_KEY$8;\n var EVENT_SCROLL = \"scroll\" + EVENT_KEY$8;\n var EVENT_LOAD_DATA_API$2 = \"load\" + EVENT_KEY$8 + DATA_API_KEY$6;\n var CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\n var CLASS_NAME_ACTIVE$2 = 'active';\n var SELECTOR_DATA_SPY = '[data-spy=\"scroll\"]';\n var SELECTOR_NAV_LIST_GROUP = '.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 = '.dropdown';\n var SELECTOR_DROPDOWN_ITEMS = '.dropdown-item';\n var SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';\n var METHOD_OFFSET = 'offset';\n var METHOD_POSITION = 'position';\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\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(function (item) {\n return item;\n }).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$8);\n $__default['default'](this._scrollElement).off(EVENT_KEY$8);\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$6, 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$8);\n $__default['default'](config.target).attr('id', id);\n }\n\n config.target = \"#\" + id;\n }\n\n Util.typeCheckConfig(NAME$8, config, DefaultType$6);\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).find(SELECTOR_DROPDOWN_TOGGLE).addClass(CLASS_NAME_ACTIVE$2);\n $link.addClass(CLASS_NAME_ACTIVE$2);\n } else {\n // Set triggered link as active\n $link.addClass(CLASS_NAME_ACTIVE$2); // 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).prev(SELECTOR_NAV_LINKS + \", \" + SELECTOR_LIST_ITEMS).addClass(CLASS_NAME_ACTIVE$2); // Handle special case when .nav-link is inside .nav-item\n\n $link.parents(SELECTOR_NAV_LIST_GROUP).prev(SELECTOR_NAV_ITEMS).children(SELECTOR_NAV_LINKS).addClass(CLASS_NAME_ACTIVE$2);\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$2);\n }).forEach(function (node) {\n return node.classList.remove(CLASS_NAME_ACTIVE$2);\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$8);\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$8, 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$8;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default$6;\n }\n }]);\n\n return ScrollSpy;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $__default['default'](window).on(EVENT_LOAD_DATA_API$2, 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 * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $__default['default'].fn[NAME$8] = ScrollSpy._jQueryInterface;\n $__default['default'].fn[NAME$8].Constructor = ScrollSpy;\n\n $__default['default'].fn[NAME$8].noConflict = function () {\n $__default['default'].fn[NAME$8] = JQUERY_NO_CONFLICT$8;\n return ScrollSpy._jQueryInterface;\n };\n\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\n var NAME$9 = 'tab';\n var VERSION$9 = '4.6.0';\n var DATA_KEY$9 = 'bs.tab';\n var EVENT_KEY$9 = \".\" + DATA_KEY$9;\n var DATA_API_KEY$7 = '.data-api';\n var JQUERY_NO_CONFLICT$9 = $__default['default'].fn[NAME$9];\n var EVENT_HIDE$3 = \"hide\" + EVENT_KEY$9;\n var EVENT_HIDDEN$3 = \"hidden\" + EVENT_KEY$9;\n var EVENT_SHOW$3 = \"show\" + EVENT_KEY$9;\n var EVENT_SHOWN$3 = \"shown\" + EVENT_KEY$9;\n var EVENT_CLICK_DATA_API$6 = \"click\" + EVENT_KEY$9 + DATA_API_KEY$7;\n var CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';\n var CLASS_NAME_ACTIVE$3 = 'active';\n var CLASS_NAME_DISABLED$1 = 'disabled';\n var CLASS_NAME_FADE$4 = 'fade';\n var CLASS_NAME_SHOW$6 = 'show';\n var SELECTOR_DROPDOWN$1 = '.dropdown';\n var SELECTOR_NAV_LIST_GROUP$1 = '.nav, .list-group';\n var SELECTOR_ACTIVE$2 = '.active';\n var SELECTOR_ACTIVE_UL = '> li > .active';\n var SELECTOR_DATA_TOGGLE$4 = '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]';\n var SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\n var SELECTOR_DROPDOWN_ACTIVE_CHILD = '> .dropdown-menu .active';\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\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$3) || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED$1)) {\n return;\n }\n\n var target;\n var previous;\n var listElement = $__default['default'](this._element).closest(SELECTOR_NAV_LIST_GROUP$1)[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$2;\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$3, {\n relatedTarget: this._element\n });\n var showEvent = $__default['default'].Event(EVENT_SHOW$3, {\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$3, {\n relatedTarget: _this._element\n });\n var shownEvent = $__default['default'].Event(EVENT_SHOWN$3, {\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$9);\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$2);\n var active = activeElements[0];\n var isTransitioning = callback && active && $__default['default'](active).hasClass(CLASS_NAME_FADE$4);\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$6).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$3);\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$3);\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$3);\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$4)) {\n element.classList.add(CLASS_NAME_SHOW$6);\n }\n\n if (element.parentNode && $__default['default'](element.parentNode).hasClass(CLASS_NAME_DROPDOWN_MENU)) {\n var dropdownElement = $__default['default'](element).closest(SELECTOR_DROPDOWN$1)[0];\n\n if (dropdownElement) {\n var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(SELECTOR_DROPDOWN_TOGGLE$1));\n $__default['default'](dropdownToggleList).addClass(CLASS_NAME_ACTIVE$3);\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$9);\n\n if (!data) {\n data = new Tab(this);\n $this.data(DATA_KEY$9, 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$9;\n }\n }]);\n\n return Tab;\n }();\n /**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\n $__default['default'](document).on(EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$4, function (event) {\n event.preventDefault();\n\n Tab._jQueryInterface.call($__default['default'](this), 'show');\n });\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n $__default['default'].fn[NAME$9] = Tab._jQueryInterface;\n $__default['default'].fn[NAME$9].Constructor = Tab;\n\n $__default['default'].fn[NAME$9].noConflict = function () {\n $__default['default'].fn[NAME$9] = JQUERY_NO_CONFLICT$9;\n return Tab._jQueryInterface;\n };\n\n /**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\n var NAME$a = 'toast';\n var VERSION$a = '4.6.0';\n var DATA_KEY$a = 'bs.toast';\n var EVENT_KEY$a = \".\" + DATA_KEY$a;\n var JQUERY_NO_CONFLICT$a = $__default['default'].fn[NAME$a];\n var EVENT_CLICK_DISMISS$1 = \"click.dismiss\" + EVENT_KEY$a;\n var EVENT_HIDE$4 = \"hide\" + EVENT_KEY$a;\n var EVENT_HIDDEN$4 = \"hidden\" + EVENT_KEY$a;\n var EVENT_SHOW$4 = \"show\" + EVENT_KEY$a;\n var EVENT_SHOWN$4 = \"shown\" + EVENT_KEY$a;\n var CLASS_NAME_FADE$5 = 'fade';\n var CLASS_NAME_HIDE = 'hide';\n var CLASS_NAME_SHOW$7 = 'show';\n var CLASS_NAME_SHOWING = 'showing';\n var DefaultType$7 = {\n animation: 'boolean',\n autohide: 'boolean',\n delay: 'number'\n };\n var Default$7 = {\n animation: true,\n autohide: true,\n delay: 500\n };\n var SELECTOR_DATA_DISMISS$1 = '[data-dismiss=\"toast\"]';\n /**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\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$4);\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$5);\n }\n\n var complete = function complete() {\n _this._element.classList.remove(CLASS_NAME_SHOWING);\n\n _this._element.classList.add(CLASS_NAME_SHOW$7);\n\n $__default['default'](_this._element).trigger(EVENT_SHOWN$4);\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$7)) {\n return;\n }\n\n var hideEvent = $__default['default'].Event(EVENT_HIDE$4);\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$7)) {\n this._element.classList.remove(CLASS_NAME_SHOW$7);\n }\n\n $__default['default'](this._element).off(EVENT_CLICK_DISMISS$1);\n $__default['default'].removeData(this._element, DATA_KEY$a);\n this._element = null;\n this._config = null;\n } // Private\n ;\n\n _proto._getConfig = function _getConfig(config) {\n config = _extends({}, Default$7, $__default['default'](this._element).data(), typeof config === 'object' && config ? config : {});\n Util.typeCheckConfig(NAME$a, 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$1, SELECTOR_DATA_DISMISS$1, 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$4);\n };\n\n this._element.classList.remove(CLASS_NAME_SHOW$7);\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$a);\n\n var _config = typeof config === 'object' && config;\n\n if (!data) {\n data = new Toast(this, _config);\n $element.data(DATA_KEY$a, 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$a;\n }\n }, {\n key: \"DefaultType\",\n get: function get() {\n return DefaultType$7;\n }\n }, {\n key: \"Default\",\n get: function get() {\n return Default$7;\n }\n }]);\n\n return Toast;\n }();\n /**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n\n $__default['default'].fn[NAME$a] = Toast._jQueryInterface;\n $__default['default'].fn[NAME$a].Constructor = Toast;\n\n $__default['default'].fn[NAME$a].noConflict = function () {\n $__default['default'].fn[NAME$a] = JQUERY_NO_CONFLICT$a;\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2Rpc3QvanMvYm9vdHN0cmFwLmpzPzQ5ODkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxLQUE0RCxvQkFBb0IsbUJBQU8sQ0FBQyxvREFBUSxHQUFHLG1CQUFPLENBQUMsOERBQVc7QUFDeEgsRUFBRSxDQUN3STtBQUMxSSxDQUFDLHVDQUF1Qzs7QUFFeEMsc0NBQXNDLDREQUE0RCxnQkFBZ0I7O0FBRWxIO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIsa0JBQWtCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQixzQkFBc0I7QUFDM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRTtBQUNoRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUMsT0FBTzs7QUFFUDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7O0FBRTdEO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QjtBQUM3QixLQUFLO0FBQ0w7O0FBRUE7QUFDQSwrQkFBK0I7O0FBRS9CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx5Q0FBeUMsU0FBUztBQUNsRDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7OztBQUdMOztBQUVBLDJDQUEyQyxXQUFXO0FBQ3REOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUIsK0JBQStCOztBQUUvQixtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMERBQTBEO0FBQzFEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjs7QUFFM0I7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlDQUFpQzs7QUFFakM7QUFDQSwrQkFBK0I7QUFDL0I7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEI7O0FBRTlCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUEsMkNBQTJDLFNBQVM7QUFDcEQ7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhDQUE4QyxTQUFTO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1Qix3QkFBd0I7QUFDL0M7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCLDZDQUE2Qzs7QUFFN0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDLGdGQUFnRjs7QUFFakg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQix5QkFBeUI7O0FBRXpCLHNCQUFzQjs7QUFFdEIsNEJBQTRCOztBQUU1Qiw4QkFBOEI7O0FBRTlCLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVCxvREFBb0Q7O0FBRXBEO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxvQ0FBb0MsMEVBQTBFO0FBQzlHO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3QjtBQUN4QixLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsMkNBQTJDLFNBQVM7QUFDcEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qjs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsT0FBTzs7QUFFUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEZBQThGOztBQUU5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsRUFBRTs7QUFFWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsRUFBRTs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxFQUFFOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLEVBQUU7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDLG1HQUFtRzs7QUFFcEk7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHdGQUF3Rjs7QUFFeEY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVJQUF1STs7QUFFdkk7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLLEVBQUU7O0FBRVAsd0NBQXdDLFNBQVM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQSwwQ0FBMEMsU0FBUztBQUNuRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7O0FBRTFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUVBQXFFO0FBQ3JFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxnRUFBZ0U7QUFDaEU7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLG9DQUFvQyx3RUFBd0U7QUFDNUc7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsMEJBQTBCLDhGQUE4Rjs7QUFFeEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVILGlDQUFpQztBQUNqQztBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZEQUE2RDs7QUFFN0Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsMEJBQTBCLCtEQUErRDs7QUFFekY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSx3Q0FBd0MsS0FBSztBQUM3Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE9BQU87O0FBRVA7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBLG1JQUFtSTs7QUFFbkk7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQyxLQUFLO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSwwQkFBMEIsNEdBQTRHO0FBQ3RJO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnREFBZ0QsY0FBYzs7QUFFOUQsQ0FBQztBQUNEIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9kaXN0L2pzL2Jvb3RzdHJhcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICAqIEJvb3RzdHJhcCB2NC42LjAgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pXG4gICogQ29weXJpZ2h0IDIwMTEtMjAyMSBUaGUgQm9vdHN0cmFwIEF1dGhvcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ncmFwaHMvY29udHJpYnV0b3JzKVxuICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCdqcXVlcnknKSwgcmVxdWlyZSgncG9wcGVyLmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdqcXVlcnknLCAncG9wcGVyLmpzJ10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuYm9vdHN0cmFwID0ge30sIGdsb2JhbC5qUXVlcnksIGdsb2JhbC5Qb3BwZXIpKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLCAkLCBQb3BwZXIpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIGZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdExlZ2FjeSAoZSkgeyByZXR1cm4gZSAmJiB0eXBlb2YgZSA9PT0gJ29iamVjdCcgJiYgJ2RlZmF1bHQnIGluIGUgPyBlIDogeyAnZGVmYXVsdCc6IGUgfTsgfVxuXG4gIHZhciAkX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdExlZ2FjeSgkKTtcbiAgdmFyIFBvcHBlcl9fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9faW50ZXJvcERlZmF1bHRMZWdhY3koUG9wcGVyKTtcblxuICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH1cblxuICBmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgICBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcblxuICAgIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcbiAgICBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCAodjQuNi4wKTogdXRpbC5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogUHJpdmF0ZSBUcmFuc2l0aW9uRW5kIEhlbHBlcnNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBUUkFOU0lUSU9OX0VORCA9ICd0cmFuc2l0aW9uZW5kJztcbiAgdmFyIE1BWF9VSUQgPSAxMDAwMDAwO1xuICB2YXIgTUlMTElTRUNPTkRTX01VTFRJUExJRVIgPSAxMDAwOyAvLyBTaG91dG91dCBBbmd1c0Nyb2xsIChodHRwczovL2dvby5nbC9weHdRR3ApXG5cbiAgZnVuY3Rpb24gdG9UeXBlKG9iaikge1xuICAgIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBcIlwiICsgb2JqO1xuICAgIH1cblxuICAgIHJldHVybiB7fS50b1N0cmluZy5jYWxsKG9iaikubWF0Y2goL1xccyhbYS16XSspL2kpWzFdLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTcGVjaWFsVHJhbnNpdGlvbkVuZEV2ZW50KCkge1xuICAgIHJldHVybiB7XG4gICAgICBiaW5kVHlwZTogVFJBTlNJVElPTl9FTkQsXG4gICAgICBkZWxlZ2F0ZVR5cGU6IFRSQU5TSVRJT05fRU5ELFxuICAgICAgaGFuZGxlOiBmdW5jdGlvbiBoYW5kbGUoZXZlbnQpIHtcbiAgICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShldmVudC50YXJnZXQpLmlzKHRoaXMpKSB7XG4gICAgICAgICAgcmV0dXJuIGV2ZW50LmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2l0aW9uRW5kRW11bGF0b3IoZHVyYXRpb24pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghY2FsbGVkKSB7XG4gICAgICAgIFV0aWwudHJpZ2dlclRyYW5zaXRpb25FbmQoX3RoaXMpO1xuICAgICAgfVxuICAgIH0sIGR1cmF0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFRyYW5zaXRpb25FbmRTdXBwb3J0KCkge1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbi5lbXVsYXRlVHJhbnNpdGlvbkVuZCA9IHRyYW5zaXRpb25FbmRFbXVsYXRvcjtcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10uZXZlbnQuc3BlY2lhbFtVdGlsLlRSQU5TSVRJT05fRU5EXSA9IGdldFNwZWNpYWxUcmFuc2l0aW9uRW5kRXZlbnQoKTtcbiAgfVxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogUHVibGljIFV0aWwgQXBpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgdmFyIFV0aWwgPSB7XG4gICAgVFJBTlNJVElPTl9FTkQ6ICdic1RyYW5zaXRpb25FbmQnLFxuICAgIGdldFVJRDogZnVuY3Rpb24gZ2V0VUlEKHByZWZpeCkge1xuICAgICAgZG8ge1xuICAgICAgICBwcmVmaXggKz0gfn4oTWF0aC5yYW5kb20oKSAqIE1BWF9VSUQpOyAvLyBcIn5+XCIgYWN0cyBsaWtlIGEgZmFzdGVyIE1hdGguZmxvb3IoKSBoZXJlXG4gICAgICB9IHdoaWxlIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwcmVmaXgpKTtcblxuICAgICAgcmV0dXJuIHByZWZpeDtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yRnJvbUVsZW1lbnQ6IGZ1bmN0aW9uIGdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGFyZ2V0Jyk7XG5cbiAgICAgIGlmICghc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09ICcjJykge1xuICAgICAgICB2YXIgaHJlZkF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgICAgICBzZWxlY3RvciA9IGhyZWZBdHRyICYmIGhyZWZBdHRyICE9PSAnIycgPyBocmVmQXR0ci50cmltKCkgOiAnJztcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpID8gc2VsZWN0b3IgOiBudWxsO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50OiBmdW5jdGlvbiBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9IC8vIEdldCB0cmFuc2l0aW9uLWR1cmF0aW9uIG9mIHRoZSBlbGVtZW50XG5cblxuICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlbGVtZW50KS5jc3MoJ3RyYW5zaXRpb24tZHVyYXRpb24nKTtcbiAgICAgIHZhciB0cmFuc2l0aW9uRGVsYXkgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oZWxlbWVudCkuY3NzKCd0cmFuc2l0aW9uLWRlbGF5Jyk7XG4gICAgICB2YXIgZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gPSBwYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICB2YXIgZmxvYXRUcmFuc2l0aW9uRGVsYXkgPSBwYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSk7IC8vIFJldHVybiAwIGlmIGVsZW1lbnQgb3IgdHJhbnNpdGlvbiBkdXJhdGlvbiBpcyBub3QgZm91bmRcblxuICAgICAgaWYgKCFmbG9hdFRyYW5zaXRpb25EdXJhdGlvbiAmJiAhZmxvYXRUcmFuc2l0aW9uRGVsYXkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9IC8vIElmIG11bHRpcGxlIGR1cmF0aW9ucyBhcmUgZGVmaW5lZCwgdGFrZSB0aGUgZmlyc3RcblxuXG4gICAgICB0cmFuc2l0aW9uRHVyYXRpb24gPSB0cmFuc2l0aW9uRHVyYXRpb24uc3BsaXQoJywnKVswXTtcbiAgICAgIHRyYW5zaXRpb25EZWxheSA9IHRyYW5zaXRpb25EZWxheS5zcGxpdCgnLCcpWzBdO1xuICAgICAgcmV0dXJuIChwYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbikgKyBwYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSkpICogTUlMTElTRUNPTkRTX01VTFRJUExJRVI7XG4gICAgfSxcbiAgICByZWZsb3c6IGZ1bmN0aW9uIHJlZmxvdyhlbGVtZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgfSxcbiAgICB0cmlnZ2VyVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24gdHJpZ2dlclRyYW5zaXRpb25FbmQoZWxlbWVudCkge1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnQpLnRyaWdnZXIoVFJBTlNJVElPTl9FTkQpO1xuICAgIH0sXG4gICAgc3VwcG9ydHNUcmFuc2l0aW9uRW5kOiBmdW5jdGlvbiBzdXBwb3J0c1RyYW5zaXRpb25FbmQoKSB7XG4gICAgICByZXR1cm4gQm9vbGVhbihUUkFOU0lUSU9OX0VORCk7XG4gICAgfSxcbiAgICBpc0VsZW1lbnQ6IGZ1bmN0aW9uIGlzRWxlbWVudChvYmopIHtcbiAgICAgIHJldHVybiAob2JqWzBdIHx8IG9iaikubm9kZVR5cGU7XG4gICAgfSxcbiAgICB0eXBlQ2hlY2tDb25maWc6IGZ1bmN0aW9uIHR5cGVDaGVja0NvbmZpZyhjb21wb25lbnROYW1lLCBjb25maWcsIGNvbmZpZ1R5cGVzKSB7XG4gICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBjb25maWdUeXBlcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZ1R5cGVzLCBwcm9wZXJ0eSkpIHtcbiAgICAgICAgICB2YXIgZXhwZWN0ZWRUeXBlcyA9IGNvbmZpZ1R5cGVzW3Byb3BlcnR5XTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBjb25maWdbcHJvcGVydHldO1xuICAgICAgICAgIHZhciB2YWx1ZVR5cGUgPSB2YWx1ZSAmJiBVdGlsLmlzRWxlbWVudCh2YWx1ZSkgPyAnZWxlbWVudCcgOiB0b1R5cGUodmFsdWUpO1xuXG4gICAgICAgICAgaWYgKCFuZXcgUmVnRXhwKGV4cGVjdGVkVHlwZXMpLnRlc3QodmFsdWVUeXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbXBvbmVudE5hbWUudG9VcHBlckNhc2UoKSArIFwiOiBcIiArIChcIk9wdGlvbiBcXFwiXCIgKyBwcm9wZXJ0eSArIFwiXFxcIiBwcm92aWRlZCB0eXBlIFxcXCJcIiArIHZhbHVlVHlwZSArIFwiXFxcIiBcIikgKyAoXCJidXQgZXhwZWN0ZWQgdHlwZSBcXFwiXCIgKyBleHBlY3RlZFR5cGVzICsgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBmaW5kU2hhZG93Um9vdDogZnVuY3Rpb24gZmluZFNoYWRvd1Jvb3QoZWxlbWVudCkge1xuICAgICAgaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoU2hhZG93KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSAvLyBDYW4gZmluZCB0aGUgc2hhZG93IHJvb3Qgb3RoZXJ3aXNlIGl0J2xsIHJldHVybiB0aGUgZG9jdW1lbnRcblxuXG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQuZ2V0Um9vdE5vZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIHJldHVybiByb290IGluc3RhbmNlb2YgU2hhZG93Um9vdCA/IHJvb3QgOiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICB9IC8vIHdoZW4gd2UgZG9uJ3QgZmluZCBhIHNoYWRvdyByb290XG5cblxuICAgICAgaWYgKCFlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBVdGlsLmZpbmRTaGFkb3dSb290KGVsZW1lbnQucGFyZW50Tm9kZSk7XG4gICAgfSxcbiAgICBqUXVlcnlEZXRlY3Rpb246IGZ1bmN0aW9uIGpRdWVyeURldGVjdGlvbigpIHtcbiAgICAgIGlmICh0eXBlb2YgJF9fZGVmYXVsdFsnZGVmYXVsdCddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgalF1ZXJ5LiBqUXVlcnkgbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgQm9vdHN0cmFwXFwncyBKYXZhU2NyaXB0LicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmVyc2lvbiA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbi5qcXVlcnkuc3BsaXQoJyAnKVswXS5zcGxpdCgnLicpO1xuICAgICAgdmFyIG1pbk1ham9yID0gMTtcbiAgICAgIHZhciBsdE1ham9yID0gMjtcbiAgICAgIHZhciBtaW5NaW5vciA9IDk7XG4gICAgICB2YXIgbWluUGF0Y2ggPSAxO1xuICAgICAgdmFyIG1heE1ham9yID0gNDtcblxuICAgICAgaWYgKHZlcnNpb25bMF0gPCBsdE1ham9yICYmIHZlcnNpb25bMV0gPCBtaW5NaW5vciB8fCB2ZXJzaW9uWzBdID09PSBtaW5NYWpvciAmJiB2ZXJzaW9uWzFdID09PSBtaW5NaW5vciAmJiB2ZXJzaW9uWzJdIDwgbWluUGF0Y2ggfHwgdmVyc2lvblswXSA+PSBtYXhNYWpvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Jvb3RzdHJhcFxcJ3MgSmF2YVNjcmlwdCByZXF1aXJlcyBhdCBsZWFzdCBqUXVlcnkgdjEuOS4xIGJ1dCBsZXNzIHRoYW4gdjQuMC4wJyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBVdGlsLmpRdWVyeURldGVjdGlvbigpO1xuICBzZXRUcmFuc2l0aW9uRW5kU3VwcG9ydCgpO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ29uc3RhbnRzXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgTkFNRSA9ICdhbGVydCc7XG4gIHZhciBWRVJTSU9OID0gJzQuNi4wJztcbiAgdmFyIERBVEFfS0VZID0gJ2JzLmFsZXJ0JztcbiAgdmFyIEVWRU5UX0tFWSA9IFwiLlwiICsgREFUQV9LRVk7XG4gIHZhciBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FXTtcbiAgdmFyIFNFTEVDVE9SX0RJU01JU1MgPSAnW2RhdGEtZGlzbWlzcz1cImFsZXJ0XCJdJztcbiAgdmFyIEVWRU5UX0NMT1NFID0gXCJjbG9zZVwiICsgRVZFTlRfS0VZO1xuICB2YXIgRVZFTlRfQ0xPU0VEID0gXCJjbG9zZWRcIiArIEVWRU5UX0tFWTtcbiAgdmFyIEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gXCJjbGlja1wiICsgRVZFTlRfS0VZICsgREFUQV9BUElfS0VZO1xuICB2YXIgQ0xBU1NfTkFNRV9BTEVSVCA9ICdhbGVydCc7XG4gIHZhciBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSc7XG4gIHZhciBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdyc7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIEFsZXJ0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBbGVydChlbGVtZW50KSB7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgdmFyIF9wcm90byA9IEFsZXJ0LnByb3RvdHlwZTtcblxuICAgIC8vIFB1YmxpY1xuICAgIF9wcm90by5jbG9zZSA9IGZ1bmN0aW9uIGNsb3NlKGVsZW1lbnQpIHtcbiAgICAgIHZhciByb290RWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG5cbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIHJvb3RFbGVtZW50ID0gdGhpcy5fZ2V0Um9vdEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjdXN0b21FdmVudCA9IHRoaXMuX3RyaWdnZXJDbG9zZUV2ZW50KHJvb3RFbGVtZW50KTtcblxuICAgICAgaWYgKGN1c3RvbUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcmVtb3ZlRWxlbWVudChyb290RWxlbWVudCk7XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsIERBVEFfS0VZKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fZ2V0Um9vdEVsZW1lbnQgPSBmdW5jdGlvbiBfZ2V0Um9vdEVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW1lbnQpO1xuICAgICAgdmFyIHBhcmVudCA9IGZhbHNlO1xuXG4gICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgcGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG5cbiAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgIHBhcmVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlbGVtZW50KS5jbG9zZXN0KFwiLlwiICsgQ0xBU1NfTkFNRV9BTEVSVClbMF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fdHJpZ2dlckNsb3NlRXZlbnQgPSBmdW5jdGlvbiBfdHJpZ2dlckNsb3NlRXZlbnQoZWxlbWVudCkge1xuICAgICAgdmFyIGNsb3NlRXZlbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfQ0xPU0UpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnQpLnRyaWdnZXIoY2xvc2VFdmVudCk7XG4gICAgICByZXR1cm4gY2xvc2VFdmVudDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9yZW1vdmVFbGVtZW50ID0gZnVuY3Rpb24gX3JlbW92ZUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnQpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfU0hPVyk7XG5cbiAgICAgIGlmICghJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRkFERSkpIHtcbiAgICAgICAgdGhpcy5fZGVzdHJveUVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudChlbGVtZW50KTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlbGVtZW50KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5fZGVzdHJveUVsZW1lbnQoZWxlbWVudCwgZXZlbnQpO1xuICAgICAgfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9kZXN0cm95RWxlbWVudCA9IGZ1bmN0aW9uIF9kZXN0cm95RWxlbWVudChlbGVtZW50KSB7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZWxlbWVudCkuZGV0YWNoKCkudHJpZ2dlcihFVkVOVF9DTE9TRUQpLnJlbW92ZSgpO1xuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgQWxlcnQuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICRlbGVtZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpO1xuICAgICAgICB2YXIgZGF0YSA9ICRlbGVtZW50LmRhdGEoREFUQV9LRVkpO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgQWxlcnQodGhpcyk7XG4gICAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0tFWSwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnID09PSAnY2xvc2UnKSB7XG4gICAgICAgICAgZGF0YVtjb25maWddKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgQWxlcnQuX2hhbmRsZURpc21pc3MgPSBmdW5jdGlvbiBfaGFuZGxlRGlzbWlzcyhhbGVydEluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBhbGVydEluc3RhbmNlLmNsb3NlKHRoaXMpO1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKEFsZXJ0LCBudWxsLCBbe1xuICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVkVSU0lPTjtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gQWxlcnQ7XG4gIH0oKTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9uKEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9ESVNNSVNTLCBBbGVydC5faGFuZGxlRGlzbWlzcyhuZXcgQWxlcnQoKSkpO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIGpRdWVyeVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUVdID0gQWxlcnQuX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUVdLkNvbnN0cnVjdG9yID0gQWxlcnQ7XG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUVdID0gSlFVRVJZX05PX0NPTkZMSUNUO1xuICAgIHJldHVybiBBbGVydC5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ29uc3RhbnRzXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgTkFNRSQxID0gJ2J1dHRvbic7XG4gIHZhciBWRVJTSU9OJDEgPSAnNC42LjAnO1xuICB2YXIgREFUQV9LRVkkMSA9ICdicy5idXR0b24nO1xuICB2YXIgRVZFTlRfS0VZJDEgPSBcIi5cIiArIERBVEFfS0VZJDE7XG4gIHZhciBEQVRBX0FQSV9LRVkkMSA9ICcuZGF0YS1hcGknO1xuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJDEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQxXTtcbiAgdmFyIENMQVNTX05BTUVfQUNUSVZFID0gJ2FjdGl2ZSc7XG4gIHZhciBDTEFTU19OQU1FX0JVVFRPTiA9ICdidG4nO1xuICB2YXIgQ0xBU1NfTkFNRV9GT0NVUyA9ICdmb2N1cyc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9DQVJST1QgPSAnW2RhdGEtdG9nZ2xlXj1cImJ1dHRvblwiXSc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRVMgPSAnW2RhdGEtdG9nZ2xlPVwiYnV0dG9uc1wiXSc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS10b2dnbGU9XCJidXR0b25cIl0nO1xuICB2YXIgU0VMRUNUT1JfREFUQV9UT0dHTEVTX0JVVFRPTlMgPSAnW2RhdGEtdG9nZ2xlPVwiYnV0dG9uc1wiXSAuYnRuJztcbiAgdmFyIFNFTEVDVE9SX0lOUFVUID0gJ2lucHV0Om5vdChbdHlwZT1cImhpZGRlblwiXSknO1xuICB2YXIgU0VMRUNUT1JfQUNUSVZFID0gJy5hY3RpdmUnO1xuICB2YXIgU0VMRUNUT1JfQlVUVE9OID0gJy5idG4nO1xuICB2YXIgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMSA9IFwiY2xpY2tcIiArIEVWRU5UX0tFWSQxICsgREFUQV9BUElfS0VZJDE7XG4gIHZhciBFVkVOVF9GT0NVU19CTFVSX0RBVEFfQVBJID0gXCJmb2N1c1wiICsgRVZFTlRfS0VZJDEgKyBEQVRBX0FQSV9LRVkkMSArIFwiIFwiICsgKFwiYmx1clwiICsgRVZFTlRfS0VZJDEgKyBEQVRBX0FQSV9LRVkkMSk7XG4gIHZhciBFVkVOVF9MT0FEX0RBVEFfQVBJID0gXCJsb2FkXCIgKyBFVkVOVF9LRVkkMSArIERBVEFfQVBJX0tFWSQxO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBCdXR0b24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJ1dHRvbihlbGVtZW50KSB7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHRoaXMuc2hvdWxkQXZvaWRUcmlnZ2VyQ2hhbmdlID0gZmFsc2U7XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgIHZhciBfcHJvdG8gPSBCdXR0b24ucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcbiAgICAgIHZhciB0cmlnZ2VyQ2hhbmdlRXZlbnQgPSB0cnVlO1xuICAgICAgdmFyIGFkZEFyaWFQcmVzc2VkID0gdHJ1ZTtcbiAgICAgIHZhciByb290RWxlbWVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5jbG9zZXN0KFNFTEVDVE9SX0RBVEFfVE9HR0xFUylbMF07XG5cbiAgICAgIGlmIChyb290RWxlbWVudCkge1xuICAgICAgICB2YXIgaW5wdXQgPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfSU5QVVQpO1xuXG4gICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgIGlmIChpbnB1dC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuY2hlY2tlZCAmJiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0FDVElWRSkpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckNoYW5nZUV2ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgYWN0aXZlRWxlbWVudCA9IHJvb3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfQUNUSVZFKTtcblxuICAgICAgICAgICAgICBpZiAoYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShhY3RpdmVFbGVtZW50KS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgICAvLyBpZiBpdCdzIG5vdCBhIHJhZGlvIGJ1dHRvbiBvciBjaGVja2JveCBkb24ndCBhZGQgYSBwb2ludGxlc3MvaW52YWxpZCBjaGVja2VkIHByb3BlcnR5IHRvIHRoZSBpbnB1dFxuICAgICAgICAgICAgaWYgKGlucHV0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgaW5wdXQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gIXRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQUNUSVZFKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZEF2b2lkVHJpZ2dlckNoYW5nZSkge1xuICAgICAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oaW5wdXQpLnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgYWRkQXJpYVByZXNzZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoISh0aGlzLl9lbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSkpIHtcbiAgICAgICAgaWYgKGFkZEFyaWFQcmVzc2VkKSB7XG4gICAgICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICF0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0FDVElWRSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRyaWdnZXJDaGFuZ2VFdmVudCkge1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS50b2dnbGVDbGFzcyhDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkkMSk7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIEJ1dHRvbi5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcsIGF2b2lkVHJpZ2dlckNoYW5nZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkZWxlbWVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKTtcbiAgICAgICAgdmFyIGRhdGEgPSAkZWxlbWVudC5kYXRhKERBVEFfS0VZJDEpO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgQnV0dG9uKHRoaXMpO1xuICAgICAgICAgICRlbGVtZW50LmRhdGEoREFUQV9LRVkkMSwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLnNob3VsZEF2b2lkVHJpZ2dlckNoYW5nZSA9IGF2b2lkVHJpZ2dlckNoYW5nZTtcblxuICAgICAgICBpZiAoY29uZmlnID09PSAndG9nZ2xlJykge1xuICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKEJ1dHRvbiwgbnVsbCwgW3tcbiAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFZFUlNJT04kMTtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gQnV0dG9uO1xuICB9KCk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbihFVkVOVF9DTElDS19EQVRBX0FQSSQxLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9DQVJST1QsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBidXR0b24gPSBldmVudC50YXJnZXQ7XG4gICAgdmFyIGluaXRpYWxCdXR0b24gPSBidXR0b247XG5cbiAgICBpZiAoISRfX2RlZmF1bHRbJ2RlZmF1bHQnXShidXR0b24pLmhhc0NsYXNzKENMQVNTX05BTUVfQlVUVE9OKSkge1xuICAgICAgYnV0dG9uID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGJ1dHRvbikuY2xvc2VzdChTRUxFQ1RPUl9CVVRUT04pWzBdO1xuICAgIH1cblxuICAgIGlmICghYnV0dG9uIHx8IGJ1dHRvbi5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgfHwgYnV0dG9uLmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gd29yayBhcm91bmQgRmlyZWZveCBidWcgIzE1NDA5OTVcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGlucHV0QnRuID0gYnV0dG9uLnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfSU5QVVQpO1xuXG4gICAgICBpZiAoaW5wdXRCdG4gJiYgKGlucHV0QnRuLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCBpbnB1dEJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIHdvcmsgYXJvdW5kIEZpcmVmb3ggYnVnICMxNTQwOTk1XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5pdGlhbEJ1dHRvbi50YWdOYW1lID09PSAnSU5QVVQnIHx8IGJ1dHRvbi50YWdOYW1lICE9PSAnTEFCRUwnKSB7XG4gICAgICAgIEJ1dHRvbi5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKGJ1dHRvbiksICd0b2dnbGUnLCBpbml0aWFsQnV0dG9uLnRhZ05hbWUgPT09ICdJTlBVVCcpO1xuICAgICAgfVxuICAgIH1cbiAgfSkub24oRVZFTlRfRk9DVVNfQkxVUl9EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEVfQ0FSUk9ULCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICB2YXIgYnV0dG9uID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGV2ZW50LnRhcmdldCkuY2xvc2VzdChTRUxFQ1RPUl9CVVRUT04pWzBdO1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShidXR0b24pLnRvZ2dsZUNsYXNzKENMQVNTX05BTUVfRk9DVVMsIC9eZm9jdXMoaW4pPyQvLnRlc3QoZXZlbnQudHlwZSkpO1xuICB9KTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykub24oRVZFTlRfTE9BRF9EQVRBX0FQSSwgZnVuY3Rpb24gKCkge1xuICAgIC8vIGVuc3VyZSBjb3JyZWN0IGFjdGl2ZSBjbGFzcyBpcyBzZXQgdG8gbWF0Y2ggdGhlIGNvbnRyb2xzJyBhY3R1YWwgdmFsdWVzL3N0YXRlc1xuICAgIC8vIGZpbmQgYWxsIGNoZWNrYm94ZXMvcmVhZGlvIGJ1dHRvbnMgaW5zaWRlIGRhdGEtdG9nZ2xlIGdyb3Vwc1xuICAgIHZhciBidXR0b25zID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0RBVEFfVE9HR0xFU19CVVRUT05TKSk7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnV0dG9ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgdmFyIGJ1dHRvbiA9IGJ1dHRvbnNbaV07XG4gICAgICB2YXIgaW5wdXQgPSBidXR0b24ucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9JTlBVVCk7XG5cbiAgICAgIGlmIChpbnB1dC5jaGVja2VkIHx8IGlucHV0Lmhhc0F0dHJpYnV0ZSgnY2hlY2tlZCcpKSB7XG4gICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKTtcbiAgICAgIH1cbiAgICB9IC8vIGZpbmQgYWxsIGJ1dHRvbiB0b2dnbGVzXG5cblxuICAgIGJ1dHRvbnMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfREFUQV9UT0dHTEUpKTtcblxuICAgIGZvciAodmFyIF9pID0gMCwgX2xlbiA9IGJ1dHRvbnMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgIHZhciBfYnV0dG9uID0gYnV0dG9uc1tfaV07XG5cbiAgICAgIGlmIChfYnV0dG9uLmdldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJykgPT09ICd0cnVlJykge1xuICAgICAgICBfYnV0dG9uLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIGpRdWVyeVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkMV0gPSBCdXR0b24uX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkMV0uQ29uc3RydWN0b3IgPSBCdXR0b247XG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkMV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQxXSA9IEpRVUVSWV9OT19DT05GTElDVCQxO1xuICAgIHJldHVybiBCdXR0b24uX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENvbnN0YW50c1xuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE5BTUUkMiA9ICdjYXJvdXNlbCc7XG4gIHZhciBWRVJTSU9OJDIgPSAnNC42LjAnO1xuICB2YXIgREFUQV9LRVkkMiA9ICdicy5jYXJvdXNlbCc7XG4gIHZhciBFVkVOVF9LRVkkMiA9IFwiLlwiICsgREFUQV9LRVkkMjtcbiAgdmFyIERBVEFfQVBJX0tFWSQyID0gJy5kYXRhLWFwaSc7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkMiA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDJdO1xuICB2YXIgQVJST1dfTEVGVF9LRVlDT0RFID0gMzc7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIGxlZnQgYXJyb3cga2V5XG5cbiAgdmFyIEFSUk9XX1JJR0hUX0tFWUNPREUgPSAzOTsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3IgcmlnaHQgYXJyb3cga2V5XG5cbiAgdmFyIFRPVUNIRVZFTlRfQ09NUEFUX1dBSVQgPSA1MDA7IC8vIFRpbWUgZm9yIG1vdXNlIGNvbXBhdCBldmVudHMgdG8gZmlyZSBhZnRlciB0b3VjaFxuXG4gIHZhciBTV0lQRV9USFJFU0hPTEQgPSA0MDtcbiAgdmFyIERlZmF1bHQgPSB7XG4gICAgaW50ZXJ2YWw6IDUwMDAsXG4gICAga2V5Ym9hcmQ6IHRydWUsXG4gICAgc2xpZGU6IGZhbHNlLFxuICAgIHBhdXNlOiAnaG92ZXInLFxuICAgIHdyYXA6IHRydWUsXG4gICAgdG91Y2g6IHRydWVcbiAgfTtcbiAgdmFyIERlZmF1bHRUeXBlID0ge1xuICAgIGludGVydmFsOiAnKG51bWJlcnxib29sZWFuKScsXG4gICAga2V5Ym9hcmQ6ICdib29sZWFuJyxcbiAgICBzbGlkZTogJyhib29sZWFufHN0cmluZyknLFxuICAgIHBhdXNlOiAnKHN0cmluZ3xib29sZWFuKScsXG4gICAgd3JhcDogJ2Jvb2xlYW4nLFxuICAgIHRvdWNoOiAnYm9vbGVhbidcbiAgfTtcbiAgdmFyIERJUkVDVElPTl9ORVhUID0gJ25leHQnO1xuICB2YXIgRElSRUNUSU9OX1BSRVYgPSAncHJldic7XG4gIHZhciBESVJFQ1RJT05fTEVGVCA9ICdsZWZ0JztcbiAgdmFyIERJUkVDVElPTl9SSUdIVCA9ICdyaWdodCc7XG4gIHZhciBFVkVOVF9TTElERSA9IFwic2xpZGVcIiArIEVWRU5UX0tFWSQyO1xuICB2YXIgRVZFTlRfU0xJRCA9IFwic2xpZFwiICsgRVZFTlRfS0VZJDI7XG4gIHZhciBFVkVOVF9LRVlET1dOID0gXCJrZXlkb3duXCIgKyBFVkVOVF9LRVkkMjtcbiAgdmFyIEVWRU5UX01PVVNFRU5URVIgPSBcIm1vdXNlZW50ZXJcIiArIEVWRU5UX0tFWSQyO1xuICB2YXIgRVZFTlRfTU9VU0VMRUFWRSA9IFwibW91c2VsZWF2ZVwiICsgRVZFTlRfS0VZJDI7XG4gIHZhciBFVkVOVF9UT1VDSFNUQVJUID0gXCJ0b3VjaHN0YXJ0XCIgKyBFVkVOVF9LRVkkMjtcbiAgdmFyIEVWRU5UX1RPVUNITU9WRSA9IFwidG91Y2htb3ZlXCIgKyBFVkVOVF9LRVkkMjtcbiAgdmFyIEVWRU5UX1RPVUNIRU5EID0gXCJ0b3VjaGVuZFwiICsgRVZFTlRfS0VZJDI7XG4gIHZhciBFVkVOVF9QT0lOVEVSRE9XTiA9IFwicG9pbnRlcmRvd25cIiArIEVWRU5UX0tFWSQyO1xuICB2YXIgRVZFTlRfUE9JTlRFUlVQID0gXCJwb2ludGVydXBcIiArIEVWRU5UX0tFWSQyO1xuICB2YXIgRVZFTlRfRFJBR19TVEFSVCA9IFwiZHJhZ3N0YXJ0XCIgKyBFVkVOVF9LRVkkMjtcbiAgdmFyIEVWRU5UX0xPQURfREFUQV9BUEkkMSA9IFwibG9hZFwiICsgRVZFTlRfS0VZJDIgKyBEQVRBX0FQSV9LRVkkMjtcbiAgdmFyIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDIgPSBcImNsaWNrXCIgKyBFVkVOVF9LRVkkMiArIERBVEFfQVBJX0tFWSQyO1xuICB2YXIgQ0xBU1NfTkFNRV9DQVJPVVNFTCA9ICdjYXJvdXNlbCc7XG4gIHZhciBDTEFTU19OQU1FX0FDVElWRSQxID0gJ2FjdGl2ZSc7XG4gIHZhciBDTEFTU19OQU1FX1NMSURFID0gJ3NsaWRlJztcbiAgdmFyIENMQVNTX05BTUVfUklHSFQgPSAnY2Fyb3VzZWwtaXRlbS1yaWdodCc7XG4gIHZhciBDTEFTU19OQU1FX0xFRlQgPSAnY2Fyb3VzZWwtaXRlbS1sZWZ0JztcbiAgdmFyIENMQVNTX05BTUVfTkVYVCA9ICdjYXJvdXNlbC1pdGVtLW5leHQnO1xuICB2YXIgQ0xBU1NfTkFNRV9QUkVWID0gJ2Nhcm91c2VsLWl0ZW0tcHJldic7XG4gIHZhciBDTEFTU19OQU1FX1BPSU5URVJfRVZFTlQgPSAncG9pbnRlci1ldmVudCc7XG4gIHZhciBTRUxFQ1RPUl9BQ1RJVkUkMSA9ICcuYWN0aXZlJztcbiAgdmFyIFNFTEVDVE9SX0FDVElWRV9JVEVNID0gJy5hY3RpdmUuY2Fyb3VzZWwtaXRlbSc7XG4gIHZhciBTRUxFQ1RPUl9JVEVNID0gJy5jYXJvdXNlbC1pdGVtJztcbiAgdmFyIFNFTEVDVE9SX0lURU1fSU1HID0gJy5jYXJvdXNlbC1pdGVtIGltZyc7XG4gIHZhciBTRUxFQ1RPUl9ORVhUX1BSRVYgPSAnLmNhcm91c2VsLWl0ZW0tbmV4dCwgLmNhcm91c2VsLWl0ZW0tcHJldic7XG4gIHZhciBTRUxFQ1RPUl9JTkRJQ0FUT1JTID0gJy5jYXJvdXNlbC1pbmRpY2F0b3JzJztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfU0xJREUgPSAnW2RhdGEtc2xpZGVdLCBbZGF0YS1zbGlkZS10b10nO1xuICB2YXIgU0VMRUNUT1JfREFUQV9SSURFID0gJ1tkYXRhLXJpZGU9XCJjYXJvdXNlbFwiXSc7XG4gIHZhciBQb2ludGVyVHlwZSA9IHtcbiAgICBUT1VDSDogJ3RvdWNoJyxcbiAgICBQRU46ICdwZW4nXG4gIH07XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIENhcm91c2VsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDYXJvdXNlbChlbGVtZW50LCBjb25maWcpIHtcbiAgICAgIHRoaXMuX2l0ZW1zID0gbnVsbDtcbiAgICAgIHRoaXMuX2ludGVydmFsID0gbnVsbDtcbiAgICAgIHRoaXMuX2FjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5faXNQYXVzZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2lzU2xpZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy50b3VjaFRpbWVvdXQgPSBudWxsO1xuICAgICAgdGhpcy50b3VjaFN0YXJ0WCA9IDA7XG4gICAgICB0aGlzLnRvdWNoRGVsdGFYID0gMDtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9JTkRJQ0FUT1JTKTtcbiAgICAgIHRoaXMuX3RvdWNoU3VwcG9ydGVkID0gJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDA7XG4gICAgICB0aGlzLl9wb2ludGVyRXZlbnQgPSBCb29sZWFuKHdpbmRvdy5Qb2ludGVyRXZlbnQgfHwgd2luZG93Lk1TUG9pbnRlckV2ZW50KTtcblxuICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgdmFyIF9wcm90byA9IENhcm91c2VsLnByb3RvdHlwZTtcblxuICAgIC8vIFB1YmxpY1xuICAgIF9wcm90by5uZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGlmICghdGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICAgIHRoaXMuX3NsaWRlKERJUkVDVElPTl9ORVhUKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLm5leHRXaGVuVmlzaWJsZSA9IGZ1bmN0aW9uIG5leHRXaGVuVmlzaWJsZSgpIHtcbiAgICAgIHZhciAkZWxlbWVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KTsgLy8gRG9uJ3QgY2FsbCBuZXh0IHdoZW4gdGhlIHBhZ2UgaXNuJ3QgdmlzaWJsZVxuICAgICAgLy8gb3IgdGhlIGNhcm91c2VsIG9yIGl0cyBwYXJlbnQgaXNuJ3QgdmlzaWJsZVxuXG4gICAgICBpZiAoIWRvY3VtZW50LmhpZGRlbiAmJiAkZWxlbWVudC5pcygnOnZpc2libGUnKSAmJiAkZWxlbWVudC5jc3MoJ3Zpc2liaWxpdHknKSAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5wcmV2ID0gZnVuY3Rpb24gcHJldigpIHtcbiAgICAgIGlmICghdGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICAgIHRoaXMuX3NsaWRlKERJUkVDVElPTl9QUkVWKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLnBhdXNlID0gZnVuY3Rpb24gcGF1c2UoZXZlbnQpIHtcbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgdGhpcy5faXNQYXVzZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SX05FWFRfUFJFVikpIHtcbiAgICAgICAgVXRpbC50cmlnZ2VyVHJhbnNpdGlvbkVuZCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgdGhpcy5jeWNsZSh0cnVlKTtcbiAgICAgIH1cblxuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCk7XG4gICAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgfTtcblxuICAgIF9wcm90by5jeWNsZSA9IGZ1bmN0aW9uIGN5Y2xlKGV2ZW50KSB7XG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHRoaXMuX2lzUGF1c2VkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9pbnRlcnZhbCkge1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKTtcbiAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmludGVydmFsICYmICF0aGlzLl9pc1BhdXNlZCkge1xuICAgICAgICB0aGlzLl91cGRhdGVJbnRlcnZhbCgpO1xuXG4gICAgICAgIHRoaXMuX2ludGVydmFsID0gc2V0SW50ZXJ2YWwoKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA/IHRoaXMubmV4dFdoZW5WaXNpYmxlIDogdGhpcy5uZXh0KS5iaW5kKHRoaXMpLCB0aGlzLl9jb25maWcuaW50ZXJ2YWwpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8udG8gPSBmdW5jdGlvbiB0byhpbmRleCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdGhpcy5fYWN0aXZlRWxlbWVudCA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9BQ1RJVkVfSVRFTSk7XG5cbiAgICAgIHZhciBhY3RpdmVJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleCh0aGlzLl9hY3RpdmVFbGVtZW50KTtcblxuICAgICAgaWYgKGluZGV4ID4gdGhpcy5faXRlbXMubGVuZ3RoIC0gMSB8fCBpbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vbmUoRVZFTlRfU0xJRCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy50byhpbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3RpdmVJbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgICAgdGhpcy5wYXVzZSgpO1xuICAgICAgICB0aGlzLmN5Y2xlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGRpcmVjdGlvbiA9IGluZGV4ID4gYWN0aXZlSW5kZXggPyBESVJFQ1RJT05fTkVYVCA6IERJUkVDVElPTl9QUkVWO1xuXG4gICAgICB0aGlzLl9zbGlkZShkaXJlY3Rpb24sIHRoaXMuX2l0ZW1zW2luZGV4XSk7XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vZmYoRVZFTlRfS0VZJDIpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkkMik7XG4gICAgICB0aGlzLl9pdGVtcyA9IG51bGw7XG4gICAgICB0aGlzLl9jb25maWcgPSBudWxsO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgICB0aGlzLl9pc1BhdXNlZCA9IG51bGw7XG4gICAgICB0aGlzLl9pc1NsaWRpbmcgPSBudWxsO1xuICAgICAgdGhpcy5fYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCA9IG51bGw7XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgY29uZmlnID0gX2V4dGVuZHMoe30sIERlZmF1bHQsIGNvbmZpZyk7XG4gICAgICBVdGlsLnR5cGVDaGVja0NvbmZpZyhOQU1FJDIsIGNvbmZpZywgRGVmYXVsdFR5cGUpO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9oYW5kbGVTd2lwZSA9IGZ1bmN0aW9uIF9oYW5kbGVTd2lwZSgpIHtcbiAgICAgIHZhciBhYnNEZWx0YXggPSBNYXRoLmFicyh0aGlzLnRvdWNoRGVsdGFYKTtcblxuICAgICAgaWYgKGFic0RlbHRheCA8PSBTV0lQRV9USFJFU0hPTEQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGlyZWN0aW9uID0gYWJzRGVsdGF4IC8gdGhpcy50b3VjaERlbHRhWDtcbiAgICAgIHRoaXMudG91Y2hEZWx0YVggPSAwOyAvLyBzd2lwZSBsZWZ0XG5cbiAgICAgIGlmIChkaXJlY3Rpb24gPiAwKSB7XG4gICAgICAgIHRoaXMucHJldigpO1xuICAgICAgfSAvLyBzd2lwZSByaWdodFxuXG5cbiAgICAgIGlmIChkaXJlY3Rpb24gPCAwKSB7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX2FkZEV2ZW50TGlzdGVuZXJzID0gZnVuY3Rpb24gX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLm9uKEVWRU5UX0tFWURPV04sIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIuX2tleWRvd24oZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5wYXVzZSA9PT0gJ2hvdmVyJykge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkub24oRVZFTlRfTU9VU0VFTlRFUiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5wYXVzZShldmVudCk7XG4gICAgICAgIH0pLm9uKEVWRU5UX01PVVNFTEVBVkUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIuY3ljbGUoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy50b3VjaCkge1xuICAgICAgICB0aGlzLl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fYWRkVG91Y2hFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uIF9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIGlmICghdGhpcy5fdG91Y2hTdXBwb3J0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RhcnQgPSBmdW5jdGlvbiBzdGFydChldmVudCkge1xuICAgICAgICBpZiAoX3RoaXMzLl9wb2ludGVyRXZlbnQgJiYgUG9pbnRlclR5cGVbZXZlbnQub3JpZ2luYWxFdmVudC5wb2ludGVyVHlwZS50b1VwcGVyQ2FzZSgpXSkge1xuICAgICAgICAgIF90aGlzMy50b3VjaFN0YXJ0WCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2xpZW50WDtcbiAgICAgICAgfSBlbHNlIGlmICghX3RoaXMzLl9wb2ludGVyRXZlbnQpIHtcbiAgICAgICAgICBfdGhpczMudG91Y2hTdGFydFggPSBldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdmFyIG1vdmUgPSBmdW5jdGlvbiBtb3ZlKGV2ZW50KSB7XG4gICAgICAgIC8vIGVuc3VyZSBzd2lwaW5nIHdpdGggb25lIHRvdWNoIGFuZCBub3QgcGluY2hpbmdcbiAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlcyAmJiBldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIF90aGlzMy50b3VjaERlbHRhWCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3RoaXMzLnRvdWNoRGVsdGFYID0gZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFggLSBfdGhpczMudG91Y2hTdGFydFg7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHZhciBlbmQgPSBmdW5jdGlvbiBlbmQoZXZlbnQpIHtcbiAgICAgICAgaWYgKF90aGlzMy5fcG9pbnRlckV2ZW50ICYmIFBvaW50ZXJUeXBlW2V2ZW50Lm9yaWdpbmFsRXZlbnQucG9pbnRlclR5cGUudG9VcHBlckNhc2UoKV0pIHtcbiAgICAgICAgICBfdGhpczMudG91Y2hEZWx0YVggPSBldmVudC5vcmlnaW5hbEV2ZW50LmNsaWVudFggLSBfdGhpczMudG91Y2hTdGFydFg7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczMuX2hhbmRsZVN3aXBlKCk7XG5cbiAgICAgICAgaWYgKF90aGlzMy5fY29uZmlnLnBhdXNlID09PSAnaG92ZXInKSB7XG4gICAgICAgICAgLy8gSWYgaXQncyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlLCBtb3VzZWVudGVyL2xlYXZlIGFyZSBmaXJlZCBhc1xuICAgICAgICAgIC8vIHBhcnQgb2YgdGhlIG1vdXNlIGNvbXBhdGliaWxpdHkgZXZlbnRzIG9uIGZpcnN0IHRhcCAtIHRoZSBjYXJvdXNlbFxuICAgICAgICAgIC8vIHdvdWxkIHN0b3AgY3ljbGluZyB1bnRpbCB1c2VyIHRhcHBlZCBvdXQgb2YgaXQ7XG4gICAgICAgICAgLy8gaGVyZSwgd2UgbGlzdGVuIGZvciB0b3VjaGVuZCwgZXhwbGljaXRseSBwYXVzZSB0aGUgY2Fyb3VzZWxcbiAgICAgICAgICAvLyAoYXMgaWYgaXQncyB0aGUgc2Vjb25kIHRpbWUgd2UgdGFwIG9uIGl0LCBtb3VzZWVudGVyIGNvbXBhdCBldmVudFxuICAgICAgICAgIC8vIGlzIE5PVCBmaXJlZCkgYW5kIGFmdGVyIGEgdGltZW91dCAodG8gYWxsb3cgZm9yIG1vdXNlIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAvLyBldmVudHMgdG8gZmlyZSkgd2UgZXhwbGljaXRseSByZXN0YXJ0IGN5Y2xpbmdcbiAgICAgICAgICBfdGhpczMucGF1c2UoKTtcblxuICAgICAgICAgIGlmIChfdGhpczMudG91Y2hUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMzLnRvdWNoVGltZW91dCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMzLnRvdWNoVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMzLmN5Y2xlKGV2ZW50KTtcbiAgICAgICAgICB9LCBUT1VDSEVWRU5UX0NPTVBBVF9XQUlUICsgX3RoaXMzLl9jb25maWcuaW50ZXJ2YWwpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0lURU1fSU1HKSkub24oRVZFTlRfRFJBR19TVEFSVCwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5fcG9pbnRlckV2ZW50KSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9QT0lOVEVSRE9XTiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHN0YXJ0KGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9QT0lOVEVSVVAsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBlbmQoZXZlbnQpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9QT0lOVEVSX0VWRU5UKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vbihFVkVOVF9UT1VDSFNUQVJULCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gc3RhcnQoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLm9uKEVWRU5UX1RPVUNITU9WRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIG1vdmUoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLm9uKEVWRU5UX1RPVUNIRU5ELCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gZW5kKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fa2V5ZG93biA9IGZ1bmN0aW9uIF9rZXlkb3duKGV2ZW50KSB7XG4gICAgICBpZiAoL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGV2ZW50LndoaWNoKSB7XG4gICAgICAgIGNhc2UgQVJST1dfTEVGVF9LRVlDT0RFOlxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5wcmV2KCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBBUlJPV19SSUdIVF9LRVlDT0RFOlxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0SXRlbUluZGV4ID0gZnVuY3Rpb24gX2dldEl0ZW1JbmRleChlbGVtZW50KSB7XG4gICAgICB0aGlzLl9pdGVtcyA9IGVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnROb2RlID8gW10uc2xpY2UuY2FsbChlbGVtZW50LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9JVEVNKSkgOiBbXTtcbiAgICAgIHJldHVybiB0aGlzLl9pdGVtcy5pbmRleE9mKGVsZW1lbnQpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldEl0ZW1CeURpcmVjdGlvbiA9IGZ1bmN0aW9uIF9nZXRJdGVtQnlEaXJlY3Rpb24oZGlyZWN0aW9uLCBhY3RpdmVFbGVtZW50KSB7XG4gICAgICB2YXIgaXNOZXh0RGlyZWN0aW9uID0gZGlyZWN0aW9uID09PSBESVJFQ1RJT05fTkVYVDtcbiAgICAgIHZhciBpc1ByZXZEaXJlY3Rpb24gPSBkaXJlY3Rpb24gPT09IERJUkVDVElPTl9QUkVWO1xuXG4gICAgICB2YXIgYWN0aXZlSW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgoYWN0aXZlRWxlbWVudCk7XG5cbiAgICAgIHZhciBsYXN0SXRlbUluZGV4ID0gdGhpcy5faXRlbXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBpc0dvaW5nVG9XcmFwID0gaXNQcmV2RGlyZWN0aW9uICYmIGFjdGl2ZUluZGV4ID09PSAwIHx8IGlzTmV4dERpcmVjdGlvbiAmJiBhY3RpdmVJbmRleCA9PT0gbGFzdEl0ZW1JbmRleDtcblxuICAgICAgaWYgKGlzR29pbmdUb1dyYXAgJiYgIXRoaXMuX2NvbmZpZy53cmFwKSB7XG4gICAgICAgIHJldHVybiBhY3RpdmVFbGVtZW50O1xuICAgICAgfVxuXG4gICAgICB2YXIgZGVsdGEgPSBkaXJlY3Rpb24gPT09IERJUkVDVElPTl9QUkVWID8gLTEgOiAxO1xuICAgICAgdmFyIGl0ZW1JbmRleCA9IChhY3RpdmVJbmRleCArIGRlbHRhKSAlIHRoaXMuX2l0ZW1zLmxlbmd0aDtcbiAgICAgIHJldHVybiBpdGVtSW5kZXggPT09IC0xID8gdGhpcy5faXRlbXNbdGhpcy5faXRlbXMubGVuZ3RoIC0gMV0gOiB0aGlzLl9pdGVtc1tpdGVtSW5kZXhdO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX3RyaWdnZXJTbGlkZUV2ZW50ID0gZnVuY3Rpb24gX3RyaWdnZXJTbGlkZUV2ZW50KHJlbGF0ZWRUYXJnZXQsIGV2ZW50RGlyZWN0aW9uTmFtZSkge1xuICAgICAgdmFyIHRhcmdldEluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KHJlbGF0ZWRUYXJnZXQpO1xuXG4gICAgICB2YXIgZnJvbUluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9BQ1RJVkVfSVRFTSkpO1xuXG4gICAgICB2YXIgc2xpZGVFdmVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9TTElERSwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiByZWxhdGVkVGFyZ2V0LFxuICAgICAgICBkaXJlY3Rpb246IGV2ZW50RGlyZWN0aW9uTmFtZSxcbiAgICAgICAgZnJvbTogZnJvbUluZGV4LFxuICAgICAgICB0bzogdGFyZ2V0SW5kZXhcbiAgICAgIH0pO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoc2xpZGVFdmVudCk7XG4gICAgICByZXR1cm4gc2xpZGVFdmVudDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50ID0gZnVuY3Rpb24gX3NldEFjdGl2ZUluZGljYXRvckVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgaWYgKHRoaXMuX2luZGljYXRvcnNFbGVtZW50KSB7XG4gICAgICAgIHZhciBpbmRpY2F0b3JzID0gW10uc2xpY2UuY2FsbCh0aGlzLl9pbmRpY2F0b3JzRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0FDVElWRSQxKSk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShpbmRpY2F0b3JzKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQxKTtcblxuICAgICAgICB2YXIgbmV4dEluZGljYXRvciA9IHRoaXMuX2luZGljYXRvcnNFbGVtZW50LmNoaWxkcmVuW3RoaXMuX2dldEl0ZW1JbmRleChlbGVtZW50KV07XG5cbiAgICAgICAgaWYgKG5leHRJbmRpY2F0b3IpIHtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10obmV4dEluZGljYXRvcikuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl91cGRhdGVJbnRlcnZhbCA9IGZ1bmN0aW9uIF91cGRhdGVJbnRlcnZhbCgpIHtcbiAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5fYWN0aXZlRWxlbWVudCB8fCB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfQUNUSVZFX0lURU0pO1xuXG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZWxlbWVudEludGVydmFsID0gcGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaW50ZXJ2YWwnKSwgMTApO1xuXG4gICAgICBpZiAoZWxlbWVudEludGVydmFsKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWwgPSB0aGlzLl9jb25maWcuZGVmYXVsdEludGVydmFsIHx8IHRoaXMuX2NvbmZpZy5pbnRlcnZhbDtcbiAgICAgICAgdGhpcy5fY29uZmlnLmludGVydmFsID0gZWxlbWVudEludGVydmFsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY29uZmlnLmludGVydmFsID0gdGhpcy5fY29uZmlnLmRlZmF1bHRJbnRlcnZhbCB8fCB0aGlzLl9jb25maWcuaW50ZXJ2YWw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fc2xpZGUgPSBmdW5jdGlvbiBfc2xpZGUoZGlyZWN0aW9uLCBlbGVtZW50KSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfQUNUSVZFX0lURU0pO1xuXG4gICAgICB2YXIgYWN0aXZlRWxlbWVudEluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KGFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgICB2YXIgbmV4dEVsZW1lbnQgPSBlbGVtZW50IHx8IGFjdGl2ZUVsZW1lbnQgJiYgdGhpcy5fZ2V0SXRlbUJ5RGlyZWN0aW9uKGRpcmVjdGlvbiwgYWN0aXZlRWxlbWVudCk7XG5cbiAgICAgIHZhciBuZXh0RWxlbWVudEluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KG5leHRFbGVtZW50KTtcblxuICAgICAgdmFyIGlzQ3ljbGluZyA9IEJvb2xlYW4odGhpcy5faW50ZXJ2YWwpO1xuICAgICAgdmFyIGRpcmVjdGlvbmFsQ2xhc3NOYW1lO1xuICAgICAgdmFyIG9yZGVyQ2xhc3NOYW1lO1xuICAgICAgdmFyIGV2ZW50RGlyZWN0aW9uTmFtZTtcblxuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gRElSRUNUSU9OX05FWFQpIHtcbiAgICAgICAgZGlyZWN0aW9uYWxDbGFzc05hbWUgPSBDTEFTU19OQU1FX0xFRlQ7XG4gICAgICAgIG9yZGVyQ2xhc3NOYW1lID0gQ0xBU1NfTkFNRV9ORVhUO1xuICAgICAgICBldmVudERpcmVjdGlvbk5hbWUgPSBESVJFQ1RJT05fTEVGVDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpcmVjdGlvbmFsQ2xhc3NOYW1lID0gQ0xBU1NfTkFNRV9SSUdIVDtcbiAgICAgICAgb3JkZXJDbGFzc05hbWUgPSBDTEFTU19OQU1FX1BSRVY7XG4gICAgICAgIGV2ZW50RGlyZWN0aW9uTmFtZSA9IERJUkVDVElPTl9SSUdIVDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5leHRFbGVtZW50ICYmICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShuZXh0RWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMSkpIHtcbiAgICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHNsaWRlRXZlbnQgPSB0aGlzLl90cmlnZ2VyU2xpZGVFdmVudChuZXh0RWxlbWVudCwgZXZlbnREaXJlY3Rpb25OYW1lKTtcblxuICAgICAgaWYgKHNsaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWFjdGl2ZUVsZW1lbnQgfHwgIW5leHRFbGVtZW50KSB7XG4gICAgICAgIC8vIFNvbWUgd2VpcmRuZXNzIGlzIGhhcHBlbmluZywgc28gd2UgYmFpbFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzU2xpZGluZyA9IHRydWU7XG5cbiAgICAgIGlmIChpc0N5Y2xpbmcpIHtcbiAgICAgICAgdGhpcy5wYXVzZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50KG5leHRFbGVtZW50KTtcblxuICAgICAgdGhpcy5fYWN0aXZlRWxlbWVudCA9IG5leHRFbGVtZW50O1xuICAgICAgdmFyIHNsaWRFdmVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9TTElELCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IG5leHRFbGVtZW50LFxuICAgICAgICBkaXJlY3Rpb246IGV2ZW50RGlyZWN0aW9uTmFtZSxcbiAgICAgICAgZnJvbTogYWN0aXZlRWxlbWVudEluZGV4LFxuICAgICAgICB0bzogbmV4dEVsZW1lbnRJbmRleFxuICAgICAgfSk7XG5cbiAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TTElERSkpIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKG5leHRFbGVtZW50KS5hZGRDbGFzcyhvcmRlckNsYXNzTmFtZSk7XG4gICAgICAgIFV0aWwucmVmbG93KG5leHRFbGVtZW50KTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGFjdGl2ZUVsZW1lbnQpLmFkZENsYXNzKGRpcmVjdGlvbmFsQ2xhc3NOYW1lKTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKG5leHRFbGVtZW50KS5hZGRDbGFzcyhkaXJlY3Rpb25hbENsYXNzTmFtZSk7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KGFjdGl2ZUVsZW1lbnQpO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oYWN0aXZlRWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10obmV4dEVsZW1lbnQpLnJlbW92ZUNsYXNzKGRpcmVjdGlvbmFsQ2xhc3NOYW1lICsgXCIgXCIgKyBvcmRlckNsYXNzTmFtZSkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMSk7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGFjdGl2ZUVsZW1lbnQpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQUNUSVZFJDEgKyBcIiBcIiArIG9yZGVyQ2xhc3NOYW1lICsgXCIgXCIgKyBkaXJlY3Rpb25hbENsYXNzTmFtZSk7XG4gICAgICAgICAgX3RoaXM0Ll9pc1NsaWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAkX19kZWZhdWx0WydkZWZhdWx0J10oX3RoaXM0Ll9lbGVtZW50KS50cmlnZ2VyKHNsaWRFdmVudCk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oYWN0aXZlRWxlbWVudCkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMSk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShuZXh0RWxlbWVudCkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMSk7XG4gICAgICAgIHRoaXMuX2lzU2xpZGluZyA9IGZhbHNlO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkudHJpZ2dlcihzbGlkRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNDeWNsaW5nKSB7XG4gICAgICAgIHRoaXMuY3ljbGUoKTtcbiAgICAgIH1cbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIENhcm91c2VsLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYXRhID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkMik7XG5cbiAgICAgICAgdmFyIF9jb25maWcgPSBfZXh0ZW5kcyh7fSwgRGVmYXVsdCwgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoKSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgX2NvbmZpZyA9IF9leHRlbmRzKHt9LCBfY29uZmlnLCBjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFjdGlvbiA9IHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnID8gY29uZmlnIDogX2NvbmZpZy5zbGlkZTtcblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IENhcm91c2VsKHRoaXMsIF9jb25maWcpO1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJDIsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgZGF0YS50byhjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhY3Rpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2FjdGlvbl0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTm8gbWV0aG9kIG5hbWVkIFxcXCJcIiArIGFjdGlvbiArIFwiXFxcIlwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkYXRhW2FjdGlvbl0oKTtcbiAgICAgICAgfSBlbHNlIGlmIChfY29uZmlnLmludGVydmFsICYmIF9jb25maWcucmlkZSkge1xuICAgICAgICAgIGRhdGEucGF1c2UoKTtcbiAgICAgICAgICBkYXRhLmN5Y2xlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBDYXJvdXNlbC5fZGF0YUFwaUNsaWNrSGFuZGxlciA9IGZ1bmN0aW9uIF9kYXRhQXBpQ2xpY2tIYW5kbGVyKGV2ZW50KSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodGhpcyk7XG5cbiAgICAgIGlmICghc2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgdGFyZ2V0ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHNlbGVjdG9yKVswXTtcblxuICAgICAgaWYgKCF0YXJnZXQgfHwgISRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0YXJnZXQpLmhhc0NsYXNzKENMQVNTX05BTUVfQ0FST1VTRUwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbmZpZyA9IF9leHRlbmRzKHt9LCAkX19kZWZhdWx0WydkZWZhdWx0J10odGFyZ2V0KS5kYXRhKCksICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKCkpO1xuXG4gICAgICB2YXIgc2xpZGVJbmRleCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLXNsaWRlLXRvJyk7XG5cbiAgICAgIGlmIChzbGlkZUluZGV4KSB7XG4gICAgICAgIGNvbmZpZy5pbnRlcnZhbCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBDYXJvdXNlbC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRhcmdldCksIGNvbmZpZyk7XG5cbiAgICAgIGlmIChzbGlkZUluZGV4KSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0YXJnZXQpLmRhdGEoREFUQV9LRVkkMikudG8oc2xpZGVJbmRleCk7XG4gICAgICB9XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcblxuICAgIF9jcmVhdGVDbGFzcyhDYXJvdXNlbCwgbnVsbCwgW3tcbiAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFZFUlNJT04kMjtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0O1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBDYXJvdXNlbDtcbiAgfSgpO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub24oRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMiwgU0VMRUNUT1JfREFUQV9TTElERSwgQ2Fyb3VzZWwuX2RhdGFBcGlDbGlja0hhbmRsZXIpO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10od2luZG93KS5vbihFVkVOVF9MT0FEX0RBVEFfQVBJJDEsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2Fyb3VzZWxzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0RBVEFfUklERSkpO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNhcm91c2Vscy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgdmFyICRjYXJvdXNlbCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShjYXJvdXNlbHNbaV0pO1xuXG4gICAgICBDYXJvdXNlbC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJGNhcm91c2VsLCAkY2Fyb3VzZWwuZGF0YSgpKTtcbiAgICB9XG4gIH0pO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIGpRdWVyeVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkMl0gPSBDYXJvdXNlbC5falF1ZXJ5SW50ZXJmYWNlO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQyXS5Db25zdHJ1Y3RvciA9IENhcm91c2VsO1xuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDJdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkMl0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkMjtcbiAgICByZXR1cm4gQ2Fyb3VzZWwuX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENvbnN0YW50c1xuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE5BTUUkMyA9ICdjb2xsYXBzZSc7XG4gIHZhciBWRVJTSU9OJDMgPSAnNC42LjAnO1xuICB2YXIgREFUQV9LRVkkMyA9ICdicy5jb2xsYXBzZSc7XG4gIHZhciBFVkVOVF9LRVkkMyA9IFwiLlwiICsgREFUQV9LRVkkMztcbiAgdmFyIERBVEFfQVBJX0tFWSQzID0gJy5kYXRhLWFwaSc7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkMyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDNdO1xuICB2YXIgRGVmYXVsdCQxID0ge1xuICAgIHRvZ2dsZTogdHJ1ZSxcbiAgICBwYXJlbnQ6ICcnXG4gIH07XG4gIHZhciBEZWZhdWx0VHlwZSQxID0ge1xuICAgIHRvZ2dsZTogJ2Jvb2xlYW4nLFxuICAgIHBhcmVudDogJyhzdHJpbmd8ZWxlbWVudCknXG4gIH07XG4gIHZhciBFVkVOVF9TSE9XID0gXCJzaG93XCIgKyBFVkVOVF9LRVkkMztcbiAgdmFyIEVWRU5UX1NIT1dOID0gXCJzaG93blwiICsgRVZFTlRfS0VZJDM7XG4gIHZhciBFVkVOVF9ISURFID0gXCJoaWRlXCIgKyBFVkVOVF9LRVkkMztcbiAgdmFyIEVWRU5UX0hJRERFTiA9IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVkkMztcbiAgdmFyIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDMgPSBcImNsaWNrXCIgKyBFVkVOVF9LRVkkMyArIERBVEFfQVBJX0tFWSQzO1xuICB2YXIgQ0xBU1NfTkFNRV9TSE9XJDEgPSAnc2hvdyc7XG4gIHZhciBDTEFTU19OQU1FX0NPTExBUFNFID0gJ2NvbGxhcHNlJztcbiAgdmFyIENMQVNTX05BTUVfQ09MTEFQU0lORyA9ICdjb2xsYXBzaW5nJztcbiAgdmFyIENMQVNTX05BTUVfQ09MTEFQU0VEID0gJ2NvbGxhcHNlZCc7XG4gIHZhciBESU1FTlNJT05fV0lEVEggPSAnd2lkdGgnO1xuICB2YXIgRElNRU5TSU9OX0hFSUdIVCA9ICdoZWlnaHQnO1xuICB2YXIgU0VMRUNUT1JfQUNUSVZFUyA9ICcuc2hvdywgLmNvbGxhcHNpbmcnO1xuICB2YXIgU0VMRUNUT1JfREFUQV9UT0dHTEUkMSA9ICdbZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiXSc7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIENvbGxhcHNlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb2xsYXBzZShlbGVtZW50LCBjb25maWcpIHtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgIHRoaXMuX3RyaWdnZXJBcnJheSA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLXRvZ2dsZT1cXFwiY29sbGFwc2VcXFwiXVtocmVmPVxcXCIjXCIgKyBlbGVtZW50LmlkICsgXCJcXFwiXSxcIiArIChcIltkYXRhLXRvZ2dsZT1cXFwiY29sbGFwc2VcXFwiXVtkYXRhLXRhcmdldD1cXFwiI1wiICsgZWxlbWVudC5pZCArIFwiXFxcIl1cIikpKTtcbiAgICAgIHZhciB0b2dnbGVMaXN0ID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0RBVEFfVE9HR0xFJDEpKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRvZ2dsZUxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZW0gPSB0b2dnbGVMaXN0W2ldO1xuICAgICAgICB2YXIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbSk7XG4gICAgICAgIHZhciBmaWx0ZXJFbGVtZW50ID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSkuZmlsdGVyKGZ1bmN0aW9uIChmb3VuZEVsZW0pIHtcbiAgICAgICAgICByZXR1cm4gZm91bmRFbGVtID09PSBlbGVtZW50O1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoc2VsZWN0b3IgIT09IG51bGwgJiYgZmlsdGVyRWxlbWVudC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5fc2VsZWN0b3IgPSBzZWxlY3RvcjtcblxuICAgICAgICAgIHRoaXMuX3RyaWdnZXJBcnJheS5wdXNoKGVsZW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3BhcmVudCA9IHRoaXMuX2NvbmZpZy5wYXJlbnQgPyB0aGlzLl9nZXRQYXJlbnQoKSA6IG51bGw7XG5cbiAgICAgIGlmICghdGhpcy5fY29uZmlnLnBhcmVudCkge1xuICAgICAgICB0aGlzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3ModGhpcy5fZWxlbWVudCwgdGhpcy5fdHJpZ2dlckFycmF5KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy50b2dnbGUpIHtcbiAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgIH1cbiAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgdmFyIF9wcm90byA9IENvbGxhcHNlLnByb3RvdHlwZTtcblxuICAgIC8vIFB1YmxpY1xuICAgIF9wcm90by50b2dnbGUgPSBmdW5jdGlvbiB0b2dnbGUoKSB7XG4gICAgICBpZiAoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfU0hPVyQxKSkge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uc2hvdyA9IGZ1bmN0aW9uIHNob3coKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX1NIT1ckMSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgYWN0aXZlcztcbiAgICAgIHZhciBhY3RpdmVzRGF0YTtcblxuICAgICAgaWYgKHRoaXMuX3BhcmVudCkge1xuICAgICAgICBhY3RpdmVzID0gW10uc2xpY2UuY2FsbCh0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9BQ1RJVkVTKSkuZmlsdGVyKGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBfdGhpcy5fY29uZmlnLnBhcmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgnZGF0YS1wYXJlbnQnKSA9PT0gX3RoaXMuX2NvbmZpZy5wYXJlbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQ09MTEFQU0UpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYWN0aXZlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBhY3RpdmVzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aXZlcykge1xuICAgICAgICBhY3RpdmVzRGF0YSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShhY3RpdmVzKS5ub3QodGhpcy5fc2VsZWN0b3IpLmRhdGEoREFUQV9LRVkkMyk7XG5cbiAgICAgICAgaWYgKGFjdGl2ZXNEYXRhICYmIGFjdGl2ZXNEYXRhLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHN0YXJ0RXZlbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfU0hPVyk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkudHJpZ2dlcihzdGFydEV2ZW50KTtcblxuICAgICAgaWYgKHN0YXJ0RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aXZlcykge1xuICAgICAgICBDb2xsYXBzZS5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKGFjdGl2ZXMpLm5vdCh0aGlzLl9zZWxlY3RvciksICdoaWRlJyk7XG5cbiAgICAgICAgaWYgKCFhY3RpdmVzRGF0YSkge1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShhY3RpdmVzKS5kYXRhKERBVEFfS0VZJDMsIG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLl9nZXREaW1lbnNpb24oKTtcblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQ09MTEFQU0UpLmFkZENsYXNzKENMQVNTX05BTUVfQ09MTEFQU0lORyk7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAwO1xuXG4gICAgICBpZiAodGhpcy5fdHJpZ2dlckFycmF5Lmxlbmd0aCkge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fdHJpZ2dlckFycmF5KS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNFRCkuYXR0cignYXJpYS1leHBhbmRlZCcsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcodHJ1ZSk7XG5cbiAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oX3RoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQ09MTEFQU0lORykuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRSArIFwiIFwiICsgQ0xBU1NfTkFNRV9TSE9XJDEpO1xuICAgICAgICBfdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gJyc7XG5cbiAgICAgICAgX3RoaXMuc2V0VHJhbnNpdGlvbmluZyhmYWxzZSk7XG5cbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKF90aGlzLl9lbGVtZW50KS50cmlnZ2VyKEVWRU5UX1NIT1dOKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBjYXBpdGFsaXplZERpbWVuc2lvbiA9IGRpbWVuc2lvblswXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKDEpO1xuICAgICAgdmFyIHNjcm9sbFNpemUgPSBcInNjcm9sbFwiICsgY2FwaXRhbGl6ZWREaW1lbnNpb247XG4gICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSB0aGlzLl9lbGVtZW50W3Njcm9sbFNpemVdICsgXCJweFwiO1xuICAgIH07XG5cbiAgICBfcHJvdG8uaGlkZSA9IGZ1bmN0aW9uIGhpZGUoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX2lzVHJhbnNpdGlvbmluZyB8fCAhJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfU0hPVyQxKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBzdGFydEV2ZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX0hJREUpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoc3RhcnRFdmVudCk7XG5cbiAgICAgIGlmIChzdGFydEV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuX2dldERpbWVuc2lvbigpO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSB0aGlzLl9lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RpbWVuc2lvbl0gKyBcInB4XCI7XG4gICAgICBVdGlsLnJlZmxvdyh0aGlzLl9lbGVtZW50KTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5hZGRDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNJTkcpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfQ09MTEFQU0UgKyBcIiBcIiArIENMQVNTX05BTUVfU0hPVyQxKTtcbiAgICAgIHZhciB0cmlnZ2VyQXJyYXlMZW5ndGggPSB0aGlzLl90cmlnZ2VyQXJyYXkubGVuZ3RoO1xuXG4gICAgICBpZiAodHJpZ2dlckFycmF5TGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyaWdnZXJBcnJheUxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHRyaWdnZXIgPSB0aGlzLl90cmlnZ2VyQXJyYXlbaV07XG4gICAgICAgICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRyaWdnZXIpO1xuXG4gICAgICAgICAgaWYgKHNlbGVjdG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgJGVsZW0gPSAkX19kZWZhdWx0WydkZWZhdWx0J10oW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSkpO1xuXG4gICAgICAgICAgICBpZiAoISRlbGVtLmhhc0NsYXNzKENMQVNTX05BTUVfU0hPVyQxKSkge1xuICAgICAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odHJpZ2dlcikuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9DT0xMQVBTRUQpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0VHJhbnNpdGlvbmluZyh0cnVlKTtcblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgIF90aGlzMi5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcblxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oX3RoaXMyLl9lbGVtZW50KS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0NPTExBUFNJTkcpLmFkZENsYXNzKENMQVNTX05BTUVfQ09MTEFQU0UpLnRyaWdnZXIoRVZFTlRfSElEREVOKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9ICcnO1xuICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNvbXBsZXRlKS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uc2V0VHJhbnNpdGlvbmluZyA9IGZ1bmN0aW9uIHNldFRyYW5zaXRpb25pbmcoaXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBpc1RyYW5zaXRpb25pbmc7XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsIERBVEFfS0VZJDMpO1xuICAgICAgdGhpcy5fY29uZmlnID0gbnVsbDtcbiAgICAgIHRoaXMuX3BhcmVudCA9IG51bGw7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX3RyaWdnZXJBcnJheSA9IG51bGw7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBudWxsO1xuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fZ2V0Q29uZmlnID0gZnVuY3Rpb24gX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgIGNvbmZpZyA9IF9leHRlbmRzKHt9LCBEZWZhdWx0JDEsIGNvbmZpZyk7XG4gICAgICBjb25maWcudG9nZ2xlID0gQm9vbGVhbihjb25maWcudG9nZ2xlKTsgLy8gQ29lcmNlIHN0cmluZyB2YWx1ZXNcblxuICAgICAgVXRpbC50eXBlQ2hlY2tDb25maWcoTkFNRSQzLCBjb25maWcsIERlZmF1bHRUeXBlJDEpO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXREaW1lbnNpb24gPSBmdW5jdGlvbiBfZ2V0RGltZW5zaW9uKCkge1xuICAgICAgdmFyIGhhc1dpZHRoID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKERJTUVOU0lPTl9XSURUSCk7XG4gICAgICByZXR1cm4gaGFzV2lkdGggPyBESU1FTlNJT05fV0lEVEggOiBESU1FTlNJT05fSEVJR0hUO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldFBhcmVudCA9IGZ1bmN0aW9uIF9nZXRQYXJlbnQoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIHBhcmVudDtcblxuICAgICAgaWYgKFV0aWwuaXNFbGVtZW50KHRoaXMuX2NvbmZpZy5wYXJlbnQpKSB7XG4gICAgICAgIHBhcmVudCA9IHRoaXMuX2NvbmZpZy5wYXJlbnQ7IC8vIEl0J3MgYSBqUXVlcnkgb2JqZWN0XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9jb25maWcucGFyZW50LmpxdWVyeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBwYXJlbnQgPSB0aGlzLl9jb25maWcucGFyZW50WzBdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuX2NvbmZpZy5wYXJlbnQpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2VsZWN0b3IgPSBcIltkYXRhLXRvZ2dsZT1cXFwiY29sbGFwc2VcXFwiXVtkYXRhLXBhcmVudD1cXFwiXCIgKyB0aGlzLl9jb25maWcucGFyZW50ICsgXCJcXFwiXVwiO1xuICAgICAgdmFyIGNoaWxkcmVuID0gW10uc2xpY2UuY2FsbChwYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGNoaWxkcmVuKS5lYWNoKGZ1bmN0aW9uIChpLCBlbGVtZW50KSB7XG4gICAgICAgIF90aGlzMy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKENvbGxhcHNlLl9nZXRUYXJnZXRGcm9tRWxlbWVudChlbGVtZW50KSwgW2VsZW1lbnRdKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MgPSBmdW5jdGlvbiBfYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKGVsZW1lbnQsIHRyaWdnZXJBcnJheSkge1xuICAgICAgdmFyIGlzT3BlbiA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX1NIT1ckMSk7XG5cbiAgICAgIGlmICh0cmlnZ2VyQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0cmlnZ2VyQXJyYXkpLnRvZ2dsZUNsYXNzKENMQVNTX05BTUVfQ09MTEFQU0VELCAhaXNPcGVuKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgaXNPcGVuKTtcbiAgICAgIH1cbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIENvbGxhcHNlLl9nZXRUYXJnZXRGcm9tRWxlbWVudCA9IGZ1bmN0aW9uIF9nZXRUYXJnZXRGcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICByZXR1cm4gc2VsZWN0b3IgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSA6IG51bGw7XG4gICAgfTtcblxuICAgIENvbGxhcHNlLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkZWxlbWVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKTtcbiAgICAgICAgdmFyIGRhdGEgPSAkZWxlbWVudC5kYXRhKERBVEFfS0VZJDMpO1xuXG4gICAgICAgIHZhciBfY29uZmlnID0gX2V4dGVuZHMoe30sIERlZmF1bHQkMSwgJGVsZW1lbnQuZGF0YSgpLCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWcgPyBjb25maWcgOiB7fSk7XG5cbiAgICAgICAgaWYgKCFkYXRhICYmIF9jb25maWcudG9nZ2xlICYmIHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnICYmIC9zaG93fGhpZGUvLnRlc3QoY29uZmlnKSkge1xuICAgICAgICAgIF9jb25maWcudG9nZ2xlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IENvbGxhcHNlKHRoaXMsIF9jb25maWcpO1xuICAgICAgICAgICRlbGVtZW50LmRhdGEoREFUQV9LRVkkMywgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKENvbGxhcHNlLCBudWxsLCBbe1xuICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVkVSU0lPTiQzO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0XCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHQkMTtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gQ29sbGFwc2U7XG4gIH0oKTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9uKEVWRU5UX0NMSUNLX0RBVEFfQVBJJDMsIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDEsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIHByZXZlbnREZWZhdWx0IG9ubHkgZm9yIDxhPiBlbGVtZW50cyAod2hpY2ggY2hhbmdlIHRoZSBVUkwpIG5vdCBpbnNpZGUgdGhlIGNvbGxhcHNpYmxlIGVsZW1lbnRcbiAgICBpZiAoZXZlbnQuY3VycmVudFRhcmdldC50YWdOYW1lID09PSAnQScpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgdmFyICR0cmlnZ2VyID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpO1xuICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzKTtcbiAgICB2YXIgc2VsZWN0b3JzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7XG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHNlbGVjdG9ycykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHRhcmdldCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKTtcbiAgICAgIHZhciBkYXRhID0gJHRhcmdldC5kYXRhKERBVEFfS0VZJDMpO1xuICAgICAgdmFyIGNvbmZpZyA9IGRhdGEgPyAndG9nZ2xlJyA6ICR0cmlnZ2VyLmRhdGEoKTtcblxuICAgICAgQ29sbGFwc2UuX2pRdWVyeUludGVyZmFjZS5jYWxsKCR0YXJnZXQsIGNvbmZpZyk7XG4gICAgfSk7XG4gIH0pO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIGpRdWVyeVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkM10gPSBDb2xsYXBzZS5falF1ZXJ5SW50ZXJmYWNlO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQzXS5Db25zdHJ1Y3RvciA9IENvbGxhcHNlO1xuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDNdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkM10gPSBKUVVFUllfTk9fQ09ORkxJQ1QkMztcbiAgICByZXR1cm4gQ29sbGFwc2UuX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENvbnN0YW50c1xuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE5BTUUkNCA9ICdkcm9wZG93bic7XG4gIHZhciBWRVJTSU9OJDQgPSAnNC42LjAnO1xuICB2YXIgREFUQV9LRVkkNCA9ICdicy5kcm9wZG93bic7XG4gIHZhciBFVkVOVF9LRVkkNCA9IFwiLlwiICsgREFUQV9LRVkkNDtcbiAgdmFyIERBVEFfQVBJX0tFWSQ0ID0gJy5kYXRhLWFwaSc7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkNCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDRdO1xuICB2YXIgRVNDQVBFX0tFWUNPREUgPSAyNzsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3IgRXNjYXBlIChFc2MpIGtleVxuXG4gIHZhciBTUEFDRV9LRVlDT0RFID0gMzI7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIHNwYWNlIGtleVxuXG4gIHZhciBUQUJfS0VZQ09ERSA9IDk7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIHRhYiBrZXlcblxuICB2YXIgQVJST1dfVVBfS0VZQ09ERSA9IDM4OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciB1cCBhcnJvdyBrZXlcblxuICB2YXIgQVJST1dfRE9XTl9LRVlDT0RFID0gNDA7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIGRvd24gYXJyb3cga2V5XG5cbiAgdmFyIFJJR0hUX01PVVNFX0JVVFRPTl9XSElDSCA9IDM7IC8vIE1vdXNlRXZlbnQud2hpY2ggdmFsdWUgZm9yIHRoZSByaWdodCBidXR0b24gKGFzc3VtaW5nIGEgcmlnaHQtaGFuZGVkIG1vdXNlKVxuXG4gIHZhciBSRUdFWFBfS0VZRE9XTiA9IG5ldyBSZWdFeHAoQVJST1dfVVBfS0VZQ09ERSArIFwifFwiICsgQVJST1dfRE9XTl9LRVlDT0RFICsgXCJ8XCIgKyBFU0NBUEVfS0VZQ09ERSk7XG4gIHZhciBFVkVOVF9ISURFJDEgPSBcImhpZGVcIiArIEVWRU5UX0tFWSQ0O1xuICB2YXIgRVZFTlRfSElEREVOJDEgPSBcImhpZGRlblwiICsgRVZFTlRfS0VZJDQ7XG4gIHZhciBFVkVOVF9TSE9XJDEgPSBcInNob3dcIiArIEVWRU5UX0tFWSQ0O1xuICB2YXIgRVZFTlRfU0hPV04kMSA9IFwic2hvd25cIiArIEVWRU5UX0tFWSQ0O1xuICB2YXIgRVZFTlRfQ0xJQ0sgPSBcImNsaWNrXCIgKyBFVkVOVF9LRVkkNDtcbiAgdmFyIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDQgPSBcImNsaWNrXCIgKyBFVkVOVF9LRVkkNCArIERBVEFfQVBJX0tFWSQ0O1xuICB2YXIgRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSA9IFwia2V5ZG93blwiICsgRVZFTlRfS0VZJDQgKyBEQVRBX0FQSV9LRVkkNDtcbiAgdmFyIEVWRU5UX0tFWVVQX0RBVEFfQVBJID0gXCJrZXl1cFwiICsgRVZFTlRfS0VZJDQgKyBEQVRBX0FQSV9LRVkkNDtcbiAgdmFyIENMQVNTX05BTUVfRElTQUJMRUQgPSAnZGlzYWJsZWQnO1xuICB2YXIgQ0xBU1NfTkFNRV9TSE9XJDIgPSAnc2hvdyc7XG4gIHZhciBDTEFTU19OQU1FX0RST1BVUCA9ICdkcm9wdXAnO1xuICB2YXIgQ0xBU1NfTkFNRV9EUk9QUklHSFQgPSAnZHJvcHJpZ2h0JztcbiAgdmFyIENMQVNTX05BTUVfRFJPUExFRlQgPSAnZHJvcGxlZnQnO1xuICB2YXIgQ0xBU1NfTkFNRV9NRU5VUklHSFQgPSAnZHJvcGRvd24tbWVudS1yaWdodCc7XG4gIHZhciBDTEFTU19OQU1FX1BPU0lUSU9OX1NUQVRJQyA9ICdwb3NpdGlvbi1zdGF0aWMnO1xuICB2YXIgU0VMRUNUT1JfREFUQV9UT0dHTEUkMiA9ICdbZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXSc7XG4gIHZhciBTRUxFQ1RPUl9GT1JNX0NISUxEID0gJy5kcm9wZG93biBmb3JtJztcbiAgdmFyIFNFTEVDVE9SX01FTlUgPSAnLmRyb3Bkb3duLW1lbnUnO1xuICB2YXIgU0VMRUNUT1JfTkFWQkFSX05BViA9ICcubmF2YmFyLW5hdic7XG4gIHZhciBTRUxFQ1RPUl9WSVNJQkxFX0lURU1TID0gJy5kcm9wZG93bi1tZW51IC5kcm9wZG93bi1pdGVtOm5vdCguZGlzYWJsZWQpOm5vdCg6ZGlzYWJsZWQpJztcbiAgdmFyIFBMQUNFTUVOVF9UT1AgPSAndG9wLXN0YXJ0JztcbiAgdmFyIFBMQUNFTUVOVF9UT1BFTkQgPSAndG9wLWVuZCc7XG4gIHZhciBQTEFDRU1FTlRfQk9UVE9NID0gJ2JvdHRvbS1zdGFydCc7XG4gIHZhciBQTEFDRU1FTlRfQk9UVE9NRU5EID0gJ2JvdHRvbS1lbmQnO1xuICB2YXIgUExBQ0VNRU5UX1JJR0hUID0gJ3JpZ2h0LXN0YXJ0JztcbiAgdmFyIFBMQUNFTUVOVF9MRUZUID0gJ2xlZnQtc3RhcnQnO1xuICB2YXIgRGVmYXVsdCQyID0ge1xuICAgIG9mZnNldDogMCxcbiAgICBmbGlwOiB0cnVlLFxuICAgIGJvdW5kYXJ5OiAnc2Nyb2xsUGFyZW50JyxcbiAgICByZWZlcmVuY2U6ICd0b2dnbGUnLFxuICAgIGRpc3BsYXk6ICdkeW5hbWljJyxcbiAgICBwb3BwZXJDb25maWc6IG51bGxcbiAgfTtcbiAgdmFyIERlZmF1bHRUeXBlJDIgPSB7XG4gICAgb2Zmc2V0OiAnKG51bWJlcnxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgICBmbGlwOiAnYm9vbGVhbicsXG4gICAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgICByZWZlcmVuY2U6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgICBkaXNwbGF5OiAnc3RyaW5nJyxcbiAgICBwb3BwZXJDb25maWc6ICcobnVsbHxvYmplY3QpJ1xuICB9O1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBEcm9wZG93biA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRHJvcGRvd24oZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHRoaXMuX3BvcHBlciA9IG51bGw7XG4gICAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgIHRoaXMuX21lbnUgPSB0aGlzLl9nZXRNZW51RWxlbWVudCgpO1xuICAgICAgdGhpcy5faW5OYXZiYXIgPSB0aGlzLl9kZXRlY3ROYXZiYXIoKTtcblxuICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgdmFyIF9wcm90byA9IERyb3Bkb3duLnByb3RvdHlwZTtcblxuICAgIC8vIFB1YmxpY1xuICAgIF9wcm90by50b2dnbGUgPSBmdW5jdGlvbiB0b2dnbGUoKSB7XG4gICAgICBpZiAodGhpcy5fZWxlbWVudC5kaXNhYmxlZCB8fCAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9ESVNBQkxFRCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNBY3RpdmUgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fbWVudSkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDIpO1xuXG4gICAgICBEcm9wZG93bi5fY2xlYXJNZW51cygpO1xuXG4gICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNob3codHJ1ZSk7XG4gICAgfTtcblxuICAgIF9wcm90by5zaG93ID0gZnVuY3Rpb24gc2hvdyh1c2VQb3BwZXIpIHtcbiAgICAgIGlmICh1c2VQb3BwZXIgPT09IHZvaWQgMCkge1xuICAgICAgICB1c2VQb3BwZXIgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2VsZW1lbnQuZGlzYWJsZWQgfHwgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRElTQUJMRUQpIHx8ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9tZW51KS5oYXNDbGFzcyhDTEFTU19OQU1FX1NIT1ckMikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgICAgfTtcbiAgICAgIHZhciBzaG93RXZlbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfU0hPVyQxLCByZWxhdGVkVGFyZ2V0KTtcblxuICAgICAgdmFyIHBhcmVudCA9IERyb3Bkb3duLl9nZXRQYXJlbnRGcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHBhcmVudCkudHJpZ2dlcihzaG93RXZlbnQpO1xuXG4gICAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gVG90YWxseSBkaXNhYmxlIFBvcHBlciBmb3IgRHJvcGRvd25zIGluIE5hdmJhclxuXG5cbiAgICAgIGlmICghdGhpcy5faW5OYXZiYXIgJiYgdXNlUG9wcGVyKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVjayBmb3IgUG9wcGVyIGRlcGVuZGVuY3lcbiAgICAgICAgICogUG9wcGVyIC0gaHR0cHM6Ly9wb3BwZXIuanMub3JnXG4gICAgICAgICAqL1xuICAgICAgICBpZiAodHlwZW9mIFBvcHBlcl9fZGVmYXVsdFsnZGVmYXVsdCddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Jvb3RzdHJhcFxcJ3MgZHJvcGRvd25zIHJlcXVpcmUgUG9wcGVyIChodHRwczovL3BvcHBlci5qcy5vcmcpJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVmZXJlbmNlRWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UgPT09ICdwYXJlbnQnKSB7XG4gICAgICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IHBhcmVudDtcbiAgICAgICAgfSBlbHNlIGlmIChVdGlsLmlzRWxlbWVudCh0aGlzLl9jb25maWcucmVmZXJlbmNlKSkge1xuICAgICAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9jb25maWcucmVmZXJlbmNlOyAvLyBDaGVjayBpZiBpdCdzIGpRdWVyeSBlbGVtZW50XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UuanF1ZXJ5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IHRoaXMuX2NvbmZpZy5yZWZlcmVuY2VbMF07XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIElmIGJvdW5kYXJ5IGlzIG5vdCBgc2Nyb2xsUGFyZW50YCwgdGhlbiBzZXQgcG9zaXRpb24gdG8gYHN0YXRpY2BcbiAgICAgICAgLy8gdG8gYWxsb3cgdGhlIG1lbnUgdG8gXCJlc2NhcGVcIiB0aGUgc2Nyb2xsIHBhcmVudCdzIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8yNDI1MVxuXG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5ib3VuZGFyeSAhPT0gJ3Njcm9sbFBhcmVudCcpIHtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10ocGFyZW50KS5hZGRDbGFzcyhDTEFTU19OQU1FX1BPU0lUSU9OX1NUQVRJQyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wb3BwZXIgPSBuZXcgUG9wcGVyX19kZWZhdWx0WydkZWZhdWx0J10ocmVmZXJlbmNlRWxlbWVudCwgdGhpcy5fbWVudSwgdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKCkpO1xuICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgYWRkIGV4dHJhXG4gICAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHRvIHRoZSBib2R5J3MgaW1tZWRpYXRlIGNoaWxkcmVuO1xuICAgICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAgIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxNC8wMi9tb3VzZV9ldmVudF9idWIuaHRtbFxuXG5cbiAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHBhcmVudCkuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVJfTkFWKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50LmJvZHkpLmNoaWxkcmVuKCkub24oJ21vdXNlb3ZlcicsIG51bGwsICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5ub29wKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZWxlbWVudC5mb2N1cygpO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIHRydWUpO1xuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fbWVudSkudG9nZ2xlQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDIpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHBhcmVudCkudG9nZ2xlQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDIpLnRyaWdnZXIoJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX1NIT1dOJDEsIHJlbGF0ZWRUYXJnZXQpKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmhpZGUgPSBmdW5jdGlvbiBoaWRlKCkge1xuICAgICAgaWYgKHRoaXMuX2VsZW1lbnQuZGlzYWJsZWQgfHwgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRElTQUJMRUQpIHx8ICEkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fbWVudSkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlbGF0ZWRUYXJnZXQgPSB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICAgIH07XG4gICAgICB2YXIgaGlkZUV2ZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX0hJREUkMSwgcmVsYXRlZFRhcmdldCk7XG5cbiAgICAgIHZhciBwYXJlbnQgPSBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7XG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShwYXJlbnQpLnRyaWdnZXIoaGlkZUV2ZW50KTtcblxuICAgICAgaWYgKGhpZGVFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKTtcbiAgICAgIH1cblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX21lbnUpLnRvZ2dsZUNsYXNzKENMQVNTX05BTUVfU0hPVyQyKTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShwYXJlbnQpLnRvZ2dsZUNsYXNzKENMQVNTX05BTUVfU0hPVyQyKS50cmlnZ2VyKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9ISURERU4kMSwgcmVsYXRlZFRhcmdldCkpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10ucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSQ0KTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vZmYoRVZFTlRfS0VZJDQpO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9tZW51ID0gbnVsbDtcblxuICAgICAgaWYgKHRoaXMuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpO1xuXG4gICAgICAgIHRoaXMuX3BvcHBlciA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgICB0aGlzLl9pbk5hdmJhciA9IHRoaXMuX2RldGVjdE5hdmJhcigpO1xuXG4gICAgICBpZiAodGhpcy5fcG9wcGVyICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3BvcHBlci5zY2hlZHVsZVVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fYWRkRXZlbnRMaXN0ZW5lcnMgPSBmdW5jdGlvbiBfYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkub24oRVZFTlRfQ0xJQ0ssIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBfdGhpcy50b2dnbGUoKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldENvbmZpZyA9IGZ1bmN0aW9uIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgICBjb25maWcgPSBfZXh0ZW5kcyh7fSwgdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LCAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkuZGF0YSgpLCBjb25maWcpO1xuICAgICAgVXRpbC50eXBlQ2hlY2tDb25maWcoTkFNRSQ0LCBjb25maWcsIHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRNZW51RWxlbWVudCA9IGZ1bmN0aW9uIF9nZXRNZW51RWxlbWVudCgpIHtcbiAgICAgIGlmICghdGhpcy5fbWVudSkge1xuICAgICAgICB2YXIgcGFyZW50ID0gRHJvcGRvd24uX2dldFBhcmVudEZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuXG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICB0aGlzLl9tZW51ID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfTUVOVSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX21lbnU7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0UGxhY2VtZW50ID0gZnVuY3Rpb24gX2dldFBsYWNlbWVudCgpIHtcbiAgICAgIHZhciAkcGFyZW50RHJvcGRvd24gPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudC5wYXJlbnROb2RlKTtcbiAgICAgIHZhciBwbGFjZW1lbnQgPSBQTEFDRU1FTlRfQk9UVE9NOyAvLyBIYW5kbGUgZHJvcHVwXG5cbiAgICAgIGlmICgkcGFyZW50RHJvcGRvd24uaGFzQ2xhc3MoQ0xBU1NfTkFNRV9EUk9QVVApKSB7XG4gICAgICAgIHBsYWNlbWVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9tZW51KS5oYXNDbGFzcyhDTEFTU19OQU1FX01FTlVSSUdIVCkgPyBQTEFDRU1FTlRfVE9QRU5EIDogUExBQ0VNRU5UX1RPUDtcbiAgICAgIH0gZWxzZSBpZiAoJHBhcmVudERyb3Bkb3duLmhhc0NsYXNzKENMQVNTX05BTUVfRFJPUFJJR0hUKSkge1xuICAgICAgICBwbGFjZW1lbnQgPSBQTEFDRU1FTlRfUklHSFQ7XG4gICAgICB9IGVsc2UgaWYgKCRwYXJlbnREcm9wZG93bi5oYXNDbGFzcyhDTEFTU19OQU1FX0RST1BMRUZUKSkge1xuICAgICAgICBwbGFjZW1lbnQgPSBQTEFDRU1FTlRfTEVGVDtcbiAgICAgIH0gZWxzZSBpZiAoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX21lbnUpLmhhc0NsYXNzKENMQVNTX05BTUVfTUVOVVJJR0hUKSkge1xuICAgICAgICBwbGFjZW1lbnQgPSBQTEFDRU1FTlRfQk9UVE9NRU5EO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGxhY2VtZW50O1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2RldGVjdE5hdmJhciA9IGZ1bmN0aW9uIF9kZXRlY3ROYXZiYXIoKSB7XG4gICAgICByZXR1cm4gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLmNsb3Nlc3QoJy5uYXZiYXInKS5sZW5ndGggPiAwO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldE9mZnNldCA9IGZ1bmN0aW9uIF9nZXRPZmZzZXQoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIG9mZnNldCA9IHt9O1xuXG4gICAgICBpZiAodHlwZW9mIHRoaXMuX2NvbmZpZy5vZmZzZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb2Zmc2V0LmZuID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICBkYXRhLm9mZnNldHMgPSBfZXh0ZW5kcyh7fSwgZGF0YS5vZmZzZXRzLCBfdGhpczIuX2NvbmZpZy5vZmZzZXQoZGF0YS5vZmZzZXRzLCBfdGhpczIuX2VsZW1lbnQpIHx8IHt9KTtcbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9mZnNldC5vZmZzZXQgPSB0aGlzLl9jb25maWcub2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldFBvcHBlckNvbmZpZyA9IGZ1bmN0aW9uIF9nZXRQb3BwZXJDb25maWcoKSB7XG4gICAgICB2YXIgcG9wcGVyQ29uZmlnID0ge1xuICAgICAgICBwbGFjZW1lbnQ6IHRoaXMuX2dldFBsYWNlbWVudCgpLFxuICAgICAgICBtb2RpZmllcnM6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpLFxuICAgICAgICAgIGZsaXA6IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuX2NvbmZpZy5mbGlwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcmV2ZW50T3ZlcmZsb3c6IHtcbiAgICAgICAgICAgIGJvdW5kYXJpZXNFbGVtZW50OiB0aGlzLl9jb25maWcuYm91bmRhcnlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07IC8vIERpc2FibGUgUG9wcGVyIGlmIHdlIGhhdmUgYSBzdGF0aWMgZGlzcGxheVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmRpc3BsYXkgPT09ICdzdGF0aWMnKSB7XG4gICAgICAgIHBvcHBlckNvbmZpZy5tb2RpZmllcnMuYXBwbHlTdHlsZSA9IHtcbiAgICAgICAgICBlbmFibGVkOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHBvcHBlckNvbmZpZywgdGhpcy5fY29uZmlnLnBvcHBlckNvbmZpZyk7XG4gICAgfSAvLyBTdGF0aWNcbiAgICA7XG5cbiAgICBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGF0YSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJDQpO1xuXG4gICAgICAgIHZhciBfY29uZmlnID0gdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgPyBjb25maWcgOiBudWxsO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgRHJvcGRvd24odGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkNCwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgRHJvcGRvd24uX2NsZWFyTWVudXMgPSBmdW5jdGlvbiBfY2xlYXJNZW51cyhldmVudCkge1xuICAgICAgaWYgKGV2ZW50ICYmIChldmVudC53aGljaCA9PT0gUklHSFRfTU9VU0VfQlVUVE9OX1dISUNIIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcgJiYgZXZlbnQud2hpY2ggIT09IFRBQl9LRVlDT0RFKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB0b2dnbGVzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0RBVEFfVE9HR0xFJDIpKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRvZ2dsZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IERyb3Bkb3duLl9nZXRQYXJlbnRGcm9tRWxlbWVudCh0b2dnbGVzW2ldKTtcblxuICAgICAgICB2YXIgY29udGV4dCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0b2dnbGVzW2ldKS5kYXRhKERBVEFfS0VZJDQpO1xuICAgICAgICB2YXIgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgICAgICByZWxhdGVkVGFyZ2V0OiB0b2dnbGVzW2ldXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgICAgICByZWxhdGVkVGFyZ2V0LmNsaWNrRXZlbnQgPSBldmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRyb3Bkb3duTWVudSA9IGNvbnRleHQuX21lbnU7XG5cbiAgICAgICAgaWYgKCEkX19kZWZhdWx0WydkZWZhdWx0J10ocGFyZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX1NIT1ckMikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudCAmJiAoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJyAmJiAvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKSB8fCBldmVudC50eXBlID09PSAna2V5dXAnICYmIGV2ZW50LndoaWNoID09PSBUQUJfS0VZQ09ERSkgJiYgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmNvbnRhaW5zKHBhcmVudCwgZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGhpZGVFdmVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9ISURFJDEsIHJlbGF0ZWRUYXJnZXQpO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10ocGFyZW50KS50cmlnZ2VyKGhpZGVFdmVudCk7XG5cbiAgICAgICAgaWYgKGhpZGVFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSByZW1vdmUgdGhlIGV4dHJhXG4gICAgICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgd2UgYWRkZWQgZm9yIGlPUyBzdXBwb3J0XG5cblxuICAgICAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50LmJvZHkpLmNoaWxkcmVuKCkub2ZmKCdtb3VzZW92ZXInLCBudWxsLCAkX19kZWZhdWx0WydkZWZhdWx0J10ubm9vcCk7XG4gICAgICAgIH1cblxuICAgICAgICB0b2dnbGVzW2ldLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuXG4gICAgICAgIGlmIChjb250ZXh0Ll9wb3BwZXIpIHtcbiAgICAgICAgICBjb250ZXh0Ll9wb3BwZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRyb3Bkb3duTWVudSkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDIpO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10ocGFyZW50KS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX1NIT1ckMikudHJpZ2dlcigkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfSElEREVOJDEsIHJlbGF0ZWRUYXJnZXQpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgRHJvcGRvd24uX2dldFBhcmVudEZyb21FbGVtZW50ID0gZnVuY3Rpb24gX2dldFBhcmVudEZyb21FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgIHZhciBwYXJlbnQ7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICBwYXJlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcmVudCB8fCBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICAgIDtcblxuICAgIERyb3Bkb3duLl9kYXRhQXBpS2V5ZG93bkhhbmRsZXIgPSBmdW5jdGlvbiBfZGF0YUFwaUtleWRvd25IYW5kbGVyKGV2ZW50KSB7XG4gICAgICAvLyBJZiBub3QgaW5wdXQvdGV4dGFyZWE6XG4gICAgICAvLyAgLSBBbmQgbm90IGEga2V5IGluIFJFR0VYUF9LRVlET1dOID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcbiAgICAgIC8vIElmIGlucHV0L3RleHRhcmVhOlxuICAgICAgLy8gIC0gSWYgc3BhY2Uga2V5ID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcbiAgICAgIC8vICAtIElmIGtleSBpcyBvdGhlciB0aGFuIGVzY2FwZVxuICAgICAgLy8gICAgLSBJZiBrZXkgaXMgbm90IHVwIG9yIGRvd24gPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuICAgICAgLy8gICAgLSBJZiB0cmlnZ2VyIGluc2lkZSB0aGUgbWVudSA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgICBpZiAoL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkgPyBldmVudC53aGljaCA9PT0gU1BBQ0VfS0VZQ09ERSB8fCBldmVudC53aGljaCAhPT0gRVNDQVBFX0tFWUNPREUgJiYgKGV2ZW50LndoaWNoICE9PSBBUlJPV19ET1dOX0tFWUNPREUgJiYgZXZlbnQud2hpY2ggIT09IEFSUk9XX1VQX0tFWUNPREUgfHwgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGV2ZW50LnRhcmdldCkuY2xvc2VzdChTRUxFQ1RPUl9NRU5VKS5sZW5ndGgpIDogIVJFR0VYUF9LRVlET1dOLnRlc3QoZXZlbnQud2hpY2gpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmhhc0NsYXNzKENMQVNTX05BTUVfRElTQUJMRUQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHBhcmVudCA9IERyb3Bkb3duLl9nZXRQYXJlbnRGcm9tRWxlbWVudCh0aGlzKTtcblxuICAgICAgdmFyIGlzQWN0aXZlID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHBhcmVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDIpO1xuXG4gICAgICBpZiAoIWlzQWN0aXZlICYmIGV2ZW50LndoaWNoID09PSBFU0NBUEVfS0VZQ09ERSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaWYgKCFpc0FjdGl2ZSB8fCBldmVudC53aGljaCA9PT0gRVNDQVBFX0tFWUNPREUgfHwgZXZlbnQud2hpY2ggPT09IFNQQUNFX0tFWUNPREUpIHtcbiAgICAgICAgaWYgKGV2ZW50LndoaWNoID09PSBFU0NBUEVfS0VZQ09ERSkge1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShwYXJlbnQucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9EQVRBX1RPR0dMRSQyKSkudHJpZ2dlcignZm9jdXMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS50cmlnZ2VyKCdjbGljaycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBpdGVtcyA9IFtdLnNsaWNlLmNhbGwocGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfVklTSUJMRV9JVEVNUykpLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGl0ZW0pLmlzKCc6dmlzaWJsZScpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5kZXggPSBpdGVtcy5pbmRleE9mKGV2ZW50LnRhcmdldCk7XG5cbiAgICAgIGlmIChldmVudC53aGljaCA9PT0gQVJST1dfVVBfS0VZQ09ERSAmJiBpbmRleCA+IDApIHtcbiAgICAgICAgLy8gVXBcbiAgICAgICAgaW5kZXgtLTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LndoaWNoID09PSBBUlJPV19ET1dOX0tFWUNPREUgJiYgaW5kZXggPCBpdGVtcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIC8vIERvd25cbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IDA7XG4gICAgICB9XG5cbiAgICAgIGl0ZW1zW2luZGV4XS5mb2N1cygpO1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoRHJvcGRvd24sIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OJDQ7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdCQyO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0VHlwZVwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0VHlwZSQyO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBEcm9wZG93bjtcbiAgfSgpO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub24oRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUkMiwgRHJvcGRvd24uX2RhdGFBcGlLZXlkb3duSGFuZGxlcikub24oRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSwgU0VMRUNUT1JfTUVOVSwgRHJvcGRvd24uX2RhdGFBcGlLZXlkb3duSGFuZGxlcikub24oRVZFTlRfQ0xJQ0tfREFUQV9BUEkkNCArIFwiIFwiICsgRVZFTlRfS0VZVVBfREFUQV9BUEksIERyb3Bkb3duLl9jbGVhck1lbnVzKS5vbihFVkVOVF9DTElDS19EQVRBX0FQSSQ0LCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQyLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgRHJvcGRvd24uX2pRdWVyeUludGVyZmFjZS5jYWxsKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSwgJ3RvZ2dsZScpO1xuICB9KS5vbihFVkVOVF9DTElDS19EQVRBX0FQSSQ0LCBTRUxFQ1RPUl9GT1JNX0NISUxELCBmdW5jdGlvbiAoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH0pO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIGpRdWVyeVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNF0gPSBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ0XS5Db25zdHJ1Y3RvciA9IERyb3Bkb3duO1xuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDRdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNF0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkNDtcbiAgICByZXR1cm4gRHJvcGRvd24uX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENvbnN0YW50c1xuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE5BTUUkNSA9ICdtb2RhbCc7XG4gIHZhciBWRVJTSU9OJDUgPSAnNC42LjAnO1xuICB2YXIgREFUQV9LRVkkNSA9ICdicy5tb2RhbCc7XG4gIHZhciBFVkVOVF9LRVkkNSA9IFwiLlwiICsgREFUQV9LRVkkNTtcbiAgdmFyIERBVEFfQVBJX0tFWSQ1ID0gJy5kYXRhLWFwaSc7XG4gIHZhciBKUVVFUllfTk9fQ09ORkxJQ1QkNSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDVdO1xuICB2YXIgRVNDQVBFX0tFWUNPREUkMSA9IDI3OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciBFc2NhcGUgKEVzYykga2V5XG5cbiAgdmFyIERlZmF1bHQkMyA9IHtcbiAgICBiYWNrZHJvcDogdHJ1ZSxcbiAgICBrZXlib2FyZDogdHJ1ZSxcbiAgICBmb2N1czogdHJ1ZSxcbiAgICBzaG93OiB0cnVlXG4gIH07XG4gIHZhciBEZWZhdWx0VHlwZSQzID0ge1xuICAgIGJhY2tkcm9wOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gICAga2V5Ym9hcmQ6ICdib29sZWFuJyxcbiAgICBmb2N1czogJ2Jvb2xlYW4nLFxuICAgIHNob3c6ICdib29sZWFuJ1xuICB9O1xuICB2YXIgRVZFTlRfSElERSQyID0gXCJoaWRlXCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX0hJREVfUFJFVkVOVEVEID0gXCJoaWRlUHJldmVudGVkXCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX0hJRERFTiQyID0gXCJoaWRkZW5cIiArIEVWRU5UX0tFWSQ1O1xuICB2YXIgRVZFTlRfU0hPVyQyID0gXCJzaG93XCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX1NIT1dOJDIgPSBcInNob3duXCIgKyBFVkVOVF9LRVkkNTtcbiAgdmFyIEVWRU5UX0ZPQ1VTSU4gPSBcImZvY3VzaW5cIiArIEVWRU5UX0tFWSQ1O1xuICB2YXIgRVZFTlRfUkVTSVpFID0gXCJyZXNpemVcIiArIEVWRU5UX0tFWSQ1O1xuICB2YXIgRVZFTlRfQ0xJQ0tfRElTTUlTUyA9IFwiY2xpY2suZGlzbWlzc1wiICsgRVZFTlRfS0VZJDU7XG4gIHZhciBFVkVOVF9LRVlET1dOX0RJU01JU1MgPSBcImtleWRvd24uZGlzbWlzc1wiICsgRVZFTlRfS0VZJDU7XG4gIHZhciBFVkVOVF9NT1VTRVVQX0RJU01JU1MgPSBcIm1vdXNldXAuZGlzbWlzc1wiICsgRVZFTlRfS0VZJDU7XG4gIHZhciBFVkVOVF9NT1VTRURPV05fRElTTUlTUyA9IFwibW91c2Vkb3duLmRpc21pc3NcIiArIEVWRU5UX0tFWSQ1O1xuICB2YXIgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkNSA9IFwiY2xpY2tcIiArIEVWRU5UX0tFWSQ1ICsgREFUQV9BUElfS0VZJDU7XG4gIHZhciBDTEFTU19OQU1FX1NDUk9MTEFCTEUgPSAnbW9kYWwtZGlhbG9nLXNjcm9sbGFibGUnO1xuICB2YXIgQ0xBU1NfTkFNRV9TQ1JPTExCQVJfTUVBU1VSRVIgPSAnbW9kYWwtc2Nyb2xsYmFyLW1lYXN1cmUnO1xuICB2YXIgQ0xBU1NfTkFNRV9CQUNLRFJPUCA9ICdtb2RhbC1iYWNrZHJvcCc7XG4gIHZhciBDTEFTU19OQU1FX09QRU4gPSAnbW9kYWwtb3Blbic7XG4gIHZhciBDTEFTU19OQU1FX0ZBREUkMSA9ICdmYWRlJztcbiAgdmFyIENMQVNTX05BTUVfU0hPVyQzID0gJ3Nob3cnO1xuICB2YXIgQ0xBU1NfTkFNRV9TVEFUSUMgPSAnbW9kYWwtc3RhdGljJztcbiAgdmFyIFNFTEVDVE9SX0RJQUxPRyA9ICcubW9kYWwtZGlhbG9nJztcbiAgdmFyIFNFTEVDVE9SX01PREFMX0JPRFkgPSAnLm1vZGFsLWJvZHknO1xuICB2YXIgU0VMRUNUT1JfREFUQV9UT0dHTEUkMyA9ICdbZGF0YS10b2dnbGU9XCJtb2RhbFwiXSc7XG4gIHZhciBTRUxFQ1RPUl9EQVRBX0RJU01JU1MgPSAnW2RhdGEtZGlzbWlzcz1cIm1vZGFsXCJdJztcbiAgdmFyIFNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQgPSAnLmZpeGVkLXRvcCwgLmZpeGVkLWJvdHRvbSwgLmlzLWZpeGVkLCAuc3RpY2t5LXRvcCc7XG4gIHZhciBTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCA9ICcuc3RpY2t5LXRvcCc7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE1vZGFsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNb2RhbChlbGVtZW50LCBjb25maWcpIHtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLl9kaWFsb2cgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JfRElBTE9HKTtcbiAgICAgIHRoaXMuX2JhY2tkcm9wID0gbnVsbDtcbiAgICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICAgIHRoaXMuX2lzQm9keU92ZXJmbG93aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLl9pZ25vcmVCYWNrZHJvcENsaWNrID0gZmFsc2U7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3Njcm9sbGJhcldpZHRoID0gMDtcbiAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgdmFyIF9wcm90byA9IE1vZGFsLnByb3RvdHlwZTtcblxuICAgIC8vIFB1YmxpY1xuICAgIF9wcm90by50b2dnbGUgPSBmdW5jdGlvbiB0b2dnbGUocmVsYXRlZFRhcmdldCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2lzU2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdyhyZWxhdGVkVGFyZ2V0KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnNob3cgPSBmdW5jdGlvbiBzaG93KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLl9pc1Nob3duIHx8IHRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GQURFJDEpKSB7XG4gICAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBzaG93RXZlbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfU0hPVyQyLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRUYXJnZXRcbiAgICAgIH0pO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoc2hvd0V2ZW50KTtcblxuICAgICAgaWYgKHRoaXMuX2lzU2hvd24gfHwgc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faXNTaG93biA9IHRydWU7XG5cbiAgICAgIHRoaXMuX2NoZWNrU2Nyb2xsYmFyKCk7XG5cbiAgICAgIHRoaXMuX3NldFNjcm9sbGJhcigpO1xuXG4gICAgICB0aGlzLl9hZGp1c3REaWFsb2coKTtcblxuICAgICAgdGhpcy5fc2V0RXNjYXBlRXZlbnQoKTtcblxuICAgICAgdGhpcy5fc2V0UmVzaXplRXZlbnQoKTtcblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLm9uKEVWRU5UX0NMSUNLX0RJU01JU1MsIFNFTEVDVE9SX0RBVEFfRElTTUlTUywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5oaWRlKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2RpYWxvZykub24oRVZFTlRfTU9VU0VET1dOX0RJU01JU1MsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKF90aGlzLl9lbGVtZW50KS5vbmUoRVZFTlRfTU9VU0VVUF9ESVNNSVNTLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoJF9fZGVmYXVsdFsnZGVmYXVsdCddKGV2ZW50LnRhcmdldCkuaXMoX3RoaXMuX2VsZW1lbnQpKSB7XG4gICAgICAgICAgICBfdGhpcy5faWdub3JlQmFja2Ryb3BDbGljayA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9zaG93QmFja2Ryb3AoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuX3Nob3dFbGVtZW50KHJlbGF0ZWRUYXJnZXQpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5oaWRlID0gZnVuY3Rpb24gaGlkZShldmVudCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuX2lzU2hvd24gfHwgdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGhpZGVFdmVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9ISURFJDIpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoaGlkZUV2ZW50KTtcblxuICAgICAgaWYgKCF0aGlzLl9pc1Nob3duIHx8IGhpZGVFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICAgIHZhciB0cmFuc2l0aW9uID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRkFERSQxKTtcblxuICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2V0RXNjYXBlRXZlbnQoKTtcblxuICAgICAgdGhpcy5fc2V0UmVzaXplRXZlbnQoKTtcblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vZmYoRVZFTlRfRk9DVVNJTik7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDMpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLm9mZihFVkVOVF9DTElDS19ESVNNSVNTKTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9kaWFsb2cpLm9mZihFVkVOVF9NT1VTRURPV05fRElTTUlTUyk7XG5cbiAgICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIuX2hpZGVNb2RhbChldmVudCk7XG4gICAgICAgIH0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9oaWRlTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgW3dpbmRvdywgdGhpcy5fZWxlbWVudCwgdGhpcy5fZGlhbG9nXS5mb3JFYWNoKGZ1bmN0aW9uIChodG1sRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGh0bWxFbGVtZW50KS5vZmYoRVZFTlRfS0VZJDUpO1xuICAgICAgfSk7XG4gICAgICAvKipcbiAgICAgICAqIGBkb2N1bWVudGAgaGFzIDIgZXZlbnRzIGBFVkVOVF9GT0NVU0lOYCBhbmQgYEVWRU5UX0NMSUNLX0RBVEFfQVBJYFxuICAgICAgICogRG8gbm90IG1vdmUgYGRvY3VtZW50YCBpbiBgaHRtbEVsZW1lbnRzYCBhcnJheVxuICAgICAgICogSXQgd2lsbCByZW1vdmUgYEVWRU5UX0NMSUNLX0RBVEFfQVBJYCBldmVudCB0aGF0IHNob3VsZCByZW1haW5cbiAgICAgICAqL1xuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9mZihFVkVOVF9GT0NVU0lOKTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsIERBVEFfS0VZJDUpO1xuICAgICAgdGhpcy5fY29uZmlnID0gbnVsbDtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5fZGlhbG9nID0gbnVsbDtcbiAgICAgIHRoaXMuX2JhY2tkcm9wID0gbnVsbDtcbiAgICAgIHRoaXMuX2lzU2hvd24gPSBudWxsO1xuICAgICAgdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcgPSBudWxsO1xuICAgICAgdGhpcy5faWdub3JlQmFja2Ryb3BDbGljayA9IG51bGw7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBudWxsO1xuICAgICAgdGhpcy5fc2Nyb2xsYmFyV2lkdGggPSBudWxsO1xuICAgIH07XG5cbiAgICBfcHJvdG8uaGFuZGxlVXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlVXBkYXRlKCkge1xuICAgICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgY29uZmlnID0gX2V4dGVuZHMoe30sIERlZmF1bHQkMywgY29uZmlnKTtcbiAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUkNSwgY29uZmlnLCBEZWZhdWx0VHlwZSQzKTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5fdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbiA9IGZ1bmN0aW9uIF90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBoaWRlRXZlbnRQcmV2ZW50ZWQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfSElERV9QUkVWRU5URUQpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoaGlkZUV2ZW50UHJldmVudGVkKTtcblxuICAgICAgaWYgKGhpZGVFdmVudFByZXZlbnRlZC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG5cbiAgICAgIGlmICghaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbic7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NUQVRJQyk7XG5cbiAgICAgIHZhciBtb2RhbFRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fZGlhbG9nKTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vZmYoVXRpbC5UUkFOU0lUSU9OX0VORCk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TVEFUSUMpO1xuXG4gICAgICAgIGlmICghaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKF90aGlzMy5fZWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzMy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSAnJztcbiAgICAgICAgICB9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZChfdGhpczMuX2VsZW1lbnQsIG1vZGFsVHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQobW9kYWxUcmFuc2l0aW9uRHVyYXRpb24pO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LmZvY3VzKCk7XG4gICAgfTtcblxuICAgIF9wcm90by5fc2hvd0VsZW1lbnQgPSBmdW5jdGlvbiBfc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCkge1xuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgIHZhciB0cmFuc2l0aW9uID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRkFERSQxKTtcbiAgICAgIHZhciBtb2RhbEJvZHkgPSB0aGlzLl9kaWFsb2cgPyB0aGlzLl9kaWFsb2cucXVlcnlTZWxlY3RvcihTRUxFQ1RPUl9NT0RBTF9CT0RZKSA6IG51bGw7XG5cbiAgICAgIGlmICghdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlIHx8IHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgLy8gRG9uJ3QgbW92ZSBtb2RhbCdzIERPTSBwb3NpdGlvblxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKTtcblxuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCB0cnVlKTtcblxuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZGlhbG9nJyk7XG5cbiAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZGlhbG9nKS5oYXNDbGFzcyhDTEFTU19OQU1FX1NDUk9MTEFCTEUpICYmIG1vZGFsQm9keSkge1xuICAgICAgICBtb2RhbEJvZHkuc2Nyb2xsVG9wID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgVXRpbC5yZWZsb3codGhpcy5fZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5hZGRDbGFzcyhDTEFTU19OQU1FX1NIT1ckMyk7XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcuZm9jdXMpIHtcbiAgICAgICAgdGhpcy5fZW5mb3JjZUZvY3VzKCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzaG93bkV2ZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX1NIT1dOJDIsIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogcmVsYXRlZFRhcmdldFxuICAgICAgfSk7XG5cbiAgICAgIHZhciB0cmFuc2l0aW9uQ29tcGxldGUgPSBmdW5jdGlvbiB0cmFuc2l0aW9uQ29tcGxldGUoKSB7XG4gICAgICAgIGlmIChfdGhpczQuX2NvbmZpZy5mb2N1cykge1xuICAgICAgICAgIF90aGlzNC5fZWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXM0Ll9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKF90aGlzNC5fZWxlbWVudCkudHJpZ2dlcihzaG93bkV2ZW50KTtcbiAgICAgIH07XG5cbiAgICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2RpYWxvZyk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9kaWFsb2cpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCB0cmFuc2l0aW9uQ29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFuc2l0aW9uQ29tcGxldGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9lbmZvcmNlRm9jdXMgPSBmdW5jdGlvbiBfZW5mb3JjZUZvY3VzKCkge1xuICAgICAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudCkub2ZmKEVWRU5UX0ZPQ1VTSU4pIC8vIEd1YXJkIGFnYWluc3QgaW5maW5pdGUgZm9jdXMgbG9vcFxuICAgICAgLm9uKEVWRU5UX0ZPQ1VTSU4sIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAoZG9jdW1lbnQgIT09IGV2ZW50LnRhcmdldCAmJiBfdGhpczUuX2VsZW1lbnQgIT09IGV2ZW50LnRhcmdldCAmJiAkX19kZWZhdWx0WydkZWZhdWx0J10oX3RoaXM1Ll9lbGVtZW50KS5oYXMoZXZlbnQudGFyZ2V0KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBfdGhpczUuX2VsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5fc2V0RXNjYXBlRXZlbnQgPSBmdW5jdGlvbiBfc2V0RXNjYXBlRXZlbnQoKSB7XG4gICAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX2lzU2hvd24pIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLm9uKEVWRU5UX0tFWURPV05fRElTTUlTUywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgaWYgKF90aGlzNi5fY29uZmlnLmtleWJvYXJkICYmIGV2ZW50LndoaWNoID09PSBFU0NBUEVfS0VZQ09ERSQxKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICBfdGhpczYuaGlkZSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIV90aGlzNi5fY29uZmlnLmtleWJvYXJkICYmIGV2ZW50LndoaWNoID09PSBFU0NBUEVfS0VZQ09ERSQxKSB7XG4gICAgICAgICAgICBfdGhpczYuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5faXNTaG93bikge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkub2ZmKEVWRU5UX0tFWURPV05fRElTTUlTUyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fc2V0UmVzaXplRXZlbnQgPSBmdW5jdGlvbiBfc2V0UmVzaXplRXZlbnQoKSB7XG4gICAgICB2YXIgX3RoaXM3ID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX2lzU2hvd24pIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykub24oRVZFTlRfUkVTSVpFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXM3LmhhbmRsZVVwZGF0ZShldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykub2ZmKEVWRU5UX1JFU0laRSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5faGlkZU1vZGFsID0gZnVuY3Rpb24gX2hpZGVNb2RhbCgpIHtcbiAgICAgIHZhciBfdGhpczggPSB0aGlzO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIHRydWUpO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcpO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgncm9sZScpO1xuXG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcblxuICAgICAgdGhpcy5fc2hvd0JhY2tkcm9wKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50LmJvZHkpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfT1BFTik7XG5cbiAgICAgICAgX3RoaXM4Ll9yZXNldEFkanVzdG1lbnRzKCk7XG5cbiAgICAgICAgX3RoaXM4Ll9yZXNldFNjcm9sbGJhcigpO1xuXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShfdGhpczguX2VsZW1lbnQpLnRyaWdnZXIoRVZFTlRfSElEREVOJDIpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5fcmVtb3ZlQmFja2Ryb3AgPSBmdW5jdGlvbiBfcmVtb3ZlQmFja2Ryb3AoKSB7XG4gICAgICBpZiAodGhpcy5fYmFja2Ryb3ApIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2JhY2tkcm9wKS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5fYmFja2Ryb3AgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX3Nob3dCYWNrZHJvcCA9IGZ1bmN0aW9uIF9zaG93QmFja2Ryb3AoY2FsbGJhY2spIHtcbiAgICAgIHZhciBfdGhpczkgPSB0aGlzO1xuXG4gICAgICB2YXIgYW5pbWF0ZSA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZBREUkMSkgPyBDTEFTU19OQU1FX0ZBREUkMSA6ICcnO1xuXG4gICAgICBpZiAodGhpcy5faXNTaG93biAmJiB0aGlzLl9jb25maWcuYmFja2Ryb3ApIHtcbiAgICAgICAgdGhpcy5fYmFja2Ryb3AgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5fYmFja2Ryb3AuY2xhc3NOYW1lID0gQ0xBU1NfTkFNRV9CQUNLRFJPUDtcblxuICAgICAgICBpZiAoYW5pbWF0ZSkge1xuICAgICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTGlzdC5hZGQoYW5pbWF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fYmFja2Ryb3ApLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkub24oRVZFTlRfQ0xJQ0tfRElTTUlTUywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgaWYgKF90aGlzOS5faWdub3JlQmFja2Ryb3BDbGljaykge1xuICAgICAgICAgICAgX3RoaXM5Ll9pZ25vcmVCYWNrZHJvcENsaWNrID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gZXZlbnQuY3VycmVudFRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChfdGhpczkuX2NvbmZpZy5iYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgICAgIF90aGlzOS5fdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbigpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpczkuaGlkZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGFuaW1hdGUpIHtcbiAgICAgICAgICBVdGlsLnJlZmxvdyh0aGlzLl9iYWNrZHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fYmFja2Ryb3ApLmFkZENsYXNzKENMQVNTX05BTUVfU0hPVyQzKTtcblxuICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhbmltYXRlKSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYmFja2Ryb3BUcmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2JhY2tkcm9wKTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2JhY2tkcm9wKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY2FsbGJhY2spLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGJhY2tkcm9wVHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzU2hvd24gJiYgdGhpcy5fYmFja2Ryb3ApIHtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2JhY2tkcm9wKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX1NIT1ckMyk7XG5cbiAgICAgICAgdmFyIGNhbGxiYWNrUmVtb3ZlID0gZnVuY3Rpb24gY2FsbGJhY2tSZW1vdmUoKSB7XG4gICAgICAgICAgX3RoaXM5Ll9yZW1vdmVCYWNrZHJvcCgpO1xuXG4gICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENMQVNTX05BTUVfRkFERSQxKSkge1xuICAgICAgICAgIHZhciBfYmFja2Ryb3BUcmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2JhY2tkcm9wKTtcblxuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9iYWNrZHJvcCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNhbGxiYWNrUmVtb3ZlKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChfYmFja2Ryb3BUcmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrUmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHVzZWQgdG8gaGFuZGxlIG92ZXJmbG93aW5nIG1vZGFsc1xuICAgIC8vIHRvZG8gKGZhdCk6IHRoZXNlIHNob3VsZCBwcm9iYWJseSBiZSByZWZhY3RvcmVkIG91dCBvZiBtb2RhbC5qc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICA7XG5cbiAgICBfcHJvdG8uX2FkanVzdERpYWxvZyA9IGZ1bmN0aW9uIF9hZGp1c3REaWFsb2coKSB7XG4gICAgICB2YXIgaXNNb2RhbE92ZXJmbG93aW5nID0gdGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuXG4gICAgICBpZiAoIXRoaXMuX2lzQm9keU92ZXJmbG93aW5nICYmIGlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0ID0gdGhpcy5fc2Nyb2xsYmFyV2lkdGggKyBcInB4XCI7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9pc0JvZHlPdmVyZmxvd2luZyAmJiAhaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gdGhpcy5fc2Nyb2xsYmFyV2lkdGggKyBcInB4XCI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fcmVzZXRBZGp1c3RtZW50cyA9IGZ1bmN0aW9uIF9yZXNldEFkanVzdG1lbnRzKCkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCA9ICcnO1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnJztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9jaGVja1Njcm9sbGJhciA9IGZ1bmN0aW9uIF9jaGVja1Njcm9sbGJhcigpIHtcbiAgICAgIHZhciByZWN0ID0gZG9jdW1lbnQuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMuX2lzQm9keU92ZXJmbG93aW5nID0gTWF0aC5yb3VuZChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSA8IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgdGhpcy5fc2Nyb2xsYmFyV2lkdGggPSB0aGlzLl9nZXRTY3JvbGxiYXJXaWR0aCgpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX3NldFNjcm9sbGJhciA9IGZ1bmN0aW9uIF9zZXRTY3JvbGxiYXIoKSB7XG4gICAgICB2YXIgX3RoaXMxMCA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLl9pc0JvZHlPdmVyZmxvd2luZykge1xuICAgICAgICAvLyBOb3RlOiBET01Ob2RlLnN0eWxlLnBhZGRpbmdSaWdodCByZXR1cm5zIHRoZSBhY3R1YWwgdmFsdWUgb3IgJycgaWYgbm90IHNldFxuICAgICAgICAvLyAgIHdoaWxlICQoRE9NTm9kZSkuY3NzKCdwYWRkaW5nLXJpZ2h0JykgcmV0dXJucyB0aGUgY2FsY3VsYXRlZCB2YWx1ZSBvciAwIGlmIG5vdCBzZXRcbiAgICAgICAgdmFyIGZpeGVkQ29udGVudCA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9GSVhFRF9DT05URU5UKSk7XG4gICAgICAgIHZhciBzdGlja3lDb250ZW50ID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX1NUSUNLWV9DT05URU5UKSk7IC8vIEFkanVzdCBmaXhlZCBjb250ZW50IHBhZGRpbmdcblxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZml4ZWRDb250ZW50KS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xuICAgICAgICAgIHZhciBhY3R1YWxQYWRkaW5nID0gZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQ7XG4gICAgICAgICAgdmFyIGNhbGN1bGF0ZWRQYWRkaW5nID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnQpLmNzcygncGFkZGluZy1yaWdodCcpO1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlbGVtZW50KS5kYXRhKCdwYWRkaW5nLXJpZ2h0JywgYWN0dWFsUGFkZGluZykuY3NzKCdwYWRkaW5nLXJpZ2h0JywgcGFyc2VGbG9hdChjYWxjdWxhdGVkUGFkZGluZykgKyBfdGhpczEwLl9zY3JvbGxiYXJXaWR0aCArIFwicHhcIik7XG4gICAgICAgIH0pOyAvLyBBZGp1c3Qgc3RpY2t5IGNvbnRlbnQgbWFyZ2luXG5cbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHN0aWNreUNvbnRlbnQpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7XG4gICAgICAgICAgdmFyIGFjdHVhbE1hcmdpbiA9IGVsZW1lbnQuc3R5bGUubWFyZ2luUmlnaHQ7XG4gICAgICAgICAgdmFyIGNhbGN1bGF0ZWRNYXJnaW4gPSAkX19kZWZhdWx0WydkZWZhdWx0J10oZWxlbWVudCkuY3NzKCdtYXJnaW4tcmlnaHQnKTtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZWxlbWVudCkuZGF0YSgnbWFyZ2luLXJpZ2h0JywgYWN0dWFsTWFyZ2luKS5jc3MoJ21hcmdpbi1yaWdodCcsIHBhcnNlRmxvYXQoY2FsY3VsYXRlZE1hcmdpbikgLSBfdGhpczEwLl9zY3JvbGxiYXJXaWR0aCArIFwicHhcIik7XG4gICAgICAgIH0pOyAvLyBBZGp1c3QgYm9keSBwYWRkaW5nXG5cbiAgICAgICAgdmFyIGFjdHVhbFBhZGRpbmcgPSBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodDtcbiAgICAgICAgdmFyIGNhbGN1bGF0ZWRQYWRkaW5nID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50LmJvZHkpLmNzcygncGFkZGluZy1yaWdodCcpO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQuYm9keSkuZGF0YSgncGFkZGluZy1yaWdodCcsIGFjdHVhbFBhZGRpbmcpLmNzcygncGFkZGluZy1yaWdodCcsIHBhcnNlRmxvYXQoY2FsY3VsYXRlZFBhZGRpbmcpICsgdGhpcy5fc2Nyb2xsYmFyV2lkdGggKyBcInB4XCIpO1xuICAgICAgfVxuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9PUEVOKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9yZXNldFNjcm9sbGJhciA9IGZ1bmN0aW9uIF9yZXNldFNjcm9sbGJhcigpIHtcbiAgICAgIC8vIFJlc3RvcmUgZml4ZWQgY29udGVudCBwYWRkaW5nXG4gICAgICB2YXIgZml4ZWRDb250ZW50ID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQpKTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShmaXhlZENvbnRlbnQpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7XG4gICAgICAgIHZhciBwYWRkaW5nID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnQpLmRhdGEoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnQpLnJlbW92ZURhdGEoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSBwYWRkaW5nID8gcGFkZGluZyA6ICcnO1xuICAgICAgfSk7IC8vIFJlc3RvcmUgc3RpY2t5IGNvbnRlbnRcblxuICAgICAgdmFyIGVsZW1lbnRzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiXCIgKyBTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCkpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnRzKS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xuICAgICAgICB2YXIgbWFyZ2luID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGVsZW1lbnQpLmRhdGEoJ21hcmdpbi1yaWdodCcpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgbWFyZ2luICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlbGVtZW50KS5jc3MoJ21hcmdpbi1yaWdodCcsIG1hcmdpbikucmVtb3ZlRGF0YSgnbWFyZ2luLXJpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0pOyAvLyBSZXN0b3JlIGJvZHkgcGFkZGluZ1xuXG4gICAgICB2YXIgcGFkZGluZyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkb2N1bWVudC5ib2R5KS5kYXRhKCdwYWRkaW5nLXJpZ2h0Jyk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQuYm9keSkucmVtb3ZlRGF0YSgncGFkZGluZy1yaWdodCcpO1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBwYWRkaW5nID8gcGFkZGluZyA6ICcnO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldFNjcm9sbGJhcldpZHRoID0gZnVuY3Rpb24gX2dldFNjcm9sbGJhcldpZHRoKCkge1xuICAgICAgLy8gdGh4IGQud2Fsc2hcbiAgICAgIHZhciBzY3JvbGxEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHNjcm9sbERpdi5jbGFzc05hbWUgPSBDTEFTU19OQU1FX1NDUk9MTEJBUl9NRUFTVVJFUjtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2Nyb2xsRGl2KTtcbiAgICAgIHZhciBzY3JvbGxiYXJXaWR0aCA9IHNjcm9sbERpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIHNjcm9sbERpdi5jbGllbnRXaWR0aDtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc2Nyb2xsRGl2KTtcbiAgICAgIHJldHVybiBzY3JvbGxiYXJXaWR0aDtcbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIE1vZGFsLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZywgcmVsYXRlZFRhcmdldCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYXRhID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpLmRhdGEoREFUQV9LRVkkNSk7XG5cbiAgICAgICAgdmFyIF9jb25maWcgPSBfZXh0ZW5kcyh7fSwgRGVmYXVsdCQzLCAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YSgpLCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWcgPyBjb25maWcgOiB7fSk7XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBNb2RhbCh0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQ1LCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcXFwiXCIgKyBjb25maWcgKyBcIlxcXCJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVtjb25maWddKHJlbGF0ZWRUYXJnZXQpO1xuICAgICAgICB9IGVsc2UgaWYgKF9jb25maWcuc2hvdykge1xuICAgICAgICAgIGRhdGEuc2hvdyhyZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9jcmVhdGVDbGFzcyhNb2RhbCwgbnVsbCwgW3tcbiAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFZFUlNJT04kNTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0JDM7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIE1vZGFsO1xuICB9KCk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5vbihFVkVOVF9DTElDS19EQVRBX0FQSSQ1LCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICB2YXIgX3RoaXMxMSA9IHRoaXM7XG5cbiAgICB2YXIgdGFyZ2V0O1xuICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzKTtcblxuICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgdmFyIGNvbmZpZyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0YXJnZXQpLmRhdGEoREFUQV9LRVkkNSkgPyAndG9nZ2xlJyA6IF9leHRlbmRzKHt9LCAkX19kZWZhdWx0WydkZWZhdWx0J10odGFyZ2V0KS5kYXRhKCksICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKCkpO1xuXG4gICAgaWYgKHRoaXMudGFnTmFtZSA9PT0gJ0EnIHx8IHRoaXMudGFnTmFtZSA9PT0gJ0FSRUEnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHZhciAkdGFyZ2V0ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRhcmdldCkub25lKEVWRU5UX1NIT1ckMiwgZnVuY3Rpb24gKHNob3dFdmVudCkge1xuICAgICAgaWYgKHNob3dFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICAvLyBPbmx5IHJlZ2lzdGVyIGZvY3VzIHJlc3RvcmVyIGlmIG1vZGFsIHdpbGwgYWN0dWFsbHkgZ2V0IHNob3duXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgJHRhcmdldC5vbmUoRVZFTlRfSElEREVOJDIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShfdGhpczExKS5pcygnOnZpc2libGUnKSkge1xuICAgICAgICAgIF90aGlzMTEuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBNb2RhbC5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRhcmdldCksIGNvbmZpZywgdGhpcyk7XG4gIH0pO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIGpRdWVyeVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNV0gPSBNb2RhbC5falF1ZXJ5SW50ZXJmYWNlO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ1XS5Db25zdHJ1Y3RvciA9IE1vZGFsO1xuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNV0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkNTtcbiAgICByZXR1cm4gTW9kYWwuX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwICh2NC42LjApOiB0b29scy9zYW5pdGl6ZXIuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICB2YXIgdXJpQXR0cnMgPSBbJ2JhY2tncm91bmQnLCAnY2l0ZScsICdocmVmJywgJ2l0ZW10eXBlJywgJ2xvbmdkZXNjJywgJ3Bvc3RlcicsICdzcmMnLCAneGxpbms6aHJlZiddO1xuICB2YXIgQVJJQV9BVFRSSUJVVEVfUEFUVEVSTiA9IC9eYXJpYS1bXFx3LV0qJC9pO1xuICB2YXIgRGVmYXVsdFdoaXRlbGlzdCA9IHtcbiAgICAvLyBHbG9iYWwgYXR0cmlidXRlcyBhbGxvd2VkIG9uIGFueSBzdXBwbGllZCBlbGVtZW50IGJlbG93LlxuICAgICcqJzogWydjbGFzcycsICdkaXInLCAnaWQnLCAnbGFuZycsICdyb2xlJywgQVJJQV9BVFRSSUJVVEVfUEFUVEVSTl0sXG4gICAgYTogWyd0YXJnZXQnLCAnaHJlZicsICd0aXRsZScsICdyZWwnXSxcbiAgICBhcmVhOiBbXSxcbiAgICBiOiBbXSxcbiAgICBicjogW10sXG4gICAgY29sOiBbXSxcbiAgICBjb2RlOiBbXSxcbiAgICBkaXY6IFtdLFxuICAgIGVtOiBbXSxcbiAgICBocjogW10sXG4gICAgaDE6IFtdLFxuICAgIGgyOiBbXSxcbiAgICBoMzogW10sXG4gICAgaDQ6IFtdLFxuICAgIGg1OiBbXSxcbiAgICBoNjogW10sXG4gICAgaTogW10sXG4gICAgaW1nOiBbJ3NyYycsICdzcmNzZXQnLCAnYWx0JywgJ3RpdGxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgIGxpOiBbXSxcbiAgICBvbDogW10sXG4gICAgcDogW10sXG4gICAgcHJlOiBbXSxcbiAgICBzOiBbXSxcbiAgICBzbWFsbDogW10sXG4gICAgc3BhbjogW10sXG4gICAgc3ViOiBbXSxcbiAgICBzdXA6IFtdLFxuICAgIHN0cm9uZzogW10sXG4gICAgdTogW10sXG4gICAgdWw6IFtdXG4gIH07XG4gIC8qKlxuICAgKiBBIHBhdHRlcm4gdGhhdCByZWNvZ25pemVzIGEgY29tbW9ubHkgdXNlZnVsIHN1YnNldCBvZiBVUkxzIHRoYXQgYXJlIHNhZmUuXG4gICAqXG4gICAqIFNob3V0b3V0IHRvIEFuZ3VsYXIgNyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvNy4yLjQvcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3VybF9zYW5pdGl6ZXIudHNcbiAgICovXG5cbiAgdmFyIFNBRkVfVVJMX1BBVFRFUk4gPSAvXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwfHRlbHxmaWxlKTp8W14jJi86P10qKD86WyMvP118JCkpL2dpO1xuICAvKipcbiAgICogQSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBzYWZlIGRhdGEgVVJMcy4gT25seSBtYXRjaGVzIGltYWdlLCB2aWRlbyBhbmQgYXVkaW8gdHlwZXMuXG4gICAqXG4gICAqIFNob3V0b3V0IHRvIEFuZ3VsYXIgNyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvNy4yLjQvcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3VybF9zYW5pdGl6ZXIudHNcbiAgICovXG5cbiAgdmFyIERBVEFfVVJMX1BBVFRFUk4gPSAvXmRhdGE6KD86aW1hZ2VcXC8oPzpibXB8Z2lmfGpwZWd8anBnfHBuZ3x0aWZmfHdlYnApfHZpZGVvXFwvKD86bXBlZ3xtcDR8b2dnfHdlYm0pfGF1ZGlvXFwvKD86bXAzfG9nYXxvZ2d8b3B1cykpO2Jhc2U2NCxbXFxkKy9hLXpdKz0qJC9pO1xuXG4gIGZ1bmN0aW9uIGFsbG93ZWRBdHRyaWJ1dGUoYXR0ciwgYWxsb3dlZEF0dHJpYnV0ZUxpc3QpIHtcbiAgICB2YXIgYXR0ck5hbWUgPSBhdHRyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoYWxsb3dlZEF0dHJpYnV0ZUxpc3QuaW5kZXhPZihhdHRyTmFtZSkgIT09IC0xKSB7XG4gICAgICBpZiAodXJpQXR0cnMuaW5kZXhPZihhdHRyTmFtZSkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKGF0dHIubm9kZVZhbHVlLm1hdGNoKFNBRkVfVVJMX1BBVFRFUk4pIHx8IGF0dHIubm9kZVZhbHVlLm1hdGNoKERBVEFfVVJMX1BBVFRFUk4pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHJlZ0V4cCA9IGFsbG93ZWRBdHRyaWJ1dGVMaXN0LmZpbHRlcihmdW5jdGlvbiAoYXR0clJlZ2V4KSB7XG4gICAgICByZXR1cm4gYXR0clJlZ2V4IGluc3RhbmNlb2YgUmVnRXhwO1xuICAgIH0pOyAvLyBDaGVjayBpZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB2YWxpZGF0ZXMgdGhlIGF0dHJpYnV0ZS5cblxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSByZWdFeHAubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmIChhdHRyTmFtZS5tYXRjaChyZWdFeHBbaV0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhbml0aXplSHRtbCh1bnNhZmVIdG1sLCB3aGl0ZUxpc3QsIHNhbml0aXplRm4pIHtcbiAgICBpZiAodW5zYWZlSHRtbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bnNhZmVIdG1sO1xuICAgIH1cblxuICAgIGlmIChzYW5pdGl6ZUZuICYmIHR5cGVvZiBzYW5pdGl6ZUZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gc2FuaXRpemVGbih1bnNhZmVIdG1sKTtcbiAgICB9XG5cbiAgICB2YXIgZG9tUGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKTtcbiAgICB2YXIgY3JlYXRlZERvY3VtZW50ID0gZG9tUGFyc2VyLnBhcnNlRnJvbVN0cmluZyh1bnNhZmVIdG1sLCAndGV4dC9odG1sJyk7XG4gICAgdmFyIHdoaXRlbGlzdEtleXMgPSBPYmplY3Qua2V5cyh3aGl0ZUxpc3QpO1xuICAgIHZhciBlbGVtZW50cyA9IFtdLnNsaWNlLmNhbGwoY3JlYXRlZERvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvckFsbCgnKicpKTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGksIGxlbikge1xuICAgICAgdmFyIGVsID0gZWxlbWVudHNbaV07XG4gICAgICB2YXIgZWxOYW1lID0gZWwubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKHdoaXRlbGlzdEtleXMuaW5kZXhPZihlbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG4gICAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XG4gICAgICB9XG5cbiAgICAgIHZhciBhdHRyaWJ1dGVMaXN0ID0gW10uc2xpY2UuY2FsbChlbC5hdHRyaWJ1dGVzKTtcbiAgICAgIHZhciB3aGl0ZWxpc3RlZEF0dHJpYnV0ZXMgPSBbXS5jb25jYXQod2hpdGVMaXN0WycqJ10gfHwgW10sIHdoaXRlTGlzdFtlbE5hbWVdIHx8IFtdKTtcbiAgICAgIGF0dHJpYnV0ZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoYXR0cikge1xuICAgICAgICBpZiAoIWFsbG93ZWRBdHRyaWJ1dGUoYXR0ciwgd2hpdGVsaXN0ZWRBdHRyaWJ1dGVzKSkge1xuICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5vZGVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgdmFyIF9yZXQgPSBfbG9vcChpKTtcblxuICAgICAgaWYgKF9yZXQgPT09IFwiY29udGludWVcIikgY29udGludWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZWREb2N1bWVudC5ib2R5LmlubmVySFRNTDtcbiAgfVxuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ29uc3RhbnRzXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgTkFNRSQ2ID0gJ3Rvb2x0aXAnO1xuICB2YXIgVkVSU0lPTiQ2ID0gJzQuNi4wJztcbiAgdmFyIERBVEFfS0VZJDYgPSAnYnMudG9vbHRpcCc7XG4gIHZhciBFVkVOVF9LRVkkNiA9IFwiLlwiICsgREFUQV9LRVkkNjtcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCQ2ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNl07XG4gIHZhciBDTEFTU19QUkVGSVggPSAnYnMtdG9vbHRpcCc7XG4gIHZhciBCU0NMU19QUkVGSVhfUkVHRVggPSBuZXcgUmVnRXhwKFwiKF58XFxcXHMpXCIgKyBDTEFTU19QUkVGSVggKyBcIlxcXFxTK1wiLCAnZycpO1xuICB2YXIgRElTQUxMT1dFRF9BVFRSSUJVVEVTID0gWydzYW5pdGl6ZScsICd3aGl0ZUxpc3QnLCAnc2FuaXRpemVGbiddO1xuICB2YXIgRGVmYXVsdFR5cGUkNCA9IHtcbiAgICBhbmltYXRpb246ICdib29sZWFuJyxcbiAgICB0ZW1wbGF0ZTogJ3N0cmluZycsXG4gICAgdGl0bGU6ICcoc3RyaW5nfGVsZW1lbnR8ZnVuY3Rpb24pJyxcbiAgICB0cmlnZ2VyOiAnc3RyaW5nJyxcbiAgICBkZWxheTogJyhudW1iZXJ8b2JqZWN0KScsXG4gICAgaHRtbDogJ2Jvb2xlYW4nLFxuICAgIHNlbGVjdG9yOiAnKHN0cmluZ3xib29sZWFuKScsXG4gICAgcGxhY2VtZW50OiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICAgIG9mZnNldDogJyhudW1iZXJ8c3RyaW5nfGZ1bmN0aW9uKScsXG4gICAgY29udGFpbmVyOiAnKHN0cmluZ3xlbGVtZW50fGJvb2xlYW4pJyxcbiAgICBmYWxsYmFja1BsYWNlbWVudDogJyhzdHJpbmd8YXJyYXkpJyxcbiAgICBib3VuZGFyeTogJyhzdHJpbmd8ZWxlbWVudCknLFxuICAgIGN1c3RvbUNsYXNzOiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICAgIHNhbml0aXplOiAnYm9vbGVhbicsXG4gICAgc2FuaXRpemVGbjogJyhudWxsfGZ1bmN0aW9uKScsXG4gICAgd2hpdGVMaXN0OiAnb2JqZWN0JyxcbiAgICBwb3BwZXJDb25maWc6ICcobnVsbHxvYmplY3QpJ1xuICB9O1xuICB2YXIgQXR0YWNobWVudE1hcCA9IHtcbiAgICBBVVRPOiAnYXV0bycsXG4gICAgVE9QOiAndG9wJyxcbiAgICBSSUdIVDogJ3JpZ2h0JyxcbiAgICBCT1RUT006ICdib3R0b20nLFxuICAgIExFRlQ6ICdsZWZ0J1xuICB9O1xuICB2YXIgRGVmYXVsdCQ0ID0ge1xuICAgIGFuaW1hdGlvbjogdHJ1ZSxcbiAgICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJ0b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIj4nICsgJzxkaXYgY2xhc3M9XCJhcnJvd1wiPjwvZGl2PicgKyAnPGRpdiBjbGFzcz1cInRvb2x0aXAtaW5uZXJcIj48L2Rpdj48L2Rpdj4nLFxuICAgIHRyaWdnZXI6ICdob3ZlciBmb2N1cycsXG4gICAgdGl0bGU6ICcnLFxuICAgIGRlbGF5OiAwLFxuICAgIGh0bWw6IGZhbHNlLFxuICAgIHNlbGVjdG9yOiBmYWxzZSxcbiAgICBwbGFjZW1lbnQ6ICd0b3AnLFxuICAgIG9mZnNldDogMCxcbiAgICBjb250YWluZXI6IGZhbHNlLFxuICAgIGZhbGxiYWNrUGxhY2VtZW50OiAnZmxpcCcsXG4gICAgYm91bmRhcnk6ICdzY3JvbGxQYXJlbnQnLFxuICAgIGN1c3RvbUNsYXNzOiAnJyxcbiAgICBzYW5pdGl6ZTogdHJ1ZSxcbiAgICBzYW5pdGl6ZUZuOiBudWxsLFxuICAgIHdoaXRlTGlzdDogRGVmYXVsdFdoaXRlbGlzdCxcbiAgICBwb3BwZXJDb25maWc6IG51bGxcbiAgfTtcbiAgdmFyIEhPVkVSX1NUQVRFX1NIT1cgPSAnc2hvdyc7XG4gIHZhciBIT1ZFUl9TVEFURV9PVVQgPSAnb3V0JztcbiAgdmFyIEV2ZW50ID0ge1xuICAgIEhJREU6IFwiaGlkZVwiICsgRVZFTlRfS0VZJDYsXG4gICAgSElEREVOOiBcImhpZGRlblwiICsgRVZFTlRfS0VZJDYsXG4gICAgU0hPVzogXCJzaG93XCIgKyBFVkVOVF9LRVkkNixcbiAgICBTSE9XTjogXCJzaG93blwiICsgRVZFTlRfS0VZJDYsXG4gICAgSU5TRVJURUQ6IFwiaW5zZXJ0ZWRcIiArIEVWRU5UX0tFWSQ2LFxuICAgIENMSUNLOiBcImNsaWNrXCIgKyBFVkVOVF9LRVkkNixcbiAgICBGT0NVU0lOOiBcImZvY3VzaW5cIiArIEVWRU5UX0tFWSQ2LFxuICAgIEZPQ1VTT1VUOiBcImZvY3Vzb3V0XCIgKyBFVkVOVF9LRVkkNixcbiAgICBNT1VTRUVOVEVSOiBcIm1vdXNlZW50ZXJcIiArIEVWRU5UX0tFWSQ2LFxuICAgIE1PVVNFTEVBVkU6IFwibW91c2VsZWF2ZVwiICsgRVZFTlRfS0VZJDZcbiAgfTtcbiAgdmFyIENMQVNTX05BTUVfRkFERSQyID0gJ2ZhZGUnO1xuICB2YXIgQ0xBU1NfTkFNRV9TSE9XJDQgPSAnc2hvdyc7XG4gIHZhciBTRUxFQ1RPUl9UT09MVElQX0lOTkVSID0gJy50b29sdGlwLWlubmVyJztcbiAgdmFyIFNFTEVDVE9SX0FSUk9XID0gJy5hcnJvdyc7XG4gIHZhciBUUklHR0VSX0hPVkVSID0gJ2hvdmVyJztcbiAgdmFyIFRSSUdHRVJfRk9DVVMgPSAnZm9jdXMnO1xuICB2YXIgVFJJR0dFUl9DTElDSyA9ICdjbGljayc7XG4gIHZhciBUUklHR0VSX01BTlVBTCA9ICdtYW51YWwnO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBUb29sdGlwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUb29sdGlwKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgaWYgKHR5cGVvZiBQb3BwZXJfX2RlZmF1bHRbJ2RlZmF1bHQnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwXFwncyB0b29sdGlwcyByZXF1aXJlIFBvcHBlciAoaHR0cHM6Ly9wb3BwZXIuanMub3JnKScpO1xuICAgICAgfSAvLyBwcml2YXRlXG5cblxuICAgICAgdGhpcy5faXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3RpbWVvdXQgPSAwO1xuICAgICAgdGhpcy5faG92ZXJTdGF0ZSA9ICcnO1xuICAgICAgdGhpcy5fYWN0aXZlVHJpZ2dlciA9IHt9O1xuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbDsgLy8gUHJvdGVjdGVkXG5cbiAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLmNvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgdGhpcy50aXAgPSBudWxsO1xuXG4gICAgICB0aGlzLl9zZXRMaXN0ZW5lcnMoKTtcbiAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgdmFyIF9wcm90byA9IFRvb2x0aXAucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLmVuYWJsZSA9IGZ1bmN0aW9uIGVuYWJsZSgpIHtcbiAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IHRydWU7XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNhYmxlID0gZnVuY3Rpb24gZGlzYWJsZSgpIHtcbiAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IGZhbHNlO1xuICAgIH07XG5cbiAgICBfcHJvdG8udG9nZ2xlRW5hYmxlZCA9IGZ1bmN0aW9uIHRvZ2dsZUVuYWJsZWQoKSB7XG4gICAgICB0aGlzLl9pc0VuYWJsZWQgPSAhdGhpcy5faXNFbmFibGVkO1xuICAgIH07XG5cbiAgICBfcHJvdG8udG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKGV2ZW50KSB7XG4gICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICB2YXIgZGF0YUtleSA9IHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVk7XG4gICAgICAgIHZhciBjb250ZXh0ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmRhdGEoZGF0YUtleSk7XG5cbiAgICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgICAgY29udGV4dCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGV2ZW50LmN1cnJlbnRUYXJnZXQsIHRoaXMuX2dldERlbGVnYXRlQ29uZmlnKCkpO1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXksIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlci5jbGljayA9ICFjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyLmNsaWNrO1xuXG4gICAgICAgIGlmIChjb250ZXh0Ll9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgICAgICBjb250ZXh0Ll9lbnRlcihudWxsLCBjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0Ll9sZWF2ZShudWxsLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLmdldFRpcEVsZW1lbnQoKSkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDQpKSB7XG4gICAgICAgICAgdGhpcy5fbGVhdmUobnVsbCwgdGhpcyk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lbnRlcihudWxsLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLnJlbW92ZURhdGEodGhpcy5lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZKTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLmVsZW1lbnQpLm9mZih0aGlzLmNvbnN0cnVjdG9yLkVWRU5UX0tFWSk7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5lbGVtZW50KS5jbG9zZXN0KCcubW9kYWwnKS5vZmYoJ2hpZGUuYnMubW9kYWwnLCB0aGlzLl9oaWRlTW9kYWxIYW5kbGVyKTtcblxuICAgICAgaWYgKHRoaXMudGlwKSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLnRpcCkucmVtb3ZlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcbiAgICAgIHRoaXMuX2hvdmVyU3RhdGUgPSBudWxsO1xuICAgICAgdGhpcy5fYWN0aXZlVHJpZ2dlciA9IG51bGw7XG5cbiAgICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbDtcbiAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmNvbmZpZyA9IG51bGw7XG4gICAgICB0aGlzLnRpcCA9IG51bGw7XG4gICAgfTtcblxuICAgIF9wcm90by5zaG93ID0gZnVuY3Rpb24gc2hvdygpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICgkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5lbGVtZW50KS5jc3MoJ2Rpc3BsYXknKSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHVzZSBzaG93IG9uIHZpc2libGUgZWxlbWVudHMnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNob3dFdmVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudCh0aGlzLmNvbnN0cnVjdG9yLkV2ZW50LlNIT1cpO1xuXG4gICAgICBpZiAodGhpcy5pc1dpdGhDb250ZW50KCkgJiYgdGhpcy5faXNFbmFibGVkKSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLmVsZW1lbnQpLnRyaWdnZXIoc2hvd0V2ZW50KTtcbiAgICAgICAgdmFyIHNoYWRvd1Jvb3QgPSBVdGlsLmZpbmRTaGFkb3dSb290KHRoaXMuZWxlbWVudCk7XG4gICAgICAgIHZhciBpc0luVGhlRG9tID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmNvbnRhaW5zKHNoYWRvd1Jvb3QgIT09IG51bGwgPyBzaGFkb3dSb290IDogdGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB0aGlzLmVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgfHwgIWlzSW5UaGVEb20pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdGlwID0gdGhpcy5nZXRUaXBFbGVtZW50KCk7XG4gICAgICAgIHZhciB0aXBJZCA9IFV0aWwuZ2V0VUlEKHRoaXMuY29uc3RydWN0b3IuTkFNRSk7XG4gICAgICAgIHRpcC5zZXRBdHRyaWJ1dGUoJ2lkJywgdGlwSWQpO1xuICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5JywgdGlwSWQpO1xuICAgICAgICB0aGlzLnNldENvbnRlbnQoKTtcblxuICAgICAgICBpZiAodGhpcy5jb25maWcuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRpcCkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9GQURFJDIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBsYWNlbWVudCA9IHR5cGVvZiB0aGlzLmNvbmZpZy5wbGFjZW1lbnQgPT09ICdmdW5jdGlvbicgPyB0aGlzLmNvbmZpZy5wbGFjZW1lbnQuY2FsbCh0aGlzLCB0aXAsIHRoaXMuZWxlbWVudCkgOiB0aGlzLmNvbmZpZy5wbGFjZW1lbnQ7XG5cbiAgICAgICAgdmFyIGF0dGFjaG1lbnQgPSB0aGlzLl9nZXRBdHRhY2htZW50KHBsYWNlbWVudCk7XG5cbiAgICAgICAgdGhpcy5hZGRBdHRhY2htZW50Q2xhc3MoYXR0YWNobWVudCk7XG5cbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX2dldENvbnRhaW5lcigpO1xuXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aXApLmRhdGEodGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSwgdGhpcyk7XG5cbiAgICAgICAgaWYgKCEkX19kZWZhdWx0WydkZWZhdWx0J10uY29udGFpbnModGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB0aGlzLnRpcCkpIHtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGlwKS5hcHBlbmRUbyhjb250YWluZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuZWxlbWVudCkudHJpZ2dlcih0aGlzLmNvbnN0cnVjdG9yLkV2ZW50LklOU0VSVEVEKTtcbiAgICAgICAgdGhpcy5fcG9wcGVyID0gbmV3IFBvcHBlcl9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuZWxlbWVudCwgdGlwLCB0aGlzLl9nZXRQb3BwZXJDb25maWcoYXR0YWNobWVudCkpO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGlwKS5hZGRDbGFzcyhDTEFTU19OQU1FX1NIT1ckNCk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aXApLmFkZENsYXNzKHRoaXMuY29uZmlnLmN1c3RvbUNsYXNzKTsgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgICAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHRvIHRoZSBib2R5J3MgaW1tZWRpYXRlIGNoaWxkcmVuO1xuICAgICAgICAvLyBvbmx5IG5lZWRlZCBiZWNhdXNlIG9mIGJyb2tlbiBldmVudCBkZWxlZ2F0aW9uIG9uIGlPU1xuICAgICAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcblxuICAgICAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50LmJvZHkpLmNoaWxkcmVuKCkub24oJ21vdXNlb3ZlcicsIG51bGwsICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5ub29wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgICAgICAgIGlmIChfdGhpcy5jb25maWcuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICBfdGhpcy5fZml4VHJhbnNpdGlvbigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBwcmV2SG92ZXJTdGF0ZSA9IF90aGlzLl9ob3ZlclN0YXRlO1xuICAgICAgICAgIF90aGlzLl9ob3ZlclN0YXRlID0gbnVsbDtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oX3RoaXMuZWxlbWVudCkudHJpZ2dlcihfdGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5TSE9XTik7XG5cbiAgICAgICAgICBpZiAocHJldkhvdmVyU3RhdGUgPT09IEhPVkVSX1NUQVRFX09VVCkge1xuICAgICAgICAgICAgX3RoaXMuX2xlYXZlKG51bGwsIF90aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLnRpcCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9GQURFJDIpKSB7XG4gICAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy50aXApO1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLnRpcCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNvbXBsZXRlKS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmhpZGUgPSBmdW5jdGlvbiBoaWRlKGNhbGxiYWNrKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIHRpcCA9IHRoaXMuZ2V0VGlwRWxlbWVudCgpO1xuICAgICAgdmFyIGhpZGVFdmVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudCh0aGlzLmNvbnN0cnVjdG9yLkV2ZW50LkhJREUpO1xuXG4gICAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiBjb21wbGV0ZSgpIHtcbiAgICAgICAgaWYgKF90aGlzMi5faG92ZXJTdGF0ZSAhPT0gSE9WRVJfU1RBVEVfU0hPVyAmJiB0aXAucGFyZW50Tm9kZSkge1xuICAgICAgICAgIHRpcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRpcCk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczIuX2NsZWFuVGlwQ2xhc3MoKTtcblxuICAgICAgICBfdGhpczIuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTtcblxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oX3RoaXMyLmVsZW1lbnQpLnRyaWdnZXIoX3RoaXMyLmNvbnN0cnVjdG9yLkV2ZW50LkhJRERFTik7XG5cbiAgICAgICAgaWYgKF90aGlzMi5fcG9wcGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgX3RoaXMyLl9wb3BwZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuZWxlbWVudCkudHJpZ2dlcihoaWRlRXZlbnQpO1xuXG4gICAgICBpZiAoaGlkZUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRpcCkucmVtb3ZlQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDQpOyAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB3ZSBhZGRlZCBmb3IgaU9TIHN1cHBvcnRcblxuICAgICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vZmYoJ21vdXNlb3ZlcicsIG51bGwsICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5ub29wKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUUklHR0VSX0NMSUNLXSA9IGZhbHNlO1xuICAgICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUUklHR0VSX0ZPQ1VTXSA9IGZhbHNlO1xuICAgICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUUklHR0VSX0hPVkVSXSA9IGZhbHNlO1xuXG4gICAgICBpZiAoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMudGlwKS5oYXNDbGFzcyhDTEFTU19OQU1FX0ZBREUkMikpIHtcbiAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGlwKTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRpcCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNvbXBsZXRlKS5lbXVsYXRlVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faG92ZXJTdGF0ZSA9ICcnO1xuICAgIH07XG5cbiAgICBfcHJvdG8udXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgaWYgKHRoaXMuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9wb3BwZXIuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAgIH1cbiAgICB9IC8vIFByb3RlY3RlZFxuICAgIDtcblxuICAgIF9wcm90by5pc1dpdGhDb250ZW50ID0gZnVuY3Rpb24gaXNXaXRoQ29udGVudCgpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuZ2V0VGl0bGUoKSk7XG4gICAgfTtcblxuICAgIF9wcm90by5hZGRBdHRhY2htZW50Q2xhc3MgPSBmdW5jdGlvbiBhZGRBdHRhY2htZW50Q2xhc3MoYXR0YWNobWVudCkge1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuZ2V0VGlwRWxlbWVudCgpKS5hZGRDbGFzcyhDTEFTU19QUkVGSVggKyBcIi1cIiArIGF0dGFjaG1lbnQpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZ2V0VGlwRWxlbWVudCA9IGZ1bmN0aW9uIGdldFRpcEVsZW1lbnQoKSB7XG4gICAgICB0aGlzLnRpcCA9IHRoaXMudGlwIHx8ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLmNvbmZpZy50ZW1wbGF0ZSlbMF07XG4gICAgICByZXR1cm4gdGhpcy50aXA7XG4gICAgfTtcblxuICAgIF9wcm90by5zZXRDb250ZW50ID0gZnVuY3Rpb24gc2V0Q29udGVudCgpIHtcbiAgICAgIHZhciB0aXAgPSB0aGlzLmdldFRpcEVsZW1lbnQoKTtcbiAgICAgIHRoaXMuc2V0RWxlbWVudENvbnRlbnQoJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRpcC5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SX1RPT0xUSVBfSU5ORVIpKSwgdGhpcy5nZXRUaXRsZSgpKTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aXApLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfRkFERSQyICsgXCIgXCIgKyBDTEFTU19OQU1FX1NIT1ckNCk7XG4gICAgfTtcblxuICAgIF9wcm90by5zZXRFbGVtZW50Q29udGVudCA9IGZ1bmN0aW9uIHNldEVsZW1lbnRDb250ZW50KCRlbGVtZW50LCBjb250ZW50KSB7XG4gICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdvYmplY3QnICYmIChjb250ZW50Lm5vZGVUeXBlIHx8IGNvbnRlbnQuanF1ZXJ5KSkge1xuICAgICAgICAvLyBDb250ZW50IGlzIGEgRE9NIG5vZGUgb3IgYSBqUXVlcnlcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmh0bWwpIHtcbiAgICAgICAgICBpZiAoISRfX2RlZmF1bHRbJ2RlZmF1bHQnXShjb250ZW50KS5wYXJlbnQoKS5pcygkZWxlbWVudCkpIHtcbiAgICAgICAgICAgICRlbGVtZW50LmVtcHR5KCkuYXBwZW5kKGNvbnRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkZWxlbWVudC50ZXh0KCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShjb250ZW50KS50ZXh0KCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb25maWcuaHRtbCkge1xuICAgICAgICBpZiAodGhpcy5jb25maWcuc2FuaXRpemUpIHtcbiAgICAgICAgICBjb250ZW50ID0gc2FuaXRpemVIdG1sKGNvbnRlbnQsIHRoaXMuY29uZmlnLndoaXRlTGlzdCwgdGhpcy5jb25maWcuc2FuaXRpemVGbik7XG4gICAgICAgIH1cblxuICAgICAgICAkZWxlbWVudC5odG1sKGNvbnRlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJGVsZW1lbnQudGV4dChjb250ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmdldFRpdGxlID0gZnVuY3Rpb24gZ2V0VGl0bGUoKSB7XG4gICAgICB2YXIgdGl0bGUgPSB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWdpbmFsLXRpdGxlJyk7XG5cbiAgICAgIGlmICghdGl0bGUpIHtcbiAgICAgICAgdGl0bGUgPSB0eXBlb2YgdGhpcy5jb25maWcudGl0bGUgPT09ICdmdW5jdGlvbicgPyB0aGlzLmNvbmZpZy50aXRsZS5jYWxsKHRoaXMuZWxlbWVudCkgOiB0aGlzLmNvbmZpZy50aXRsZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRpdGxlO1xuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fZ2V0UG9wcGVyQ29uZmlnID0gZnVuY3Rpb24gX2dldFBvcHBlckNvbmZpZyhhdHRhY2htZW50KSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIGRlZmF1bHRCc0NvbmZpZyA9IHtcbiAgICAgICAgcGxhY2VtZW50OiBhdHRhY2htZW50LFxuICAgICAgICBtb2RpZmllcnM6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpLFxuICAgICAgICAgIGZsaXA6IHtcbiAgICAgICAgICAgIGJlaGF2aW9yOiB0aGlzLmNvbmZpZy5mYWxsYmFja1BsYWNlbWVudFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXJyb3c6IHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IFNFTEVDVE9SX0FSUk9XXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcmV2ZW50T3ZlcmZsb3c6IHtcbiAgICAgICAgICAgIGJvdW5kYXJpZXNFbGVtZW50OiB0aGlzLmNvbmZpZy5ib3VuZGFyeVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25DcmVhdGU6IGZ1bmN0aW9uIG9uQ3JlYXRlKGRhdGEpIHtcbiAgICAgICAgICBpZiAoZGF0YS5vcmlnaW5hbFBsYWNlbWVudCAhPT0gZGF0YS5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIF90aGlzMy5faGFuZGxlUG9wcGVyUGxhY2VtZW50Q2hhbmdlKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25VcGRhdGU6IGZ1bmN0aW9uIG9uVXBkYXRlKGRhdGEpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMzLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIGRlZmF1bHRCc0NvbmZpZywgdGhpcy5jb25maWcucG9wcGVyQ29uZmlnKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRPZmZzZXQgPSBmdW5jdGlvbiBfZ2V0T2Zmc2V0KCkge1xuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgIHZhciBvZmZzZXQgPSB7fTtcblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5vZmZzZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb2Zmc2V0LmZuID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICBkYXRhLm9mZnNldHMgPSBfZXh0ZW5kcyh7fSwgZGF0YS5vZmZzZXRzLCBfdGhpczQuY29uZmlnLm9mZnNldChkYXRhLm9mZnNldHMsIF90aGlzNC5lbGVtZW50KSB8fCB7fSk7XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvZmZzZXQub2Zmc2V0ID0gdGhpcy5jb25maWcub2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldENvbnRhaW5lciA9IGZ1bmN0aW9uIF9nZXRDb250YWluZXIoKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcuY29udGFpbmVyID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQuYm9keTtcbiAgICAgIH1cblxuICAgICAgaWYgKFV0aWwuaXNFbGVtZW50KHRoaXMuY29uZmlnLmNvbnRhaW5lcikpIHtcbiAgICAgICAgcmV0dXJuICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLmNvbmZpZy5jb250YWluZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJF9fZGVmYXVsdFsnZGVmYXVsdCddKGRvY3VtZW50KS5maW5kKHRoaXMuY29uZmlnLmNvbnRhaW5lcik7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0QXR0YWNobWVudCA9IGZ1bmN0aW9uIF9nZXRBdHRhY2htZW50KHBsYWNlbWVudCkge1xuICAgICAgcmV0dXJuIEF0dGFjaG1lbnRNYXBbcGxhY2VtZW50LnRvVXBwZXJDYXNlKCldO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX3NldExpc3RlbmVycyA9IGZ1bmN0aW9uIF9zZXRMaXN0ZW5lcnMoKSB7XG4gICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgdmFyIHRyaWdnZXJzID0gdGhpcy5jb25maWcudHJpZ2dlci5zcGxpdCgnICcpO1xuICAgICAgdHJpZ2dlcnMuZm9yRWFjaChmdW5jdGlvbiAodHJpZ2dlcikge1xuICAgICAgICBpZiAodHJpZ2dlciA9PT0gJ2NsaWNrJykge1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShfdGhpczUuZWxlbWVudCkub24oX3RoaXM1LmNvbnN0cnVjdG9yLkV2ZW50LkNMSUNLLCBfdGhpczUuY29uZmlnLnNlbGVjdG9yLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczUudG9nZ2xlKGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyICE9PSBUUklHR0VSX01BTlVBTCkge1xuICAgICAgICAgIHZhciBldmVudEluID0gdHJpZ2dlciA9PT0gVFJJR0dFUl9IT1ZFUiA/IF90aGlzNS5jb25zdHJ1Y3Rvci5FdmVudC5NT1VTRUVOVEVSIDogX3RoaXM1LmNvbnN0cnVjdG9yLkV2ZW50LkZPQ1VTSU47XG4gICAgICAgICAgdmFyIGV2ZW50T3V0ID0gdHJpZ2dlciA9PT0gVFJJR0dFUl9IT1ZFUiA/IF90aGlzNS5jb25zdHJ1Y3Rvci5FdmVudC5NT1VTRUxFQVZFIDogX3RoaXM1LmNvbnN0cnVjdG9yLkV2ZW50LkZPQ1VTT1VUO1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShfdGhpczUuZWxlbWVudCkub24oZXZlbnRJbiwgX3RoaXM1LmNvbmZpZy5zZWxlY3RvciwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXM1Ll9lbnRlcihldmVudCk7XG4gICAgICAgICAgfSkub24oZXZlbnRPdXQsIF90aGlzNS5jb25maWcuc2VsZWN0b3IsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzNS5fbGVhdmUoZXZlbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5faGlkZU1vZGFsSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKF90aGlzNS5lbGVtZW50KSB7XG4gICAgICAgICAgX3RoaXM1LmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuZWxlbWVudCkuY2xvc2VzdCgnLm1vZGFsJykub24oJ2hpZGUuYnMubW9kYWwnLCB0aGlzLl9oaWRlTW9kYWxIYW5kbGVyKTtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnLnNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gX2V4dGVuZHMoe30sIHRoaXMuY29uZmlnLCB7XG4gICAgICAgICAgdHJpZ2dlcjogJ21hbnVhbCcsXG4gICAgICAgICAgc2VsZWN0b3I6ICcnXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZml4VGl0bGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9maXhUaXRsZSA9IGZ1bmN0aW9uIF9maXhUaXRsZSgpIHtcbiAgICAgIHZhciB0aXRsZVR5cGUgPSB0eXBlb2YgdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnaW5hbC10aXRsZScpO1xuXG4gICAgICBpZiAodGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgndGl0bGUnKSB8fCB0aXRsZVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnLCB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpIHx8ICcnKTtcbiAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fZW50ZXIgPSBmdW5jdGlvbiBfZW50ZXIoZXZlbnQsIGNvbnRleHQpIHtcbiAgICAgIHZhciBkYXRhS2V5ID0gdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTtcbiAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXkpO1xuXG4gICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgY29udGV4dCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGV2ZW50LmN1cnJlbnRUYXJnZXQsIHRoaXMuX2dldERlbGVnYXRlQ29uZmlnKCkpO1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShkYXRhS2V5LCBjb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXJbZXZlbnQudHlwZSA9PT0gJ2ZvY3VzaW4nID8gVFJJR0dFUl9GT0NVUyA6IFRSSUdHRVJfSE9WRVJdID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXShjb250ZXh0LmdldFRpcEVsZW1lbnQoKSkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9TSE9XJDQpIHx8IGNvbnRleHQuX2hvdmVyU3RhdGUgPT09IEhPVkVSX1NUQVRFX1NIT1cpIHtcbiAgICAgICAgY29udGV4dC5faG92ZXJTdGF0ZSA9IEhPVkVSX1NUQVRFX1NIT1c7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2xlYXJUaW1lb3V0KGNvbnRleHQuX3RpbWVvdXQpO1xuICAgICAgY29udGV4dC5faG92ZXJTdGF0ZSA9IEhPVkVSX1NUQVRFX1NIT1c7XG5cbiAgICAgIGlmICghY29udGV4dC5jb25maWcuZGVsYXkgfHwgIWNvbnRleHQuY29uZmlnLmRlbGF5LnNob3cpIHtcbiAgICAgICAgY29udGV4dC5zaG93KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY29udGV4dC5faG92ZXJTdGF0ZSA9PT0gSE9WRVJfU1RBVEVfU0hPVykge1xuICAgICAgICAgIGNvbnRleHQuc2hvdygpO1xuICAgICAgICB9XG4gICAgICB9LCBjb250ZXh0LmNvbmZpZy5kZWxheS5zaG93KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9sZWF2ZSA9IGZ1bmN0aW9uIF9sZWF2ZShldmVudCwgY29udGV4dCkge1xuICAgICAgdmFyIGRhdGFLZXkgPSB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZO1xuICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmRhdGEoZGF0YUtleSk7XG5cbiAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICBjb250ZXh0ID0gbmV3IHRoaXMuY29uc3RydWN0b3IoZXZlbnQuY3VycmVudFRhcmdldCwgdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXksIGNvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlcltldmVudC50eXBlID09PSAnZm9jdXNvdXQnID8gVFJJR0dFUl9GT0NVUyA6IFRSSUdHRVJfSE9WRVJdID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb250ZXh0Ll9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjbGVhclRpbWVvdXQoY29udGV4dC5fdGltZW91dCk7XG4gICAgICBjb250ZXh0Ll9ob3ZlclN0YXRlID0gSE9WRVJfU1RBVEVfT1VUO1xuXG4gICAgICBpZiAoIWNvbnRleHQuY29uZmlnLmRlbGF5IHx8ICFjb250ZXh0LmNvbmZpZy5kZWxheS5oaWRlKSB7XG4gICAgICAgIGNvbnRleHQuaGlkZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGNvbnRleHQuX2hvdmVyU3RhdGUgPT09IEhPVkVSX1NUQVRFX09VVCkge1xuICAgICAgICAgIGNvbnRleHQuaGlkZSgpO1xuICAgICAgICB9XG4gICAgICB9LCBjb250ZXh0LmNvbmZpZy5kZWxheS5oaWRlKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9pc1dpdGhBY3RpdmVUcmlnZ2VyID0gZnVuY3Rpb24gX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKSB7XG4gICAgICBmb3IgKHZhciB0cmlnZ2VyIGluIHRoaXMuX2FjdGl2ZVRyaWdnZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZVRyaWdnZXJbdHJpZ2dlcl0pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0Q29uZmlnID0gZnVuY3Rpb24gX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgIHZhciBkYXRhQXR0cmlidXRlcyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLmVsZW1lbnQpLmRhdGEoKTtcbiAgICAgIE9iamVjdC5rZXlzKGRhdGFBdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhQXR0cikge1xuICAgICAgICBpZiAoRElTQUxMT1dFRF9BVFRSSUJVVEVTLmluZGV4T2YoZGF0YUF0dHIpICE9PSAtMSkge1xuICAgICAgICAgIGRlbGV0ZSBkYXRhQXR0cmlidXRlc1tkYXRhQXR0cl07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uZmlnID0gX2V4dGVuZHMoe30sIHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdCwgZGF0YUF0dHJpYnV0ZXMsIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZyA/IGNvbmZpZyA6IHt9KTtcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcuZGVsYXkgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbmZpZy5kZWxheSA9IHtcbiAgICAgICAgICBzaG93OiBjb25maWcuZGVsYXksXG4gICAgICAgICAgaGlkZTogY29uZmlnLmRlbGF5XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnLnRpdGxlID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25maWcudGl0bGUgPSBjb25maWcudGl0bGUudG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcuY29udGVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uZmlnLmNvbnRlbnQgPSBjb25maWcuY29udGVudC50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBVdGlsLnR5cGVDaGVja0NvbmZpZyhOQU1FJDYsIGNvbmZpZywgdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0VHlwZSk7XG5cbiAgICAgIGlmIChjb25maWcuc2FuaXRpemUpIHtcbiAgICAgICAgY29uZmlnLnRlbXBsYXRlID0gc2FuaXRpemVIdG1sKGNvbmZpZy50ZW1wbGF0ZSwgY29uZmlnLndoaXRlTGlzdCwgY29uZmlnLnNhbml0aXplRm4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldERlbGVnYXRlQ29uZmlnID0gZnVuY3Rpb24gX2dldERlbGVnYXRlQ29uZmlnKCkge1xuICAgICAgdmFyIGNvbmZpZyA9IHt9O1xuXG4gICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuY29uZmlnKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtrZXldICE9PSB0aGlzLmNvbmZpZ1trZXldKSB7XG4gICAgICAgICAgICBjb25maWdba2V5XSA9IHRoaXMuY29uZmlnW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5fY2xlYW5UaXBDbGFzcyA9IGZ1bmN0aW9uIF9jbGVhblRpcENsYXNzKCkge1xuICAgICAgdmFyICR0aXAgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5nZXRUaXBFbGVtZW50KCkpO1xuICAgICAgdmFyIHRhYkNsYXNzID0gJHRpcC5hdHRyKCdjbGFzcycpLm1hdGNoKEJTQ0xTX1BSRUZJWF9SRUdFWCk7XG5cbiAgICAgIGlmICh0YWJDbGFzcyAhPT0gbnVsbCAmJiB0YWJDbGFzcy5sZW5ndGgpIHtcbiAgICAgICAgJHRpcC5yZW1vdmVDbGFzcyh0YWJDbGFzcy5qb2luKCcnKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5faGFuZGxlUG9wcGVyUGxhY2VtZW50Q2hhbmdlID0gZnVuY3Rpb24gX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZShwb3BwZXJEYXRhKSB7XG4gICAgICB0aGlzLnRpcCA9IHBvcHBlckRhdGEuaW5zdGFuY2UucG9wcGVyO1xuXG4gICAgICB0aGlzLl9jbGVhblRpcENsYXNzKCk7XG5cbiAgICAgIHRoaXMuYWRkQXR0YWNobWVudENsYXNzKHRoaXMuX2dldEF0dGFjaG1lbnQocG9wcGVyRGF0YS5wbGFjZW1lbnQpKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9maXhUcmFuc2l0aW9uID0gZnVuY3Rpb24gX2ZpeFRyYW5zaXRpb24oKSB7XG4gICAgICB2YXIgdGlwID0gdGhpcy5nZXRUaXBFbGVtZW50KCk7XG4gICAgICB2YXIgaW5pdENvbmZpZ0FuaW1hdGlvbiA9IHRoaXMuY29uZmlnLmFuaW1hdGlvbjtcblxuICAgICAgaWYgKHRpcC5nZXRBdHRyaWJ1dGUoJ3gtcGxhY2VtZW50JykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGlwKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0ZBREUkMik7XG4gICAgICB0aGlzLmNvbmZpZy5hbmltYXRpb24gPSBmYWxzZTtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB0aGlzLmNvbmZpZy5hbmltYXRpb24gPSBpbml0Q29uZmlnQW5pbWF0aW9uO1xuICAgIH0gLy8gU3RhdGljXG4gICAgO1xuXG4gICAgVG9vbHRpcC5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJGVsZW1lbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcyk7XG4gICAgICAgIHZhciBkYXRhID0gJGVsZW1lbnQuZGF0YShEQVRBX0tFWSQ2KTtcblxuICAgICAgICB2YXIgX2NvbmZpZyA9IHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZztcblxuICAgICAgICBpZiAoIWRhdGEgJiYgL2Rpc3Bvc2V8aGlkZS8udGVzdChjb25maWcpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBUb29sdGlwKHRoaXMsIF9jb25maWcpO1xuICAgICAgICAgICRlbGVtZW50LmRhdGEoREFUQV9LRVkkNiwgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJObyBtZXRob2QgbmFtZWQgXFxcIlwiICsgY29uZmlnICsgXCJcXFwiXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKFRvb2x0aXAsIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OJDY7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdCQ0O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJOQU1FXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIE5BTUUkNjtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiREFUQV9LRVlcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gREFUQV9LRVkkNjtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRXZlbnRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRXZlbnQ7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkVWRU5UX0tFWVwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBFVkVOVF9LRVkkNjtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFR5cGVcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdFR5cGUkNDtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gVG9vbHRpcDtcbiAgfSgpO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIGpRdWVyeVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ2XSA9IFRvb2x0aXAuX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNl0uQ29uc3RydWN0b3IgPSBUb29sdGlwO1xuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDZdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkNl0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkNjtcbiAgICByZXR1cm4gVG9vbHRpcC5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ29uc3RhbnRzXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgTkFNRSQ3ID0gJ3BvcG92ZXInO1xuICB2YXIgVkVSU0lPTiQ3ID0gJzQuNi4wJztcbiAgdmFyIERBVEFfS0VZJDcgPSAnYnMucG9wb3Zlcic7XG4gIHZhciBFVkVOVF9LRVkkNyA9IFwiLlwiICsgREFUQV9LRVkkNztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCQ3ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkN107XG4gIHZhciBDTEFTU19QUkVGSVgkMSA9ICdicy1wb3BvdmVyJztcbiAgdmFyIEJTQ0xTX1BSRUZJWF9SRUdFWCQxID0gbmV3IFJlZ0V4cChcIihefFxcXFxzKVwiICsgQ0xBU1NfUFJFRklYJDEgKyBcIlxcXFxTK1wiLCAnZycpO1xuXG4gIHZhciBEZWZhdWx0JDUgPSBfZXh0ZW5kcyh7fSwgVG9vbHRpcC5EZWZhdWx0LCB7XG4gICAgcGxhY2VtZW50OiAncmlnaHQnLFxuICAgIHRyaWdnZXI6ICdjbGljaycsXG4gICAgY29udGVudDogJycsXG4gICAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwicG9wb3ZlclwiIHJvbGU9XCJ0b29sdGlwXCI+JyArICc8ZGl2IGNsYXNzPVwiYXJyb3dcIj48L2Rpdj4nICsgJzxoMyBjbGFzcz1cInBvcG92ZXItaGVhZGVyXCI+PC9oMz4nICsgJzxkaXYgY2xhc3M9XCJwb3BvdmVyLWJvZHlcIj48L2Rpdj48L2Rpdj4nXG4gIH0pO1xuXG4gIHZhciBEZWZhdWx0VHlwZSQ1ID0gX2V4dGVuZHMoe30sIFRvb2x0aXAuRGVmYXVsdFR5cGUsIHtcbiAgICBjb250ZW50OiAnKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKSdcbiAgfSk7XG5cbiAgdmFyIENMQVNTX05BTUVfRkFERSQzID0gJ2ZhZGUnO1xuICB2YXIgQ0xBU1NfTkFNRV9TSE9XJDUgPSAnc2hvdyc7XG4gIHZhciBTRUxFQ1RPUl9USVRMRSA9ICcucG9wb3Zlci1oZWFkZXInO1xuICB2YXIgU0VMRUNUT1JfQ09OVEVOVCA9ICcucG9wb3Zlci1ib2R5JztcbiAgdmFyIEV2ZW50JDEgPSB7XG4gICAgSElERTogXCJoaWRlXCIgKyBFVkVOVF9LRVkkNyxcbiAgICBISURERU46IFwiaGlkZGVuXCIgKyBFVkVOVF9LRVkkNyxcbiAgICBTSE9XOiBcInNob3dcIiArIEVWRU5UX0tFWSQ3LFxuICAgIFNIT1dOOiBcInNob3duXCIgKyBFVkVOVF9LRVkkNyxcbiAgICBJTlNFUlRFRDogXCJpbnNlcnRlZFwiICsgRVZFTlRfS0VZJDcsXG4gICAgQ0xJQ0s6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSQ3LFxuICAgIEZPQ1VTSU46IFwiZm9jdXNpblwiICsgRVZFTlRfS0VZJDcsXG4gICAgRk9DVVNPVVQ6IFwiZm9jdXNvdXRcIiArIEVWRU5UX0tFWSQ3LFxuICAgIE1PVVNFRU5URVI6IFwibW91c2VlbnRlclwiICsgRVZFTlRfS0VZJDcsXG4gICAgTU9VU0VMRUFWRTogXCJtb3VzZWxlYXZlXCIgKyBFVkVOVF9LRVkkN1xuICB9O1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBQb3BvdmVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfVG9vbHRpcCkge1xuICAgIF9pbmhlcml0c0xvb3NlKFBvcG92ZXIsIF9Ub29sdGlwKTtcblxuICAgIGZ1bmN0aW9uIFBvcG92ZXIoKSB7XG4gICAgICByZXR1cm4gX1Rvb2x0aXAuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cblxuICAgIHZhciBfcHJvdG8gPSBQb3BvdmVyLnByb3RvdHlwZTtcblxuICAgIC8vIE92ZXJyaWRlc1xuICAgIF9wcm90by5pc1dpdGhDb250ZW50ID0gZnVuY3Rpb24gaXNXaXRoQ29udGVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFRpdGxlKCkgfHwgdGhpcy5fZ2V0Q29udGVudCgpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uYWRkQXR0YWNobWVudENsYXNzID0gZnVuY3Rpb24gYWRkQXR0YWNobWVudENsYXNzKGF0dGFjaG1lbnQpIHtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLmdldFRpcEVsZW1lbnQoKSkuYWRkQ2xhc3MoQ0xBU1NfUFJFRklYJDEgKyBcIi1cIiArIGF0dGFjaG1lbnQpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZ2V0VGlwRWxlbWVudCA9IGZ1bmN0aW9uIGdldFRpcEVsZW1lbnQoKSB7XG4gICAgICB0aGlzLnRpcCA9IHRoaXMudGlwIHx8ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLmNvbmZpZy50ZW1wbGF0ZSlbMF07XG4gICAgICByZXR1cm4gdGhpcy50aXA7XG4gICAgfTtcblxuICAgIF9wcm90by5zZXRDb250ZW50ID0gZnVuY3Rpb24gc2V0Q29udGVudCgpIHtcbiAgICAgIHZhciAkdGlwID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuZ2V0VGlwRWxlbWVudCgpKTsgLy8gV2UgdXNlIGFwcGVuZCBmb3IgaHRtbCBvYmplY3RzIHRvIG1haW50YWluIGpzIGV2ZW50c1xuXG4gICAgICB0aGlzLnNldEVsZW1lbnRDb250ZW50KCR0aXAuZmluZChTRUxFQ1RPUl9USVRMRSksIHRoaXMuZ2V0VGl0bGUoKSk7XG5cbiAgICAgIHZhciBjb250ZW50ID0gdGhpcy5fZ2V0Q29udGVudCgpO1xuXG4gICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuY2FsbCh0aGlzLmVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldEVsZW1lbnRDb250ZW50KCR0aXAuZmluZChTRUxFQ1RPUl9DT05URU5UKSwgY29udGVudCk7XG4gICAgICAkdGlwLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfRkFERSQzICsgXCIgXCIgKyBDTEFTU19OQU1FX1NIT1ckNSk7XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9nZXRDb250ZW50ID0gZnVuY3Rpb24gX2dldENvbnRlbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1jb250ZW50JykgfHwgdGhpcy5jb25maWcuY29udGVudDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9jbGVhblRpcENsYXNzID0gZnVuY3Rpb24gX2NsZWFuVGlwQ2xhc3MoKSB7XG4gICAgICB2YXIgJHRpcCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLmdldFRpcEVsZW1lbnQoKSk7XG4gICAgICB2YXIgdGFiQ2xhc3MgPSAkdGlwLmF0dHIoJ2NsYXNzJykubWF0Y2goQlNDTFNfUFJFRklYX1JFR0VYJDEpO1xuXG4gICAgICBpZiAodGFiQ2xhc3MgIT09IG51bGwgJiYgdGFiQ2xhc3MubGVuZ3RoID4gMCkge1xuICAgICAgICAkdGlwLnJlbW92ZUNsYXNzKHRhYkNsYXNzLmpvaW4oJycpKTtcbiAgICAgIH1cbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIFBvcG92ZXIuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQ3KTtcblxuICAgICAgICB2YXIgX2NvbmZpZyA9IHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDogbnVsbDtcblxuICAgICAgICBpZiAoIWRhdGEgJiYgL2Rpc3Bvc2V8aGlkZS8udGVzdChjb25maWcpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBQb3BvdmVyKHRoaXMsIF9jb25maWcpO1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKS5kYXRhKERBVEFfS0VZJDcsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTm8gbWV0aG9kIG5hbWVkIFxcXCJcIiArIGNvbmZpZyArIFwiXFxcIlwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9jcmVhdGVDbGFzcyhQb3BvdmVyLCBudWxsLCBbe1xuICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgIC8vIEdldHRlcnNcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVkVSU0lPTiQ3O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0XCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHQkNTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiTkFNRVwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBOQU1FJDc7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRBVEFfS0VZXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERBVEFfS0VZJDc7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkV2ZW50XCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50JDE7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkVWRU5UX0tFWVwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBFVkVOVF9LRVkkNztcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFR5cGVcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdFR5cGUkNTtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gUG9wb3ZlcjtcbiAgfShUb29sdGlwKTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBqUXVlcnlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkN10gPSBQb3BvdmVyLl9qUXVlcnlJbnRlcmZhY2U7XG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDddLkNvbnN0cnVjdG9yID0gUG9wb3ZlcjtcblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ3XS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDddID0gSlFVRVJZX05PX0NPTkZMSUNUJDc7XG4gICAgcmV0dXJuIFBvcG92ZXIuX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENvbnN0YW50c1xuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE5BTUUkOCA9ICdzY3JvbGxzcHknO1xuICB2YXIgVkVSU0lPTiQ4ID0gJzQuNi4wJztcbiAgdmFyIERBVEFfS0VZJDggPSAnYnMuc2Nyb2xsc3B5JztcbiAgdmFyIEVWRU5UX0tFWSQ4ID0gXCIuXCIgKyBEQVRBX0tFWSQ4O1xuICB2YXIgREFUQV9BUElfS0VZJDYgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCQ4ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkOF07XG4gIHZhciBEZWZhdWx0JDYgPSB7XG4gICAgb2Zmc2V0OiAxMCxcbiAgICBtZXRob2Q6ICdhdXRvJyxcbiAgICB0YXJnZXQ6ICcnXG4gIH07XG4gIHZhciBEZWZhdWx0VHlwZSQ2ID0ge1xuICAgIG9mZnNldDogJ251bWJlcicsXG4gICAgbWV0aG9kOiAnc3RyaW5nJyxcbiAgICB0YXJnZXQ6ICcoc3RyaW5nfGVsZW1lbnQpJ1xuICB9O1xuICB2YXIgRVZFTlRfQUNUSVZBVEUgPSBcImFjdGl2YXRlXCIgKyBFVkVOVF9LRVkkODtcbiAgdmFyIEVWRU5UX1NDUk9MTCA9IFwic2Nyb2xsXCIgKyBFVkVOVF9LRVkkODtcbiAgdmFyIEVWRU5UX0xPQURfREFUQV9BUEkkMiA9IFwibG9hZFwiICsgRVZFTlRfS0VZJDggKyBEQVRBX0FQSV9LRVkkNjtcbiAgdmFyIENMQVNTX05BTUVfRFJPUERPV05fSVRFTSA9ICdkcm9wZG93bi1pdGVtJztcbiAgdmFyIENMQVNTX05BTUVfQUNUSVZFJDIgPSAnYWN0aXZlJztcbiAgdmFyIFNFTEVDVE9SX0RBVEFfU1BZID0gJ1tkYXRhLXNweT1cInNjcm9sbFwiXSc7XG4gIHZhciBTRUxFQ1RPUl9OQVZfTElTVF9HUk9VUCA9ICcubmF2LCAubGlzdC1ncm91cCc7XG4gIHZhciBTRUxFQ1RPUl9OQVZfTElOS1MgPSAnLm5hdi1saW5rJztcbiAgdmFyIFNFTEVDVE9SX05BVl9JVEVNUyA9ICcubmF2LWl0ZW0nO1xuICB2YXIgU0VMRUNUT1JfTElTVF9JVEVNUyA9ICcubGlzdC1ncm91cC1pdGVtJztcbiAgdmFyIFNFTEVDVE9SX0RST1BET1dOID0gJy5kcm9wZG93bic7XG4gIHZhciBTRUxFQ1RPUl9EUk9QRE9XTl9JVEVNUyA9ICcuZHJvcGRvd24taXRlbSc7XG4gIHZhciBTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUgPSAnLmRyb3Bkb3duLXRvZ2dsZSc7XG4gIHZhciBNRVRIT0RfT0ZGU0VUID0gJ29mZnNldCc7XG4gIHZhciBNRVRIT0RfUE9TSVRJT04gPSAncG9zaXRpb24nO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENsYXNzIERlZmluaXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIHZhciBTY3JvbGxTcHkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNjcm9sbFNweShlbGVtZW50LCBjb25maWcpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgdGhpcy5fc2Nyb2xsRWxlbWVudCA9IGVsZW1lbnQudGFnTmFtZSA9PT0gJ0JPRFknID8gd2luZG93IDogZWxlbWVudDtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgdGhpcy5fc2VsZWN0b3IgPSB0aGlzLl9jb25maWcudGFyZ2V0ICsgXCIgXCIgKyBTRUxFQ1RPUl9OQVZfTElOS1MgKyBcIixcIiArICh0aGlzLl9jb25maWcudGFyZ2V0ICsgXCIgXCIgKyBTRUxFQ1RPUl9MSVNUX0lURU1TICsgXCIsXCIpICsgKHRoaXMuX2NvbmZpZy50YXJnZXQgKyBcIiBcIiArIFNFTEVDVE9SX0RST1BET1dOX0lURU1TKTtcbiAgICAgIHRoaXMuX29mZnNldHMgPSBbXTtcbiAgICAgIHRoaXMuX3RhcmdldHMgPSBbXTtcbiAgICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IG51bGw7XG4gICAgICB0aGlzLl9zY3JvbGxIZWlnaHQgPSAwO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX3Njcm9sbEVsZW1lbnQpLm9uKEVWRU5UX1NDUk9MTCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5fcHJvY2VzcyhldmVudCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuXG4gICAgICB0aGlzLl9wcm9jZXNzKCk7XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgIHZhciBfcHJvdG8gPSBTY3JvbGxTcHkucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLnJlZnJlc2ggPSBmdW5jdGlvbiByZWZyZXNoKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBhdXRvTWV0aG9kID0gdGhpcy5fc2Nyb2xsRWxlbWVudCA9PT0gdGhpcy5fc2Nyb2xsRWxlbWVudC53aW5kb3cgPyBNRVRIT0RfT0ZGU0VUIDogTUVUSE9EX1BPU0lUSU9OO1xuICAgICAgdmFyIG9mZnNldE1ldGhvZCA9IHRoaXMuX2NvbmZpZy5tZXRob2QgPT09ICdhdXRvJyA/IGF1dG9NZXRob2QgOiB0aGlzLl9jb25maWcubWV0aG9kO1xuICAgICAgdmFyIG9mZnNldEJhc2UgPSBvZmZzZXRNZXRob2QgPT09IE1FVEhPRF9QT1NJVElPTiA/IHRoaXMuX2dldFNjcm9sbFRvcCgpIDogMDtcbiAgICAgIHRoaXMuX29mZnNldHMgPSBbXTtcbiAgICAgIHRoaXMuX3RhcmdldHMgPSBbXTtcbiAgICAgIHRoaXMuX3Njcm9sbEhlaWdodCA9IHRoaXMuX2dldFNjcm9sbEhlaWdodCgpO1xuICAgICAgdmFyIHRhcmdldHMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5fc2VsZWN0b3IpKTtcbiAgICAgIHRhcmdldHMubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHZhciB0YXJnZXQ7XG4gICAgICAgIHZhciB0YXJnZXRTZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICBpZiAodGFyZ2V0U2VsZWN0b3IpIHtcbiAgICAgICAgICB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldFNlbGVjdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICB2YXIgdGFyZ2V0QkNSID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgaWYgKHRhcmdldEJDUi53aWR0aCB8fCB0YXJnZXRCQ1IuaGVpZ2h0KSB7XG4gICAgICAgICAgICAvLyBUT0RPIChmYXQpOiByZW1vdmUgc2tldGNoIHJlbGlhbmNlIG9uIGpRdWVyeSBwb3NpdGlvbi9vZmZzZXRcbiAgICAgICAgICAgIHJldHVybiBbJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRhcmdldClbb2Zmc2V0TWV0aG9kXSgpLnRvcCArIG9mZnNldEJhc2UsIHRhcmdldFNlbGVjdG9yXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGFbMF0gLSBiWzBdO1xuICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBfdGhpczIuX29mZnNldHMucHVzaChpdGVtWzBdKTtcblxuICAgICAgICBfdGhpczIuX3RhcmdldHMucHVzaChpdGVtWzFdKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10ucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSQ4KTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9zY3JvbGxFbGVtZW50KS5vZmYoRVZFTlRfS0VZJDgpO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9zY3JvbGxFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IG51bGw7XG4gICAgICB0aGlzLl9zZWxlY3RvciA9IG51bGw7XG4gICAgICB0aGlzLl9vZmZzZXRzID0gbnVsbDtcbiAgICAgIHRoaXMuX3RhcmdldHMgPSBudWxsO1xuICAgICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbDtcbiAgICAgIHRoaXMuX3Njcm9sbEhlaWdodCA9IG51bGw7XG4gICAgfSAvLyBQcml2YXRlXG4gICAgO1xuXG4gICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgY29uZmlnID0gX2V4dGVuZHMoe30sIERlZmF1bHQkNiwgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnID8gY29uZmlnIDoge30pO1xuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy50YXJnZXQgIT09ICdzdHJpbmcnICYmIFV0aWwuaXNFbGVtZW50KGNvbmZpZy50YXJnZXQpKSB7XG4gICAgICAgIHZhciBpZCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShjb25maWcudGFyZ2V0KS5hdHRyKCdpZCcpO1xuXG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICBpZCA9IFV0aWwuZ2V0VUlEKE5BTUUkOCk7XG4gICAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKGNvbmZpZy50YXJnZXQpLmF0dHIoJ2lkJywgaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnLnRhcmdldCA9IFwiI1wiICsgaWQ7XG4gICAgICB9XG5cbiAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUkOCwgY29uZmlnLCBEZWZhdWx0VHlwZSQ2KTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24gX2dldFNjcm9sbFRvcCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxFbGVtZW50ID09PSB3aW5kb3cgPyB0aGlzLl9zY3JvbGxFbGVtZW50LnBhZ2VZT2Zmc2V0IDogdGhpcy5fc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0U2Nyb2xsSGVpZ2h0ID0gZnVuY3Rpb24gX2dldFNjcm9sbEhlaWdodCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxFbGVtZW50LnNjcm9sbEhlaWdodCB8fCBNYXRoLm1heChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCk7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0T2Zmc2V0SGVpZ2h0ID0gZnVuY3Rpb24gX2dldE9mZnNldEhlaWdodCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxFbGVtZW50ID09PSB3aW5kb3cgPyB3aW5kb3cuaW5uZXJIZWlnaHQgOiB0aGlzLl9zY3JvbGxFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9wcm9jZXNzID0gZnVuY3Rpb24gX3Byb2Nlc3MoKSB7XG4gICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy5fZ2V0U2Nyb2xsVG9wKCkgKyB0aGlzLl9jb25maWcub2Zmc2V0O1xuXG4gICAgICB2YXIgc2Nyb2xsSGVpZ2h0ID0gdGhpcy5fZ2V0U2Nyb2xsSGVpZ2h0KCk7XG5cbiAgICAgIHZhciBtYXhTY3JvbGwgPSB0aGlzLl9jb25maWcub2Zmc2V0ICsgc2Nyb2xsSGVpZ2h0IC0gdGhpcy5fZ2V0T2Zmc2V0SGVpZ2h0KCk7XG5cbiAgICAgIGlmICh0aGlzLl9zY3JvbGxIZWlnaHQgIT09IHNjcm9sbEhlaWdodCkge1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjcm9sbFRvcCA+PSBtYXhTY3JvbGwpIHtcbiAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMuX3RhcmdldHNbdGhpcy5fdGFyZ2V0cy5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAodGhpcy5fYWN0aXZlVGFyZ2V0ICE9PSB0YXJnZXQpIHtcbiAgICAgICAgICB0aGlzLl9hY3RpdmF0ZSh0YXJnZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fYWN0aXZlVGFyZ2V0ICYmIHNjcm9sbFRvcCA8IHRoaXMuX29mZnNldHNbMF0gJiYgdGhpcy5fb2Zmc2V0c1swXSA+IDApIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9jbGVhcigpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMuX29mZnNldHMubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgIHZhciBpc0FjdGl2ZVRhcmdldCA9IHRoaXMuX2FjdGl2ZVRhcmdldCAhPT0gdGhpcy5fdGFyZ2V0c1tpXSAmJiBzY3JvbGxUb3AgPj0gdGhpcy5fb2Zmc2V0c1tpXSAmJiAodHlwZW9mIHRoaXMuX29mZnNldHNbaSArIDFdID09PSAndW5kZWZpbmVkJyB8fCBzY3JvbGxUb3AgPCB0aGlzLl9vZmZzZXRzW2kgKyAxXSk7XG5cbiAgICAgICAgaWYgKGlzQWN0aXZlVGFyZ2V0KSB7XG4gICAgICAgICAgdGhpcy5fYWN0aXZhdGUodGhpcy5fdGFyZ2V0c1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9hY3RpdmF0ZSA9IGZ1bmN0aW9uIF9hY3RpdmF0ZSh0YXJnZXQpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IHRhcmdldDtcblxuICAgICAgdGhpcy5fY2xlYXIoKTtcblxuICAgICAgdmFyIHF1ZXJpZXMgPSB0aGlzLl9zZWxlY3Rvci5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yICsgXCJbZGF0YS10YXJnZXQ9XFxcIlwiICsgdGFyZ2V0ICsgXCJcXFwiXSxcIiArIHNlbGVjdG9yICsgXCJbaHJlZj1cXFwiXCIgKyB0YXJnZXQgKyBcIlxcXCJdXCI7XG4gICAgICB9KTtcblxuICAgICAgdmFyICRsaW5rID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxdWVyaWVzLmpvaW4oJywnKSkpKTtcblxuICAgICAgaWYgKCRsaW5rLmhhc0NsYXNzKENMQVNTX05BTUVfRFJPUERPV05fSVRFTSkpIHtcbiAgICAgICAgJGxpbmsuY2xvc2VzdChTRUxFQ1RPUl9EUk9QRE9XTikuZmluZChTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUpLmFkZENsYXNzKENMQVNTX05BTUVfQUNUSVZFJDIpO1xuICAgICAgICAkbGluay5hZGRDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNldCB0cmlnZ2VyZWQgbGluayBhcyBhY3RpdmVcbiAgICAgICAgJGxpbmsuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMik7IC8vIFNldCB0cmlnZ2VyZWQgbGlua3MgcGFyZW50cyBhcyBhY3RpdmVcbiAgICAgICAgLy8gV2l0aCBib3RoIDx1bD4gYW5kIDxuYXY+IG1hcmt1cCBhIHBhcmVudCBpcyB0aGUgcHJldmlvdXMgc2libGluZyBvZiBhbnkgbmF2IGFuY2VzdG9yXG5cbiAgICAgICAgJGxpbmsucGFyZW50cyhTRUxFQ1RPUl9OQVZfTElTVF9HUk9VUCkucHJldihTRUxFQ1RPUl9OQVZfTElOS1MgKyBcIiwgXCIgKyBTRUxFQ1RPUl9MSVNUX0lURU1TKS5hZGRDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQyKTsgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZSB3aGVuIC5uYXYtbGluayBpcyBpbnNpZGUgLm5hdi1pdGVtXG5cbiAgICAgICAgJGxpbmsucGFyZW50cyhTRUxFQ1RPUl9OQVZfTElTVF9HUk9VUCkucHJldihTRUxFQ1RPUl9OQVZfSVRFTVMpLmNoaWxkcmVuKFNFTEVDVE9SX05BVl9MSU5LUykuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMik7XG4gICAgICB9XG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9zY3JvbGxFbGVtZW50KS50cmlnZ2VyKEVWRU5UX0FDVElWQVRFLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRhcmdldFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5fY2xlYXIgPSBmdW5jdGlvbiBfY2xlYXIoKSB7XG4gICAgICBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5fc2VsZWN0b3IpKS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQUNUSVZFJDIpO1xuICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFJDIpO1xuICAgICAgfSk7XG4gICAgfSAvLyBTdGF0aWNcbiAgICA7XG5cbiAgICBTY3JvbGxTcHkuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQ4KTtcblxuICAgICAgICB2YXIgX2NvbmZpZyA9IHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZztcblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IFNjcm9sbFNweSh0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcykuZGF0YShEQVRBX0tFWSQ4LCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcXFwiXCIgKyBjb25maWcgKyBcIlxcXCJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoU2Nyb2xsU3B5LCBudWxsLCBbe1xuICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVkVSU0lPTiQ4O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0XCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHQkNjtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gU2Nyb2xsU3B5O1xuICB9KCk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHdpbmRvdykub24oRVZFTlRfTE9BRF9EQVRBX0FQSSQyLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNjcm9sbFNweXMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoU0VMRUNUT1JfREFUQV9TUFkpKTtcbiAgICB2YXIgc2Nyb2xsU3B5c0xlbmd0aCA9IHNjcm9sbFNweXMubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IHNjcm9sbFNweXNMZW5ndGg7IGktLTspIHtcbiAgICAgIHZhciAkc3B5ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHNjcm9sbFNweXNbaV0pO1xuXG4gICAgICBTY3JvbGxTcHkuX2pRdWVyeUludGVyZmFjZS5jYWxsKCRzcHksICRzcHkuZGF0YSgpKTtcbiAgICB9XG4gIH0pO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIGpRdWVyeVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkOF0gPSBTY3JvbGxTcHkuX2pRdWVyeUludGVyZmFjZTtcbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkOF0uQ29uc3RydWN0b3IgPSBTY3JvbGxTcHk7XG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkOF0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ4XSA9IEpRVUVSWV9OT19DT05GTElDVCQ4O1xuICAgIHJldHVybiBTY3JvbGxTcHkuX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIENvbnN0YW50c1xuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgdmFyIE5BTUUkOSA9ICd0YWInO1xuICB2YXIgVkVSU0lPTiQ5ID0gJzQuNi4wJztcbiAgdmFyIERBVEFfS0VZJDkgPSAnYnMudGFiJztcbiAgdmFyIEVWRU5UX0tFWSQ5ID0gXCIuXCIgKyBEQVRBX0tFWSQ5O1xuICB2YXIgREFUQV9BUElfS0VZJDcgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCQ5ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkOV07XG4gIHZhciBFVkVOVF9ISURFJDMgPSBcImhpZGVcIiArIEVWRU5UX0tFWSQ5O1xuICB2YXIgRVZFTlRfSElEREVOJDMgPSBcImhpZGRlblwiICsgRVZFTlRfS0VZJDk7XG4gIHZhciBFVkVOVF9TSE9XJDMgPSBcInNob3dcIiArIEVWRU5UX0tFWSQ5O1xuICB2YXIgRVZFTlRfU0hPV04kMyA9IFwic2hvd25cIiArIEVWRU5UX0tFWSQ5O1xuICB2YXIgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkNiA9IFwiY2xpY2tcIiArIEVWRU5UX0tFWSQ5ICsgREFUQV9BUElfS0VZJDc7XG4gIHZhciBDTEFTU19OQU1FX0RST1BET1dOX01FTlUgPSAnZHJvcGRvd24tbWVudSc7XG4gIHZhciBDTEFTU19OQU1FX0FDVElWRSQzID0gJ2FjdGl2ZSc7XG4gIHZhciBDTEFTU19OQU1FX0RJU0FCTEVEJDEgPSAnZGlzYWJsZWQnO1xuICB2YXIgQ0xBU1NfTkFNRV9GQURFJDQgPSAnZmFkZSc7XG4gIHZhciBDTEFTU19OQU1FX1NIT1ckNiA9ICdzaG93JztcbiAgdmFyIFNFTEVDVE9SX0RST1BET1dOJDEgPSAnLmRyb3Bkb3duJztcbiAgdmFyIFNFTEVDVE9SX05BVl9MSVNUX0dST1VQJDEgPSAnLm5hdiwgLmxpc3QtZ3JvdXAnO1xuICB2YXIgU0VMRUNUT1JfQUNUSVZFJDIgPSAnLmFjdGl2ZSc7XG4gIHZhciBTRUxFQ1RPUl9BQ1RJVkVfVUwgPSAnPiBsaSA+IC5hY3RpdmUnO1xuICB2YXIgU0VMRUNUT1JfREFUQV9UT0dHTEUkNCA9ICdbZGF0YS10b2dnbGU9XCJ0YWJcIl0sIFtkYXRhLXRvZ2dsZT1cInBpbGxcIl0sIFtkYXRhLXRvZ2dsZT1cImxpc3RcIl0nO1xuICB2YXIgU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFJDEgPSAnLmRyb3Bkb3duLXRvZ2dsZSc7XG4gIHZhciBTRUxFQ1RPUl9EUk9QRE9XTl9BQ1RJVkVfQ0hJTEQgPSAnPiAuZHJvcGRvd24tbWVudSAuYWN0aXZlJztcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDbGFzcyBEZWZpbml0aW9uXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgVGFiID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUYWIoZWxlbWVudCkge1xuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgIHZhciBfcHJvdG8gPSBUYWIucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLnNob3cgPSBmdW5jdGlvbiBzaG93KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZSAmJiB0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQzKSB8fCAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ0xBU1NfTkFNRV9ESVNBQkxFRCQxKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB0YXJnZXQ7XG4gICAgICB2YXIgcHJldmlvdXM7XG4gICAgICB2YXIgbGlzdEVsZW1lbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkuY2xvc2VzdChTRUxFQ1RPUl9OQVZfTElTVF9HUk9VUCQxKVswXTtcbiAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcblxuICAgICAgaWYgKGxpc3RFbGVtZW50KSB7XG4gICAgICAgIHZhciBpdGVtU2VsZWN0b3IgPSBsaXN0RWxlbWVudC5ub2RlTmFtZSA9PT0gJ1VMJyB8fCBsaXN0RWxlbWVudC5ub2RlTmFtZSA9PT0gJ09MJyA/IFNFTEVDVE9SX0FDVElWRV9VTCA6IFNFTEVDVE9SX0FDVElWRSQyO1xuICAgICAgICBwcmV2aW91cyA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5tYWtlQXJyYXkoJF9fZGVmYXVsdFsnZGVmYXVsdCddKGxpc3RFbGVtZW50KS5maW5kKGl0ZW1TZWxlY3RvcikpO1xuICAgICAgICBwcmV2aW91cyA9IHByZXZpb3VzW3ByZXZpb3VzLmxlbmd0aCAtIDFdO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGlkZUV2ZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX0hJREUkMywge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiB0aGlzLl9lbGVtZW50XG4gICAgICB9KTtcbiAgICAgIHZhciBzaG93RXZlbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfU0hPVyQzLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHByZXZpb3VzXG4gICAgICB9KTtcblxuICAgICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShwcmV2aW91cykudHJpZ2dlcihoaWRlRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkudHJpZ2dlcihzaG93RXZlbnQpO1xuXG4gICAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpIHx8IGhpZGVFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fYWN0aXZhdGUodGhpcy5fZWxlbWVudCwgbGlzdEVsZW1lbnQpO1xuXG4gICAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiBjb21wbGV0ZSgpIHtcbiAgICAgICAgdmFyIGhpZGRlbkV2ZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX0hJRERFTiQzLCB7XG4gICAgICAgICAgcmVsYXRlZFRhcmdldDogX3RoaXMuX2VsZW1lbnRcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBzaG93bkV2ZW50ID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddLkV2ZW50KEVWRU5UX1NIT1dOJDMsIHtcbiAgICAgICAgICByZWxhdGVkVGFyZ2V0OiBwcmV2aW91c1xuICAgICAgICB9KTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHByZXZpb3VzKS50cmlnZ2VyKGhpZGRlbkV2ZW50KTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKF90aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNob3duRXZlbnQpO1xuICAgICAgfTtcblxuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICB0aGlzLl9hY3RpdmF0ZSh0YXJnZXQsIHRhcmdldC5wYXJlbnROb2RlLCBjb21wbGV0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10ucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSQ5KTtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fYWN0aXZhdGUgPSBmdW5jdGlvbiBfYWN0aXZhdGUoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBhY3RpdmVFbGVtZW50cyA9IGNvbnRhaW5lciAmJiAoY29udGFpbmVyLm5vZGVOYW1lID09PSAnVUwnIHx8IGNvbnRhaW5lci5ub2RlTmFtZSA9PT0gJ09MJykgPyAkX19kZWZhdWx0WydkZWZhdWx0J10oY29udGFpbmVyKS5maW5kKFNFTEVDVE9SX0FDVElWRV9VTCkgOiAkX19kZWZhdWx0WydkZWZhdWx0J10oY29udGFpbmVyKS5jaGlsZHJlbihTRUxFQ1RPUl9BQ1RJVkUkMik7XG4gICAgICB2YXIgYWN0aXZlID0gYWN0aXZlRWxlbWVudHNbMF07XG4gICAgICB2YXIgaXNUcmFuc2l0aW9uaW5nID0gY2FsbGJhY2sgJiYgYWN0aXZlICYmICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShhY3RpdmUpLmhhc0NsYXNzKENMQVNTX05BTUVfRkFERSQ0KTtcblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuX3RyYW5zaXRpb25Db21wbGV0ZShlbGVtZW50LCBhY3RpdmUsIGNhbGxiYWNrKTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChhY3RpdmUgJiYgaXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBVdGlsLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KGFjdGl2ZSk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShhY3RpdmUpLnJlbW92ZUNsYXNzKENMQVNTX05BTUVfU0hPVyQ2KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX3RyYW5zaXRpb25Db21wbGV0ZSA9IGZ1bmN0aW9uIF90cmFuc2l0aW9uQ29tcGxldGUoZWxlbWVudCwgYWN0aXZlLCBjYWxsYmFjaykge1xuICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oYWN0aXZlKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQzKTtcbiAgICAgICAgdmFyIGRyb3Bkb3duQ2hpbGQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10oYWN0aXZlLnBhcmVudE5vZGUpLmZpbmQoU0VMRUNUT1JfRFJPUERPV05fQUNUSVZFX0NISUxEKVswXTtcblxuICAgICAgICBpZiAoZHJvcGRvd25DaGlsZCkge1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkcm9wZG93bkNoaWxkKS5yZW1vdmVDbGFzcyhDTEFTU19OQU1FX0FDVElWRSQzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3RpdmUuZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICd0YWInKSB7XG4gICAgICAgICAgYWN0aXZlLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oZWxlbWVudCkuYWRkQ2xhc3MoQ0xBU1NfTkFNRV9BQ1RJVkUkMyk7XG5cbiAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgncm9sZScpID09PSAndGFiJykge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBVdGlsLnJlZmxvdyhlbGVtZW50KTtcblxuICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSQ0KSkge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XJDYpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlICYmICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlbGVtZW50LnBhcmVudE5vZGUpLmhhc0NsYXNzKENMQVNTX05BTUVfRFJPUERPV05fTUVOVSkpIHtcbiAgICAgICAgdmFyIGRyb3Bkb3duRWxlbWVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShlbGVtZW50KS5jbG9zZXN0KFNFTEVDVE9SX0RST1BET1dOJDEpWzBdO1xuXG4gICAgICAgIGlmIChkcm9wZG93bkVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgZHJvcGRvd25Ub2dnbGVMaXN0ID0gW10uc2xpY2UuY2FsbChkcm9wZG93bkVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUkMSkpO1xuICAgICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShkcm9wZG93blRvZ2dsZUxpc3QpLmFkZENsYXNzKENMQVNTX05BTUVfQUNUSVZFJDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSAvLyBTdGF0aWNcbiAgICA7XG5cbiAgICBUYWIuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICR0aGlzID0gJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMpO1xuICAgICAgICB2YXIgZGF0YSA9ICR0aGlzLmRhdGEoREFUQV9LRVkkOSk7XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBUYWIodGhpcyk7XG4gICAgICAgICAgJHRoaXMuZGF0YShEQVRBX0tFWSQ5LCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcXFwiXCIgKyBjb25maWcgKyBcIlxcXCJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoVGFiLCBudWxsLCBbe1xuICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVkVSU0lPTiQ5O1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBUYWI7XG4gIH0oKTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10oZG9jdW1lbnQpLm9uKEVWRU5UX0NMSUNLX0RBVEFfQVBJJDYsIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBUYWIuX2pRdWVyeUludGVyZmFjZS5jYWxsKCRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKSwgJ3Nob3cnKTtcbiAgfSk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogalF1ZXJ5XG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ5XSA9IFRhYi5falF1ZXJ5SW50ZXJmYWNlO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ5XS5Db25zdHJ1Y3RvciA9IFRhYjtcblxuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSQ5XS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJDldID0gSlFVRVJZX05PX0NPTkZMSUNUJDk7XG4gICAgcmV0dXJuIFRhYi5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ29uc3RhbnRzXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgTkFNRSRhID0gJ3RvYXN0JztcbiAgdmFyIFZFUlNJT04kYSA9ICc0LjYuMCc7XG4gIHZhciBEQVRBX0tFWSRhID0gJ2JzLnRvYXN0JztcbiAgdmFyIEVWRU5UX0tFWSRhID0gXCIuXCIgKyBEQVRBX0tFWSRhO1xuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUJGEgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRhXTtcbiAgdmFyIEVWRU5UX0NMSUNLX0RJU01JU1MkMSA9IFwiY2xpY2suZGlzbWlzc1wiICsgRVZFTlRfS0VZJGE7XG4gIHZhciBFVkVOVF9ISURFJDQgPSBcImhpZGVcIiArIEVWRU5UX0tFWSRhO1xuICB2YXIgRVZFTlRfSElEREVOJDQgPSBcImhpZGRlblwiICsgRVZFTlRfS0VZJGE7XG4gIHZhciBFVkVOVF9TSE9XJDQgPSBcInNob3dcIiArIEVWRU5UX0tFWSRhO1xuICB2YXIgRVZFTlRfU0hPV04kNCA9IFwic2hvd25cIiArIEVWRU5UX0tFWSRhO1xuICB2YXIgQ0xBU1NfTkFNRV9GQURFJDUgPSAnZmFkZSc7XG4gIHZhciBDTEFTU19OQU1FX0hJREUgPSAnaGlkZSc7XG4gIHZhciBDTEFTU19OQU1FX1NIT1ckNyA9ICdzaG93JztcbiAgdmFyIENMQVNTX05BTUVfU0hPV0lORyA9ICdzaG93aW5nJztcbiAgdmFyIERlZmF1bHRUeXBlJDcgPSB7XG4gICAgYW5pbWF0aW9uOiAnYm9vbGVhbicsXG4gICAgYXV0b2hpZGU6ICdib29sZWFuJyxcbiAgICBkZWxheTogJ251bWJlcidcbiAgfTtcbiAgdmFyIERlZmF1bHQkNyA9IHtcbiAgICBhbmltYXRpb246IHRydWUsXG4gICAgYXV0b2hpZGU6IHRydWUsXG4gICAgZGVsYXk6IDUwMFxuICB9O1xuICB2YXIgU0VMRUNUT1JfREFUQV9ESVNNSVNTJDEgPSAnW2RhdGEtZGlzbWlzcz1cInRvYXN0XCJdJztcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDbGFzcyBEZWZpbml0aW9uXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgVG9hc3QgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRvYXN0KGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuXG4gICAgICB0aGlzLl9zZXRMaXN0ZW5lcnMoKTtcbiAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgdmFyIF9wcm90byA9IFRvYXN0LnByb3RvdHlwZTtcblxuICAgIC8vIFB1YmxpY1xuICAgIF9wcm90by5zaG93ID0gZnVuY3Rpb24gc2hvdygpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBzaG93RXZlbnQgPSAkX19kZWZhdWx0WydkZWZhdWx0J10uRXZlbnQoRVZFTlRfU0hPVyQ0KTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNob3dFdmVudCk7XG5cbiAgICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jbGVhclRpbWVvdXQoKTtcblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5hbmltYXRpb24pIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSQ1KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgIF90aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XSU5HKTtcblxuICAgICAgICBfdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyQ3KTtcblxuICAgICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10oX3RoaXMuX2VsZW1lbnQpLnRyaWdnZXIoRVZFTlRfU0hPV04kNCk7XG5cbiAgICAgICAgaWYgKF90aGlzLl9jb25maWcuYXV0b2hpZGUpIHtcbiAgICAgICAgICBfdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuaGlkZSgpO1xuICAgICAgICAgIH0sIF90aGlzLl9jb25maWcuZGVsYXkpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9ISURFKTtcblxuICAgICAgVXRpbC5yZWZsb3codGhpcy5fZWxlbWVudCk7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1dJTkcpO1xuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmFuaW1hdGlvbikge1xuICAgICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gVXRpbC5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBjb21wbGV0ZSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5oaWRlID0gZnVuY3Rpb24gaGlkZSgpIHtcbiAgICAgIGlmICghdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XJDcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGhpZGVFdmVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5FdmVudChFVkVOVF9ISURFJDQpO1xuICAgICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoaGlkZUV2ZW50KTtcblxuICAgICAgaWYgKGhpZGVFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgIHRoaXMuX2NsZWFyVGltZW91dCgpO1xuXG4gICAgICBpZiAodGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XJDcpKSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1ckNyk7XG4gICAgICB9XG5cbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vZmYoRVZFTlRfQ0xJQ0tfRElTTUlTUyQxKTtcbiAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsIERBVEFfS0VZJGEpO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9jb25maWcgPSBudWxsO1xuICAgIH0gLy8gUHJpdmF0ZVxuICAgIDtcblxuICAgIF9wcm90by5fZ2V0Q29uZmlnID0gZnVuY3Rpb24gX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgIGNvbmZpZyA9IF9leHRlbmRzKHt9LCBEZWZhdWx0JDcsICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5kYXRhKCksIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZyA/IGNvbmZpZyA6IHt9KTtcbiAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUkYSwgY29uZmlnLCB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5fc2V0TGlzdGVuZXJzID0gZnVuY3Rpb24gX3NldExpc3RlbmVycygpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAkX19kZWZhdWx0WydkZWZhdWx0J10odGhpcy5fZWxlbWVudCkub24oRVZFTlRfQ0xJQ0tfRElTTUlTUyQxLCBTRUxFQ1RPUl9EQVRBX0RJU01JU1MkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMyLmhpZGUoKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2Nsb3NlID0gZnVuY3Rpb24gX2Nsb3NlKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgICAgICBfdGhpczMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0hJREUpO1xuXG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXShfdGhpczMuX2VsZW1lbnQpLnRyaWdnZXIoRVZFTlRfSElEREVOJDQpO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQ3KTtcblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5hbmltYXRpb24pIHtcbiAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IFV0aWwuZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7XG4gICAgICAgICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzLl9lbGVtZW50KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uX2NsZWFyVGltZW91dCA9IGZ1bmN0aW9uIF9jbGVhclRpbWVvdXQoKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG4gICAgICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcbiAgICB9IC8vIFN0YXRpY1xuICAgIDtcblxuICAgIFRvYXN0Ll9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkZWxlbWVudCA9ICRfX2RlZmF1bHRbJ2RlZmF1bHQnXSh0aGlzKTtcbiAgICAgICAgdmFyIGRhdGEgPSAkZWxlbWVudC5kYXRhKERBVEFfS0VZJGEpO1xuXG4gICAgICAgIHZhciBfY29uZmlnID0gdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgVG9hc3QodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0tFWSRhLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcXFwiXCIgKyBjb25maWcgKyBcIlxcXCJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVtjb25maWddKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX2NyZWF0ZUNsYXNzKFRvYXN0LCBudWxsLCBbe1xuICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVkVSU0lPTiRhO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0VHlwZVwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0VHlwZSQ3O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0XCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHQkNztcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gVG9hc3Q7XG4gIH0oKTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBqUXVlcnlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkYV0gPSBUb2FzdC5falF1ZXJ5SW50ZXJmYWNlO1xuICAkX19kZWZhdWx0WydkZWZhdWx0J10uZm5bTkFNRSRhXS5Db25zdHJ1Y3RvciA9IFRvYXN0O1xuXG4gICRfX2RlZmF1bHRbJ2RlZmF1bHQnXS5mbltOQU1FJGFdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJF9fZGVmYXVsdFsnZGVmYXVsdCddLmZuW05BTUUkYV0gPSBKUVVFUllfTk9fQ09ORkxJQ1QkYTtcbiAgICByZXR1cm4gVG9hc3QuX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICBleHBvcnRzLkFsZXJ0ID0gQWxlcnQ7XG4gIGV4cG9ydHMuQnV0dG9uID0gQnV0dG9uO1xuICBleHBvcnRzLkNhcm91c2VsID0gQ2Fyb3VzZWw7XG4gIGV4cG9ydHMuQ29sbGFwc2UgPSBDb2xsYXBzZTtcbiAgZXhwb3J0cy5Ecm9wZG93biA9IERyb3Bkb3duO1xuICBleHBvcnRzLk1vZGFsID0gTW9kYWw7XG4gIGV4cG9ydHMuUG9wb3ZlciA9IFBvcG92ZXI7XG4gIGV4cG9ydHMuU2Nyb2xsc3B5ID0gU2Nyb2xsU3B5O1xuICBleHBvcnRzLlRhYiA9IFRhYjtcbiAgZXhwb3J0cy5Ub2FzdCA9IFRvYXN0O1xuICBleHBvcnRzLlRvb2x0aXAgPSBUb29sdGlwO1xuICBleHBvcnRzLlV0aWwgPSBVdGlsO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ib290c3RyYXAuanMubWFwXG4iXSwic291cmNlUm9vdCI6IiJ9\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.5.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2020-05-04T22:49Z\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 #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 // Support: Chrome <=57, Firefox <=52\n // In some browsers, typeof returns \"function\" for HTML <object> elements\n // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n // We don't want to classify *any* DOM node as a function.\n return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n };\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.5.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[ 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( \" \" ),\nfunction( _i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\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.5\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: 2020-03-14\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.namespaceURI,\n\t\tdocElem = ( 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 return 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 (#9521)\n\t// Strict HTML recognition (#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 master Deferred\n\t\t\tmaster = 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\tmaster.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, master.done( updateFunc( i ) ).resolve, master.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 ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.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 ), master.reject );\n\t\t}\n\n\t\treturn master.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 #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\tvalue :\n\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 (#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 #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 (#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 (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#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 (#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 (#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 (#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\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\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\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\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 (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #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 (#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\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\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\t\t\t\t\t\treturn 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 (#504, #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\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\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\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\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 (#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\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 getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #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\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 (#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\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\";\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\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 ) > 3;\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\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, #12537)\n\t// .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\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\trcustomProp = /^--/,\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 (#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 #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 (#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\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\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\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\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/* 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 )` (#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\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\t\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.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\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// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#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 classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\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\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\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\telem.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 classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\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\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\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\telem.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 type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\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\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\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = 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\"\" :\n\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\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 (#14686, #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 (#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 (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#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 = (\n\t\t\t\t\tdataPriv.get( cur, \"events\" ) || Object.create( null )\n\t\t\t\t)[ 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 (#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;\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\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\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} )\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} )\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// #7653, #8125, #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 (#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\toriginAnchor.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 #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\t\tjQuery( callbackContext ) :\n\t\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 (#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 #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 (#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// #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\n\t\t\tif ( !isSuccess && jQuery.inArray( \"script\", s.dataTypes ) > -1 ) {\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 (#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// #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 #8605, #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// #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\tif ( typeof props.top === \"number\" ) {\n\t\t\t\tprops.top += \"px\";\n\t\t\t}\n\t\t\tif ( typeof props.left === \"number\" ) {\n\t\t\t\tprops.left += \"px\";\n\t\t\t}\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( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( 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( ( \"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// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\nvar rtrim = /^[\\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, \"\" );\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// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanF1ZXJ5L2Rpc3QvanF1ZXJ5LmpzPzExNTciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxNQUFNLEtBQTBCOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7OztBQUdBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQVEsWUFBWTs7QUFFcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGLG9CQUFvQjs7QUFFcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUYsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQSxrQkFBa0Isa0NBQWtDO0FBQ3BELEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVSxZQUFZO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTLFNBQVM7QUFDbEI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTLFlBQVk7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFlBQVk7QUFDdEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxTQUFTO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGtDQUFrQyxJQUFJO0FBQ3RDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQSxnQkFBZ0IsSUFBSTs7QUFFcEI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsMENBQTBDLElBQUk7QUFDOUM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSx5QkFBeUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFFBQVEsNkJBQTZCO0FBQ2hEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxnQkFBZ0I7QUFDM0IsYUFBYSx1QkFBdUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxlQUFlO0FBQzFCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLGVBQWU7QUFDMUIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FB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OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBLGlFQUFpRSxVQUFVO0FBQzNFLHNDQUFzQywyQkFBMkI7QUFDakU7QUFDQSxnQ0FBZ0MsTUFBTTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLFVBQVUsWUFBWTtBQUN0QjtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxVQUFVLFlBQVk7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFVBQVU7QUFDcEI7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsVUFBVSxjQUFjO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0EsWUFBWSx1RUFBdUU7QUFDbkY7QUFDQTtBQUNBLFlBQVksNEJBQTRCO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsU0FBUztBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSw0REFBNEQ7O0FBRTVEO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsU0FBUztBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxTQUFTO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVILFFBQVEsU0FBUztBQUNqQjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsaURBQWlEO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRCxVQUFVLDRDQUE0QztBQUN0RDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsZ0JBQWdCO0FBQzNCO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsTUFBTTtBQUNqQixXQUFXLE1BQU07QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7O0FBRUEsQ0FBQzs7OztBQUlEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBLFFBQVEsR0FBRztBQUNYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBOzs7O0FBSUE7O0FBRUE7O0FBRUE7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQixTQUFTO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBOztBQUVBLGNBQWMsU0FBUztBQUN2QjtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQUdEOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVUsT0FBTztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVSxPQUFPO0FBQ2pCLDBCQUEwQix3QkFBd0I7O0FBRWxEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1COztBQUVuQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGNBQWM7QUFDeEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx3Q0FBd0Msc0NBQXNDO0FBQzlFLG9DQUFvQyx1Q0FBdUM7QUFDM0Usb0NBQW9DLHNDQUFzQztBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLE9BQU87QUFDUDtBQUNBLE1BQU07QUFDTixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVOztBQUVWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0NBQW9DO0FBQ3BDLHFDQUFxQztBQUNyQyxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7Ozs7QUFLQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVLFNBQVM7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVCQUF1QixhQUFhO0FBQ3BDLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLFNBQVM7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSixHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7OztBQUdBOztBQUVBOzs7O0FBSUE7QUFDQTtBQUNBLEdBQUc7QUFDSCxjQUFjOztBQUVkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRLGdCQUFnQjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsZ0JBQWdCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxFQUFFO0FBQ0Y7O0FBRUEsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQVEsT0FBTztBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxRQUFRLE9BQU87QUFDZjs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxnQkFBZ0I7QUFDbEI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVc7O0FBRVg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsY0FBYyxzQkFBc0I7QUFDcEM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsK0RBQStEO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVSxjQUFjOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLG1CQUFtQjtBQUNwQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHVDQUF1QztBQUNqRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsdURBQXVEO0FBQzlFOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLCtDQUErQztBQUNwRDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUMsY0FBYztBQUNuRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQsY0FBYyxxQ0FBcUM7QUFDbkQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7O0FBR0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsMkNBQTJDLE9BQU87QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7O0FBRTlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsT0FBTztBQUNqQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQixnQkFBZ0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxRQUFRLCtCQUErQjtBQUN2QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsdUNBQXVDLE9BQU87QUFDOUM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0NBQXdDLE9BQU87QUFDL0M7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTLHFDQUFxQztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBLFNBQVMsOEJBQThCO0FBQ3ZDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxZQUFZLE9BQU87QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTLFdBQVc7QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBOzs7O0FBSUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtDQUErQyxjQUFjLFdBQVc7QUFDeEUsbUJBQW1CLFVBQVU7QUFDN0I7QUFDQSxzQkFBc0IsY0FBYyxzQkFBc0IsZ0JBQWdCO0FBQzFFLGdCQUFnQixXQUFXLFlBQVk7QUFDdkMsY0FBYztBQUNkOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDZDQUE2QztBQUM3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0YsQ0FBQzs7O0FBR0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLCtEQUErRDtBQUMzRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxRQUFRLE9BQU87O0FBRWY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTs7QUFFQSxVQUFVLE9BQU87QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQSxRQUFRLE9BQU87QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsZ0JBQWdCO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixpREFBaUQsMEJBQTBCO0FBQzNFOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVSxnQkFBZ0I7QUFDMUI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBLHFCQUFxQjtBQUNy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Q0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7QUFLRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBLGlDQUFpQztBQUNqQztBQUNBOztBQUVBLElBQUk7QUFDSjs7QUFFQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFNBQVM7QUFDcEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7O0FBS0Q7OztBQUdBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBOztBQUVBOztBQUVBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEyQztBQUMzQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsS0FBSztBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxxQ0FBcUM7O0FBRXBEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQSxhQUFhOztBQUViOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUgsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYixLQUFLO0FBQ0w7O0FBRUEsV0FBVztBQUNYLEdBQUc7QUFDSDtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCOztBQUVoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCOztBQUVoQixnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtQkFBbUI7QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQjtBQUNqQixTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEOztBQUVsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjs7QUFFM0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQSxzQkFBc0I7QUFDdEIsMkJBQTJCOztBQUUzQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLElBQUk7QUFDSjtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHlCQUF5QjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7QUFLRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQixhQUFhLHVDQUF1QztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7QUFLRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLElBQUk7QUFDSixHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxxREFBcUQ7QUFDckQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FB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cy9qcXVlcnkvZGlzdC9qcXVlcnkuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuNS4xXG4gKiBodHRwczovL2pxdWVyeS5jb20vXG4gKlxuICogSW5jbHVkZXMgU2l6emxlLmpzXG4gKiBodHRwczovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAyMC0wNS0wNFQyMjo0OVpcbiAqL1xuKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyBGb3IgQ29tbW9uSlMgYW5kIENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHdoZXJlIGEgcHJvcGVyIGB3aW5kb3dgXG5cdFx0Ly8gaXMgcHJlc2VudCwgZXhlY3V0ZSB0aGUgZmFjdG9yeSBhbmQgZ2V0IGpRdWVyeS5cblx0XHQvLyBGb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IGhhdmUgYSBgd2luZG93YCB3aXRoIGEgYGRvY3VtZW50YFxuXHRcdC8vIChzdWNoIGFzIE5vZGUuanMpLCBleHBvc2UgYSBmYWN0b3J5IGFzIG1vZHVsZS5leHBvcnRzLlxuXHRcdC8vIFRoaXMgYWNjZW50dWF0ZXMgdGhlIG5lZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiBhIHJlYWwgYHdpbmRvd2AuXG5cdFx0Ly8gZS5nLiB2YXIgalF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKSh3aW5kb3cpO1xuXHRcdC8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgP1xuXHRcdFx0ZmFjdG9yeSggZ2xvYmFsLCB0cnVlICkgOlxuXHRcdFx0ZnVuY3Rpb24oIHcgKSB7XG5cdFx0XHRcdGlmICggIXcuZG9jdW1lbnQgKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBcImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnRcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWN0b3J5KCB3ICk7XG5cdFx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdGZhY3RvcnkoIGdsb2JhbCApO1xuXHR9XG5cbi8vIFBhc3MgdGhpcyBpZiB3aW5kb3cgaXMgbm90IGRlZmluZWQgeWV0XG59ICkoIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiggd2luZG93LCBub0dsb2JhbCApIHtcblxuLy8gRWRnZSA8PSAxMiAtIDEzKywgRmlyZWZveCA8PTE4IC0gNDUrLCBJRSAxMCAtIDExLCBTYWZhcmkgNS4xIC0gOSssIGlPUyA2IC0gOS4xXG4vLyB0aHJvdyBleGNlcHRpb25zIHdoZW4gbm9uLXN0cmljdCBjb2RlIChlLmcuLCBBU1AuTkVUIDQuNSkgYWNjZXNzZXMgc3RyaWN0IG1vZGVcbi8vIGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyICh0cmFjLTEzMzM1KS4gQnV0IGFzIG9mIGpRdWVyeSAzLjAgKDIwMTYpLCBzdHJpY3QgbW9kZSBzaG91bGQgYmUgY29tbW9uXG4vLyBlbm91Z2ggdGhhdCBhbGwgc3VjaCBhdHRlbXB0cyBhcmUgZ3VhcmRlZCBpbiBhIHRyeSBibG9jay5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgYXJyID0gW107XG5cbnZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcblxudmFyIHNsaWNlID0gYXJyLnNsaWNlO1xuXG52YXIgZmxhdCA9IGFyci5mbGF0ID8gZnVuY3Rpb24oIGFycmF5ICkge1xuXHRyZXR1cm4gYXJyLmZsYXQuY2FsbCggYXJyYXkgKTtcbn0gOiBmdW5jdGlvbiggYXJyYXkgKSB7XG5cdHJldHVybiBhcnIuY29uY2F0LmFwcGx5KCBbXSwgYXJyYXkgKTtcbn07XG5cblxudmFyIHB1c2ggPSBhcnIucHVzaDtcblxudmFyIGluZGV4T2YgPSBhcnIuaW5kZXhPZjtcblxudmFyIGNsYXNzMnR5cGUgPSB7fTtcblxudmFyIHRvU3RyaW5nID0gY2xhc3MydHlwZS50b1N0cmluZztcblxudmFyIGhhc093biA9IGNsYXNzMnR5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBmblRvU3RyaW5nID0gaGFzT3duLnRvU3RyaW5nO1xuXG52YXIgT2JqZWN0RnVuY3Rpb25TdHJpbmcgPSBmblRvU3RyaW5nLmNhbGwoIE9iamVjdCApO1xuXG52YXIgc3VwcG9ydCA9IHt9O1xuXG52YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24oIG9iaiApIHtcblxuICAgICAgLy8gU3VwcG9ydDogQ2hyb21lIDw9NTcsIEZpcmVmb3ggPD01MlxuICAgICAgLy8gSW4gc29tZSBicm93c2VycywgdHlwZW9mIHJldHVybnMgXCJmdW5jdGlvblwiIGZvciBIVE1MIDxvYmplY3Q+IGVsZW1lbnRzXG4gICAgICAvLyAoaS5lLiwgYHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcIm9iamVjdFwiICkgPT09IFwiZnVuY3Rpb25cImApLlxuICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBjbGFzc2lmeSAqYW55KiBET00gbm9kZSBhcyBhIGZ1bmN0aW9uLlxuICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2Ygb2JqLm5vZGVUeXBlICE9PSBcIm51bWJlclwiO1xuICB9O1xuXG5cbnZhciBpc1dpbmRvdyA9IGZ1bmN0aW9uIGlzV2luZG93KCBvYmogKSB7XG5cdFx0cmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PT0gb2JqLndpbmRvdztcblx0fTtcblxuXG52YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7XG5cblxuXG5cdHZhciBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzID0ge1xuXHRcdHR5cGU6IHRydWUsXG5cdFx0c3JjOiB0cnVlLFxuXHRcdG5vbmNlOiB0cnVlLFxuXHRcdG5vTW9kdWxlOiB0cnVlXG5cdH07XG5cblx0ZnVuY3Rpb24gRE9NRXZhbCggY29kZSwgbm9kZSwgZG9jICkge1xuXHRcdGRvYyA9IGRvYyB8fCBkb2N1bWVudDtcblxuXHRcdHZhciBpLCB2YWwsXG5cdFx0XHRzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggXCJzY3JpcHRcIiApO1xuXG5cdFx0c2NyaXB0LnRleHQgPSBjb2RlO1xuXHRcdGlmICggbm9kZSApIHtcblx0XHRcdGZvciAoIGkgaW4gcHJlc2VydmVkU2NyaXB0QXR0cmlidXRlcyApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDY0KywgRWRnZSAxOCtcblx0XHRcdFx0Ly8gU29tZSBicm93c2VycyBkb24ndCBzdXBwb3J0IHRoZSBcIm5vbmNlXCIgcHJvcGVydHkgb24gc2NyaXB0cy5cblx0XHRcdFx0Ly8gT24gdGhlIG90aGVyIGhhbmQsIGp1c3QgdXNpbmcgYGdldEF0dHJpYnV0ZWAgaXMgbm90IGVub3VnaCBhc1xuXHRcdFx0XHQvLyB0aGUgYG5vbmNlYCBhdHRyaWJ1dGUgaXMgcmVzZXQgdG8gYW4gZW1wdHkgc3RyaW5nIHdoZW5ldmVyIGl0XG5cdFx0XHRcdC8vIGJlY29tZXMgYnJvd3NpbmctY29udGV4dCBjb25uZWN0ZWQuXG5cdFx0XHRcdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL2h0bWwvaXNzdWVzLzIzNjlcblx0XHRcdFx0Ly8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI25vbmNlLWF0dHJpYnV0ZXNcblx0XHRcdFx0Ly8gVGhlIGBub2RlLmdldEF0dHJpYnV0ZWAgY2hlY2sgd2FzIGFkZGVkIGZvciB0aGUgc2FrZSBvZlxuXHRcdFx0XHQvLyBgalF1ZXJ5Lmdsb2JhbEV2YWxgIHNvIHRoYXQgaXQgY2FuIGZha2UgYSBub25jZS1jb250YWluaW5nIG5vZGVcblx0XHRcdFx0Ly8gdmlhIGFuIG9iamVjdC5cblx0XHRcdFx0dmFsID0gbm9kZVsgaSBdIHx8IG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKCBpICk7XG5cdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdHNjcmlwdC5zZXRBdHRyaWJ1dGUoIGksIHZhbCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGRvYy5oZWFkLmFwcGVuZENoaWxkKCBzY3JpcHQgKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIHRvVHlwZSggb2JqICkge1xuXHRpZiAoIG9iaiA9PSBudWxsICkge1xuXHRcdHJldHVybiBvYmogKyBcIlwiO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5IChmdW5jdGlvbmlzaCBSZWdFeHApXG5cdHJldHVybiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiA/XG5cdFx0Y2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCBcIm9iamVjdFwiIDpcblx0XHR0eXBlb2Ygb2JqO1xufVxuLyogZ2xvYmFsIFN5bWJvbCAqL1xuLy8gRGVmaW5pbmcgdGhpcyBnbG9iYWwgaW4gLmVzbGludHJjLmpzb24gd291bGQgY3JlYXRlIGEgZGFuZ2VyIG9mIHVzaW5nIHRoZSBnbG9iYWxcbi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBkZWZpbmUgZ2xvYmFsIG9ubHkgZm9yIHRoaXMgbW9kdWxlXG5cblxuXG52YXJcblx0dmVyc2lvbiA9IFwiMy41LjFcIixcblxuXHQvLyBEZWZpbmUgYSBsb2NhbCBjb3B5IG9mIGpRdWVyeVxuXHRqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cblx0XHQvLyBUaGUgalF1ZXJ5IG9iamVjdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0IGNvbnN0cnVjdG9yICdlbmhhbmNlZCdcblx0XHQvLyBOZWVkIGluaXQgaWYgalF1ZXJ5IGlzIGNhbGxlZCAoanVzdCBhbGxvdyBlcnJvciB0byBiZSB0aHJvd24gaWYgbm90IGluY2x1ZGVkKVxuXHRcdHJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7XG5cdH07XG5cbmpRdWVyeS5mbiA9IGpRdWVyeS5wcm90b3R5cGUgPSB7XG5cblx0Ly8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBqUXVlcnkgYmVpbmcgdXNlZFxuXHRqcXVlcnk6IHZlcnNpb24sXG5cblx0Y29uc3RydWN0b3I6IGpRdWVyeSxcblxuXHQvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDBcblx0bGVuZ3RoOiAwLFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7XG5cdH0sXG5cblx0Ly8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUlxuXHQvLyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheVxuXHRnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7XG5cblx0XHQvLyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyBpbiBhIGNsZWFuIGFycmF5XG5cdFx0aWYgKCBudW0gPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldFxuXHRcdHJldHVybiBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdO1xuXHR9LFxuXG5cdC8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2tcblx0Ly8gKHJldHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpXG5cdHB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkge1xuXG5cdFx0Ly8gQnVpbGQgYSBuZXcgalF1ZXJ5IG1hdGNoZWQgZWxlbWVudCBzZXRcblx0XHR2YXIgcmV0ID0galF1ZXJ5Lm1lcmdlKCB0aGlzLmNvbnN0cnVjdG9yKCksIGVsZW1zICk7XG5cblx0XHQvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKVxuXHRcdHJldC5wcmV2T2JqZWN0ID0gdGhpcztcblxuXHRcdC8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0XG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHQvLyBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgc2V0LlxuXHRlYWNoOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjayApO1xuXHR9LFxuXG5cdG1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCggdGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gY2FsbGJhY2suY2FsbCggZWxlbSwgaSwgZWxlbSApO1xuXHRcdH0gKSApO1xuXHR9LFxuXG5cdHNsaWNlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApO1xuXHR9LFxuXG5cdGZpcnN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggMCApO1xuXHR9LFxuXG5cdGxhc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVxKCAtMSApO1xuXHR9LFxuXG5cdGV2ZW46IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LmdyZXAoIHRoaXMsIGZ1bmN0aW9uKCBfZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiAoIGkgKyAxICkgJSAyO1xuXHRcdH0gKSApO1xuXHR9LFxuXG5cdG9kZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkuZ3JlcCggdGhpcywgZnVuY3Rpb24oIF9lbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGkgJSAyO1xuXHRcdH0gKSApO1xuXHR9LFxuXG5cdGVxOiBmdW5jdGlvbiggaSApIHtcblx0XHR2YXIgbGVuID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRqID0gK2kgKyAoIGkgPCAwID8gbGVuIDogMCApO1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggaiA+PSAwICYmIGogPCBsZW4gPyBbIHRoaXNbIGogXSBdIDogW10gKTtcblx0fSxcblxuXHRlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpO1xuXHR9LFxuXG5cdC8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS5cblx0Ly8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuXG5cdHB1c2g6IHB1c2gsXG5cdHNvcnQ6IGFyci5zb3J0LFxuXHRzcGxpY2U6IGFyci5zcGxpY2Vcbn07XG5cbmpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7XG5cdHZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSxcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbIDAgXSB8fCB7fSxcblx0XHRpID0gMSxcblx0XHRsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuXHRcdGRlZXAgPSBmYWxzZTtcblxuXHQvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uXG5cdGlmICggdHlwZW9mIHRhcmdldCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0ZGVlcCA9IHRhcmdldDtcblxuXHRcdC8vIFNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXRcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbIGkgXSB8fCB7fTtcblx0XHRpKys7XG5cdH1cblxuXHQvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSlcblx0aWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSBcIm9iamVjdFwiICYmICFpc0Z1bmN0aW9uKCB0YXJnZXQgKSApIHtcblx0XHR0YXJnZXQgPSB7fTtcblx0fVxuXG5cdC8vIEV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHBhc3NlZFxuXHRpZiAoIGkgPT09IGxlbmd0aCApIHtcblx0XHR0YXJnZXQgPSB0aGlzO1xuXHRcdGktLTtcblx0fVxuXG5cdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXG5cdFx0Ly8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlc1xuXHRcdGlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkge1xuXG5cdFx0XHQvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0XG5cdFx0XHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRcdGNvcHkgPSBvcHRpb25zWyBuYW1lIF07XG5cblx0XHRcdFx0Ly8gUHJldmVudCBPYmplY3QucHJvdG90eXBlIHBvbGx1dGlvblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICggbmFtZSA9PT0gXCJfX3Byb3RvX19cIiB8fCB0YXJnZXQgPT09IGNvcHkgKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXNcblx0XHRcdFx0aWYgKCBkZWVwICYmIGNvcHkgJiYgKCBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29weSApIHx8XG5cdFx0XHRcdFx0KCBjb3B5SXNBcnJheSA9IEFycmF5LmlzQXJyYXkoIGNvcHkgKSApICkgKSB7XG5cdFx0XHRcdFx0c3JjID0gdGFyZ2V0WyBuYW1lIF07XG5cblx0XHRcdFx0XHQvLyBFbnN1cmUgcHJvcGVyIHR5cGUgZm9yIHRoZSBzb3VyY2UgdmFsdWVcblx0XHRcdFx0XHRpZiAoIGNvcHlJc0FycmF5ICYmICFBcnJheS5pc0FycmF5KCBzcmMgKSApIHtcblx0XHRcdFx0XHRcdGNsb25lID0gW107XG5cdFx0XHRcdFx0fSBlbHNlIGlmICggIWNvcHlJc0FycmF5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggc3JjICkgKSB7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHt9O1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29weUlzQXJyYXkgPSBmYWxzZTtcblxuXHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGNvcHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxuXHRleHBhbmRvOiBcImpRdWVyeVwiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cXEQvZywgXCJcIiApLFxuXG5cdC8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlXG5cdGlzUmVhZHk6IHRydWUsXG5cblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblx0fSxcblxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIHByb3RvLCBDdG9yO1xuXG5cdFx0Ly8gRGV0ZWN0IG9idmlvdXMgbmVnYXRpdmVzXG5cdFx0Ly8gVXNlIHRvU3RyaW5nIGluc3RlYWQgb2YgalF1ZXJ5LnR5cGUgdG8gY2F0Y2ggaG9zdCBvYmplY3RzXG5cdFx0aWYgKCAhb2JqIHx8IHRvU3RyaW5nLmNhbGwoIG9iaiApICE9PSBcIltvYmplY3QgT2JqZWN0XVwiICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHByb3RvID0gZ2V0UHJvdG8oIG9iaiApO1xuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIG5vIHByb3RvdHlwZSAoZS5nLiwgYE9iamVjdC5jcmVhdGUoIG51bGwgKWApIGFyZSBwbGFpblxuXHRcdGlmICggIXByb3RvICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb25cblx0XHRDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCBcImNvbnN0cnVjdG9yXCIgKSAmJiBwcm90by5jb25zdHJ1Y3Rvcjtcblx0XHRyZXR1cm4gdHlwZW9mIEN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBmblRvU3RyaW5nLmNhbGwoIEN0b3IgKSA9PT0gT2JqZWN0RnVuY3Rpb25TdHJpbmc7XG5cdH0sXG5cblx0aXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblx0XHR2YXIgbmFtZTtcblxuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHQvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBwcm92aWRlZCBjb250ZXh0OyBmYWxscyBiYWNrIHRvIHRoZSBnbG9iYWwgb25lXG5cdC8vIGlmIG5vdCBzcGVjaWZpZWQuXG5cdGdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBjb2RlLCBvcHRpb25zLCBkb2MgKSB7XG5cdFx0RE9NRXZhbCggY29kZSwgeyBub25jZTogb3B0aW9ucyAmJiBvcHRpb25zLm5vbmNlIH0sIGRvYyApO1xuXHR9LFxuXG5cdGVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkge1xuXHRcdHZhciBsZW5ndGgsIGkgPSAwO1xuXG5cdFx0aWYgKCBpc0FycmF5TGlrZSggb2JqICkgKSB7XG5cdFx0XHRsZW5ndGggPSBvYmoubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gb2JqICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvYmo7XG5cdH0sXG5cblx0Ly8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnIsIHJlc3VsdHMgKSB7XG5cdFx0dmFyIHJldCA9IHJlc3VsdHMgfHwgW107XG5cblx0XHRpZiAoIGFyciAhPSBudWxsICkge1xuXHRcdFx0aWYgKCBpc0FycmF5TGlrZSggT2JqZWN0KCBhcnIgKSApICkge1xuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHJldCxcblx0XHRcdFx0XHR0eXBlb2YgYXJyID09PSBcInN0cmluZ1wiID9cblx0XHRcdFx0XHRbIGFyciBdIDogYXJyXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmNhbGwoIHJldCwgYXJyICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHRpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyLCBpICkge1xuXHRcdHJldHVybiBhcnIgPT0gbnVsbCA/IC0xIDogaW5kZXhPZi5jYWxsKCBhcnIsIGVsZW0sIGkgKTtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRtZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7XG5cdFx0dmFyIGxlbiA9ICtzZWNvbmQubGVuZ3RoLFxuXHRcdFx0aiA9IDAsXG5cdFx0XHRpID0gZmlyc3QubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTtcblx0XHR9XG5cblx0XHRmaXJzdC5sZW5ndGggPSBpO1xuXG5cdFx0cmV0dXJuIGZpcnN0O1xuXHR9LFxuXG5cdGdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludmVydCApIHtcblx0XHR2YXIgY2FsbGJhY2tJbnZlcnNlLFxuXHRcdFx0bWF0Y2hlcyA9IFtdLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXG5cdFx0XHRjYWxsYmFja0V4cGVjdCA9ICFpbnZlcnQ7XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zXG5cdFx0Ly8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb25cblx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdGNhbGxiYWNrSW52ZXJzZSA9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApO1xuXHRcdFx0aWYgKCBjYWxsYmFja0ludmVyc2UgIT09IGNhbGxiYWNrRXhwZWN0ICkge1xuXHRcdFx0XHRtYXRjaGVzLnB1c2goIGVsZW1zWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlcztcblx0fSxcblxuXHQvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7XG5cdFx0dmFyIGxlbmd0aCwgdmFsdWUsXG5cdFx0XHRpID0gMCxcblx0XHRcdHJldCA9IFtdO1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyIG5ldyB2YWx1ZXNcblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBlbGVtcyApICkge1xuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCxcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBlbGVtcyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRcdHJldHVybiBmbGF0KCByZXQgKTtcblx0fSxcblxuXHQvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHNcblx0Z3VpZDogMSxcblxuXHQvLyBqUXVlcnkuc3VwcG9ydCBpcyBub3QgdXNlZCBpbiBDb3JlIGJ1dCBvdGhlciBwcm9qZWN0cyBhdHRhY2ggdGhlaXJcblx0Ly8gcHJvcGVydGllcyB0byBpdCBzbyBpdCBuZWVkcyB0byBleGlzdC5cblx0c3VwcG9ydDogc3VwcG9ydFxufSApO1xuXG5pZiAoIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiApIHtcblx0alF1ZXJ5LmZuWyBTeW1ib2wuaXRlcmF0b3IgXSA9IGFyclsgU3ltYm9sLml0ZXJhdG9yIF07XG59XG5cbi8vIFBvcHVsYXRlIHRoZSBjbGFzczJ0eXBlIG1hcFxualF1ZXJ5LmVhY2goIFwiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2xcIi5zcGxpdCggXCIgXCIgKSxcbmZ1bmN0aW9uKCBfaSwgbmFtZSApIHtcblx0Y2xhc3MydHlwZVsgXCJbb2JqZWN0IFwiICsgbmFtZSArIFwiXVwiIF0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG59ICk7XG5cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKCBvYmogKSB7XG5cblx0Ly8gU3VwcG9ydDogcmVhbCBpT1MgOC4yIG9ubHkgKG5vdCByZXByb2R1Y2libGUgaW4gc2ltdWxhdG9yKVxuXHQvLyBgaW5gIGNoZWNrIHVzZWQgdG8gcHJldmVudCBKSVQgZXJyb3IgKGdoLTIxNDUpXG5cdC8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlc1xuXHQvLyByZWdhcmRpbmcgTm9kZWxpc3QgbGVuZ3RoIGluIElFXG5cdHZhciBsZW5ndGggPSAhIW9iaiAmJiBcImxlbmd0aFwiIGluIG9iaiAmJiBvYmoubGVuZ3RoLFxuXHRcdHR5cGUgPSB0b1R5cGUoIG9iaiApO1xuXG5cdGlmICggaXNGdW5jdGlvbiggb2JqICkgfHwgaXNXaW5kb3coIG9iaiApICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB0eXBlID09PSBcImFycmF5XCIgfHwgbGVuZ3RoID09PSAwIHx8XG5cdFx0dHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajtcbn1cbnZhciBTaXp6bGUgPVxuLyohXG4gKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2Mi4zLjVcbiAqIGh0dHBzOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cHM6Ly9qcy5mb3VuZGF0aW9uL1xuICpcbiAqIERhdGU6IDIwMjAtMDMtMTRcbiAqL1xuKCBmdW5jdGlvbiggd2luZG93ICkge1xudmFyIGksXG5cdHN1cHBvcnQsXG5cdEV4cHIsXG5cdGdldFRleHQsXG5cdGlzWE1MLFxuXHR0b2tlbml6ZSxcblx0Y29tcGlsZSxcblx0c2VsZWN0LFxuXHRvdXRlcm1vc3RDb250ZXh0LFxuXHRzb3J0SW5wdXQsXG5cdGhhc0R1cGxpY2F0ZSxcblxuXHQvLyBMb2NhbCBkb2N1bWVudCB2YXJzXG5cdHNldERvY3VtZW50LFxuXHRkb2N1bWVudCxcblx0ZG9jRWxlbSxcblx0ZG9jdW1lbnRJc0hUTUwsXG5cdHJidWdneVFTQSxcblx0cmJ1Z2d5TWF0Y2hlcyxcblx0bWF0Y2hlcyxcblx0Y29udGFpbnMsXG5cblx0Ly8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YVxuXHRleHBhbmRvID0gXCJzaXp6bGVcIiArIDEgKiBuZXcgRGF0ZSgpLFxuXHRwcmVmZXJyZWREb2MgPSB3aW5kb3cuZG9jdW1lbnQsXG5cdGRpcnJ1bnMgPSAwLFxuXHRkb25lID0gMCxcblx0Y2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRjb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0bm9ubmF0aXZlU2VsZWN0b3JDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9LFxuXG5cdC8vIEluc3RhbmNlIG1ldGhvZHNcblx0aGFzT3duID0gKCB7fSApLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaE5hdGl2ZSA9IGFyci5wdXNoLFxuXHRwdXNoID0gYXJyLnB1c2gsXG5cdHNsaWNlID0gYXJyLnNsaWNlLFxuXG5cdC8vIFVzZSBhIHN0cmlwcGVkLWRvd24gaW5kZXhPZiBhcyBpdCdzIGZhc3RlciB0aGFuIG5hdGl2ZVxuXHQvLyBodHRwczovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81XG5cdGluZGV4T2YgPSBmdW5jdGlvbiggbGlzdCwgZWxlbSApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRsZW4gPSBsaXN0Lmxlbmd0aDtcblx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGlmICggbGlzdFsgaSBdID09PSBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9LFxuXG5cdGJvb2xlYW5zID0gXCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58XCIgK1xuXHRcdFwiaXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLFxuXG5cdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZVxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxuXG5cdC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3Mtc3ludGF4LTMvI2lkZW50LXRva2VuLWRpYWdyYW1cblx0aWRlbnRpZmllciA9IFwiKD86XFxcXFxcXFxbXFxcXGRhLWZBLUZdezEsNn1cIiArIHdoaXRlc3BhY2UgK1xuXHRcdFwiP3xcXFxcXFxcXFteXFxcXHJcXFxcblxcXFxmXXxbXFxcXHctXXxbXlxcMC1cXFxceDdmXSkrXCIsXG5cblx0Ly8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzXG5cdGF0dHJpYnV0ZXMgPSBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKFwiICsgaWRlbnRpZmllciArIFwiKSg/OlwiICsgd2hpdGVzcGFjZSArXG5cblx0XHQvLyBPcGVyYXRvciAoY2FwdHVyZSAyKVxuXHRcdFwiKihbKl4kfCF+XT89KVwiICsgd2hpdGVzcGFjZSArXG5cblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV1cblx0XHQvLyBvciBzdHJpbmdzIFtjYXB0dXJlIDMgb3IgY2FwdHVyZSA0XVwiXG5cdFx0XCIqKD86JygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwifChcIiArIGlkZW50aWZpZXIgKyBcIikpfClcIiArXG5cdFx0d2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsXG5cblx0cHNldWRvcyA9IFwiOihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcXFxcKChcIiArXG5cblx0XHQvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgcHJlRmlsdGVyLCBwcmVmZXIgYXJndW1lbnRzOlxuXHRcdC8vIDEuIHF1b3RlZCAoY2FwdHVyZSAzOyBjYXB0dXJlIDQgb3IgY2FwdHVyZSA1KVxuXHRcdFwiKCcoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcIil8XCIgK1xuXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXG5cdFx0Ly8gMy4gYW55dGhpbmcgZWxzZSAoY2FwdHVyZSAyKVxuXHRcdFwiLipcIiArXG5cdFx0XCIpXFxcXCl8KVwiLFxuXG5cdC8vIExlYWRpbmcgYW5kIG5vbi1lc2NhcGVkIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGNhcHR1cmluZyBzb21lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMgcHJlY2VkaW5nIHRoZSBsYXR0ZXJcblx0cndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgXCIrXCIsIFwiZ1wiICksXG5cdHJ0cmltID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIrfCgoPzpefFteXFxcXFxcXFxdKSg/OlxcXFxcXFxcLikqKVwiICtcblx0XHR3aGl0ZXNwYWNlICsgXCIrJFwiLCBcImdcIiApLFxuXG5cdHJjb21tYSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKixcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXHRyY29tYmluYXRvcnMgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiooWz4rfl18XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcIiApLFxuXHRyZGVzY2VuZCA9IG5ldyBSZWdFeHAoIHdoaXRlc3BhY2UgKyBcInw+XCIgKSxcblxuXHRycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLFxuXHRyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoIFwiXlwiICsgaWRlbnRpZmllciArIFwiJFwiICksXG5cblx0bWF0Y2hFeHByID0ge1xuXHRcdFwiSURcIjogbmV3IFJlZ0V4cCggXCJeIyhcIiArIGlkZW50aWZpZXIgKyBcIilcIiApLFxuXHRcdFwiQ0xBU1NcIjogbmV3IFJlZ0V4cCggXCJeXFxcXC4oXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIlRBR1wiOiBuZXcgUmVnRXhwKCBcIl4oXCIgKyBpZGVudGlmaWVyICsgXCJ8WypdKVwiICksXG5cdFx0XCJBVFRSXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgYXR0cmlidXRlcyApLFxuXHRcdFwiUFNFVURPXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgcHNldWRvcyApLFxuXHRcdFwiQ0hJTERcIjogbmV3IFJlZ0V4cCggXCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXFxcKFwiICtcblx0XHRcdHdoaXRlc3BhY2UgKyBcIiooZXZlbnxvZGR8KChbKy1dfCkoXFxcXGQqKW58KVwiICsgd2hpdGVzcGFjZSArIFwiKig/OihbKy1dfClcIiArXG5cdFx0XHR3aGl0ZXNwYWNlICsgXCIqKFxcXFxkKyl8KSlcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpXCIsIFwiaVwiICksXG5cdFx0XCJib29sXCI6IG5ldyBSZWdFeHAoIFwiXig/OlwiICsgYm9vbGVhbnMgKyBcIikkXCIsIFwiaVwiICksXG5cblx0XHQvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKClcblx0XHQvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgXG5cdFx0XCJuZWVkc0NvbnRleHRcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKCg/Oi1cXFxcZCk/XFxcXGQqKVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFwpfCkoPz1bXi1dfCQpXCIsIFwiaVwiIClcblx0fSxcblxuXHRyaHRtbCA9IC9IVE1MJC9pLFxuXHRyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxcblx0cmhlYWRlciA9IC9eaFxcZCQvaSxcblxuXHRybmF0aXZlID0gL15bXntdK1xce1xccypcXFtuYXRpdmUgXFx3LyxcblxuXHQvLyBFYXNpbHktcGFyc2VhYmxlL3JldHJpZXZhYmxlIElEIG9yIFRBRyBvciBDTEFTUyBzZWxlY3RvcnNcblx0cnF1aWNrRXhwciA9IC9eKD86IyhbXFx3LV0rKXwoXFx3Kyl8XFwuKFtcXHctXSspKSQvLFxuXG5cdHJzaWJsaW5nID0gL1srfl0vLFxuXG5cdC8vIENTUyBlc2NhcGVzXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnNcblx0cnVuZXNjYXBlID0gbmV3IFJlZ0V4cCggXCJcXFxcXFxcXFtcXFxcZGEtZkEtRl17MSw2fVwiICsgd2hpdGVzcGFjZSArIFwiP3xcXFxcXFxcXChbXlxcXFxyXFxcXG5cXFxcZl0pXCIsIFwiZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBlc2NhcGUsIG5vbkhleCApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZS5zbGljZSggMSApIC0gMHgxMDAwMDtcblxuXHRcdHJldHVybiBub25IZXggP1xuXG5cdFx0XHQvLyBTdHJpcCB0aGUgYmFja3NsYXNoIHByZWZpeCBmcm9tIGEgbm9uLWhleCBlc2NhcGUgc2VxdWVuY2Vcblx0XHRcdG5vbkhleCA6XG5cblx0XHRcdC8vIFJlcGxhY2UgYSBoZXhhZGVjaW1hbCBlc2NhcGUgc2VxdWVuY2Ugd2l0aCB0aGUgZW5jb2RlZCBVbmljb2RlIGNvZGUgcG9pbnRcblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTErXG5cdFx0XHQvLyBGb3IgdmFsdWVzIG91dHNpZGUgdGhlIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSAoQk1QKSwgbWFudWFsbHkgY29uc3RydWN0IGFcblx0XHRcdC8vIHN1cnJvZ2F0ZSBwYWlyXG5cdFx0XHRoaWdoIDwgMCA/XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoID4+IDEwIHwgMHhEODAwLCBoaWdoICYgMHgzRkYgfCAweERDMDAgKTtcblx0fSxcblxuXHQvLyBDU1Mgc3RyaW5nL2lkZW50aWZpZXIgc2VyaWFsaXphdGlvblxuXHQvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI2NvbW1vbi1zZXJpYWxpemluZy1pZGlvbXNcblx0cmNzc2VzY2FwZSA9IC8oW1xcMC1cXHgxZlxceDdmXXxeLT9cXGQpfF4tJHxbXlxcMC1cXHgxZlxceDdmLVxcdUZGRkZcXHctXS9nLFxuXHRmY3NzZXNjYXBlID0gZnVuY3Rpb24oIGNoLCBhc0NvZGVQb2ludCApIHtcblx0XHRpZiAoIGFzQ29kZVBvaW50ICkge1xuXG5cdFx0XHQvLyBVKzAwMDAgTlVMTCBiZWNvbWVzIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVJcblx0XHRcdGlmICggY2ggPT09IFwiXFwwXCIgKSB7XG5cdFx0XHRcdHJldHVybiBcIlxcdUZGRkRcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udHJvbCBjaGFyYWN0ZXJzIGFuZCAoZGVwZW5kZW50IHVwb24gcG9zaXRpb24pIG51bWJlcnMgZ2V0IGVzY2FwZWQgYXMgY29kZSBwb2ludHNcblx0XHRcdHJldHVybiBjaC5zbGljZSggMCwgLTEgKSArIFwiXFxcXFwiICtcblx0XHRcdFx0Y2guY2hhckNvZGVBdCggY2gubGVuZ3RoIC0gMSApLnRvU3RyaW5nKCAxNiApICsgXCIgXCI7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXIgcG90ZW50aWFsbHktc3BlY2lhbCBBU0NJSSBjaGFyYWN0ZXJzIGdldCBiYWNrc2xhc2gtZXNjYXBlZFxuXHRcdHJldHVybiBcIlxcXFxcIiArIGNoO1xuXHR9LFxuXG5cdC8vIFVzZWQgZm9yIGlmcmFtZXNcblx0Ly8gU2VlIHNldERvY3VtZW50KClcblx0Ly8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgXCJQZXJtaXNzaW9uIERlbmllZFwiXG5cdC8vIGVycm9yIGluIElFXG5cdHVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcblx0XHRzZXREb2N1bWVudCgpO1xuXHR9LFxuXG5cdGluRGlzYWJsZWRGaWVsZHNldCA9IGFkZENvbWJpbmF0b3IoXG5cdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiZmllbGRzZXRcIjtcblx0XHR9LFxuXHRcdHsgZGlyOiBcInBhcmVudE5vZGVcIiwgbmV4dDogXCJsZWdlbmRcIiB9XG5cdCk7XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdCggYXJyID0gc2xpY2UuY2FsbCggcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMgKSApLFxuXHRcdHByZWZlcnJlZERvYy5jaGlsZE5vZGVzXG5cdCk7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjBcblx0Ly8gRGV0ZWN0IHNpbGVudGx5IGZhaWxpbmcgcHVzaC5hcHBseVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoTmF0aXZlLmFwcGx5KCB0YXJnZXQsIHNsaWNlLmNhbGwoIGVscyApICk7XG5cdFx0fSA6XG5cblx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0Ly8gT3RoZXJ3aXNlIGFwcGVuZCBkaXJlY3RseVxuXHRcdGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHtcblx0XHRcdHZhciBqID0gdGFyZ2V0Lmxlbmd0aCxcblx0XHRcdFx0aSA9IDA7XG5cblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAoIHRhcmdldFsgaisrIF0gPSBlbHNbIGkrKyBdICkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbWF0Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsXG5cdFx0bmV3Q29udGV4dCA9IGNvbnRleHQgJiYgY29udGV4dC5vd25lckRvY3VtZW50LFxuXG5cdFx0Ly8gbm9kZVR5cGUgZGVmYXVsdHMgdG8gOSwgc2luY2UgY29udGV4dCBkZWZhdWx0cyB0byBkb2N1bWVudFxuXHRcdG5vZGVUeXBlID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5O1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFJldHVybiBlYXJseSBmcm9tIGNhbGxzIHdpdGggaW52YWxpZCBzZWxlY3RvciBvciBjb250ZXh0XG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0Ly8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50c1xuXHRpZiAoICFzZWVkICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdFx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XG5cblx0XHRpZiAoIGRvY3VtZW50SXNIVE1MICkge1xuXG5cdFx0XHQvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgXCJnZXQqQnkqXCIgRE9NIG1ldGhvZFxuXHRcdFx0Ly8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KVxuXHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMTEgJiYgKCBtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSApICkge1xuXG5cdFx0XHRcdC8vIElEIHNlbGVjdG9yXG5cdFx0XHRcdGlmICggKCBtID0gbWF0Y2hbIDEgXSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRG9jdW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdGlmICggbm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSApICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHRcdC8vIGdldEVsZW1lbnRCeUlkIGNhbiBtYXRjaCBlbGVtZW50cyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdFx0aWYgKCBlbGVtLmlkID09PSBtICkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEVsZW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHQvLyBUT0RPOiBpZGVudGlmeSB2ZXJzaW9uc1xuXHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0aWYgKCBuZXdDb250ZXh0ICYmICggZWxlbSA9IG5ld0NvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSApICYmXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbS5pZCA9PT0gbSApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFR5cGUgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbIDIgXSApIHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBzZWxlY3RvciApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdFx0Ly8gQ2xhc3Mgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggKCBtID0gbWF0Y2hbIDMgXSApICYmIHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJlxuXHRcdFx0XHRcdGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGFrZSBhZHZhbnRhZ2Ugb2YgcXVlcnlTZWxlY3RvckFsbFxuXHRcdFx0aWYgKCBzdXBwb3J0LnFzYSAmJlxuXHRcdFx0XHQhbm9ubmF0aXZlU2VsZWN0b3JDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdICYmXG5cdFx0XHRcdCggIXJidWdneVFTQSB8fCAhcmJ1Z2d5UVNBLnRlc3QoIHNlbGVjdG9yICkgKSAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDggb25seVxuXHRcdFx0XHQvLyBFeGNsdWRlIG9iamVjdCBlbGVtZW50c1xuXHRcdFx0XHQoIG5vZGVUeXBlICE9PSAxIHx8IGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJvYmplY3RcIiApICkge1xuXG5cdFx0XHRcdG5ld1NlbGVjdG9yID0gc2VsZWN0b3I7XG5cdFx0XHRcdG5ld0NvbnRleHQgPSBjb250ZXh0O1xuXG5cdFx0XHRcdC8vIHFTQSBjb25zaWRlcnMgZWxlbWVudHMgb3V0c2lkZSBhIHNjb3Bpbmcgcm9vdCB3aGVuIGV2YWx1YXRpbmcgY2hpbGQgb3Jcblx0XHRcdFx0Ly8gZGVzY2VuZGFudCBjb21iaW5hdG9ycywgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudC5cblx0XHRcdFx0Ly8gSW4gc3VjaCBjYXNlcywgd2Ugd29yayBhcm91bmQgdGhlIGJlaGF2aW9yIGJ5IHByZWZpeGluZyBldmVyeSBzZWxlY3RvciBpbiB0aGVcblx0XHRcdFx0Ly8gbGlzdCB3aXRoIGFuIElEIHNlbGVjdG9yIHJlZmVyZW5jaW5nIHRoZSBzY29wZSBjb250ZXh0LlxuXHRcdFx0XHQvLyBUaGUgdGVjaG5pcXVlIGhhcyB0byBiZSB1c2VkIGFzIHdlbGwgd2hlbiBhIGxlYWRpbmcgY29tYmluYXRvciBpcyB1c2VkXG5cdFx0XHRcdC8vIGFzIHN1Y2ggc2VsZWN0b3JzIGFyZSBub3QgcmVjb2duaXplZCBieSBxdWVyeVNlbGVjdG9yQWxsLlxuXHRcdFx0XHQvLyBUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhpcyB0ZWNobmlxdWUuXG5cdFx0XHRcdGlmICggbm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHQoIHJkZXNjZW5kLnRlc3QoIHNlbGVjdG9yICkgfHwgcmNvbWJpbmF0b3JzLnRlc3QoIHNlbGVjdG9yICkgKSApIHtcblxuXHRcdFx0XHRcdC8vIEV4cGFuZCBjb250ZXh0IGZvciBzaWJsaW5nIHNlbGVjdG9yc1xuXHRcdFx0XHRcdG5ld0NvbnRleHQgPSByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fFxuXHRcdFx0XHRcdFx0Y29udGV4dDtcblxuXHRcdFx0XHRcdC8vIFdlIGNhbiB1c2UgOnNjb3BlIGluc3RlYWQgb2YgdGhlIElEIGhhY2sgaWYgdGhlIGJyb3dzZXJcblx0XHRcdFx0XHQvLyBzdXBwb3J0cyBpdCAmIGlmIHdlJ3JlIG5vdCBjaGFuZ2luZyB0aGUgY29udGV4dC5cblx0XHRcdFx0XHRpZiAoIG5ld0NvbnRleHQgIT09IGNvbnRleHQgfHwgIXN1cHBvcnQuc2NvcGUgKSB7XG5cblx0XHRcdFx0XHRcdC8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0XHRpZiAoICggbmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoIFwiaWRcIiApICkgKSB7XG5cdFx0XHRcdFx0XHRcdG5pZCA9IG5pZC5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0LnNldEF0dHJpYnV0ZSggXCJpZFwiLCAoIG5pZCA9IGV4cGFuZG8gKSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZWZpeCBldmVyeSBzZWxlY3RvciBpbiB0aGUgbGlzdFxuXHRcdFx0XHRcdGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdFx0XHRcdGkgPSBncm91cHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0Z3JvdXBzWyBpIF0gPSAoIG5pZCA/IFwiI1wiICsgbmlkIDogXCI6c2NvcGVcIiApICsgXCIgXCIgK1xuXHRcdFx0XHRcdFx0XHR0b1NlbGVjdG9yKCBncm91cHNbIGkgXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCBcIixcIiApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0bmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0fSBjYXRjaCAoIHFzYUVycm9yICkge1xuXHRcdFx0XHRcdG5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGUoIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0aWYgKCBuaWQgPT09IGV4cGFuZG8gKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cblx0XHQvLyBVc2UgKGtleSArIFwiIFwiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KVxuXHRcdGlmICgga2V5cy5wdXNoKCBrZXkgKyBcIiBcIiApID4gRXhwci5jYWNoZUxlbmd0aCApIHtcblxuXHRcdFx0Ly8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVzXG5cdFx0XHRkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdO1xuXHRcdH1cblx0XHRyZXR1cm4gKCBjYWNoZVsga2V5ICsgXCIgXCIgXSA9IHZhbHVlICk7XG5cdH1cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZmllbGRzZXRcIiApO1xuXG5cdHRyeSB7XG5cdFx0cmV0dXJuICEhZm4oIGVsICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBmaW5hbGx5IHtcblxuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZWwucGFyZW50Tm9kZSApIHtcblx0XHRcdGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsICk7XG5cdFx0fVxuXG5cdFx0Ly8gcmVsZWFzZSBtZW1vcnkgaW4gSUVcblx0XHRlbCA9IG51bGw7XG5cdH1cbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBzYW1lIGhhbmRsZXIgZm9yIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGF0dHJzXG4gKiBAcGFyYW0ge1N0cmluZ30gYXR0cnMgUGlwZS1zZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWRcbiAqL1xuZnVuY3Rpb24gYWRkSGFuZGxlKCBhdHRycywgaGFuZGxlciApIHtcblx0dmFyIGFyciA9IGF0dHJzLnNwbGl0KCBcInxcIiApLFxuXHRcdGkgPSBhcnIubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdEV4cHIuYXR0ckhhbmRsZVsgYXJyWyBpIF0gXSA9IGhhbmRsZXI7XG5cdH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZG9jdW1lbnQgb3JkZXIgb2YgdHdvIHNpYmxpbmdzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGFcbiAqIEBwYXJhbSB7RWxlbWVudH0gYlxuICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBsZXNzIHRoYW4gMCBpZiBhIHByZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9sbG93cyBiXG4gKi9cbmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHtcblx0dmFyIGN1ciA9IGIgJiYgYSxcblx0XHRkaWZmID0gY3VyICYmIGEubm9kZVR5cGUgPT09IDEgJiYgYi5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0YS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7XG5cblx0Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzXG5cdGlmICggZGlmZiApIHtcblx0XHRyZXR1cm4gZGlmZjtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGIgZm9sbG93cyBhXG5cdGlmICggY3VyICkge1xuXHRcdHdoaWxlICggKCBjdXIgPSBjdXIubmV4dFNpYmxpbmcgKSApIHtcblx0XHRcdGlmICggY3VyID09PSBiICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGEgPyAxIDogLTE7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHJldHVybiAoIG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiICkgJiYgZWxlbS50eXBlID09PSB0eXBlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRpc2FibGVkIHRydWUgZm9yIDpkaXNhYmxlZDsgZmFsc2UgZm9yIDplbmFibGVkXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHtcblxuXHQvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGVcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkXG5cdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWRcblx0XHRpZiAoIFwiZm9ybVwiIGluIGVsZW0gKSB7XG5cblx0XHRcdC8vIENoZWNrIGZvciBpbmhlcml0ZWQgZGlzYWJsZWRuZXNzIG9uIHJlbGV2YW50IG5vbi1kaXNhYmxlZCBlbGVtZW50czpcblx0XHRcdC8vICogbGlzdGVkIGZvcm0tYXNzb2NpYXRlZCBlbGVtZW50cyBpbiBhIGRpc2FibGVkIGZpZWxkc2V0XG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1mZS1kaXNhYmxlZFxuXHRcdFx0Ly8gKiBvcHRpb24gZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0Ly8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkXG5cdFx0XHQvLyBBbGwgc3VjaCBlbGVtZW50cyBoYXZlIGEgXCJmb3JtXCIgcHJvcGVydHkuXG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSAmJiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHQvLyBPcHRpb24gZWxlbWVudHMgZGVmZXIgdG8gYSBwYXJlbnQgb3B0Z3JvdXAgaWYgcHJlc2VudFxuXHRcdFx0XHRpZiAoIFwibGFiZWxcIiBpbiBlbGVtICkge1xuXHRcdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLnBhcmVudE5vZGUuZGlzYWJsZWQgPT09IGRpc2FibGVkO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDExXG5cdFx0XHRcdC8vIFVzZSB0aGUgaXNEaXNhYmxlZCBzaG9ydGN1dCBwcm9wZXJ0eSB0byBjaGVjayBmb3IgZGlzYWJsZWQgZmllbGRzZXQgYW5jZXN0b3JzXG5cdFx0XHRcdHJldHVybiBlbGVtLmlzRGlzYWJsZWQgPT09IGRpc2FibGVkIHx8XG5cblx0XHRcdFx0XHQvLyBXaGVyZSB0aGVyZSBpcyBubyBpc0Rpc2FibGVkLCBjaGVjayBtYW51YWxseVxuXHRcdFx0XHRcdC8qIGpzaGludCAtVzAxOCAqL1xuXHRcdFx0XHRcdGVsZW0uaXNEaXNhYmxlZCAhPT0gIWRpc2FibGVkICYmXG5cdFx0XHRcdFx0aW5EaXNhYmxlZEZpZWxkc2V0KCBlbGVtICkgPT09IGRpc2FibGVkO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cblx0XHQvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuXG5cdFx0Ly8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0XG5cdFx0Ly8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuXG5cdFx0fSBlbHNlIGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVtYWluaW5nIGVsZW1lbnRzIGFyZSBuZWl0aGVyIDplbmFibGVkIG5vciA6ZGlzYWJsZWRcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFsc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBhcmd1bWVudCApIHtcblx0XHRhcmd1bWVudCA9ICthcmd1bWVudDtcblx0XHRyZXR1cm4gbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoIGogPSBtYXRjaEluZGV4ZXNbIGkgXSApIF0gKSB7XG5cdFx0XHRcdFx0c2VlZFsgaiBdID0gISggbWF0Y2hlc1sgaiBdID0gc2VlZFsgaiBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0gKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgYSBub2RlIGZvciB2YWxpZGl0eSBhcyBhIFNpenpsZSBjb250ZXh0XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dFxuICogQHJldHVybnMge0VsZW1lbnR8T2JqZWN0fEJvb2xlYW59IFRoZSBpbnB1dCBub2RlIGlmIGFjY2VwdGFibGUsIG90aGVyd2lzZSBhIGZhbHN5IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkge1xuXHRyZXR1cm4gY29udGV4dCAmJiB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb250ZXh0O1xufVxuXG4vLyBFeHBvc2Ugc3VwcG9ydCB2YXJzIGZvciBjb252ZW5pZW5jZVxuc3VwcG9ydCA9IFNpenpsZS5zdXBwb3J0ID0ge307XG5cbi8qKlxuICogRGV0ZWN0cyBYTUwgbm9kZXNcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50XG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZmYgZWxlbSBpcyBhIG5vbi1IVE1MIFhNTCBub2RlXG4gKi9cbmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBuYW1lc3BhY2UgPSBlbGVtLm5hbWVzcGFjZVVSSSxcblx0XHRkb2NFbGVtID0gKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApLmRvY3VtZW50RWxlbWVudDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PThcblx0Ly8gQXNzdW1lIEhUTUwgd2hlbiBkb2N1bWVudEVsZW1lbnQgZG9lc24ndCB5ZXQgZXhpc3QsIHN1Y2ggYXMgaW5zaWRlIGxvYWRpbmcgaWZyYW1lc1xuXHQvLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvNDgzM1xuXHRyZXR1cm4gIXJodG1sLnRlc3QoIG5hbWVzcGFjZSB8fCBkb2NFbGVtICYmIGRvY0VsZW0ubm9kZU5hbWUgfHwgXCJIVE1MXCIgKTtcbn07XG5cbi8qKlxuICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5zZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkge1xuXHR2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZFxuXHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRpZiAoIGRvYyA9PSBkb2N1bWVudCB8fCBkb2Mubm9kZVR5cGUgIT09IDkgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQgKSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50O1xuXHR9XG5cblx0Ly8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZXNcblx0ZG9jdW1lbnQgPSBkb2M7XG5cdGRvY0VsZW0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cdGRvY3VtZW50SXNIVE1MID0gIWlzWE1MKCBkb2N1bWVudCApO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTIgLSAxOCtcblx0Ly8gQWNjZXNzaW5nIGlmcmFtZSBkb2N1bWVudHMgYWZ0ZXIgdW5sb2FkIHRocm93cyBcInBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3JzIChqUXVlcnkgIzEzOTM2KVxuXHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRpZiAoIHByZWZlcnJlZERvYyAhPSBkb2N1bWVudCAmJlxuXHRcdCggc3ViV2luZG93ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcgKSAmJiBzdWJXaW5kb3cudG9wICE9PSBzdWJXaW5kb3cgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMSwgRWRnZVxuXHRcdGlmICggc3ViV2luZG93LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciwgZmFsc2UgKTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5XG5cdFx0fSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0c3ViV2luZG93LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRSA4IC0gMTErLCBFZGdlIDEyIC0gMTgrLCBDaHJvbWUgPD0xNiAtIDI1IG9ubHksIEZpcmVmb3ggPD0zLjYgLSAzMSBvbmx5LFxuXHQvLyBTYWZhcmkgNCAtIDUgb25seSwgT3BlcmEgPD0xMS42IC0gMTIueCBvbmx5XG5cdC8vIElFL0VkZ2UgJiBvbGRlciBicm93c2VycyBkb24ndCBzdXBwb3J0IHRoZSA6c2NvcGUgcHNldWRvLWNsYXNzLlxuXHQvLyBTdXBwb3J0OiBTYWZhcmkgNi4wIG9ubHlcblx0Ly8gU2FmYXJpIDYuMCBzdXBwb3J0cyA6c2NvcGUgYnV0IGl0J3MgYW4gYWxpYXMgb2YgOnJvb3QgdGhlcmUuXG5cdHN1cHBvcnQuc2NvcGUgPSBhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKTtcblx0XHRyZXR1cm4gdHlwZW9mIGVsLnF1ZXJ5U2VsZWN0b3JBbGwgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRcdCFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIjpzY29wZSBmaWVsZHNldCBkaXZcIiApLmxlbmd0aDtcblx0fSApO1xuXG5cdC8qIEF0dHJpYnV0ZXNcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIFN1cHBvcnQ6IElFPDhcblx0Ly8gVmVyaWZ5IHRoYXQgZ2V0QXR0cmlidXRlIHJlYWxseSByZXR1cm5zIGF0dHJpYnV0ZXMgYW5kIG5vdCBwcm9wZXJ0aWVzXG5cdC8vIChleGNlcHRpbmcgSUU4IGJvb2xlYW5zKVxuXHRzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5jbGFzc05hbWUgPSBcImlcIjtcblx0XHRyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZSggXCJjbGFzc05hbWVcIiApO1xuXHR9ICk7XG5cblx0LyogZ2V0RWxlbWVudChzKUJ5KlxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpIHJldHVybnMgb25seSBlbGVtZW50c1xuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID0gYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cdFx0ZWwuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIFwiXCIgKSApO1xuXHRcdHJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwiKlwiICkubGVuZ3RoO1xuXHR9ICk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbW1hdGljYWxseS1zZXQgbmFtZXMsXG5cdC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdFxuXHRzdXBwb3J0LmdldEJ5SWQgPSBhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlkID0gZXhwYW5kbztcblx0XHRyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDtcblx0fSApO1xuXG5cdC8vIElEIGZpbHRlciBhbmQgZmluZFxuXHRpZiAoIHN1cHBvcnQuZ2V0QnlJZCApIHtcblx0XHRFeHByLmZpbHRlclsgXCJJRFwiIF0gPSBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBcImlkXCIgKSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXHRcdEV4cHIuZmluZFsgXCJJRFwiIF0gPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0XHR2YXIgZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7XG5cdFx0XHRcdHJldHVybiBlbGVtID8gWyBlbGVtIF0gOiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdEV4cHIuZmlsdGVyWyBcIklEXCIgXSA9ICBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBcImlkXCIgKTtcblx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDcgb25seVxuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRFeHByLmZpbmRbIFwiSURcIiBdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIG5vZGUsIGksIGVsZW1zLFxuXHRcdFx0XHRcdGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXG5cdFx0XHRcdGlmICggZWxlbSApIHtcblxuXHRcdFx0XHRcdC8vIFZlcmlmeSB0aGUgaWQgYXR0cmlidXRlXG5cdFx0XHRcdFx0bm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0aWYgKCBub2RlICYmIG5vZGUudmFsdWUgPT09IGlkICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEZhbGwgYmFjayBvbiBnZXRFbGVtZW50c0J5TmFtZVxuXHRcdFx0XHRcdGVsZW1zID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggaWQgKTtcblx0XHRcdFx0XHRpID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggZWxlbSA9IGVsZW1zWyBpKysgXSApICkge1xuXHRcdFx0XHRcdFx0bm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBbIGVsZW0gXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8vIFRhZ1xuXHRFeHByLmZpbmRbIFwiVEFHXCIgXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgP1xuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgZG9uJ3QgaGF2ZSBnRUJUTlxuXHRcdFx0fSBlbHNlIGlmICggc3VwcG9ydC5xc2EgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyApO1xuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHR0bXAgPSBbXSxcblx0XHRcdFx0aSA9IDAsXG5cblx0XHRcdFx0Ly8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvb1xuXHRcdFx0XHRyZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIEZpbHRlciBvdXQgcG9zc2libGUgY29tbWVudHNcblx0XHRcdGlmICggdGFnID09PSBcIipcIiApIHtcblx0XHRcdFx0d2hpbGUgKCAoIGVsZW0gPSByZXN1bHRzWyBpKysgXSApICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdHRtcC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRtcDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdH07XG5cblx0Ly8gQ2xhc3Ncblx0RXhwci5maW5kWyBcIkNMQVNTXCIgXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkge1xuXHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApO1xuXHRcdH1cblx0fTtcblxuXHQvKiBRU0EvbWF0Y2hlc1NlbGVjdG9yXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBRU0EgYW5kIG1hdGNoZXNTZWxlY3RvciBzdXBwb3J0XG5cblx0Ly8gbWF0Y2hlc1NlbGVjdG9yKDphY3RpdmUpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChJRTkvT3BlcmEgMTEuNSlcblx0cmJ1Z2d5TWF0Y2hlcyA9IFtdO1xuXG5cdC8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpXG5cdC8vIFdlIGFsbG93IHRoaXMgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBJRTgvOSB0aGF0IHRocm93cyBhbiBlcnJvclxuXHQvLyB3aGVuZXZlciBgZG9jdW1lbnQuYWN0aXZlRWxlbWVudGAgaXMgYWNjZXNzZWQgb24gYW4gaWZyYW1lXG5cdC8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yXG5cdC8vIFNlZSBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTMzNzhcblx0cmJ1Z2d5UVNBID0gW107XG5cblx0aWYgKCAoIHN1cHBvcnQucXNhID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkgKSApIHtcblxuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxuXHRcdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0XHRhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblxuXHRcdFx0dmFyIGlucHV0O1xuXG5cdFx0XHQvLyBTZWxlY3QgaXMgc2V0IHRvIGVtcHR5IHN0cmluZyBvbiBwdXJwb3NlXG5cdFx0XHQvLyBUaGlzIGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90IGV4cGxpY2l0bHlcblx0XHRcdC8vIHNldHRpbmcgYSBib29sZWFuIGNvbnRlbnQgYXR0cmlidXRlLFxuXHRcdFx0Ly8gc2luY2UgaXRzIHByZXNlbmNlIHNob3VsZCBiZSBlbm91Z2hcblx0XHRcdC8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OVxuXHRcdFx0ZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5pbm5lckhUTUwgPSBcIjxhIGlkPSdcIiArIGV4cGFuZG8gKyBcIic+PC9hPlwiICtcblx0XHRcdFx0XCI8c2VsZWN0IGlkPSdcIiArIGV4cGFuZG8gKyBcIi1cXHJcXFxcJyBtc2FsbG93Y2FwdHVyZT0nJz5cIiArXG5cdFx0XHRcdFwiPG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD5cIjtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4LCBPcGVyYSAxMS0xMi4xNlxuXHRcdFx0Ly8gTm90aGluZyBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBlbXB0eSBzdHJpbmdzIGZvbGxvdyBePSBvciAkPSBvciAqPVxuXHRcdFx0Ly8gVGhlIHRlc3QgYXR0cmlidXRlIG11c3QgYmUgdW5rbm93biBpbiBPcGVyYSBidXQgXCJzYWZlXCIgZm9yIFdpblJUXG5cdFx0XHQvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2hoNDY1Mzg4LmFzcHgjYXR0cmlidXRlX3NlY3Rpb25cblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbCggXCJbbXNhbGxvd2NhcHR1cmVePScnXVwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJbKl4kXT1cIiArIHdoaXRlc3BhY2UgKyBcIiooPzonJ3xcXFwiXFxcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRThcblx0XHRcdC8vIEJvb2xlYW4gYXR0cmlidXRlcyBhbmQgXCJ2YWx1ZVwiIGFyZSBub3QgdHJlYXRlZCBjb3JyZWN0bHlcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW3NlbGVjdGVkXVwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKig/OnZhbHVlfFwiICsgYm9vbGVhbnMgKyBcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWU8MjksIEFuZHJvaWQ8NC40LCBTYWZhcmk8Ny4wKywgaU9TPDcuMCssIFBoYW50b21KUzwxLjkuOCtcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIn49XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE1IC0gMTgrXG5cdFx0XHQvLyBJRSAxMS9FZGdlIGRvbid0IGZpbmQgZWxlbWVudHMgb24gYSBgW25hbWU9JyddYCBxdWVyeSBpbiBzb21lIGNhc2VzLlxuXHRcdFx0Ly8gQWRkaW5nIGEgdGVtcG9yYXJ5IGF0dHJpYnV0ZSB0byB0aGUgZG9jdW1lbnQgYmVmb3JlIHRoZSBzZWxlY3Rpb24gd29ya3Ncblx0XHRcdC8vIGFyb3VuZCB0aGUgaXNzdWUuXG5cdFx0XHQvLyBJbnRlcmVzdGluZ2x5LCBJRSAxMCAmIG9sZGVyIGRvbid0IHNlZW0gdG8gaGF2ZSB0aGUgaXNzdWUuXG5cdFx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJcIiApO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIltuYW1lPScnXVwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKm5hbWVcIiArIHdoaXRlc3BhY2UgKyBcIio9XCIgK1xuXHRcdFx0XHRcdHdoaXRlc3BhY2UgKyBcIiooPzonJ3xcXFwiXFxcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZWJraXQvT3BlcmEgLSA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIHNlbGVjdGVkIG9wdGlvbiBlbGVtZW50c1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIjpjaGVja2VkXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjpjaGVja2VkXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCtcblx0XHRcdC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzY4NTFcblx0XHRcdC8vIEluLXBhZ2UgYHNlbGVjdG9yI2lkIHNpYmxpbmctY29tYmluYXRvciBzZWxlY3RvcmAgZmFpbHNcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiYSNcIiArIGV4cGFuZG8gKyBcIisqXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIi4jLitbK35dXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTMuNiAtIDUgb25seVxuXHRcdFx0Ly8gT2xkIEZpcmVmb3ggZG9lc24ndCB0aHJvdyBvbiBhIGJhZGx5LWVzY2FwZWQgaWRlbnRpZmllci5cblx0XHRcdGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiXFxcXFxcZlwiICk7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJbXFxcXHJcXFxcblxcXFxmXVwiICk7XG5cdFx0fSApO1xuXG5cdFx0YXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cdFx0XHRlbC5pbm5lckhUTUwgPSBcIjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+XCIgK1xuXHRcdFx0XHRcIjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD5cIjtcblxuXHRcdFx0Ly8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzXG5cdFx0XHQvLyBUaGUgdHlwZSBhbmQgbmFtZSBhdHRyaWJ1dGVzIGFyZSByZXN0cmljdGVkIGR1cmluZyAuaW5uZXJIVE1MIGFzc2lnbm1lbnRcblx0XHRcdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJEXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGVcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbCggXCJbbmFtZT1kXVwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJuYW1lXCIgKyB3aGl0ZXNwYWNlICsgXCIqWypeJHwhfl0/PVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpXG5cdFx0XHQvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgYW5kIHdpbGwgbm90IHNlZSBsYXRlciB0ZXN0c1xuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIjplbmFibGVkXCIgKS5sZW5ndGggIT09IDIgKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjplbmFibGVkXCIsIFwiOmRpc2FibGVkXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU5LTExK1xuXHRcdFx0Ly8gSUUncyA6ZGlzYWJsZWQgc2VsZWN0b3IgZG9lcyBub3QgcGljayB1cCB0aGUgY2hpbGRyZW4gb2YgZGlzYWJsZWQgZmllbGRzZXRzXG5cdFx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmRpc2FibGVkID0gdHJ1ZTtcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbCggXCI6ZGlzYWJsZWRcIiApLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBPcGVyYSAxMCAtIDExIG9ubHlcblx0XHRcdC8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zXG5cdFx0XHRlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIiosOnhcIiApO1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiLC4qOlwiICk7XG5cdFx0fSApO1xuXHR9XG5cblx0aWYgKCAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yID0gcm5hdGl2ZS50ZXN0KCAoIG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHxcblx0XHRkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvciApICkgKSApIHtcblxuXHRcdGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXG5cdFx0XHQvLyBDaGVjayB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBkbyBtYXRjaGVzU2VsZWN0b3Jcblx0XHRcdC8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUgKElFIDkpXG5cdFx0XHRzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBlbCwgXCIqXCIgKTtcblxuXHRcdFx0Ly8gVGhpcyBzaG91bGQgZmFpbCB3aXRoIGFuIGV4Y2VwdGlvblxuXHRcdFx0Ly8gR2Vja28gZG9lcyBub3QgZXJyb3IsIHJldHVybnMgZmFsc2UgaW5zdGVhZFxuXHRcdFx0bWF0Y2hlcy5jYWxsKCBlbCwgXCJbcyE9JyddOnhcIiApO1xuXHRcdFx0cmJ1Z2d5TWF0Y2hlcy5wdXNoKCBcIiE9XCIsIHBzZXVkb3MgKTtcblx0XHR9ICk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKCBcInxcIiApICk7XG5cdHJidWdneU1hdGNoZXMgPSByYnVnZ3lNYXRjaGVzLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lNYXRjaGVzLmpvaW4oIFwifFwiICkgKTtcblxuXHQvKiBDb250YWluc1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cdGhhc0NvbXBhcmUgPSBybmF0aXZlLnRlc3QoIGRvY0VsZW0uY29tcGFyZURvY3VtZW50UG9zaXRpb24gKTtcblxuXHQvLyBFbGVtZW50IGNvbnRhaW5zIGFub3RoZXJcblx0Ly8gUHVycG9zZWZ1bGx5IHNlbGYtZXhjbHVzaXZlXG5cdC8vIEFzIGluLCBhbiBlbGVtZW50IGRvZXMgbm90IGNvbnRhaW4gaXRzZWxmXG5cdGNvbnRhaW5zID0gaGFzQ29tcGFyZSB8fCBybmF0aXZlLnRlc3QoIGRvY0VsZW0uY29udGFpbnMgKSA/XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHR2YXIgYWRvd24gPSBhLm5vZGVUeXBlID09PSA5ID8gYS5kb2N1bWVudEVsZW1lbnQgOiBhLFxuXHRcdFx0XHRidXAgPSBiICYmIGIucGFyZW50Tm9kZTtcblx0XHRcdHJldHVybiBhID09PSBidXAgfHwgISEoIGJ1cCAmJiBidXAubm9kZVR5cGUgPT09IDEgJiYgKFxuXHRcdFx0XHRhZG93bi5jb250YWlucyA/XG5cdFx0XHRcdFx0YWRvd24uY29udGFpbnMoIGJ1cCApIDpcblx0XHRcdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGJ1cCApICYgMTZcblx0XHRcdCkgKTtcblx0XHR9IDpcblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdGlmICggYiApIHtcblx0XHRcdFx0d2hpbGUgKCAoIGIgPSBiLnBhcmVudE5vZGUgKSApIHtcblx0XHRcdFx0XHRpZiAoIGIgPT09IGEgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdC8qIFNvcnRpbmdcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmdcblx0c29ydE9yZGVyID0gaGFzQ29tcGFyZSA/XG5cdGZ1bmN0aW9uKCBhLCBiICkge1xuXG5cdFx0Ly8gRmxhZyBmb3IgZHVwbGljYXRlIHJlbW92YWxcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0Ly8gU29ydCBvbiBtZXRob2QgZXhpc3RlbmNlIGlmIG9ubHkgb25lIGlucHV0IGhhcyBjb21wYXJlRG9jdW1lbnRQb3NpdGlvblxuXHRcdHZhciBjb21wYXJlID0gIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gLSAhYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtcblx0XHRpZiAoIGNvbXBhcmUgKSB7XG5cdFx0XHRyZXR1cm4gY29tcGFyZTtcblx0XHR9XG5cblx0XHQvLyBDYWxjdWxhdGUgcG9zaXRpb24gaWYgYm90aCBpbnB1dHMgYmVsb25nIHRvIHRoZSBzYW1lIGRvY3VtZW50XG5cdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRjb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09ICggYi5vd25lckRvY3VtZW50IHx8IGIgKSA/XG5cdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOlxuXG5cdFx0XHQvLyBPdGhlcndpc2Ugd2Uga25vdyB0aGV5IGFyZSBkaXNjb25uZWN0ZWRcblx0XHRcdDE7XG5cblx0XHQvLyBEaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRpZiAoIGNvbXBhcmUgJiAxIHx8XG5cdFx0XHQoICFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUgKSApIHtcblxuXHRcdFx0Ly8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50XG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdFx0aWYgKCBhID09IGRvY3VtZW50IHx8IGEub3duZXJEb2N1bWVudCA9PSBwcmVmZXJyZWREb2MgJiZcblx0XHRcdFx0Y29udGFpbnMoIHByZWZlcnJlZERvYywgYSApICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHRpZiAoIGIgPT0gZG9jdW1lbnQgfHwgYi5vd25lckRvY3VtZW50ID09IHByZWZlcnJlZERvYyAmJlxuXHRcdFx0XHRjb250YWlucyggcHJlZmVycmVkRG9jLCBiICkgKSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWludGFpbiBvcmlnaW5hbCBvcmRlclxuXHRcdFx0cmV0dXJuIHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29tcGFyZSAmIDQgPyAtMSA6IDE7XG5cdH0gOlxuXHRmdW5jdGlvbiggYSwgYiApIHtcblxuXHRcdC8vIEV4aXQgZWFybHkgaWYgdGhlIG5vZGVzIGFyZSBpZGVudGljYWxcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0YXVwID0gYS5wYXJlbnROb2RlLFxuXHRcdFx0YnVwID0gYi5wYXJlbnROb2RlLFxuXHRcdFx0YXAgPSBbIGEgXSxcblx0XHRcdGJwID0gWyBiIF07XG5cblx0XHQvLyBQYXJlbnRsZXNzIG5vZGVzIGFyZSBlaXRoZXIgZG9jdW1lbnRzIG9yIGRpc2Nvbm5lY3RlZFxuXHRcdGlmICggIWF1cCB8fCAhYnVwICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgZXFlcWVxICovXG5cdFx0XHRyZXR1cm4gYSA9PSBkb2N1bWVudCA/IC0xIDpcblx0XHRcdFx0YiA9PSBkb2N1bWVudCA/IDEgOlxuXHRcdFx0XHQvKiBlc2xpbnQtZW5hYmxlIGVxZXFlcSAqL1xuXHRcdFx0XHRhdXAgPyAtMSA6XG5cdFx0XHRcdGJ1cCA/IDEgOlxuXHRcdFx0XHRzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cblx0XHQvLyBJZiB0aGUgbm9kZXMgYXJlIHNpYmxpbmdzLCB3ZSBjYW4gZG8gYSBxdWljayBjaGVja1xuXHRcdH0gZWxzZSBpZiAoIGF1cCA9PT0gYnVwICkge1xuXHRcdFx0cmV0dXJuIHNpYmxpbmdDaGVjayggYSwgYiApO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uXG5cdFx0Y3VyID0gYTtcblx0XHR3aGlsZSAoICggY3VyID0gY3VyLnBhcmVudE5vZGUgKSApIHtcblx0XHRcdGFwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblx0XHRjdXIgPSBiO1xuXHRcdHdoaWxlICggKCBjdXIgPSBjdXIucGFyZW50Tm9kZSApICkge1xuXHRcdFx0YnAudW5zaGlmdCggY3VyICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2FsayBkb3duIHRoZSB0cmVlIGxvb2tpbmcgZm9yIGEgZGlzY3JlcGFuY3lcblx0XHR3aGlsZSAoIGFwWyBpIF0gPT09IGJwWyBpIF0gKSB7XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGkgP1xuXG5cdFx0XHQvLyBEbyBhIHNpYmxpbmcgY2hlY2sgaWYgdGhlIG5vZGVzIGhhdmUgYSBjb21tb24gYW5jZXN0b3Jcblx0XHRcdHNpYmxpbmdDaGVjayggYXBbIGkgXSwgYnBbIGkgXSApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0XG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgZXFlcWVxICovXG5cdFx0XHRhcFsgaSBdID09IHByZWZlcnJlZERvYyA/IC0xIDpcblx0XHRcdGJwWyBpIF0gPT0gcHJlZmVycmVkRG9jID8gMSA6XG5cdFx0XHQvKiBlc2xpbnQtZW5hYmxlIGVxZXFlcSAqL1xuXHRcdFx0MDtcblx0fTtcblxuXHRyZXR1cm4gZG9jdW1lbnQ7XG59O1xuXG5TaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTtcbn07XG5cblNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHtcblx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblxuXHRpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0IW5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGVbIGV4cHIgKyBcIiBcIiBdICYmXG5cdFx0KCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJlxuXHRcdCggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblxuXHRcdFx0XHQvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudFxuXHRcdFx0XHQvLyBmcmFnbWVudCBpbiBJRSA5XG5cdFx0XHRcdGVsZW0uZG9jdW1lbnQgJiYgZWxlbS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRub25uYXRpdmVTZWxlY3RvckNhY2hlKCBleHByLCB0cnVlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIFNpenpsZSggZXhwciwgZG9jdW1lbnQsIG51bGwsIFsgZWxlbSBdICkubGVuZ3RoID4gMDtcbn07XG5cblNpenpsZS5jb250YWlucyA9IGZ1bmN0aW9uKCBjb250ZXh0LCBlbGVtICkge1xuXG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgKSAhPSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggY29udGV4dCApO1xuXHR9XG5cdHJldHVybiBjb250YWlucyggY29udGV4dCwgZWxlbSApO1xufTtcblxuU2l6emxlLmF0dHIgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblxuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0aWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cblx0XHQvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoalF1ZXJ5ICMxMzgwNylcblx0XHR2YWwgPSBmbiAmJiBoYXNPd24uY2FsbCggRXhwci5hdHRySGFuZGxlLCBuYW1lLnRvTG93ZXJDYXNlKCkgKSA/XG5cdFx0XHRmbiggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOlxuXHRcdFx0dW5kZWZpbmVkO1xuXG5cdHJldHVybiB2YWwgIT09IHVuZGVmaW5lZCA/XG5cdFx0dmFsIDpcblx0XHRzdXBwb3J0LmF0dHJpYnV0ZXMgfHwgIWRvY3VtZW50SXNIVE1MID9cblx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICkgOlxuXHRcdFx0KCB2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKSApICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xufTtcblxuU2l6emxlLmVzY2FwZSA9IGZ1bmN0aW9uKCBzZWwgKSB7XG5cdHJldHVybiAoIHNlbCArIFwiXCIgKS5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7XG59O1xuXG5TaXp6bGUuZXJyb3IgPSBmdW5jdGlvbiggbXNnICkge1xuXHR0aHJvdyBuZXcgRXJyb3IoIFwiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogXCIgKyBtc2cgKTtcbn07XG5cbi8qKlxuICogRG9jdW1lbnQgc29ydGluZyBhbmQgcmVtb3ZpbmcgZHVwbGljYXRlc1xuICogQHBhcmFtIHtBcnJheUxpa2V9IHJlc3VsdHNcbiAqL1xuU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHtcblx0dmFyIGVsZW0sXG5cdFx0ZHVwbGljYXRlcyA9IFtdLFxuXHRcdGogPSAwLFxuXHRcdGkgPSAwO1xuXG5cdC8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2Vcblx0aGFzRHVwbGljYXRlID0gIXN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcztcblx0c29ydElucHV0ID0gIXN1cHBvcnQuc29ydFN0YWJsZSAmJiByZXN1bHRzLnNsaWNlKCAwICk7XG5cdHJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7XG5cblx0aWYgKCBoYXNEdXBsaWNhdGUgKSB7XG5cdFx0d2hpbGUgKCAoIGVsZW0gPSByZXN1bHRzWyBpKysgXSApICkge1xuXHRcdFx0aWYgKCBlbGVtID09PSByZXN1bHRzWyBpIF0gKSB7XG5cdFx0XHRcdGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2xlYXIgaW5wdXQgYWZ0ZXIgc29ydGluZyB0byByZWxlYXNlIG9iamVjdHNcblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1XG5cdHNvcnRJbnB1dCA9IG51bGw7XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4gKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW1cbiAqL1xuZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBub2RlLFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0aSA9IDAsXG5cdFx0bm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdGlmICggIW5vZGVUeXBlICkge1xuXG5cdFx0Ly8gSWYgbm8gbm9kZVR5cGUsIHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXlcblx0XHR3aGlsZSAoICggbm9kZSA9IGVsZW1bIGkrKyBdICkgKSB7XG5cblx0XHRcdC8vIERvIG5vdCB0cmF2ZXJzZSBjb21tZW50IG5vZGVzXG5cdFx0XHRyZXQgKz0gZ2V0VGV4dCggbm9kZSApO1xuXHRcdH1cblx0fSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDEgfHwgbm9kZVR5cGUgPT09IDkgfHwgbm9kZVR5cGUgPT09IDExICkge1xuXG5cdFx0Ly8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50c1xuXHRcdC8vIGlubmVyVGV4dCB1c2FnZSByZW1vdmVkIGZvciBjb25zaXN0ZW5jeSBvZiBuZXcgbGluZXMgKGpRdWVyeSAjMTExNTMpXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS50ZXh0Q29udGVudCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLnRleHRDb250ZW50O1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdHJldCArPSBnZXRUZXh0KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVmFsdWU7XG5cdH1cblxuXHQvLyBEbyBub3QgaW5jbHVkZSBjb21tZW50IG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbm9kZXNcblxuXHRyZXR1cm4gcmV0O1xufTtcblxuRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7XG5cblx0Ly8gQ2FuIGJlIGFkanVzdGVkIGJ5IHRoZSB1c2VyXG5cdGNhY2hlTGVuZ3RoOiA1MCxcblxuXHRjcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbixcblxuXHRtYXRjaDogbWF0Y2hFeHByLFxuXG5cdGF0dHJIYW5kbGU6IHt9LFxuXG5cdGZpbmQ6IHt9LFxuXG5cdHJlbGF0aXZlOiB7XG5cdFx0XCI+XCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIiBcIjogeyBkaXI6IFwicGFyZW50Tm9kZVwiIH0sXG5cdFx0XCIrXCI6IHsgZGlyOiBcInByZXZpb3VzU2libGluZ1wiLCBmaXJzdDogdHJ1ZSB9LFxuXHRcdFwiflwiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiB9XG5cdH0sXG5cblx0cHJlRmlsdGVyOiB7XG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdG1hdGNoWyAxIF0gPSBtYXRjaFsgMSBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFsgMyBdID0gKCBtYXRjaFsgMyBdIHx8IG1hdGNoWyA0IF0gfHxcblx0XHRcdFx0bWF0Y2hbIDUgXSB8fCBcIlwiICkucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblxuXHRcdFx0aWYgKCBtYXRjaFsgMiBdID09PSBcIn49XCIgKSB7XG5cdFx0XHRcdG1hdGNoWyAzIF0gPSBcIiBcIiArIG1hdGNoWyAzIF0gKyBcIiBcIjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXG5cdFx0XHQvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByW1wiQ0hJTERcIl1cblx0XHRcdFx0MSB0eXBlIChvbmx5fG50aHwuLi4pXG5cdFx0XHRcdDIgd2hhdCAoY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0MyBhcmd1bWVudCAoZXZlbnxvZGR8XFxkKnxcXGQqbihbKy1dXFxkKyk/fC4uLilcblx0XHRcdFx0NCB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cXGQqbnwpXG5cdFx0XHRcdDUgc2lnbiBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NiB4IG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ3IHNpZ24gb2YgeS1jb21wb25lbnRcblx0XHRcdFx0OCB5IG9mIHktY29tcG9uZW50XG5cdFx0XHQqL1xuXHRcdFx0bWF0Y2hbIDEgXSA9IG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0aWYgKCBtYXRjaFsgMSBdLnNsaWNlKCAwLCAzICkgPT09IFwibnRoXCIgKSB7XG5cblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbIDMgXSApIHtcblx0XHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWyAwIF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIG51bWVyaWMgeCBhbmQgeSBwYXJhbWV0ZXJzIGZvciBFeHByLmZpbHRlci5DSElMRFxuXHRcdFx0XHQvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xXG5cdFx0XHRcdG1hdGNoWyA0IF0gPSArKCBtYXRjaFsgNCBdID9cblx0XHRcdFx0XHRtYXRjaFsgNSBdICsgKCBtYXRjaFsgNiBdIHx8IDEgKSA6XG5cdFx0XHRcdFx0MiAqICggbWF0Y2hbIDMgXSA9PT0gXCJldmVuXCIgfHwgbWF0Y2hbIDMgXSA9PT0gXCJvZGRcIiApICk7XG5cdFx0XHRcdG1hdGNoWyA1IF0gPSArKCAoIG1hdGNoWyA3IF0gKyBtYXRjaFsgOCBdICkgfHwgbWF0Y2hbIDMgXSA9PT0gXCJvZGRcIiApO1xuXG5cdFx0XHRcdC8vIG90aGVyIHR5cGVzIHByb2hpYml0IGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbIDMgXSApIHtcblx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0dmFyIGV4Y2Vzcyxcblx0XHRcdFx0dW5xdW90ZWQgPSAhbWF0Y2hbIDYgXSAmJiBtYXRjaFsgMiBdO1xuXG5cdFx0XHRpZiAoIG1hdGNoRXhwclsgXCJDSElMRFwiIF0udGVzdCggbWF0Y2hbIDAgXSApICkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWNjZXB0IHF1b3RlZCBhcmd1bWVudHMgYXMtaXNcblx0XHRcdGlmICggbWF0Y2hbIDMgXSApIHtcblx0XHRcdFx0bWF0Y2hbIDIgXSA9IG1hdGNoWyA0IF0gfHwgbWF0Y2hbIDUgXSB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTdHJpcCBleGNlc3MgY2hhcmFjdGVycyBmcm9tIHVucXVvdGVkIGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggdW5xdW90ZWQgJiYgcnBzZXVkby50ZXN0KCB1bnF1b3RlZCApICYmXG5cblx0XHRcdFx0Ly8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSlcblx0XHRcdFx0KCBleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSApICYmXG5cblx0XHRcdFx0Ly8gYWR2YW5jZSB0byB0aGUgbmV4dCBjbG9zaW5nIHBhcmVudGhlc2lzXG5cdFx0XHRcdCggZXhjZXNzID0gdW5xdW90ZWQuaW5kZXhPZiggXCIpXCIsIHVucXVvdGVkLmxlbmd0aCAtIGV4Y2VzcyApIC0gdW5xdW90ZWQubGVuZ3RoICkgKSB7XG5cblx0XHRcdFx0Ly8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXhcblx0XHRcdFx0bWF0Y2hbIDAgXSA9IG1hdGNoWyAwIF0uc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0XHRtYXRjaFsgMiBdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudClcblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApO1xuXHRcdH1cblx0fSxcblxuXHRmaWx0ZXI6IHtcblxuXHRcdFwiVEFHXCI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIG5vZGVOYW1lID0gbm9kZU5hbWVTZWxlY3Rvci5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWVTZWxlY3RvciA9PT0gXCIqXCIgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbm9kZU5hbWU7XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0xBU1NcIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHtcblx0XHRcdHZhciBwYXR0ZXJuID0gY2xhc3NDYWNoZVsgY2xhc3NOYW1lICsgXCIgXCIgXTtcblxuXHRcdFx0cmV0dXJuIHBhdHRlcm4gfHxcblx0XHRcdFx0KCBwYXR0ZXJuID0gbmV3IFJlZ0V4cCggXCIoXnxcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XHRcdFwiKVwiICsgY2xhc3NOYW1lICsgXCIoXCIgKyB3aGl0ZXNwYWNlICsgXCJ8JClcIiApICkgJiYgY2xhc3NDYWNoZShcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSwgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBwYXR0ZXJuLnRlc3QoXG5cdFx0XHRcdFx0XHRcdFx0dHlwZW9mIGVsZW0uY2xhc3NOYW1lID09PSBcInN0cmluZ1wiICYmIGVsZW0uY2xhc3NOYW1lIHx8XG5cdFx0XHRcdFx0XHRcdFx0dHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggXCJjbGFzc1wiICkgfHxcblx0XHRcdFx0XHRcdFx0XHRcIlwiXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gKTtcblx0XHR9LFxuXG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBTaXp6bGUuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHRcdGlmICggcmVzdWx0ID09IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIiE9XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCAhb3BlcmF0b3IgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQgKz0gXCJcIjtcblxuXHRcdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cblx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIj1cIiA/IHJlc3VsdCA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiE9XCIgPyByZXN1bHQgIT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJePVwiID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIio9XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIkPVwiID8gY2hlY2sgJiYgcmVzdWx0LnNsaWNlKCAtY2hlY2subGVuZ3RoICkgPT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ+PVwiID8gKCBcIiBcIiArIHJlc3VsdC5yZXBsYWNlKCByd2hpdGVzcGFjZSwgXCIgXCIgKSArIFwiIFwiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ8PVwiID8gcmVzdWx0ID09PSBjaGVjayB8fCByZXN1bHQuc2xpY2UoIDAsIGNoZWNrLmxlbmd0aCArIDEgKSA9PT0gY2hlY2sgKyBcIi1cIiA6XG5cdFx0XHRcdFx0ZmFsc2U7XG5cdFx0XHRcdC8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xuXG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCB0eXBlLCB3aGF0LCBfYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkge1xuXHRcdFx0dmFyIHNpbXBsZSA9IHR5cGUuc2xpY2UoIDAsIDMgKSAhPT0gXCJudGhcIixcblx0XHRcdFx0Zm9yd2FyZCA9IHR5cGUuc2xpY2UoIC00ICkgIT09IFwibGFzdFwiLFxuXHRcdFx0XHRvZlR5cGUgPSB3aGF0ID09PSBcIm9mLXR5cGVcIjtcblxuXHRcdFx0cmV0dXJuIGZpcnN0ID09PSAxICYmIGxhc3QgPT09IDAgP1xuXG5cdFx0XHRcdC8vIFNob3J0Y3V0IGZvciA6bnRoLSoobilcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuICEhZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0XHR9IDpcblxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgX2NvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LFxuXHRcdFx0XHRcdFx0ZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gXCJuZXh0U2libGluZ1wiIDogXCJwcmV2aW91c1NpYmxpbmdcIixcblx0XHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRcdG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0XHRcdFx0dXNlQ2FjaGUgPSAheG1sICYmICFvZlR5cGUsXG5cdFx0XHRcdFx0XHRkaWZmID0gZmFsc2U7XG5cblx0XHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHRcdFx0aWYgKCBzaW1wbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggZGlyICkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKCBub2RlID0gbm9kZVsgZGlyIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggb2ZUeXBlID9cblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gUmV2ZXJzZSBkaXJlY3Rpb24gZm9yIDpvbmx5LSogKGlmIHdlIGhhdmVuJ3QgeWV0IGRvbmUgc28pXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnQgPSBkaXIgPSB0eXBlID09PSBcIm9ubHlcIiAmJiAhc3RhcnQgJiYgXCJuZXh0U2libGluZ1wiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdO1xuXG5cdFx0XHRcdFx0XHQvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YFxuXHRcdFx0XHRcdFx0aWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleFxuXG5cdFx0XHRcdFx0XHRcdC8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXlcblx0XHRcdFx0XHRcdFx0bm9kZSA9IHBhcmVudDtcblx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAoIG5vZGVbIGV4cGFuZG8gXSA9IHt9ICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHQoIG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9ICk7XG5cblx0XHRcdFx0XHRcdFx0Y2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRub2RlSW5kZXggPSBjYWNoZVsgMCBdID09PSBkaXJydW5zICYmIGNhY2hlWyAxIF07XG5cdFx0XHRcdFx0XHRcdGRpZmYgPSBub2RlSW5kZXggJiYgY2FjaGVbIDIgXTtcblx0XHRcdFx0XHRcdFx0bm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdCggZGlmZiA9IG5vZGVJbmRleCA9IDAgKSB8fCBzdGFydC5wb3AoKSApICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFVzZSBwcmV2aW91c2x5LWNhY2hlZCBlbGVtZW50IGluZGV4IGlmIGF2YWlsYWJsZVxuXHRcdFx0XHRcdFx0XHRpZiAoIHVzZUNhY2hlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHwgKCBub2RlWyBleHBhbmRvIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQoIG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9ICk7XG5cblx0XHRcdFx0XHRcdFx0XHRjYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107XG5cdFx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRcdGRpZmYgPSBub2RlSW5kZXg7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyB4bWwgOm50aC1jaGlsZCguLi4pXG5cdFx0XHRcdFx0XHRcdC8vIG9yIDpudGgtbGFzdC1jaGlsZCguLi4pIG9yIDpudGgoLWxhc3QpPy1vZi10eXBlKC4uLilcblx0XHRcdFx0XHRcdFx0aWYgKCBkaWZmID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFVzZSB0aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQoIGRpZmYgPSBub2RlSW5kZXggPSAwICkgfHwgc3RhcnQucG9wKCkgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQrK2RpZmYgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHVzZUNhY2hlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCggbm9kZVsgZXhwYW5kbyBdID0ge30gKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KCBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVucywgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBub2RlID09PSBlbGVtICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEluY29ycG9yYXRlIHRoZSBvZmZzZXQsIHRoZW4gY2hlY2sgYWdhaW5zdCBjeWNsZSBzaXplXG5cdFx0XHRcdFx0XHRkaWZmIC09IGxhc3Q7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGlmZiA9PT0gZmlyc3QgfHwgKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkge1xuXG5cdFx0XHQvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmVcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXNcblx0XHRcdC8vIFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzXG5cdFx0XHQvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zXG5cdFx0XHR2YXIgYXJncyxcblx0XHRcdFx0Zm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiICsgcHNldWRvICk7XG5cblx0XHRcdC8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXRcblx0XHRcdC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uXG5cdFx0XHQvLyBqdXN0IGFzIFNpenpsZSBkb2VzXG5cdFx0XHRpZiAoIGZuWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHJldHVybiBmbiggYXJndW1lbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzXG5cdFx0XHRpZiAoIGZuLmxlbmd0aCA+IDEgKSB7XG5cdFx0XHRcdGFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCBcIlwiLCBhcmd1bWVudCBdO1xuXHRcdFx0XHRyZXR1cm4gRXhwci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8udG9Mb3dlckNhc2UoKSApID9cblx0XHRcdFx0XHRtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkge1xuXHRcdFx0XHRcdFx0dmFyIGlkeCxcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLFxuXHRcdFx0XHRcdFx0XHRpID0gbWF0Y2hlZC5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWR4ID0gaW5kZXhPZiggc2VlZCwgbWF0Y2hlZFsgaSBdICk7XG5cdFx0XHRcdFx0XHRcdHNlZWRbIGlkeCBdID0gISggbWF0Y2hlc1sgaWR4IF0gPSBtYXRjaGVkWyBpIF0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZuO1xuXHRcdH1cblx0fSxcblxuXHRwc2V1ZG9zOiB7XG5cblx0XHQvLyBQb3RlbnRpYWxseSBjb21wbGV4IHBzZXVkb3Ncblx0XHRcIm5vdFwiOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblxuXHRcdFx0Ly8gVHJpbSB0aGUgc2VsZWN0b3IgcGFzc2VkIHRvIGNvbXBpbGVcblx0XHRcdC8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nXG5cdFx0XHQvLyBzcGFjZXMgYXMgY29tYmluYXRvcnNcblx0XHRcdHZhciBpbnB1dCA9IFtdLFxuXHRcdFx0XHRyZXN1bHRzID0gW10sXG5cdFx0XHRcdG1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICkgKTtcblxuXHRcdFx0cmV0dXJuIG1hdGNoZXJbIGV4cGFuZG8gXSA/XG5cdFx0XHRcdG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIF9jb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGVsZW0sXG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksXG5cdFx0XHRcdFx0XHRpID0gc2VlZC5sZW5ndGg7XG5cblx0XHRcdFx0XHQvLyBNYXRjaCBlbGVtZW50cyB1bm1hdGNoZWQgYnkgYG1hdGNoZXJgXG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZWxlbSA9IHVubWF0Y2hlZFsgaSBdICkgKSB7XG5cdFx0XHRcdFx0XHRcdHNlZWRbIGkgXSA9ICEoIG1hdGNoZXNbIGkgXSA9IGVsZW0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBfY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdGlucHV0WyAwIF0gPSBlbGVtO1xuXHRcdFx0XHRcdG1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTtcblxuXHRcdFx0XHRcdC8vIERvbid0IGtlZXAgdGhlIGVsZW1lbnQgKGlzc3VlICMyOTkpXG5cdFx0XHRcdFx0aW5wdXRbIDAgXSA9IG51bGw7XG5cdFx0XHRcdFx0cmV0dXJuICFyZXN1bHRzLnBvcCgpO1xuXHRcdFx0XHR9O1xuXHRcdH0gKSxcblxuXHRcdFwiaGFzXCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7XG5cdFx0XHR9O1xuXHRcdH0gKSxcblxuXHRcdFwiY29udGFpbnNcIjogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7XG5cdFx0XHR9O1xuXHRcdH0gKSxcblxuXHRcdC8vIFwiV2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJlc2VudGVkIGJ5IGEgOmxhbmcoKSBzZWxlY3RvclxuXHRcdC8vIGlzIGJhc2VkIHNvbGVseSBvbiB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlXG5cdFx0Ly8gYmVpbmcgZXF1YWwgdG8gdGhlIGlkZW50aWZpZXIgQyxcblx0XHQvLyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRlbnRpZmllciBDIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IFwiLVwiLlxuXHRcdC8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuXHRcdC8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuXCJcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRvXG5cdFx0XCJsYW5nXCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7XG5cblx0XHRcdC8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXJcblx0XHRcdGlmICggIXJpZGVudGlmaWVyLnRlc3QoIGxhbmcgfHwgXCJcIiApICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgbGFuZzogXCIgKyBsYW5nICk7XG5cdFx0XHR9XG5cdFx0XHRsYW5nID0gbGFuZy5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciBlbGVtTGFuZztcblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdGlmICggKCBlbGVtTGFuZyA9IGRvY3VtZW50SXNIVE1MID9cblx0XHRcdFx0XHRcdGVsZW0ubGFuZyA6XG5cdFx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggXCJ4bWw6bGFuZ1wiICkgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoIFwibGFuZ1wiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0ZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW1MYW5nID09PSBsYW5nIHx8IGVsZW1MYW5nLmluZGV4T2YoIGxhbmcgKyBcIi1cIiApID09PSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSB3aGlsZSAoICggZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSApICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHQvLyBNaXNjZWxsYW5lb3VzXG5cdFx0XCJ0YXJnZXRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDtcblx0XHRcdHJldHVybiBoYXNoICYmIGhhc2guc2xpY2UoIDEgKSA9PT0gZWxlbS5pZDtcblx0XHR9LFxuXG5cdFx0XCJyb290XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY0VsZW07XG5cdFx0fSxcblxuXHRcdFwiZm9jdXNcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJlxuXHRcdFx0XHQoICFkb2N1bWVudC5oYXNGb2N1cyB8fCBkb2N1bWVudC5oYXNGb2N1cygpICkgJiZcblx0XHRcdFx0ISEoIGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXggKTtcblx0XHR9LFxuXG5cdFx0Ly8gQm9vbGVhbiBwcm9wZXJ0aWVzXG5cdFx0XCJlbmFibGVkXCI6IGNyZWF0ZURpc2FibGVkUHNldWRvKCBmYWxzZSApLFxuXHRcdFwiZGlzYWJsZWRcIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIHRydWUgKSxcblxuXHRcdFwiY2hlY2tlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0Ly8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0dmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiAhIWVsZW0uY2hlY2tlZCApIHx8XG5cdFx0XHRcdCggbm9kZU5hbWUgPT09IFwib3B0aW9uXCIgJiYgISFlbGVtLnNlbGVjdGVkICk7XG5cdFx0fSxcblxuXHRcdFwic2VsZWN0ZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHRcblx0XHRcdC8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHlcblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cdFx0XHRcdGVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0Ly8gQ29udGVudHNcblx0XHRcImVtcHR5XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2VtcHR5LXBzZXVkb1xuXHRcdFx0Ly8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLFxuXHRcdFx0Ly8gICBidXQgbm90IGJ5IG90aGVycyAoY29tbWVudDogODsgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbjogNzsgZXRjLilcblx0XHRcdC8vIG5vZGVUeXBlIDwgNiB3b3JrcyBiZWNhdXNlIGF0dHJpYnV0ZXMgKDIpIGRvIG5vdCBhcHBlYXIgYXMgY2hpbGRyZW5cblx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPCA2ICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdFwicGFyZW50XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICFFeHByLnBzZXVkb3NbIFwiZW1wdHlcIiBdKCBlbGVtICk7XG5cdFx0fSxcblxuXHRcdC8vIEVsZW1lbnQvaW5wdXQgdHlwZXNcblx0XHRcImhlYWRlclwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJpbnB1dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaW5wdXRzLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJidXR0b25cIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBuYW1lID09PSBcImlucHV0XCIgJiYgZWxlbS50eXBlID09PSBcImJ1dHRvblwiIHx8IG5hbWUgPT09IFwiYnV0dG9uXCI7XG5cdFx0fSxcblxuXHRcdFwidGV4dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBhdHRyO1xuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmXG5cdFx0XHRcdGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCIgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRTw4XG5cdFx0XHRcdC8vIE5ldyBIVE1MNSBhdHRyaWJ1dGUgdmFsdWVzIChlLmcuLCBcInNlYXJjaFwiKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09IFwidGV4dFwiXG5cdFx0XHRcdCggKCBhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoIFwidHlwZVwiICkgKSA9PSBudWxsIHx8XG5cdFx0XHRcdFx0YXR0ci50b0xvd2VyQ2FzZSgpID09PSBcInRleHRcIiApO1xuXHRcdH0sXG5cblx0XHQvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uXG5cdFx0XCJmaXJzdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBbIDAgXTtcblx0XHR9ICksXG5cblx0XHRcImxhc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oIF9tYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHJldHVybiBbIGxlbmd0aCAtIDEgXTtcblx0XHR9ICksXG5cblx0XHRcImVxXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBfbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0cmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdO1xuXHRcdH0gKSxcblxuXHRcdFwiZXZlblwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSApLFxuXG5cdFx0XCJvZGRcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAxO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0gKSxcblxuXHRcdFwibHRcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID9cblx0XHRcdFx0YXJndW1lbnQgKyBsZW5ndGggOlxuXHRcdFx0XHRhcmd1bWVudCA+IGxlbmd0aCA/XG5cdFx0XHRcdFx0bGVuZ3RoIDpcblx0XHRcdFx0XHRhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgLS1pID49IDA7ICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9ICksXG5cblx0XHRcImd0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7ICsraSA8IGxlbmd0aDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0gKVxuXHR9XG59O1xuXG5FeHByLnBzZXVkb3NbIFwibnRoXCIgXSA9IEV4cHIucHNldWRvc1sgXCJlcVwiIF07XG5cbi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zXG5mb3IgKCBpIGluIHsgcmFkaW86IHRydWUsIGNoZWNrYm94OiB0cnVlLCBmaWxlOiB0cnVlLCBwYXNzd29yZDogdHJ1ZSwgaW1hZ2U6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApO1xufVxuZm9yICggaSBpbiB7IHN1Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVCdXR0b25Qc2V1ZG8oIGkgKTtcbn1cblxuLy8gRWFzeSBBUEkgZm9yIGNyZWF0aW5nIG5ldyBzZXRGaWx0ZXJzXG5mdW5jdGlvbiBzZXRGaWx0ZXJzKCkge31cbnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zO1xuRXhwci5zZXRGaWx0ZXJzID0gbmV3IHNldEZpbHRlcnMoKTtcblxudG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHtcblx0dmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsXG5cdFx0c29GYXIsIGdyb3VwcywgcHJlRmlsdGVycyxcblx0XHRjYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCBjYWNoZWQgKSB7XG5cdFx0cmV0dXJuIHBhcnNlT25seSA/IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTtcblx0fVxuXG5cdHNvRmFyID0gc2VsZWN0b3I7XG5cdGdyb3VwcyA9IFtdO1xuXHRwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7XG5cblx0d2hpbGUgKCBzb0ZhciApIHtcblxuXHRcdC8vIENvbW1hIGFuZCBmaXJzdCBydW5cblx0XHRpZiAoICFtYXRjaGVkIHx8ICggbWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSApICkge1xuXHRcdFx0aWYgKCBtYXRjaCApIHtcblxuXHRcdFx0XHQvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZFxuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaFsgMCBdLmxlbmd0aCApIHx8IHNvRmFyO1xuXHRcdFx0fVxuXHRcdFx0Z3JvdXBzLnB1c2goICggdG9rZW5zID0gW10gKSApO1xuXHRcdH1cblxuXHRcdG1hdGNoZWQgPSBmYWxzZTtcblxuXHRcdC8vIENvbWJpbmF0b3JzXG5cdFx0aWYgKCAoIG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkgKSApIHtcblx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0dG9rZW5zLnB1c2goIHtcblx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cblx0XHRcdFx0Ly8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlXG5cdFx0XHRcdHR5cGU6IG1hdGNoWyAwIF0ucmVwbGFjZSggcnRyaW0sIFwiIFwiIClcblx0XHRcdH0gKTtcblx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmlsdGVyc1xuXHRcdGZvciAoIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7XG5cdFx0XHRpZiAoICggbWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApICkgJiYgKCAhcHJlRmlsdGVyc1sgdHlwZSBdIHx8XG5cdFx0XHRcdCggbWF0Y2ggPSBwcmVGaWx0ZXJzWyB0eXBlIF0oIG1hdGNoICkgKSApICkge1xuXHRcdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdFx0dG9rZW5zLnB1c2goIHtcblx0XHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblx0XHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRcdG1hdGNoZXM6IG1hdGNoXG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoICFtYXRjaGVkICkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzXG5cdC8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZ1xuXHQvLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yIG9yIHJldHVybiB0b2tlbnNcblx0cmV0dXJuIHBhcnNlT25seSA/XG5cdFx0c29GYXIubGVuZ3RoIDpcblx0XHRzb0ZhciA/XG5cdFx0XHRTaXp6bGUuZXJyb3IoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHQvLyBDYWNoZSB0aGUgdG9rZW5zXG5cdFx0XHR0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTtcbn07XG5cbmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0c2VsZWN0b3IgPSBcIlwiO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRzZWxlY3RvciArPSB0b2tlbnNbIGkgXS52YWx1ZTtcblx0fVxuXHRyZXR1cm4gc2VsZWN0b3I7XG59XG5cbmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7XG5cdHZhciBkaXIgPSBjb21iaW5hdG9yLmRpcixcblx0XHRza2lwID0gY29tYmluYXRvci5uZXh0LFxuXHRcdGtleSA9IHNraXAgfHwgZGlyLFxuXHRcdGNoZWNrTm9uRWxlbWVudHMgPSBiYXNlICYmIGtleSA9PT0gXCJwYXJlbnROb2RlXCIsXG5cdFx0ZG9uZU5hbWUgPSBkb25lKys7XG5cblx0cmV0dXJuIGNvbWJpbmF0b3IuZmlyc3QgP1xuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSA6XG5cblx0XHQvLyBDaGVjayBhZ2FpbnN0IGFsbCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudHNcblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIG9sZENhY2hlLCB1bmlxdWVDYWNoZSwgb3V0ZXJDYWNoZSxcblx0XHRcdFx0bmV3Q2FjaGUgPSBbIGRpcnJ1bnMsIGRvbmVOYW1lIF07XG5cblx0XHRcdC8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGNvbWJpbmF0b3IgY2FjaGluZ1xuXHRcdFx0aWYgKCB4bWwgKSB7XG5cdFx0XHRcdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoIGVsZW1bIGV4cGFuZG8gXSA9IHt9ICk7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0KCBvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIHNraXAgJiYgc2tpcCA9PT0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICkge1xuXHRcdFx0XHRcdFx0XHRlbGVtID0gZWxlbVsgZGlyIF0gfHwgZWxlbTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoICggb2xkQ2FjaGUgPSB1bmlxdWVDYWNoZVsga2V5IF0gKSAmJlxuXHRcdFx0XHRcdFx0XHRvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiAoIG5ld0NhY2hlWyAyIF0gPSBvbGRDYWNoZVsgMiBdICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFJldXNlIG5ld2NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIGtleSBdID0gbmV3Q2FjaGU7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nXG5cdFx0XHRcdFx0XHRcdGlmICggKCBuZXdDYWNoZVsgMiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHtcblx0cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgP1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICFtYXRjaGVyc1sgaSBdKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gOlxuXHRcdG1hdGNoZXJzWyAwIF07XG59XG5cbmZ1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IGNvbnRleHRzLmxlbmd0aDtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0U2l6emxlKCBzZWxlY3RvciwgY29udGV4dHNbIGkgXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKCBlbGVtID0gdW5tYXRjaGVkWyBpIF0gKSApIHtcblx0XHRcdGlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRuZXdVbm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRpZiAoIG1hcHBlZCApIHtcblx0XHRcdFx0XHRtYXAucHVzaCggaSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG5ld1VubWF0Y2hlZDtcbn1cblxuZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkge1xuXHRpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHtcblx0XHRwb3N0RmlsdGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbHRlciApO1xuXHR9XG5cdGlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTtcblx0fVxuXHRyZXR1cm4gbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgcmVzdWx0cywgY29udGV4dCwgeG1sICkge1xuXHRcdHZhciB0ZW1wLCBpLCBlbGVtLFxuXHRcdFx0cHJlTWFwID0gW10sXG5cdFx0XHRwb3N0TWFwID0gW10sXG5cdFx0XHRwcmVleGlzdGluZyA9IHJlc3VsdHMubGVuZ3RoLFxuXG5cdFx0XHQvLyBHZXQgaW5pdGlhbCBlbGVtZW50cyBmcm9tIHNlZWQgb3IgY29udGV4dFxuXHRcdFx0ZWxlbXMgPSBzZWVkIHx8IG11bHRpcGxlQ29udGV4dHMoXG5cdFx0XHRcdHNlbGVjdG9yIHx8IFwiKlwiLFxuXHRcdFx0XHRjb250ZXh0Lm5vZGVUeXBlID8gWyBjb250ZXh0IF0gOiBjb250ZXh0LFxuXHRcdFx0XHRbXVxuXHRcdFx0KSxcblxuXHRcdFx0Ly8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uXG5cdFx0XHRtYXRjaGVySW4gPSBwcmVGaWx0ZXIgJiYgKCBzZWVkIHx8ICFzZWxlY3RvciApID9cblx0XHRcdFx0Y29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRlbGVtcyxcblxuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXIgP1xuXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3VsdHMsXG5cdFx0XHRcdHBvc3RGaW5kZXIgfHwgKCBzZWVkID8gcHJlRmlsdGVyIDogcHJlZXhpc3RpbmcgfHwgcG9zdEZpbHRlciApID9cblxuXHRcdFx0XHRcdC8vIC4uLmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeVxuXHRcdFx0XHRcdFtdIDpcblxuXHRcdFx0XHRcdC8vIC4uLm90aGVyd2lzZSB1c2UgcmVzdWx0cyBkaXJlY3RseVxuXHRcdFx0XHRcdHJlc3VsdHMgOlxuXHRcdFx0XHRtYXRjaGVySW47XG5cblx0XHQvLyBGaW5kIHByaW1hcnkgbWF0Y2hlc1xuXHRcdGlmICggbWF0Y2hlciApIHtcblx0XHRcdG1hdGNoZXIoIG1hdGNoZXJJbiwgbWF0Y2hlck91dCwgY29udGV4dCwgeG1sICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgcG9zdEZpbHRlclxuXHRcdGlmICggcG9zdEZpbHRlciApIHtcblx0XHRcdHRlbXAgPSBjb25kZW5zZSggbWF0Y2hlck91dCwgcG9zdE1hcCApO1xuXHRcdFx0cG9zdEZpbHRlciggdGVtcCwgW10sIGNvbnRleHQsIHhtbCApO1xuXG5cdFx0XHQvLyBVbi1tYXRjaCBmYWlsaW5nIGVsZW1lbnRzIGJ5IG1vdmluZyB0aGVtIGJhY2sgdG8gbWF0Y2hlckluXG5cdFx0XHRpID0gdGVtcC5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCAoIGVsZW0gPSB0ZW1wWyBpIF0gKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyT3V0WyBwb3N0TWFwWyBpIF0gXSA9ICEoIG1hdGNoZXJJblsgcG9zdE1hcFsgaSBdIF0gPSBlbGVtICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkge1xuXHRcdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cblx0XHRcdFx0XHQvLyBHZXQgdGhlIGZpbmFsIG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRvIHBvc3RGaW5kZXIgY29udGV4dHNcblx0XHRcdFx0XHR0ZW1wID0gW107XG5cdFx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSBtYXRjaGVyT3V0WyBpIF0gKSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaFxuXHRcdFx0XHRcdFx0XHR0ZW1wLnB1c2goICggbWF0Y2hlckluWyBpIF0gPSBlbGVtICkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgKCBtYXRjaGVyT3V0ID0gW10gKSwgdGVtcCwgeG1sICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBNb3ZlIG1hdGNoZWQgZWxlbWVudHMgZnJvbSBzZWVkIHRvIHJlc3VsdHMgdG8ga2VlcCB0aGVtIHN5bmNocm9uaXplZFxuXHRcdFx0XHRpID0gbWF0Y2hlck91dC5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdGlmICggKCBlbGVtID0gbWF0Y2hlck91dFsgaSBdICkgJiZcblx0XHRcdFx0XHRcdCggdGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbIGkgXSApID4gLTEgKSB7XG5cblx0XHRcdFx0XHRcdHNlZWRbIHRlbXAgXSA9ICEoIHJlc3VsdHNbIHRlbXAgXSA9IGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyT3V0ID0gY29uZGVuc2UoXG5cdFx0XHRcdG1hdGNoZXJPdXQgPT09IHJlc3VsdHMgP1xuXHRcdFx0XHRcdG1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6XG5cdFx0XHRcdFx0bWF0Y2hlck91dFxuXHRcdFx0KTtcblx0XHRcdGlmICggcG9zdEZpbmRlciApIHtcblx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgcmVzdWx0cywgbWF0Y2hlck91dCwgeG1sICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBtYXRjaGVyT3V0ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9ICk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXJGcm9tVG9rZW5zKCB0b2tlbnMgKSB7XG5cdHZhciBjaGVja0NvbnRleHQsIG1hdGNoZXIsIGosXG5cdFx0bGVuID0gdG9rZW5zLmxlbmd0aCxcblx0XHRsZWFkaW5nUmVsYXRpdmUgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbIDAgXS50eXBlIF0sXG5cdFx0aW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlWyBcIiBcIiBdLFxuXHRcdGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCxcblxuXHRcdC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpXG5cdFx0bWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0O1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKFxuXHRcdFx0XHQoIGNoZWNrQ29udGV4dCA9IGNvbnRleHQgKS5ub2RlVHlwZSA/XG5cdFx0XHRcdFx0bWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6XG5cdFx0XHRcdFx0bWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApO1xuXG5cdFx0XHQvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdGNoZWNrQ29udGV4dCA9IG51bGw7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH0gXTtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoICggbWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1sgaSBdLnR5cGUgXSApICkge1xuXHRcdFx0bWF0Y2hlcnMgPSBbIGFkZENvbWJpbmF0b3IoIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyICkgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlciA9IEV4cHIuZmlsdGVyWyB0b2tlbnNbIGkgXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1sgaSBdLm1hdGNoZXMgKTtcblxuXHRcdFx0Ly8gUmV0dXJuIHNwZWNpYWwgdXBvbiBzZWVpbmcgYSBwb3NpdGlvbmFsIG1hdGNoZXJcblx0XHRcdGlmICggbWF0Y2hlclsgZXhwYW5kbyBdICkge1xuXG5cdFx0XHRcdC8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZ1xuXHRcdFx0XHRqID0gKytpO1xuXHRcdFx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbIHRva2Vuc1sgaiBdLnR5cGUgXSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc2V0TWF0Y2hlcihcblx0XHRcdFx0XHRpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSxcblx0XHRcdFx0XHRpID4gMSAmJiB0b1NlbGVjdG9yKFxuXG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHR0b2tlbnNcblx0XHRcdFx0XHRcdC5zbGljZSggMCwgaSAtIDEgKVxuXHRcdFx0XHRcdFx0LmNvbmNhdCggeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09IFwiIFwiID8gXCIqXCIgOiBcIlwiIH0gKVxuXHRcdFx0XHRcdCkucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLFxuXHRcdFx0XHRcdG1hdGNoZXIsXG5cdFx0XHRcdFx0aSA8IGogJiYgbWF0Y2hlckZyb21Ub2tlbnMoIHRva2Vucy5zbGljZSggaSwgaiApICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiBtYXRjaGVyRnJvbVRva2VucyggKCB0b2tlbnMgPSB0b2tlbnMuc2xpY2UoIGogKSApICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlcnMucHVzaCggbWF0Y2hlciApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkge1xuXHR2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHtcblx0XHRcdHZhciBlbGVtLCBqLCBtYXRjaGVyLFxuXHRcdFx0XHRtYXRjaGVkQ291bnQgPSAwLFxuXHRcdFx0XHRpID0gXCIwXCIsXG5cdFx0XHRcdHVubWF0Y2hlZCA9IHNlZWQgJiYgW10sXG5cdFx0XHRcdHNldE1hdGNoZWQgPSBbXSxcblx0XHRcdFx0Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsXG5cblx0XHRcdFx0Ly8gV2UgbXVzdCBhbHdheXMgaGF2ZSBlaXRoZXIgc2VlZCBlbGVtZW50cyBvciBvdXRlcm1vc3QgY29udGV4dFxuXHRcdFx0XHRlbGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsgXCJUQUdcIiBdKCBcIipcIiwgb3V0ZXJtb3N0ICksXG5cblx0XHRcdFx0Ly8gVXNlIGludGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG1hdGNoZXJcblx0XHRcdFx0ZGlycnVuc1VuaXF1ZSA9ICggZGlycnVucyArPSBjb250ZXh0QmFja3VwID09IG51bGwgPyAxIDogTWF0aC5yYW5kb20oKSB8fCAwLjEgKSxcblx0XHRcdFx0bGVuID0gZWxlbXMubGVuZ3RoO1xuXG5cdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHRcdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dCA9PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHNcblx0XHRcdC8vIFN1cHBvcnQ6IElFPDksIFNhZmFyaVxuXHRcdFx0Ly8gVG9sZXJhdGUgTm9kZUxpc3QgcHJvcGVydGllcyAoSUU6IFwibGVuZ3RoXCI7IFNhZmFyaTogPG51bWJlcj4pIG1hdGNoaW5nIGVsZW1lbnRzIGJ5IGlkXG5cdFx0XHRmb3IgKCA7IGkgIT09IGxlbiAmJiAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGJ5RWxlbWVudCAmJiBlbGVtICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHRcdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0XHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdFx0XHRpZiAoICFjb250ZXh0ICYmIGVsZW0ub3duZXJEb2N1bWVudCAhPSBkb2N1bWVudCApIHtcblx0XHRcdFx0XHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdFx0XHRcdFx0XHR4bWwgPSAhZG9jdW1lbnRJc0hUTUw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaGVyID0gZWxlbWVudE1hdGNoZXJzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblxuXHRcdFx0XHRcdC8vIFRoZXkgd2lsbCBoYXZlIGdvbmUgdGhyb3VnaCBhbGwgcG9zc2libGUgbWF0Y2hlcnNcblx0XHRcdFx0XHRpZiAoICggZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0gKSApIHtcblx0XHRcdFx0XHRcdG1hdGNoZWRDb3VudC0tO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIExlbmd0aGVuIHRoZSBhcnJheSBmb3IgZXZlcnkgZWxlbWVudCwgbWF0Y2hlZCBvciBub3Rcblx0XHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBgaWAgaXMgbm93IHRoZSBjb3VudCBvZiBlbGVtZW50cyB2aXNpdGVkIGFib3ZlLCBhbmQgYWRkaW5nIGl0IHRvIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLlxuXHRcdFx0bWF0Y2hlZENvdW50ICs9IGk7XG5cblx0XHRcdC8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50c1xuXHRcdFx0Ly8gTk9URTogVGhpcyBjYW4gYmUgc2tpcHBlZCBpZiB0aGVyZSBhcmUgbm8gdW5tYXRjaGVkIGVsZW1lbnRzIChpLmUuLCBgbWF0Y2hlZENvdW50YFxuXHRcdFx0Ly8gZXF1YWxzIGBpYCksIHVubGVzcyB3ZSBkaWRuJ3QgdmlzaXQgX2FueV8gZWxlbWVudHMgaW4gdGhlIGFib3ZlIGxvb3AgYmVjYXVzZSB3ZSBoYXZlXG5cdFx0XHQvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLlxuXHRcdFx0Ly8gSW5jcmVtZW50aW5nIGFuIGluaXRpYWxseS1zdHJpbmcgXCIwXCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdFxuXHRcdFx0Ly8gY2FzZSwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSBcIjAwXCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvXG5cdFx0XHQvLyBudW1lcmljYWxseSB6ZXJvLlxuXHRcdFx0aWYgKCBieVNldCAmJiBpICE9PSBtYXRjaGVkQ291bnQgKSB7XG5cdFx0XHRcdGogPSAwO1xuXHRcdFx0XHR3aGlsZSAoICggbWF0Y2hlciA9IHNldE1hdGNoZXJzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdG1hdGNoZXIoIHVubWF0Y2hlZCwgc2V0TWF0Y2hlZCwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBSZWludGVncmF0ZSBlbGVtZW50IG1hdGNoZXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciBzb3J0aW5nXG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVkQ291bnQgPiAwICkge1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggISggdW5tYXRjaGVkWyBpIF0gfHwgc2V0TWF0Y2hlZFsgaSBdICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0c2V0TWF0Y2hlZFsgaSBdID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHR2YXIgaSxcblx0XHRzZXRNYXRjaGVycyA9IFtdLFxuXHRcdGVsZW1lbnRNYXRjaGVycyA9IFtdLFxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoICFjYWNoZWQgKSB7XG5cblx0XHQvLyBHZW5lcmF0ZSBhIGZ1bmN0aW9uIG9mIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjaGVjayBlYWNoIGVsZW1lbnRcblx0XHRpZiAoICFtYXRjaCApIHtcblx0XHRcdG1hdGNoID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0fVxuXHRcdGkgPSBtYXRjaC5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRjYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbIGkgXSApO1xuXHRcdFx0aWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0c2V0TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtZW50TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FjaGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0Y2FjaGVkID0gY29tcGlsZXJDYWNoZShcblx0XHRcdHNlbGVjdG9yLFxuXHRcdFx0bWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzIClcblx0XHQpO1xuXG5cdFx0Ly8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uXG5cdFx0Y2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7XG5cdH1cblx0cmV0dXJuIGNhY2hlZDtcbn07XG5cbi8qKlxuICogQSBsb3ctbGV2ZWwgc2VsZWN0aW9uIGZ1bmN0aW9uIHRoYXQgd29ya3Mgd2l0aCBTaXp6bGUncyBjb21waWxlZFxuICogIHNlbGVjdG9yIGZ1bmN0aW9uc1xuICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IHNlbGVjdG9yIEEgc2VsZWN0b3Igb3IgYSBwcmUtY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbiBidWlsdCB3aXRoIFNpenpsZS5jb21waWxlXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHRcbiAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHRzXVxuICogQHBhcmFtIHtBcnJheX0gW3NlZWRdIEEgc2V0IG9mIGVsZW1lbnRzIHRvIG1hdGNoIGFnYWluc3RcbiAqL1xuc2VsZWN0ID0gU2l6emxlLnNlbGVjdCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsXG5cdFx0Y29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBzZWxlY3Rvcixcblx0XHRtYXRjaCA9ICFzZWVkICYmIHRva2VuaXplKCAoIHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IgKSApO1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFRyeSB0byBtaW5pbWl6ZSBvcGVyYXRpb25zIGlmIHRoZXJlIGlzIG9ubHkgb25lIHNlbGVjdG9yIGluIHRoZSBsaXN0IGFuZCBubyBzZWVkXG5cdC8vICh0aGUgbGF0dGVyIG9mIHdoaWNoIGd1YXJhbnRlZXMgdXMgY29udGV4dClcblx0aWYgKCBtYXRjaC5sZW5ndGggPT09IDEgKSB7XG5cblx0XHQvLyBSZWR1Y2UgY29udGV4dCBpZiB0aGUgbGVhZGluZyBjb21wb3VuZCBzZWxlY3RvciBpcyBhbiBJRFxuXHRcdHRva2VucyA9IG1hdGNoWyAwIF0gPSBtYXRjaFsgMCBdLnNsaWNlKCAwICk7XG5cdFx0aWYgKCB0b2tlbnMubGVuZ3RoID4gMiAmJiAoIHRva2VuID0gdG9rZW5zWyAwIF0gKS50eXBlID09PSBcIklEXCIgJiZcblx0XHRcdGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgZG9jdW1lbnRJc0hUTUwgJiYgRXhwci5yZWxhdGl2ZVsgdG9rZW5zWyAxIF0udHlwZSBdICkge1xuXG5cdFx0XHRjb250ZXh0ID0gKCBFeHByLmZpbmRbIFwiSURcIiBdKCB0b2tlbi5tYXRjaGVzWyAwIF1cblx0XHRcdFx0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICksIGNvbnRleHQgKSB8fCBbXSApWyAwIF07XG5cdFx0XHRpZiAoICFjb250ZXh0ICkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0Ly8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbFxuXHRcdFx0fSBlbHNlIGlmICggY29tcGlsZWQgKSB7XG5cdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZldGNoIGEgc2VlZCBzZXQgZm9yIHJpZ2h0LXRvLWxlZnQgbWF0Y2hpbmdcblx0XHRpID0gbWF0Y2hFeHByWyBcIm5lZWRzQ29udGV4dFwiIF0udGVzdCggc2VsZWN0b3IgKSA/IDAgOiB0b2tlbnMubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG9rZW4gPSB0b2tlbnNbIGkgXTtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgd2UgaGl0IGEgY29tYmluYXRvclxuXHRcdFx0aWYgKCBFeHByLnJlbGF0aXZlWyAoIHR5cGUgPSB0b2tlbi50eXBlICkgXSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoICggZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdICkgKSB7XG5cblx0XHRcdFx0Ly8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGluZyBzaWJsaW5nIGNvbWJpbmF0b3JzXG5cdFx0XHRcdGlmICggKCBzZWVkID0gZmluZChcblx0XHRcdFx0XHR0b2tlbi5tYXRjaGVzWyAwIF0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSxcblx0XHRcdFx0XHRyc2libGluZy50ZXN0KCB0b2tlbnNbIDAgXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8XG5cdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdCkgKSApIHtcblxuXHRcdFx0XHRcdC8vIElmIHNlZWQgaXMgZW1wdHkgb3Igbm8gdG9rZW5zIHJlbWFpbiwgd2UgY2FuIHJldHVybiBlYXJseVxuXHRcdFx0XHRcdHRva2Vucy5zcGxpY2UoIGksIDEgKTtcblx0XHRcdFx0XHRzZWxlY3RvciA9IHNlZWQubGVuZ3RoICYmIHRvU2VsZWN0b3IoIHRva2VucyApO1xuXHRcdFx0XHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBDb21waWxlIGFuZCBleGVjdXRlIGEgZmlsdGVyaW5nIGZ1bmN0aW9uIGlmIG9uZSBpcyBub3QgcHJvdmlkZWRcblx0Ly8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZVxuXHQoIGNvbXBpbGVkIHx8IGNvbXBpbGUoIHNlbGVjdG9yLCBtYXRjaCApICkoXG5cdFx0c2VlZCxcblx0XHRjb250ZXh0LFxuXHRcdCFkb2N1bWVudElzSFRNTCxcblx0XHRyZXN1bHRzLFxuXHRcdCFjb250ZXh0IHx8IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHRcblx0KTtcblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vLyBPbmUtdGltZSBhc3NpZ25tZW50c1xuXG4vLyBTb3J0IHN0YWJpbGl0eVxuc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdCggXCJcIiApLnNvcnQoIHNvcnRPcmRlciApLmpvaW4oIFwiXCIgKSA9PT0gZXhwYW5kbztcblxuLy8gU3VwcG9ydDogQ2hyb21lIDE0LTM1K1xuLy8gQWx3YXlzIGFzc3VtZSBkdXBsaWNhdGVzIGlmIHRoZXkgYXJlbid0IHBhc3NlZCB0byB0aGUgY29tcGFyaXNvbiBmdW5jdGlvblxuc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7XG5cbi8vIEluaXRpYWxpemUgYWdhaW5zdCB0aGUgZGVmYXVsdCBkb2N1bWVudFxuc2V0RG9jdW1lbnQoKTtcblxuLy8gU3VwcG9ydDogV2Via2l0PDUzNy4zMiAtIFNhZmFyaSA2LjAuMy9DaHJvbWUgMjUgKGZpeGVkIGluIENocm9tZSAyNylcbi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKlxuc3VwcG9ydC5zb3J0RGV0YWNoZWQgPSBhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblxuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGVsLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImZpZWxkc2V0XCIgKSApICYgMTtcbn0gKTtcblxuLy8gU3VwcG9ydDogSUU8OFxuLy8gUHJldmVudCBhdHRyaWJ1dGUvcHJvcGVydHkgXCJpbnRlcnBvbGF0aW9uXCJcbi8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4XG5pZiAoICFhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0ZWwuaW5uZXJIVE1MID0gXCI8YSBocmVmPScjJz48L2E+XCI7XG5cdHJldHVybiBlbC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSggXCJocmVmXCIgKSA9PT0gXCIjXCI7XG59ICkgKSB7XG5cdGFkZEhhbmRsZSggXCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInR5cGVcIiA/IDEgOiAyICk7XG5cdFx0fVxuXHR9ICk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBkZWZhdWx0VmFsdWUgaW4gcGxhY2Ugb2YgZ2V0QXR0cmlidXRlKFwidmFsdWVcIilcbmlmICggIXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cdGVsLmlubmVySFRNTCA9IFwiPGlucHV0Lz5cIjtcblx0ZWwuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiwgXCJcIiApO1xuXHRyZXR1cm4gZWwuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiApID09PSBcIlwiO1xufSApICkge1xuXHRhZGRIYW5kbGUoIFwidmFsdWVcIiwgZnVuY3Rpb24oIGVsZW0sIF9uYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLmRlZmF1bHRWYWx1ZTtcblx0XHR9XG5cdH0gKTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGdldEF0dHJpYnV0ZU5vZGUgdG8gZmV0Y2ggYm9vbGVhbnMgd2hlbiBnZXRBdHRyaWJ1dGUgbGllc1xuaWYgKCAhYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cdHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoIFwiZGlzYWJsZWRcIiApID09IG51bGw7XG59ICkgKSB7XG5cdGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgdmFsO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdCggdmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkgKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRcdG51bGw7XG5cdFx0fVxuXHR9ICk7XG59XG5cbnJldHVybiBTaXp6bGU7XG5cbn0gKSggd2luZG93ICk7XG5cblxuXG5qUXVlcnkuZmluZCA9IFNpenpsZTtcbmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9ycztcblxuLy8gRGVwcmVjYXRlZFxualF1ZXJ5LmV4cHJbIFwiOlwiIF0gPSBqUXVlcnkuZXhwci5wc2V1ZG9zO1xualF1ZXJ5LnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7XG5qUXVlcnkudGV4dCA9IFNpenpsZS5nZXRUZXh0O1xualF1ZXJ5LmlzWE1MRG9jID0gU2l6emxlLmlzWE1MO1xualF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zO1xualF1ZXJ5LmVzY2FwZVNlbGVjdG9yID0gU2l6emxlLmVzY2FwZTtcblxuXG5cblxudmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkge1xuXHR2YXIgbWF0Y2hlZCA9IFtdLFxuXHRcdHRydW5jYXRlID0gdW50aWwgIT09IHVuZGVmaW5lZDtcblxuXHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgJiYgZWxlbS5ub2RlVHlwZSAhPT0gOSApIHtcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdG1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbWF0Y2hlZDtcbn07XG5cblxudmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7XG5cdHZhciBtYXRjaGVkID0gW107XG5cblx0Zm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHtcblx0XHRpZiAoIG4ubm9kZVR5cGUgPT09IDEgJiYgbiAhPT0gZWxlbSApIHtcblx0XHRcdG1hdGNoZWQucHVzaCggbiApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtcblxuXG5cbmZ1bmN0aW9uIG5vZGVOYW1lKCBlbGVtLCBuYW1lICkge1xuXG4gIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG59O1xudmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXFwvXFwwPjpcXHgyMFxcdFxcclxcblxcZl0qKVtcXHgyMFxcdFxcclxcblxcZl0qXFwvPz4oPzo8XFwvXFwxPnwpJC9pICk7XG5cblxuXG4vLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdFxuZnVuY3Rpb24gd2lubm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBub3QgKSB7XG5cdGlmICggaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gU2luZ2xlIGVsZW1lbnRcblx0aWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KVxuXHRpZiAoIHR5cGVvZiBxdWFsaWZpZXIgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID4gLTEgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEZpbHRlcmVkIGRpcmVjdGx5IGZvciBib3RoIHNpbXBsZSBhbmQgY29tcGxleCBzZWxlY3RvcnNcblx0cmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApO1xufVxuXG5qUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7XG5cdHZhciBlbGVtID0gZWxlbXNbIDAgXTtcblxuXHRpZiAoIG5vdCApIHtcblx0XHRleHByID0gXCI6bm90KFwiICsgZXhwciArIFwiKVwiO1xuXHR9XG5cblx0aWYgKCBlbGVtcy5sZW5ndGggPT09IDEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBleHByICkgPyBbIGVsZW0gXSA6IFtdO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXMoIGV4cHIsIGpRdWVyeS5ncmVwKCBlbGVtcywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7XG5cdH0gKSApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGksIHJldCxcblx0XHRcdGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0c2VsZiA9IHRoaXM7XG5cblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHNlbGZbIGkgXSwgdGhpcyApICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cblx0XHRyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRqUXVlcnkuZmluZCggc2VsZWN0b3IsIHNlbGZbIGkgXSwgcmV0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7XG5cdH0sXG5cdGZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgZmFsc2UgKSApO1xuXHR9LFxuXHRub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyggdGhpcywgc2VsZWN0b3IgfHwgW10sIHRydWUgKSApO1xuXHR9LFxuXHRpczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiAhIXdpbm5vdyhcblx0XHRcdHRoaXMsXG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXRcblx0XHRcdC8vIHNvICQoXCJwOmZpcnN0XCIpLmlzKFwicDpsYXN0XCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRoIHR3byBcInBcIi5cblx0XHRcdHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiAmJiBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgP1xuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9yICkgOlxuXHRcdFx0XHRzZWxlY3RvciB8fCBbXSxcblx0XHRcdGZhbHNlXG5cdFx0KS5sZW5ndGg7XG5cdH1cbn0gKTtcblxuXG4vLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdFxuXG5cbi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KVxudmFyIHJvb3RqUXVlcnksXG5cblx0Ly8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Ncblx0Ly8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKVxuXHQvLyBTdHJpY3QgSFRNTCByZWNvZ25pdGlvbiAoIzExMjkwOiBtdXN0IHN0YXJ0IHdpdGggPClcblx0Ly8gU2hvcnRjdXQgc2ltcGxlICNpZCBjYXNlIGZvciBzcGVlZFxuXHRycXVpY2tFeHByID0gL14oPzpcXHMqKDxbXFx3XFxXXSs+KVtePl0qfCMoW1xcdy1dKykpJC8sXG5cblx0aW5pdCA9IGpRdWVyeS5mbi5pbml0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByb290ICkge1xuXHRcdHZhciBtYXRjaCwgZWxlbTtcblxuXHRcdC8vIEhBTkRMRTogJChcIlwiKSwgJChudWxsKSwgJCh1bmRlZmluZWQpLCAkKGZhbHNlKVxuXHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Ly8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5XG5cdFx0Ly8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKVxuXHRcdHJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7XG5cblx0XHQvLyBIYW5kbGUgSFRNTCBzdHJpbmdzXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRpZiAoIHNlbGVjdG9yWyAwIF0gPT09IFwiPFwiICYmXG5cdFx0XHRcdHNlbGVjdG9yWyBzZWxlY3Rvci5sZW5ndGggLSAxIF0gPT09IFwiPlwiICYmXG5cdFx0XHRcdHNlbGVjdG9yLmxlbmd0aCA+PSAzICkge1xuXG5cdFx0XHRcdC8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrXG5cdFx0XHRcdG1hdGNoID0gWyBudWxsLCBzZWxlY3RvciwgbnVsbCBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZFxuXHRcdFx0aWYgKCBtYXRjaCAmJiAoIG1hdGNoWyAxIF0gfHwgIWNvbnRleHQgKSApIHtcblxuXHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSlcblx0XHRcdFx0aWYgKCBtYXRjaFsgMSBdICkge1xuXHRcdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDtcblxuXHRcdFx0XHRcdC8vIE9wdGlvbiB0byBydW4gc2NyaXB0cyBpcyB0cnVlIGZvciBiYWNrLWNvbXBhdFxuXHRcdFx0XHRcdC8vIEludGVudGlvbmFsbHkgbGV0IHRoZSBlcnJvciBiZSB0aHJvd24gaWYgcGFyc2VIVE1MIGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLCBqUXVlcnkucGFyc2VIVE1MKFxuXHRcdFx0XHRcdFx0bWF0Y2hbIDEgXSxcblx0XHRcdFx0XHRcdGNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsXG5cdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0KSApO1xuXG5cdFx0XHRcdFx0Ly8gSEFORExFOiAkKGh0bWwsIHByb3BzKVxuXHRcdFx0XHRcdGlmICggcnNpbmdsZVRhZy50ZXN0KCBtYXRjaFsgMSBdICkgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHtcblx0XHRcdFx0XHRcdGZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZVxuXHRcdFx0XHRcdFx0XHRpZiAoIGlzRnVuY3Rpb24oIHRoaXNbIG1hdGNoIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRjaCBdICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRlc1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYXR0ciggbWF0Y2gsIGNvbnRleHRbIG1hdGNoIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJCgjaWQpXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsgMiBdICk7XG5cblx0XHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHRcdC8vIEluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0XG5cdFx0XHRcdFx0XHR0aGlzWyAwIF0gPSBlbGVtO1xuXHRcdFx0XHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKVxuXHRcdFx0fSBlbHNlIGlmICggIWNvbnRleHQgfHwgY29udGV4dC5qcXVlcnkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGNvbnRleHQgfHwgcm9vdCApLmZpbmQoIHNlbGVjdG9yICk7XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KVxuXHRcdFx0Ly8gKHdoaWNoIGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZXh0KS5maW5kKGV4cHIpXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvciggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHQvLyBIQU5ETEU6ICQoRE9NRWxlbWVudClcblx0XHR9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHtcblx0XHRcdHRoaXNbIDAgXSA9IHNlbGVjdG9yO1xuXHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHQvLyBIQU5ETEU6ICQoZnVuY3Rpb24pXG5cdFx0Ly8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5XG5cdFx0fSBlbHNlIGlmICggaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHtcblx0XHRcdHJldHVybiByb290LnJlYWR5ICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRyb290LnJlYWR5KCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBFeGVjdXRlIGltbWVkaWF0ZWx5IGlmIHJlYWR5IGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdHNlbGVjdG9yKCBqUXVlcnkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTtcblx0fTtcblxuLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvblxuaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47XG5cbi8vIEluaXRpYWxpemUgY2VudHJhbCByZWZlcmVuY2VcbnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7XG5cblxudmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLFxuXG5cdC8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0XG5cdGd1YXJhbnRlZWRVbmlxdWUgPSB7XG5cdFx0Y2hpbGRyZW46IHRydWUsXG5cdFx0Y29udGVudHM6IHRydWUsXG5cdFx0bmV4dDogdHJ1ZSxcblx0XHRwcmV2OiB0cnVlXG5cdH07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0aGFzOiBmdW5jdGlvbiggdGFyZ2V0ICkge1xuXHRcdHZhciB0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMgKSxcblx0XHRcdGwgPSB0YXJnZXRzLmxlbmd0aDtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzWyBpIF0gKSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRjbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkge1xuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aCxcblx0XHRcdG1hdGNoZWQgPSBbXSxcblx0XHRcdHRhcmdldHMgPSB0eXBlb2Ygc2VsZWN0b3JzICE9PSBcInN0cmluZ1wiICYmIGpRdWVyeSggc2VsZWN0b3JzICk7XG5cblx0XHQvLyBQb3NpdGlvbmFsIHNlbGVjdG9ycyBuZXZlciBtYXRjaCwgc2luY2UgdGhlcmUncyBubyBfc2VsZWN0aW9uXyBjb250ZXh0XG5cdFx0aWYgKCAhcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvcnMgKSApIHtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zm9yICggY3VyID0gdGhpc1sgaSBdOyBjdXIgJiYgY3VyICE9PSBjb250ZXh0OyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblxuXHRcdFx0XHRcdC8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50c1xuXHRcdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID9cblx0XHRcdFx0XHRcdHRhcmdldHMuaW5kZXgoIGN1ciApID4gLTEgOlxuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGVcblx0XHRcdFx0XHRcdGN1ci5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHtcblxuXHRcdFx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZVNvcnQoIG1hdGNoZWQgKSA6IG1hdGNoZWQgKTtcblx0fSxcblxuXHQvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXRcblx0aW5kZXg6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnRcblx0XHRpZiAoICFlbGVtICkge1xuXHRcdFx0cmV0dXJuICggdGhpc1sgMCBdICYmIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgPyB0aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aCA6IC0xO1xuXHRcdH1cblxuXHRcdC8vIEluZGV4IGluIHNlbGVjdG9yXG5cdFx0aWYgKCB0eXBlb2YgZWxlbSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBpbmRleE9mLmNhbGwoIGpRdWVyeSggZWxlbSApLCB0aGlzWyAwIF0gKTtcblx0XHR9XG5cblx0XHQvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnRcblx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLFxuXG5cdFx0XHQvLyBJZiBpdCByZWNlaXZlcyBhIGpRdWVyeSBvYmplY3QsIHRoZSBmaXJzdCBlbGVtZW50IGlzIHVzZWRcblx0XHRcdGVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKFxuXHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoXG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApIClcblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdGFkZEJhY2s6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgP1xuXHRcdFx0dGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKVxuXHRcdCk7XG5cdH1cbn0gKTtcblxuZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7XG5cdHdoaWxlICggKCBjdXIgPSBjdXJbIGRpciBdICkgJiYgY3VyLm5vZGVUeXBlICE9PSAxICkge31cblx0cmV0dXJuIGN1cjtcbn1cblxualF1ZXJ5LmVhY2goIHtcblx0cGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxMSA/IHBhcmVudCA6IG51bGw7XG5cdH0sXG5cdHBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiICk7XG5cdH0sXG5cdHBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIF9pLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInBhcmVudE5vZGVcIiwgdW50aWwgKTtcblx0fSxcblx0bmV4dDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiApO1xuXHR9LFxuXHRuZXh0QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldkFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiApO1xuXHR9LFxuXHRuZXh0VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBfaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBfaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0c2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7XG5cdH0sXG5cdGNoaWxkcmVuOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZ3MoIGVsZW0uZmlyc3RDaGlsZCApO1xuXHR9LFxuXHRjb250ZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0aWYgKCBlbGVtLmNvbnRlbnREb2N1bWVudCAhPSBudWxsICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExK1xuXHRcdFx0Ly8gPG9iamVjdD4gZWxlbWVudHMgd2l0aCBubyBgZGF0YWAgYXR0cmlidXRlIGhhcyBhbiBvYmplY3Rcblx0XHRcdC8vIGBjb250ZW50RG9jdW1lbnRgIHdpdGggYSBgbnVsbGAgcHJvdG90eXBlLlxuXHRcdFx0Z2V0UHJvdG8oIGVsZW0uY29udGVudERvY3VtZW50ICkgKSB7XG5cblx0XHRcdHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudDtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seSwgaU9TIDcgb25seSwgQW5kcm9pZCBCcm93c2VyIDw9NC4zIG9ubHlcblx0XHQvLyBUcmVhdCB0aGUgdGVtcGxhdGUgZWxlbWVudCBhcyBhIHJlZ3VsYXIgb25lIGluIGJyb3dzZXJzIHRoYXRcblx0XHQvLyBkb24ndCBzdXBwb3J0IGl0LlxuXHRcdGlmICggbm9kZU5hbWUoIGVsZW0sIFwidGVtcGxhdGVcIiApICkge1xuXHRcdFx0ZWxlbSA9IGVsZW0uY29udGVudCB8fCBlbGVtO1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmNoaWxkTm9kZXMgKTtcblx0fVxufSwgZnVuY3Rpb24oIG5hbWUsIGZuICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7XG5cdFx0dmFyIG1hdGNoZWQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTtcblxuXHRcdGlmICggbmFtZS5zbGljZSggLTUgKSAhPT0gXCJVbnRpbFwiICkge1xuXHRcdFx0c2VsZWN0b3IgPSB1bnRpbDtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgZHVwbGljYXRlc1xuXHRcdFx0aWYgKCAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdICkge1xuXHRcdFx0XHRqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlc1xuXHRcdFx0aWYgKCBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkge1xuXHRcdFx0XHRtYXRjaGVkLnJldmVyc2UoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQgKTtcblx0fTtcbn0gKTtcbnZhciBybm90aHRtbHdoaXRlID0gKCAvW15cXHgyMFxcdFxcclxcblxcZl0rL2cgKTtcblxuXG5cbi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzXG5mdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkge1xuXHR2YXIgb2JqZWN0ID0ge307XG5cdGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10sIGZ1bmN0aW9uKCBfLCBmbGFnICkge1xuXHRcdG9iamVjdFsgZmxhZyBdID0gdHJ1ZTtcblx0fSApO1xuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG4vKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4gKlxuICpcdG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMgdGhhdCB3aWxsIGNoYW5nZSBob3dcbiAqXHRcdFx0dGhlIGNhbGxiYWNrIGxpc3QgYmVoYXZlcyBvciBhIG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdFxuICpcbiAqIEJ5IGRlZmF1bHQgYSBjYWxsYmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2FsbGJhY2sgbGlzdCBhbmQgY2FuIGJlXG4gKiBcImZpcmVkXCIgbXVsdGlwbGUgdGltZXMuXG4gKlxuICogUG9zc2libGUgb3B0aW9uczpcbiAqXG4gKlx0b25jZTpcdFx0XHR3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdG1lbW9yeTpcdFx0XHR3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkXG4gKlx0XHRcdFx0XHRhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCBcIm1lbW9yaXplZFwiXG4gKlx0XHRcdFx0XHR2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0dW5pcXVlOlx0XHRcdHdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KVxuICpcbiAqXHRzdG9wT25GYWxzZTpcdGludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICpcbiAqL1xualF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWRcblx0Ly8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KVxuXHRvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgP1xuXHRcdGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6XG5cdFx0alF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTtcblxuXHR2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZ1xuXHRcdGZpcmluZyxcblxuXHRcdC8vIExhc3QgZmlyZSB2YWx1ZSBmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzXG5cdFx0bWVtb3J5LFxuXG5cdFx0Ly8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWRcblx0XHRmaXJlZCxcblxuXHRcdC8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmdcblx0XHRsb2NrZWQsXG5cblx0XHQvLyBBY3R1YWwgY2FsbGJhY2sgbGlzdFxuXHRcdGxpc3QgPSBbXSxcblxuXHRcdC8vIFF1ZXVlIG9mIGV4ZWN1dGlvbiBkYXRhIGZvciByZXBlYXRhYmxlIGxpc3RzXG5cdFx0cXVldWUgPSBbXSxcblxuXHRcdC8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKVxuXHRcdGZpcmluZ0luZGV4ID0gLTEsXG5cblx0XHQvLyBGaXJlIGNhbGxiYWNrc1xuXHRcdGZpcmUgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nXG5cdFx0XHRsb2NrZWQgPSBsb2NrZWQgfHwgb3B0aW9ucy5vbmNlO1xuXG5cdFx0XHQvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucyxcblx0XHRcdC8vIHJlc3BlY3RpbmcgZmlyaW5nSW5kZXggb3ZlcnJpZGVzIGFuZCBydW50aW1lIGNoYW5nZXNcblx0XHRcdGZpcmVkID0gZmlyaW5nID0gdHJ1ZTtcblx0XHRcdGZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkge1xuXHRcdFx0XHRtZW1vcnkgPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0XHR3aGlsZSAoICsrZmlyaW5nSW5kZXggPCBsaXN0Lmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdC8vIFJ1biBjYWxsYmFjayBhbmQgY2hlY2sgZm9yIGVhcmx5IHRlcm1pbmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBtZW1vcnlbIDAgXSwgbWVtb3J5WyAxIF0gKSA9PT0gZmFsc2UgJiZcblx0XHRcdFx0XHRcdG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEp1bXAgdG8gZW5kIGFuZCBmb3JnZXQgdGhlIGRhdGEgc28gLmFkZCBkb2Vzbid0IHJlLWZpcmVcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdFxuXHRcdFx0aWYgKCAhb3B0aW9ucy5tZW1vcnkgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRmaXJpbmcgPSBmYWxzZTtcblxuXHRcdFx0Ly8gQ2xlYW4gdXAgaWYgd2UncmUgZG9uZSBmaXJpbmcgZm9yIGdvb2Rcblx0XHRcdGlmICggbG9ja2VkICkge1xuXG5cdFx0XHRcdC8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHNcblx0XHRcdFx0aWYgKCBtZW1vcnkgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgdGhpcyBvYmplY3QgaXMgc3BlbnRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsaXN0ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdFxuXHRcdHNlbGYgPSB7XG5cblx0XHRcdC8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3Rcblx0XHRcdGFkZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblxuXHRcdFx0XHRcdC8vIElmIHdlIGhhdmUgbWVtb3J5IGZyb20gYSBwYXN0IHJ1biwgd2Ugc2hvdWxkIGZpcmUgYWZ0ZXIgYWRkaW5nXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0cXVldWUucHVzaCggbWVtb3J5ICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0KCBmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoICFvcHRpb25zLnVuaXF1ZSB8fCAhc2VsZi5oYXMoIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGlzdC5wdXNoKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGFyZyAmJiBhcmcubGVuZ3RoICYmIHRvVHlwZSggYXJnICkgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5XG5cdFx0XHRcdFx0XHRcdFx0YWRkKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdH0gKSggYXJndW1lbnRzICk7XG5cblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3Rcblx0XHRcdHJlbW92ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0dmFyIGluZGV4O1xuXHRcdFx0XHRcdHdoaWxlICggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0bGlzdC5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlc1xuXHRcdFx0XHRcdFx0aWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHtcblx0XHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXgtLTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LlxuXHRcdFx0Ly8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuXG5cdFx0XHRoYXM6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0cmV0dXJuIGZuID9cblx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDpcblx0XHRcdFx0XHRsaXN0Lmxlbmd0aCA+IDA7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0XG5cdFx0XHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlIGFuZCAuYWRkXG5cdFx0XHQvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdC8vIENsZWFyIGFsbCBjYWxsYmFja3MgYW5kIHZhbHVlc1xuXHRcdFx0ZGlzYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHRkaXNhYmxlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhbGlzdDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmVcblx0XHRcdC8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpXG5cdFx0XHQvLyBBYm9ydCBhbnkgcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHRsb2NrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gcXVldWUgPSBbXTtcblx0XHRcdFx0aWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IG1lbW9yeSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0bG9ja2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhbG9ja2VkO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkge1xuXHRcdFx0XHRpZiAoICFsb2NrZWQgKSB7XG5cdFx0XHRcdFx0YXJncyA9IGFyZ3MgfHwgW107XG5cdFx0XHRcdFx0YXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBhcmdzICk7XG5cdFx0XHRcdFx0aWYgKCAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzXG5cdFx0XHRmaXJlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0c2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlXG5cdFx0XHRmaXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWZpcmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0cmV0dXJuIHNlbGY7XG59O1xuXG5cbmZ1bmN0aW9uIElkZW50aXR5KCB2ICkge1xuXHRyZXR1cm4gdjtcbn1cbmZ1bmN0aW9uIFRocm93ZXIoIGV4ICkge1xuXHR0aHJvdyBleDtcbn1cblxuZnVuY3Rpb24gYWRvcHRWYWx1ZSggdmFsdWUsIHJlc29sdmUsIHJlamVjdCwgbm9WYWx1ZSApIHtcblx0dmFyIG1ldGhvZDtcblxuXHR0cnkge1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIHByb21pc2UgYXNwZWN0IGZpcnN0IHRvIHByaXZpbGVnZSBzeW5jaHJvbm91cyBiZWhhdmlvclxuXHRcdGlmICggdmFsdWUgJiYgaXNGdW5jdGlvbiggKCBtZXRob2QgPSB2YWx1ZS5wcm9taXNlICkgKSApIHtcblx0XHRcdG1ldGhvZC5jYWxsKCB2YWx1ZSApLmRvbmUoIHJlc29sdmUgKS5mYWlsKCByZWplY3QgKTtcblxuXHRcdC8vIE90aGVyIHRoZW5hYmxlc1xuXHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7XG5cdFx0XHRtZXRob2QuY2FsbCggdmFsdWUsIHJlc29sdmUsIHJlamVjdCApO1xuXG5cdFx0Ly8gT3RoZXIgbm9uLXRoZW5hYmxlc1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIENvbnRyb2wgYHJlc29sdmVgIGFyZ3VtZW50cyBieSBsZXR0aW5nIEFycmF5I3NsaWNlIGNhc3QgYm9vbGVhbiBgbm9WYWx1ZWAgdG8gaW50ZWdlcjpcblx0XHRcdC8vICogZmFsc2U6IFsgdmFsdWUgXS5zbGljZSggMCApID0+IHJlc29sdmUoIHZhbHVlIClcblx0XHRcdC8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpXG5cdFx0XHRyZXNvbHZlLmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXS5zbGljZSggbm9WYWx1ZSApICk7XG5cdFx0fVxuXG5cdC8vIEZvciBQcm9taXNlcy9BKywgY29udmVydCBleGNlcHRpb25zIGludG8gcmVqZWN0aW9uc1xuXHQvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluXG5cdC8vIERlZmVycmVkI3RoZW4gdG8gY29uZGl0aW9uYWxseSBzdXBwcmVzcyByZWplY3Rpb24uXG5cdH0gY2F0Y2ggKCB2YWx1ZSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIG9ubHlcblx0XHQvLyBTdHJpY3QgbW9kZSBmdW5jdGlvbnMgaW52b2tlZCB3aXRob3V0IC5jYWxsLy5hcHBseSBnZXQgZ2xvYmFsLW9iamVjdCBjb250ZXh0XG5cdFx0cmVqZWN0LmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXSApO1xuXHR9XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHREZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7XG5cdFx0dmFyIHR1cGxlcyA9IFtcblxuXHRcdFx0XHQvLyBhY3Rpb24sIGFkZCBsaXN0ZW5lciwgY2FsbGJhY2tzLFxuXHRcdFx0XHQvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdXG5cdFx0XHRcdFsgXCJub3RpZnlcIiwgXCJwcm9ncmVzc1wiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApLCAyIF0sXG5cdFx0XHRcdFsgXCJyZXNvbHZlXCIsIFwiZG9uZVwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgMCwgXCJyZXNvbHZlZFwiIF0sXG5cdFx0XHRcdFsgXCJyZWplY3RcIiwgXCJmYWlsXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCAxLCBcInJlamVjdGVkXCIgXVxuXHRcdFx0XSxcblx0XHRcdHN0YXRlID0gXCJwZW5kaW5nXCIsXG5cdFx0XHRwcm9taXNlID0ge1xuXHRcdFx0XHRzdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0YXRlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRhbHdheXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRcImNhdGNoXCI6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIEtlZXAgcGlwZSBmb3IgYmFjay1jb21wYXRcblx0XHRcdFx0cGlwZTogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkge1xuXHRcdFx0XHRcdHZhciBmbnMgPSBhcmd1bWVudHM7XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggX2ksIHR1cGxlICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE1hcCB0dXBsZXMgKHByb2dyZXNzLCBkb25lLCBmYWlsKSB0byBhcmd1bWVudHMgKGRvbmUsIGZhaWwsIHByb2dyZXNzKVxuXHRcdFx0XHRcdFx0XHR2YXIgZm4gPSBpc0Z1bmN0aW9uKCBmbnNbIHR1cGxlWyA0IF0gXSApICYmIGZuc1sgdHVwbGVbIDQgXSBdO1xuXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLnByb2dyZXNzKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLm5vdGlmeSB9KVxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5kb25lKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlc29sdmUgfSlcblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQuZmFpbChmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZWplY3QgfSlcblx0XHRcdFx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAxIF0gXSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggcmV0dXJuZWQgJiYgaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQucHJvbWlzZSgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5IClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmRvbmUoIG5ld0RlZmVyLnJlc29sdmUgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZmFpbCggbmV3RGVmZXIucmVqZWN0ICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXShcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm4gPyBbIHJldHVybmVkIF0gOiBhcmd1bWVudHNcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHRmbnMgPSBudWxsO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoZW46IGZ1bmN0aW9uKCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgb25Qcm9ncmVzcyApIHtcblx0XHRcdFx0XHR2YXIgbWF4RGVwdGggPSAwO1xuXHRcdFx0XHRcdGZ1bmN0aW9uIHJlc29sdmUoIGRlcHRoLCBkZWZlcnJlZCwgaGFuZGxlciwgc3BlY2lhbCApIHtcblx0XHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0dmFyIHRoYXQgPSB0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBhcmd1bWVudHMsXG5cdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkLCB0aGVuO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuM1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElnbm9yZSBkb3VibGUtcmVzb2x1dGlvbiBhdHRlbXB0c1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkZXB0aCA8IG1heERlcHRoICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkID0gaGFuZGxlci5hcHBseSggdGhhdCwgYXJncyApO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4xXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC00OFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCA9PT0gZGVmZXJyZWQucHJvbWlzZSgpICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCBcIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvblwiICk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb25zIDIuMy4zLjEsIDMuNVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTRcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTc1XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBSZXRyaWV2ZSBgdGhlbmAgb25seSBvbmNlXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGVuID0gcmV0dXJuZWQgJiZcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy40XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTY0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgY2hlY2sgb2JqZWN0cyBhbmQgZnVuY3Rpb25zIGZvciB0aGVuYWJpbGl0eVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoIHR5cGVvZiByZXR1cm5lZCA9PT0gXCJvYmplY3RcIiB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGVvZiByZXR1cm5lZCA9PT0gXCJmdW5jdGlvblwiICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQudGhlbjtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGEgcmV0dXJuZWQgdGhlbmFibGVcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggdGhlbiApICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFNwZWNpYWwgcHJvY2Vzc29ycyAobm90aWZ5KSBqdXN0IHdhaXQgZm9yIHJlc29sdXRpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoZW4uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBhbHNvIGhvb2sgaW50byBwcm9ncmVzc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIGRpc3JlZ2FyZCBvbGRlciByZXNvbHV0aW9uIHZhbHVlc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1heERlcHRoKys7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGVuLmNhbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgVGhyb3dlciwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgYWxsIG90aGVyIHJldHVybmVkIHZhbHVlc1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGFuZCBtdWx0aXBsZSB2YWx1ZXMgKG5vbi1zcGVjIGJlaGF2aW9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGhhbmRsZXIgIT09IElkZW50aXR5ICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncyA9IFsgcmV0dXJuZWQgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFByb2Nlc3MgdGhlIHZhbHVlKHMpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERlZmF1bHQgcHJvY2VzcyBpcyByZXNvbHZlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCggc3BlY2lhbCB8fCBkZWZlcnJlZC5yZXNvbHZlV2l0aCApKCB0aGF0LCBhcmdzICk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgbm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGNhdGNoIGFuZCByZWplY3QgZXhjZXB0aW9uc1xuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MgPSBzcGVjaWFsID9cblx0XHRcdFx0XHRcdFx0XHRcdG1pZ2h0VGhyb3cgOlxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayggZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5zdGFja1RyYWNlICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjQuMVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTYxXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWdub3JlIHBvc3QtcmVzb2x1dGlvbiBleGNlcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkZXB0aCArIDEgPj0gbWF4RGVwdGggKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgc3Vic3RpdHV0ZSBoYW5kbGVycyBwYXNzIG9uIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGFuZCBtdWx0aXBsZSB2YWx1ZXMgKG5vbi1zcGVjIGJlaGF2aW9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBoYW5kbGVyICE9PSBUaHJvd2VyICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gWyBlIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIHRoYXQsIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjFcblx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTdcblx0XHRcdFx0XHRcdFx0Ly8gUmUtcmVzb2x2ZSBwcm9taXNlcyBpbW1lZGlhdGVseSB0byBkb2RnZSBmYWxzZSByZWplY3Rpb24gZnJvbVxuXHRcdFx0XHRcdFx0XHQvLyBzdWJzZXF1ZW50IGVycm9yc1xuXHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICkge1xuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIENhbGwgYW4gb3B0aW9uYWwgaG9vayB0byByZWNvcmQgdGhlIHN0YWNrLCBpbiBjYXNlIG9mIGV4Y2VwdGlvblxuXHRcdFx0XHRcdFx0XHRcdC8vIHNpbmNlIGl0J3Mgb3RoZXJ3aXNlIGxvc3Qgd2hlbiBleGVjdXRpb24gZ29lcyBhc3luY1xuXHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3Muc3RhY2tUcmFjZSA9IGpRdWVyeS5EZWZlcnJlZC5nZXRTdGFja0hvb2soKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIHByb2Nlc3MgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25Qcm9ncmVzcyApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uUHJvZ3Jlc3MgOlxuXHRcdFx0XHRcdFx0XHRcdFx0SWRlbnRpdHksXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIubm90aWZ5V2l0aFxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAxIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvbkZ1bGZpbGxlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uRnVsZmlsbGVkIDpcblx0XHRcdFx0XHRcdFx0XHRcdElkZW50aXR5XG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMiBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25SZWplY3RlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uUmVqZWN0ZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0VGhyb3dlclxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZFxuXHRcdFx0XHQvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0XG5cdFx0XHRcdHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVmZXJyZWQgPSB7fTtcblxuXHRcdC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHNcblx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHR2YXIgbGlzdCA9IHR1cGxlWyAyIF0sXG5cdFx0XHRcdHN0YXRlU3RyaW5nID0gdHVwbGVbIDUgXTtcblxuXHRcdFx0Ly8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkXG5cdFx0XHQvLyBwcm9taXNlLmRvbmUgPSBsaXN0LmFkZFxuXHRcdFx0Ly8gcHJvbWlzZS5mYWlsID0gbGlzdC5hZGRcblx0XHRcdHByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGVcblx0XHRcdGlmICggc3RhdGVTdHJpbmcgKSB7XG5cdFx0XHRcdGxpc3QuYWRkKFxuXHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdFx0XHQvLyBzdGF0ZSA9IFwicmVzb2x2ZWRcIiAoaS5lLiwgZnVsZmlsbGVkKVxuXHRcdFx0XHRcdFx0Ly8gc3RhdGUgPSBcInJlamVjdGVkXCJcblx0XHRcdFx0XHRcdHN0YXRlID0gc3RhdGVTdHJpbmc7XG5cdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdC8vIHJlamVjdGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0Ly8gZnVsZmlsbGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0dHVwbGVzWyAzIC0gaSBdWyAyIF0uZGlzYWJsZSxcblxuXHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGVcblx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZVxuXHRcdFx0XHRcdHR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsXG5cblx0XHRcdFx0XHQvLyBwcm9ncmVzc19jYWxsYmFja3MubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAyIF0ubG9jayxcblxuXHRcdFx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmxvY2tcblx0XHRcdFx0XHR0dXBsZXNbIDAgXVsgMyBdLmxvY2tcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gZnVsZmlsbGVkX2hhbmRsZXJzLmZpcmVcblx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmVcblx0XHRcdGxpc3QuYWRkKCB0dXBsZVsgMyBdLmZpcmUgKTtcblxuXHRcdFx0Ly8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlc29sdmVXaXRoKC4uLikgfVxuXHRcdFx0Ly8gZGVmZXJyZWQucmVqZWN0ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlamVjdFdpdGgoLi4uKSB9XG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyB1bmRlZmluZWQgOiB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0Ly8gZGVmZXJyZWQucmVzb2x2ZVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3RXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdID0gbGlzdC5maXJlV2l0aDtcblx0XHR9ICk7XG5cblx0XHQvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2Vcblx0XHRwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7XG5cblx0XHQvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55XG5cdFx0aWYgKCBmdW5jICkge1xuXHRcdFx0ZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGwgZG9uZSFcblx0XHRyZXR1cm4gZGVmZXJyZWQ7XG5cdH0sXG5cblx0Ly8gRGVmZXJyZWQgaGVscGVyXG5cdHdoZW46IGZ1bmN0aW9uKCBzaW5nbGVWYWx1ZSApIHtcblx0XHR2YXJcblxuXHRcdFx0Ly8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzXG5cdFx0XHRyZW1haW5pbmcgPSBhcmd1bWVudHMubGVuZ3RoLFxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHNcblx0XHRcdGkgPSByZW1haW5pbmcsXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGFcblx0XHRcdHJlc29sdmVDb250ZXh0cyA9IEFycmF5KCBpICksXG5cdFx0XHRyZXNvbHZlVmFsdWVzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cblx0XHRcdC8vIHRoZSBtYXN0ZXIgRGVmZXJyZWRcblx0XHRcdG1hc3RlciA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXG5cdFx0XHQvLyBzdWJvcmRpbmF0ZSBjYWxsYmFjayBmYWN0b3J5XG5cdFx0XHR1cGRhdGVGdW5jID0gZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZUNvbnRleHRzWyBpIF0gPSB0aGlzO1xuXHRcdFx0XHRcdHJlc29sdmVWYWx1ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gc2xpY2UuY2FsbCggYXJndW1lbnRzICkgOiB2YWx1ZTtcblx0XHRcdFx0XHRpZiAoICEoIC0tcmVtYWluaW5nICkgKSB7XG5cdFx0XHRcdFx0XHRtYXN0ZXIucmVzb2x2ZVdpdGgoIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHQvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmVcblx0XHRpZiAoIHJlbWFpbmluZyA8PSAxICkge1xuXHRcdFx0YWRvcHRWYWx1ZSggc2luZ2xlVmFsdWUsIG1hc3Rlci5kb25lKCB1cGRhdGVGdW5jKCBpICkgKS5yZXNvbHZlLCBtYXN0ZXIucmVqZWN0LFxuXHRcdFx0XHQhcmVtYWluaW5nICk7XG5cblx0XHRcdC8vIFVzZSAudGhlbigpIHRvIHVud3JhcCBzZWNvbmRhcnkgdGhlbmFibGVzIChjZi4gZ2gtMzAwMClcblx0XHRcdGlmICggbWFzdGVyLnN0YXRlKCkgPT09IFwicGVuZGluZ1wiIHx8XG5cdFx0XHRcdGlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXSAmJiByZXNvbHZlVmFsdWVzWyBpIF0udGhlbiApICkge1xuXG5cdFx0XHRcdHJldHVybiBtYXN0ZXIudGhlbigpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgYWdncmVnYXRlZCBsaWtlIFByb21pc2UuYWxsIGFycmF5IGVsZW1lbnRzXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRhZG9wdFZhbHVlKCByZXNvbHZlVmFsdWVzWyBpIF0sIHVwZGF0ZUZ1bmMoIGkgKSwgbWFzdGVyLnJlamVjdCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBtYXN0ZXIucHJvbWlzZSgpO1xuXHR9XG59ICk7XG5cblxuLy8gVGhlc2UgdXN1YWxseSBpbmRpY2F0ZSBhIHByb2dyYW1tZXIgbWlzdGFrZSBkdXJpbmcgZGV2ZWxvcG1lbnQsXG4vLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC5cbnZhciByZXJyb3JOYW1lcyA9IC9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1xuXG5qUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgc3RhY2sgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgOCAtIDkgb25seVxuXHQvLyBDb25zb2xlIGV4aXN0cyB3aGVuIGRldiB0b29scyBhcmUgb3Blbiwgd2hpY2ggY2FuIGhhcHBlbiBhdCBhbnkgdGltZVxuXHRpZiAoIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLndhcm4gJiYgZXJyb3IgJiYgcmVycm9yTmFtZXMudGVzdCggZXJyb3IubmFtZSApICkge1xuXHRcdHdpbmRvdy5jb25zb2xlLndhcm4oIFwialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogXCIgKyBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjaywgc3RhY2sgKTtcblx0fVxufTtcblxuXG5cblxualF1ZXJ5LnJlYWR5RXhjZXB0aW9uID0gZnVuY3Rpb24oIGVycm9yICkge1xuXHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0dGhyb3cgZXJyb3I7XG5cdH0gKTtcbn07XG5cblxuXG5cbi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeVxudmFyIHJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5qUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7XG5cblx0cmVhZHlMaXN0XG5cdFx0LnRoZW4oIGZuIClcblxuXHRcdC8vIFdyYXAgalF1ZXJ5LnJlYWR5RXhjZXB0aW9uIGluIGEgZnVuY3Rpb24gc28gdGhhdCB0aGUgbG9va3VwXG5cdFx0Ly8gaGFwcGVucyBhdCB0aGUgdGltZSBvZiBlcnJvciBoYW5kbGluZyBpbnN0ZWFkIG9mIGNhbGxiYWNrXG5cdFx0Ly8gcmVnaXN0cmF0aW9uLlxuXHRcdC5jYXRjaCggZnVuY3Rpb24oIGVycm9yICkge1xuXHRcdFx0alF1ZXJ5LnJlYWR5RXhjZXB0aW9uKCBlcnJvciApO1xuXHRcdH0gKTtcblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLlxuXHRpc1JlYWR5OiBmYWxzZSxcblxuXHQvLyBBIGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlXG5cdC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxXG5cdHJlYWR5V2FpdDogMSxcblxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XG5cdHJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHtcblxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcblx0XHRpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHlcblx0XHRqUXVlcnkuaXNSZWFkeSA9IHRydWU7XG5cblx0XHQvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZVxuXHRcdGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcblx0XHRyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjtcblxuLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2RcbmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHtcblx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCApO1xuXHRqUXVlcnkucmVhZHkoKTtcbn1cblxuLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWRcbi8vIGFmdGVyIHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLlxuLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seVxuLy8gT2xkZXIgSUUgc29tZXRpbWVzIHNpZ25hbHMgXCJpbnRlcmFjdGl2ZVwiIHRvbyBzb29uXG5pZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIiB8fFxuXHQoIGRvY3VtZW50LnJlYWR5U3RhdGUgIT09IFwibG9hZGluZ1wiICYmICFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgKSApIHtcblxuXHQvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHlcblx0d2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApO1xuXG59IGVsc2Uge1xuXG5cdC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2tcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXG5cdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG59XG5cblxuXG5cbi8vIE11bHRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlvblxuLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uXG52YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGJ1bGsgPSBrZXkgPT0gbnVsbDtcblxuXHQvLyBTZXRzIG1hbnkgdmFsdWVzXG5cdGlmICggdG9UeXBlKCBrZXkgKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXHRcdGZvciAoIGkgaW4ga2V5ICkge1xuXHRcdFx0YWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVsgaSBdLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7XG5cdFx0fVxuXG5cdC8vIFNldHMgb25lIHZhbHVlXG5cdH0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblxuXHRcdGlmICggIWlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyYXcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICggYnVsayApIHtcblxuXHRcdFx0Ly8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0XG5cdFx0XHRpZiAoIHJhdyApIHtcblx0XHRcdFx0Zm4uY2FsbCggZWxlbXMsIHZhbHVlICk7XG5cdFx0XHRcdGZuID0gbnVsbDtcblxuXHRcdFx0Ly8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnVsayA9IGZuO1xuXHRcdFx0XHRmbiA9IGZ1bmN0aW9uKCBlbGVtLCBfa2V5LCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdGZuKFxuXHRcdFx0XHRcdGVsZW1zWyBpIF0sIGtleSwgcmF3ID9cblx0XHRcdFx0XHR2YWx1ZSA6XG5cdFx0XHRcdFx0dmFsdWUuY2FsbCggZWxlbXNbIGkgXSwgaSwgZm4oIGVsZW1zWyBpIF0sIGtleSApIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoIGNoYWluYWJsZSApIHtcblx0XHRyZXR1cm4gZWxlbXM7XG5cdH1cblxuXHQvLyBHZXRzXG5cdGlmICggYnVsayApIHtcblx0XHRyZXR1cm4gZm4uY2FsbCggZWxlbXMgKTtcblx0fVxuXG5cdHJldHVybiBsZW4gPyBmbiggZWxlbXNbIDAgXSwga2V5ICkgOiBlbXB0eUdldDtcbn07XG5cblxuLy8gTWF0Y2hlcyBkYXNoZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nXG52YXIgcm1zUHJlZml4ID0gL14tbXMtLyxcblx0cmRhc2hBbHBoYSA9IC8tKFthLXpdKS9nO1xuXG4vLyBVc2VkIGJ5IGNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKClcbmZ1bmN0aW9uIGZjYW1lbENhc2UoIF9hbGwsIGxldHRlciApIHtcblx0cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xufVxuXG4vLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSwgRWRnZSAxMiAtIDE1XG4vLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpXG5mdW5jdGlvbiBjYW1lbENhc2UoIHN0cmluZyApIHtcblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsIFwibXMtXCIgKS5yZXBsYWNlKCByZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7XG59XG52YXIgYWNjZXB0RGF0YSA9IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHQvLyBBY2NlcHRzIG9ubHk6XG5cdC8vICAtIE5vZGVcblx0Ly8gICAgLSBOb2RlLkVMRU1FTlRfTk9ERVxuXHQvLyAgICAtIE5vZGUuRE9DVU1FTlRfTk9ERVxuXHQvLyAgLSBPYmplY3Rcblx0Ly8gICAgLSBBbnlcblx0cmV0dXJuIG93bmVyLm5vZGVUeXBlID09PSAxIHx8IG93bmVyLm5vZGVUeXBlID09PSA5IHx8ICEoICtvd25lci5ub2RlVHlwZSApO1xufTtcblxuXG5cblxuZnVuY3Rpb24gRGF0YSgpIHtcblx0dGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrO1xufVxuXG5EYXRhLnVpZCA9IDE7XG5cbkRhdGEucHJvdG90eXBlID0ge1xuXG5cdGNhY2hlOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cblx0XHQvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGVcblx0XHR2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHQvLyBJZiBub3QsIGNyZWF0ZSBvbmVcblx0XHRpZiAoICF2YWx1ZSApIHtcblx0XHRcdHZhbHVlID0ge307XG5cblx0XHRcdC8vIFdlIGNhbiBhY2NlcHQgZGF0YSBmb3Igbm9uLWVsZW1lbnQgbm9kZXMgaW4gbW9kZXJuIGJyb3dzZXJzLFxuXHRcdFx0Ly8gYnV0IHdlIHNob3VsZCBub3QsIHNlZSAjODMzNS5cblx0XHRcdC8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LlxuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBvd25lciApICkge1xuXG5cdFx0XHRcdC8vIElmIGl0IGlzIGEgbm9kZSB1bmxpa2VseSB0byBiZSBzdHJpbmdpZnktZWQgb3IgbG9vcGVkIG92ZXJcblx0XHRcdFx0Ly8gdXNlIHBsYWluIGFzc2lnbm1lbnRcblx0XHRcdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB2YWx1ZTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2Ugc2VjdXJlIGl0IGluIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHlcblx0XHRcdFx0Ly8gY29uZmlndXJhYmxlIG11c3QgYmUgdHJ1ZSB0byBhbGxvdyB0aGUgcHJvcGVydHkgdG8gYmVcblx0XHRcdFx0Ly8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggb3duZXIsIHRoaXMuZXhwYW5kbywge1xuXHRcdFx0XHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7XG5cdFx0dmFyIHByb3AsXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGUoIG93bmVyICk7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwgdmFsdWUgXSBhcmdzXG5cdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBkYXRhICkgXSA9IHZhbHVlO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3Ncblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUgdG8gdGhlIGNhY2hlIG9iamVjdFxuXHRcdFx0Zm9yICggcHJvcCBpbiBkYXRhICkge1xuXHRcdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBwcm9wICkgXSA9IGRhdGFbIHByb3AgXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNhY2hlO1xuXHR9LFxuXHRnZXQ6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzLmNhY2hlKCBvd25lciApIDpcblxuXHRcdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdICYmIG93bmVyWyB0aGlzLmV4cGFuZG8gXVsgY2FtZWxDYXNlKCBrZXkgKSBdO1xuXHR9LFxuXHRhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHtcblxuXHRcdC8vIEluIGNhc2VzIHdoZXJlIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gTm8ga2V5IHdhcyBzcGVjaWZpZWRcblx0XHQvLyAgIDIuIEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBidXQgbm8gdmFsdWUgcHJvdmlkZWRcblx0XHQvL1xuXHRcdC8vIFRha2UgdGhlIFwicmVhZFwiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZVxuXHRcdC8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3Rcblx0XHQvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5XG5cdFx0Ly9cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdCggKCBrZXkgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiApICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2hlbiB0aGUga2V5IGlzIG5vdCBhIHN0cmluZywgb3IgYm90aCBhIGtleSBhbmQgdmFsdWVcblx0XHQvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gQW4gb2JqZWN0IG9mIHByb3BlcnRpZXNcblx0XHQvLyAgIDIuIEEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vXG5cdFx0dGhpcy5zZXQoIG93bmVyLCBrZXksIHZhbHVlICk7XG5cblx0XHQvLyBTaW5jZSB0aGUgXCJzZXRcIiBwYXRoIGNhbiBoYXZlIHR3byBwb3NzaWJsZSBlbnRyeSBwb2ludHNcblx0XHQvLyByZXR1cm4gdGhlIGV4cGVjdGVkIGRhdGEgYmFzZWQgb24gd2hpY2ggcGF0aCB3YXMgdGFrZW5bKl1cblx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5O1xuXHR9LFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHZhciBpLFxuXHRcdFx0Y2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHRpZiAoIGNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydCBhcnJheSBvciBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGtleXNcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHNldCBjYW1lbENhc2Uga2V5cywgc28gcmVtb3ZlIHRoYXQuXG5cdFx0XHRcdGtleSA9IGtleS5tYXAoIGNhbWVsQ2FzZSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0a2V5ID0gY2FtZWxDYXNlKCBrZXkgKTtcblxuXHRcdFx0XHQvLyBJZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlXG5cdFx0XHRcdGtleSA9IGtleSBpbiBjYWNoZSA/XG5cdFx0XHRcdFx0WyBrZXkgXSA6XG5cdFx0XHRcdFx0KCBrZXkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpID0ga2V5Lmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgdGhlcmUncyBubyBtb3JlIGRhdGFcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1XG5cdFx0XHQvLyBXZWJraXQgJiBCbGluayBwZXJmb3JtYW5jZSBzdWZmZXJzIHdoZW4gZGVsZXRpbmcgcHJvcGVydGllc1xuXHRcdFx0Ly8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZFxuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzc4NjA3IChidWcgcmVzdHJpY3RlZClcblx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRoYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0dmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdHJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTtcblx0fVxufTtcbnZhciBkYXRhUHJpdiA9IG5ldyBEYXRhKCk7XG5cbnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7XG5cblxuXG4vL1x0SW1wbGVtZW50YXRpb24gU3VtbWFyeVxuLy9cbi8vXHQxLiBFbmZvcmNlIEFQSSBzdXJmYWNlIGFuZCBzZW1hbnRpYyBjb21wYXRpYmlsaXR5IHdpdGggMS45LnggYnJhbmNoXG4vL1x0Mi4gSW1wcm92ZSB0aGUgbW9kdWxlJ3MgbWFpbnRhaW5hYmlsaXR5IGJ5IHJlZHVjaW5nIHRoZSBzdG9yYWdlXG4vL1x0XHRwYXRocyB0byBhIHNpbmdsZSBtZWNoYW5pc20uXG4vL1x0My4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBcInByaXZhdGVcIiBhbmQgXCJ1c2VyXCIgZGF0YS5cbi8vXHQ0LiBfTmV2ZXJfIGV4cG9zZSBcInByaXZhdGVcIiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpXG4vL1x0NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvbiB1c2VyIG9iamVjdHMgKGVnLiBleHBhbmRvIHByb3BlcnRpZXMpXG4vL1x0Ni4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0XG5cbnZhciByYnJhY2UgPSAvXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sXG5cdHJtdWx0aURhc2ggPSAvW0EtWl0vZztcblxuZnVuY3Rpb24gZ2V0RGF0YSggZGF0YSApIHtcblx0aWYgKCBkYXRhID09PSBcInRydWVcIiApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJmYWxzZVwiICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJudWxsXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xuXHRpZiAoIGRhdGEgPT09ICtkYXRhICsgXCJcIiApIHtcblx0XHRyZXR1cm4gK2RhdGE7XG5cdH1cblxuXHRpZiAoIHJicmFjZS50ZXN0KCBkYXRhICkgKSB7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKTtcblx0fVxuXG5cdHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkge1xuXHR2YXIgbmFtZTtcblxuXHQvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55XG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxuXHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJCZcIiApLnRvTG93ZXJDYXNlKCk7XG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGdldERhdGEoIGRhdGEgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge31cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRkYXRhVXNlci5zZXQoIGVsZW0sIGtleSwgZGF0YSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZGF0YTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTtcblx0fSxcblxuXHRkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVVzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH0sXG5cblx0Ly8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWRcblx0Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YVByaXYgbWV0aG9kcywgdGhlc2UgY2FuIGJlIGRlcHJlY2F0ZWQuXG5cdF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0X3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGRhdGEsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0YXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlcztcblxuXHRcdC8vIEdldHMgYWxsIHZhbHVlc1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHRoaXMubGVuZ3RoICkge1xuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhUHJpdi5nZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIgKSApIHtcblx0XHRcdFx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NClcblx0XHRcdFx0XHRcdGlmICggYXR0cnNbIGkgXSApIHtcblx0XHRcdFx0XHRcdFx0bmFtZSA9IGF0dHJzWyBpIF0ubmFtZTtcblx0XHRcdFx0XHRcdFx0aWYgKCBuYW1lLmluZGV4T2YoIFwiZGF0YS1cIiApID09PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdG5hbWUgPSBjYW1lbENhc2UoIG5hbWUuc2xpY2UoIDUgKSApO1xuXHRcdFx0XHRcdFx0XHRcdGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHQvLyBTZXRzIG11bHRpcGxlIHZhbHVlc1xuXHRcdGlmICggdHlwZW9mIGtleSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBkYXRhO1xuXG5cdFx0XHQvLyBUaGUgY2FsbGluZyBqUXVlcnkgb2JqZWN0IChlbGVtZW50IG1hdGNoZXMpIGlzIG5vdCBlbXB0eVxuXHRcdFx0Ly8gKGFuZCB0aGVyZWZvcmUgaGFzIGFuIGVsZW1lbnQgYXBwZWFycyBhdCB0aGlzWyAwIF0pIGFuZCB0aGVcblx0XHRcdC8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0XG5cdFx0XHQvLyB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBmb3IgZWxlbSA9IHRoaXNbIDAgXSB3aGljaCB3aWxsXG5cdFx0XHQvLyB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gYXR0ZW1wdCB0byByZWFkIGEgZGF0YSBjYWNoZSBpcyBtYWRlLlxuXHRcdFx0aWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZVxuXHRcdFx0XHQvLyBUaGUga2V5IHdpbGwgYWx3YXlzIGJlIGNhbWVsQ2FzZWQgaW4gRGF0YVxuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtLCBrZXkgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIFwiZGlzY292ZXJcIiB0aGUgZGF0YSBpblxuXHRcdFx0XHQvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzXG5cdFx0XHRcdGRhdGEgPSBkYXRhQXR0ciggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LlxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCB0aGUgZGF0YS4uLlxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5XG5cdFx0XHRcdGRhdGFVc2VyLnNldCggdGhpcywga2V5LCB2YWx1ZSApO1xuXHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBxdWV1ZTtcblxuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHR5cGUgPSAoIHR5cGUgfHwgXCJmeFwiICkgKyBcInF1ZXVlXCI7XG5cdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHQvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwXG5cdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdGlmICggIXF1ZXVlIHx8IEFycmF5LmlzQXJyYXkoIGRhdGEgKSApIHtcblx0XHRcdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSApICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cXVldWUucHVzaCggZGF0YSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcXVldWUgfHwgW107XG5cdFx0fVxuXHR9LFxuXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLFxuXHRcdFx0c3RhcnRMZW5ndGggPSBxdWV1ZS5sZW5ndGgsXG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCksXG5cdFx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgdHlwZSApLFxuXHRcdFx0bmV4dCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApO1xuXHRcdFx0fTtcblxuXHRcdC8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWxcblx0XHRpZiAoIGZuID09PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdHN0YXJ0TGVuZ3RoLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblxuXHRcdFx0Ly8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZ1xuXHRcdFx0Ly8gYXV0b21hdGljYWxseSBkZXF1ZXVlZFxuXHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgKSB7XG5cdFx0XHRcdHF1ZXVlLnVuc2hpZnQoIFwiaW5wcm9ncmVzc1wiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb25cblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0Zm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTtcblx0XHR9XG5cblx0XHRpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmVcblx0X3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHZhciBrZXkgPSB0eXBlICsgXCJxdWV1ZUhvb2tzXCI7XG5cdFx0cmV0dXJuIGRhdGFQcml2LmdldCggZWxlbSwga2V5ICkgfHwgZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBrZXksIHtcblx0XHRcdGVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKS5hZGQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArIFwicXVldWVcIiwga2V5IF0gKTtcblx0XHRcdH0gKVxuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgc2V0dGVyID0gMjtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRkYXRhID0gdHlwZTtcblx0XHRcdHR5cGUgPSBcImZ4XCI7XG5cdFx0XHRzZXR0ZXItLTtcblx0XHR9XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPCBzZXR0ZXIgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnF1ZXVlKCB0aGlzWyAwIF0sIHR5cGUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdHRoaXMgOlxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBkYXRhICk7XG5cblx0XHRcdFx0Ly8gRW5zdXJlIGEgaG9va3MgZm9yIHRoaXMgcXVldWVcblx0XHRcdFx0alF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7XG5cblx0XHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgJiYgcXVldWVbIDAgXSAhPT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHR9LFxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0fSApO1xuXHR9LFxuXHRjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdH0sXG5cblx0Ly8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZVxuXHQvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdClcblx0cHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHtcblx0XHR2YXIgdG1wLFxuXHRcdFx0Y291bnQgPSAxLFxuXHRcdFx0ZGVmZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGVsZW1lbnRzID0gdGhpcyxcblx0XHRcdGkgPSB0aGlzLmxlbmd0aCxcblx0XHRcdHJlc29sdmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhKCAtLWNvdW50ICkgKSB7XG5cdFx0XHRcdFx0ZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRvYmogPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0bXAgPSBkYXRhUHJpdi5nZXQoIGVsZW1lbnRzWyBpIF0sIHR5cGUgKyBcInF1ZXVlSG9va3NcIiApO1xuXHRcdFx0aWYgKCB0bXAgJiYgdG1wLmVtcHR5ICkge1xuXHRcdFx0XHRjb3VudCsrO1xuXHRcdFx0XHR0bXAuZW1wdHkuYWRkKCByZXNvbHZlICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlc29sdmUoKTtcblx0XHRyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7XG5cdH1cbn0gKTtcbnZhciBwbnVtID0gKCAvWystXT8oPzpcXGQqXFwufClcXGQrKD86W2VFXVsrLV0/XFxkK3wpLyApLnNvdXJjZTtcblxudmFyIHJjc3NOdW0gPSBuZXcgUmVnRXhwKCBcIl4oPzooWystXSk9fCkoXCIgKyBwbnVtICsgXCIpKFthLXolXSopJFwiLCBcImlcIiApO1xuXG5cbnZhciBjc3NFeHBhbmQgPSBbIFwiVG9wXCIsIFwiUmlnaHRcIiwgXCJCb3R0b21cIiwgXCJMZWZ0XCIgXTtcblxudmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXG5cblx0dmFyIGlzQXR0YWNoZWQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApO1xuXHRcdH0sXG5cdFx0Y29tcG9zZWQgPSB7IGNvbXBvc2VkOiB0cnVlIH07XG5cblx0Ly8gU3VwcG9ydDogSUUgOSAtIDExKywgRWRnZSAxMiAtIDE4KywgaU9TIDEwLjAgLSAxMC4yIG9ubHlcblx0Ly8gQ2hlY2sgYXR0YWNobWVudCBhY3Jvc3Mgc2hhZG93IERPTSBib3VuZGFyaWVzIHdoZW4gcG9zc2libGUgKGdoLTM1MDQpXG5cdC8vIFN1cHBvcnQ6IGlPUyAxMC4wLTEwLjIgb25seVxuXHQvLyBFYXJseSBpT1MgMTAgdmVyc2lvbnMgc3VwcG9ydCBgYXR0YWNoU2hhZG93YCBidXQgbm90IGBnZXRSb290Tm9kZWAsXG5cdC8vIGxlYWRpbmcgdG8gZXJyb3JzLiBXZSBuZWVkIHRvIGNoZWNrIGZvciBgZ2V0Um9vdE5vZGVgLlxuXHRpZiAoIGRvY3VtZW50RWxlbWVudC5nZXRSb290Tm9kZSApIHtcblx0XHRpc0F0dGFjaGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSB8fFxuXHRcdFx0XHRlbGVtLmdldFJvb3ROb2RlKCBjb21wb3NlZCApID09PSBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cdFx0fTtcblx0fVxudmFyIGlzSGlkZGVuV2l0aGluVHJlZSA9IGZ1bmN0aW9uKCBlbGVtLCBlbCApIHtcblxuXHRcdC8vIGlzSGlkZGVuV2l0aGluVHJlZSBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uO1xuXHRcdC8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudFxuXHRcdGVsZW0gPSBlbCB8fCBlbGVtO1xuXG5cdFx0Ly8gSW5saW5lIHN0eWxlIHRydW1wcyBhbGxcblx0XHRyZXR1cm4gZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIiB8fFxuXHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmXG5cblx0XHRcdC8vIE90aGVyd2lzZSwgY2hlY2sgY29tcHV0ZWQgc3R5bGVcblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MyAtIDQ1XG5cdFx0XHQvLyBEaXNjb25uZWN0ZWQgZWxlbWVudHMgY2FuIGhhdmUgY29tcHV0ZWQgZGlzcGxheTogbm9uZSwgc28gZmlyc3QgY29uZmlybSB0aGF0IGVsZW0gaXNcblx0XHRcdC8vIGluIHRoZSBkb2N1bWVudC5cblx0XHRcdGlzQXR0YWNoZWQoIGVsZW0gKSAmJlxuXG5cdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApID09PSBcIm5vbmVcIjtcblx0fTtcblxuXG5cbmZ1bmN0aW9uIGFkanVzdENTUyggZWxlbSwgcHJvcCwgdmFsdWVQYXJ0cywgdHdlZW4gKSB7XG5cdHZhciBhZGp1c3RlZCwgc2NhbGUsXG5cdFx0bWF4SXRlcmF0aW9ucyA9IDIwLFxuXHRcdGN1cnJlbnRWYWx1ZSA9IHR3ZWVuID9cblx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uY3VyKCk7XG5cdFx0XHR9IDpcblx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5LmNzcyggZWxlbSwgcHJvcCwgXCJcIiApO1xuXHRcdFx0fSxcblx0XHRpbml0aWFsID0gY3VycmVudFZhbHVlKCksXG5cdFx0dW5pdCA9IHZhbHVlUGFydHMgJiYgdmFsdWVQYXJ0c1sgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApLFxuXG5cdFx0Ly8gU3RhcnRpbmcgdmFsdWUgY29tcHV0YXRpb24gaXMgcmVxdWlyZWQgZm9yIHBvdGVudGlhbCB1bml0IG1pc21hdGNoZXNcblx0XHRpbml0aWFsSW5Vbml0ID0gZWxlbS5ub2RlVHlwZSAmJlxuXHRcdFx0KCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gfHwgdW5pdCAhPT0gXCJweFwiICYmICtpbml0aWFsICkgJiZcblx0XHRcdHJjc3NOdW0uZXhlYyggalF1ZXJ5LmNzcyggZWxlbSwgcHJvcCApICk7XG5cblx0aWYgKCBpbml0aWFsSW5Vbml0ICYmIGluaXRpYWxJblVuaXRbIDMgXSAhPT0gdW5pdCApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD01NFxuXHRcdC8vIEhhbHZlIHRoZSBpdGVyYXRpb24gdGFyZ2V0IHZhbHVlIHRvIHByZXZlbnQgaW50ZXJmZXJlbmNlIGZyb20gQ1NTIHVwcGVyIGJvdW5kcyAoZ2gtMjE0NClcblx0XHRpbml0aWFsID0gaW5pdGlhbCAvIDI7XG5cblx0XHQvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzXG5cdFx0dW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdO1xuXG5cdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWwgfHwgMTtcblxuXHRcdHdoaWxlICggbWF4SXRlcmF0aW9ucy0tICkge1xuXG5cdFx0XHQvLyBFdmFsdWF0ZSBhbmQgdXBkYXRlIG91ciBiZXN0IGd1ZXNzIChkb3VibGluZyBndWVzc2VzIHRoYXQgemVybyBvdXQpLlxuXHRcdFx0Ly8gRmluaXNoIGlmIHRoZSBzY2FsZSBlcXVhbHMgb3IgY3Jvc3NlcyAxIChtYWtpbmcgdGhlIG9sZCpuZXcgcHJvZHVjdCBub24tcG9zaXRpdmUpLlxuXHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApO1xuXHRcdFx0aWYgKCAoIDEgLSBzY2FsZSApICogKCAxIC0gKCBzY2FsZSA9IGN1cnJlbnRWYWx1ZSgpIC8gaW5pdGlhbCB8fCAwLjUgKSApIDw9IDAgKSB7XG5cdFx0XHRcdG1heEl0ZXJhdGlvbnMgPSAwO1xuXHRcdFx0fVxuXHRcdFx0aW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgLyBzY2FsZTtcblxuXHRcdH1cblxuXHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0ICogMjtcblx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgd2UgdXBkYXRlIHRoZSB0d2VlbiBwcm9wZXJ0aWVzIGxhdGVyIG9uXG5cdFx0dmFsdWVQYXJ0cyA9IHZhbHVlUGFydHMgfHwgW107XG5cdH1cblxuXHRpZiAoIHZhbHVlUGFydHMgKSB7XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsSW5Vbml0IHx8ICtpbml0aWFsIHx8IDA7XG5cblx0XHQvLyBBcHBseSByZWxhdGl2ZSBvZmZzZXQgKCs9Ly09KSBpZiBzcGVjaWZpZWRcblx0XHRhZGp1c3RlZCA9IHZhbHVlUGFydHNbIDEgXSA/XG5cdFx0XHRpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOlxuXHRcdFx0K3ZhbHVlUGFydHNbIDIgXTtcblx0XHRpZiAoIHR3ZWVuICkge1xuXHRcdFx0dHdlZW4udW5pdCA9IHVuaXQ7XG5cdFx0XHR0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7XG5cdFx0XHR0d2Vlbi5lbmQgPSBhZGp1c3RlZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFkanVzdGVkO1xufVxuXG5cbnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApIHtcblx0dmFyIHRlbXAsXG5cdFx0ZG9jID0gZWxlbS5vd25lckRvY3VtZW50LFxuXHRcdG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSxcblx0XHRkaXNwbGF5ID0gZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF07XG5cblx0aWYgKCBkaXNwbGF5ICkge1xuXHRcdHJldHVybiBkaXNwbGF5O1xuXHR9XG5cblx0dGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApO1xuXHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggdGVtcCwgXCJkaXNwbGF5XCIgKTtcblxuXHR0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRlbXAgKTtcblxuXHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdGRpc3BsYXkgPSBcImJsb2NrXCI7XG5cdH1cblx0ZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5O1xuXG5cdHJldHVybiBkaXNwbGF5O1xufVxuXG5mdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7XG5cdHZhciBkaXNwbGF5LCBlbGVtLFxuXHRcdHZhbHVlcyA9IFtdLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cblx0Ly8gRGV0ZXJtaW5lIG5ldyBkaXNwbGF5IHZhbHVlIGZvciBlbGVtZW50cyB0aGF0IG5lZWQgdG8gY2hhbmdlXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5O1xuXHRcdGlmICggc2hvdyApIHtcblxuXHRcdFx0Ly8gU2luY2Ugd2UgZm9yY2UgdmlzaWJpbGl0eSB1cG9uIGNhc2NhZGUtaGlkZGVuIGVsZW1lbnRzLCBhbiBpbW1lZGlhdGUgKGFuZCBzbG93KVxuXHRcdFx0Ly8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyXG5cdFx0XHQvLyBpbmxpbmUgb3IgYWJvdXQtdG8tYmUtcmVzdG9yZWQpXG5cdFx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwiZGlzcGxheVwiICkgfHwgbnVsbDtcblx0XHRcdFx0aWYgKCAhdmFsdWVzWyBpbmRleCBdICkge1xuXHRcdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICggZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIGRpc3BsYXkgIT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBcIm5vbmVcIjtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB3aGF0IHdlJ3JlIG92ZXJ3cml0aW5nXG5cdFx0XHRcdGRhdGFQcml2LnNldCggZWxlbSwgXCJkaXNwbGF5XCIsIGRpc3BsYXkgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AgdG8gYXZvaWQgY29uc3RhbnQgcmVmbG93XG5cdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCB2YWx1ZXNbIGluZGV4IF0gIT0gbnVsbCApIHtcblx0XHRcdGVsZW1lbnRzWyBpbmRleCBdLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZXNbIGluZGV4IF07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRzO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApO1xuXHR9LFxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTtcblx0fSxcblx0dG9nZ2xlOiBmdW5jdGlvbiggc3RhdGUgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNIaWRkZW5XaXRoaW5UcmVlKCB0aGlzICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnNob3coKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcbnZhciByY2hlY2thYmxlVHlwZSA9ICggL14oPzpjaGVja2JveHxyYWRpbykkL2kgKTtcblxudmFyIHJ0YWdOYW1lID0gKCAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopL2kgKTtcblxudmFyIHJzY3JpcHRUeXBlID0gKCAvXiR8Xm1vZHVsZSR8XFwvKD86amF2YXxlY21hKXNjcmlwdC9pICk7XG5cblxuXG4oIGZ1bmN0aW9uKCkge1xuXHR2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdFx0ZGl2ID0gZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApLFxuXHRcdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAgLSA0LjMgb25seVxuXHQvLyBDaGVjayBzdGF0ZSBsb3N0IGlmIHRoZSBuYW1lIGlzIHNldCAoIzExMjE3KVxuXHQvLyBTdXBwb3J0OiBXaW5kb3dzIFdlYiBBcHBzIChXV0EpXG5cdC8vIGBuYW1lYCBhbmQgYHR5cGVgIG11c3QgdXNlIC5zZXRBdHRyaWJ1dGUgZm9yIFdXQSAoIzE0OTAxKVxuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcInJhZGlvXCIgKTtcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcImNoZWNrZWRcIiwgXCJjaGVja2VkXCIgKTtcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJ0XCIgKTtcblxuXHRkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMSBvbmx5XG5cdC8vIE9sZGVyIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50c1xuXHRzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIE1ha2Ugc3VyZSB0ZXh0YXJlYSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUgaXMgcHJvcGVybHkgY2xvbmVkXG5cdGRpdi5pbm5lckhUTUwgPSBcIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT5cIjtcblx0c3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCA9ICEhZGl2LmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWU7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0Ly8gSUUgPD05IHJlcGxhY2VzIDxvcHRpb24+IHRhZ3Mgd2l0aCB0aGVpciBjb250ZW50cyB3aGVuIGluc2VydGVkIG91dHNpZGUgb2Zcblx0Ly8gdGhlIHNlbGVjdCBlbGVtZW50LlxuXHRkaXYuaW5uZXJIVE1MID0gXCI8b3B0aW9uPjwvb3B0aW9uPlwiO1xuXHRzdXBwb3J0Lm9wdGlvbiA9ICEhZGl2Lmxhc3RDaGlsZDtcbn0gKSgpO1xuXG5cbi8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICgjMTMyMDApXG52YXIgd3JhcE1hcCA9IHtcblxuXHQvLyBYSFRNTCBwYXJzZXJzIGRvIG5vdCBtYWdpY2FsbHkgaW5zZXJ0IGVsZW1lbnRzIGluIHRoZVxuXHQvLyBzYW1lIHdheSB0aGF0IHRhZyBzb3VwIHBhcnNlcnMgZG8uIFNvIHdlIGNhbm5vdCBzaG9ydGVuXG5cdC8vIHRoaXMgYnkgb21pdHRpbmcgPHRib2R5PiBvciBvdGhlciByZXF1aXJlZCBlbGVtZW50cy5cblx0dGhlYWQ6IFsgMSwgXCI8dGFibGU+XCIsIFwiPC90YWJsZT5cIiBdLFxuXHRjb2w6IFsgMiwgXCI8dGFibGU+PGNvbGdyb3VwPlwiLCBcIjwvY29sZ3JvdXA+PC90YWJsZT5cIiBdLFxuXHR0cjogWyAyLCBcIjx0YWJsZT48dGJvZHk+XCIsIFwiPC90Ym9keT48L3RhYmxlPlwiIF0sXG5cdHRkOiBbIDMsIFwiPHRhYmxlPjx0Ym9keT48dHI+XCIsIFwiPC90cj48L3Rib2R5PjwvdGFibGU+XCIgXSxcblxuXHRfZGVmYXVsdDogWyAwLCBcIlwiLCBcIlwiIF1cbn07XG5cbndyYXBNYXAudGJvZHkgPSB3cmFwTWFwLnRmb290ID0gd3JhcE1hcC5jb2xncm91cCA9IHdyYXBNYXAuY2FwdGlvbiA9IHdyYXBNYXAudGhlYWQ7XG53cmFwTWFwLnRoID0gd3JhcE1hcC50ZDtcblxuLy8gU3VwcG9ydDogSUUgPD05IG9ubHlcbmlmICggIXN1cHBvcnQub3B0aW9uICkge1xuXHR3cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb24gPSBbIDEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiIF07XG59XG5cblxuZnVuY3Rpb24gZ2V0QWxsKCBjb250ZXh0LCB0YWcgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpXG5cdHZhciByZXQ7XG5cblx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRyZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8IFwiKlwiICk7XG5cblx0fSBlbHNlIHtcblx0XHRyZXQgPSBbXTtcblx0fVxuXG5cdGlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufVxuXG5cbi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZFxuZnVuY3Rpb24gc2V0R2xvYmFsRXZhbCggZWxlbXMsIHJlZkVsZW1lbnRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZGF0YVByaXYuc2V0KFxuXHRcdFx0ZWxlbXNbIGkgXSxcblx0XHRcdFwiZ2xvYmFsRXZhbFwiLFxuXHRcdFx0IXJlZkVsZW1lbnRzIHx8IGRhdGFQcml2LmdldCggcmVmRWxlbWVudHNbIGkgXSwgXCJnbG9iYWxFdmFsXCIgKVxuXHRcdCk7XG5cdH1cbn1cblxuXG52YXIgcmh0bWwgPSAvPHwmIz9cXHcrOy87XG5cbmZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoIGVsZW1zLCBjb250ZXh0LCBzY3JpcHRzLCBzZWxlY3Rpb24sIGlnbm9yZWQgKSB7XG5cdHZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgYXR0YWNoZWQsIGosXG5cdFx0ZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRub2RlcyA9IFtdLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGVsZW0gPSBlbGVtc1sgaSBdO1xuXG5cdFx0aWYgKCBlbGVtIHx8IGVsZW0gPT09IDAgKSB7XG5cblx0XHRcdC8vIEFkZCBub2RlcyBkaXJlY3RseVxuXHRcdFx0aWYgKCB0b1R5cGUoIGVsZW0gKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7XG5cblx0XHRcdC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZVxuXHRcdFx0fSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0bm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7XG5cblx0XHRcdC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2Rlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHRcdC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb25cblx0XHRcdFx0dGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0O1xuXHRcdFx0XHR0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgalF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIGVsZW0gKSArIHdyYXBbIDIgXTtcblxuXHRcdFx0XHQvLyBEZXNjZW5kIHRocm91Z2ggd3JhcHBlcnMgdG8gdGhlIHJpZ2h0IGNvbnRlbnRcblx0XHRcdFx0aiA9IHdyYXBbIDAgXTtcblx0XHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdFx0dG1wID0gdG1wLmxhc3RDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXJcblx0XHRcdFx0dG1wID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0XHQvLyBFbnN1cmUgdGhlIGNyZWF0ZWQgbm9kZXMgYXJlIG9ycGhhbmVkICgjMTIzOTIpXG5cdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRmcmFnbWVudC50ZXh0Q29udGVudCA9IFwiXCI7XG5cblx0aSA9IDA7XG5cdHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7XG5cblx0XHQvLyBTa2lwIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgY29sbGVjdGlvbiAodHJhYy00MDg3KVxuXHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSA+IC0xICkge1xuXHRcdFx0aWYgKCBpZ25vcmVkICkge1xuXHRcdFx0XHRpZ25vcmVkLnB1c2goIGVsZW0gKTtcblx0XHRcdH1cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGF0dGFjaGVkID0gaXNBdHRhY2hlZCggZWxlbSApO1xuXG5cdFx0Ly8gQXBwZW5kIHRvIGZyYWdtZW50XG5cdFx0dG1wID0gZ2V0QWxsKCBmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApLCBcInNjcmlwdFwiICk7XG5cblx0XHQvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5XG5cdFx0aWYgKCBhdHRhY2hlZCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIHRtcCApO1xuXHRcdH1cblxuXHRcdC8vIENhcHR1cmUgZXhlY3V0YWJsZXNcblx0XHRpZiAoIHNjcmlwdHMgKSB7XG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdG1wWyBqKysgXSApICkge1xuXHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSB8fCBcIlwiICkgKSB7XG5cdFx0XHRcdFx0c2NyaXB0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZnJhZ21lbnQ7XG59XG5cblxudmFyXG5cdHJrZXlFdmVudCA9IC9ea2V5Lyxcblx0cm1vdXNlRXZlbnQgPSAvXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8sXG5cdHJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XFwuKC4rKXwpLztcblxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJldHVybkZhbHNlKCkge1xuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8vIFN1cHBvcnQ6IElFIDw9OSAtIDExK1xuLy8gZm9jdXMoKSBhbmQgYmx1cigpIGFyZSBhc3luY2hyb25vdXMsIGV4Y2VwdCB3aGVuIHRoZXkgYXJlIG5vLW9wLlxuLy8gU28gZXhwZWN0IGZvY3VzIHRvIGJlIHN5bmNocm9ub3VzIHdoZW4gdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBhY3RpdmUsXG4vLyBhbmQgYmx1ciB0byBiZSBzeW5jaHJvbm91cyB3aGVuIHRoZSBlbGVtZW50IGlzIG5vdCBhbHJlYWR5IGFjdGl2ZS5cbi8vIChmb2N1cyBhbmQgYmx1ciBhcmUgYWx3YXlzIHN5bmNocm9ub3VzIGluIG90aGVyIHN1cHBvcnRlZCBicm93c2Vycyxcbi8vIHRoaXMganVzdCBkZWZpbmVzIHdoZW4gd2UgY2FuIGNvdW50IG9uIGl0KS5cbmZ1bmN0aW9uIGV4cGVjdFN5bmMoIGVsZW0sIHR5cGUgKSB7XG5cdHJldHVybiAoIGVsZW0gPT09IHNhZmVBY3RpdmVFbGVtZW50KCkgKSA9PT0gKCB0eXBlID09PSBcImZvY3VzXCIgKTtcbn1cblxuLy8gU3VwcG9ydDogSUUgPD05IG9ubHlcbi8vIEFjY2Vzc2luZyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGNhbiB0aHJvdyB1bmV4cGVjdGVkbHlcbi8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMzM5M1xuZnVuY3Rpb24gc2FmZUFjdGl2ZUVsZW1lbnQoKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cdH0gY2F0Y2ggKCBlcnIgKSB7IH1cbn1cblxuZnVuY3Rpb24gb24oIGVsZW0sIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIG9uZSApIHtcblx0dmFyIG9yaWdGbiwgdHlwZTtcblxuXHQvLyBUeXBlcyBjYW4gYmUgYSBtYXAgb2YgdHlwZXMvaGFuZGxlcnNcblx0aWYgKCB0eXBlb2YgdHlwZXMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyAoIHR5cGVzLU9iamVjdCwgc2VsZWN0b3IsIGRhdGEgKVxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLU9iamVjdCwgZGF0YSApXG5cdFx0XHRkYXRhID0gZGF0YSB8fCBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRmb3IgKCB0eXBlIGluIHR5cGVzICkge1xuXHRcdFx0b24oIGVsZW0sIHR5cGUsIHNlbGVjdG9yLCBkYXRhLCB0eXBlc1sgdHlwZSBdLCBvbmUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIGRhdGEgPT0gbnVsbCAmJiBmbiA9PSBudWxsICkge1xuXG5cdFx0Ly8gKCB0eXBlcywgZm4gKVxuXHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0ZGF0YSA9IHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKCBmbiA9PSBudWxsICkge1xuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLCBzZWxlY3RvciwgZm4gKVxuXHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyAoIHR5cGVzLCBkYXRhLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0fSBlbHNlIGlmICggIWZuICkge1xuXHRcdHJldHVybiBlbGVtO1xuXHR9XG5cblx0aWYgKCBvbmUgPT09IDEgKSB7XG5cdFx0b3JpZ0ZuID0gZm47XG5cdFx0Zm4gPSBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdC8vIENhbiB1c2UgYW4gZW1wdHkgc2V0LCBzaW5jZSBldmVudCBjb250YWlucyB0aGUgaW5mb1xuXHRcdFx0alF1ZXJ5KCkub2ZmKCBldmVudCApO1xuXHRcdFx0cmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fTtcblxuXHRcdC8vIFVzZSBzYW1lIGd1aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuXG5cdFx0Zm4uZ3VpZCA9IG9yaWdGbi5ndWlkIHx8ICggb3JpZ0ZuLmd1aWQgPSBqUXVlcnkuZ3VpZCsrICk7XG5cdH1cblx0cmV0dXJuIGVsZW0uZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0alF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZXMsIGZuLCBkYXRhLCBzZWxlY3RvciApO1xuXHR9ICk7XG59XG5cbi8qXG4gKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBldmVudHMgLS0gbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UuXG4gKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLlxuICovXG5qUXVlcnkuZXZlbnQgPSB7XG5cblx0Z2xvYmFsOiB7fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSwgc2VsZWN0b3IgKSB7XG5cblx0XHR2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsXG5cdFx0XHRldmVudHMsIHQsIGhhbmRsZU9iaixcblx0XHRcdHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSxcblx0XHRcdGVsZW1EYXRhID0gZGF0YVByaXYuZ2V0KCBlbGVtICk7XG5cblx0XHQvLyBPbmx5IGF0dGFjaCBldmVudHMgdG8gb2JqZWN0cyB0aGF0IGFjY2VwdCBkYXRhXG5cdFx0aWYgKCAhYWNjZXB0RGF0YSggZWxlbSApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlclxuXHRcdGlmICggaGFuZGxlci5oYW5kbGVyICkge1xuXHRcdFx0aGFuZGxlT2JqSW4gPSBoYW5kbGVyO1xuXHRcdFx0aGFuZGxlciA9IGhhbmRsZU9iakluLmhhbmRsZXI7XG5cdFx0XHRzZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yO1xuXHRcdH1cblxuXHRcdC8vIEVuc3VyZSB0aGF0IGludmFsaWQgc2VsZWN0b3JzIHRocm93IGV4Y2VwdGlvbnMgYXQgYXR0YWNoIHRpbWVcblx0XHQvLyBFdmFsdWF0ZSBhZ2FpbnN0IGRvY3VtZW50RWxlbWVudCBpbiBjYXNlIGVsZW0gaXMgYSBub24tZWxlbWVudCBub2RlIChlLmcuLCBkb2N1bWVudClcblx0XHRpZiAoIHNlbGVjdG9yICkge1xuXHRcdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBkb2N1bWVudEVsZW1lbnQsIHNlbGVjdG9yICk7XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyXG5cdFx0aWYgKCAhaGFuZGxlci5ndWlkICkge1xuXHRcdFx0aGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKztcblx0XHR9XG5cblx0XHQvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlmIHRoaXMgaXMgdGhlIGZpcnN0XG5cdFx0aWYgKCAhKCBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgKSApIHtcblx0XHRcdGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IE9iamVjdC5jcmVhdGUoIG51bGwgKTtcblx0XHR9XG5cdFx0aWYgKCAhKCBldmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSApICkge1xuXHRcdFx0ZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgPSBmdW5jdGlvbiggZSApIHtcblxuXHRcdFx0XHQvLyBEaXNjYXJkIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSBqUXVlcnkuZXZlbnQudHJpZ2dlcigpIGFuZFxuXHRcdFx0XHQvLyB3aGVuIGFuIGV2ZW50IGlzIGNhbGxlZCBhZnRlciBhIHBhZ2UgaGFzIHVubG9hZGVkXG5cdFx0XHRcdHJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSBcInVuZGVmaW5lZFwiICYmIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUudHlwZSA/XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmFwcGx5KCBlbGVtLCBhcmd1bWVudHMgKSA6IHVuZGVmaW5lZDtcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZVxuXHRcdHR5cGVzID0gKCB0eXBlcyB8fCBcIlwiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbIFwiXCIgXTtcblx0XHR0ID0gdHlwZXMubGVuZ3RoO1xuXHRcdHdoaWxlICggdC0tICkge1xuXHRcdFx0dG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdO1xuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG1wWyAxIF07XG5cdFx0XHRuYW1lc3BhY2VzID0gKCB0bXBbIDIgXSB8fCBcIlwiICkuc3BsaXQoIFwiLlwiICkuc29ydCgpO1xuXG5cdFx0XHQvLyBUaGVyZSAqbXVzdCogYmUgYSB0eXBlLCBubyBhdHRhY2hpbmcgbmFtZXNwYWNlLW9ubHkgaGFuZGxlcnNcblx0XHRcdGlmICggIXR5cGUgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0eXBlLCB1c2UgdGhlIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBJZiBzZWxlY3RvciBkZWZpbmVkLCBkZXRlcm1pbmUgc3BlY2lhbCBldmVudCBhcGkgdHlwZSwgb3RoZXJ3aXNlIGdpdmVuIHR5cGVcblx0XHRcdHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcblxuXHRcdFx0Ly8gVXBkYXRlIHNwZWNpYWwgYmFzZWQgb24gbmV3bHkgcmVzZXQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIGhhbmRsZU9iaiBpcyBwYXNzZWQgdG8gYWxsIGV2ZW50IGhhbmRsZXJzXG5cdFx0XHRoYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdG9yaWdUeXBlOiBvcmlnVHlwZSxcblx0XHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdFx0aGFuZGxlcjogaGFuZGxlcixcblx0XHRcdFx0Z3VpZDogaGFuZGxlci5ndWlkLFxuXHRcdFx0XHRzZWxlY3Rvcjogc2VsZWN0b3IsXG5cdFx0XHRcdG5lZWRzQ29udGV4dDogc2VsZWN0b3IgJiYgalF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICksXG5cdFx0XHRcdG5hbWVzcGFjZTogbmFtZXNwYWNlcy5qb2luKCBcIi5cIiApXG5cdFx0XHR9LCBoYW5kbGVPYmpJbiApO1xuXG5cdFx0XHQvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdFxuXHRcdFx0aWYgKCAhKCBoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdICkgKSB7XG5cdFx0XHRcdGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTtcblx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudCA9IDA7XG5cblx0XHRcdFx0Ly8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lciBpZiB0aGUgc3BlY2lhbCBldmVudHMgaGFuZGxlciByZXR1cm5zIGZhbHNlXG5cdFx0XHRcdGlmICggIXNwZWNpYWwuc2V0dXAgfHxcblx0XHRcdFx0XHRzcGVjaWFsLnNldHVwLmNhbGwoIGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0aWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggc3BlY2lhbC5hZGQgKSB7XG5cdFx0XHRcdHNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApO1xuXG5cdFx0XHRcdGlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCA9IGhhbmRsZXIuZ3VpZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udFxuXHRcdFx0aWYgKCBzZWxlY3RvciApIHtcblx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb25cblx0XHRcdGpRdWVyeS5ldmVudC5nbG9iYWxbIHR5cGUgXSA9IHRydWU7XG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50XG5cdHJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7XG5cblx0XHR2YXIgaiwgb3JpZ0NvdW50LCB0bXAsXG5cdFx0XHRldmVudHMsIHQsIGhhbmRsZU9iaixcblx0XHRcdHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSxcblx0XHRcdGVsZW1EYXRhID0gZGF0YVByaXYuaGFzRGF0YSggZWxlbSApICYmIGRhdGFQcml2LmdldCggZWxlbSApO1xuXG5cdFx0aWYgKCAhZWxlbURhdGEgfHwgISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gT25jZSBmb3IgZWFjaCB0eXBlLm5hbWVzcGFjZSBpbiB0eXBlczsgdHlwZSBtYXkgYmUgb21pdHRlZFxuXHRcdHR5cGVzID0gKCB0eXBlcyB8fCBcIlwiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbIFwiXCIgXTtcblx0XHR0ID0gdHlwZXMubGVuZ3RoO1xuXHRcdHdoaWxlICggdC0tICkge1xuXHRcdFx0dG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdO1xuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG1wWyAxIF07XG5cdFx0XHRuYW1lc3BhY2VzID0gKCB0bXBbIDIgXSB8fCBcIlwiICkuc3BsaXQoIFwiLlwiICkuc29ydCgpO1xuXG5cdFx0XHQvLyBVbmJpbmQgYWxsIGV2ZW50cyAob24gdGhpcyBuYW1lc3BhY2UsIGlmIHByb3ZpZGVkKSBmb3IgdGhlIGVsZW1lbnRcblx0XHRcdGlmICggIXR5cGUgKSB7XG5cdFx0XHRcdGZvciAoIHR5cGUgaW4gZXZlbnRzICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKyB0eXBlc1sgdCBdLCBoYW5kbGVyLCBzZWxlY3RvciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblx0XHRcdHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcblx0XHRcdGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gfHwgW107XG5cdFx0XHR0bXAgPSB0bXBbIDIgXSAmJlxuXHRcdFx0XHRuZXcgUmVnRXhwKCBcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5qb2luKCBcIlxcXFwuKD86LipcXFxcLnwpXCIgKSArIFwiKFxcXFwufCQpXCIgKTtcblxuXHRcdFx0Ly8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50c1xuXHRcdFx0b3JpZ0NvdW50ID0gaiA9IGhhbmRsZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0XHRoYW5kbGVPYmogPSBoYW5kbGVyc1sgaiBdO1xuXG5cdFx0XHRcdGlmICggKCBtYXBwZWRUeXBlcyB8fCBvcmlnVHlwZSA9PT0gaGFuZGxlT2JqLm9yaWdUeXBlICkgJiZcblx0XHRcdFx0XHQoICFoYW5kbGVyIHx8IGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAmJlxuXHRcdFx0XHRcdCggIXRtcCB8fCB0bXAudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgJiZcblx0XHRcdFx0XHQoICFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gaGFuZGxlT2JqLnNlbGVjdG9yIHx8XG5cdFx0XHRcdFx0XHRzZWxlY3RvciA9PT0gXCIqKlwiICYmIGhhbmRsZU9iai5zZWxlY3RvciApICkge1xuXHRcdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaiwgMSApO1xuXG5cdFx0XHRcdFx0aWYgKCBoYW5kbGVPYmouc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggc3BlY2lhbC5yZW1vdmUgKSB7XG5cdFx0XHRcdFx0XHRzcGVjaWFsLnJlbW92ZS5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdFxuXHRcdFx0Ly8gKGF2b2lkcyBwb3RlbnRpYWwgZm9yIGVuZGxlc3MgcmVjdXJzaW9uIGR1cmluZyByZW1vdmFsIG9mIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMpXG5cdFx0XHRpZiAoIG9yaWdDb3VudCAmJiAhaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnRlYXJkb3duIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC50ZWFyZG93bi5jYWxsKCBlbGVtLCBuYW1lc3BhY2VzLCBlbGVtRGF0YS5oYW5kbGUgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGVsZW1EYXRhLmhhbmRsZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGVsZXRlIGV2ZW50c1sgdHlwZSBdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSBkYXRhIGFuZCB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkXG5cdFx0aWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7XG5cdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiaGFuZGxlIGV2ZW50c1wiICk7XG5cdFx0fVxuXHR9LFxuXG5cdGRpc3BhdGNoOiBmdW5jdGlvbiggbmF0aXZlRXZlbnQgKSB7XG5cblx0XHR2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosIGhhbmRsZXJRdWV1ZSxcblx0XHRcdGFyZ3MgPSBuZXcgQXJyYXkoIGFyZ3VtZW50cy5sZW5ndGggKSxcblxuXHRcdFx0Ly8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0XG5cdFx0XHRldmVudCA9IGpRdWVyeS5ldmVudC5maXgoIG5hdGl2ZUV2ZW50ICksXG5cblx0XHRcdGhhbmRsZXJzID0gKFxuXHRcdFx0XHRcdGRhdGFQcml2LmdldCggdGhpcywgXCJldmVudHNcIiApIHx8IE9iamVjdC5jcmVhdGUoIG51bGwgKVxuXHRcdFx0XHQpWyBldmVudC50eXBlIF0gfHwgW10sXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGV2ZW50LnR5cGUgXSB8fCB7fTtcblxuXHRcdC8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50XG5cdFx0YXJnc1sgMCBdID0gZXZlbnQ7XG5cblx0XHRmb3IgKCBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdGFyZ3NbIGkgXSA9IGFyZ3VtZW50c1sgaSBdO1xuXHRcdH1cblxuXHRcdGV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpcztcblxuXHRcdC8vIENhbGwgdGhlIHByZURpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZSwgYW5kIGxldCBpdCBiYWlsIGlmIGRlc2lyZWRcblx0XHRpZiAoIHNwZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgaGFuZGxlcnNcblx0XHRoYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7XG5cblx0XHQvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0aCB1c1xuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKCBtYXRjaGVkID0gaGFuZGxlclF1ZXVlWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0ZXZlbnQuY3VycmVudFRhcmdldCA9IG1hdGNoZWQuZWxlbTtcblxuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggaGFuZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisrIF0gKSAmJlxuXHRcdFx0XHQhZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGUgZXZlbnQgaXMgbmFtZXNwYWNlZCwgdGhlbiBlYWNoIGhhbmRsZXIgaXMgb25seSBpbnZva2VkIGlmIGl0IGlzXG5cdFx0XHRcdC8vIHNwZWNpYWxseSB1bml2ZXJzYWwgb3IgaXRzIG5hbWVzcGFjZXMgYXJlIGEgc3VwZXJzZXQgb2YgdGhlIGV2ZW50J3MuXG5cdFx0XHRcdGlmICggIWV2ZW50LnJuYW1lc3BhY2UgfHwgaGFuZGxlT2JqLm5hbWVzcGFjZSA9PT0gZmFsc2UgfHxcblx0XHRcdFx0XHRldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHtcblxuXHRcdFx0XHRcdGV2ZW50LmhhbmRsZU9iaiA9IGhhbmRsZU9iajtcblx0XHRcdFx0XHRldmVudC5kYXRhID0gaGFuZGxlT2JqLmRhdGE7XG5cblx0XHRcdFx0XHRyZXQgPSAoICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGhhbmRsZU9iai5vcmlnVHlwZSBdIHx8IHt9ICkuaGFuZGxlIHx8XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZXZlbnQucmVzdWx0ID0gcmV0ICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlXG5cdFx0aWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHtcblx0XHRcdHNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHRoYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgaSwgaGFuZGxlT2JqLCBzZWwsIG1hdGNoZWRIYW5kbGVycywgbWF0Y2hlZFNlbGVjdG9ycyxcblx0XHRcdGhhbmRsZXJRdWV1ZSA9IFtdLFxuXHRcdFx0ZGVsZWdhdGVDb3VudCA9IGhhbmRsZXJzLmRlbGVnYXRlQ291bnQsXG5cdFx0XHRjdXIgPSBldmVudC50YXJnZXQ7XG5cblx0XHQvLyBGaW5kIGRlbGVnYXRlIGhhbmRsZXJzXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50ICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OVxuXHRcdFx0Ly8gQmxhY2staG9sZSBTVkcgPHVzZT4gaW5zdGFuY2UgdHJlZXMgKHRyYWMtMTMxODApXG5cdFx0XHRjdXIubm9kZVR5cGUgJiZcblxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTQyXG5cdFx0XHQvLyBTdXBwcmVzcyBzcGVjLXZpb2xhdGluZyBjbGlja3MgaW5kaWNhdGluZyBhIG5vbi1wcmltYXJ5IHBvaW50ZXIgYnV0dG9uICh0cmFjLTM4NjEpXG5cdFx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudC10eXBlLWNsaWNrXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHQvLyAuLi5idXQgbm90IGFycm93IGtleSBcImNsaWNrc1wiIG9mIHJhZGlvIGlucHV0cywgd2hpY2ggY2FuIGhhdmUgYGJ1dHRvbmAgLTEgKGdoLTIzNDMpXG5cdFx0XHQhKCBldmVudC50eXBlID09PSBcImNsaWNrXCIgJiYgZXZlbnQuYnV0dG9uID49IDEgKSApIHtcblxuXHRcdFx0Zm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICgjMTMyMDgpXG5cdFx0XHRcdC8vIERvbid0IHByb2Nlc3MgY2xpY2tzIG9uIGRpc2FibGVkIGVsZW1lbnRzICgjNjkxMSwgIzgxNjUsICMxMTM4MiwgIzExNzY0KVxuXHRcdFx0XHRpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSAmJiAhKCBldmVudC50eXBlID09PSBcImNsaWNrXCIgJiYgY3VyLmRpc2FibGVkID09PSB0cnVlICkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlZEhhbmRsZXJzID0gW107XG5cdFx0XHRcdFx0bWF0Y2hlZFNlbGVjdG9ycyA9IHt9O1xuXHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGkgXTtcblxuXHRcdFx0XHRcdFx0Ly8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMylcblx0XHRcdFx0XHRcdHNlbCA9IGhhbmRsZU9iai5zZWxlY3RvciArIFwiIFwiO1xuXG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdID0gaGFuZGxlT2JqLm5lZWRzQ29udGV4dCA/XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5KCBzZWwsIHRoaXMgKS5pbmRleCggY3VyICkgPiAtMSA6XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQoIHNlbCwgdGhpcywgbnVsbCwgWyBjdXIgXSApLmxlbmd0aDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVkSGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogbWF0Y2hlZEhhbmRsZXJzIH0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIHJlbWFpbmluZyAoZGlyZWN0bHktYm91bmQpIGhhbmRsZXJzXG5cdFx0Y3VyID0gdGhpcztcblx0XHRpZiAoIGRlbGVnYXRlQ291bnQgPCBoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRoYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaGFuZGxlclF1ZXVlO1xuXHR9LFxuXG5cdGFkZFByb3A6IGZ1bmN0aW9uKCBuYW1lLCBob29rICkge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSwgbmFtZSwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblxuXHRcdFx0Z2V0OiBpc0Z1bmN0aW9uKCBob29rICkgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGhvb2soIHRoaXMub3JpZ2luYWxFdmVudCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50WyBuYW1lIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCBuYW1lLCB7XG5cdFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0d3JpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0Zml4OiBmdW5jdGlvbiggb3JpZ2luYWxFdmVudCApIHtcblx0XHRyZXR1cm4gb3JpZ2luYWxFdmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/XG5cdFx0XHRvcmlnaW5hbEV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTtcblx0fSxcblxuXHRzcGVjaWFsOiB7XG5cdFx0bG9hZDoge1xuXG5cdFx0XHQvLyBQcmV2ZW50IHRyaWdnZXJlZCBpbWFnZS5sb2FkIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIHRvIHdpbmRvdy5sb2FkXG5cdFx0XHRub0J1YmJsZTogdHJ1ZVxuXHRcdH0sXG5cdFx0Y2xpY2s6IHtcblxuXHRcdFx0Ly8gVXRpbGl6ZSBuYXRpdmUgZXZlbnQgdG8gZW5zdXJlIGNvcnJlY3Qgc3RhdGUgZm9yIGNoZWNrYWJsZSBpbnB1dHNcblx0XHRcdHNldHVwOiBmdW5jdGlvbiggZGF0YSApIHtcblxuXHRcdFx0XHQvLyBGb3IgbXV0dWFsIGNvbXByZXNzaWJpbGl0eSB3aXRoIF9kZWZhdWx0LCByZXBsYWNlIGB0aGlzYCBhY2Nlc3Mgd2l0aCBhIGxvY2FsIHZhci5cblx0XHRcdFx0Ly8gYHx8IGRhdGFgIGlzIGRlYWQgY29kZSBtZWFudCBvbmx5IHRvIHByZXNlcnZlIHRoZSB2YXJpYWJsZSB0aHJvdWdoIG1pbmlmaWNhdGlvbi5cblx0XHRcdFx0dmFyIGVsID0gdGhpcyB8fCBkYXRhO1xuXG5cdFx0XHRcdC8vIENsYWltIHRoZSBmaXJzdCBoYW5kbGVyXG5cdFx0XHRcdGlmICggcmNoZWNrYWJsZVR5cGUudGVzdCggZWwudHlwZSApICYmXG5cdFx0XHRcdFx0ZWwuY2xpY2sgJiYgbm9kZU5hbWUoIGVsLCBcImlucHV0XCIgKSApIHtcblxuXHRcdFx0XHRcdC8vIGRhdGFQcml2LnNldCggZWwsIFwiY2xpY2tcIiwgLi4uIClcblx0XHRcdFx0XHRsZXZlcmFnZU5hdGl2ZSggZWwsIFwiY2xpY2tcIiwgcmV0dXJuVHJ1ZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmV0dXJuIGZhbHNlIHRvIGFsbG93IG5vcm1hbCBwcm9jZXNzaW5nIGluIHRoZSBjYWxsZXJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSxcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCBkYXRhICkge1xuXG5cdFx0XHRcdC8vIEZvciBtdXR1YWwgY29tcHJlc3NpYmlsaXR5IHdpdGggX2RlZmF1bHQsIHJlcGxhY2UgYHRoaXNgIGFjY2VzcyB3aXRoIGEgbG9jYWwgdmFyLlxuXHRcdFx0XHQvLyBgfHwgZGF0YWAgaXMgZGVhZCBjb2RlIG1lYW50IG9ubHkgdG8gcHJlc2VydmUgdGhlIHZhcmlhYmxlIHRocm91Z2ggbWluaWZpY2F0aW9uLlxuXHRcdFx0XHR2YXIgZWwgPSB0aGlzIHx8IGRhdGE7XG5cblx0XHRcdFx0Ly8gRm9yY2Ugc2V0dXAgYmVmb3JlIHRyaWdnZXJpbmcgYSBjbGlja1xuXHRcdFx0XHRpZiAoIHJjaGVja2FibGVUeXBlLnRlc3QoIGVsLnR5cGUgKSAmJlxuXHRcdFx0XHRcdGVsLmNsaWNrICYmIG5vZGVOYW1lKCBlbCwgXCJpbnB1dFwiICkgKSB7XG5cblx0XHRcdFx0XHRsZXZlcmFnZU5hdGl2ZSggZWwsIFwiY2xpY2tcIiApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmV0dXJuIG5vbi1mYWxzZSB0byBhbGxvdyBub3JtYWwgZXZlbnQtcGF0aCBwcm9wYWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0sXG5cblx0XHRcdC8vIEZvciBjcm9zcy1icm93c2VyIGNvbnNpc3RlbmN5LCBzdXBwcmVzcyBuYXRpdmUgLmNsaWNrKCkgb24gbGlua3Ncblx0XHRcdC8vIEFsc28gcHJldmVudCBpdCBpZiB3ZSdyZSBjdXJyZW50bHkgaW5zaWRlIGEgbGV2ZXJhZ2VkIG5hdGl2ZS1ldmVudCBzdGFja1xuXHRcdFx0X2RlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcblx0XHRcdFx0cmV0dXJuIHJjaGVja2FibGVUeXBlLnRlc3QoIHRhcmdldC50eXBlICkgJiZcblx0XHRcdFx0XHR0YXJnZXQuY2xpY2sgJiYgbm9kZU5hbWUoIHRhcmdldCwgXCJpbnB1dFwiICkgJiZcblx0XHRcdFx0XHRkYXRhUHJpdi5nZXQoIHRhcmdldCwgXCJjbGlja1wiICkgfHxcblx0XHRcdFx0XHRub2RlTmFtZSggdGFyZ2V0LCBcImFcIiApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRiZWZvcmV1bmxvYWQ6IHtcblx0XHRcdHBvc3REaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggMjArXG5cdFx0XHRcdC8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC5cblx0XHRcdFx0aWYgKCBldmVudC5yZXN1bHQgIT09IHVuZGVmaW5lZCAmJiBldmVudC5vcmlnaW5hbEV2ZW50ICkge1xuXHRcdFx0XHRcdGV2ZW50Lm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWUgPSBldmVudC5yZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbi8vIEVuc3VyZSB0aGUgcHJlc2VuY2Ugb2YgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBoYW5kbGVzIG1hbnVhbGx5LXRyaWdnZXJlZFxuLy8gc3ludGhldGljIGV2ZW50cyBieSBpbnRlcnJ1cHRpbmcgcHJvZ3Jlc3MgdW50aWwgcmVpbnZva2VkIGluIHJlc3BvbnNlIHRvXG4vLyAqbmF0aXZlKiBldmVudHMgdGhhdCBpdCBmaXJlcyBkaXJlY3RseSwgZW5zdXJpbmcgdGhhdCBzdGF0ZSBjaGFuZ2VzIGhhdmVcbi8vIGFscmVhZHkgb2NjdXJyZWQgYmVmb3JlIG90aGVyIGxpc3RlbmVycyBhcmUgaW52b2tlZC5cbmZ1bmN0aW9uIGxldmVyYWdlTmF0aXZlKCBlbCwgdHlwZSwgZXhwZWN0U3luYyApIHtcblxuXHQvLyBNaXNzaW5nIGV4cGVjdFN5bmMgaW5kaWNhdGVzIGEgdHJpZ2dlciBjYWxsLCB3aGljaCBtdXN0IGZvcmNlIHNldHVwIHRocm91Z2ggalF1ZXJ5LmV2ZW50LmFkZFxuXHRpZiAoICFleHBlY3RTeW5jICkge1xuXHRcdGlmICggZGF0YVByaXYuZ2V0KCBlbCwgdHlwZSApID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCBlbCwgdHlwZSwgcmV0dXJuVHJ1ZSApO1xuXHRcdH1cblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBSZWdpc3RlciB0aGUgY29udHJvbGxlciBhcyBhIHNwZWNpYWwgdW5pdmVyc2FsIGhhbmRsZXIgZm9yIGFsbCBldmVudCBuYW1lc3BhY2VzXG5cdGRhdGFQcml2LnNldCggZWwsIHR5cGUsIGZhbHNlICk7XG5cdGpRdWVyeS5ldmVudC5hZGQoIGVsLCB0eXBlLCB7XG5cdFx0bmFtZXNwYWNlOiBmYWxzZSxcblx0XHRoYW5kbGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHR2YXIgbm90QXN5bmMsIHJlc3VsdCxcblx0XHRcdFx0c2F2ZWQgPSBkYXRhUHJpdi5nZXQoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0aWYgKCAoIGV2ZW50LmlzVHJpZ2dlciAmIDEgKSAmJiB0aGlzWyB0eXBlIF0gKSB7XG5cblx0XHRcdFx0Ly8gSW50ZXJydXB0IHByb2Nlc3Npbmcgb2YgdGhlIG91dGVyIHN5bnRoZXRpYyAudHJpZ2dlcigpZWQgZXZlbnRcblx0XHRcdFx0Ly8gU2F2ZWQgZGF0YSBzaG91bGQgYmUgZmFsc2UgaW4gc3VjaCBjYXNlcywgYnV0IG1pZ2h0IGJlIGEgbGVmdG92ZXIgY2FwdHVyZSBvYmplY3Rcblx0XHRcdFx0Ly8gZnJvbSBhbiBhc3luYyBuYXRpdmUgaGFuZGxlciAoZ2gtNDM1MClcblx0XHRcdFx0aWYgKCAhc2F2ZWQubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0Ly8gU3RvcmUgYXJndW1lbnRzIGZvciB1c2Ugd2hlbiBoYW5kbGluZyB0aGUgaW5uZXIgbmF0aXZlIGV2ZW50XG5cdFx0XHRcdFx0Ly8gVGhlcmUgd2lsbCBhbHdheXMgYmUgYXQgbGVhc3Qgb25lIGFyZ3VtZW50IChhbiBldmVudCBvYmplY3QpLCBzbyB0aGlzIGFycmF5XG5cdFx0XHRcdFx0Ly8gd2lsbCBub3QgYmUgY29uZnVzZWQgd2l0aCBhIGxlZnRvdmVyIGNhcHR1cmUgb2JqZWN0LlxuXHRcdFx0XHRcdHNhdmVkID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCB0eXBlLCBzYXZlZCApO1xuXG5cdFx0XHRcdFx0Ly8gVHJpZ2dlciB0aGUgbmF0aXZlIGV2ZW50IGFuZCBjYXB0dXJlIGl0cyByZXN1bHRcblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMStcblx0XHRcdFx0XHQvLyBmb2N1cygpIGFuZCBibHVyKCkgYXJlIGFzeW5jaHJvbm91c1xuXHRcdFx0XHRcdG5vdEFzeW5jID0gZXhwZWN0U3luYyggdGhpcywgdHlwZSApO1xuXHRcdFx0XHRcdHRoaXNbIHR5cGUgXSgpO1xuXHRcdFx0XHRcdHJlc3VsdCA9IGRhdGFQcml2LmdldCggdGhpcywgdHlwZSApO1xuXHRcdFx0XHRcdGlmICggc2F2ZWQgIT09IHJlc3VsdCB8fCBub3RBc3luYyApIHtcblx0XHRcdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgdHlwZSwgZmFsc2UgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVzdWx0ID0ge307XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggc2F2ZWQgIT09IHJlc3VsdCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSBvdXRlciBzeW50aGV0aWMgZXZlbnRcblx0XHRcdFx0XHRcdGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHQudmFsdWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIElmIHRoaXMgaXMgYW4gaW5uZXIgc3ludGhldGljIGV2ZW50IGZvciBhbiBldmVudCB3aXRoIGEgYnViYmxpbmcgc3Vycm9nYXRlXG5cdFx0XHRcdC8vIChmb2N1cyBvciBibHVyKSwgYXNzdW1lIHRoYXQgdGhlIHN1cnJvZ2F0ZSBhbHJlYWR5IHByb3BhZ2F0ZWQgZnJvbSB0cmlnZ2VyaW5nIHRoZVxuXHRcdFx0XHQvLyBuYXRpdmUgZXZlbnQgYW5kIHByZXZlbnQgdGhhdCBmcm9tIGhhcHBlbmluZyBhZ2FpbiBoZXJlLlxuXHRcdFx0XHQvLyBUaGlzIHRlY2huaWNhbGx5IGdldHMgdGhlIG9yZGVyaW5nIHdyb25nIHcuci50LiB0byBgLnRyaWdnZXIoKWAgKGluIHdoaWNoIHRoZVxuXHRcdFx0XHQvLyBidWJibGluZyBzdXJyb2dhdGUgcHJvcGFnYXRlcyAqYWZ0ZXIqIHRoZSBub24tYnViYmxpbmcgYmFzZSksIGJ1dCB0aGF0IHNlZW1zXG5cdFx0XHRcdC8vIGxlc3MgYmFkIHRoYW4gZHVwbGljYXRpb24uXG5cdFx0XHRcdH0gZWxzZSBpZiAoICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fSApLmRlbGVnYXRlVHlwZSApIHtcblx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGEgbmF0aXZlIGV2ZW50IHRyaWdnZXJlZCBhYm92ZSwgZXZlcnl0aGluZyBpcyBub3cgaW4gb3JkZXJcblx0XHRcdC8vIEZpcmUgYW4gaW5uZXIgc3ludGhldGljIGV2ZW50IHdpdGggdGhlIG9yaWdpbmFsIGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggc2F2ZWQubGVuZ3RoICkge1xuXG5cdFx0XHRcdC8vIC4uLmFuZCBjYXB0dXJlIHRoZSByZXN1bHRcblx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCB0eXBlLCB7XG5cdFx0XHRcdFx0dmFsdWU6IGpRdWVyeS5ldmVudC50cmlnZ2VyKFxuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMStcblx0XHRcdFx0XHRcdC8vIEV4dGVuZCB3aXRoIHRoZSBwcm90b3R5cGUgdG8gcmVzZXQgdGhlIGFib3ZlIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG5cdFx0XHRcdFx0XHRqUXVlcnkuZXh0ZW5kKCBzYXZlZFsgMCBdLCBqUXVlcnkuRXZlbnQucHJvdG90eXBlICksXG5cdFx0XHRcdFx0XHRzYXZlZC5zbGljZSggMSApLFxuXHRcdFx0XHRcdFx0dGhpc1xuXHRcdFx0XHRcdClcblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdC8vIEFib3J0IGhhbmRsaW5nIG9mIHRoZSBuYXRpdmUgZXZlbnRcblx0XHRcdFx0ZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9ICk7XG59XG5cbmpRdWVyeS5yZW1vdmVFdmVudCA9IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7XG5cblx0Ly8gVGhpcyBcImlmXCIgaXMgbmVlZGVkIGZvciBwbGFpbiBvYmplY3RzXG5cdGlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkge1xuXHRcdGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgaGFuZGxlICk7XG5cdH1cbn07XG5cbmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkge1xuXG5cdC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZFxuXHRpZiAoICEoIHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQgKSApIHtcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApO1xuXHR9XG5cblx0Ly8gRXZlbnQgb2JqZWN0XG5cdGlmICggc3JjICYmIHNyYy50eXBlICkge1xuXHRcdHRoaXMub3JpZ2luYWxFdmVudCA9IHNyYztcblx0XHR0aGlzLnR5cGUgPSBzcmMudHlwZTtcblxuXHRcdC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkXG5cdFx0Ly8gYnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuXG5cdFx0dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBzcmMuZGVmYXVsdFByZXZlbnRlZCB8fFxuXHRcdFx0XHRzcmMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdW5kZWZpbmVkICYmXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5XG5cdFx0XHRcdHNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0cmV0dXJuVHJ1ZSA6XG5cdFx0XHRyZXR1cm5GYWxzZTtcblxuXHRcdC8vIENyZWF0ZSB0YXJnZXQgcHJvcGVydGllc1xuXHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA8PTYgLSA3IG9ubHlcblx0XHQvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKVxuXHRcdHRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/XG5cdFx0XHRzcmMudGFyZ2V0LnBhcmVudE5vZGUgOlxuXHRcdFx0c3JjLnRhcmdldDtcblxuXHRcdHRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0O1xuXHRcdHRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0O1xuXG5cdC8vIEV2ZW50IHR5cGVcblx0fSBlbHNlIHtcblx0XHR0aGlzLnR5cGUgPSBzcmM7XG5cdH1cblxuXHQvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuXHRpZiAoIHByb3BzICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZVxuXHR0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG5cblx0Ly8gTWFyayBpdCBhcyBmaXhlZFxuXHR0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTtcbn07XG5cbi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZ1xuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbFxualF1ZXJ5LkV2ZW50LnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IGpRdWVyeS5FdmVudCxcblx0aXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSxcblx0aXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXHRpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzU2ltdWxhdGVkOiBmYWxzZSxcblxuXHRwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH1cblx0fSxcblx0c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cblx0XHR0aGlzLnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9XG59O1xuXG4vLyBJbmNsdWRlcyBhbGwgY29tbW9uIGV2ZW50IHByb3BzIGluY2x1ZGluZyBLZXlFdmVudCBhbmQgTW91c2VFdmVudCBzcGVjaWZpYyBwcm9wc1xualF1ZXJ5LmVhY2goIHtcblx0YWx0S2V5OiB0cnVlLFxuXHRidWJibGVzOiB0cnVlLFxuXHRjYW5jZWxhYmxlOiB0cnVlLFxuXHRjaGFuZ2VkVG91Y2hlczogdHJ1ZSxcblx0Y3RybEtleTogdHJ1ZSxcblx0ZGV0YWlsOiB0cnVlLFxuXHRldmVudFBoYXNlOiB0cnVlLFxuXHRtZXRhS2V5OiB0cnVlLFxuXHRwYWdlWDogdHJ1ZSxcblx0cGFnZVk6IHRydWUsXG5cdHNoaWZ0S2V5OiB0cnVlLFxuXHR2aWV3OiB0cnVlLFxuXHRcImNoYXJcIjogdHJ1ZSxcblx0Y29kZTogdHJ1ZSxcblx0Y2hhckNvZGU6IHRydWUsXG5cdGtleTogdHJ1ZSxcblx0a2V5Q29kZTogdHJ1ZSxcblx0YnV0dG9uOiB0cnVlLFxuXHRidXR0b25zOiB0cnVlLFxuXHRjbGllbnRYOiB0cnVlLFxuXHRjbGllbnRZOiB0cnVlLFxuXHRvZmZzZXRYOiB0cnVlLFxuXHRvZmZzZXRZOiB0cnVlLFxuXHRwb2ludGVySWQ6IHRydWUsXG5cdHBvaW50ZXJUeXBlOiB0cnVlLFxuXHRzY3JlZW5YOiB0cnVlLFxuXHRzY3JlZW5ZOiB0cnVlLFxuXHR0YXJnZXRUb3VjaGVzOiB0cnVlLFxuXHR0b0VsZW1lbnQ6IHRydWUsXG5cdHRvdWNoZXM6IHRydWUsXG5cblx0d2hpY2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgYnV0dG9uID0gZXZlbnQuYnV0dG9uO1xuXG5cdFx0Ly8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzXG5cdFx0aWYgKCBldmVudC53aGljaCA9PSBudWxsICYmIHJrZXlFdmVudC50ZXN0KCBldmVudC50eXBlICkgKSB7XG5cdFx0XHRyZXR1cm4gZXZlbnQuY2hhckNvZGUgIT0gbnVsbCA/IGV2ZW50LmNoYXJDb2RlIDogZXZlbnQua2V5Q29kZTtcblx0XHR9XG5cblx0XHQvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0XG5cdFx0aWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgJiYgcm1vdXNlRXZlbnQudGVzdCggZXZlbnQudHlwZSApICkge1xuXHRcdFx0aWYgKCBidXR0b24gJiAxICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBidXR0b24gJiAyICkge1xuXHRcdFx0XHRyZXR1cm4gMztcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBidXR0b24gJiA0ICkge1xuXHRcdFx0XHRyZXR1cm4gMjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LndoaWNoO1xuXHR9XG59LCBqUXVlcnkuZXZlbnQuYWRkUHJvcCApO1xuXG5qUXVlcnkuZWFjaCggeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggdHlwZSwgZGVsZWdhdGVUeXBlICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdID0ge1xuXG5cdFx0Ly8gVXRpbGl6ZSBuYXRpdmUgZXZlbnQgaWYgcG9zc2libGUgc28gYmx1ci9mb2N1cyBzZXF1ZW5jZSBpcyBjb3JyZWN0XG5cdFx0c2V0dXA6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBDbGFpbSB0aGUgZmlyc3QgaGFuZGxlclxuXHRcdFx0Ly8gZGF0YVByaXYuc2V0KCB0aGlzLCBcImZvY3VzXCIsIC4uLiApXG5cdFx0XHQvLyBkYXRhUHJpdi5zZXQoIHRoaXMsIFwiYmx1clwiLCAuLi4gKVxuXHRcdFx0bGV2ZXJhZ2VOYXRpdmUoIHRoaXMsIHR5cGUsIGV4cGVjdFN5bmMgKTtcblxuXHRcdFx0Ly8gUmV0dXJuIGZhbHNlIHRvIGFsbG93IG5vcm1hbCBwcm9jZXNzaW5nIGluIHRoZSBjYWxsZXJcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBGb3JjZSBzZXR1cCBiZWZvcmUgdHJpZ2dlclxuXHRcdFx0bGV2ZXJhZ2VOYXRpdmUoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0Ly8gUmV0dXJuIG5vbi1mYWxzZSB0byBhbGxvdyBub3JtYWwgZXZlbnQtcGF0aCBwcm9wYWdhdGlvblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdGRlbGVnYXRlVHlwZTogZGVsZWdhdGVUeXBlXG5cdH07XG59ICk7XG5cbi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrc1xuLy8gc28gdGhhdCBldmVudCBkZWxlZ2F0aW9uIHdvcmtzIGluIGpRdWVyeS5cbi8vIERvIHRoZSBzYW1lIGZvciBwb2ludGVyZW50ZXIvcG9pbnRlcmxlYXZlIGFuZCBwb2ludGVyb3Zlci9wb2ludGVyb3V0XG4vL1xuLy8gU3VwcG9ydDogU2FmYXJpIDcgb25seVxuLy8gU2FmYXJpIHNlbmRzIG1vdXNlZW50ZXIgdG9vIG9mdGVuOyBzZWU6XG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNThcbi8vIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGJ1ZyAoaXQgZXhpc3RlZCBpbiBvbGRlciBDaHJvbWUgdmVyc2lvbnMgYXMgd2VsbCkuXG5qUXVlcnkuZWFjaCgge1xuXHRtb3VzZWVudGVyOiBcIm1vdXNlb3ZlclwiLFxuXHRtb3VzZWxlYXZlOiBcIm1vdXNlb3V0XCIsXG5cdHBvaW50ZXJlbnRlcjogXCJwb2ludGVyb3ZlclwiLFxuXHRwb2ludGVybGVhdmU6IFwicG9pbnRlcm91dFwiXG59LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0ge1xuXHRcdGRlbGVnYXRlVHlwZTogZml4LFxuXHRcdGJpbmRUeXBlOiBmaXgsXG5cblx0XHRoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciByZXQsXG5cdFx0XHRcdHRhcmdldCA9IHRoaXMsXG5cdFx0XHRcdHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LFxuXHRcdFx0XHRoYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmo7XG5cblx0XHRcdC8vIEZvciBtb3VzZWVudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuXG5cdFx0XHQvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvd1xuXHRcdFx0aWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkge1xuXHRcdFx0XHRldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlO1xuXHRcdFx0XHRyZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBmaXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0b25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTtcblx0fSxcblx0b2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHtcblx0XHR2YXIgaGFuZGxlT2JqLCB0eXBlO1xuXHRcdGlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkge1xuXG5cdFx0XHQvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50XG5cdFx0XHRoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7XG5cdFx0XHRqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKFxuXHRcdFx0XHRoYW5kbGVPYmoubmFtZXNwYWNlID9cblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUgKyBcIi5cIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOlxuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSxcblx0XHRcdFx0aGFuZGxlT2JqLnNlbGVjdG9yLFxuXHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdIClcblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzIFssIGZuXSApXG5cdFx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cblxudmFyXG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMCAtIDExLCBFZGdlIDEyIC0gMTMgb25seVxuXHQvLyBJbiBJRS9FZGdlIHVzaW5nIHJlZ2V4IGdyb3VwcyBoZXJlIGNhdXNlcyBzZXZlcmUgc2xvd2Rvd25zLlxuXHQvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyL1xuXHRybm9Jbm5lcmh0bWwgPSAvPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxcblxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcblx0cmNoZWNrZWQgPSAvY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLFxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8ISg/OlxcW0NEQVRBXFxbfC0tKXwoPzpcXF1cXF18LS0pPlxccyokL2c7XG5cbi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93c1xuZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkge1xuXHRpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRhYmxlXCIgKSAmJlxuXHRcdG5vZGVOYW1lKCBjb250ZW50Lm5vZGVUeXBlICE9PSAxMSA/IGNvbnRlbnQgOiBjb250ZW50LmZpcnN0Q2hpbGQsIFwidHJcIiApICkge1xuXG5cdFx0cmV0dXJuIGpRdWVyeSggZWxlbSApLmNoaWxkcmVuKCBcInRib2R5XCIgKVsgMCBdIHx8IGVsZW07XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvblxuZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSApIHtcblx0ZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggXCJ0eXBlXCIgKSAhPT0gbnVsbCApICsgXCIvXCIgKyBlbGVtLnR5cGU7XG5cdHJldHVybiBlbGVtO1xufVxuZnVuY3Rpb24gcmVzdG9yZVNjcmlwdCggZWxlbSApIHtcblx0aWYgKCAoIGVsZW0udHlwZSB8fCBcIlwiICkuc2xpY2UoIDAsIDUgKSA9PT0gXCJ0cnVlL1wiICkge1xuXHRcdGVsZW0udHlwZSA9IGVsZW0udHlwZS5zbGljZSggNSApO1xuXHR9IGVsc2Uge1xuXHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBcInR5cGVcIiApO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBpLCBsLCB0eXBlLCBwZGF0YU9sZCwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7XG5cblx0aWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIDEuIENvcHkgcHJpdmF0ZSBkYXRhOiBldmVudHMsIGhhbmRsZXJzLCBldGMuXG5cdGlmICggZGF0YVByaXYuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0cGRhdGFPbGQgPSBkYXRhUHJpdi5nZXQoIHNyYyApO1xuXHRcdGV2ZW50cyA9IHBkYXRhT2xkLmV2ZW50cztcblxuXHRcdGlmICggZXZlbnRzICkge1xuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBkZXN0LCBcImhhbmRsZSBldmVudHNcIiApO1xuXG5cdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBldmVudHNbIHR5cGUgXS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gMi4gQ29weSB1c2VyIGRhdGFcblx0aWYgKCBkYXRhVXNlci5oYXNEYXRhKCBzcmMgKSApIHtcblx0XHR1ZGF0YU9sZCA9IGRhdGFVc2VyLmFjY2Vzcyggc3JjICk7XG5cdFx0dWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTtcblxuXHRcdGRhdGFVc2VyLnNldCggZGVzdCwgdWRhdGFDdXIgKTtcblx0fVxufVxuXG4vLyBGaXggSUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHNcbmZ1bmN0aW9uIGZpeElucHV0KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuXHQvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi5cblx0aWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIHJjaGVja2FibGVUeXBlLnRlc3QoIHNyYy50eXBlICkgKSB7XG5cdFx0ZGVzdC5jaGVja2VkID0gc3JjLmNoZWNrZWQ7XG5cblx0Ly8gRmFpbHMgdG8gcmV0dXJuIHRoZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQgc3RhdGUgd2hlbiBjbG9uaW5nIG9wdGlvbnNcblx0fSBlbHNlIGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiB8fCBub2RlTmFtZSA9PT0gXCJ0ZXh0YXJlYVwiICkge1xuXHRcdGRlc3QuZGVmYXVsdFZhbHVlID0gc3JjLmRlZmF1bHRWYWx1ZTtcblx0fVxufVxuXG5mdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7XG5cblx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRhcmdzID0gZmxhdCggYXJncyApO1xuXG5cdHZhciBmcmFnbWVudCwgZmlyc3QsIHNjcmlwdHMsIGhhc1NjcmlwdHMsIG5vZGUsIGRvYyxcblx0XHRpID0gMCxcblx0XHRsID0gY29sbGVjdGlvbi5sZW5ndGgsXG5cdFx0aU5vQ2xvbmUgPSBsIC0gMSxcblx0XHR2YWx1ZSA9IGFyZ3NbIDAgXSxcblx0XHR2YWx1ZUlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCB2YWx1ZSApO1xuXG5cdC8vIFdlIGNhbid0IGNsb25lTm9kZSBmcmFnbWVudHMgdGhhdCBjb250YWluIGNoZWNrZWQsIGluIFdlYktpdFxuXHRpZiAoIHZhbHVlSXNGdW5jdGlvbiB8fFxuXHRcdFx0KCBsID4gMSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7XG5cdFx0cmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkge1xuXHRcdFx0dmFyIHNlbGYgPSBjb2xsZWN0aW9uLmVxKCBpbmRleCApO1xuXHRcdFx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdGFyZ3NbIDAgXSA9IHZhbHVlLmNhbGwoIHRoaXMsIGluZGV4LCBzZWxmLmh0bWwoKSApO1xuXHRcdFx0fVxuXHRcdFx0ZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7XG5cdFx0fSApO1xuXHR9XG5cblx0aWYgKCBsICkge1xuXHRcdGZyYWdtZW50ID0gYnVpbGRGcmFnbWVudCggYXJncywgY29sbGVjdGlvblsgMCBdLm93bmVyRG9jdW1lbnQsIGZhbHNlLCBjb2xsZWN0aW9uLCBpZ25vcmVkICk7XG5cdFx0Zmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0aWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHtcblx0XHRcdGZyYWdtZW50ID0gZmlyc3Q7XG5cdFx0fVxuXG5cdFx0Ly8gUmVxdWlyZSBlaXRoZXIgbmV3IGNvbnRlbnQgb3IgYW4gaW50ZXJlc3QgaW4gaWdub3JlZCBlbGVtZW50cyB0byBpbnZva2UgdGhlIGNhbGxiYWNrXG5cdFx0aWYgKCBmaXJzdCB8fCBpZ25vcmVkICkge1xuXHRcdFx0c2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsIFwic2NyaXB0XCIgKSwgZGlzYWJsZVNjcmlwdCApO1xuXHRcdFx0aGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoO1xuXG5cdFx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50IGZvciB0aGUgbGFzdCBpdGVtXG5cdFx0XHQvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXBcblx0XHRcdC8vIGJlaW5nIGVtcHRpZWQgaW5jb3JyZWN0bHkgaW4gY2VydGFpbiBzaXR1YXRpb25zICgjODA3MCkuXG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdG5vZGUgPSBmcmFnbWVudDtcblxuXHRcdFx0XHRpZiAoIGkgIT09IGlOb0Nsb25lICkge1xuXHRcdFx0XHRcdG5vZGUgPSBqUXVlcnkuY2xvbmUoIG5vZGUsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdC8vIEtlZXAgcmVmZXJlbmNlcyB0byBjbG9uZWQgc2NyaXB0cyBmb3IgbGF0ZXIgcmVzdG9yYXRpb25cblx0XHRcdFx0XHRpZiAoIGhhc1NjcmlwdHMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNhbGxiYWNrLmNhbGwoIGNvbGxlY3Rpb25bIGkgXSwgbm9kZSwgaSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc1NjcmlwdHMgKSB7XG5cdFx0XHRcdGRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7XG5cblx0XHRcdFx0Ly8gUmVlbmFibGUgc2NyaXB0c1xuXHRcdFx0XHRqUXVlcnkubWFwKCBzY3JpcHRzLCByZXN0b3JlU2NyaXB0ICk7XG5cblx0XHRcdFx0Ly8gRXZhbHVhdGUgZXhlY3V0YWJsZSBzY3JpcHRzIG9uIGZpcnN0IGRvY3VtZW50IGluc2VydGlvblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGhhc1NjcmlwdHM7IGkrKyApIHtcblx0XHRcdFx0XHRub2RlID0gc2NyaXB0c1sgaSBdO1xuXHRcdFx0XHRcdGlmICggcnNjcmlwdFR5cGUudGVzdCggbm9kZS50eXBlIHx8IFwiXCIgKSAmJlxuXHRcdFx0XHRcdFx0IWRhdGFQcml2LmFjY2Vzcyggbm9kZSwgXCJnbG9iYWxFdmFsXCIgKSAmJlxuXHRcdFx0XHRcdFx0alF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBub2RlLnNyYyAmJiAoIG5vZGUudHlwZSB8fCBcIlwiICkudG9Mb3dlckNhc2UoKSAgIT09IFwibW9kdWxlXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gT3B0aW9uYWwgQUpBWCBkZXBlbmRlbmN5LCBidXQgd29uJ3QgcnVuIHNjcmlwdHMgaWYgbm90IHByZXNlbnRcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuX2V2YWxVcmwgJiYgIW5vZGUubm9Nb2R1bGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYywge1xuXHRcdFx0XHRcdFx0XHRcdFx0bm9uY2U6IG5vZGUubm9uY2UgfHwgbm9kZS5nZXRBdHRyaWJ1dGUoIFwibm9uY2VcIiApXG5cdFx0XHRcdFx0XHRcdFx0fSwgZG9jICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdERPTUV2YWwoIG5vZGUudGV4dENvbnRlbnQucmVwbGFjZSggcmNsZWFuU2NyaXB0LCBcIlwiICksIG5vZGUsIGRvYyApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5mdW5jdGlvbiByZW1vdmUoIGVsZW0sIHNlbGVjdG9yLCBrZWVwRGF0YSApIHtcblx0dmFyIG5vZGUsXG5cdFx0bm9kZXMgPSBzZWxlY3RvciA/IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBlbGVtICkgOiBlbGVtLFxuXHRcdGkgPSAwO1xuXG5cdGZvciAoIDsgKCBub2RlID0gbm9kZXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRpZiAoICFrZWVwRGF0YSAmJiBub2RlLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBub2RlICkgKTtcblx0XHR9XG5cblx0XHRpZiAoIG5vZGUucGFyZW50Tm9kZSApIHtcblx0XHRcdGlmICgga2VlcERhdGEgJiYgaXNBdHRhY2hlZCggbm9kZSApICkge1xuXHRcdFx0XHRzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0fVxuXHRcdFx0bm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBub2RlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aHRtbFByZWZpbHRlcjogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0cmV0dXJuIGh0bWw7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHR2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cyxcblx0XHRcdGNsb25lID0gZWxlbS5jbG9uZU5vZGUoIHRydWUgKSxcblx0XHRcdGluUGFnZSA9IGlzQXR0YWNoZWQoIGVsZW0gKTtcblxuXHRcdC8vIEZpeCBJRSBjbG9uaW5nIGlzc3Vlc1xuXHRcdGlmICggIXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgJiYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGVsZW0ubm9kZVR5cGUgPT09IDExICkgJiZcblx0XHRcdFx0IWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXG5cdFx0XHQvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHBzOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzJcblx0XHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUgKTtcblx0XHRcdHNyY0VsZW1lbnRzID0gZ2V0QWxsKCBlbGVtICk7XG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lXG5cdFx0aWYgKCBkYXRhQW5kRXZlbnRzICkge1xuXHRcdFx0aWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdFx0c3JjRWxlbWVudHMgPSBzcmNFbGVtZW50cyB8fCBnZXRBbGwoIGVsZW0gKTtcblx0XHRcdFx0ZGVzdEVsZW1lbnRzID0gZGVzdEVsZW1lbnRzIHx8IGdldEFsbCggY2xvbmUgKTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRjbG9uZUNvcHlFdmVudCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUsIFwic2NyaXB0XCIgKTtcblx0XHRpZiAoIGRlc3RFbGVtZW50cy5sZW5ndGggPiAwICkge1xuXHRcdFx0c2V0R2xvYmFsRXZhbCggZGVzdEVsZW1lbnRzLCAhaW5QYWdlICYmIGdldEFsbCggZWxlbSwgXCJzY3JpcHRcIiApICk7XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0XG5cdFx0cmV0dXJuIGNsb25lO1xuXHR9LFxuXG5cdGNsZWFuRGF0YTogZnVuY3Rpb24oIGVsZW1zICkge1xuXHRcdHZhciBkYXRhLCBlbGVtLCB0eXBlLFxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IGVsZW1zWyBpIF0gKSAhPT0gdW5kZWZpbmVkOyBpKysgKSB7XG5cdFx0XHRpZiAoIGFjY2VwdERhdGEoIGVsZW0gKSApIHtcblx0XHRcdFx0aWYgKCAoIGRhdGEgPSBlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gKSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0Zm9yICggdHlwZSBpbiBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mgb3ZlcmhlYWRcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSApIHtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrXG5cdFx0XHRcdFx0Ly8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlXG5cdFx0XHRcdFx0ZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGV0YWNoOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciApO1xuXHR9LFxuXG5cdHRleHQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS50ZXh0KCB0aGlzICkgOlxuXHRcdFx0XHR0aGlzLmVtcHR5KCkuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fSxcblxuXHRhcHBlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5hcHBlbmRDaGlsZCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRwcmVwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0YXJnZXQuZmlyc3RDaGlsZCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRiZWZvcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGFmdGVyOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5uZXh0U2libGluZyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGVsZW0sXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzXG5cdFx0XHRcdGVsZW0udGV4dENvbnRlbnQgPSBcIlwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiggZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0ZGF0YUFuZEV2ZW50cyA9IGRhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGZhbHNlIDogZGF0YUFuZEV2ZW50cztcblx0XHRkZWVwRGF0YUFuZEV2ZW50cyA9IGRlZXBEYXRhQW5kRXZlbnRzID09IG51bGwgPyBkYXRhQW5kRXZlbnRzIDogZGVlcERhdGFBbmRFdmVudHM7XG5cblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jbG9uZSggdGhpcywgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKTtcblx0XHR9ICk7XG5cdH0sXG5cblx0aHRtbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBlbGVtID0gdGhpc1sgMCBdIHx8IHt9LFxuXHRcdFx0XHRpID0gMCxcblx0XHRcdFx0bCA9IHRoaXMubGVuZ3RoO1xuXG5cdFx0XHRpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0cmV0dXJuIGVsZW0uaW5uZXJIVE1MO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MXG5cdFx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiZcblx0XHRcdFx0IXdyYXBNYXBbICggcnRhZ05hbWUuZXhlYyggdmFsdWUgKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkge1xuXG5cdFx0XHRcdHZhbHVlID0galF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIHZhbHVlICk7XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0XHRlbGVtID0gdGhpc1sgaSBdIHx8IHt9O1xuXG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3Ncblx0XHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7XG5cdFx0XHRcdFx0XHRcdGVsZW0uaW5uZXJIVE1MID0gdmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZWxlbSA9IDA7XG5cblx0XHRcdFx0Ly8gSWYgdXNpbmcgaW5uZXJIVE1MIHRocm93cyBhbiBleGNlcHRpb24sIHVzZSB0aGUgZmFsbGJhY2sgbWV0aG9kXG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge31cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHR0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApO1xuXHRcdFx0fVxuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0cmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpZ25vcmVkID0gW107XG5cblx0XHQvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBub24taWdub3JlZCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnRcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuXG5cdFx0XHRpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlzLCBpZ25vcmVkICkgPCAwICkge1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIHRoaXMgKSApO1xuXHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblx0XHRcdFx0XHRwYXJlbnQucmVwbGFjZUNoaWxkKCBlbGVtLCB0aGlzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEZvcmNlIGNhbGxiYWNrIGludm9jYXRpb25cblx0XHR9LCBpZ25vcmVkICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIHtcblx0YXBwZW5kVG86IFwiYXBwZW5kXCIsXG5cdHByZXBlbmRUbzogXCJwcmVwZW5kXCIsXG5cdGluc2VydEJlZm9yZTogXCJiZWZvcmVcIixcblx0aW5zZXJ0QWZ0ZXI6IFwiYWZ0ZXJcIixcblx0cmVwbGFjZUFsbDogXCJyZXBsYWNlV2l0aFwiXG59LCBmdW5jdGlvbiggbmFtZSwgb3JpZ2luYWwgKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBlbGVtcyxcblx0XHRcdHJldCA9IFtdLFxuXHRcdFx0aW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLFxuXHRcdFx0bGFzdCA9IGluc2VydC5sZW5ndGggLSAxLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7IGkgPD0gbGFzdDsgaSsrICkge1xuXHRcdFx0ZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTtcblx0XHRcdGpRdWVyeSggaW5zZXJ0WyBpIF0gKVsgb3JpZ2luYWwgXSggZWxlbXMgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHQvLyAuZ2V0KCkgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRwdXNoLmFwcGx5KCByZXQsIGVsZW1zLmdldCgpICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTtcblx0fTtcbn0gKTtcbnZhciBybnVtbm9ucHggPSBuZXcgUmVnRXhwKCBcIl4oXCIgKyBwbnVtICsgXCIpKD8hcHgpW2EteiVdKyRcIiwgXCJpXCIgKTtcblxudmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5LCBGaXJlZm94IDw9MzAgKCMxNTA5OCwgIzE0MTUwKVxuXHRcdC8vIElFIHRocm93cyBvbiBlbGVtZW50cyBjcmVhdGVkIGluIHBvcHVwc1xuXHRcdC8vIEZGIG1lYW53aGlsZSB0aHJvd3Mgb24gZnJhbWUgZWxlbWVudHMgdGhyb3VnaCBcImRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGVcIlxuXHRcdHZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuXG5cdFx0aWYgKCAhdmlldyB8fCAhdmlldy5vcGVuZXIgKSB7XG5cdFx0XHR2aWV3ID0gd2luZG93O1xuXHRcdH1cblxuXHRcdHJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0gKTtcblx0fTtcblxudmFyIHN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2sgKSB7XG5cdHZhciByZXQsIG5hbWUsXG5cdFx0b2xkID0ge307XG5cblx0Ly8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07XG5cdH1cblxuXHRyZXQgPSBjYWxsYmFjay5jYWxsKCBlbGVtICk7XG5cblx0Ly8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59O1xuXG5cbnZhciByYm94U3R5bGUgPSBuZXcgUmVnRXhwKCBjc3NFeHBhbmQuam9pbiggXCJ8XCIgKSwgXCJpXCIgKTtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cblx0Ly8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0XG5cdC8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uXG5cdGZ1bmN0aW9uIGNvbXB1dGVTdHlsZVRlc3RzKCkge1xuXG5cdFx0Ly8gVGhpcyBpcyBhIHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZVxuXHRcdGlmICggIWRpdiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O1wiICtcblx0XHRcdFwibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowXCI7XG5cdFx0ZGl2LnN0eWxlLmNzc1RleHQgPVxuXHRcdFx0XCJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7XCIgK1xuXHRcdFx0XCJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O1wiICtcblx0XHRcdFwid2lkdGg6NjAlO3RvcDoxJVwiO1xuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggY29udGFpbmVyICkuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdFx0dmFyIGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiApO1xuXHRcdHBpeGVsUG9zaXRpb25WYWwgPSBkaXZTdHlsZS50b3AgIT09IFwiMSVcIjtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIEZpcmVmb3ggPD0zIC0gNDRcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnRWYWwgPSByb3VuZFBpeGVsTWVhc3VyZXMoIGRpdlN0eWxlLm1hcmdpbkxlZnQgKSA9PT0gMTI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjNcblx0XHQvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3Rcblx0XHRkaXYuc3R5bGUucmlnaHQgPSBcIjYwJVwiO1xuXHRcdHBpeGVsQm94U3R5bGVzVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5yaWdodCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdFx0Ly8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50c1xuXHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgb25seVxuXHRcdC8vIERldGVjdCBvdmVyZmxvdzpzY3JvbGwgc2NyZXdpbmVzcyAoZ2gtMzY5OSlcblx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD02NFxuXHRcdC8vIERvbid0IGdldCB0cmlja2VkIHdoZW4gem9vbSBhZmZlY3RzIG9mZnNldFdpZHRoIChnaC00MDI5KVxuXHRcdGRpdi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcblx0XHRzY3JvbGxib3hTaXplVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXYub2Zmc2V0V2lkdGggLyAzICkgPT09IDEyO1xuXG5cdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdC8vIE51bGxpZnkgdGhlIGRpdiBzbyBpdCB3b3VsZG4ndCBiZSBzdG9yZWQgaW4gdGhlIG1lbW9yeSBhbmRcblx0XHQvLyBpdCB3aWxsIGFsc28gYmUgYSBzaWduIHRoYXQgY2hlY2tzIGFscmVhZHkgcGVyZm9ybWVkXG5cdFx0ZGl2ID0gbnVsbDtcblx0fVxuXG5cdGZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHtcblx0XHRyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7XG5cdH1cblxuXHR2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsIHNjcm9sbGJveFNpemVWYWwsIHBpeGVsQm94U3R5bGVzVmFsLFxuXHRcdHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsLCByZWxpYWJsZU1hcmdpbkxlZnRWYWwsXG5cdFx0Y29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLFxuXHRcdGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKTtcblxuXHQvLyBGaW5pc2ggZWFybHkgaW4gbGltaXRlZCAobm9uLWJyb3dzZXIpIGVudmlyb25tZW50c1xuXHRpZiAoICFkaXYuc3R5bGUgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBTdHlsZSBvZiBjbG9uZWQgZWxlbWVudCBhZmZlY3RzIHNvdXJjZSBlbGVtZW50IGNsb25lZCAoIzg5MDgpXG5cdGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiY29udGVudC1ib3hcIjtcblx0ZGl2LmNsb25lTm9kZSggdHJ1ZSApLnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJcIjtcblx0c3VwcG9ydC5jbGVhckNsb25lU3R5bGUgPSBkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPT09IFwiY29udGVudC1ib3hcIjtcblxuXHRqUXVlcnkuZXh0ZW5kKCBzdXBwb3J0LCB7XG5cdFx0Ym94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDtcblx0XHR9LFxuXHRcdHBpeGVsQm94U3R5bGVzOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcGl4ZWxCb3hTdHlsZXNWYWw7XG5cdFx0fSxcblx0XHRwaXhlbFBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcGl4ZWxQb3NpdGlvblZhbDtcblx0XHR9LFxuXHRcdHJlbGlhYmxlTWFyZ2luTGVmdDogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHJlbGlhYmxlTWFyZ2luTGVmdFZhbDtcblx0XHR9LFxuXHRcdHNjcm9sbGJveFNpemU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBzY3JvbGxib3hTaXplVmFsO1xuXHRcdH0sXG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErLCBFZGdlIDE1IC0gMTgrXG5cdFx0Ly8gSUUvRWRnZSBtaXNyZXBvcnQgYGdldENvbXB1dGVkU3R5bGVgIG9mIHRhYmxlIHJvd3Mgd2l0aCB3aWR0aC9oZWlnaHRcblx0XHQvLyBzZXQgaW4gQ1NTIHdoaWxlIGBvZmZzZXQqYCBwcm9wZXJ0aWVzIHJlcG9ydCBjb3JyZWN0IHZhbHVlcy5cblx0XHQvLyBCZWhhdmlvciBpbiBJRSA5IGlzIG1vcmUgc3VidGxlIHRoYW4gaW4gbmV3ZXIgdmVyc2lvbnMgJiBpdCBwYXNzZXNcblx0XHQvLyBzb21lIHZlcnNpb25zIG9mIHRoaXMgdGVzdDsgbWFrZSBzdXJlIG5vdCB0byBtYWtlIGl0IHBhc3MgdGhlcmUhXG5cdFx0cmVsaWFibGVUckRpbWVuc2lvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHRhYmxlLCB0ciwgdHJDaGlsZCwgdHJTdHlsZTtcblx0XHRcdGlmICggcmVsaWFibGVUckRpbWVuc2lvbnNWYWwgPT0gbnVsbCApIHtcblx0XHRcdFx0dGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcInRhYmxlXCIgKTtcblx0XHRcdFx0dHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcInRyXCIgKTtcblx0XHRcdFx0dHJDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKTtcblxuXHRcdFx0XHR0YWJsZS5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4XCI7XG5cdFx0XHRcdHRyLnN0eWxlLmhlaWdodCA9IFwiMXB4XCI7XG5cdFx0XHRcdHRyQ2hpbGQuc3R5bGUuaGVpZ2h0ID0gXCI5cHhcIjtcblxuXHRcdFx0XHRkb2N1bWVudEVsZW1lbnRcblx0XHRcdFx0XHQuYXBwZW5kQ2hpbGQoIHRhYmxlIClcblx0XHRcdFx0XHQuYXBwZW5kQ2hpbGQoIHRyIClcblx0XHRcdFx0XHQuYXBwZW5kQ2hpbGQoIHRyQ2hpbGQgKTtcblxuXHRcdFx0XHR0clN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIHRyICk7XG5cdFx0XHRcdHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsID0gcGFyc2VJbnQoIHRyU3R5bGUuaGVpZ2h0ICkgPiAzO1xuXG5cdFx0XHRcdGRvY3VtZW50RWxlbWVudC5yZW1vdmVDaGlsZCggdGFibGUgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZWxpYWJsZVRyRGltZW5zaW9uc1ZhbDtcblx0XHR9XG5cdH0gKTtcbn0gKSgpO1xuXG5cbmZ1bmN0aW9uIGN1ckNTUyggZWxlbSwgbmFtZSwgY29tcHV0ZWQgKSB7XG5cdHZhciB3aWR0aCwgbWluV2lkdGgsIG1heFdpZHRoLCByZXQsXG5cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDUxK1xuXHRcdC8vIFJldHJpZXZpbmcgc3R5bGUgYmVmb3JlIGNvbXB1dGVkIHNvbWVob3dcblx0XHQvLyBmaXhlcyBhbiBpc3N1ZSB3aXRoIGdldHRpbmcgd3JvbmcgdmFsdWVzXG5cdFx0Ly8gb24gZGV0YWNoZWQgZWxlbWVudHNcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0Y29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTtcblxuXHQvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG5lZWRlZCBmb3I6XG5cdC8vICAgLmNzcygnZmlsdGVyJykgKElFIDkgb25seSwgIzEyNTM3KVxuXHQvLyAgIC5jc3MoJy0tY3VzdG9tUHJvcGVydHkpICgjMzE0NClcblx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRyZXQgPSBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXTtcblxuXHRcdGlmICggcmV0ID09PSBcIlwiICYmICFpc0F0dGFjaGVkKCBlbGVtICkgKSB7XG5cdFx0XHRyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBBIHRyaWJ1dGUgdG8gdGhlIFwiYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkc1wiXG5cdFx0Ly8gQW5kcm9pZCBCcm93c2VyIHJldHVybnMgcGVyY2VudGFnZSBmb3Igc29tZSB2YWx1ZXMsXG5cdFx0Ly8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscy5cblx0XHQvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6XG5cdFx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXNcblx0XHRpZiAoICFzdXBwb3J0LnBpeGVsQm94U3R5bGVzKCkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJib3hTdHlsZS50ZXN0KCBuYW1lICkgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXNcblx0XHRcdHdpZHRoID0gc3R5bGUud2lkdGg7XG5cdFx0XHRtaW5XaWR0aCA9IHN0eWxlLm1pbldpZHRoO1xuXHRcdFx0bWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDtcblxuXHRcdFx0Ly8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dFxuXHRcdFx0c3R5bGUubWluV2lkdGggPSBzdHlsZS5tYXhXaWR0aCA9IHN0eWxlLndpZHRoID0gcmV0O1xuXHRcdFx0cmV0ID0gY29tcHV0ZWQud2lkdGg7XG5cblx0XHRcdC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXNcblx0XHRcdHN0eWxlLndpZHRoID0gd2lkdGg7XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoO1xuXHRcdFx0c3R5bGUubWF4V2lkdGggPSBtYXhXaWR0aDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmV0ICE9PSB1bmRlZmluZWQgP1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHRcdC8vIElFIHJldHVybnMgekluZGV4IHZhbHVlIGFzIGFuIGludGVnZXIuXG5cdFx0cmV0ICsgXCJcIiA6XG5cdFx0cmV0O1xufVxuXG5cbmZ1bmN0aW9uIGFkZEdldEhvb2tJZiggY29uZGl0aW9uRm4sIGhvb2tGbiApIHtcblxuXHQvLyBEZWZpbmUgdGhlIGhvb2ssIHdlJ2xsIGNoZWNrIG9uIHRoZSBmaXJzdCBydW4gaWYgaXQncyByZWFsbHkgbmVlZGVkLlxuXHRyZXR1cm4ge1xuXHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGNvbmRpdGlvbkZuKCkgKSB7XG5cblx0XHRcdFx0Ly8gSG9vayBub3QgbmVlZGVkIChvciBpdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgaXQgZHVlXG5cdFx0XHRcdC8vIHRvIG1pc3NpbmcgZGVwZW5kZW5jeSksIHJlbW92ZSBpdC5cblx0XHRcdFx0ZGVsZXRlIHRoaXMuZ2V0O1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEhvb2sgbmVlZGVkOyByZWRlZmluZSBpdCBzbyB0aGF0IHRoZSBzdXBwb3J0IHRlc3QgaXMgbm90IGV4ZWN1dGVkIGFnYWluLlxuXHRcdFx0cmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fVxuXHR9O1xufVxuXG5cbnZhciBjc3NQcmVmaXhlcyA9IFsgXCJXZWJraXRcIiwgXCJNb3pcIiwgXCJtc1wiIF0sXG5cdGVtcHR5U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkuc3R5bGUsXG5cdHZlbmRvclByb3BzID0ge307XG5cbi8vIFJldHVybiBhIHZlbmRvci1wcmVmaXhlZCBwcm9wZXJ0eSBvciB1bmRlZmluZWRcbmZ1bmN0aW9uIHZlbmRvclByb3BOYW1lKCBuYW1lICkge1xuXG5cdC8vIENoZWNrIGZvciB2ZW5kb3IgcHJlZml4ZWQgbmFtZXNcblx0dmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSxcblx0XHRpID0gY3NzUHJlZml4ZXMubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTtcblx0XHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRcdHJldHVybiBuYW1lO1xuXHRcdH1cblx0fVxufVxuXG4vLyBSZXR1cm4gYSBwb3RlbnRpYWxseS1tYXBwZWQgalF1ZXJ5LmNzc1Byb3BzIG9yIHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eVxuZnVuY3Rpb24gZmluYWxQcm9wTmFtZSggbmFtZSApIHtcblx0dmFyIGZpbmFsID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gfHwgdmVuZG9yUHJvcHNbIG5hbWUgXTtcblxuXHRpZiAoIGZpbmFsICkge1xuXHRcdHJldHVybiBmaW5hbDtcblx0fVxuXHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRyZXR1cm4gbmFtZTtcblx0fVxuXHRyZXR1cm4gdmVuZG9yUHJvcHNbIG5hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBuYW1lICkgfHwgbmFtZTtcbn1cblxuXG52YXJcblxuXHQvLyBTd2FwcGFibGUgaWYgZGlzcGxheSBpcyBub25lIG9yIHN0YXJ0cyB3aXRoIHRhYmxlXG5cdC8vIGV4Y2VwdCBcInRhYmxlXCIsIFwidGFibGUtY2VsbFwiLCBvciBcInRhYmxlLWNhcHRpb25cIlxuXHQvLyBTZWUgaGVyZSBmb3IgZGlzcGxheSB2YWx1ZXM6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvQ1NTL2Rpc3BsYXlcblx0cmRpc3BsYXlzd2FwID0gL14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFxuXHRyY3VzdG9tUHJvcCA9IC9eLS0vLFxuXHRjc3NTaG93ID0geyBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLCB2aXNpYmlsaXR5OiBcImhpZGRlblwiLCBkaXNwbGF5OiBcImJsb2NrXCIgfSxcblx0Y3NzTm9ybWFsVHJhbnNmb3JtID0ge1xuXHRcdGxldHRlclNwYWNpbmc6IFwiMFwiLFxuXHRcdGZvbnRXZWlnaHQ6IFwiNDAwXCJcblx0fTtcblxuZnVuY3Rpb24gc2V0UG9zaXRpdmVOdW1iZXIoIF9lbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7XG5cblx0Ly8gQW55IHJlbGF0aXZlICgrLy0pIHZhbHVlcyBoYXZlIGFscmVhZHkgYmVlblxuXHQvLyBub3JtYWxpemVkIGF0IHRoaXMgcG9pbnRcblx0dmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7XG5cdHJldHVybiBtYXRjaGVzID9cblxuXHRcdC8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkIFwic3VidHJhY3RcIiwgZS5nLiwgd2hlbiB1c2VkIGFzIGluIGNzc0hvb2tzXG5cdFx0TWF0aC5tYXgoIDAsIG1hdGNoZXNbIDIgXSAtICggc3VidHJhY3QgfHwgMCApICkgKyAoIG1hdGNoZXNbIDMgXSB8fCBcInB4XCIgKSA6XG5cdFx0dmFsdWU7XG59XG5cbmZ1bmN0aW9uIGJveE1vZGVsQWRqdXN0bWVudCggZWxlbSwgZGltZW5zaW9uLCBib3gsIGlzQm9yZGVyQm94LCBzdHlsZXMsIGNvbXB1dGVkVmFsICkge1xuXHR2YXIgaSA9IGRpbWVuc2lvbiA9PT0gXCJ3aWR0aFwiID8gMSA6IDAsXG5cdFx0ZXh0cmEgPSAwLFxuXHRcdGRlbHRhID0gMDtcblxuXHQvLyBBZGp1c3RtZW50IG1heSBub3QgYmUgbmVjZXNzYXJ5XG5cdGlmICggYm94ID09PSAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICkgKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgKSB7XG5cblx0XHQvLyBCb3RoIGJveCBtb2RlbHMgZXhjbHVkZSBtYXJnaW5cblx0XHRpZiAoIGJveCA9PT0gXCJtYXJnaW5cIiApIHtcblx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIGJveCArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHQvLyBJZiB3ZSBnZXQgaGVyZSB3aXRoIGEgY29udGVudC1ib3gsIHdlJ3JlIHNlZWtpbmcgXCJwYWRkaW5nXCIgb3IgXCJib3JkZXJcIiBvciBcIm1hcmdpblwiXG5cdFx0aWYgKCAhaXNCb3JkZXJCb3ggKSB7XG5cblx0XHRcdC8vIEFkZCBwYWRkaW5nXG5cdFx0XHRkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblxuXHRcdFx0Ly8gRm9yIFwiYm9yZGVyXCIgb3IgXCJtYXJnaW5cIiwgYWRkIGJvcmRlclxuXHRcdFx0aWYgKCBib3ggIT09IFwicGFkZGluZ1wiICkge1xuXHRcdFx0XHRkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBCdXQgc3RpbGwga2VlcCB0cmFjayBvZiBpdCBvdGhlcndpc2Vcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGV4dHJhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHQvLyBJZiB3ZSBnZXQgaGVyZSB3aXRoIGEgYm9yZGVyLWJveCAoY29udGVudCArIHBhZGRpbmcgKyBib3JkZXIpLCB3ZSdyZSBzZWVraW5nIFwiY29udGVudFwiIG9yXG5cdFx0Ly8gXCJwYWRkaW5nXCIgb3IgXCJtYXJnaW5cIlxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEZvciBcImNvbnRlbnRcIiwgc3VidHJhY3QgcGFkZGluZ1xuXHRcdFx0aWYgKCBib3ggPT09IFwiY29udGVudFwiICkge1xuXHRcdFx0XHRkZWx0YSAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yIFwiY29udGVudFwiIG9yIFwicGFkZGluZ1wiLCBzdWJ0cmFjdCBib3JkZXJcblx0XHRcdGlmICggYm94ICE9PSBcIm1hcmdpblwiICkge1xuXHRcdFx0XHRkZWx0YSAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEFjY291bnQgZm9yIHBvc2l0aXZlIGNvbnRlbnQtYm94IHNjcm9sbCBndXR0ZXIgd2hlbiByZXF1ZXN0ZWQgYnkgcHJvdmlkaW5nIGNvbXB1dGVkVmFsXG5cdGlmICggIWlzQm9yZGVyQm94ICYmIGNvbXB1dGVkVmFsID49IDAgKSB7XG5cblx0XHQvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgaXMgYSByb3VuZGVkIHN1bSBvZiBjb250ZW50LCBwYWRkaW5nLCBzY3JvbGwgZ3V0dGVyLCBhbmQgYm9yZGVyXG5cdFx0Ly8gQXNzdW1pbmcgaW50ZWdlciBzY3JvbGwgZ3V0dGVyLCBzdWJ0cmFjdCB0aGUgcmVzdCBhbmQgcm91bmQgZG93blxuXHRcdGRlbHRhICs9IE1hdGgubWF4KCAwLCBNYXRoLmNlaWwoXG5cdFx0XHRlbGVtWyBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApIF0gLVxuXHRcdFx0Y29tcHV0ZWRWYWwgLVxuXHRcdFx0ZGVsdGEgLVxuXHRcdFx0ZXh0cmEgLVxuXHRcdFx0MC41XG5cblx0XHQvLyBJZiBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgaXMgdW5rbm93biwgdGhlbiB3ZSBjYW4ndCBkZXRlcm1pbmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlclxuXHRcdC8vIFVzZSBhbiBleHBsaWNpdCB6ZXJvIHRvIGF2b2lkIE5hTiAoZ2gtMzk2NClcblx0XHQpICkgfHwgMDtcblx0fVxuXG5cdHJldHVybiBkZWx0YTtcbn1cblxuZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApIHtcblxuXHQvLyBTdGFydCB3aXRoIGNvbXB1dGVkIHN0eWxlXG5cdHZhciBzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSxcblxuXHRcdC8vIFRvIGF2b2lkIGZvcmNpbmcgYSByZWZsb3csIG9ubHkgZmV0Y2ggYm94U2l6aW5nIGlmIHdlIG5lZWQgaXQgKGdoLTQzMjIpLlxuXHRcdC8vIEZha2UgY29udGVudC1ib3ggdW50aWwgd2Uga25vdyBpdCdzIG5lZWRlZCB0byBrbm93IHRoZSB0cnVlIHZhbHVlLlxuXHRcdGJveFNpemluZ05lZWRlZCA9ICFzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgZXh0cmEsXG5cdFx0aXNCb3JkZXJCb3ggPSBib3hTaXppbmdOZWVkZWQgJiZcblx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCIsXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IGlzQm9yZGVyQm94LFxuXG5cdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBkaW1lbnNpb24sIHN0eWxlcyApLFxuXHRcdG9mZnNldFByb3AgPSBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApO1xuXG5cdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD01NFxuXHQvLyBSZXR1cm4gYSBjb25mb3VuZGluZyBub24tcGl4ZWwgdmFsdWUgb3IgZmVpZ24gaWdub3JhbmNlLCBhcyBhcHByb3ByaWF0ZS5cblx0aWYgKCBybnVtbm9ucHgudGVzdCggdmFsICkgKSB7XG5cdFx0aWYgKCAhZXh0cmEgKSB7XG5cdFx0XHRyZXR1cm4gdmFsO1xuXHRcdH1cblx0XHR2YWwgPSBcImF1dG9cIjtcblx0fVxuXG5cblx0Ly8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHlcblx0Ly8gVXNlIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBmb3Igd2hlbiBib3ggc2l6aW5nIGlzIHVucmVsaWFibGUuXG5cdC8vIEluIHRob3NlIGNhc2VzLCB0aGUgY29tcHV0ZWQgdmFsdWUgY2FuIGJlIHRydXN0ZWQgdG8gYmUgYm9yZGVyLWJveC5cblx0aWYgKCAoICFzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgJiYgaXNCb3JkZXJCb3ggfHxcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDEwIC0gMTErLCBFZGdlIDE1IC0gMTgrXG5cdFx0Ly8gSUUvRWRnZSBtaXNyZXBvcnQgYGdldENvbXB1dGVkU3R5bGVgIG9mIHRhYmxlIHJvd3Mgd2l0aCB3aWR0aC9oZWlnaHRcblx0XHQvLyBzZXQgaW4gQ1NTIHdoaWxlIGBvZmZzZXQqYCBwcm9wZXJ0aWVzIHJlcG9ydCBjb3JyZWN0IHZhbHVlcy5cblx0XHQvLyBJbnRlcmVzdGluZ2x5LCBpbiBzb21lIGNhc2VzIElFIDkgZG9lc24ndCBzdWZmZXIgZnJvbSB0aGlzIGlzc3VlLlxuXHRcdCFzdXBwb3J0LnJlbGlhYmxlVHJEaW1lbnNpb25zKCkgJiYgbm9kZU5hbWUoIGVsZW0sIFwidHJcIiApIHx8XG5cblx0XHQvLyBGYWxsIGJhY2sgdG8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IHdoZW4gdmFsdWUgaXMgXCJhdXRvXCJcblx0XHQvLyBUaGlzIGhhcHBlbnMgZm9yIGlubGluZSBlbGVtZW50cyB3aXRoIG5vIGV4cGxpY2l0IHNldHRpbmcgKGdoLTM1NzEpXG5cdFx0dmFsID09PSBcImF1dG9cIiB8fFxuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMSAtIDQuMyBvbmx5XG5cdFx0Ly8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMilcblx0XHQhcGFyc2VGbG9hdCggdmFsICkgJiYgalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJpbmxpbmVcIiApICYmXG5cblx0XHQvLyBNYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSAmIGNvbm5lY3RlZFxuXHRcdGVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7XG5cblx0XHRpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCI7XG5cblx0XHQvLyBXaGVyZSBhdmFpbGFibGUsIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBhcHByb3hpbWF0ZSBib3JkZXIgYm94IGRpbWVuc2lvbnMuXG5cdFx0Ly8gV2hlcmUgbm90IGF2YWlsYWJsZSAoZS5nLiwgU1ZHKSwgYXNzdW1lIHVucmVsaWFibGUgYm94LXNpemluZyBhbmQgaW50ZXJwcmV0IHRoZVxuXHRcdC8vIHJldHJpZXZlZCB2YWx1ZSBhcyBhIGNvbnRlbnQgYm94IGRpbWVuc2lvbi5cblx0XHR2YWx1ZUlzQm9yZGVyQm94ID0gb2Zmc2V0UHJvcCBpbiBlbGVtO1xuXHRcdGlmICggdmFsdWVJc0JvcmRlckJveCApIHtcblx0XHRcdHZhbCA9IGVsZW1bIG9mZnNldFByb3AgXTtcblx0XHR9XG5cdH1cblxuXHQvLyBOb3JtYWxpemUgXCJcIiBhbmQgYXV0b1xuXHR2YWwgPSBwYXJzZUZsb2F0KCB2YWwgKSB8fCAwO1xuXG5cdC8vIEFkanVzdCBmb3IgdGhlIGVsZW1lbnQncyBib3ggbW9kZWxcblx0cmV0dXJuICggdmFsICtcblx0XHRib3hNb2RlbEFkanVzdG1lbnQoXG5cdFx0XHRlbGVtLFxuXHRcdFx0ZGltZW5zaW9uLFxuXHRcdFx0ZXh0cmEgfHwgKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApLFxuXHRcdFx0dmFsdWVJc0JvcmRlckJveCxcblx0XHRcdHN0eWxlcyxcblxuXHRcdFx0Ly8gUHJvdmlkZSB0aGUgY3VycmVudCBjb21wdXRlZCBzaXplIHRvIHJlcXVlc3Qgc2Nyb2xsIGd1dHRlciBjYWxjdWxhdGlvbiAoZ2gtMzU4OSlcblx0XHRcdHZhbFxuXHRcdClcblx0KSArIFwicHhcIjtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIEFkZCBpbiBzdHlsZSBwcm9wZXJ0eSBob29rcyBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmYXVsdFxuXHQvLyBiZWhhdmlvciBvZiBnZXR0aW5nIGFuZCBzZXR0aW5nIGEgc3R5bGUgcHJvcGVydHlcblx0Y3NzSG9va3M6IHtcblx0XHRvcGFjaXR5OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdFx0XHRcdC8vIFdlIHNob3VsZCBhbHdheXMgZ2V0IGEgbnVtYmVyIGJhY2sgZnJvbSBvcGFjaXR5XG5cdFx0XHRcdFx0dmFyIHJldCA9IGN1ckNTUyggZWxlbSwgXCJvcGFjaXR5XCIgKTtcblx0XHRcdFx0XHRyZXR1cm4gcmV0ID09PSBcIlwiID8gXCIxXCIgOiByZXQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Ly8gRG9uJ3QgYXV0b21hdGljYWxseSBhZGQgXCJweFwiIHRvIHRoZXNlIHBvc3NpYmx5LXVuaXRsZXNzIHByb3BlcnRpZXNcblx0Y3NzTnVtYmVyOiB7XG5cdFx0XCJhbmltYXRpb25JdGVyYXRpb25Db3VudFwiOiB0cnVlLFxuXHRcdFwiY29sdW1uQ291bnRcIjogdHJ1ZSxcblx0XHRcImZpbGxPcGFjaXR5XCI6IHRydWUsXG5cdFx0XCJmbGV4R3Jvd1wiOiB0cnVlLFxuXHRcdFwiZmxleFNocmlua1wiOiB0cnVlLFxuXHRcdFwiZm9udFdlaWdodFwiOiB0cnVlLFxuXHRcdFwiZ3JpZEFyZWFcIjogdHJ1ZSxcblx0XHRcImdyaWRDb2x1bW5cIjogdHJ1ZSxcblx0XHRcImdyaWRDb2x1bW5FbmRcIjogdHJ1ZSxcblx0XHRcImdyaWRDb2x1bW5TdGFydFwiOiB0cnVlLFxuXHRcdFwiZ3JpZFJvd1wiOiB0cnVlLFxuXHRcdFwiZ3JpZFJvd0VuZFwiOiB0cnVlLFxuXHRcdFwiZ3JpZFJvd1N0YXJ0XCI6IHRydWUsXG5cdFx0XCJsaW5lSGVpZ2h0XCI6IHRydWUsXG5cdFx0XCJvcGFjaXR5XCI6IHRydWUsXG5cdFx0XCJvcmRlclwiOiB0cnVlLFxuXHRcdFwib3JwaGFuc1wiOiB0cnVlLFxuXHRcdFwid2lkb3dzXCI6IHRydWUsXG5cdFx0XCJ6SW5kZXhcIjogdHJ1ZSxcblx0XHRcInpvb21cIjogdHJ1ZVxuXHR9LFxuXG5cdC8vIEFkZCBpbiBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIHlvdSB3aXNoIHRvIGZpeCBiZWZvcmVcblx0Ly8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZVxuXHRjc3NQcm9wczoge30sXG5cblx0Ly8gR2V0IGFuZCBzZXQgdGhlIHN0eWxlIHByb3BlcnR5IG9uIGEgRE9NIE5vZGVcblx0c3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7XG5cblx0XHQvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWVcblx0XHR2YXIgcmV0LCB0eXBlLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0gY2FtZWxDYXNlKCBuYW1lICksXG5cdFx0XHRpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksXG5cdFx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUuIFdlIGRvbid0XG5cdFx0Ly8gd2FudCB0byBxdWVyeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5XG5cdFx0Ly8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLlxuXHRcdGlmICggIWlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdG5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApO1xuXHRcdH1cblxuXHRcdC8vIEdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24sIHRoZW4gdW5wcmVmaXhlZCB2ZXJzaW9uXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5nIGEgdmFsdWVcblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG5cdFx0XHQvLyBDb252ZXJ0IFwiKz1cIiBvciBcIi09XCIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwic3RyaW5nXCIgJiYgKCByZXQgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJiByZXRbIDEgXSApIHtcblx0XHRcdFx0dmFsdWUgPSBhZGp1c3RDU1MoIGVsZW0sIG5hbWUsIHJldCApO1xuXG5cdFx0XHRcdC8vIEZpeGVzIGJ1ZyAjOTIzN1xuXHRcdFx0XHR0eXBlID0gXCJudW1iZXJcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICgjNzExNilcblx0XHRcdGlmICggdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpXG5cdFx0XHQvLyBUaGUgaXNDdXN0b21Qcm9wIGNoZWNrIGNhbiBiZSByZW1vdmVkIGluIGpRdWVyeSA0LjAgd2hlbiB3ZSBvbmx5IGF1dG8tYXBwZW5kXG5cdFx0XHQvLyBcInB4XCIgdG8gYSBmZXcgaGFyZGNvZGVkIHZhbHVlcy5cblx0XHRcdGlmICggdHlwZSA9PT0gXCJudW1iZXJcIiAmJiAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0XHR2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gXCJcIiA6IFwicHhcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBiYWNrZ3JvdW5kLSogcHJvcHMgYWZmZWN0IG9yaWdpbmFsIGNsb25lJ3MgdmFsdWVzXG5cdFx0XHRpZiAoICFzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSAmJiB2YWx1ZSA9PT0gXCJcIiAmJiBuYW1lLmluZGV4T2YoIFwiYmFja2dyb3VuZFwiICkgPT09IDAgKSB7XG5cdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSBcImluaGVyaXRcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKCBcInNldFwiIGluIGhvb2tzICkgfHxcblx0XHRcdFx0KCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGlmICggaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0XHRcdHN0eWxlLnNldFByb3BlcnR5KCBuYW1lLCB2YWx1ZSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5nZXQoIGVsZW0sIGZhbHNlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdFxuXHRcdFx0cmV0dXJuIHN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXHR9LFxuXG5cdGNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhLCBzdHlsZXMgKSB7XG5cdFx0dmFyIHZhbCwgbnVtLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0gY2FtZWxDYXNlKCBuYW1lICksXG5cdFx0XHRpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUuIFdlIGRvbid0XG5cdFx0Ly8gd2FudCB0byBtb2RpZnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eVxuXHRcdC8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC5cblx0XHRpZiAoICFpc0N1c3RvbVByb3AgKSB7XG5cdFx0XHRuYW1lID0gZmluYWxQcm9wTmFtZSggb3JpZ05hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbCA9IGhvb2tzLmdldCggZWxlbSwgdHJ1ZSwgZXh0cmEgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2UsIGlmIGEgd2F5IHRvIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZXhpc3RzLCB1c2UgdGhhdFxuXHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgXCJub3JtYWxcIiB0byBjb21wdXRlZCB2YWx1ZVxuXHRcdGlmICggdmFsID09PSBcIm5vcm1hbFwiICYmIG5hbWUgaW4gY3NzTm9ybWFsVHJhbnNmb3JtICkge1xuXHRcdFx0dmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBudW1lcmljIGlmIGZvcmNlZCBvciBhIHF1YWxpZmllciB3YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmljXG5cdFx0aWYgKCBleHRyYSA9PT0gXCJcIiB8fCBleHRyYSApIHtcblx0XHRcdG51bSA9IHBhcnNlRmxvYXQoIHZhbCApO1xuXHRcdFx0cmV0dXJuIGV4dHJhID09PSB0cnVlIHx8IGlzRmluaXRlKCBudW0gKSA/IG51bSB8fCAwIDogdmFsO1xuXHRcdH1cblxuXHRcdHJldHVybiB2YWw7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiIF0sIGZ1bmN0aW9uKCBfaSwgZGltZW5zaW9uICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0Ly8gQ2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtXG5cdFx0XHRcdC8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0XG5cdFx0XHRcdHJldHVybiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSApICYmXG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCtcblx0XHRcdFx0XHQvLyBUYWJsZSBjb2x1bW5zIGluIFNhZmFyaSBoYXZlIG5vbi16ZXJvIG9mZnNldFdpZHRoICYgemVyb1xuXHRcdFx0XHRcdC8vIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHVubGVzcyBkaXNwbGF5IGlzIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0XHRcdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYSBkaXNjb25uZWN0ZWQgbm9kZVxuXHRcdFx0XHRcdC8vIGluIElFIHRocm93cyBhbiBlcnJvci5cblx0XHRcdFx0XHQoICFlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoIHx8ICFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICkgP1xuXHRcdFx0XHRcdFx0c3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7XG5cdFx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdFx0Z2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7XG5cdFx0XHR2YXIgbWF0Y2hlcyxcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cblx0XHRcdFx0Ly8gT25seSByZWFkIHN0eWxlcy5wb3NpdGlvbiBpZiB0aGUgdGVzdCBoYXMgYSBjaGFuY2UgdG8gZmFpbFxuXHRcdFx0XHQvLyB0byBhdm9pZCBmb3JjaW5nIGEgcmVmbG93LlxuXHRcdFx0XHRzY3JvbGxib3hTaXplQnVnZ3kgPSAhc3VwcG9ydC5zY3JvbGxib3hTaXplKCkgJiZcblx0XHRcdFx0XHRzdHlsZXMucG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIixcblxuXHRcdFx0XHQvLyBUbyBhdm9pZCBmb3JjaW5nIGEgcmVmbG93LCBvbmx5IGZldGNoIGJveFNpemluZyBpZiB3ZSBuZWVkIGl0IChnaC0zOTkxKVxuXHRcdFx0XHRib3hTaXppbmdOZWVkZWQgPSBzY3JvbGxib3hTaXplQnVnZ3kgfHwgZXh0cmEsXG5cdFx0XHRcdGlzQm9yZGVyQm94ID0gYm94U2l6aW5nTmVlZGVkICYmXG5cdFx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHRcdFx0c3VidHJhY3QgPSBleHRyYSA/XG5cdFx0XHRcdFx0Ym94TW9kZWxBZGp1c3RtZW50KFxuXHRcdFx0XHRcdFx0ZWxlbSxcblx0XHRcdFx0XHRcdGRpbWVuc2lvbixcblx0XHRcdFx0XHRcdGV4dHJhLFxuXHRcdFx0XHRcdFx0aXNCb3JkZXJCb3gsXG5cdFx0XHRcdFx0XHRzdHlsZXNcblx0XHRcdFx0XHQpIDpcblx0XHRcdFx0XHQwO1xuXG5cdFx0XHQvLyBBY2NvdW50IGZvciB1bnJlbGlhYmxlIGJvcmRlci1ib3ggZGltZW5zaW9ucyBieSBjb21wYXJpbmcgb2Zmc2V0KiB0byBjb21wdXRlZCBhbmRcblx0XHRcdC8vIGZha2luZyBhIGNvbnRlbnQtYm94IHRvIGdldCBib3JkZXIgYW5kIHBhZGRpbmcgKGdoLTM2OTkpXG5cdFx0XHRpZiAoIGlzQm9yZGVyQm94ICYmIHNjcm9sbGJveFNpemVCdWdneSApIHtcblx0XHRcdFx0c3VidHJhY3QgLT0gTWF0aC5jZWlsKFxuXHRcdFx0XHRcdGVsZW1bIFwib2Zmc2V0XCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtXG5cdFx0XHRcdFx0cGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC1cblx0XHRcdFx0XHRib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgXCJib3JkZXJcIiwgZmFsc2UsIHN0eWxlcyApIC1cblx0XHRcdFx0XHQwLjVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCB0byBwaXhlbHMgaWYgdmFsdWUgYWRqdXN0bWVudCBpcyBuZWVkZWRcblx0XHRcdGlmICggc3VidHJhY3QgJiYgKCBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiZcblx0XHRcdFx0KCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgIT09IFwicHhcIiApIHtcblxuXHRcdFx0XHRlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSA9IHZhbHVlO1xuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5jc3MoIGVsZW0sIGRpbWVuc2lvbiApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApO1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LFxuXHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdHJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgXCJtYXJnaW5MZWZ0XCIgKSApIHx8XG5cdFx0XHRcdGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtXG5cdFx0XHRcdFx0c3dhcCggZWxlbSwgeyBtYXJnaW5MZWZ0OiAwIH0sIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KSArIFwicHhcIjtcblx0XHR9XG5cdH1cbik7XG5cbi8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXNcbmpRdWVyeS5lYWNoKCB7XG5cdG1hcmdpbjogXCJcIixcblx0cGFkZGluZzogXCJcIixcblx0Ym9yZGVyOiBcIldpZHRoXCJcbn0sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1ZmZpeCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHtcblx0XHRleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBpID0gMCxcblx0XHRcdFx0ZXhwYW5kZWQgPSB7fSxcblxuXHRcdFx0XHQvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmdcblx0XHRcdFx0cGFydHMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS5zcGxpdCggXCIgXCIgKSA6IFsgdmFsdWUgXTtcblxuXHRcdFx0Zm9yICggOyBpIDwgNDsgaSsrICkge1xuXHRcdFx0XHRleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9XG5cdFx0XHRcdFx0cGFydHNbIGkgXSB8fCBwYXJ0c1sgaSAtIDIgXSB8fCBwYXJ0c1sgMCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXhwYW5kZWQ7XG5cdFx0fVxuXHR9O1xuXG5cdGlmICggcHJlZml4ICE9PSBcIm1hcmdpblwiICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgc3R5bGVzLCBsZW4sXG5cdFx0XHRcdG1hcCA9IHt9LFxuXHRcdFx0XHRpID0gMDtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0XHRsZW4gPSBuYW1lLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWFwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XG5cdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHR9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fVxufSApO1xuXG5cbmZ1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHtcblx0cmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKTtcbn1cbmpRdWVyeS5Ud2VlbiA9IFR3ZWVuO1xuXG5Ud2Vlbi5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBUd2Vlbixcblx0aW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkge1xuXHRcdHRoaXMuZWxlbSA9IGVsZW07XG5cdFx0dGhpcy5wcm9wID0gcHJvcDtcblx0XHR0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0O1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApO1xuXHR9LFxuXHRjdXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cblx0XHRcdGhvb2tzLmdldCggdGhpcyApIDpcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTtcblx0fSxcblx0cnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHtcblx0XHR2YXIgZWFzZWQsXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxuXHRcdFx0XHRwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50O1xuXHRcdH1cblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xuXHRcdFx0aG9va3Muc2V0KCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcblxuVHdlZW4ucHJvcEhvb2tzID0ge1xuXHRfZGVmYXVsdDoge1xuXHRcdGdldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0dmFyIHJlc3VsdDtcblxuXHRcdFx0Ly8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCxcblx0XHRcdC8vIG9yIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc3R5bGUgcHJvcGVydHkgdGhhdCBleGlzdHMuXG5cdFx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgIT09IDEgfHxcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07XG5cdFx0XHR9XG5cblx0XHRcdC8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseVxuXHRcdFx0Ly8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlscy5cblx0XHRcdC8vIFNpbXBsZSB2YWx1ZXMgc3VjaCBhcyBcIjEwcHhcIiBhcmUgcGFyc2VkIHRvIEZsb2F0O1xuXHRcdFx0Ly8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyBcInJvdGF0ZSgxcmFkKVwiIGFyZSByZXR1cm5lZCBhcy1pcy5cblx0XHRcdHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIFwiXCIgKTtcblxuXHRcdFx0Ly8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCBcImF1dG9cIiBhcmUgY29udmVydGVkIHRvIDAuXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXG5cdFx0XHQvLyBVc2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdC5cblx0XHRcdC8vIFVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZS5cblx0XHRcdC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlID09PSAxICYmIChcblx0XHRcdFx0XHRqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSB8fFxuXHRcdFx0XHRcdHR3ZWVuLmVsZW0uc3R5bGVbIGZpbmFsUHJvcE5hbWUoIHR3ZWVuLnByb3AgKSBdICE9IG51bGwgKSApIHtcblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJvcEhvb2tzLnNjcm9sbExlZnQgPSB7XG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZWFzaW5nID0ge1xuXHRsaW5lYXI6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiBwO1xuXHR9LFxuXHRzd2luZzogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjtcblx0fSxcblx0X2RlZmF1bHQ6IFwic3dpbmdcIlxufTtcblxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XG5cbi8vIEJhY2sgY29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XG5qUXVlcnkuZnguc3RlcCA9IHt9O1xuXG5cblxuXG52YXJcblx0ZnhOb3csIGluUHJvZ3Jlc3MsXG5cdHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFxuXHRycnVuID0gL3F1ZXVlSG9va3MkLztcblxuZnVuY3Rpb24gc2NoZWR1bGUoKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHtcblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHNjaGVkdWxlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBzY2hlZHVsZSwgalF1ZXJ5LmZ4LmludGVydmFsICk7XG5cdFx0fVxuXG5cdFx0alF1ZXJ5LmZ4LnRpY2soKTtcblx0fVxufVxuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9ICk7XG5cdHJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApO1xufVxuXG4vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvblxuZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHtcblx0dmFyIHdoaWNoLFxuXHRcdGkgPSAwLFxuXHRcdGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTtcblxuXHQvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsXG5cdC8vIG90aGVyd2lzZSBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0XG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwO1xuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIEFuaW1hdGlvbi50d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICggdHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSApICkge1xuXG5cdFx0XHQvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eVxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHtcblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LFxuXHRcdGlzQm94ID0gXCJ3aWR0aFwiIGluIHByb3BzIHx8IFwiaGVpZ2h0XCIgaW4gcHJvcHMsXG5cdFx0YW5pbSA9IHRoaXMsXG5cdFx0b3JpZyA9IHt9LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZSxcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cblx0Ly8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XG5cdFx0XHRcdGlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgXCJmeFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLnRlc3QoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIFByZXRlbmQgdG8gYmUgaGlkZGVuIGlmIHRoaXMgaXMgYSBcInNob3dcIiBhbmRcblx0XHRcdFx0Ly8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGVcblx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gXCJzaG93XCIgJiYgZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGhpZGRlbiA9IHRydWU7XG5cblx0XHRcdFx0Ly8gSWdub3JlIGFsbCBvdGhlciBuby1vcCBzaG93L2hpZGUgZGF0YVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpXG5cdHByb3BUd2VlbiA9ICFqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcHMgKTtcblx0aWYgKCAhcHJvcFR3ZWVuICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVzdHJpY3QgXCJvdmVyZmxvd1wiIGFuZCBcImRpc3BsYXlcIiBzdHlsZXMgZHVyaW5nIGJveCBhbmltYXRpb25zXG5cdGlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExLCBFZGdlIDEyIC0gMTVcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90IGluZmVyIHRoZSBzaG9ydGhhbmRcblx0XHQvLyBmcm9tIGlkZW50aWNhbGx5LXZhbHVlZCBvdmVyZmxvd1ggYW5kIG92ZXJmbG93WSBhbmQgRWRnZSBqdXN0IG1pcnJvcnNcblx0XHQvLyB0aGUgb3ZlcmZsb3dYIHZhbHVlIHRoZXJlLlxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gSWRlbnRpZnkgYSBkaXNwbGF5IHR5cGUsIHByZWZlcnJpbmcgb2xkIHNob3cvaGlkZSBkYXRhIG92ZXIgdGhlIENTUyBjYXNjYWRlXG5cdFx0cmVzdG9yZURpc3BsYXkgPSBkYXRhU2hvdyAmJiBkYXRhU2hvdy5kaXNwbGF5O1xuXHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdH1cblx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSApIHtcblx0XHRcdFx0ZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBHZXQgbm9uZW1wdHkgdmFsdWUocykgYnkgdGVtcG9yYXJpbHkgZm9yY2luZyB2aXNpYmlsaXR5XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApO1xuXHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheSB8fCByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFuaW1hdGUgaW5saW5lIGVsZW1lbnRzIGFzIGlubGluZS1ibG9ja1xuXHRcdGlmICggZGlzcGxheSA9PT0gXCJpbmxpbmVcIiB8fCBkaXNwbGF5ID09PSBcImlubGluZS1ibG9ja1wiICYmIHJlc3RvcmVEaXNwbGF5ICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZmxvYXRcIiApID09PSBcIm5vbmVcIiApIHtcblxuXHRcdFx0XHQvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBkaXNwbGF5IHZhbHVlIGF0IHRoZSBlbmQgb2YgcHVyZSBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRcdFx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheSA9IHN0eWxlLmRpc3BsYXk7XG5cdFx0XHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID8gXCJcIiA6IGRpc3BsYXk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggb3B0cy5vdmVyZmxvdyApIHtcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gSW1wbGVtZW50IHNob3cvaGlkZSBhbmltYXRpb25zXG5cdHByb3BUd2VlbiA9IGZhbHNlO1xuXHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cblx0XHQvLyBHZW5lcmFsIHNob3cvaGlkZSBzZXR1cCBmb3IgdGhpcyBlbGVtZW50IGFuaW1hdGlvblxuXHRcdGlmICggIXByb3BUd2VlbiApIHtcblx0XHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGFTaG93ID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7IGRpc3BsYXk6IHJlc3RvcmVEaXNwbGF5IH0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RvcmUgaGlkZGVuL3Zpc2libGUgZm9yIHRvZ2dsZSBzbyBgLnN0b3AoKS50b2dnbGUoKWAgXCJyZXZlcnNlc1wiXG5cdFx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW1cblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdFx0Ly8gVGhlIGZpbmFsIHN0ZXAgb2YgYSBcImhpZGVcIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50XG5cdFx0XHRcdGlmICggIWhpZGRlbiApIHtcblx0XHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiZnhzaG93XCIgKTtcblx0XHRcdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvLyBQZXItcHJvcGVydHkgc2V0dXBcblx0XHRwcm9wVHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblx0XHRpZiAoICEoIHByb3AgaW4gZGF0YVNob3cgKSApIHtcblx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7XG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0cHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdFx0cHJvcFR3ZWVuLnN0YXJ0ID0gMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7XG5cdFx0ZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdO1xuXHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF07XG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0ZWFzaW5nID0gdmFsdWVbIDEgXTtcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XG5cdFx0XHRwcm9wc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRkZWxldGUgcHJvcHNbIGluZGV4IF07XG5cdFx0fVxuXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTtcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgbmFtZSBdO1xuXG5cdFx0XHQvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuXG5cdFx0XHQvLyBSZXVzaW5nICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFwibmFtZVwiXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkge1xuXHRcdFx0XHRcdHByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07XG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzcGVjaWFsRWFzaW5nWyBuYW1lIF0gPSBlYXNpbmc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcblx0dmFyIHJlc3VsdCxcblx0XHRzdG9wcGVkLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBBbmltYXRpb24ucHJlZmlsdGVycy5sZW5ndGgsXG5cdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBEb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3Jcblx0XHRcdGRlbGV0ZSB0aWNrLmVsZW07XG5cdFx0fSApLFxuXHRcdHRpY2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGN1cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdFx0cmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLFxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHlcblx0XHRcdFx0Ly8gQXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIGAxIC0gKCAwLjUgfHwgMCApYCAoIzEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdICk7XG5cblx0XHRcdC8vIElmIHRoZXJlJ3MgbW9yZSB0byBkbywgeWllbGRcblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIHdhcyBhbiBlbXB0eSBhbmltYXRpb24sIHN5bnRoZXNpemUgYSBmaW5hbCBwcm9ncmVzcyBub3RpZmljYXRpb25cblx0XHRcdGlmICggIWxlbmd0aCApIHtcblx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNvbHZlIHRoZSBhbmltYXRpb24gYW5kIHJlcG9ydCBpdHMgY29uY2x1c2lvblxuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSxcblx0XHRcdG9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHtcblx0XHRcdFx0c3BlY2lhbEVhc2luZzoge30sXG5cdFx0XHRcdGVhc2luZzogalF1ZXJ5LmVhc2luZy5fZGVmYXVsdFxuXHRcdFx0fSwgb3B0aW9ucyApLFxuXHRcdFx0b3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuXHRcdFx0b3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLFxuXHRcdFx0c3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0ZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sXG5cdFx0XHR0d2VlbnM6IFtdLFxuXHRcdFx0Y3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQgKSB7XG5cdFx0XHRcdHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCxcblx0XHRcdFx0XHRcdGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmdbIHByb3AgXSB8fCBhbmltYXRpb24ub3B0cy5lYXNpbmcgKTtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApO1xuXHRcdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0XHR9LFxuXHRcdFx0c3RvcDogZnVuY3Rpb24oIGdvdG9FbmQgKSB7XG5cdFx0XHRcdHZhciBpbmRleCA9IDAsXG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnNcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnRcblx0XHRcdFx0XHRsZW5ndGggPSBnb3RvRW5kID8gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwO1xuXHRcdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RvcHBlZCA9IHRydWU7XG5cdFx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0XG5cdFx0XHRcdGlmICggZ290b0VuZCApIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0fSApLFxuXHRcdHByb3BzID0gYW5pbWF0aW9uLnByb3BzO1xuXG5cdHByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApO1xuXHRcdGlmICggcmVzdWx0ICkge1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCByZXN1bHQuc3RvcCApICkge1xuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPVxuXHRcdFx0XHRcdHJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cdH1cblxuXHRqUXVlcnkubWFwKCBwcm9wcywgY3JlYXRlVHdlZW4sIGFuaW1hdGlvbiApO1xuXG5cdGlmICggaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHtcblx0XHRhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTtcblx0fVxuXG5cdC8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zXG5cdGFuaW1hdGlvblxuXHRcdC5wcm9ncmVzcyggYW5pbWF0aW9uLm9wdHMucHJvZ3Jlc3MgKVxuXHRcdC5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApXG5cdFx0LmZhaWwoIGFuaW1hdGlvbi5vcHRzLmZhaWwgKVxuXHRcdC5hbHdheXMoIGFuaW1hdGlvbi5vcHRzLmFsd2F5cyApO1xuXG5cdGpRdWVyeS5meC50aW1lcihcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0YW5pbTogYW5pbWF0aW9uLFxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlXG5cdFx0fSApXG5cdCk7XG5cblx0cmV0dXJuIGFuaW1hdGlvbjtcbn1cblxualF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRlbmQoIEFuaW1hdGlvbiwge1xuXG5cdHR3ZWVuZXJzOiB7XG5cdFx0XCIqXCI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkge1xuXHRcdFx0dmFyIHR3ZWVuID0gdGhpcy5jcmVhdGVUd2VlbiggcHJvcCwgdmFsdWUgKTtcblx0XHRcdGFkanVzdENTUyggdHdlZW4uZWxlbSwgcHJvcCwgcmNzc051bS5leGVjKCB2YWx1ZSApLCB0d2VlbiApO1xuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH0gXVxuXHR9LFxuXG5cdHR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7XG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBwcm9wcyApICkge1xuXHRcdFx0Y2FsbGJhY2sgPSBwcm9wcztcblx0XHRcdHByb3BzID0gWyBcIipcIiBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wcyA9IHByb3BzLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cdFx0fVxuXG5cdFx0dmFyIHByb3AsXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0cHJvcCA9IHByb3BzWyBpbmRleCBdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gPSBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9LFxuXG5cdHByZWZpbHRlcnM6IFsgZGVmYXVsdFByZWZpbHRlciBdLFxuXG5cdHByZWZpbHRlcjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkge1xuXHRcdGlmICggcHJlcGVuZCApIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHtcblx0dmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gXCJvYmplY3RcIiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDoge1xuXHRcdGNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8XG5cdFx0XHRpc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLFxuXHRcdGR1cmF0aW9uOiBzcGVlZCxcblx0XHRlYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZ1xuXHR9O1xuXG5cdC8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZlxuXHRpZiAoIGpRdWVyeS5meC5vZmYgKSB7XG5cdFx0b3B0LmR1cmF0aW9uID0gMDtcblxuXHR9IGVsc2Uge1xuXHRcdGlmICggdHlwZW9mIG9wdC5kdXJhdGlvbiAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdGlmICggb3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgKSB7XG5cdFx0XHRcdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIE5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+IFwiZnhcIlxuXHRpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHtcblx0XHRvcHQucXVldWUgPSBcImZ4XCI7XG5cdH1cblxuXHQvLyBRdWV1ZWluZ1xuXHRvcHQub2xkID0gb3B0LmNvbXBsZXRlO1xuXG5cdG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkge1xuXHRcdFx0b3B0Lm9sZC5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHQucXVldWUgKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBvcHQ7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHtcblxuXHRcdC8vIFNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMFxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW5XaXRoaW5UcmVlICkuY3NzKCBcIm9wYWNpdHlcIiwgMCApLnNob3coKVxuXG5cdFx0XHQvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWRcblx0XHRcdC5lbmQoKS5hbmltYXRlKCB7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH0sXG5cdGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHR2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLFxuXHRcdFx0b3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLFxuXHRcdFx0ZG9BbmltYXRpb24gPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9wZXJ0eSBlYXNpbmcgd29uJ3QgYmUgbG9zdFxuXHRcdFx0XHR2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7XG5cblx0XHRcdFx0Ly8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5XG5cdFx0XHRcdGlmICggZW1wdHkgfHwgZGF0YVByaXYuZ2V0KCB0aGlzLCBcImZpbmlzaFwiICkgKSB7XG5cdFx0XHRcdFx0YW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRkb0FuaW1hdGlvbi5maW5pc2ggPSBkb0FuaW1hdGlvbjtcblxuXHRcdHJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID9cblx0XHRcdHRoaXMuZWFjaCggZG9BbmltYXRpb24gKSA6XG5cdFx0XHR0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7XG5cdH0sXG5cdHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkge1xuXHRcdHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7XG5cdFx0XHR2YXIgc3RvcCA9IGhvb2tzLnN0b3A7XG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdHN0b3AoIGdvdG9FbmQgKTtcblx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGdvdG9FbmQgPSBjbGVhclF1ZXVlO1xuXHRcdFx0Y2xlYXJRdWV1ZSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGNsZWFyUXVldWUgKSB7XG5cdFx0XHR0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBkZXF1ZXVlID0gdHJ1ZSxcblx0XHRcdFx0aW5kZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArIFwicXVldWVIb29rc1wiLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICk7XG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7XG5cdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoIGluZGV4IGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7XG5cdFx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJlxuXHRcdFx0XHRcdCggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkge1xuXG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApO1xuXHRcdFx0XHRcdGRlcXVldWUgPSBmYWxzZTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuXG5cdFx0XHQvLyBUaW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoXG5cdFx0XHQvLyB3aWxsIGRlcXVldWUgYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQuXG5cdFx0XHRpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXHRmaW5pc2g6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdGlmICggdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGluZGV4LFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICksXG5cdFx0XHRcdHF1ZXVlID0gZGF0YVsgdHlwZSArIFwicXVldWVcIiBdLFxuXHRcdFx0XHRob29rcyA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlSG9va3NcIiBdLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7XG5cblx0XHRcdC8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGFcblx0XHRcdGRhdGEuZmluaXNoID0gdHJ1ZTtcblxuXHRcdFx0Ly8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0XG5cdFx0XHRqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIFtdICk7XG5cblx0XHRcdGlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHtcblx0XHRcdFx0aG9va3Muc3RvcC5jYWxsKCB0aGlzLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhY3RpdmUgYW5pbWF0aW9ucywgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmIHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApIHtcblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYW5pbWF0aW9ucyBpbiB0aGUgb2xkIHF1ZXVlIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0aWYgKCBxdWV1ZVsgaW5kZXggXSAmJiBxdWV1ZVsgaW5kZXggXS5maW5pc2ggKSB7XG5cdFx0XHRcdFx0cXVldWVbIGluZGV4IF0uZmluaXNoLmNhbGwoIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZ1xuXHRcdFx0ZGVsZXRlIGRhdGEuZmluaXNoO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcInRvZ2dsZVwiLCBcInNob3dcIiwgXCJoaWRlXCIgXSwgZnVuY3Rpb24oIF9pLCBuYW1lICkge1xuXHR2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHNwZWVkID09IG51bGwgfHwgdHlwZW9mIHNwZWVkID09PSBcImJvb2xlYW5cIiA/XG5cdFx0XHRjc3NGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICkgOlxuXHRcdFx0dGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9O1xufSApO1xuXG4vLyBHZW5lcmF0ZSBzaG9ydGN1dHMgZm9yIGN1c3RvbSBhbmltYXRpb25zXG5qUXVlcnkuZWFjaCgge1xuXHRzbGlkZURvd246IGdlbkZ4KCBcInNob3dcIiApLFxuXHRzbGlkZVVwOiBnZW5GeCggXCJoaWRlXCIgKSxcblx0c2xpZGVUb2dnbGU6IGdlbkZ4KCBcInRvZ2dsZVwiICksXG5cdGZhZGVJbjogeyBvcGFjaXR5OiBcInNob3dcIiB9LFxuXHRmYWRlT3V0OiB7IG9wYWNpdHk6IFwiaGlkZVwiIH0sXG5cdGZhZGVUb2dnbGU6IHsgb3BhY2l0eTogXCJ0b2dnbGVcIiB9XG59LCBmdW5jdGlvbiggbmFtZSwgcHJvcHMgKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9O1xufSApO1xuXG5qUXVlcnkudGltZXJzID0gW107XG5qUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgdGltZXIsXG5cdFx0aSA9IDAsXG5cdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycztcblxuXHRmeE5vdyA9IERhdGUubm93KCk7XG5cblx0Zm9yICggOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkge1xuXHRcdHRpbWVyID0gdGltZXJzWyBpIF07XG5cblx0XHQvLyBSdW4gdGhlIHRpbWVyIGFuZCBzYWZlbHkgcmVtb3ZlIGl0IHdoZW4gZG9uZSAoYWxsb3dpbmcgZm9yIGV4dGVybmFsIHJlbW92YWwpXG5cdFx0aWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7XG5cdFx0XHR0aW1lcnMuc3BsaWNlKCBpLS0sIDEgKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoICF0aW1lcnMubGVuZ3RoICkge1xuXHRcdGpRdWVyeS5meC5zdG9wKCk7XG5cdH1cblx0ZnhOb3cgPSB1bmRlZmluZWQ7XG59O1xuXG5qUXVlcnkuZngudGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7XG5cdGpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTtcblx0alF1ZXJ5LmZ4LnN0YXJ0KCk7XG59O1xuXG5qUXVlcnkuZnguaW50ZXJ2YWwgPSAxMztcbmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkge1xuXHRpZiAoIGluUHJvZ3Jlc3MgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aW5Qcm9ncmVzcyA9IHRydWU7XG5cdHNjaGVkdWxlKCk7XG59O1xuXG5qUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRpblByb2dyZXNzID0gbnVsbDtcbn07XG5cbmpRdWVyeS5meC5zcGVlZHMgPSB7XG5cdHNsb3c6IDYwMCxcblx0ZmFzdDogMjAwLFxuXG5cdC8vIERlZmF1bHQgc3BlZWRcblx0X2RlZmF1bHQ6IDQwMFxufTtcblxuXG4vLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uXG4vLyBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxMDAzMjQwMTQ3NDcvaHR0cDovL2JsaW5kc2lnbmFscy5jb20vaW5kZXgucGhwLzIwMDkvMDcvanF1ZXJ5LWRlbGF5L1xualF1ZXJ5LmZuLmRlbGF5ID0gZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7XG5cdHRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzWyB0aW1lIF0gfHwgdGltZSA6IHRpbWU7XG5cdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkge1xuXHRcdHZhciB0aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoIG5leHQsIHRpbWUgKTtcblx0XHRob29rcy5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cdFx0fTtcblx0fSApO1xufTtcblxuXG4oIGZ1bmN0aW9uKCkge1xuXHR2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKSxcblx0XHRzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcInNlbGVjdFwiICksXG5cdFx0b3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcIm9wdGlvblwiICkgKTtcblxuXHRpbnB1dC50eXBlID0gXCJjaGVja2JveFwiO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjMgb25seVxuXHQvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSBcIm9uXCJcblx0c3VwcG9ydC5jaGVja09uID0gaW5wdXQudmFsdWUgIT09IFwiXCI7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIE11c3QgYWNjZXNzIHNlbGVjdGVkSW5kZXggdG8gbWFrZSBkZWZhdWx0IG9wdGlvbnMgc2VsZWN0XG5cdHN1cHBvcnQub3B0U2VsZWN0ZWQgPSBvcHQuc2VsZWN0ZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIEFuIGlucHV0IGxvc2VzIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvXG5cdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cdGlucHV0LnZhbHVlID0gXCJ0XCI7XG5cdGlucHV0LnR5cGUgPSBcInJhZGlvXCI7XG5cdHN1cHBvcnQucmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09PSBcInRcIjtcbn0gKSgpO1xuXG5cbnZhciBib29sSG9vayxcblx0YXR0ckhhbmRsZSA9IGpRdWVyeS5leHByLmF0dHJIYW5kbGU7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5hdHRyLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0YXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRmFsbGJhY2sgdG8gcHJvcCB3aGVuIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWRcblx0XHRpZiAoIHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSA9PT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRcdHJldHVybiBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSwgdmFsdWUgKTtcblx0XHR9XG5cblx0XHQvLyBBdHRyaWJ1dGUgaG9va3MgYXJlIGRldGVybWluZWQgYnkgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uXG5cdFx0Ly8gR3JhYiBuZWNlc3NhcnkgaG9vayBpZiBvbmUgaXMgZGVmaW5lZFxuXHRcdGlmICggblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXHRcdFx0aG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHQoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiB1bmRlZmluZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHZhbHVlID09PSBudWxsICkge1xuXHRcdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSArIFwiXCIgKTtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKCByZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSApICE9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cblx0XHRyZXQgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHQvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZFxuXHRcdHJldHVybiByZXQgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDtcblx0fSxcblxuXHRhdHRySG9va3M6IHtcblx0XHR0eXBlOiB7XG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhc3VwcG9ydC5yYWRpb1ZhbHVlICYmIHZhbHVlID09PSBcInJhZGlvXCIgJiZcblx0XHRcdFx0XHRub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dmFyIHZhbCA9IGVsZW0udmFsdWU7XG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCB2YWx1ZSApO1xuXHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0ZWxlbS52YWx1ZSA9IHZhbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHR2YXIgbmFtZSxcblx0XHRcdGkgPSAwLFxuXG5cdFx0XHQvLyBBdHRyaWJ1dGUgbmFtZXMgY2FuIGNvbnRhaW4gbm9uLUhUTUwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzXG5cdFx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNhdHRyaWJ1dGVzLTJcblx0XHRcdGF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cblx0XHRpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0d2hpbGUgKCAoIG5hbWUgPSBhdHRyTmFtZXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhvb2tzIGZvciBib29sZWFuIGF0dHJpYnV0ZXNcbmJvb2xIb29rID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHtcblx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZVxuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cbn07XG5cbmpRdWVyeS5lYWNoKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCggL1xcdysvZyApLCBmdW5jdGlvbiggX2ksIG5hbWUgKSB7XG5cdHZhciBnZXR0ZXIgPSBhdHRySGFuZGxlWyBuYW1lIF0gfHwgalF1ZXJ5LmZpbmQuYXR0cjtcblxuXHRhdHRySGFuZGxlWyBuYW1lIF0gPSBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0dmFyIHJldCwgaGFuZGxlLFxuXHRcdFx0bG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdGlmICggIWlzWE1MICkge1xuXG5cdFx0XHQvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyXG5cdFx0XHRoYW5kbGUgPSBhdHRySGFuZGxlWyBsb3dlcmNhc2VOYW1lIF07XG5cdFx0XHRhdHRySGFuZGxlWyBsb3dlcmNhc2VOYW1lIF0gPSByZXQ7XG5cdFx0XHRyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/XG5cdFx0XHRcdGxvd2VyY2FzZU5hbWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdFx0YXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gaGFuZGxlO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xufSApO1xuXG5cblxuXG52YXIgcmZvY3VzYWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGRlbGV0ZSB0aGlzWyBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWUgXTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IHByb3BlcnRpZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rc1xuXHRcdFx0bmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcblx0XHRcdGhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVsZW1bIG5hbWUgXTtcblx0fSxcblxuXHRwcm9wSG9va3M6IHtcblx0XHR0YWJJbmRleDoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdFx0XHRcdC8vIGVsZW0udGFiSW5kZXggZG9lc24ndCBhbHdheXMgcmV0dXJuIHRoZVxuXHRcdFx0XHQvLyBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXRcblx0XHRcdFx0Ly8gaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTQxMTE2MjMzMzQ3L2h0dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cvMjAwOC8wMS8wOS9nZXR0aW5nLXNldHRpbmctYW5kLXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13aXRoLWphdmFzY3JpcHQvXG5cdFx0XHRcdC8vIFVzZSBwcm9wZXIgYXR0cmlidXRlIHJldHJpZXZhbCgjMTIwNzIpXG5cdFx0XHRcdHZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIFwidGFiaW5kZXhcIiApO1xuXG5cdFx0XHRcdGlmICggdGFiaW5kZXggKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBhcnNlSW50KCB0YWJpbmRleCwgMTAgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRyZm9jdXNhYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSB8fFxuXHRcdFx0XHRcdHJjbGlja2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApICYmXG5cdFx0XHRcdFx0ZWxlbS5ocmVmXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRwcm9wRml4OiB7XG5cdFx0XCJmb3JcIjogXCJodG1sRm9yXCIsXG5cdFx0XCJjbGFzc1wiOiBcImNsYXNzTmFtZVwiXG5cdH1cbn0gKTtcblxuLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG4vLyBBY2Nlc3NpbmcgdGhlIHNlbGVjdGVkSW5kZXggcHJvcGVydHlcbi8vIGZvcmNlcyB0aGUgYnJvd3NlciB0byByZXNwZWN0IHNldHRpbmcgc2VsZWN0ZWRcbi8vIG9uIHRoZSBvcHRpb25cbi8vIFRoZSBnZXR0ZXIgZW5zdXJlcyBhIGRlZmF1bHQgb3B0aW9uIGlzIHNlbGVjdGVkXG4vLyB3aGVuIGluIGFuIG9wdGdyb3VwXG4vLyBlc2xpbnQgcnVsZSBcIm5vLXVudXNlZC1leHByZXNzaW9uc1wiIGlzIGRpc2FibGVkIGZvciB0aGlzIGNvZGVcbi8vIHNpbmNlIGl0IGNvbnNpZGVycyBzdWNoIGFjY2Vzc2lvbnMgbm9vcFxuaWYgKCAhc3VwcG9ydC5vcHRTZWxlY3RlZCApIHtcblx0alF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiBcIm9mZlwiICovXG5cblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRpZiAoIHBhcmVudCAmJiBwYXJlbnQucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0cGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0LyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogXCJvZmZcIiAqL1xuXG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdHBhcmVudC5zZWxlY3RlZEluZGV4O1xuXG5cdFx0XHRcdGlmICggcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxualF1ZXJ5LmVhY2goIFtcblx0XCJ0YWJJbmRleFwiLFxuXHRcInJlYWRPbmx5XCIsXG5cdFwibWF4TGVuZ3RoXCIsXG5cdFwiY2VsbFNwYWNpbmdcIixcblx0XCJjZWxsUGFkZGluZ1wiLFxuXHRcInJvd1NwYW5cIixcblx0XCJjb2xTcGFuXCIsXG5cdFwidXNlTWFwXCIsXG5cdFwiZnJhbWVCb3JkZXJcIixcblx0XCJjb250ZW50RWRpdGFibGVcIlxuXSwgZnVuY3Rpb24oKSB7XG5cdGpRdWVyeS5wcm9wRml4WyB0aGlzLnRvTG93ZXJDYXNlKCkgXSA9IHRoaXM7XG59ICk7XG5cblxuXG5cblx0Ly8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UgYWNjb3JkaW5nIHRvIEhUTUwgc3BlY1xuXHQvLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtYW5kLWNvbGxhcHNlLWFzY2lpLXdoaXRlc3BhY2Vcblx0ZnVuY3Rpb24gc3RyaXBBbmRDb2xsYXBzZSggdmFsdWUgKSB7XG5cdFx0dmFyIHRva2VucyA9IHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cdFx0cmV0dXJuIHRva2Vucy5qb2luKCBcIiBcIiApO1xuXHR9XG5cblxuZnVuY3Rpb24gZ2V0Q2xhc3MoIGVsZW0gKSB7XG5cdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSAmJiBlbGVtLmdldEF0dHJpYnV0ZSggXCJjbGFzc1wiICkgfHwgXCJcIjtcbn1cblxuZnVuY3Rpb24gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICkge1xuXHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXHR9XG5cdHJldHVybiBbXTtcbn1cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRhZGRDbGFzczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGN1clZhbHVlLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGogKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRjbGFzc2VzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIGNsYXNzZXMubGVuZ3RoICkge1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cdFx0XHRcdGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBcIiBcIiArIHN0cmlwQW5kQ29sbGFwc2UoIGN1clZhbHVlICkgKyBcIiBcIiApO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGN1ci5pbmRleE9mKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIgKSA8IDAgKSB7XG5cdFx0XHRcdFx0XHRcdGN1ciArPSBjbGF6eiArIFwiIFwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuXG5cdFx0XHRcdFx0ZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB0aGlzLmF0dHIoIFwiY2xhc3NcIiwgXCJcIiApO1xuXHRcdH1cblxuXHRcdGNsYXNzZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTtcblxuXHRcdGlmICggY2xhc3Nlcy5sZW5ndGggKSB7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdGN1clZhbHVlID0gZ2V0Q2xhc3MoIGVsZW0gKTtcblxuXHRcdFx0XHQvLyBUaGlzIGV4cHJlc3Npb24gaXMgaGVyZSBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2VlIGFkZENsYXNzKVxuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBjdXJWYWx1ZSApICsgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzXG5cdFx0XHRcdFx0XHR3aGlsZSAoIGN1ci5pbmRleE9mKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgPSBjdXIucmVwbGFjZSggXCIgXCIgKyBjbGF6eiArIFwiIFwiLCBcIiBcIiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuXG5cdFx0XHRcdFx0ZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0dG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7XG5cdFx0dmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsXG5cdFx0XHRpc1ZhbGlkVmFsdWUgPSB0eXBlID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIHR5cGVvZiBzdGF0ZVZhbCA9PT0gXCJib29sZWFuXCIgJiYgaXNWYWxpZFZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlVmFsID8gdGhpcy5hZGRDbGFzcyggdmFsdWUgKSA6IHRoaXMucmVtb3ZlQ2xhc3MoIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnRvZ2dsZUNsYXNzKFxuXHRcdFx0XHRcdHZhbHVlLmNhbGwoIHRoaXMsIGksIGdldENsYXNzKCB0aGlzICksIHN0YXRlVmFsICksXG5cdFx0XHRcdFx0c3RhdGVWYWxcblx0XHRcdFx0KTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBjbGFzc05hbWUsIGksIHNlbGYsIGNsYXNzTmFtZXM7XG5cblx0XHRcdGlmICggaXNWYWxpZFZhbHVlICkge1xuXG5cdFx0XHRcdC8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzXG5cdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRzZWxmID0galF1ZXJ5KCB0aGlzICk7XG5cdFx0XHRcdGNsYXNzTmFtZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTtcblxuXHRcdFx0XHR3aGlsZSAoICggY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0gKSApIHtcblxuXHRcdFx0XHRcdC8vIENoZWNrIGVhY2ggY2xhc3NOYW1lIGdpdmVuLCBzcGFjZSBzZXBhcmF0ZWQgbGlzdFxuXHRcdFx0XHRcdGlmICggc2VsZi5oYXNDbGFzcyggY2xhc3NOYW1lICkgKSB7XG5cdFx0XHRcdFx0XHRzZWxmLnJlbW92ZUNsYXNzKCBjbGFzc05hbWUgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c2VsZi5hZGRDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdC8vIFRvZ2dsZSB3aG9sZSBjbGFzcyBuYW1lXG5cdFx0XHR9IGVsc2UgaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0XHRjbGFzc05hbWUgPSBnZXRDbGFzcyggdGhpcyApO1xuXHRcdFx0XHRpZiAoIGNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdC8vIFN0b3JlIGNsYXNzTmFtZSBpZiBzZXRcblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiLCBjbGFzc05hbWUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIElmIHRoZSBlbGVtZW50IGhhcyBhIGNsYXNzIG5hbWUgb3IgaWYgd2UncmUgcGFzc2VkIGBmYWxzZWAsXG5cdFx0XHRcdC8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBicmluZyBiYWNrIHdoYXRldmVyIHdhcyBwcmV2aW91c2x5IHNhdmVkIChpZiBhbnl0aGluZyksXG5cdFx0XHRcdC8vIGZhbGxpbmcgYmFjayB0byB0aGUgZW1wdHkgc3RyaW5nIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cblx0XHRcdFx0aWYgKCB0aGlzLnNldEF0dHJpYnV0ZSApIHtcblx0XHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLFxuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRcdFx0XHRcIlwiIDpcblx0XHRcdFx0XHRcdGRhdGFQcml2LmdldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIgKSB8fCBcIlwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRoYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBjbGFzc05hbWUsIGVsZW0sXG5cdFx0XHRpID0gMDtcblxuXHRcdGNsYXNzTmFtZSA9IFwiIFwiICsgc2VsZWN0b3IgKyBcIiBcIjtcblx0XHR3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7XG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0KCBcIiBcIiArIHN0cmlwQW5kQ29sbGFwc2UoIGdldENsYXNzKCBlbGVtICkgKSArIFwiIFwiICkuaW5kZXhPZiggY2xhc3NOYW1lICkgPiAtMSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn0gKTtcblxuXG5cblxudmFyIHJyZXR1cm4gPSAvXFxyL2c7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0dmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGhvb2tzLCByZXQsIHZhbHVlSXNGdW5jdGlvbixcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF07XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF0gfHxcblx0XHRcdFx0XHRqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHRcdGlmICggaG9va3MgJiZcblx0XHRcdFx0XHRcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdFx0KCByZXQgPSBob29rcy5nZXQoIGVsZW0sIFwidmFsdWVcIiApICkgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0ID0gZWxlbS52YWx1ZTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzXG5cdFx0XHRcdGlmICggdHlwZW9mIHJldCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0LnJlcGxhY2UoIHJyZXR1cm4sIFwiXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEhhbmRsZSBjYXNlcyB3aGVyZSB2YWx1ZSBpcyBudWxsL3VuZGVmIG9yIG51bWJlclxuXHRcdFx0XHRyZXR1cm4gcmV0ID09IG51bGwgPyBcIlwiIDogcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0dmFyIHZhbDtcblxuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggdmFsdWVJc0Z1bmN0aW9uICkge1xuXHRcdFx0XHR2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFsID0gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzIFwiXCI7IGNvbnZlcnQgbnVtYmVycyB0byBzdHJpbmdcblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHZhbCA9IFwiXCI7XG5cblx0XHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdHZhbCArPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCB2YWwgKSApIHtcblx0XHRcdFx0dmFsID0galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiO1xuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cblx0XHRcdGhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyB0aGlzLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3NbIHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHQvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZ1xuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCBcInZhbHVlXCIgKSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHR0aGlzLnZhbHVlID0gdmFsO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHZhbEhvb2tzOiB7XG5cdFx0b3B0aW9uOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHRcdHZhciB2YWwgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInZhbHVlXCIgKTtcblx0XHRcdFx0cmV0dXJuIHZhbCAhPSBudWxsID9cblx0XHRcdFx0XHR2YWwgOlxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMCAtIDExIG9ubHlcblx0XHRcdFx0XHQvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9ucyAoIzE0Njg2LCAjMTQ4NTgpXG5cdFx0XHRcdFx0Ly8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2Vcblx0XHRcdFx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2Utd2hpdGVzcGFjZVxuXHRcdFx0XHRcdHN0cmlwQW5kQ29sbGFwc2UoIGpRdWVyeS50ZXh0KCBlbGVtICkgKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHNlbGVjdDoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIHZhbHVlLCBvcHRpb24sIGksXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcblx0XHRcdFx0XHRpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCxcblx0XHRcdFx0XHRvbmUgPSBlbGVtLnR5cGUgPT09IFwic2VsZWN0LW9uZVwiLFxuXHRcdFx0XHRcdHZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSxcblx0XHRcdFx0XHRtYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDtcblxuXHRcdFx0XHRpZiAoIGluZGV4IDwgMCApIHtcblx0XHRcdFx0XHRpID0gbWF4O1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aSA9IG9uZSA/IGluZGV4IDogMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnNcblx0XHRcdFx0Zm9yICggOyBpIDwgbWF4OyBpKysgKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHQvLyBJRTgtOSBkb2Vzbid0IHVwZGF0ZSBzZWxlY3RlZCBhZnRlciBmb3JtIHJlc2V0ICgjMjU1MSlcblx0XHRcdFx0XHRpZiAoICggb3B0aW9uLnNlbGVjdGVkIHx8IGkgPT09IGluZGV4ICkgJiZcblxuXHRcdFx0XHRcdFx0XHQvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHRcdFx0XHRcdCFvcHRpb24uZGlzYWJsZWQgJiZcblx0XHRcdFx0XHRcdFx0KCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHxcblx0XHRcdFx0XHRcdFx0XHQhbm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCBcIm9wdGdyb3VwXCIgKSApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBHZXQgdGhlIHNwZWNpZmljIHZhbHVlIGZvciB0aGUgb3B0aW9uXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7XG5cblx0XHRcdFx0XHRcdC8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzXG5cdFx0XHRcdFx0XHRpZiAoIG9uZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheVxuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgb3B0aW9uU2V0LCBvcHRpb24sXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcblx0XHRcdFx0XHR2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLFxuXHRcdFx0XHRcdGkgPSBvcHRpb25zLmxlbmd0aDtcblxuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuXG5cdFx0XHRcdFx0aWYgKCBvcHRpb24uc2VsZWN0ZWQgPVxuXHRcdFx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIGpRdWVyeS52YWxIb29rcy5vcHRpb24uZ2V0KCBvcHRpb24gKSwgdmFsdWVzICkgPiAtMVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b3B0aW9uU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbmQtYXNzaWduICovXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGb3JjZSBicm93c2VycyB0byBiZWhhdmUgY29uc2lzdGVudGx5IHdoZW4gbm9uLW1hdGNoaW5nIHZhbHVlIGlzIHNldFxuXHRcdFx0XHRpZiAoICFvcHRpb25TZXQgKSB7XG5cdFx0XHRcdFx0ZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gUmFkaW9zIGFuZCBjaGVja2JveGVzIGdldHRlci9zZXR0ZXJcbmpRdWVyeS5lYWNoKCBbIFwicmFkaW9cIiwgXCJjaGVja2JveFwiIF0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHtcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeSggZWxlbSApLnZhbCgpLCB2YWx1ZSApID4gLTEgKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmICggIXN1cHBvcnQuY2hlY2tPbiApIHtcblx0XHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXS5nZXQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IG51bGwgPyBcIm9uXCIgOiBlbGVtLnZhbHVlO1xuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gUmV0dXJuIGpRdWVyeSBmb3IgYXR0cmlidXRlcy1vbmx5IGluY2x1c2lvblxuXG5cbnN1cHBvcnQuZm9jdXNpbiA9IFwib25mb2N1c2luXCIgaW4gd2luZG93O1xuXG5cbnZhciByZm9jdXNNb3JwaCA9IC9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxcblx0c3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiggZSApIHtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9O1xuXG5qUXVlcnkuZXh0ZW5kKCBqUXVlcnkuZXZlbnQsIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVycyApIHtcblxuXHRcdHZhciBpLCBjdXIsIHRtcCwgYnViYmxlVHlwZSwgb250eXBlLCBoYW5kbGUsIHNwZWNpYWwsIGxhc3RFbGVtZW50LFxuXHRcdFx0ZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sXG5cdFx0XHR0eXBlID0gaGFzT3duLmNhbGwoIGV2ZW50LCBcInR5cGVcIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LFxuXHRcdFx0bmFtZXNwYWNlcyA9IGhhc093bi5jYWxsKCBldmVudCwgXCJuYW1lc3BhY2VcIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCBcIi5cIiApIDogW107XG5cblx0XHRjdXIgPSBsYXN0RWxlbWVudCA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50O1xuXG5cdFx0Ly8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3dcblx0XHRpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlLmluZGV4T2YoIFwiLlwiICkgPiAtMSApIHtcblxuXHRcdFx0Ly8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKVxuXHRcdFx0bmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIFwiLlwiICk7XG5cdFx0XHR0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpO1xuXHRcdFx0bmFtZXNwYWNlcy5zb3J0KCk7XG5cdFx0fVxuXHRcdG9udHlwZSA9IHR5cGUuaW5kZXhPZiggXCI6XCIgKSA8IDAgJiYgXCJvblwiICsgdHlwZTtcblxuXHRcdC8vIENhbGxlciBjYW4gcGFzcyBpbiBhIGpRdWVyeS5FdmVudCBvYmplY3QsIE9iamVjdCwgb3IganVzdCBhbiBldmVudCB0eXBlIHN0cmluZ1xuXHRcdGV2ZW50ID0gZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gP1xuXHRcdFx0ZXZlbnQgOlxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSBcIm9iamVjdFwiICYmIGV2ZW50ICk7XG5cblx0XHQvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpXG5cdFx0ZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7XG5cdFx0ZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCBcIi5cIiApO1xuXHRcdGV2ZW50LnJuYW1lc3BhY2UgPSBldmVudC5uYW1lc3BhY2UgP1xuXHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICkgOlxuXHRcdFx0bnVsbDtcblxuXHRcdC8vIENsZWFuIHVwIHRoZSBldmVudCBpbiBjYXNlIGl0IGlzIGJlaW5nIHJldXNlZFxuXHRcdGV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDtcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBlbGVtO1xuXHRcdH1cblxuXHRcdC8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3Rcblx0XHRkYXRhID0gZGF0YSA9PSBudWxsID9cblx0XHRcdFsgZXZlbnQgXSA6XG5cdFx0XHRqUXVlcnkubWFrZUFycmF5KCBkYXRhLCBbIGV2ZW50IF0gKTtcblxuXHRcdC8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXNcblx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgZXZlbnQgcHJvcGFnYXRpb24gcGF0aCBpbiBhZHZhbmNlLCBwZXIgVzNDIGV2ZW50cyBzcGVjICgjOTk1MSlcblx0XHQvLyBCdWJibGUgdXAgdG8gZG9jdW1lbnQsIHRoZW4gdG8gd2luZG93OyB3YXRjaCBmb3IgYSBnbG9iYWwgb3duZXJEb2N1bWVudCB2YXIgKCM5NzI0KVxuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhc3BlY2lhbC5ub0J1YmJsZSAmJiAhaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0YnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVUeXBlIHx8IHR5cGU7XG5cdFx0XHRpZiAoICFyZm9jdXNNb3JwaC50ZXN0KCBidWJibGVUeXBlICsgdHlwZSApICkge1xuXHRcdFx0XHRjdXIgPSBjdXIucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdGZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIGN1ciApO1xuXHRcdFx0XHR0bXAgPSBjdXI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKVxuXHRcdFx0aWYgKCB0bXAgPT09ICggZWxlbS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50ICkgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCB0bXAuZGVmYXVsdFZpZXcgfHwgdG1wLnBhcmVudFdpbmRvdyB8fCB3aW5kb3cgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdGxhc3RFbGVtZW50ID0gY3VyO1xuXHRcdFx0ZXZlbnQudHlwZSA9IGkgPiAxID9cblx0XHRcdFx0YnViYmxlVHlwZSA6XG5cdFx0XHRcdHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTtcblxuXHRcdFx0Ly8galF1ZXJ5IGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9IChcblx0XHRcdFx0XHRkYXRhUHJpdi5nZXQoIGN1ciwgXCJldmVudHNcIiApIHx8IE9iamVjdC5jcmVhdGUoIG51bGwgKVxuXHRcdFx0XHQpWyBldmVudC50eXBlIF0gJiZcblx0XHRcdFx0ZGF0YVByaXYuZ2V0KCBjdXIsIFwiaGFuZGxlXCIgKTtcblx0XHRcdGlmICggaGFuZGxlICkge1xuXHRcdFx0XHRoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBOYXRpdmUgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gb250eXBlICYmIGN1clsgb250eXBlIF07XG5cdFx0XHRpZiAoIGhhbmRsZSAmJiBoYW5kbGUuYXBwbHkgJiYgYWNjZXB0RGF0YSggY3VyICkgKSB7XG5cdFx0XHRcdGV2ZW50LnJlc3VsdCA9IGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGV2ZW50LnR5cGUgPSB0eXBlO1xuXG5cdFx0Ly8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vd1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7XG5cblx0XHRcdGlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fFxuXHRcdFx0XHRzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBldmVudFBhdGgucG9wKCksIGRhdGEgKSA9PT0gZmFsc2UgKSAmJlxuXHRcdFx0XHRhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cblx0XHRcdFx0Ly8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBldmVudC5cblx0XHRcdFx0Ly8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKVxuXHRcdFx0XHRpZiAoIG9udHlwZSAmJiBpc0Z1bmN0aW9uKCBlbGVtWyB0eXBlIF0gKSAmJiAhaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0XHRcdC8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2Rcblx0XHRcdFx0XHR0bXAgPSBlbGVtWyBvbnR5cGUgXTtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSBudWxsO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7XG5cblx0XHRcdFx0XHRpZiAoIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRcdFx0XHRsYXN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBzdG9wUHJvcGFnYXRpb25DYWxsYmFjayApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW1bIHR5cGUgXSgpO1xuXG5cdFx0XHRcdFx0aWYgKCBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0XHRcdFx0bGFzdEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRcdFx0aWYgKCB0bXAgKSB7XG5cdFx0XHRcdFx0XHRlbGVtWyBvbnR5cGUgXSA9IHRtcDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQucmVzdWx0O1xuXHR9LFxuXG5cdC8vIFBpZ2d5YmFjayBvbiBhIGRvbm9yIGV2ZW50IHRvIHNpbXVsYXRlIGEgZGlmZmVyZW50IG9uZVxuXHQvLyBVc2VkIG9ubHkgZm9yIGBmb2N1cyhpbiB8IG91dClgIGV2ZW50c1xuXHRzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50ICkge1xuXHRcdHZhciBlID0galF1ZXJ5LmV4dGVuZChcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoKSxcblx0XHRcdGV2ZW50LFxuXHRcdFx0e1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRpc1NpbXVsYXRlZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdCk7XG5cblx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApO1xuXHR9XG5cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIHRoaXMgKTtcblx0XHR9ICk7XG5cdH0sXG5cdHRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXTtcblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTtcblx0XHR9XG5cdH1cbn0gKTtcblxuXG4vLyBTdXBwb3J0OiBGaXJlZm94IDw9NDRcbi8vIEZpcmVmb3ggZG9lc24ndCBoYXZlIGZvY3VzKGluIHwgb3V0KSBldmVudHNcbi8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg3Nzg3XG4vL1xuLy8gU3VwcG9ydDogQ2hyb21lIDw9NDggLSA0OSwgU2FmYXJpIDw9OS4wIC0gOS4xXG4vLyBmb2N1cyhpbiB8IG91dCkgZXZlbnRzIGZpcmUgYWZ0ZXIgZm9jdXMgJiBibHVyIGV2ZW50cyxcbi8vIHdoaWNoIGlzIHNwZWMgdmlvbGF0aW9uIC0gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtZm9jdXNldmVudC1ldmVudC1vcmRlclxuLy8gUmVsYXRlZCB0aWNrZXQgLSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NDk4NTdcbmlmICggIXN1cHBvcnQuZm9jdXNpbiApIHtcblx0alF1ZXJ5LmVhY2goIHsgZm9jdXM6IFwiZm9jdXNpblwiLCBibHVyOiBcImZvY3Vzb3V0XCIgfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHtcblxuXHRcdC8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0XG5cdFx0dmFyIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQuc2ltdWxhdGUoIGZpeCwgZXZlbnQudGFyZ2V0LCBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApICk7XG5cdFx0fTtcblxuXHRcdGpRdWVyeS5ldmVudC5zcGVjaWFsWyBmaXggXSA9IHtcblx0XHRcdHNldHVwOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBIYW5kbGU6IHJlZ3VsYXIgbm9kZXMgKHZpYSBgdGhpcy5vd25lckRvY3VtZW50YCksIHdpbmRvd1xuXHRcdFx0XHQvLyAodmlhIGB0aGlzLmRvY3VtZW50YCkgJiBkb2N1bWVudCAodmlhIGB0aGlzYCkuXG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcy5kb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0gZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCApO1xuXG5cdFx0XHRcdGlmICggIWF0dGFjaGVzICkge1xuXHRcdFx0XHRcdGRvYy5hZGRFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7XG5cdFx0XHR9LFxuXHRcdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZG9jID0gdGhpcy5vd25lckRvY3VtZW50IHx8IHRoaXMuZG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fSApO1xufVxudmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuXG52YXIgbm9uY2UgPSB7IGd1aWQ6IERhdGUubm93KCkgfTtcblxudmFyIHJxdWVyeSA9ICggL1xcPy8gKTtcblxuXG5cbi8vIENyb3NzLWJyb3dzZXIgeG1sIHBhcnNpbmdcbmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkge1xuXHR2YXIgeG1sO1xuXHRpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHlcblx0Ly8gSUUgdGhyb3dzIG9uIHBhcnNlRnJvbVN0cmluZyB3aXRoIGludmFsaWQgaW5wdXQuXG5cdHRyeSB7XG5cdFx0eG1sID0gKCBuZXcgd2luZG93LkRPTVBhcnNlcigpICkucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCBcInRleHQveG1sXCIgKTtcblx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0eG1sID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0aWYgKCAheG1sIHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJwYXJzZXJlcnJvclwiICkubGVuZ3RoICkge1xuXHRcdGpRdWVyeS5lcnJvciggXCJJbnZhbGlkIFhNTDogXCIgKyBkYXRhICk7XG5cdH1cblx0cmV0dXJuIHhtbDtcbn07XG5cblxudmFyXG5cdHJicmFja2V0ID0gL1xcW1xcXSQvLFxuXHRyQ1JMRiA9IC9cXHI/XFxuL2csXG5cdHJzdWJtaXR0ZXJUeXBlcyA9IC9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxcblx0cnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO1xuXG5mdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQgKSB7XG5cdHZhciBuYW1lO1xuXG5cdGlmICggQXJyYXkuaXNBcnJheSggb2JqICkgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgYXJyYXkgaXRlbS5cblx0XHRqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHtcblx0XHRcdGlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7XG5cblx0XHRcdFx0Ly8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLlxuXHRcdFx0XHRhZGQoIHByZWZpeCwgdiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEl0ZW0gaXMgbm9uLXNjYWxhciAoYXJyYXkgb3Igb2JqZWN0KSwgZW5jb2RlIGl0cyBudW1lcmljIGluZGV4LlxuXHRcdFx0XHRidWlsZFBhcmFtcyhcblx0XHRcdFx0XHRwcmVmaXggKyBcIltcIiArICggdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPSBudWxsID8gaSA6IFwiXCIgKSArIFwiXVwiLFxuXHRcdFx0XHRcdHYsXG5cdFx0XHRcdFx0dHJhZGl0aW9uYWwsXG5cdFx0XHRcdFx0YWRkXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdH0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiB0b1R5cGUoIG9iaiApID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIG9iamVjdCBpdGVtLlxuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCArIFwiW1wiICsgbmFtZSArIFwiXVwiLCBvYmpbIG5hbWUgXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gU2VyaWFsaXplIHNjYWxhciBpdGVtLlxuXHRcdGFkZCggcHJlZml4LCBvYmogKTtcblx0fVxufVxuXG4vLyBTZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZlxuLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nXG5qUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7XG5cdHZhciBwcmVmaXgsXG5cdFx0cyA9IFtdLFxuXHRcdGFkZCA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlT3JGdW5jdGlvbiApIHtcblxuXHRcdFx0Ly8gSWYgdmFsdWUgaXMgYSBmdW5jdGlvbiwgaW52b2tlIGl0IGFuZCB1c2UgaXRzIHJldHVybiB2YWx1ZVxuXHRcdFx0dmFyIHZhbHVlID0gaXNGdW5jdGlvbiggdmFsdWVPckZ1bmN0aW9uICkgP1xuXHRcdFx0XHR2YWx1ZU9yRnVuY3Rpb24oKSA6XG5cdFx0XHRcdHZhbHVlT3JGdW5jdGlvbjtcblxuXHRcdFx0c1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyBcIj1cIiArXG5cdFx0XHRcdGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSApO1xuXHRcdH07XG5cblx0aWYgKCBhID09IG51bGwgKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHQvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLlxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxlbWVudHNcblx0XHRqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApO1xuXHRcdH0gKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgXCJvbGRcIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXJcblx0XHQvLyBkaWQgaXQpLCBvdGhlcndpc2UgZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS5cblx0XHRmb3IgKCBwcmVmaXggaW4gYSApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvblxuXHRyZXR1cm4gcy5qb2luKCBcIiZcIiApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRzZXJpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApO1xuXHR9LFxuXHRzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gQ2FuIGFkZCBwcm9wSG9vayBmb3IgXCJlbGVtZW50c1wiIHRvIGZpbHRlciBvciBhZGQgZm9ybSBlbGVtZW50c1xuXHRcdFx0dmFyIGVsZW1lbnRzID0galF1ZXJ5LnByb3AoIHRoaXMsIFwiZWxlbWVudHNcIiApO1xuXHRcdFx0cmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMgKSA6IHRoaXM7XG5cdFx0fSApXG5cdFx0LmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdFx0Ly8gVXNlIC5pcyggXCI6ZGlzYWJsZWRcIiApIHNvIHRoYXQgZmllbGRzZXRbZGlzYWJsZWRdIHdvcmtzXG5cdFx0XHRyZXR1cm4gdGhpcy5uYW1lICYmICFqUXVlcnkoIHRoaXMgKS5pcyggXCI6ZGlzYWJsZWRcIiApICYmXG5cdFx0XHRcdHJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiZcblx0XHRcdFx0KCB0aGlzLmNoZWNrZWQgfHwgIXJjaGVja2FibGVUeXBlLnRlc3QoIHR5cGUgKSApO1xuXHRcdH0gKVxuXHRcdC5tYXAoIGZ1bmN0aW9uKCBfaSwgZWxlbSApIHtcblx0XHRcdHZhciB2YWwgPSBqUXVlcnkoIHRoaXMgKS52YWwoKTtcblxuXHRcdFx0aWYgKCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHJldHVybiBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdH0gKS5nZXQoKTtcblx0fVxufSApO1xuXG5cbnZhclxuXHRyMjAgPSAvJTIwL2csXG5cdHJoYXNoID0gLyMuKiQvLFxuXHRyYW50aUNhY2hlID0gLyhbPyZdKV89W14mXSovLFxuXHRyaGVhZGVycyA9IC9eKC4qPyk6WyBcXHRdKihbXlxcclxcbl0qKSQvbWcsXG5cblx0Ly8gIzc2NTMsICM4MTI1LCAjODE1MjogbG9jYWwgcHJvdG9jb2wgZGV0ZWN0aW9uXG5cdHJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sXG5cdHJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLFxuXHRycHJvdG9jb2wgPSAvXlxcL1xcLy8sXG5cblx0LyogUHJlZmlsdGVyc1xuXHQgKiAxKSBUaGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBhamF4L2pzb25wLmpzIGZvciBhbiBleGFtcGxlKVxuXHQgKiAyKSBUaGVzZSBhcmUgY2FsbGVkOlxuXHQgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0XG5cdCAqICAgIC0gQUZURVIgcGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEgaXMgdHJ1ZSlcblx0ICogMykga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDUpIGV4ZWN1dGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGNvbnRpbnVlIGRvd24gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHRwcmVmaWx0ZXJzID0ge30sXG5cblx0LyogVHJhbnNwb3J0cyBiaW5kaW5nc1xuXHQgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlXG5cdCAqIDIpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcblx0ICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHR0cmFuc3BvcnRzID0ge30sXG5cblx0Ly8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uXG5cdGFsbFR5cGVzID0gXCIqL1wiLmNvbmNhdCggXCIqXCIgKSxcblxuXHQvLyBBbmNob3IgdGFnIGZvciBwYXJzaW5nIHRoZSBkb2N1bWVudCBvcmlnaW5cblx0b3JpZ2luQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJhXCIgKTtcblx0b3JpZ2luQW5jaG9yLmhyZWYgPSBsb2NhdGlvbi5ocmVmO1xuXG4vLyBCYXNlIFwiY29uc3RydWN0b3JcIiBmb3IgalF1ZXJ5LmFqYXhQcmVmaWx0ZXIgYW5kIGpRdWVyeS5hamF4VHJhbnNwb3J0XG5mdW5jdGlvbiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSApIHtcblxuXHQvLyBkYXRhVHlwZUV4cHJlc3Npb24gaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIFwiKlwiXG5cdHJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkge1xuXG5cdFx0aWYgKCB0eXBlb2YgZGF0YVR5cGVFeHByZXNzaW9uICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZnVuYyA9IGRhdGFUeXBlRXhwcmVzc2lvbjtcblx0XHRcdGRhdGFUeXBlRXhwcmVzc2lvbiA9IFwiKlwiO1xuXHRcdH1cblxuXHRcdHZhciBkYXRhVHlwZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0ZGF0YVR5cGVzID0gZGF0YVR5cGVFeHByZXNzaW9uLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggZnVuYyApICkge1xuXG5cdFx0XHQvLyBGb3IgZWFjaCBkYXRhVHlwZSBpbiB0aGUgZGF0YVR5cGVFeHByZXNzaW9uXG5cdFx0XHR3aGlsZSAoICggZGF0YVR5cGUgPSBkYXRhVHlwZXNbIGkrKyBdICkgKSB7XG5cblx0XHRcdFx0Ly8gUHJlcGVuZCBpZiByZXF1ZXN0ZWRcblx0XHRcdFx0aWYgKCBkYXRhVHlwZVsgMCBdID09PSBcIitcIiApIHtcblx0XHRcdFx0XHRkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkgfHwgXCIqXCI7XG5cdFx0XHRcdFx0KCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS51bnNoaWZ0KCBmdW5jICk7XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGFwcGVuZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkucHVzaCggZnVuYyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG4vLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHNcbmZ1bmN0aW9uIGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKSB7XG5cblx0dmFyIGluc3BlY3RlZCA9IHt9LFxuXHRcdHNlZWtpbmdUcmFuc3BvcnQgPSAoIHN0cnVjdHVyZSA9PT0gdHJhbnNwb3J0cyApO1xuXG5cdGZ1bmN0aW9uIGluc3BlY3QoIGRhdGFUeXBlICkge1xuXHRcdHZhciBzZWxlY3RlZDtcblx0XHRpbnNwZWN0ZWRbIGRhdGFUeXBlIF0gPSB0cnVlO1xuXHRcdGpRdWVyeS5lYWNoKCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10sIGZ1bmN0aW9uKCBfLCBwcmVmaWx0ZXJPckZhY3RvcnkgKSB7XG5cdFx0XHR2YXIgZGF0YVR5cGVPclRyYW5zcG9ydCA9IHByZWZpbHRlck9yRmFjdG9yeSggb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApO1xuXHRcdFx0aWYgKCB0eXBlb2YgZGF0YVR5cGVPclRyYW5zcG9ydCA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQhc2Vla2luZ1RyYW5zcG9ydCAmJiAhaW5zcGVjdGVkWyBkYXRhVHlwZU9yVHJhbnNwb3J0IF0gKSB7XG5cblx0XHRcdFx0b3B0aW9ucy5kYXRhVHlwZXMudW5zaGlmdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7XG5cdFx0XHRcdHJldHVybiAhKCBzZWxlY3RlZCA9IGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdFx0cmV0dXJuIHNlbGVjdGVkO1xuXHR9XG5cblx0cmV0dXJuIGluc3BlY3QoIG9wdGlvbnMuZGF0YVR5cGVzWyAwIF0gKSB8fCAhaW5zcGVjdGVkWyBcIipcIiBdICYmIGluc3BlY3QoIFwiKlwiICk7XG59XG5cbi8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9uc1xuLy8gdGhhdCB0YWtlcyBcImZsYXRcIiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZClcbi8vIEZpeGVzICM5ODg3XG5mdW5jdGlvbiBhamF4RXh0ZW5kKCB0YXJnZXQsIHNyYyApIHtcblx0dmFyIGtleSwgZGVlcCxcblx0XHRmbGF0T3B0aW9ucyA9IGpRdWVyeS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnMgfHwge307XG5cblx0Zm9yICgga2V5IGluIHNyYyApIHtcblx0XHRpZiAoIHNyY1sga2V5IF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdCggZmxhdE9wdGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8ICggZGVlcCA9IHt9ICkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07XG5cdFx0fVxuXHR9XG5cdGlmICggZGVlcCApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTtcblx0fVxuXG5cdHJldHVybiB0YXJnZXQ7XG59XG5cbi8qIEhhbmRsZXMgcmVzcG9uc2VzIHRvIGFuIGFqYXggcmVxdWVzdDpcbiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpXG4gKiAtIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2VcbiAqL1xuZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHtcblxuXHR2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsXG5cdFx0Y29udGVudHMgPSBzLmNvbnRlbnRzLFxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzO1xuXG5cdC8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzXG5cdHdoaWxlICggZGF0YVR5cGVzWyAwIF0gPT09IFwiKlwiICkge1xuXHRcdGRhdGFUeXBlcy5zaGlmdCgpO1xuXHRcdGlmICggY3QgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGN0ID0gcy5taW1lVHlwZSB8fCBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJDb250ZW50LVR5cGVcIiApO1xuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZVxuXHRpZiAoIGN0ICkge1xuXHRcdGZvciAoIHR5cGUgaW4gY29udGVudHMgKSB7XG5cdFx0XHRpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkge1xuXHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdHlwZSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIHJlc3BvbnNlIGZvciB0aGUgZXhwZWN0ZWQgZGF0YVR5cGVcblx0aWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7XG5cdFx0ZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdO1xuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlc1xuXHRcdGZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkge1xuXHRcdFx0aWYgKCAhZGF0YVR5cGVzWyAwIF0gfHwgcy5jb252ZXJ0ZXJzWyB0eXBlICsgXCIgXCIgKyBkYXRhVHlwZXNbIDAgXSBdICkge1xuXHRcdFx0XHRmaW5hbERhdGFUeXBlID0gdHlwZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoICFmaXJzdERhdGFUeXBlICkge1xuXHRcdFx0XHRmaXJzdERhdGFUeXBlID0gdHlwZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBPciBqdXN0IHVzZSBmaXJzdCBvbmVcblx0XHRmaW5hbERhdGFUeXBlID0gZmluYWxEYXRhVHlwZSB8fCBmaXJzdERhdGFUeXBlO1xuXHR9XG5cblx0Ly8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZVxuXHQvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBsaXN0IGlmIG5lZWRlZFxuXHQvLyBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG5cdGlmICggZmluYWxEYXRhVHlwZSApIHtcblx0XHRpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkge1xuXHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIGZpbmFsRGF0YVR5cGUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3BvbnNlc1sgZmluYWxEYXRhVHlwZSBdO1xuXHR9XG59XG5cbi8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2VcbiAqIEFsc28gc2V0cyB0aGUgcmVzcG9uc2VYWFggZmllbGRzIG9uIHRoZSBqcVhIUiBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7XG5cdHZhciBjb252MiwgY3VycmVudCwgY29udiwgdG1wLCBwcmV2LFxuXHRcdGNvbnZlcnRlcnMgPSB7fSxcblxuXHRcdC8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb25cblx0XHRkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpO1xuXG5cdC8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5c1xuXHRpZiAoIGRhdGFUeXBlc1sgMSBdICkge1xuXHRcdGZvciAoIGNvbnYgaW4gcy5jb252ZXJ0ZXJzICkge1xuXHRcdFx0Y29udmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTtcblx0XHR9XG5cdH1cblxuXHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0Ly8gQ29udmVydCB0byBlYWNoIHNlcXVlbnRpYWwgZGF0YVR5cGVcblx0d2hpbGUgKCBjdXJyZW50ICkge1xuXG5cdFx0aWYgKCBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gKSB7XG5cdFx0XHRqcVhIUlsgcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdIF0gPSByZXNwb25zZTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSB0aGUgZGF0YUZpbHRlciBpZiBwcm92aWRlZFxuXHRcdGlmICggIXByZXYgJiYgaXNTdWNjZXNzICYmIHMuZGF0YUZpbHRlciApIHtcblx0XHRcdHJlc3BvbnNlID0gcy5kYXRhRmlsdGVyKCByZXNwb25zZSwgcy5kYXRhVHlwZSApO1xuXHRcdH1cblxuXHRcdHByZXYgPSBjdXJyZW50O1xuXHRcdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHRcdGlmICggY3VycmVudCApIHtcblxuXHRcdFx0Ly8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0b1xuXHRcdFx0aWYgKCBjdXJyZW50ID09PSBcIipcIiApIHtcblxuXHRcdFx0XHRjdXJyZW50ID0gcHJldjtcblxuXHRcdFx0Ly8gQ29udmVydCByZXNwb25zZSBpZiBwcmV2IGRhdGFUeXBlIGlzIG5vbi1hdXRvIGFuZCBkaWZmZXJzIGZyb20gY3VycmVudFxuXHRcdFx0fSBlbHNlIGlmICggcHJldiAhPT0gXCIqXCIgJiYgcHJldiAhPT0gY3VycmVudCApIHtcblxuXHRcdFx0XHQvLyBTZWVrIGEgZGlyZWN0IGNvbnZlcnRlclxuXHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbIFwiKiBcIiArIGN1cnJlbnQgXTtcblxuXHRcdFx0XHQvLyBJZiBub25lIGZvdW5kLCBzZWVrIGEgcGFpclxuXHRcdFx0XHRpZiAoICFjb252ICkge1xuXHRcdFx0XHRcdGZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudFxuXHRcdFx0XHRcdFx0dG1wID0gY29udjIuc3BsaXQoIFwiIFwiICk7XG5cdFx0XHRcdFx0XHRpZiAoIHRtcFsgMSBdID09PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIElmIHByZXYgY2FuIGJlIGNvbnZlcnRlZCB0byBhY2NlcHRlZCBpbnB1dFxuXHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgdG1wWyAwIF0gXSB8fFxuXHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlcnNbIFwiKiBcIiArIHRtcFsgMCBdIF07XG5cdFx0XHRcdFx0XHRcdGlmICggY29udiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIENvbmRlbnNlIGVxdWl2YWxlbmNlIGNvbnZlcnRlcnNcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgY29udjIgXTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGVcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y3VycmVudCA9IHRtcFsgMCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHRtcFsgMSBdICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXBwbHkgY29udmVydGVyIChpZiBub3QgYW4gZXF1aXZhbGVuY2UpXG5cdFx0XHRcdGlmICggY29udiAhPT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdC8vIFVubGVzcyBlcnJvcnMgYXJlIGFsbG93ZWQgdG8gYnViYmxlLCBjYXRjaCBhbmQgcmV0dXJuIHRoZW1cblx0XHRcdFx0XHRpZiAoIGNvbnYgJiYgcy50aHJvd3MgKSB7XG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXRlOiBcInBhcnNlcmVycm9yXCIsXG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3I6IGNvbnYgPyBlIDogXCJObyBjb252ZXJzaW9uIGZyb20gXCIgKyBwcmV2ICsgXCIgdG8gXCIgKyBjdXJyZW50XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHsgc3RhdGU6IFwic3VjY2Vzc1wiLCBkYXRhOiByZXNwb25zZSB9O1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzXG5cdGFjdGl2ZTogMCxcblxuXHQvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0XG5cdGxhc3RNb2RpZmllZDoge30sXG5cdGV0YWc6IHt9LFxuXG5cdGFqYXhTZXR0aW5nczoge1xuXHRcdHVybDogbG9jYXRpb24uaHJlZixcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGlzTG9jYWw6IHJsb2NhbFByb3RvY29sLnRlc3QoIGxvY2F0aW9uLnByb3RvY29sICksXG5cdFx0Z2xvYmFsOiB0cnVlLFxuXHRcdHByb2Nlc3NEYXRhOiB0cnVlLFxuXHRcdGFzeW5jOiB0cnVlLFxuXHRcdGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOFwiLFxuXG5cdFx0Lypcblx0XHR0aW1lb3V0OiAwLFxuXHRcdGRhdGE6IG51bGwsXG5cdFx0ZGF0YVR5cGU6IG51bGwsXG5cdFx0dXNlcm5hbWU6IG51bGwsXG5cdFx0cGFzc3dvcmQ6IG51bGwsXG5cdFx0Y2FjaGU6IG51bGwsXG5cdFx0dGhyb3dzOiBmYWxzZSxcblx0XHR0cmFkaXRpb25hbDogZmFsc2UsXG5cdFx0aGVhZGVyczoge30sXG5cdFx0Ki9cblxuXHRcdGFjY2VwdHM6IHtcblx0XHRcdFwiKlwiOiBhbGxUeXBlcyxcblx0XHRcdHRleHQ6IFwidGV4dC9wbGFpblwiLFxuXHRcdFx0aHRtbDogXCJ0ZXh0L2h0bWxcIixcblx0XHRcdHhtbDogXCJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sXCIsXG5cdFx0XHRqc29uOiBcImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdFwiXG5cdFx0fSxcblxuXHRcdGNvbnRlbnRzOiB7XG5cdFx0XHR4bWw6IC9cXGJ4bWxcXGIvLFxuXHRcdFx0aHRtbDogL1xcYmh0bWwvLFxuXHRcdFx0anNvbjogL1xcYmpzb25cXGIvXG5cdFx0fSxcblxuXHRcdHJlc3BvbnNlRmllbGRzOiB7XG5cdFx0XHR4bWw6IFwicmVzcG9uc2VYTUxcIixcblx0XHRcdHRleHQ6IFwicmVzcG9uc2VUZXh0XCIsXG5cdFx0XHRqc29uOiBcInJlc3BvbnNlSlNPTlwiXG5cdFx0fSxcblxuXHRcdC8vIERhdGEgY29udmVydGVyc1xuXHRcdC8vIEtleXMgc2VwYXJhdGUgc291cmNlIChvciBjYXRjaGFsbCBcIipcIikgYW5kIGRlc3RpbmF0aW9uIHR5cGVzIHdpdGggYSBzaW5nbGUgc3BhY2Vcblx0XHRjb252ZXJ0ZXJzOiB7XG5cblx0XHRcdC8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dFxuXHRcdFx0XCIqIHRleHRcIjogU3RyaW5nLFxuXG5cdFx0XHQvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbilcblx0XHRcdFwidGV4dCBodG1sXCI6IHRydWUsXG5cblx0XHRcdC8vIEV2YWx1YXRlIHRleHQgYXMgYSBqc29uIGV4cHJlc3Npb25cblx0XHRcdFwidGV4dCBqc29uXCI6IEpTT04ucGFyc2UsXG5cblx0XHRcdC8vIFBhcnNlIHRleHQgYXMgeG1sXG5cdFx0XHRcInRleHQgeG1sXCI6IGpRdWVyeS5wYXJzZVhNTFxuXHRcdH0sXG5cblx0XHQvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBiZSBkZWVwIGV4dGVuZGVkOlxuXHRcdC8vIHlvdSBjYW4gYWRkIHlvdXIgb3duIGN1c3RvbSBvcHRpb25zIGhlcmUgaWZcblx0XHQvLyBhbmQgd2hlbiB5b3UgY3JlYXRlIG9uZSB0aGF0IHNob3VsZG4ndCBiZVxuXHRcdC8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKVxuXHRcdGZsYXRPcHRpb25zOiB7XG5cdFx0XHR1cmw6IHRydWUsXG5cdFx0XHRjb250ZXh0OiB0cnVlXG5cdFx0fVxuXHR9LFxuXG5cdC8vIENyZWF0ZXMgYSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0IGludG8gdGFyZ2V0XG5cdC8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy5cblx0Ly8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy5cblx0YWpheFNldHVwOiBmdW5jdGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MgP1xuXG5cdFx0XHQvLyBCdWlsZGluZyBhIHNldHRpbmdzIG9iamVjdFxuXHRcdFx0YWpheEV4dGVuZCggYWpheEV4dGVuZCggdGFyZ2V0LCBqUXVlcnkuYWpheFNldHRpbmdzICksIHNldHRpbmdzICkgOlxuXG5cdFx0XHQvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzXG5cdFx0XHRhamF4RXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCB0YXJnZXQgKTtcblx0fSxcblxuXHRhamF4UHJlZmlsdGVyOiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMgKSxcblx0YWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksXG5cblx0Ly8gTWFpbiBtZXRob2Rcblx0YWpheDogZnVuY3Rpb24oIHVybCwgb3B0aW9ucyApIHtcblxuXHRcdC8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlXG5cdFx0aWYgKCB0eXBlb2YgdXJsID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0b3B0aW9ucyA9IHVybDtcblx0XHRcdHVybCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBGb3JjZSBvcHRpb25zIHRvIGJlIGFuIG9iamVjdFxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0dmFyIHRyYW5zcG9ydCxcblxuXHRcdFx0Ly8gVVJMIHdpdGhvdXQgYW50aS1jYWNoZSBwYXJhbVxuXHRcdFx0Y2FjaGVVUkwsXG5cblx0XHRcdC8vIFJlc3BvbnNlIGhlYWRlcnNcblx0XHRcdHJlc3BvbnNlSGVhZGVyc1N0cmluZyxcblx0XHRcdHJlc3BvbnNlSGVhZGVycyxcblxuXHRcdFx0Ly8gdGltZW91dCBoYW5kbGVcblx0XHRcdHRpbWVvdXRUaW1lcixcblxuXHRcdFx0Ly8gVXJsIGNsZWFudXAgdmFyXG5cdFx0XHR1cmxBbmNob3IsXG5cblx0XHRcdC8vIFJlcXVlc3Qgc3RhdGUgKGJlY29tZXMgZmFsc2UgdXBvbiBzZW5kIGFuZCB0cnVlIHVwb24gY29tcGxldGlvbilcblx0XHRcdGNvbXBsZXRlZCxcblxuXHRcdFx0Ly8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkXG5cdFx0XHRmaXJlR2xvYmFscyxcblxuXHRcdFx0Ly8gTG9vcCB2YXJpYWJsZVxuXHRcdFx0aSxcblxuXHRcdFx0Ly8gdW5jYWNoZWQgcGFydCBvZiB0aGUgdXJsXG5cdFx0XHR1bmNhY2hlZCxcblxuXHRcdFx0Ly8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdFxuXHRcdFx0cyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksXG5cblx0XHRcdC8vIENhbGxiYWNrcyBjb250ZXh0XG5cdFx0XHRjYWxsYmFja0NvbnRleHQgPSBzLmNvbnRleHQgfHwgcyxcblxuXHRcdFx0Ly8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvblxuXHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0ID0gcy5jb250ZXh0ICYmXG5cdFx0XHRcdCggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/XG5cdFx0XHRcdFx0alF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LFxuXG5cdFx0XHQvLyBEZWZlcnJlZHNcblx0XHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkID0galF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksXG5cblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LFxuXG5cdFx0XHQvLyBIZWFkZXJzICh0aGV5IGFyZSBzZW50IGFsbCBhdCBvbmNlKVxuXHRcdFx0cmVxdWVzdEhlYWRlcnMgPSB7fSxcblx0XHRcdHJlcXVlc3RIZWFkZXJzTmFtZXMgPSB7fSxcblxuXHRcdFx0Ly8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlXG5cdFx0XHRzdHJBYm9ydCA9IFwiY2FuY2VsZWRcIixcblxuXHRcdFx0Ly8gRmFrZSB4aHJcblx0XHRcdGpxWEhSID0ge1xuXHRcdFx0XHRyZWFkeVN0YXRlOiAwLFxuXG5cdFx0XHRcdC8vIEJ1aWxkcyBoZWFkZXJzIGhhc2h0YWJsZSBpZiBuZWVkZWRcblx0XHRcdFx0Z2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0XHRcdFx0dmFyIG1hdGNoO1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRcdFx0aWYgKCAhcmVzcG9uc2VIZWFkZXJzICkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZUhlYWRlcnMgPSB7fTtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSArIFwiIFwiIF0gPVxuXHRcdFx0XHRcdFx0XHRcdFx0KCByZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSArIFwiIFwiIF0gfHwgW10gKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuY29uY2F0KCBtYXRjaFsgMiBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSArIFwiIFwiIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBtYXRjaCA9PSBudWxsID8gbnVsbCA6IG1hdGNoLmpvaW4oIFwiLCBcIiApO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFJhdyBzdHJpbmdcblx0XHRcdFx0Z2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gY29tcGxldGVkID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYWNoZXMgdGhlIGhlYWRlclxuXHRcdFx0XHRzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRcdG5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSA9XG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IG5hbWU7XG5cdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyXG5cdFx0XHRcdG92ZXJyaWRlTWltZVR5cGU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRzLm1pbWVUeXBlID0gdHlwZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdFx0c3RhdHVzQ29kZTogZnVuY3Rpb24oIG1hcCApIHtcblx0XHRcdFx0XHR2YXIgY29kZTtcblx0XHRcdFx0XHRpZiAoIG1hcCApIHtcblx0XHRcdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEV4ZWN1dGUgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrc1xuXHRcdFx0XHRcdFx0XHRqcVhIUi5hbHdheXMoIG1hcFsganFYSFIuc3RhdHVzIF0gKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gTGF6eS1hZGQgdGhlIG5ldyBjYWxsYmFja3MgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZXMgb2xkIG9uZXNcblx0XHRcdFx0XHRcdFx0Zm9yICggY29kZSBpbiBtYXAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdHVzQ29kZVsgY29kZSBdID0gWyBzdGF0dXNDb2RlWyBjb2RlIF0sIG1hcFsgY29kZSBdIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSByZXF1ZXN0XG5cdFx0XHRcdGFib3J0OiBmdW5jdGlvbiggc3RhdHVzVGV4dCApIHtcblx0XHRcdFx0XHR2YXIgZmluYWxUZXh0ID0gc3RhdHVzVGV4dCB8fCBzdHJBYm9ydDtcblx0XHRcdFx0XHRpZiAoIHRyYW5zcG9ydCApIHtcblx0XHRcdFx0XHRcdHRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRvbmUoIDAsIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0Ly8gQXR0YWNoIGRlZmVycmVkc1xuXHRcdGRlZmVycmVkLnByb21pc2UoIGpxWEhSICk7XG5cblx0XHQvLyBBZGQgcHJvdG9jb2wgaWYgbm90IHByb3ZpZGVkIChwcmVmaWx0ZXJzIG1pZ2h0IGV4cGVjdCBpdClcblx0XHQvLyBIYW5kbGUgZmFsc3kgdXJsIGluIHRoZSBzZXR0aW5ncyBvYmplY3QgKCMxMDA5MzogY29uc2lzdGVuY3kgd2l0aCBvbGQgc2lnbmF0dXJlKVxuXHRcdC8vIFdlIGFsc28gdXNlIHRoZSB1cmwgcGFyYW1ldGVyIGlmIGF2YWlsYWJsZVxuXHRcdHMudXJsID0gKCAoIHVybCB8fCBzLnVybCB8fCBsb2NhdGlvbi5ocmVmICkgKyBcIlwiIClcblx0XHRcdC5yZXBsYWNlKCBycHJvdG9jb2wsIGxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICk7XG5cblx0XHQvLyBBbGlhcyBtZXRob2Qgb3B0aW9uIHRvIHR5cGUgYXMgcGVyIHRpY2tldCAjMTIwMDRcblx0XHRzLnR5cGUgPSBvcHRpb25zLm1ldGhvZCB8fCBvcHRpb25zLnR5cGUgfHwgcy5tZXRob2QgfHwgcy50eXBlO1xuXG5cdFx0Ly8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdFxuXHRcdHMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8IFwiKlwiICkudG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXG5cdFx0Ly8gQSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHRoZSBvcmlnaW4gZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudCBvcmlnaW4uXG5cdFx0aWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7XG5cdFx0XHR1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSwgRWRnZSAxMiAtIDE1XG5cdFx0XHQvLyBJRSB0aHJvd3MgZXhjZXB0aW9uIG9uIGFjY2Vzc2luZyB0aGUgaHJlZiBwcm9wZXJ0eSBpZiB1cmwgaXMgbWFsZm9ybWVkLFxuXHRcdFx0Ly8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4L1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dXJsQW5jaG9yLmhyZWYgPSBzLnVybDtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5XG5cdFx0XHRcdC8vIEFuY2hvcidzIGhvc3QgcHJvcGVydHkgaXNuJ3QgY29ycmVjdGx5IHNldCB3aGVuIHMudXJsIGlzIHJlbGF0aXZlXG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gdXJsQW5jaG9yLmhyZWY7XG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyBvcmlnaW5BbmNob3IuaG9zdCAhPT1cblx0XHRcdFx0XHR1cmxBbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyB1cmxBbmNob3IuaG9zdDtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIGFuIGVycm9yIHBhcnNpbmcgdGhlIFVSTCwgYXNzdW1lIGl0IGlzIGNyb3NzRG9tYWluLFxuXHRcdFx0XHQvLyBpdCBjYW4gYmUgcmVqZWN0ZWQgYnkgdGhlIHRyYW5zcG9ydCBpZiBpdCBpcyBpbnZhbGlkXG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZ1xuXHRcdGlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgcHJlZmlsdGVyc1xuXHRcdGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWx0ZXIsIHN0b3AgdGhlcmVcblx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdHJldHVybiBqcVhIUjtcblx0XHR9XG5cblx0XHQvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0b1xuXHRcdC8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpXG5cdFx0ZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7XG5cblx0XHQvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzXG5cdFx0aWYgKCBmaXJlR2xvYmFscyAmJiBqUXVlcnkuYWN0aXZlKysgPT09IDAgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggXCJhamF4U3RhcnRcIiApO1xuXHRcdH1cblxuXHRcdC8vIFVwcGVyY2FzZSB0aGUgdHlwZVxuXHRcdHMudHlwZSA9IHMudHlwZS50b1VwcGVyQ2FzZSgpO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnRcblx0XHRzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTtcblxuXHRcdC8vIFNhdmUgdGhlIFVSTCBpbiBjYXNlIHdlJ3JlIHRveWluZyB3aXRoIHRoZSBJZi1Nb2RpZmllZC1TaW5jZVxuXHRcdC8vIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciBsYXRlciBvblxuXHRcdC8vIFJlbW92ZSBoYXNoIHRvIHNpbXBsaWZ5IHVybCBtYW5pcHVsYXRpb25cblx0XHRjYWNoZVVSTCA9IHMudXJsLnJlcGxhY2UoIHJoYXNoLCBcIlwiICk7XG5cblx0XHQvLyBNb3JlIG9wdGlvbnMgaGFuZGxpbmcgZm9yIHJlcXVlc3RzIHdpdGggbm8gY29udGVudFxuXHRcdGlmICggIXMuaGFzQ29udGVudCApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIGhhc2ggc28gd2UgY2FuIHB1dCBpdCBiYWNrXG5cdFx0XHR1bmNhY2hlZCA9IHMudXJsLnNsaWNlKCBjYWNoZVVSTC5sZW5ndGggKTtcblxuXHRcdFx0Ly8gSWYgZGF0YSBpcyBhdmFpbGFibGUgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQsIGFwcGVuZCBkYXRhIHRvIHVybFxuXHRcdFx0aWYgKCBzLmRhdGEgJiYgKCBzLnByb2Nlc3NEYXRhIHx8IHR5cGVvZiBzLmRhdGEgPT09IFwic3RyaW5nXCIgKSApIHtcblx0XHRcdFx0Y2FjaGVVUkwgKz0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuZGF0YTtcblxuXHRcdFx0XHQvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5XG5cdFx0XHRcdGRlbGV0ZSBzLmRhdGE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBvciB1cGRhdGUgYW50aS1jYWNoZSBwYXJhbSBpZiBuZWVkZWRcblx0XHRcdGlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdGNhY2hlVVJMID0gY2FjaGVVUkwucmVwbGFjZSggcmFudGlDYWNoZSwgXCIkMVwiICk7XG5cdFx0XHRcdHVuY2FjaGVkID0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/IFwiJlwiIDogXCI/XCIgKSArIFwiXz1cIiArICggbm9uY2UuZ3VpZCsrICkgK1xuXHRcdFx0XHRcdHVuY2FjaGVkO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQdXQgaGFzaCBhbmQgYW50aS1jYWNoZSBvbiB0aGUgVVJMIHRoYXQgd2lsbCBiZSByZXF1ZXN0ZWQgKGdoLTE3MzIpXG5cdFx0XHRzLnVybCA9IGNhY2hlVVJMICsgdW5jYWNoZWQ7XG5cblx0XHQvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OClcblx0XHR9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJlxuXHRcdFx0KCBzLmNvbnRlbnRUeXBlIHx8IFwiXCIgKS5pbmRleE9mKCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiICkgPT09IDAgKSB7XG5cdFx0XHRzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCBcIitcIiApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTW9kaWZpZWQtU2luY2VcIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50XG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZVxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXG5cdFx0XHRcIkFjY2VwdFwiLFxuXHRcdFx0cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/XG5cdFx0XHRcdHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdICtcblx0XHRcdFx0XHQoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxuXHRcdFx0XHRzLmFjY2VwdHNbIFwiKlwiIF1cblx0XHQpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uXG5cdFx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcblx0XHRpZiAoIHMuYmVmb3JlU2VuZCAmJlxuXHRcdFx0KCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuXG5cdFx0XHRyZXR1cm4ganFYSFIuYWJvcnQoKTtcblx0XHR9XG5cblx0XHQvLyBBYm9ydGluZyBpcyBubyBsb25nZXIgYSBjYW5jZWxsYXRpb25cblx0XHRzdHJBYm9ydCA9IFwiYWJvcnRcIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkc1xuXHRcdGNvbXBsZXRlRGVmZXJyZWQuYWRkKCBzLmNvbXBsZXRlICk7XG5cdFx0anFYSFIuZG9uZSggcy5zdWNjZXNzICk7XG5cdFx0anFYSFIuZmFpbCggcy5lcnJvciApO1xuXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxuXHRcdHRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XG5cdFx0aWYgKCAhdHJhbnNwb3J0ICkge1xuXHRcdFx0ZG9uZSggLTEsIFwiTm8gVHJhbnNwb3J0XCIgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IDE7XG5cblx0XHRcdC8vIFNlbmQgZ2xvYmFsIGV2ZW50XG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYWpheFNlbmQsIHN0b3AgdGhlcmVcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpbWVvdXRcblx0XHRcdGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkge1xuXHRcdFx0XHR0aW1lb3V0VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0anFYSFIuYWJvcnQoIFwidGltZW91dFwiICk7XG5cdFx0XHRcdH0sIHMudGltZW91dCApO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb21wbGV0ZWQgPSBmYWxzZTtcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBSZXRocm93IHBvc3QtY29tcGxldGlvbiBleGNlcHRpb25zXG5cdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHNcblx0XHRcdFx0ZG9uZSggLTEsIGUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmVcblx0XHRmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5hdGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHtcblx0XHRcdHZhciBpc1N1Y2Nlc3MsIHN1Y2Nlc3MsIGVycm9yLCByZXNwb25zZSwgbW9kaWZpZWQsXG5cdFx0XHRcdHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0O1xuXG5cdFx0XHQvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zXG5cdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb21wbGV0ZWQgPSB0cnVlO1xuXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xuXHRcdFx0aWYgKCB0aW1lb3V0VGltZXIgKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvblxuXHRcdFx0Ly8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZClcblx0XHRcdHRyYW5zcG9ydCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0Ly8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTZXQgcmVhZHlTdGF0ZVxuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDtcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIGlmIHN1Y2Nlc3NmdWxcblx0XHRcdGlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0O1xuXG5cdFx0XHQvLyBHZXQgcmVzcG9uc2UgZGF0YVxuXHRcdFx0aWYgKCByZXNwb25zZXMgKSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVc2UgYSBub29wIGNvbnZlcnRlciBmb3IgbWlzc2luZyBzY3JpcHRcblx0XHRcdGlmICggIWlzU3VjY2VzcyAmJiBqUXVlcnkuaW5BcnJheSggXCJzY3JpcHRcIiwgcy5kYXRhVHlwZXMgKSA+IC0xICkge1xuXHRcdFx0XHRzLmNvbnZlcnRlcnNbIFwidGV4dCBzY3JpcHRcIiBdID0gZnVuY3Rpb24oKSB7fTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KVxuXHRcdFx0cmVzcG9uc2UgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKTtcblxuXHRcdFx0Ly8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmdcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXG5cdFx0XHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0XHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiTGFzdC1Nb2RpZmllZFwiICk7XG5cdFx0XHRcdFx0aWYgKCBtb2RpZmllZCApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJldGFnXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBpZiBubyBjb250ZW50XG5cdFx0XHRcdGlmICggc3RhdHVzID09PSAyMDQgfHwgcy50eXBlID09PSBcIkhFQURcIiApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub2NvbnRlbnRcIjtcblxuXHRcdFx0XHQvLyBpZiBub3QgbW9kaWZpZWRcblx0XHRcdFx0fSBlbHNlIGlmICggc3RhdHVzID09PSAzMDQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm90bW9kaWZpZWRcIjtcblxuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gcmVzcG9uc2Uuc3RhdGU7XG5cdFx0XHRcdFx0c3VjY2VzcyA9IHJlc3BvbnNlLmRhdGE7XG5cdFx0XHRcdFx0ZXJyb3IgPSByZXNwb25zZS5lcnJvcjtcblx0XHRcdFx0XHRpc1N1Y2Nlc3MgPSAhZXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gRXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQgYW5kIG5vcm1hbGl6ZSBmb3Igbm9uLWFib3J0c1xuXHRcdFx0XHRlcnJvciA9IHN0YXR1c1RleHQ7XG5cdFx0XHRcdGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcImVycm9yXCI7XG5cdFx0XHRcdFx0aWYgKCBzdGF0dXMgPCAwICkge1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHhociBvYmplY3Rcblx0XHRcdGpxWEhSLnN0YXR1cyA9IHN0YXR1cztcblx0XHRcdGpxWEhSLnN0YXR1c1RleHQgPSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsgXCJcIjtcblxuXHRcdFx0Ly8gU3VjY2Vzcy9FcnJvclxuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsgc3VjY2Vzcywgc3RhdHVzVGV4dCwganFYSFIgXSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0LCBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7XG5cdFx0XHRzdGF0dXNDb2RlID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggaXNTdWNjZXNzID8gXCJhamF4U3VjY2Vzc1wiIDogXCJhamF4RXJyb3JcIixcblx0XHRcdFx0XHRbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb21wbGV0ZVxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheENvbXBsZXRlXCIsIFsganFYSFIsIHMgXSApO1xuXG5cdFx0XHRcdC8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlclxuXHRcdFx0XHRpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdG9wXCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBqcVhIUjtcblx0fSxcblxuXHRnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFjaywgXCJqc29uXCIgKTtcblx0fSxcblxuXHRnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssIFwic2NyaXB0XCIgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcImdldFwiLCBcInBvc3RcIiBdLCBmdW5jdGlvbiggX2ksIG1ldGhvZCApIHtcblx0alF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkge1xuXG5cdFx0Ly8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWRcblx0XHRpZiAoIGlzRnVuY3Rpb24oIGRhdGEgKSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrO1xuXHRcdFx0Y2FsbGJhY2sgPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBUaGUgdXJsIGNhbiBiZSBhbiBvcHRpb25zIG9iamVjdCAod2hpY2ggdGhlbiBtdXN0IGhhdmUgLnVybClcblx0XHRyZXR1cm4galF1ZXJ5LmFqYXgoIGpRdWVyeS5leHRlbmQoIHtcblx0XHRcdHVybDogdXJsLFxuXHRcdFx0dHlwZTogbWV0aG9kLFxuXHRcdFx0ZGF0YVR5cGU6IHR5cGUsXG5cdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0c3VjY2VzczogY2FsbGJhY2tcblx0XHR9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIGZ1bmN0aW9uKCBzICkge1xuXHR2YXIgaTtcblx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0aWYgKCBpLnRvTG93ZXJDYXNlKCkgPT09IFwiY29udGVudC10eXBlXCIgKSB7XG5cdFx0XHRzLmNvbnRlbnRUeXBlID0gcy5oZWFkZXJzWyBpIF0gfHwgXCJcIjtcblx0XHR9XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsLCBvcHRpb25zLCBkb2MgKSB7XG5cdHJldHVybiBqUXVlcnkuYWpheCgge1xuXHRcdHVybDogdXJsLFxuXG5cdFx0Ly8gTWFrZSB0aGlzIGV4cGxpY2l0LCBzaW5jZSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIHRocm91Z2ggYWpheFNldHVwICgjMTEyNjQpXG5cdFx0dHlwZTogXCJHRVRcIixcblx0XHRkYXRhVHlwZTogXCJzY3JpcHRcIixcblx0XHRjYWNoZTogdHJ1ZSxcblx0XHRhc3luYzogZmFsc2UsXG5cdFx0Z2xvYmFsOiBmYWxzZSxcblxuXHRcdC8vIE9ubHkgZXZhbHVhdGUgdGhlIHJlc3BvbnNlIGlmIGl0IGlzIHN1Y2Nlc3NmdWwgKGdoLTQxMjYpXG5cdFx0Ly8gZGF0YUZpbHRlciBpcyBub3QgaW52b2tlZCBmb3IgZmFpbHVyZSByZXNwb25zZXMsIHNvIHVzaW5nIGl0IGluc3RlYWRcblx0XHQvLyBvZiB0aGUgZGVmYXVsdCBjb252ZXJ0ZXIgaXMga2x1ZGd5IGJ1dCBpdCB3b3Jrcy5cblx0XHRjb252ZXJ0ZXJzOiB7XG5cdFx0XHRcInRleHQgc2NyaXB0XCI6IGZ1bmN0aW9uKCkge31cblx0XHR9LFxuXHRcdGRhdGFGaWx0ZXI6IGZ1bmN0aW9uKCByZXNwb25zZSApIHtcblx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKCByZXNwb25zZSwgb3B0aW9ucywgZG9jICk7XG5cdFx0fVxuXHR9ICk7XG59O1xuXG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0d3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0dmFyIHdyYXA7XG5cblx0XHRpZiAoIHRoaXNbIDAgXSApIHtcblx0XHRcdGlmICggaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0XHRodG1sID0gaHRtbC5jYWxsKCB0aGlzWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmRcblx0XHRcdHdyYXAgPSBqUXVlcnkoIGh0bWwsIHRoaXNbIDAgXS5vd25lckRvY3VtZW50ICkuZXEoIDAgKS5jbG9uZSggdHJ1ZSApO1xuXG5cdFx0XHRpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR3cmFwLmluc2VydEJlZm9yZSggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHdyYXAubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGVsZW0gPSB0aGlzO1xuXG5cdFx0XHRcdHdoaWxlICggZWxlbS5maXJzdEVsZW1lbnRDaGlsZCApIHtcblx0XHRcdFx0XHRlbGVtID0gZWxlbS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBlbGVtO1xuXHRcdFx0fSApLmFwcGVuZCggdGhpcyApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHdyYXBJbm5lcjogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcElubmVyKCBodG1sLmNhbGwoIHRoaXMsIGkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKSxcblx0XHRcdFx0Y29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7XG5cblx0XHRcdGlmICggY29udGVudHMubGVuZ3RoICkge1xuXHRcdFx0XHRjb250ZW50cy53cmFwQWxsKCBodG1sICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuYXBwZW5kKCBodG1sICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdHdyYXA6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciBodG1sSXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24oIGh0bWwgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaHRtbElzRnVuY3Rpb24gPyBodG1sLmNhbGwoIHRoaXMsIGkgKSA6IGh0bWwgKTtcblx0XHR9ICk7XG5cdH0sXG5cblx0dW53cmFwOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dGhpcy5wYXJlbnQoIHNlbGVjdG9yICkubm90KCBcImJvZHlcIiApLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApO1xuXHRcdH0gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufSApO1xuXG5cbmpRdWVyeS5leHByLnBzZXVkb3MuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiAhalF1ZXJ5LmV4cHIucHNldWRvcy52aXNpYmxlKCBlbGVtICk7XG59O1xualF1ZXJ5LmV4cHIucHNldWRvcy52aXNpYmxlID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiAhISggZWxlbS5vZmZzZXRXaWR0aCB8fCBlbGVtLm9mZnNldEhlaWdodCB8fCBlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICk7XG59O1xuXG5cblxuXG5qUXVlcnkuYWpheFNldHRpbmdzLnhociA9IGZ1bmN0aW9uKCkge1xuXHR0cnkge1xuXHRcdHJldHVybiBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG5cdH0gY2F0Y2ggKCBlICkge31cbn07XG5cbnZhciB4aHJTdWNjZXNzU3RhdHVzID0ge1xuXG5cdFx0Ly8gRmlsZSBwcm90b2NvbCBhbHdheXMgeWllbGRzIHN0YXR1cyBjb2RlIDAsIGFzc3VtZSAyMDBcblx0XHQwOiAyMDAsXG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHRcdC8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNFxuXHRcdDEyMjM6IDIwNFxuXHR9LFxuXHR4aHJTdXBwb3J0ZWQgPSBqUXVlcnkuYWpheFNldHRpbmdzLnhocigpO1xuXG5zdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoIFwid2l0aENyZWRlbnRpYWxzXCIgaW4geGhyU3VwcG9ydGVkICk7XG5zdXBwb3J0LmFqYXggPSB4aHJTdXBwb3J0ZWQgPSAhIXhoclN1cHBvcnRlZDtcblxualF1ZXJ5LmFqYXhUcmFuc3BvcnQoIGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHR2YXIgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2s7XG5cblx0Ly8gQ3Jvc3MgZG9tYWluIG9ubHkgYWxsb3dlZCBpZiBzdXBwb3J0ZWQgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdFxuXHRpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0dmFyIGksXG5cdFx0XHRcdFx0eGhyID0gb3B0aW9ucy54aHIoKTtcblxuXHRcdFx0XHR4aHIub3Blbihcblx0XHRcdFx0XHRvcHRpb25zLnR5cGUsXG5cdFx0XHRcdFx0b3B0aW9ucy51cmwsXG5cdFx0XHRcdFx0b3B0aW9ucy5hc3luYyxcblx0XHRcdFx0XHRvcHRpb25zLnVzZXJuYW1lLFxuXHRcdFx0XHRcdG9wdGlvbnMucGFzc3dvcmRcblx0XHRcdFx0KTtcblxuXHRcdFx0XHQvLyBBcHBseSBjdXN0b20gZmllbGRzIGlmIHByb3ZpZGVkXG5cdFx0XHRcdGlmICggb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0Zm9yICggaSBpbiBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRcdHhoclsgaSBdID0gb3B0aW9ucy54aHJGaWVsZHNbIGkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBPdmVycmlkZSBtaW1lIHR5cGUgaWYgbmVlZGVkXG5cdFx0XHRcdGlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHtcblx0XHRcdFx0XHR4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gWC1SZXF1ZXN0ZWQtV2l0aCBoZWFkZXJcblx0XHRcdFx0Ly8gRm9yIGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc2VlaW5nIGFzIGNvbmRpdGlvbnMgZm9yIGEgcHJlZmxpZ2h0IGFyZVxuXHRcdFx0XHQvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLlxuXHRcdFx0XHQvLyAoaXQgY2FuIGFsd2F5cyBiZSBzZXQgb24gYSBwZXItcmVxdWVzdCBiYXNpcyBvciBldmVuIHVzaW5nIGFqYXhTZXR1cClcblx0XHRcdFx0Ly8gRm9yIHNhbWUtZG9tYWluIHJlcXVlc3RzLCB3b24ndCBjaGFuZ2UgaGVhZGVyIGlmIGFscmVhZHkgcHJvdmlkZWQuXG5cdFx0XHRcdGlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbIFwiWC1SZXF1ZXN0ZWQtV2l0aFwiIF0gKSB7XG5cdFx0XHRcdFx0aGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSA9IFwiWE1MSHR0cFJlcXVlc3RcIjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNldCBoZWFkZXJzXG5cdFx0XHRcdGZvciAoIGkgaW4gaGVhZGVycyApIHtcblx0XHRcdFx0XHR4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDYWxsYmFja1xuXHRcdFx0XHRjYWxsYmFjayA9IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHRcdGNhbGxiYWNrID0gZXJyb3JDYWxsYmFjayA9IHhoci5vbmxvYWQgPVxuXHRcdFx0XHRcdFx0XHRcdHhoci5vbmVycm9yID0geGhyLm9uYWJvcnQgPSB4aHIub250aW1lb3V0ID1cblx0XHRcdFx0XHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdHlwZSA9PT0gXCJhYm9ydFwiICkge1xuXHRcdFx0XHRcdFx0XHRcdHhoci5hYm9ydCgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSBcImVycm9yXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHRcdFx0XHRcdFx0XHRcdC8vIE9uIGEgbWFudWFsIG5hdGl2ZSBhYm9ydCwgSUU5IHRocm93c1xuXHRcdFx0XHRcdFx0XHRcdC8vIGVycm9ycyBvbiBhbnkgcHJvcGVydHkgYWNjZXNzIHRoYXQgaXMgbm90IHJlYWR5U3RhdGVcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHR5cGVvZiB4aHIuc3RhdHVzICE9PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoIDAsIFwiZXJyb3JcIiApO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZShcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBGaWxlOiBwcm90b2NvbCBhbHdheXMgeWllbGRzIHN0YXR1cyAwOyBzZWUgIzg2MDUsICMxNDIwN1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHJTdWNjZXNzU3RhdHVzWyB4aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXNUZXh0LFxuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSUU5IGhhcyBubyBYSFIyIGJ1dCB0aHJvd3Mgb24gYmluYXJ5ICh0cmFjLTExNDI2KVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gRm9yIFhIUjIgbm9uLXRleHQsIGxldCB0aGUgY2FsbGVyIGhhbmRsZSBpdCAoZ2gtMjQ5OClcblx0XHRcdFx0XHRcdFx0XHRcdCggeGhyLnJlc3BvbnNlVHlwZSB8fCBcInRleHRcIiApICE9PSBcInRleHRcIiAgfHxcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGVvZiB4aHIucmVzcG9uc2VUZXh0ICE9PSBcInN0cmluZ1wiID9cblx0XHRcdFx0XHRcdFx0XHRcdFx0eyBiaW5hcnk6IHhoci5yZXNwb25zZSB9IDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyB0ZXh0OiB4aHIucmVzcG9uc2VUZXh0IH0sXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKClcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvLyBMaXN0ZW4gdG8gZXZlbnRzXG5cdFx0XHRcdHhoci5vbmxvYWQgPSBjYWxsYmFjaygpO1xuXHRcdFx0XHRlcnJvckNhbGxiYWNrID0geGhyLm9uZXJyb3IgPSB4aHIub250aW1lb3V0ID0gY2FsbGJhY2soIFwiZXJyb3JcIiApO1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDkgb25seVxuXHRcdFx0XHQvLyBVc2Ugb25yZWFkeXN0YXRlY2hhbmdlIHRvIHJlcGxhY2Ugb25hYm9ydFxuXHRcdFx0XHQvLyB0byBoYW5kbGUgdW5jYXVnaHQgYWJvcnRzXG5cdFx0XHRcdGlmICggeGhyLm9uYWJvcnQgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR4aHIub25hYm9ydCA9IGVycm9yQ2FsbGJhY2s7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdFx0XHQvLyBDaGVjayByZWFkeVN0YXRlIGJlZm9yZSB0aW1lb3V0IGFzIGl0IGNoYW5nZXNcblx0XHRcdFx0XHRcdGlmICggeGhyLnJlYWR5U3RhdGUgPT09IDQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQWxsb3cgb25lcnJvciB0byBiZSBjYWxsZWQgZmlyc3QsXG5cdFx0XHRcdFx0XHRcdC8vIGJ1dCB0aGF0IHdpbGwgbm90IGhhbmRsZSBhIG5hdGl2ZSBhYm9ydFxuXHRcdFx0XHRcdFx0XHQvLyBBbHNvLCBzYXZlIGVycm9yQ2FsbGJhY2sgdG8gYSB2YXJpYWJsZVxuXHRcdFx0XHRcdFx0XHQvLyBhcyB4aHIub25lcnJvciBjYW5ub3QgYmUgYWNjZXNzZWRcblx0XHRcdFx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlcnJvckNhbGxiYWNrKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2tcblx0XHRcdFx0Y2FsbGJhY2sgPSBjYWxsYmFjayggXCJhYm9ydFwiICk7XG5cblx0XHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRcdC8vIERvIHNlbmQgdGhlIHJlcXVlc3QgKHRoaXMgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbilcblx0XHRcdFx0XHR4aHIuc2VuZCggb3B0aW9ucy5oYXNDb250ZW50ICYmIG9wdGlvbnMuZGF0YSB8fCBudWxsICk7XG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdFx0Ly8gIzE0NjgzOiBPbmx5IHJldGhyb3cgaWYgdGhpcyBoYXNuJ3QgYmVlbiBub3RpZmllZCBhcyBhbiBlcnJvciB5ZXRcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxufSApO1xuXG5cblxuXG4vLyBQcmV2ZW50IGF1dG8tZXhlY3V0aW9uIG9mIHNjcmlwdHMgd2hlbiBubyBleHBsaWNpdCBkYXRhVHlwZSB3YXMgcHJvdmlkZWQgKFNlZSBnaC0yNDMyKVxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIGZ1bmN0aW9uKCBzICkge1xuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0cy5jb250ZW50cy5zY3JpcHQgPSBmYWxzZTtcblx0fVxufSApO1xuXG4vLyBJbnN0YWxsIHNjcmlwdCBkYXRhVHlwZVxualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRhY2NlcHRzOiB7XG5cdFx0c2NyaXB0OiBcInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgXCIgK1xuXHRcdFx0XCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHRcIlxuXHR9LFxuXHRjb250ZW50czoge1xuXHRcdHNjcmlwdDogL1xcYig/OmphdmF8ZWNtYSlzY3JpcHRcXGIvXG5cdH0sXG5cdGNvbnZlcnRlcnM6IHtcblx0XHRcInRleHQgc2NyaXB0XCI6IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0alF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTtcblx0XHRcdHJldHVybiB0ZXh0O1xuXHRcdH1cblx0fVxufSApO1xuXG4vLyBIYW5kbGUgY2FjaGUncyBzcGVjaWFsIGNhc2UgYW5kIGNyb3NzRG9tYWluXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cdGlmICggcy5jYWNoZSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdHMuY2FjaGUgPSBmYWxzZTtcblx0fVxuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0cy50eXBlID0gXCJHRVRcIjtcblx0fVxufSApO1xuXG4vLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnRcbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblxuXHQvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIG9yIGZvcmNlZC1ieS1hdHRycyByZXF1ZXN0c1xuXHRpZiAoIHMuY3Jvc3NEb21haW4gfHwgcy5zY3JpcHRBdHRycyApIHtcblx0XHR2YXIgc2NyaXB0LCBjYWxsYmFjaztcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkge1xuXHRcdFx0XHRzY3JpcHQgPSBqUXVlcnkoIFwiPHNjcmlwdD5cIiApXG5cdFx0XHRcdFx0LmF0dHIoIHMuc2NyaXB0QXR0cnMgfHwge30gKVxuXHRcdFx0XHRcdC5wcm9wKCB7IGNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCwgc3JjOiBzLnVybCB9IClcblx0XHRcdFx0XHQub24oIFwibG9hZCBlcnJvclwiLCBjYWxsYmFjayA9IGZ1bmN0aW9uKCBldnQgKSB7XG5cdFx0XHRcdFx0XHRzY3JpcHQucmVtb3ZlKCk7XG5cdFx0XHRcdFx0XHRjYWxsYmFjayA9IG51bGw7XG5cdFx0XHRcdFx0XHRpZiAoIGV2dCApIHtcblx0XHRcdFx0XHRcdFx0Y29tcGxldGUoIGV2dC50eXBlID09PSBcImVycm9yXCIgPyA0MDQgOiAyMDAsIGV2dC50eXBlICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdC8vIFVzZSBuYXRpdmUgRE9NIG1hbmlwdWxhdGlvbiB0byBhdm9pZCBvdXIgZG9tTWFuaXAgQUpBWCB0cmlja2VyeVxuXHRcdFx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKCBzY3JpcHRbIDAgXSApO1xuXHRcdFx0fSxcblx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxufSApO1xuXG5cblxuXG52YXIgb2xkQ2FsbGJhY2tzID0gW10sXG5cdHJqc29ucCA9IC8oPSlcXD8oPz0mfCQpfFxcP1xcPy87XG5cbi8vIERlZmF1bHQganNvbnAgc2V0dGluZ3NcbmpRdWVyeS5hamF4U2V0dXAoIHtcblx0anNvbnA6IFwiY2FsbGJhY2tcIixcblx0anNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyBcIl9cIiArICggbm9uY2UuZ3VpZCsrICkgKTtcblx0XHR0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTtcblx0XHRyZXR1cm4gY2FsbGJhY2s7XG5cdH1cbn0gKTtcblxuLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJqc29uIGpzb25wXCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHtcblxuXHR2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsXG5cdFx0anNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID9cblx0XHRcdFwidXJsXCIgOlxuXHRcdFx0dHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApXG5cdFx0XHRcdFx0LmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCAmJlxuXHRcdFx0XHRyanNvbnAudGVzdCggcy5kYXRhICkgJiYgXCJkYXRhXCJcblx0XHQpO1xuXG5cdC8vIEhhbmRsZSBpZmYgdGhlIGV4cGVjdGVkIGRhdGEgdHlwZSBpcyBcImpzb25wXCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXRcblx0aWYgKCBqc29uUHJvcCB8fCBzLmRhdGFUeXBlc1sgMCBdID09PSBcImpzb25wXCIgKSB7XG5cblx0XHQvLyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1iZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0XG5cdFx0Y2FsbGJhY2tOYW1lID0gcy5qc29ucENhbGxiYWNrID0gaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgP1xuXHRcdFx0cy5qc29ucENhbGxiYWNrKCkgOlxuXHRcdFx0cy5qc29ucENhbGxiYWNrO1xuXG5cdFx0Ly8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YVxuXHRcdGlmICgganNvblByb3AgKSB7XG5cdFx0XHRzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsIFwiJDFcIiArIGNhbGxiYWNrTmFtZSApO1xuXHRcdH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkge1xuXHRcdFx0cy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuanNvbnAgKyBcIj1cIiArIGNhbGxiYWNrTmFtZTtcblx0XHR9XG5cblx0XHQvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uXG5cdFx0cy5jb252ZXJ0ZXJzWyBcInNjcmlwdCBqc29uXCIgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7XG5cdFx0XHRcdGpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgXCIgd2FzIG5vdCBjYWxsZWRcIiApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07XG5cdFx0fTtcblxuXHRcdC8vIEZvcmNlIGpzb24gZGF0YVR5cGVcblx0XHRzLmRhdGFUeXBlc1sgMCBdID0gXCJqc29uXCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrXG5cdFx0b3ZlcndyaXR0ZW4gPSB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdO1xuXHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzO1xuXHRcdH07XG5cblx0XHQvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycylcblx0XHRqcVhIUi5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXRcblx0XHRcdGlmICggb3ZlcndyaXR0ZW4gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0alF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTtcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHJlc3RvcmUgcHJlZXhpc3RpbmcgdmFsdWVcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBvdmVyd3JpdHRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2F2ZSBiYWNrIGFzIGZyZWVcblx0XHRcdGlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kXG5cdFx0XHRcdHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjaztcblxuXHRcdFx0XHQvLyBTYXZlIHRoZSBjYWxsYmFjayBuYW1lIGZvciBmdXR1cmUgdXNlXG5cdFx0XHRcdG9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlXG5cdFx0XHRpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7XG5cdFx0XHRcdG92ZXJ3cml0dGVuKCByZXNwb25zZUNvbnRhaW5lclsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7XG5cdFx0fSApO1xuXG5cdFx0Ly8gRGVsZWdhdGUgdG8gc2NyaXB0XG5cdFx0cmV0dXJuIFwic2NyaXB0XCI7XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gU3VwcG9ydDogU2FmYXJpIDggb25seVxuLy8gSW4gU2FmYXJpIDggZG9jdW1lbnRzIGNyZWF0ZWQgdmlhIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudFxuLy8gY29sbGFwc2Ugc2libGluZyBmb3JtczogdGhlIHNlY29uZCBvbmUgYmVjb21lcyBhIGNoaWxkIG9mIHRoZSBmaXJzdCBvbmUuXG4vLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguXG4vLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MzM3XG5zdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCA9ICggZnVuY3Rpb24oKSB7XG5cdHZhciBib2R5ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCBcIlwiICkuYm9keTtcblx0Ym9keS5pbm5lckhUTUwgPSBcIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+XCI7XG5cdHJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyO1xufSApKCk7XG5cblxuLy8gQXJndW1lbnQgXCJkYXRhXCIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sXG4vLyBjb250ZXh0IChvcHRpb25hbCk6IElmIHNwZWNpZmllZCwgdGhlIGZyYWdtZW50IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGlzIGNvbnRleHQsXG4vLyBkZWZhdWx0cyB0byBkb2N1bWVudFxuLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZ1xualF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHtcblx0aWYgKCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0a2VlcFNjcmlwdHMgPSBjb250ZXh0O1xuXHRcdGNvbnRleHQgPSBmYWxzZTtcblx0fVxuXG5cdHZhciBiYXNlLCBwYXJzZWQsIHNjcmlwdHM7XG5cblx0aWYgKCAhY29udGV4dCApIHtcblxuXHRcdC8vIFN0b3Agc2NyaXB0cyBvciBpbmxpbmUgZXZlbnQgaGFuZGxlcnMgZnJvbSBiZWluZyBleGVjdXRlZCBpbW1lZGlhdGVseVxuXHRcdC8vIGJ5IHVzaW5nIGRvY3VtZW50LmltcGxlbWVudGF0aW9uXG5cdFx0aWYgKCBzdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCApIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIFwiXCIgKTtcblxuXHRcdFx0Ly8gU2V0IHRoZSBiYXNlIGhyZWYgZm9yIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdFx0XHQvLyBzbyBhbnkgcGFyc2VkIGVsZW1lbnRzIHdpdGggVVJMc1xuXHRcdFx0Ly8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSlcblx0XHRcdGJhc2UgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiYmFzZVwiICk7XG5cdFx0XHRiYXNlLmhyZWYgPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmO1xuXHRcdFx0Y29udGV4dC5oZWFkLmFwcGVuZENoaWxkKCBiYXNlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudDtcblx0XHR9XG5cdH1cblxuXHRwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKTtcblx0c2NyaXB0cyA9ICFrZWVwU2NyaXB0cyAmJiBbXTtcblxuXHQvLyBTaW5nbGUgdGFnXG5cdGlmICggcGFyc2VkICkge1xuXHRcdHJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdO1xuXHR9XG5cblx0cGFyc2VkID0gYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTtcblxuXHRpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTtcbn07XG5cblxuLyoqXG4gKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlXG4gKi9cbmpRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHtcblx0dmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRvZmYgPSB1cmwuaW5kZXhPZiggXCIgXCIgKTtcblxuXHRpZiAoIG9mZiA+IC0xICkge1xuXHRcdHNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApO1xuXHRcdHVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7XG5cdH1cblxuXHQvLyBJZiBpdCdzIGEgZnVuY3Rpb25cblx0aWYgKCBpc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHtcblxuXHRcdC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrXG5cdFx0Y2FsbGJhY2sgPSBwYXJhbXM7XG5cdFx0cGFyYW1zID0gdW5kZWZpbmVkO1xuXG5cdC8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmdcblx0fSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0dHlwZSA9IFwiUE9TVFwiO1xuXHR9XG5cblx0Ly8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3Rcblx0aWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7XG5cdFx0alF1ZXJ5LmFqYXgoIHtcblx0XHRcdHVybDogdXJsLFxuXG5cdFx0XHQvLyBJZiBcInR5cGVcIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gXCJHRVRcIiBtZXRob2Qgd2lsbCBiZSB1c2VkLlxuXHRcdFx0Ly8gTWFrZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGV4cGxpY2l0IHNpbmNlXG5cdFx0XHQvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2Rcblx0XHRcdHR5cGU6IHR5cGUgfHwgXCJHRVRcIixcblx0XHRcdGRhdGFUeXBlOiBcImh0bWxcIixcblx0XHRcdGRhdGE6IHBhcmFtc1xuXHRcdH0gKS5kb25lKCBmdW5jdGlvbiggcmVzcG9uc2VUZXh0ICkge1xuXG5cdFx0XHQvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2tcblx0XHRcdHJlc3BvbnNlID0gYXJndW1lbnRzO1xuXG5cdFx0XHRzZWxmLmh0bWwoIHNlbGVjdG9yID9cblxuXHRcdFx0XHQvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXZcblx0XHRcdFx0Ly8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElFICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzXG5cdFx0XHRcdGpRdWVyeSggXCI8ZGl2PlwiICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0XG5cdFx0XHRcdHJlc3BvbnNlVGV4dCApO1xuXG5cdFx0Ly8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImRhdGFcIiwgXCJzdGF0dXNcIiwgXCJqcVhIUlwiXG5cdFx0Ly8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLlxuXHRcdC8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgXCJqcVhIUlwiLCBcInN0YXR1c1wiLCBcImVycm9yXCJcblx0XHR9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHtcblx0XHRcdHNlbGYuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiBqUXVlcnkuZ3JlcCggalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiBlbGVtID09PSBmbi5lbGVtO1xuXHR9ICkubGVuZ3RoO1xufTtcblxuXG5cblxualF1ZXJ5Lm9mZnNldCA9IHtcblx0c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHtcblx0XHR2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLFxuXHRcdFx0cG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSxcblx0XHRcdGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSxcblx0XHRcdHByb3BzID0ge307XG5cblx0XHQvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXG5cdFx0aWYgKCBwb3NpdGlvbiA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdFx0fVxuXG5cdFx0Y3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTtcblx0XHRjdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCBcInRvcFwiICk7XG5cdFx0Y3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwibGVmdFwiICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSBcImFic29sdXRlXCIgfHwgcG9zaXRpb24gPT09IFwiZml4ZWRcIiApICYmXG5cdFx0XHQoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCBcImF1dG9cIiApID4gLTE7XG5cblx0XHQvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlclxuXHRcdC8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZFxuXHRcdGlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7XG5cdFx0XHRjdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTtcblx0XHRcdGN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDtcblx0XHRcdGN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1RvcCApIHx8IDA7XG5cdFx0XHRjdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7XG5cdFx0fVxuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7XG5cblx0XHRcdC8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KVxuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgalF1ZXJ5LmV4dGVuZCgge30sIGN1ck9mZnNldCApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0O1xuXHRcdH1cblxuXHRcdGlmICggXCJ1c2luZ1wiIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCB0eXBlb2YgcHJvcHMudG9wID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHRwcm9wcy50b3AgKz0gXCJweFwiO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCB0eXBlb2YgcHJvcHMubGVmdCA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0cHJvcHMubGVmdCArPSBcInB4XCI7XG5cdFx0XHR9XG5cdFx0XHRjdXJFbGVtLmNzcyggcHJvcHMgKTtcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHQvLyBvZmZzZXQoKSByZWxhdGVzIGFuIGVsZW1lbnQncyBib3JkZXIgYm94IHRvIHRoZSBkb2N1bWVudCBvcmlnaW5cblx0b2Zmc2V0OiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHRcdC8vIFByZXNlcnZlIGNoYWluaW5nIGZvciBzZXR0ZXJcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0dGhpcyA6XG5cdFx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTtcblx0XHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHZhciByZWN0LCB3aW4sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4gemVyb3MgZm9yIGRpc2Nvbm5lY3RlZCBhbmQgaGlkZGVuIChkaXNwbGF5OiBub25lKSBlbGVtZW50cyAoZ2gtMjMxMClcblx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0XHQvLyBSdW5uaW5nIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBvbiBhXG5cdFx0Ly8gZGlzY29ubmVjdGVkIG5vZGUgaW4gSUUgdGhyb3dzIGFuIGVycm9yXG5cdFx0aWYgKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9O1xuXHRcdH1cblxuXHRcdC8vIEdldCBkb2N1bWVudC1yZWxhdGl2ZSBwb3NpdGlvbiBieSBhZGRpbmcgdmlld3BvcnQgc2Nyb2xsIHRvIHZpZXdwb3J0LXJlbGF0aXZlIGdCQ1Jcblx0XHRyZWN0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHR3aW4gPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRvcDogcmVjdC50b3AgKyB3aW4ucGFnZVlPZmZzZXQsXG5cdFx0XHRsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXRcblx0XHR9O1xuXHR9LFxuXG5cdC8vIHBvc2l0aW9uKCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgbWFyZ2luIGJveCB0byBpdHMgb2Zmc2V0IHBhcmVudCdzIHBhZGRpbmcgYm94XG5cdC8vIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGJlaGF2aW9yIG9mIENTUyBhYnNvbHV0ZSBwb3NpdGlvbmluZ1xuXHRwb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAhdGhpc1sgMCBdICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBvZmZzZXRQYXJlbnQsIG9mZnNldCwgZG9jLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdHBhcmVudE9mZnNldCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XG5cblx0XHQvLyBwb3NpdGlvbjpmaXhlZCBlbGVtZW50cyBhcmUgb2Zmc2V0IGZyb20gdGhlIHZpZXdwb3J0LCB3aGljaCBpdHNlbGYgYWx3YXlzIGhhcyB6ZXJvIG9mZnNldFxuXHRcdGlmICggalF1ZXJ5LmNzcyggZWxlbSwgXCJwb3NpdGlvblwiICkgPT09IFwiZml4ZWRcIiApIHtcblxuXHRcdFx0Ly8gQXNzdW1lIHBvc2l0aW9uOmZpeGVkIGltcGxpZXMgYXZhaWxhYmlsaXR5IG9mIGdldEJvdW5kaW5nQ2xpZW50UmVjdFxuXHRcdFx0b2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRvZmZzZXQgPSB0aGlzLm9mZnNldCgpO1xuXG5cdFx0XHQvLyBBY2NvdW50IGZvciB0aGUgKnJlYWwqIG9mZnNldCBwYXJlbnQsIHdoaWNoIGNhbiBiZSB0aGUgZG9jdW1lbnQgb3IgaXRzIHJvb3QgZWxlbWVudFxuXHRcdFx0Ly8gd2hlbiBhIHN0YXRpY2FsbHkgcG9zaXRpb25lZCBlbGVtZW50IGlzIGlkZW50aWZpZWRcblx0XHRcdGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDtcblx0XHRcdG9mZnNldFBhcmVudCA9IGVsZW0ub2Zmc2V0UGFyZW50IHx8IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJlxuXHRcdFx0XHQoIG9mZnNldFBhcmVudCA9PT0gZG9jLmJvZHkgfHwgb2Zmc2V0UGFyZW50ID09PSBkb2MuZG9jdW1lbnRFbGVtZW50ICkgJiZcblx0XHRcdFx0alF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcInBvc2l0aW9uXCIgKSA9PT0gXCJzdGF0aWNcIiApIHtcblxuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdGlmICggb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudCAhPT0gZWxlbSAmJiBvZmZzZXRQYXJlbnQubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgYm9yZGVycyBpbnRvIGl0cyBvZmZzZXQsIHNpbmNlIHRoZXkgYXJlIG91dHNpZGUgaXRzIGNvbnRlbnQgb3JpZ2luXG5cdFx0XHRcdHBhcmVudE9mZnNldCA9IGpRdWVyeSggb2Zmc2V0UGFyZW50ICkub2Zmc2V0KCk7XG5cdFx0XHRcdHBhcmVudE9mZnNldC50b3AgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcImJvcmRlclRvcFdpZHRoXCIsIHRydWUgKTtcblx0XHRcdFx0cGFyZW50T2Zmc2V0LmxlZnQgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcImJvcmRlckxlZnRXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2luc1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IG9mZnNldC50b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwgXCJtYXJnaW5Ub3BcIiwgdHJ1ZSApLFxuXHRcdFx0bGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luTGVmdFwiLCB0cnVlIClcblx0XHR9O1xuXHR9LFxuXG5cdC8vIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGRvY3VtZW50RWxlbWVudCBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuXHQvLyAxKSBGb3IgdGhlIGVsZW1lbnQgaW5zaWRlIHRoZSBpZnJhbWUgd2l0aG91dCBvZmZzZXRQYXJlbnQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuXG5cdC8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvd1xuXHQvLyAyKSBGb3IgdGhlIGhpZGRlbiBvciBkZXRhY2hlZCBlbGVtZW50XG5cdC8vIDMpIEZvciBib2R5IG9yIGh0bWwgZWxlbWVudCwgaS5lLiBpbiBjYXNlIG9mIHRoZSBodG1sIG5vZGUgLSBpdCB3aWxsIHJldHVybiBpdHNlbGZcblx0Ly9cblx0Ly8gYnV0IHRob3NlIGV4Y2VwdGlvbnMgd2VyZSBuZXZlciBwcmVzZW50ZWQgYXMgYSByZWFsIGxpZmUgdXNlLWNhc2VzXG5cdC8vIGFuZCBtaWdodCBiZSBjb25zaWRlcmVkIGFzIG1vcmUgcHJlZmVyYWJsZSByZXN1bHRzLlxuXHQvL1xuXHQvLyBUaGlzIGxvZ2ljLCBob3dldmVyLCBpcyBub3QgZ3VhcmFudGVlZCBhbmQgY2FuIGNoYW5nZSBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZVxuXHRvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQ7XG5cblx0XHRcdHdoaWxlICggb2Zmc2V0UGFyZW50ICYmIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSB7XG5cdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnRFbGVtZW50O1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG4vLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHNcbmpRdWVyeS5lYWNoKCB7IHNjcm9sbExlZnQ6IFwicGFnZVhPZmZzZXRcIiwgc2Nyb2xsVG9wOiBcInBhZ2VZT2Zmc2V0XCIgfSwgZnVuY3Rpb24oIG1ldGhvZCwgcHJvcCApIHtcblx0dmFyIHRvcCA9IFwicGFnZVlPZmZzZXRcIiA9PT0gcHJvcDtcblxuXHRqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7XG5cblx0XHRcdC8vIENvYWxlc2NlIGRvY3VtZW50cyBhbmQgd2luZG93c1xuXHRcdFx0dmFyIHdpbjtcblx0XHRcdGlmICggaXNXaW5kb3coIGVsZW0gKSApIHtcblx0XHRcdFx0d2luID0gZWxlbTtcblx0XHRcdH0gZWxzZSBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHdpbiA9IGVsZW0uZGVmYXVsdFZpZXc7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiB3aW4gPyB3aW5bIHByb3AgXSA6IGVsZW1bIG1ldGhvZCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHdpbiApIHtcblx0XHRcdFx0d2luLnNjcm9sbFRvKFxuXHRcdFx0XHRcdCF0b3AgPyB2YWwgOiB3aW4ucGFnZVhPZmZzZXQsXG5cdFx0XHRcdFx0dG9wID8gdmFsIDogd2luLnBhZ2VZT2Zmc2V0XG5cdFx0XHRcdCk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1bIG1ldGhvZCBdID0gdmFsO1xuXHRcdFx0fVxuXHRcdH0sIG1ldGhvZCwgdmFsLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH07XG59ICk7XG5cbi8vIFN1cHBvcnQ6IFNhZmFyaSA8PTcgLSA5LjEsIENocm9tZSA8PTM3IC0gNDlcbi8vIEFkZCB0aGUgdG9wL2xlZnQgY3NzSG9va3MgdXNpbmcgalF1ZXJ5LmZuLnBvc2l0aW9uXG4vLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODRcbi8vIEJsaW5rIGJ1ZzogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NTg5MzQ3XG4vLyBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNwZWNpZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0O1xuLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmVcbmpRdWVyeS5lYWNoKCBbIFwidG9wXCIsIFwibGVmdFwiIF0sIGZ1bmN0aW9uKCBfaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sXG5cdFx0ZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7XG5cblx0XHQvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGhcblx0XHRqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHtcblx0XHRcdHZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJnaW4gIT09IFwiYm9vbGVhblwiICksXG5cdFx0XHRcdGV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gXCJtYXJnaW5cIiA6IFwiYm9yZGVyXCIgKTtcblxuXHRcdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgZG9jO1xuXG5cdFx0XHRcdGlmICggaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0XHRcdC8vICQoIHdpbmRvdyApLm91dGVyV2lkdGgvSGVpZ2h0IHJldHVybiB3L2ggaW5jbHVkaW5nIHNjcm9sbGJhcnMgKGdoLTE3MjkpXG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmNOYW1lLmluZGV4T2YoIFwib3V0ZXJcIiApID09PSAwID9cblx0XHRcdFx0XHRcdGVsZW1bIFwiaW5uZXJcIiArIG5hbWUgXSA6XG5cdFx0XHRcdFx0XHRlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgXCJjbGllbnRcIiArIG5hbWUgXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHRcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0XHRcdFx0Ly8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLFxuXHRcdFx0XHRcdC8vIHdoaWNoZXZlciBpcyBncmVhdGVzdFxuXHRcdFx0XHRcdHJldHVybiBNYXRoLm1heChcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJzY3JvbGxcIiArIG5hbWUgXSwgZG9jWyBcInNjcm9sbFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcIm9mZnNldFwiICsgbmFtZSBdLCBkb2NbIFwib2Zmc2V0XCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRkb2NbIFwiY2xpZW50XCIgKyBuYW1lIF1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXG5cdFx0XHRcdFx0Ly8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOlxuXG5cdFx0XHRcdFx0Ly8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudFxuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7XG5cdFx0XHR9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApO1xuXHRcdH07XG5cdH0gKTtcbn0gKTtcblxuXG5qUXVlcnkuZWFjaCggW1xuXHRcImFqYXhTdGFydFwiLFxuXHRcImFqYXhTdG9wXCIsXG5cdFwiYWpheENvbXBsZXRlXCIsXG5cdFwiYWpheEVycm9yXCIsXG5cdFwiYWpheFN1Y2Nlc3NcIixcblx0XCJhamF4U2VuZFwiXG5dLCBmdW5jdGlvbiggX2ksIHR5cGUgKSB7XG5cdGpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApO1xuXHR9O1xufSApO1xuXG5cblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0YmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApO1xuXHR9LFxuXG5cdGRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHtcblxuXHRcdC8vICggbmFtZXNwYWNlICkgb3IgKCBzZWxlY3RvciwgdHlwZXMgWywgZm5dIClcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/XG5cdFx0XHR0aGlzLm9mZiggc2VsZWN0b3IsIFwiKipcIiApIDpcblx0XHRcdHRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgXCIqKlwiLCBmbiApO1xuXHR9LFxuXG5cdGhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHtcblx0XHRyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggKCBcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudVwiICkuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBfaSwgbmFtZSApIHtcblxuXHRcdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdFx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7XG5cdFx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDAgP1xuXHRcdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdFx0dGhpcy50cmlnZ2VyKCBuYW1lICk7XG5cdFx0fTtcblx0fSApO1xuXG5cblxuXG4vLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHlcbi8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUFxudmFyIHJ0cmltID0gL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nO1xuXG4vLyBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0LCBvcHRpb25hbGx5IHBhcnRpYWxseSBhcHBseWluZyBhbnlcbi8vIGFyZ3VtZW50cy5cbi8vIGpRdWVyeS5wcm94eSBpcyBkZXByZWNhdGVkIHRvIHByb21vdGUgc3RhbmRhcmRzIChzcGVjaWZpY2FsbHkgRnVuY3Rpb24jYmluZClcbi8vIEhvd2V2ZXIsIGl0IGlzIG5vdCBzbGF0ZWQgZm9yIHJlbW92YWwgYW55IHRpbWUgc29vblxualF1ZXJ5LnByb3h5ID0gZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkge1xuXHR2YXIgdG1wLCBhcmdzLCBwcm94eTtcblxuXHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcInN0cmluZ1wiICkge1xuXHRcdHRtcCA9IGZuWyBjb250ZXh0IF07XG5cdFx0Y29udGV4dCA9IGZuO1xuXHRcdGZuID0gdG1wO1xuXHR9XG5cblx0Ly8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWNcblx0Ly8gdGhpcyB0aHJvd3MgYSBUeXBlRXJyb3IsIGJ1dCB3ZSB3aWxsIGp1c3QgcmV0dXJuIHVuZGVmaW5lZC5cblx0aWYgKCAhaXNGdW5jdGlvbiggZm4gKSApIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Ly8gU2ltdWxhdGVkIGJpbmRcblx0YXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMiApO1xuXHRwcm94eSA9IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBmbi5hcHBseSggY29udGV4dCB8fCB0aGlzLCBhcmdzLmNvbmNhdCggc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKSApO1xuXHR9O1xuXG5cdC8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZFxuXHRwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKztcblxuXHRyZXR1cm4gcHJveHk7XG59O1xuXG5qUXVlcnkuaG9sZFJlYWR5ID0gZnVuY3Rpb24oIGhvbGQgKSB7XG5cdGlmICggaG9sZCApIHtcblx0XHRqUXVlcnkucmVhZHlXYWl0Kys7XG5cdH0gZWxzZSB7XG5cdFx0alF1ZXJ5LnJlYWR5KCB0cnVlICk7XG5cdH1cbn07XG5qUXVlcnkuaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5qUXVlcnkucGFyc2VKU09OID0gSlNPTi5wYXJzZTtcbmpRdWVyeS5ub2RlTmFtZSA9IG5vZGVOYW1lO1xualF1ZXJ5LmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xualF1ZXJ5LmlzV2luZG93ID0gaXNXaW5kb3c7XG5qUXVlcnkuY2FtZWxDYXNlID0gY2FtZWxDYXNlO1xualF1ZXJ5LnR5cGUgPSB0b1R5cGU7XG5cbmpRdWVyeS5ub3cgPSBEYXRlLm5vdztcblxualF1ZXJ5LmlzTnVtZXJpYyA9IGZ1bmN0aW9uKCBvYmogKSB7XG5cblx0Ly8gQXMgb2YgalF1ZXJ5IDMuMCwgaXNOdW1lcmljIGlzIGxpbWl0ZWQgdG9cblx0Ly8gc3RyaW5ncyBhbmQgbnVtYmVycyAocHJpbWl0aXZlcyBvciBvYmplY3RzKVxuXHQvLyB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIGZpbml0ZSBudW1iZXJzIChnaC0yNjYyKVxuXHR2YXIgdHlwZSA9IGpRdWVyeS50eXBlKCBvYmogKTtcblx0cmV0dXJuICggdHlwZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlID09PSBcInN0cmluZ1wiICkgJiZcblxuXHRcdC8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzIChcIlwiKVxuXHRcdC8vIC4uLmJ1dCBtaXNpbnRlcnByZXRzIGxlYWRpbmctbnVtYmVyIHN0cmluZ3MsIHBhcnRpY3VsYXJseSBoZXggbGl0ZXJhbHMgKFwiMHguLi5cIilcblx0XHQvLyBzdWJ0cmFjdGlvbiBmb3JjZXMgaW5maW5pdGllcyB0byBOYU5cblx0XHQhaXNOYU4oIG9iaiAtIHBhcnNlRmxvYXQoIG9iaiApICk7XG59O1xuXG5qUXVlcnkudHJpbSA9IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRyZXR1cm4gdGV4dCA9PSBudWxsID9cblx0XHRcIlwiIDpcblx0XHQoIHRleHQgKyBcIlwiICkucmVwbGFjZSggcnRyaW0sIFwiXCIgKTtcbn07XG5cblxuXG4vLyBSZWdpc3RlciBhcyBhIG5hbWVkIEFNRCBtb2R1bGUsIHNpbmNlIGpRdWVyeSBjYW4gYmUgY29uY2F0ZW5hdGVkIHdpdGggb3RoZXJcbi8vIGZpbGVzIHRoYXQgbWF5IHVzZSBkZWZpbmUsIGJ1dCBub3QgdmlhIGEgcHJvcGVyIGNvbmNhdGVuYXRpb24gc2NyaXB0IHRoYXRcbi8vIHVuZGVyc3RhbmRzIGFub255bW91cyBBTUQgbW9kdWxlcy4gQSBuYW1lZCBBTUQgaXMgc2FmZXN0IGFuZCBtb3N0IHJvYnVzdFxuLy8gd2F5IHRvIHJlZ2lzdGVyLiBMb3dlcmNhc2UganF1ZXJ5IGlzIHVzZWQgYmVjYXVzZSBBTUQgbW9kdWxlIG5hbWVzIGFyZVxuLy8gZGVyaXZlZCBmcm9tIGZpbGUgbmFtZXMsIGFuZCBqUXVlcnkgaXMgbm9ybWFsbHkgZGVsaXZlcmVkIGluIGEgbG93ZXJjYXNlXG4vLyBmaWxlIG5hbWUuIERvIHRoaXMgYWZ0ZXIgY3JlYXRpbmcgdGhlIGdsb2JhbCBzbyB0aGF0IGlmIGFuIEFNRCBtb2R1bGUgd2FudHNcbi8vIHRvIGNhbGwgbm9Db25mbGljdCB0byBoaWRlIHRoaXMgdmVyc2lvbiBvZiBqUXVlcnksIGl0IHdpbGwgd29yay5cblxuLy8gTm90ZSB0aGF0IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGpRdWVyeSBzaG91bGRcbi8vIGRlY2xhcmUgdGhlbXNlbHZlcyBhcyBhbm9ueW1vdXMgbW9kdWxlcywgYW5kIGF2b2lkIHNldHRpbmcgYSBnbG9iYWwgaWYgYW5cbi8vIEFNRCBsb2FkZXIgaXMgcHJlc2VudC4galF1ZXJ5IGlzIGEgc3BlY2lhbCBjYXNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvd2lraS9VcGRhdGluZy1leGlzdGluZy1saWJyYXJpZXMjd2lraS1hbm9uXG5cbmlmICggdHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQgKSB7XG5cdGRlZmluZSggXCJqcXVlcnlcIiwgW10sIGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnk7XG5cdH0gKTtcbn1cblxuXG5cblxudmFyXG5cblx0Ly8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG5cdF9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LFxuXG5cdC8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG5cdF8kID0gd2luZG93LiQ7XG5cbmpRdWVyeS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oIGRlZXAgKSB7XG5cdGlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHtcblx0XHR3aW5kb3cuJCA9IF8kO1xuXHR9XG5cblx0aWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSApIHtcblx0XHR3aW5kb3cualF1ZXJ5ID0gX2pRdWVyeTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnk7XG59O1xuXG4vLyBFeHBvc2UgalF1ZXJ5IGFuZCAkIGlkZW50aWZpZXJzLCBldmVuIGluIEFNRFxuLy8gKCM3MTAyI2NvbW1lbnQ6MTAsIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNTU3KVxuLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KVxuaWYgKCB0eXBlb2Ygbm9HbG9iYWwgPT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdHdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTtcbn1cblxuXG5cblxucmV0dXJuIGpRdWVyeTtcbn0gKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvc2Fzcy9hcHAuc2Nzcz80NzVmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSIsImZpbGUiOiIuL3Jlc291cmNlcy9zYXNzL2FwcC5zY3NzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQge307Il0sInNvdXJjZVJvb3QiOiIifQ==\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcG9wcGVyLmpzL2Rpc3QvZXNtL3BvcHBlci5qcz9mMGJkIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLGtDQUFrQztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QixZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsSUFBSTtBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTztBQUNyQixjQUFjLE9BQU87QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsU0FBUztBQUN2QjtBQUNBLGNBQWMsT0FBTztBQUNyQjtBQUNBLGNBQWMsT0FBTztBQUNyQjtBQUNBOzs7QUFHQSx5REFBeUQscUJBQU07QUFDL0Q7QUFDQTs7QUFFQSxpRUFBZSxNQUFNLEVBQUM7QUFDdEIiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcG9wcGVyLmpzL2Rpc3QvZXNtL3BvcHBlci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiFcbiAqIEBmaWxlT3ZlcnZpZXcgS2lja2FzcyBsaWJyYXJ5IHRvIGNyZWF0ZSBhbmQgcGxhY2UgcG9wcGVycyBuZWFyIHRoZWlyIHJlZmVyZW5jZSBlbGVtZW50cy5cbiAqIEB2ZXJzaW9uIDEuMTYuMVxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNiBGZWRlcmljbyBaaXZvbG8gYW5kIGNvbnRyaWJ1dG9yc1xuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cbnZhciBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnO1xuXG52YXIgdGltZW91dER1cmF0aW9uID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbG9uZ2VyVGltZW91dEJyb3dzZXJzID0gWydFZGdlJywgJ1RyaWRlbnQnLCAnRmlyZWZveCddO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmdlclRpbWVvdXRCcm93c2Vycy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChpc0Jyb3dzZXIgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKGxvbmdlclRpbWVvdXRCcm93c2Vyc1tpXSkgPj0gMCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufSgpO1xuXG5mdW5jdGlvbiBtaWNyb3Rhc2tEZWJvdW5jZShmbikge1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNhbGxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYWxsZWQgPSB0cnVlO1xuICAgIHdpbmRvdy5Qcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxlZCA9IGZhbHNlO1xuICAgICAgZm4oKTtcbiAgICB9KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGFza0RlYm91bmNlKGZuKSB7XG4gIHZhciBzY2hlZHVsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXNjaGVkdWxlZCkge1xuICAgICAgc2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBzY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0sIHRpbWVvdXREdXJhdGlvbik7XG4gICAgfVxuICB9O1xufVxuXG52YXIgc3VwcG9ydHNNaWNyb1Rhc2tzID0gaXNCcm93c2VyICYmIHdpbmRvdy5Qcm9taXNlO1xuXG4vKipcbiogQ3JlYXRlIGEgZGVib3VuY2VkIHZlcnNpb24gb2YgYSBtZXRob2QsIHRoYXQncyBhc3luY2hyb25vdXNseSBkZWZlcnJlZFxuKiBidXQgY2FsbGVkIGluIHRoZSBtaW5pbXVtIHRpbWUgcG9zc2libGUuXG4qXG4qIEBtZXRob2RcbiogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuKiBAYXJndW1lbnQge0Z1bmN0aW9ufSBmblxuKiBAcmV0dXJucyB7RnVuY3Rpb259XG4qL1xudmFyIGRlYm91bmNlID0gc3VwcG9ydHNNaWNyb1Rhc2tzID8gbWljcm90YXNrRGVib3VuY2UgOiB0YXNrRGVib3VuY2U7XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb25cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7QW55fSBmdW5jdGlvblRvQ2hlY2sgLSB2YXJpYWJsZSB0byBjaGVja1xuICogQHJldHVybnMge0Jvb2xlYW59IGFuc3dlciB0bzogaXMgYSBmdW5jdGlvbj9cbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbihmdW5jdGlvblRvQ2hlY2spIHtcbiAgdmFyIGdldFR5cGUgPSB7fTtcbiAgcmV0dXJuIGZ1bmN0aW9uVG9DaGVjayAmJiBnZXRUeXBlLnRvU3RyaW5nLmNhbGwoZnVuY3Rpb25Ub0NoZWNrKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn1cblxuLyoqXG4gKiBHZXQgQ1NTIGNvbXB1dGVkIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VlbWVudH0gZWxlbWVudFxuICogQGFyZ3VtZW50IHtTdHJpbmd9IHByb3BlcnR5XG4gKi9cbmZ1bmN0aW9uIGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShlbGVtZW50LCBwcm9wZXJ0eSkge1xuICBpZiAoZWxlbWVudC5ub2RlVHlwZSAhPT0gMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICAvLyBOT1RFOiAxIERPTSBhY2Nlc3MgaGVyZVxuICB2YXIgd2luZG93ID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICB2YXIgY3NzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCk7XG4gIHJldHVybiBwcm9wZXJ0eSA/IGNzc1twcm9wZXJ0eV0gOiBjc3M7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGFyZW50Tm9kZSBvciB0aGUgaG9zdCBvZiB0aGUgZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7RWxlbWVudH0gcGFyZW50XG4gKi9cbmZ1bmN0aW9uIGdldFBhcmVudE5vZGUoZWxlbWVudCkge1xuICBpZiAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIGVsZW1lbnQucGFyZW50Tm9kZSB8fCBlbGVtZW50Lmhvc3Q7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2Nyb2xsaW5nIHBhcmVudCBvZiB0aGUgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7RWxlbWVudH0gc2Nyb2xsIHBhcmVudFxuICovXG5mdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudCkge1xuICAvLyBSZXR1cm4gYm9keSwgYGdldFNjcm9sbGAgd2lsbCB0YWtlIGNhcmUgdG8gZ2V0IHRoZSBjb3JyZWN0IGBzY3JvbGxUb3BgIGZyb20gaXRcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7XG4gIH1cblxuICBzd2l0Y2ggKGVsZW1lbnQubm9kZU5hbWUpIHtcbiAgICBjYXNlICdIVE1MJzpcbiAgICBjYXNlICdCT0RZJzpcbiAgICAgIHJldHVybiBlbGVtZW50Lm93bmVyRG9jdW1lbnQuYm9keTtcbiAgICBjYXNlICcjZG9jdW1lbnQnOlxuICAgICAgcmV0dXJuIGVsZW1lbnQuYm9keTtcbiAgfVxuXG4gIC8vIEZpcmVmb3ggd2FudCB1cyB0byBjaGVjayBgLXhgIGFuZCBgLXlgIHZhcmlhdGlvbnMgYXMgd2VsbFxuXG4gIHZhciBfZ2V0U3R5bGVDb21wdXRlZFByb3AgPSBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkoZWxlbWVudCksXG4gICAgICBvdmVyZmxvdyA9IF9nZXRTdHlsZUNvbXB1dGVkUHJvcC5vdmVyZmxvdyxcbiAgICAgIG92ZXJmbG93WCA9IF9nZXRTdHlsZUNvbXB1dGVkUHJvcC5vdmVyZmxvd1gsXG4gICAgICBvdmVyZmxvd1kgPSBfZ2V0U3R5bGVDb21wdXRlZFByb3Aub3ZlcmZsb3dZO1xuXG4gIGlmICgvKGF1dG98c2Nyb2xsfG92ZXJsYXkpLy50ZXN0KG92ZXJmbG93ICsgb3ZlcmZsb3dZICsgb3ZlcmZsb3dYKSkge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcmV0dXJuIGdldFNjcm9sbFBhcmVudChnZXRQYXJlbnROb2RlKGVsZW1lbnQpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWZlcmVuY2Ugbm9kZSBvZiB0aGUgcmVmZXJlbmNlIG9iamVjdCwgb3IgdGhlIHJlZmVyZW5jZSBvYmplY3QgaXRzZWxmLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gcmVmZXJlbmNlIC0gdGhlIHJlZmVyZW5jZSBlbGVtZW50ICh0aGUgcG9wcGVyIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhpcylcbiAqIEByZXR1cm5zIHtFbGVtZW50fSBwYXJlbnRcbiAqL1xuZnVuY3Rpb24gZ2V0UmVmZXJlbmNlTm9kZShyZWZlcmVuY2UpIHtcbiAgcmV0dXJuIHJlZmVyZW5jZSAmJiByZWZlcmVuY2UucmVmZXJlbmNlTm9kZSA/IHJlZmVyZW5jZS5yZWZlcmVuY2VOb2RlIDogcmVmZXJlbmNlO1xufVxuXG52YXIgaXNJRTExID0gaXNCcm93c2VyICYmICEhKHdpbmRvdy5NU0lucHV0TWV0aG9kQ29udGV4dCAmJiBkb2N1bWVudC5kb2N1bWVudE1vZGUpO1xudmFyIGlzSUUxMCA9IGlzQnJvd3NlciAmJiAvTVNJRSAxMC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBicm93c2VyIGlzIEludGVybmV0IEV4cGxvcmVyXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge051bWJlcn0gdmVyc2lvbiB0byBjaGVja1xuICogQHJldHVybnMge0Jvb2xlYW59IGlzSUVcbiAqL1xuZnVuY3Rpb24gaXNJRSh2ZXJzaW9uKSB7XG4gIGlmICh2ZXJzaW9uID09PSAxMSkge1xuICAgIHJldHVybiBpc0lFMTE7XG4gIH1cbiAgaWYgKHZlcnNpb24gPT09IDEwKSB7XG4gICAgcmV0dXJuIGlzSUUxMDtcbiAgfVxuICByZXR1cm4gaXNJRTExIHx8IGlzSUUxMDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvZmZzZXQgcGFyZW50IG9mIHRoZSBnaXZlbiBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtFbGVtZW50fSBvZmZzZXQgcGFyZW50XG4gKi9cbmZ1bmN0aW9uIGdldE9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cblxuICB2YXIgbm9PZmZzZXRQYXJlbnQgPSBpc0lFKDEwKSA/IGRvY3VtZW50LmJvZHkgOiBudWxsO1xuXG4gIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlXG4gIHZhciBvZmZzZXRQYXJlbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudCB8fCBudWxsO1xuICAvLyBTa2lwIGhpZGRlbiBlbGVtZW50cyB3aGljaCBkb24ndCBoYXZlIGFuIG9mZnNldFBhcmVudFxuICB3aGlsZSAob2Zmc2V0UGFyZW50ID09PSBub09mZnNldFBhcmVudCAmJiBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZykge1xuICAgIG9mZnNldFBhcmVudCA9IChlbGVtZW50ID0gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpLm9mZnNldFBhcmVudDtcbiAgfVxuXG4gIHZhciBub2RlTmFtZSA9IG9mZnNldFBhcmVudCAmJiBvZmZzZXRQYXJlbnQubm9kZU5hbWU7XG5cbiAgaWYgKCFub2RlTmFtZSB8fCBub2RlTmFtZSA9PT0gJ0JPRFknIHx8IG5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICByZXR1cm4gZWxlbWVudCA/IGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cblxuICAvLyAub2Zmc2V0UGFyZW50IHdpbGwgcmV0dXJuIHRoZSBjbG9zZXN0IFRILCBURCBvciBUQUJMRSBpbiBjYXNlXG4gIC8vIG5vIG9mZnNldFBhcmVudCBpcyBwcmVzZW50LCBJIGhhdGUgdGhpcyBqb2IuLi5cbiAgaWYgKFsnVEgnLCAnVEQnLCAnVEFCTEUnXS5pbmRleE9mKG9mZnNldFBhcmVudC5ub2RlTmFtZSkgIT09IC0xICYmIGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShvZmZzZXRQYXJlbnQsICdwb3NpdGlvbicpID09PSAnc3RhdGljJykge1xuICAgIHJldHVybiBnZXRPZmZzZXRQYXJlbnQob2Zmc2V0UGFyZW50KTtcbiAgfVxuXG4gIHJldHVybiBvZmZzZXRQYXJlbnQ7XG59XG5cbmZ1bmN0aW9uIGlzT2Zmc2V0Q29udGFpbmVyKGVsZW1lbnQpIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZTtcblxuICBpZiAobm9kZU5hbWUgPT09ICdCT0RZJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gbm9kZU5hbWUgPT09ICdIVE1MJyB8fCBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCkgPT09IGVsZW1lbnQ7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIHJvb3Qgbm9kZSAoZG9jdW1lbnQsIHNoYWRvd0RPTSByb290KSBvZiB0aGUgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBub2RlXG4gKiBAcmV0dXJucyB7RWxlbWVudH0gcm9vdCBub2RlXG4gKi9cbmZ1bmN0aW9uIGdldFJvb3Qobm9kZSkge1xuICBpZiAobm9kZS5wYXJlbnROb2RlICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGdldFJvb3Qobm9kZS5wYXJlbnROb2RlKTtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBvZmZzZXQgcGFyZW50IGNvbW1vbiB0byB0aGUgdHdvIHByb3ZpZGVkIG5vZGVzXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnQxXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnQyXG4gKiBAcmV0dXJucyB7RWxlbWVudH0gY29tbW9uIG9mZnNldCBwYXJlbnRcbiAqL1xuZnVuY3Rpb24gZmluZENvbW1vbk9mZnNldFBhcmVudChlbGVtZW50MSwgZWxlbWVudDIpIHtcbiAgLy8gVGhpcyBjaGVjayBpcyBuZWVkZWQgdG8gYXZvaWQgZXJyb3JzIGluIGNhc2Ugb25lIG9mIHRoZSBlbGVtZW50cyBpc24ndCBkZWZpbmVkIGZvciBhbnkgcmVhc29uXG4gIGlmICghZWxlbWVudDEgfHwgIWVsZW1lbnQxLm5vZGVUeXBlIHx8ICFlbGVtZW50MiB8fCAhZWxlbWVudDIubm9kZVR5cGUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG5cbiAgLy8gSGVyZSB3ZSBtYWtlIHN1cmUgdG8gZ2l2ZSBhcyBcInN0YXJ0XCIgdGhlIGVsZW1lbnQgdGhhdCBjb21lcyBmaXJzdCBpbiB0aGUgRE9NXG4gIHZhciBvcmRlciA9IGVsZW1lbnQxLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGVsZW1lbnQyKSAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HO1xuICB2YXIgc3RhcnQgPSBvcmRlciA/IGVsZW1lbnQxIDogZWxlbWVudDI7XG4gIHZhciBlbmQgPSBvcmRlciA/IGVsZW1lbnQyIDogZWxlbWVudDE7XG5cbiAgLy8gR2V0IGNvbW1vbiBhbmNlc3RvciBjb250YWluZXJcbiAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgcmFuZ2Uuc2V0U3RhcnQoc3RhcnQsIDApO1xuICByYW5nZS5zZXRFbmQoZW5kLCAwKTtcbiAgdmFyIGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgLy8gQm90aCBub2RlcyBhcmUgaW5zaWRlICNkb2N1bWVudFxuXG4gIGlmIChlbGVtZW50MSAhPT0gY29tbW9uQW5jZXN0b3JDb250YWluZXIgJiYgZWxlbWVudDIgIT09IGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIHx8IHN0YXJ0LmNvbnRhaW5zKGVuZCkpIHtcbiAgICBpZiAoaXNPZmZzZXRDb250YWluZXIoY29tbW9uQW5jZXN0b3JDb250YWluZXIpKSB7XG4gICAgICByZXR1cm4gY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldE9mZnNldFBhcmVudChjb21tb25BbmNlc3RvckNvbnRhaW5lcik7XG4gIH1cblxuICAvLyBvbmUgb2YgdGhlIG5vZGVzIGlzIGluc2lkZSBzaGFkb3dET00sIGZpbmQgd2hpY2ggb25lXG4gIHZhciBlbGVtZW50MXJvb3QgPSBnZXRSb290KGVsZW1lbnQxKTtcbiAgaWYgKGVsZW1lbnQxcm9vdC5ob3N0KSB7XG4gICAgcmV0dXJuIGZpbmRDb21tb25PZmZzZXRQYXJlbnQoZWxlbWVudDFyb290Lmhvc3QsIGVsZW1lbnQyKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmluZENvbW1vbk9mZnNldFBhcmVudChlbGVtZW50MSwgZ2V0Um9vdChlbGVtZW50MikuaG9zdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzY3JvbGwgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQgaW4gdGhlIGdpdmVuIHNpZGUgKHRvcCBhbmQgbGVmdClcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQGFyZ3VtZW50IHtTdHJpbmd9IHNpZGUgYHRvcGAgb3IgYGxlZnRgXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBhbW91bnQgb2Ygc2Nyb2xsZWQgcGl4ZWxzXG4gKi9cbmZ1bmN0aW9uIGdldFNjcm9sbChlbGVtZW50KSB7XG4gIHZhciBzaWRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAndG9wJztcblxuICB2YXIgdXBwZXJTaWRlID0gc2lkZSA9PT0gJ3RvcCcgPyAnc2Nyb2xsVG9wJyA6ICdzY3JvbGxMZWZ0JztcbiAgdmFyIG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZTtcblxuICBpZiAobm9kZU5hbWUgPT09ICdCT0RZJyB8fCBub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgdmFyIGh0bWwgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIHZhciBzY3JvbGxpbmdFbGVtZW50ID0gZWxlbWVudC5vd25lckRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQgfHwgaHRtbDtcbiAgICByZXR1cm4gc2Nyb2xsaW5nRWxlbWVudFt1cHBlclNpZGVdO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRbdXBwZXJTaWRlXTtcbn1cblxuLypcbiAqIFN1bSBvciBzdWJ0cmFjdCB0aGUgZWxlbWVudCBzY3JvbGwgdmFsdWVzIChsZWZ0IGFuZCB0b3ApIGZyb20gYSBnaXZlbiByZWN0IG9iamVjdFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtPYmplY3R9IHJlY3QgLSBSZWN0IG9iamVjdCB5b3Ugd2FudCB0byBjaGFuZ2VcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCBmcm9tIHRoZSBmdW5jdGlvbiByZWFkcyB0aGUgc2Nyb2xsIHZhbHVlc1xuICogQHBhcmFtIHtCb29sZWFufSBzdWJ0cmFjdCAtIHNldCB0byB0cnVlIGlmIHlvdSB3YW50IHRvIHN1YnRyYWN0IHRoZSBzY3JvbGwgdmFsdWVzXG4gKiBAcmV0dXJuIHtPYmplY3R9IHJlY3QgLSBUaGUgbW9kaWZpZXIgcmVjdCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gaW5jbHVkZVNjcm9sbChyZWN0LCBlbGVtZW50KSB7XG4gIHZhciBzdWJ0cmFjdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG5cbiAgdmFyIHNjcm9sbFRvcCA9IGdldFNjcm9sbChlbGVtZW50LCAndG9wJyk7XG4gIHZhciBzY3JvbGxMZWZ0ID0gZ2V0U2Nyb2xsKGVsZW1lbnQsICdsZWZ0Jyk7XG4gIHZhciBtb2RpZmllciA9IHN1YnRyYWN0ID8gLTEgOiAxO1xuICByZWN0LnRvcCArPSBzY3JvbGxUb3AgKiBtb2RpZmllcjtcbiAgcmVjdC5ib3R0b20gKz0gc2Nyb2xsVG9wICogbW9kaWZpZXI7XG4gIHJlY3QubGVmdCArPSBzY3JvbGxMZWZ0ICogbW9kaWZpZXI7XG4gIHJlY3QucmlnaHQgKz0gc2Nyb2xsTGVmdCAqIG1vZGlmaWVyO1xuICByZXR1cm4gcmVjdDtcbn1cblxuLypcbiAqIEhlbHBlciB0byBkZXRlY3QgYm9yZGVycyBvZiBhIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7Q1NTU3R5bGVEZWNsYXJhdGlvbn0gc3R5bGVzXG4gKiBSZXN1bHQgb2YgYGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eWAgb24gdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBheGlzIC0gYHhgIG9yIGB5YFxuICogQHJldHVybiB7bnVtYmVyfSBib3JkZXJzIC0gVGhlIGJvcmRlcnMgc2l6ZSBvZiB0aGUgZ2l2ZW4gYXhpc1xuICovXG5cbmZ1bmN0aW9uIGdldEJvcmRlcnNTaXplKHN0eWxlcywgYXhpcykge1xuICB2YXIgc2lkZUEgPSBheGlzID09PSAneCcgPyAnTGVmdCcgOiAnVG9wJztcbiAgdmFyIHNpZGVCID0gc2lkZUEgPT09ICdMZWZ0JyA/ICdSaWdodCcgOiAnQm90dG9tJztcblxuICByZXR1cm4gcGFyc2VGbG9hdChzdHlsZXNbJ2JvcmRlcicgKyBzaWRlQSArICdXaWR0aCddKSArIHBhcnNlRmxvYXQoc3R5bGVzWydib3JkZXInICsgc2lkZUIgKyAnV2lkdGgnXSk7XG59XG5cbmZ1bmN0aW9uIGdldFNpemUoYXhpcywgYm9keSwgaHRtbCwgY29tcHV0ZWRTdHlsZSkge1xuICByZXR1cm4gTWF0aC5tYXgoYm9keVsnb2Zmc2V0JyArIGF4aXNdLCBib2R5WydzY3JvbGwnICsgYXhpc10sIGh0bWxbJ2NsaWVudCcgKyBheGlzXSwgaHRtbFsnb2Zmc2V0JyArIGF4aXNdLCBodG1sWydzY3JvbGwnICsgYXhpc10sIGlzSUUoMTApID8gcGFyc2VJbnQoaHRtbFsnb2Zmc2V0JyArIGF4aXNdKSArIHBhcnNlSW50KGNvbXB1dGVkU3R5bGVbJ21hcmdpbicgKyAoYXhpcyA9PT0gJ0hlaWdodCcgPyAnVG9wJyA6ICdMZWZ0JyldKSArIHBhcnNlSW50KGNvbXB1dGVkU3R5bGVbJ21hcmdpbicgKyAoYXhpcyA9PT0gJ0hlaWdodCcgPyAnQm90dG9tJyA6ICdSaWdodCcpXSkgOiAwKTtcbn1cblxuZnVuY3Rpb24gZ2V0V2luZG93U2l6ZXMoZG9jdW1lbnQpIHtcbiAgdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuICB2YXIgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgdmFyIGNvbXB1dGVkU3R5bGUgPSBpc0lFKDEwKSAmJiBnZXRDb21wdXRlZFN0eWxlKGh0bWwpO1xuXG4gIHJldHVybiB7XG4gICAgaGVpZ2h0OiBnZXRTaXplKCdIZWlnaHQnLCBib2R5LCBodG1sLCBjb21wdXRlZFN0eWxlKSxcbiAgICB3aWR0aDogZ2V0U2l6ZSgnV2lkdGgnLCBib2R5LCBodG1sLCBjb21wdXRlZFN0eWxlKVxuICB9O1xufVxuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG5cblxuXG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbi8qKlxuICogR2l2ZW4gZWxlbWVudCBvZmZzZXRzLCBnZW5lcmF0ZSBhbiBvdXRwdXQgc2ltaWxhciB0byBnZXRCb3VuZGluZ0NsaWVudFJlY3RcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvZmZzZXRzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBDbGllbnRSZWN0IGxpa2Ugb3V0cHV0XG4gKi9cbmZ1bmN0aW9uIGdldENsaWVudFJlY3Qob2Zmc2V0cykge1xuICByZXR1cm4gX2V4dGVuZHMoe30sIG9mZnNldHMsIHtcbiAgICByaWdodDogb2Zmc2V0cy5sZWZ0ICsgb2Zmc2V0cy53aWR0aCxcbiAgICBib3R0b206IG9mZnNldHMudG9wICsgb2Zmc2V0cy5oZWlnaHRcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IGJvdW5kaW5nIGNsaWVudCByZWN0IG9mIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4ge09iamVjdH0gY2xpZW50IHJlY3RcbiAqL1xuZnVuY3Rpb24gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIHJlY3QgPSB7fTtcblxuICAvLyBJRTEwIDEwIEZJWDogUGxlYXNlLCBkb24ndCBhc2ssIHRoZSBlbGVtZW50IGlzbid0XG4gIC8vIGNvbnNpZGVyZWQgaW4gRE9NIGluIHNvbWUgY2lyY3Vtc3RhbmNlcy4uLlxuICAvLyBUaGlzIGlzbid0IHJlcHJvZHVjaWJsZSBpbiBJRTEwIGNvbXBhdGliaWxpdHkgbW9kZSBvZiBJRTExXG4gIHRyeSB7XG4gICAgaWYgKGlzSUUoMTApKSB7XG4gICAgICByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHZhciBzY3JvbGxUb3AgPSBnZXRTY3JvbGwoZWxlbWVudCwgJ3RvcCcpO1xuICAgICAgdmFyIHNjcm9sbExlZnQgPSBnZXRTY3JvbGwoZWxlbWVudCwgJ2xlZnQnKTtcbiAgICAgIHJlY3QudG9wICs9IHNjcm9sbFRvcDtcbiAgICAgIHJlY3QubGVmdCArPSBzY3JvbGxMZWZ0O1xuICAgICAgcmVjdC5ib3R0b20gKz0gc2Nyb2xsVG9wO1xuICAgICAgcmVjdC5yaWdodCArPSBzY3JvbGxMZWZ0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdmFyIHJlc3VsdCA9IHtcbiAgICBsZWZ0OiByZWN0LmxlZnQsXG4gICAgdG9wOiByZWN0LnRvcCxcbiAgICB3aWR0aDogcmVjdC5yaWdodCAtIHJlY3QubGVmdCxcbiAgICBoZWlnaHQ6IHJlY3QuYm90dG9tIC0gcmVjdC50b3BcbiAgfTtcblxuICAvLyBzdWJ0cmFjdCBzY3JvbGxiYXIgc2l6ZSBmcm9tIHNpemVzXG4gIHZhciBzaXplcyA9IGVsZW1lbnQubm9kZU5hbWUgPT09ICdIVE1MJyA/IGdldFdpbmRvd1NpemVzKGVsZW1lbnQub3duZXJEb2N1bWVudCkgOiB7fTtcbiAgdmFyIHdpZHRoID0gc2l6ZXMud2lkdGggfHwgZWxlbWVudC5jbGllbnRXaWR0aCB8fCByZXN1bHQud2lkdGg7XG4gIHZhciBoZWlnaHQgPSBzaXplcy5oZWlnaHQgfHwgZWxlbWVudC5jbGllbnRIZWlnaHQgfHwgcmVzdWx0LmhlaWdodDtcblxuICB2YXIgaG9yaXpTY3JvbGxiYXIgPSBlbGVtZW50Lm9mZnNldFdpZHRoIC0gd2lkdGg7XG4gIHZhciB2ZXJ0U2Nyb2xsYmFyID0gZWxlbWVudC5vZmZzZXRIZWlnaHQgLSBoZWlnaHQ7XG5cbiAgLy8gaWYgYW4gaHlwb3RoZXRpY2FsIHNjcm9sbGJhciBpcyBkZXRlY3RlZCwgd2UgbXVzdCBiZSBzdXJlIGl0J3Mgbm90IGEgYGJvcmRlcmBcbiAgLy8gd2UgbWFrZSB0aGlzIGNoZWNrIGNvbmRpdGlvbmFsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zXG4gIGlmIChob3JpelNjcm9sbGJhciB8fCB2ZXJ0U2Nyb2xsYmFyKSB7XG4gICAgdmFyIHN0eWxlcyA9IGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShlbGVtZW50KTtcbiAgICBob3JpelNjcm9sbGJhciAtPSBnZXRCb3JkZXJzU2l6ZShzdHlsZXMsICd4Jyk7XG4gICAgdmVydFNjcm9sbGJhciAtPSBnZXRCb3JkZXJzU2l6ZShzdHlsZXMsICd5Jyk7XG5cbiAgICByZXN1bHQud2lkdGggLT0gaG9yaXpTY3JvbGxiYXI7XG4gICAgcmVzdWx0LmhlaWdodCAtPSB2ZXJ0U2Nyb2xsYmFyO1xuICB9XG5cbiAgcmV0dXJuIGdldENsaWVudFJlY3QocmVzdWx0KTtcbn1cblxuZnVuY3Rpb24gZ2V0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcmJpdHJhcnlOb2RlKGNoaWxkcmVuLCBwYXJlbnQpIHtcbiAgdmFyIGZpeGVkUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuXG4gIHZhciBpc0lFMTAgPSBpc0lFKDEwKTtcbiAgdmFyIGlzSFRNTCA9IHBhcmVudC5ub2RlTmFtZSA9PT0gJ0hUTUwnO1xuICB2YXIgY2hpbGRyZW5SZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGNoaWxkcmVuKTtcbiAgdmFyIHBhcmVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QocGFyZW50KTtcbiAgdmFyIHNjcm9sbFBhcmVudCA9IGdldFNjcm9sbFBhcmVudChjaGlsZHJlbik7XG5cbiAgdmFyIHN0eWxlcyA9IGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShwYXJlbnQpO1xuICB2YXIgYm9yZGVyVG9wV2lkdGggPSBwYXJzZUZsb2F0KHN0eWxlcy5ib3JkZXJUb3BXaWR0aCk7XG4gIHZhciBib3JkZXJMZWZ0V2lkdGggPSBwYXJzZUZsb2F0KHN0eWxlcy5ib3JkZXJMZWZ0V2lkdGgpO1xuXG4gIC8vIEluIGNhc2VzIHdoZXJlIHRoZSBwYXJlbnQgaXMgZml4ZWQsIHdlIG11c3QgaWdub3JlIG5lZ2F0aXZlIHNjcm9sbCBpbiBvZmZzZXQgY2FsY1xuICBpZiAoZml4ZWRQb3NpdGlvbiAmJiBpc0hUTUwpIHtcbiAgICBwYXJlbnRSZWN0LnRvcCA9IE1hdGgubWF4KHBhcmVudFJlY3QudG9wLCAwKTtcbiAgICBwYXJlbnRSZWN0LmxlZnQgPSBNYXRoLm1heChwYXJlbnRSZWN0LmxlZnQsIDApO1xuICB9XG4gIHZhciBvZmZzZXRzID0gZ2V0Q2xpZW50UmVjdCh7XG4gICAgdG9wOiBjaGlsZHJlblJlY3QudG9wIC0gcGFyZW50UmVjdC50b3AgLSBib3JkZXJUb3BXaWR0aCxcbiAgICBsZWZ0OiBjaGlsZHJlblJlY3QubGVmdCAtIHBhcmVudFJlY3QubGVmdCAtIGJvcmRlckxlZnRXaWR0aCxcbiAgICB3aWR0aDogY2hpbGRyZW5SZWN0LndpZHRoLFxuICAgIGhlaWdodDogY2hpbGRyZW5SZWN0LmhlaWdodFxuICB9KTtcbiAgb2Zmc2V0cy5tYXJnaW5Ub3AgPSAwO1xuICBvZmZzZXRzLm1hcmdpbkxlZnQgPSAwO1xuXG4gIC8vIFN1YnRyYWN0IG1hcmdpbnMgb2YgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgaXQncyBiZWluZyB1c2VkIGFzIHBhcmVudFxuICAvLyB3ZSBkbyB0aGlzIG9ubHkgb24gSFRNTCBiZWNhdXNlIGl0J3MgdGhlIG9ubHkgZWxlbWVudCB0aGF0IGJlaGF2ZXNcbiAgLy8gZGlmZmVyZW50bHkgd2hlbiBtYXJnaW5zIGFyZSBhcHBsaWVkIHRvIGl0LiBUaGUgbWFyZ2lucyBhcmUgaW5jbHVkZWQgaW5cbiAgLy8gdGhlIGJveCBvZiB0aGUgZG9jdW1lbnRFbGVtZW50LCBpbiB0aGUgb3RoZXIgY2FzZXMgbm90LlxuICBpZiAoIWlzSUUxMCAmJiBpc0hUTUwpIHtcbiAgICB2YXIgbWFyZ2luVG9wID0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luVG9wKTtcbiAgICB2YXIgbWFyZ2luTGVmdCA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpbkxlZnQpO1xuXG4gICAgb2Zmc2V0cy50b3AgLT0gYm9yZGVyVG9wV2lkdGggLSBtYXJnaW5Ub3A7XG4gICAgb2Zmc2V0cy5ib3R0b20gLT0gYm9yZGVyVG9wV2lkdGggLSBtYXJnaW5Ub3A7XG4gICAgb2Zmc2V0cy5sZWZ0IC09IGJvcmRlckxlZnRXaWR0aCAtIG1hcmdpbkxlZnQ7XG4gICAgb2Zmc2V0cy5yaWdodCAtPSBib3JkZXJMZWZ0V2lkdGggLSBtYXJnaW5MZWZ0O1xuXG4gICAgLy8gQXR0YWNoIG1hcmdpblRvcCBhbmQgbWFyZ2luTGVmdCBiZWNhdXNlIGluIHNvbWUgY2lyY3Vtc3RhbmNlcyB3ZSBtYXkgbmVlZCB0aGVtXG4gICAgb2Zmc2V0cy5tYXJnaW5Ub3AgPSBtYXJnaW5Ub3A7XG4gICAgb2Zmc2V0cy5tYXJnaW5MZWZ0ID0gbWFyZ2luTGVmdDtcbiAgfVxuXG4gIGlmIChpc0lFMTAgJiYgIWZpeGVkUG9zaXRpb24gPyBwYXJlbnQuY29udGFpbnMoc2Nyb2xsUGFyZW50KSA6IHBhcmVudCA9PT0gc2Nyb2xsUGFyZW50ICYmIHNjcm9sbFBhcmVudC5ub2RlTmFtZSAhPT0gJ0JPRFknKSB7XG4gICAgb2Zmc2V0cyA9IGluY2x1ZGVTY3JvbGwob2Zmc2V0cywgcGFyZW50KTtcbiAgfVxuXG4gIHJldHVybiBvZmZzZXRzO1xufVxuXG5mdW5jdGlvbiBnZXRWaWV3cG9ydE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJ0Yml0cmFyeU5vZGUoZWxlbWVudCkge1xuICB2YXIgZXhjbHVkZVNjcm9sbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgdmFyIGh0bWwgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB2YXIgcmVsYXRpdmVPZmZzZXQgPSBnZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUoZWxlbWVudCwgaHRtbCk7XG4gIHZhciB3aWR0aCA9IE1hdGgubWF4KGh0bWwuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApO1xuICB2YXIgaGVpZ2h0ID0gTWF0aC5tYXgoaHRtbC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTtcblxuICB2YXIgc2Nyb2xsVG9wID0gIWV4Y2x1ZGVTY3JvbGwgPyBnZXRTY3JvbGwoaHRtbCkgOiAwO1xuICB2YXIgc2Nyb2xsTGVmdCA9ICFleGNsdWRlU2Nyb2xsID8gZ2V0U2Nyb2xsKGh0bWwsICdsZWZ0JykgOiAwO1xuXG4gIHZhciBvZmZzZXQgPSB7XG4gICAgdG9wOiBzY3JvbGxUb3AgLSByZWxhdGl2ZU9mZnNldC50b3AgKyByZWxhdGl2ZU9mZnNldC5tYXJnaW5Ub3AsXG4gICAgbGVmdDogc2Nyb2xsTGVmdCAtIHJlbGF0aXZlT2Zmc2V0LmxlZnQgKyByZWxhdGl2ZU9mZnNldC5tYXJnaW5MZWZ0LFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xuXG4gIHJldHVybiBnZXRDbGllbnRSZWN0KG9mZnNldCk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgZml4ZWQgb3IgaXMgaW5zaWRlIGEgZml4ZWQgcGFyZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gY3VzdG9tQ29udGFpbmVyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYW5zd2VyIHRvIFwiaXNGaXhlZD9cIlxuICovXG5mdW5jdGlvbiBpc0ZpeGVkKGVsZW1lbnQpIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZTtcbiAgaWYgKG5vZGVOYW1lID09PSAnQk9EWScgfHwgbm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQsICdwb3NpdGlvbicpID09PSAnZml4ZWQnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIHBhcmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuICBpZiAoIXBhcmVudE5vZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGlzRml4ZWQocGFyZW50Tm9kZSk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGZpcnN0IHBhcmVudCBvZiBhbiBlbGVtZW50IHRoYXQgaGFzIGEgdHJhbnNmb3JtZWQgcHJvcGVydHkgZGVmaW5lZFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7RWxlbWVudH0gZmlyc3QgdHJhbnNmb3JtZWQgcGFyZW50IG9yIGRvY3VtZW50RWxlbWVudFxuICovXG5cbmZ1bmN0aW9uIGdldEZpeGVkUG9zaXRpb25PZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICAvLyBUaGlzIGNoZWNrIGlzIG5lZWRlZCB0byBhdm9pZCBlcnJvcnMgaW4gY2FzZSBvbmUgb2YgdGhlIGVsZW1lbnRzIGlzbid0IGRlZmluZWQgZm9yIGFueSByZWFzb25cbiAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50LnBhcmVudEVsZW1lbnQgfHwgaXNJRSgpKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfVxuICB2YXIgZWwgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIHdoaWxlIChlbCAmJiBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkoZWwsICd0cmFuc2Zvcm0nKSA9PT0gJ25vbmUnKSB7XG4gICAgZWwgPSBlbC5wYXJlbnRFbGVtZW50O1xuICB9XG4gIHJldHVybiBlbCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG59XG5cbi8qKlxuICogQ29tcHV0ZWQgdGhlIGJvdW5kYXJpZXMgbGltaXRzIGFuZCByZXR1cm4gdGhlbVxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcG9wcGVyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByZWZlcmVuY2VcbiAqIEBwYXJhbSB7bnVtYmVyfSBwYWRkaW5nXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBib3VuZGFyaWVzRWxlbWVudCAtIEVsZW1lbnQgdXNlZCB0byBkZWZpbmUgdGhlIGJvdW5kYXJpZXNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZml4ZWRQb3NpdGlvbiAtIElzIGluIGZpeGVkIHBvc2l0aW9uIG1vZGVcbiAqIEByZXR1cm5zIHtPYmplY3R9IENvb3JkaW5hdGVzIG9mIHRoZSBib3VuZGFyaWVzXG4gKi9cbmZ1bmN0aW9uIGdldEJvdW5kYXJpZXMocG9wcGVyLCByZWZlcmVuY2UsIHBhZGRpbmcsIGJvdW5kYXJpZXNFbGVtZW50KSB7XG4gIHZhciBmaXhlZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBmYWxzZTtcblxuICAvLyBOT1RFOiAxIERPTSBhY2Nlc3MgaGVyZVxuXG4gIHZhciBib3VuZGFyaWVzID0geyB0b3A6IDAsIGxlZnQ6IDAgfTtcbiAgdmFyIG9mZnNldFBhcmVudCA9IGZpeGVkUG9zaXRpb24gPyBnZXRGaXhlZFBvc2l0aW9uT2Zmc2V0UGFyZW50KHBvcHBlcikgOiBmaW5kQ29tbW9uT2Zmc2V0UGFyZW50KHBvcHBlciwgZ2V0UmVmZXJlbmNlTm9kZShyZWZlcmVuY2UpKTtcblxuICAvLyBIYW5kbGUgdmlld3BvcnQgY2FzZVxuICBpZiAoYm91bmRhcmllc0VsZW1lbnQgPT09ICd2aWV3cG9ydCcpIHtcbiAgICBib3VuZGFyaWVzID0gZ2V0Vmlld3BvcnRPZmZzZXRSZWN0UmVsYXRpdmVUb0FydGJpdHJhcnlOb2RlKG9mZnNldFBhcmVudCwgZml4ZWRQb3NpdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgLy8gSGFuZGxlIG90aGVyIGNhc2VzIGJhc2VkIG9uIERPTSBlbGVtZW50IHVzZWQgYXMgYm91bmRhcmllc1xuICAgIHZhciBib3VuZGFyaWVzTm9kZSA9IHZvaWQgMDtcbiAgICBpZiAoYm91bmRhcmllc0VsZW1lbnQgPT09ICdzY3JvbGxQYXJlbnQnKSB7XG4gICAgICBib3VuZGFyaWVzTm9kZSA9IGdldFNjcm9sbFBhcmVudChnZXRQYXJlbnROb2RlKHJlZmVyZW5jZSkpO1xuICAgICAgaWYgKGJvdW5kYXJpZXNOb2RlLm5vZGVOYW1lID09PSAnQk9EWScpIHtcbiAgICAgICAgYm91bmRhcmllc05vZGUgPSBwb3BwZXIub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChib3VuZGFyaWVzRWxlbWVudCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIGJvdW5kYXJpZXNOb2RlID0gcG9wcGVyLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBib3VuZGFyaWVzTm9kZSA9IGJvdW5kYXJpZXNFbGVtZW50O1xuICAgIH1cblxuICAgIHZhciBvZmZzZXRzID0gZ2V0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcmJpdHJhcnlOb2RlKGJvdW5kYXJpZXNOb2RlLCBvZmZzZXRQYXJlbnQsIGZpeGVkUG9zaXRpb24pO1xuXG4gICAgLy8gSW4gY2FzZSBvZiBIVE1MLCB3ZSBuZWVkIGEgZGlmZmVyZW50IGNvbXB1dGF0aW9uXG4gICAgaWYgKGJvdW5kYXJpZXNOb2RlLm5vZGVOYW1lID09PSAnSFRNTCcgJiYgIWlzRml4ZWQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgdmFyIF9nZXRXaW5kb3dTaXplcyA9IGdldFdpbmRvd1NpemVzKHBvcHBlci5vd25lckRvY3VtZW50KSxcbiAgICAgICAgICBoZWlnaHQgPSBfZ2V0V2luZG93U2l6ZXMuaGVpZ2h0LFxuICAgICAgICAgIHdpZHRoID0gX2dldFdpbmRvd1NpemVzLndpZHRoO1xuXG4gICAgICBib3VuZGFyaWVzLnRvcCArPSBvZmZzZXRzLnRvcCAtIG9mZnNldHMubWFyZ2luVG9wO1xuICAgICAgYm91bmRhcmllcy5ib3R0b20gPSBoZWlnaHQgKyBvZmZzZXRzLnRvcDtcbiAgICAgIGJvdW5kYXJpZXMubGVmdCArPSBvZmZzZXRzLmxlZnQgLSBvZmZzZXRzLm1hcmdpbkxlZnQ7XG4gICAgICBib3VuZGFyaWVzLnJpZ2h0ID0gd2lkdGggKyBvZmZzZXRzLmxlZnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZvciBhbGwgdGhlIG90aGVyIERPTSBlbGVtZW50cywgdGhpcyBvbmUgaXMgZ29vZFxuICAgICAgYm91bmRhcmllcyA9IG9mZnNldHM7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIHBhZGRpbmdzXG4gIHBhZGRpbmcgPSBwYWRkaW5nIHx8IDA7XG4gIHZhciBpc1BhZGRpbmdOdW1iZXIgPSB0eXBlb2YgcGFkZGluZyA9PT0gJ251bWJlcic7XG4gIGJvdW5kYXJpZXMubGVmdCArPSBpc1BhZGRpbmdOdW1iZXIgPyBwYWRkaW5nIDogcGFkZGluZy5sZWZ0IHx8IDA7XG4gIGJvdW5kYXJpZXMudG9wICs9IGlzUGFkZGluZ051bWJlciA/IHBhZGRpbmcgOiBwYWRkaW5nLnRvcCB8fCAwO1xuICBib3VuZGFyaWVzLnJpZ2h0IC09IGlzUGFkZGluZ051bWJlciA/IHBhZGRpbmcgOiBwYWRkaW5nLnJpZ2h0IHx8IDA7XG4gIGJvdW5kYXJpZXMuYm90dG9tIC09IGlzUGFkZGluZ051bWJlciA/IHBhZGRpbmcgOiBwYWRkaW5nLmJvdHRvbSB8fCAwO1xuXG4gIHJldHVybiBib3VuZGFyaWVzO1xufVxuXG5mdW5jdGlvbiBnZXRBcmVhKF9yZWYpIHtcbiAgdmFyIHdpZHRoID0gX3JlZi53aWR0aCxcbiAgICAgIGhlaWdodCA9IF9yZWYuaGVpZ2h0O1xuXG4gIHJldHVybiB3aWR0aCAqIGhlaWdodDtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IHVzZWQgdG8gdHJhbnNmb3JtIHRoZSBgYXV0b2AgcGxhY2VtZW50IHRvIHRoZSBwbGFjZW1lbnQgd2l0aCBtb3JlXG4gKiBhdmFpbGFibGUgc3BhY2UuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgdXBkYXRlIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBjb21wdXRlQXV0b1BsYWNlbWVudChwbGFjZW1lbnQsIHJlZlJlY3QsIHBvcHBlciwgcmVmZXJlbmNlLCBib3VuZGFyaWVzRWxlbWVudCkge1xuICB2YXIgcGFkZGluZyA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogMDtcblxuICBpZiAocGxhY2VtZW50LmluZGV4T2YoJ2F1dG8nKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gcGxhY2VtZW50O1xuICB9XG5cbiAgdmFyIGJvdW5kYXJpZXMgPSBnZXRCb3VuZGFyaWVzKHBvcHBlciwgcmVmZXJlbmNlLCBwYWRkaW5nLCBib3VuZGFyaWVzRWxlbWVudCk7XG5cbiAgdmFyIHJlY3RzID0ge1xuICAgIHRvcDoge1xuICAgICAgd2lkdGg6IGJvdW5kYXJpZXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IHJlZlJlY3QudG9wIC0gYm91bmRhcmllcy50b3BcbiAgICB9LFxuICAgIHJpZ2h0OiB7XG4gICAgICB3aWR0aDogYm91bmRhcmllcy5yaWdodCAtIHJlZlJlY3QucmlnaHQsXG4gICAgICBoZWlnaHQ6IGJvdW5kYXJpZXMuaGVpZ2h0XG4gICAgfSxcbiAgICBib3R0b206IHtcbiAgICAgIHdpZHRoOiBib3VuZGFyaWVzLndpZHRoLFxuICAgICAgaGVpZ2h0OiBib3VuZGFyaWVzLmJvdHRvbSAtIHJlZlJlY3QuYm90dG9tXG4gICAgfSxcbiAgICBsZWZ0OiB7XG4gICAgICB3aWR0aDogcmVmUmVjdC5sZWZ0IC0gYm91bmRhcmllcy5sZWZ0LFxuICAgICAgaGVpZ2h0OiBib3VuZGFyaWVzLmhlaWdodFxuICAgIH1cbiAgfTtcblxuICB2YXIgc29ydGVkQXJlYXMgPSBPYmplY3Qua2V5cyhyZWN0cykubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAga2V5OiBrZXlcbiAgICB9LCByZWN0c1trZXldLCB7XG4gICAgICBhcmVhOiBnZXRBcmVhKHJlY3RzW2tleV0pXG4gICAgfSk7XG4gIH0pLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYi5hcmVhIC0gYS5hcmVhO1xuICB9KTtcblxuICB2YXIgZmlsdGVyZWRBcmVhcyA9IHNvcnRlZEFyZWFzLmZpbHRlcihmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICB2YXIgd2lkdGggPSBfcmVmMi53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gX3JlZjIuaGVpZ2h0O1xuICAgIHJldHVybiB3aWR0aCA+PSBwb3BwZXIuY2xpZW50V2lkdGggJiYgaGVpZ2h0ID49IHBvcHBlci5jbGllbnRIZWlnaHQ7XG4gIH0pO1xuXG4gIHZhciBjb21wdXRlZFBsYWNlbWVudCA9IGZpbHRlcmVkQXJlYXMubGVuZ3RoID4gMCA/IGZpbHRlcmVkQXJlYXNbMF0ua2V5IDogc29ydGVkQXJlYXNbMF0ua2V5O1xuXG4gIHZhciB2YXJpYXRpb24gPSBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTtcblxuICByZXR1cm4gY29tcHV0ZWRQbGFjZW1lbnQgKyAodmFyaWF0aW9uID8gJy0nICsgdmFyaWF0aW9uIDogJycpO1xufVxuXG4vKipcbiAqIEdldCBvZmZzZXRzIHRvIHRoZSByZWZlcmVuY2UgZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHBvcHBlciAtIHRoZSBwb3BwZXIgZWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50fSByZWZlcmVuY2UgLSB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgKHRoZSBwb3BwZXIgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGlzKVxuICogQHBhcmFtIHtFbGVtZW50fSBmaXhlZFBvc2l0aW9uIC0gaXMgaW4gZml4ZWQgcG9zaXRpb24gbW9kZVxuICogQHJldHVybnMge09iamVjdH0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9mZnNldHMgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXJcbiAqL1xuZnVuY3Rpb24gZ2V0UmVmZXJlbmNlT2Zmc2V0cyhzdGF0ZSwgcG9wcGVyLCByZWZlcmVuY2UpIHtcbiAgdmFyIGZpeGVkUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG5cbiAgdmFyIGNvbW1vbk9mZnNldFBhcmVudCA9IGZpeGVkUG9zaXRpb24gPyBnZXRGaXhlZFBvc2l0aW9uT2Zmc2V0UGFyZW50KHBvcHBlcikgOiBmaW5kQ29tbW9uT2Zmc2V0UGFyZW50KHBvcHBlciwgZ2V0UmVmZXJlbmNlTm9kZShyZWZlcmVuY2UpKTtcbiAgcmV0dXJuIGdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZShyZWZlcmVuY2UsIGNvbW1vbk9mZnNldFBhcmVudCwgZml4ZWRQb3NpdGlvbik7XG59XG5cbi8qKlxuICogR2V0IHRoZSBvdXRlciBzaXplcyBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAob2Zmc2V0IHNpemUgKyBtYXJnaW5zKVxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBvYmplY3QgY29udGFpbmluZyB3aWR0aCBhbmQgaGVpZ2h0IHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gZ2V0T3V0ZXJTaXplcyhlbGVtZW50KSB7XG4gIHZhciB3aW5kb3cgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gIHZhciBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgdmFyIHggPSBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5Ub3AgfHwgMCkgKyBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5Cb3R0b20gfHwgMCk7XG4gIHZhciB5ID0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luTGVmdCB8fCAwKSArIHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpblJpZ2h0IHx8IDApO1xuICB2YXIgcmVzdWx0ID0ge1xuICAgIHdpZHRoOiBlbGVtZW50Lm9mZnNldFdpZHRoICsgeSxcbiAgICBoZWlnaHQ6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0ICsgeFxuICB9O1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdldCB0aGUgb3Bwb3NpdGUgcGxhY2VtZW50IG9mIHRoZSBnaXZlbiBvbmVcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBwbGFjZW1lbnRcbiAqIEByZXR1cm5zIHtTdHJpbmd9IGZsaXBwZWQgcGxhY2VtZW50XG4gKi9cbmZ1bmN0aW9uIGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICB2YXIgaGFzaCA9IHsgbGVmdDogJ3JpZ2h0JywgcmlnaHQ6ICdsZWZ0JywgYm90dG9tOiAndG9wJywgdG9wOiAnYm90dG9tJyB9O1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgb2Zmc2V0cyB0byB0aGUgcG9wcGVyXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge09iamVjdH0gcG9zaXRpb24gLSBDU1MgcG9zaXRpb24gdGhlIFBvcHBlciB3aWxsIGdldCBhcHBsaWVkXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwb3BwZXIgLSB0aGUgcG9wcGVyIGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWZlcmVuY2VPZmZzZXRzIC0gdGhlIHJlZmVyZW5jZSBvZmZzZXRzICh0aGUgcG9wcGVyIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhpcylcbiAqIEBwYXJhbSB7U3RyaW5nfSBwbGFjZW1lbnQgLSBvbmUgb2YgdGhlIHZhbGlkIHBsYWNlbWVudCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBwb3BwZXJPZmZzZXRzIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9mZnNldHMgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXJcbiAqL1xuZnVuY3Rpb24gZ2V0UG9wcGVyT2Zmc2V0cyhwb3BwZXIsIHJlZmVyZW5jZU9mZnNldHMsIHBsYWNlbWVudCkge1xuICBwbGFjZW1lbnQgPSBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcblxuICAvLyBHZXQgcG9wcGVyIG5vZGUgc2l6ZXNcbiAgdmFyIHBvcHBlclJlY3QgPSBnZXRPdXRlclNpemVzKHBvcHBlcik7XG5cbiAgLy8gQWRkIHBvc2l0aW9uLCB3aWR0aCBhbmQgaGVpZ2h0IHRvIG91ciBvZmZzZXRzIG9iamVjdFxuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHtcbiAgICB3aWR0aDogcG9wcGVyUmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IHBvcHBlclJlY3QuaGVpZ2h0XG4gIH07XG5cbiAgLy8gZGVwZW5kaW5nIGJ5IHRoZSBwb3BwZXIgcGxhY2VtZW50IHdlIGhhdmUgdG8gY29tcHV0ZSBpdHMgb2Zmc2V0cyBzbGlnaHRseSBkaWZmZXJlbnRseVxuICB2YXIgaXNIb3JpeiA9IFsncmlnaHQnLCAnbGVmdCddLmluZGV4T2YocGxhY2VtZW50KSAhPT0gLTE7XG4gIHZhciBtYWluU2lkZSA9IGlzSG9yaXogPyAndG9wJyA6ICdsZWZ0JztcbiAgdmFyIHNlY29uZGFyeVNpZGUgPSBpc0hvcml6ID8gJ2xlZnQnIDogJ3RvcCc7XG4gIHZhciBtZWFzdXJlbWVudCA9IGlzSG9yaXogPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gIHZhciBzZWNvbmRhcnlNZWFzdXJlbWVudCA9ICFpc0hvcml6ID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gIHBvcHBlck9mZnNldHNbbWFpblNpZGVdID0gcmVmZXJlbmNlT2Zmc2V0c1ttYWluU2lkZV0gKyByZWZlcmVuY2VPZmZzZXRzW21lYXN1cmVtZW50XSAvIDIgLSBwb3BwZXJSZWN0W21lYXN1cmVtZW50XSAvIDI7XG4gIGlmIChwbGFjZW1lbnQgPT09IHNlY29uZGFyeVNpZGUpIHtcbiAgICBwb3BwZXJPZmZzZXRzW3NlY29uZGFyeVNpZGVdID0gcmVmZXJlbmNlT2Zmc2V0c1tzZWNvbmRhcnlTaWRlXSAtIHBvcHBlclJlY3Rbc2Vjb25kYXJ5TWVhc3VyZW1lbnRdO1xuICB9IGVsc2Uge1xuICAgIHBvcHBlck9mZnNldHNbc2Vjb25kYXJ5U2lkZV0gPSByZWZlcmVuY2VPZmZzZXRzW2dldE9wcG9zaXRlUGxhY2VtZW50KHNlY29uZGFyeVNpZGUpXTtcbiAgfVxuXG4gIHJldHVybiBwb3BwZXJPZmZzZXRzO1xufVxuXG4vKipcbiAqIE1pbWljcyB0aGUgYGZpbmRgIG1ldGhvZCBvZiBBcnJheVxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtBcnJheX0gYXJyXG4gKiBAYXJndW1lbnQgcHJvcFxuICogQGFyZ3VtZW50IHZhbHVlXG4gKiBAcmV0dXJucyBpbmRleCBvciAtMVxuICovXG5mdW5jdGlvbiBmaW5kKGFyciwgY2hlY2spIHtcbiAgLy8gdXNlIG5hdGl2ZSBmaW5kIGlmIHN1cHBvcnRlZFxuICBpZiAoQXJyYXkucHJvdG90eXBlLmZpbmQpIHtcbiAgICByZXR1cm4gYXJyLmZpbmQoY2hlY2spO1xuICB9XG5cbiAgLy8gdXNlIGBmaWx0ZXJgIHRvIG9idGFpbiB0aGUgc2FtZSBiZWhhdmlvciBvZiBgZmluZGBcbiAgcmV0dXJuIGFyci5maWx0ZXIoY2hlY2spWzBdO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIG1hdGNoaW5nIG9iamVjdFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtBcnJheX0gYXJyXG4gKiBAYXJndW1lbnQgcHJvcFxuICogQGFyZ3VtZW50IHZhbHVlXG4gKiBAcmV0dXJucyBpbmRleCBvciAtMVxuICovXG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyLCBwcm9wLCB2YWx1ZSkge1xuICAvLyB1c2UgbmF0aXZlIGZpbmRJbmRleCBpZiBzdXBwb3J0ZWRcbiAgaWYgKEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXgpIHtcbiAgICByZXR1cm4gYXJyLmZpbmRJbmRleChmdW5jdGlvbiAoY3VyKSB7XG4gICAgICByZXR1cm4gY3VyW3Byb3BdID09PSB2YWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHVzZSBgZmluZGAgKyBgaW5kZXhPZmAgaWYgYGZpbmRJbmRleGAgaXNuJ3Qgc3VwcG9ydGVkXG4gIHZhciBtYXRjaCA9IGZpbmQoYXJyLCBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIG9ialtwcm9wXSA9PT0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gYXJyLmluZGV4T2YobWF0Y2gpO1xufVxuXG4vKipcbiAqIExvb3AgdHJvdWdoIHRoZSBsaXN0IG9mIG1vZGlmaWVycyBhbmQgcnVuIHRoZW0gaW4gb3JkZXIsXG4gKiBlYWNoIG9mIHRoZW0gd2lsbCB0aGVuIGVkaXQgdGhlIGRhdGEgb2JqZWN0LlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtkYXRhT2JqZWN0fSBkYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBtb2RpZmllcnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBlbmRzIC0gT3B0aW9uYWwgbW9kaWZpZXIgbmFtZSB1c2VkIGFzIHN0b3BwZXJcbiAqIEByZXR1cm5zIHtkYXRhT2JqZWN0fVxuICovXG5mdW5jdGlvbiBydW5Nb2RpZmllcnMobW9kaWZpZXJzLCBkYXRhLCBlbmRzKSB7XG4gIHZhciBtb2RpZmllcnNUb1J1biA9IGVuZHMgPT09IHVuZGVmaW5lZCA/IG1vZGlmaWVycyA6IG1vZGlmaWVycy5zbGljZSgwLCBmaW5kSW5kZXgobW9kaWZpZXJzLCAnbmFtZScsIGVuZHMpKTtcblxuICBtb2RpZmllcnNUb1J1bi5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIGlmIChtb2RpZmllclsnZnVuY3Rpb24nXSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkb3Qtbm90YXRpb25cbiAgICAgIGNvbnNvbGUud2FybignYG1vZGlmaWVyLmZ1bmN0aW9uYCBpcyBkZXByZWNhdGVkLCB1c2UgYG1vZGlmaWVyLmZuYCEnKTtcbiAgICB9XG4gICAgdmFyIGZuID0gbW9kaWZpZXJbJ2Z1bmN0aW9uJ10gfHwgbW9kaWZpZXIuZm47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZG90LW5vdGF0aW9uXG4gICAgaWYgKG1vZGlmaWVyLmVuYWJsZWQgJiYgaXNGdW5jdGlvbihmbikpIHtcbiAgICAgIC8vIEFkZCBwcm9wZXJ0aWVzIHRvIG9mZnNldHMgdG8gbWFrZSB0aGVtIGEgY29tcGxldGUgY2xpZW50UmVjdCBvYmplY3RcbiAgICAgIC8vIHdlIGRvIHRoaXMgYmVmb3JlIGVhY2ggbW9kaWZpZXIgdG8gbWFrZSBzdXJlIHRoZSBwcmV2aW91cyBvbmUgZG9lc24ndFxuICAgICAgLy8gbWVzcyB3aXRoIHRoZXNlIHZhbHVlc1xuICAgICAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IGdldENsaWVudFJlY3QoZGF0YS5vZmZzZXRzLnBvcHBlcik7XG4gICAgICBkYXRhLm9mZnNldHMucmVmZXJlbmNlID0gZ2V0Q2xpZW50UmVjdChkYXRhLm9mZnNldHMucmVmZXJlbmNlKTtcblxuICAgICAgZGF0YSA9IGZuKGRhdGEsIG1vZGlmaWVyKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBwb3BwZXIsIGNvbXB1dGluZyB0aGUgbmV3IG9mZnNldHMgYW5kIGFwcGx5aW5nXG4gKiB0aGUgbmV3IHN0eWxlLjxiciAvPlxuICogUHJlZmVyIGBzY2hlZHVsZVVwZGF0ZWAgb3ZlciBgdXBkYXRlYCBiZWNhdXNlIG9mIHBlcmZvcm1hbmNlIHJlYXNvbnMuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgLy8gaWYgcG9wcGVyIGlzIGRlc3Ryb3llZCwgZG9uJ3QgcGVyZm9ybSBhbnkgZnVydGhlciB1cGRhdGVcbiAgaWYgKHRoaXMuc3RhdGUuaXNEZXN0cm95ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZGF0YSA9IHtcbiAgICBpbnN0YW5jZTogdGhpcyxcbiAgICBzdHlsZXM6IHt9LFxuICAgIGFycm93U3R5bGVzOiB7fSxcbiAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICBmbGlwcGVkOiBmYWxzZSxcbiAgICBvZmZzZXRzOiB7fVxuICB9O1xuXG4gIC8vIGNvbXB1dGUgcmVmZXJlbmNlIGVsZW1lbnQgb2Zmc2V0c1xuICBkYXRhLm9mZnNldHMucmVmZXJlbmNlID0gZ2V0UmVmZXJlbmNlT2Zmc2V0cyh0aGlzLnN0YXRlLCB0aGlzLnBvcHBlciwgdGhpcy5yZWZlcmVuY2UsIHRoaXMub3B0aW9ucy5wb3NpdGlvbkZpeGVkKTtcblxuICAvLyBjb21wdXRlIGF1dG8gcGxhY2VtZW50LCBzdG9yZSBwbGFjZW1lbnQgaW5zaWRlIHRoZSBkYXRhIG9iamVjdCxcbiAgLy8gbW9kaWZpZXJzIHdpbGwgYmUgYWJsZSB0byBlZGl0IGBwbGFjZW1lbnRgIGlmIG5lZWRlZFxuICAvLyBhbmQgcmVmZXIgdG8gb3JpZ2luYWxQbGFjZW1lbnQgdG8ga25vdyB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgZGF0YS5wbGFjZW1lbnQgPSBjb21wdXRlQXV0b1BsYWNlbWVudCh0aGlzLm9wdGlvbnMucGxhY2VtZW50LCBkYXRhLm9mZnNldHMucmVmZXJlbmNlLCB0aGlzLnBvcHBlciwgdGhpcy5yZWZlcmVuY2UsIHRoaXMub3B0aW9ucy5tb2RpZmllcnMuZmxpcC5ib3VuZGFyaWVzRWxlbWVudCwgdGhpcy5vcHRpb25zLm1vZGlmaWVycy5mbGlwLnBhZGRpbmcpO1xuXG4gIC8vIHN0b3JlIHRoZSBjb21wdXRlZCBwbGFjZW1lbnQgaW5zaWRlIGBvcmlnaW5hbFBsYWNlbWVudGBcbiAgZGF0YS5vcmlnaW5hbFBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50O1xuXG4gIGRhdGEucG9zaXRpb25GaXhlZCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbkZpeGVkO1xuXG4gIC8vIGNvbXB1dGUgdGhlIHBvcHBlciBvZmZzZXRzXG4gIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBnZXRQb3BwZXJPZmZzZXRzKHRoaXMucG9wcGVyLCBkYXRhLm9mZnNldHMucmVmZXJlbmNlLCBkYXRhLnBsYWNlbWVudCk7XG5cbiAgZGF0YS5vZmZzZXRzLnBvcHBlci5wb3NpdGlvbiA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbkZpeGVkID8gJ2ZpeGVkJyA6ICdhYnNvbHV0ZSc7XG5cbiAgLy8gcnVuIHRoZSBtb2RpZmllcnNcbiAgZGF0YSA9IHJ1bk1vZGlmaWVycyh0aGlzLm1vZGlmaWVycywgZGF0YSk7XG5cbiAgLy8gdGhlIGZpcnN0IGB1cGRhdGVgIHdpbGwgY2FsbCBgb25DcmVhdGVgIGNhbGxiYWNrXG4gIC8vIHRoZSBvdGhlciBvbmVzIHdpbGwgY2FsbCBgb25VcGRhdGVgIGNhbGxiYWNrXG4gIGlmICghdGhpcy5zdGF0ZS5pc0NyZWF0ZWQpIHtcbiAgICB0aGlzLnN0YXRlLmlzQ3JlYXRlZCA9IHRydWU7XG4gICAgdGhpcy5vcHRpb25zLm9uQ3JlYXRlKGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMub3B0aW9ucy5vblVwZGF0ZShkYXRhKTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB1c2VkIHRvIGtub3cgaWYgdGhlIGdpdmVuIG1vZGlmaWVyIGlzIGVuYWJsZWQuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNNb2RpZmllckVuYWJsZWQobW9kaWZpZXJzLCBtb2RpZmllck5hbWUpIHtcbiAgcmV0dXJuIG1vZGlmaWVycy5zb21lKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICAgIGVuYWJsZWQgPSBfcmVmLmVuYWJsZWQ7XG4gICAgcmV0dXJuIGVuYWJsZWQgJiYgbmFtZSA9PT0gbW9kaWZpZXJOYW1lO1xuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHByZWZpeGVkIHN1cHBvcnRlZCBwcm9wZXJ0eSBuYW1lXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge1N0cmluZ30gcHJvcGVydHkgKGNhbWVsQ2FzZSlcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHByZWZpeGVkIHByb3BlcnR5IChjYW1lbENhc2Ugb3IgUGFzY2FsQ2FzZSwgZGVwZW5kaW5nIG9uIHRoZSB2ZW5kb3IgcHJlZml4KVxuICovXG5mdW5jdGlvbiBnZXRTdXBwb3J0ZWRQcm9wZXJ0eU5hbWUocHJvcGVydHkpIHtcbiAgdmFyIHByZWZpeGVzID0gW2ZhbHNlLCAnbXMnLCAnV2Via2l0JywgJ01veicsICdPJ107XG4gIHZhciB1cHBlclByb3AgPSBwcm9wZXJ0eS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnNsaWNlKDEpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHJlZml4ID0gcHJlZml4ZXNbaV07XG4gICAgdmFyIHRvQ2hlY2sgPSBwcmVmaXggPyAnJyArIHByZWZpeCArIHVwcGVyUHJvcCA6IHByb3BlcnR5O1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQuYm9keS5zdHlsZVt0b0NoZWNrXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0b0NoZWNrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBEZXN0cm95cyB0aGUgcG9wcGVyLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG5mdW5jdGlvbiBkZXN0cm95KCkge1xuICB0aGlzLnN0YXRlLmlzRGVzdHJveWVkID0gdHJ1ZTtcblxuICAvLyB0b3VjaCBET00gb25seSBpZiBgYXBwbHlTdHlsZWAgbW9kaWZpZXIgaXMgZW5hYmxlZFxuICBpZiAoaXNNb2RpZmllckVuYWJsZWQodGhpcy5tb2RpZmllcnMsICdhcHBseVN0eWxlJykpIHtcbiAgICB0aGlzLnBvcHBlci5yZW1vdmVBdHRyaWJ1dGUoJ3gtcGxhY2VtZW50Jyk7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUucG9zaXRpb24gPSAnJztcbiAgICB0aGlzLnBvcHBlci5zdHlsZS50b3AgPSAnJztcbiAgICB0aGlzLnBvcHBlci5zdHlsZS5sZWZ0ID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUucmlnaHQgPSAnJztcbiAgICB0aGlzLnBvcHBlci5zdHlsZS5ib3R0b20gPSAnJztcbiAgICB0aGlzLnBvcHBlci5zdHlsZS53aWxsQ2hhbmdlID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGVbZ2V0U3VwcG9ydGVkUHJvcGVydHlOYW1lKCd0cmFuc2Zvcm0nKV0gPSAnJztcbiAgfVxuXG4gIHRoaXMuZGlzYWJsZUV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgLy8gcmVtb3ZlIHRoZSBwb3BwZXIgaWYgdXNlciBleHBsaWNpdGx5IGFza2VkIGZvciB0aGUgZGVsZXRpb24gb24gZGVzdHJveVxuICAvLyBkbyBub3QgdXNlIGByZW1vdmVgIGJlY2F1c2UgSUUxMSBkb2Vzbid0IHN1cHBvcnQgaXRcbiAgaWYgKHRoaXMub3B0aW9ucy5yZW1vdmVPbkRlc3Ryb3kpIHtcbiAgICB0aGlzLnBvcHBlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucG9wcGVyKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHdpbmRvdyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge1dpbmRvd31cbiAqL1xuZnVuY3Rpb24gZ2V0V2luZG93KGVsZW1lbnQpIHtcbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gIHJldHVybiBvd25lckRvY3VtZW50ID8gb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyA6IHdpbmRvdztcbn1cblxuZnVuY3Rpb24gYXR0YWNoVG9TY3JvbGxQYXJlbnRzKHNjcm9sbFBhcmVudCwgZXZlbnQsIGNhbGxiYWNrLCBzY3JvbGxQYXJlbnRzKSB7XG4gIHZhciBpc0JvZHkgPSBzY3JvbGxQYXJlbnQubm9kZU5hbWUgPT09ICdCT0RZJztcbiAgdmFyIHRhcmdldCA9IGlzQm9keSA/IHNjcm9sbFBhcmVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IDogc2Nyb2xsUGFyZW50O1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgY2FsbGJhY2ssIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblxuICBpZiAoIWlzQm9keSkge1xuICAgIGF0dGFjaFRvU2Nyb2xsUGFyZW50cyhnZXRTY3JvbGxQYXJlbnQodGFyZ2V0LnBhcmVudE5vZGUpLCBldmVudCwgY2FsbGJhY2ssIHNjcm9sbFBhcmVudHMpO1xuICB9XG4gIHNjcm9sbFBhcmVudHMucHVzaCh0YXJnZXQpO1xufVxuXG4vKipcbiAqIFNldHVwIG5lZWRlZCBldmVudCBsaXN0ZW5lcnMgdXNlZCB0byB1cGRhdGUgdGhlIHBvcHBlciBwb3NpdGlvblxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0dXBFdmVudExpc3RlbmVycyhyZWZlcmVuY2UsIG9wdGlvbnMsIHN0YXRlLCB1cGRhdGVCb3VuZCkge1xuICAvLyBSZXNpemUgZXZlbnQgbGlzdGVuZXIgb24gd2luZG93XG4gIHN0YXRlLnVwZGF0ZUJvdW5kID0gdXBkYXRlQm91bmQ7XG4gIGdldFdpbmRvdyhyZWZlcmVuY2UpLmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHN0YXRlLnVwZGF0ZUJvdW5kLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cbiAgLy8gU2Nyb2xsIGV2ZW50IGxpc3RlbmVyIG9uIHNjcm9sbCBwYXJlbnRzXG4gIHZhciBzY3JvbGxFbGVtZW50ID0gZ2V0U2Nyb2xsUGFyZW50KHJlZmVyZW5jZSk7XG4gIGF0dGFjaFRvU2Nyb2xsUGFyZW50cyhzY3JvbGxFbGVtZW50LCAnc2Nyb2xsJywgc3RhdGUudXBkYXRlQm91bmQsIHN0YXRlLnNjcm9sbFBhcmVudHMpO1xuICBzdGF0ZS5zY3JvbGxFbGVtZW50ID0gc2Nyb2xsRWxlbWVudDtcbiAgc3RhdGUuZXZlbnRzRW5hYmxlZCA9IHRydWU7XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIEl0IHdpbGwgYWRkIHJlc2l6ZS9zY3JvbGwgZXZlbnRzIGFuZCBzdGFydCByZWNhbGN1bGF0aW5nXG4gKiBwb3NpdGlvbiBvZiB0aGUgcG9wcGVyIGVsZW1lbnQgd2hlbiB0aGV5IGFyZSB0cmlnZ2VyZWQuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyXG4gKi9cbmZ1bmN0aW9uIGVuYWJsZUV2ZW50TGlzdGVuZXJzKCkge1xuICBpZiAoIXRoaXMuc3RhdGUuZXZlbnRzRW5hYmxlZCkge1xuICAgIHRoaXMuc3RhdGUgPSBzZXR1cEV2ZW50TGlzdGVuZXJzKHRoaXMucmVmZXJlbmNlLCB0aGlzLm9wdGlvbnMsIHRoaXMuc3RhdGUsIHRoaXMuc2NoZWR1bGVVcGRhdGUpO1xuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlIGV2ZW50IGxpc3RlbmVycyB1c2VkIHRvIHVwZGF0ZSB0aGUgcG9wcGVyIHBvc2l0aW9uXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVycyhyZWZlcmVuY2UsIHN0YXRlKSB7XG4gIC8vIFJlbW92ZSByZXNpemUgZXZlbnQgbGlzdGVuZXIgb24gd2luZG93XG4gIGdldFdpbmRvdyhyZWZlcmVuY2UpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHN0YXRlLnVwZGF0ZUJvdW5kKTtcblxuICAvLyBSZW1vdmUgc2Nyb2xsIGV2ZW50IGxpc3RlbmVyIG9uIHNjcm9sbCBwYXJlbnRzXG4gIHN0YXRlLnNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHN0YXRlLnVwZGF0ZUJvdW5kKTtcbiAgfSk7XG5cbiAgLy8gUmVzZXQgc3RhdGVcbiAgc3RhdGUudXBkYXRlQm91bmQgPSBudWxsO1xuICBzdGF0ZS5zY3JvbGxQYXJlbnRzID0gW107XG4gIHN0YXRlLnNjcm9sbEVsZW1lbnQgPSBudWxsO1xuICBzdGF0ZS5ldmVudHNFbmFibGVkID0gZmFsc2U7XG4gIHJldHVybiBzdGF0ZTtcbn1cblxuLyoqXG4gKiBJdCB3aWxsIHJlbW92ZSByZXNpemUvc2Nyb2xsIGV2ZW50cyBhbmQgd29uJ3QgcmVjYWxjdWxhdGUgcG9wcGVyIHBvc2l0aW9uXG4gKiB3aGVuIHRoZXkgYXJlIHRyaWdnZXJlZC4gSXQgYWxzbyB3b24ndCB0cmlnZ2VyIGBvblVwZGF0ZWAgY2FsbGJhY2sgYW55bW9yZSxcbiAqIHVubGVzcyB5b3UgY2FsbCBgdXBkYXRlYCBtZXRob2QgbWFudWFsbHkuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyXG4gKi9cbmZ1bmN0aW9uIGRpc2FibGVFdmVudExpc3RlbmVycygpIHtcbiAgaWYgKHRoaXMuc3RhdGUuZXZlbnRzRW5hYmxlZCkge1xuICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuc2NoZWR1bGVVcGRhdGUpO1xuICAgIHRoaXMuc3RhdGUgPSByZW1vdmVFdmVudExpc3RlbmVycyh0aGlzLnJlZmVyZW5jZSwgdGhpcy5zdGF0ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUZWxscyBpZiBhIGdpdmVuIGlucHV0IGlzIGEgbnVtYmVyXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0geyp9IGlucHV0IHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc051bWVyaWMobikge1xuICByZXR1cm4gbiAhPT0gJycgJiYgIWlzTmFOKHBhcnNlRmxvYXQobikpICYmIGlzRmluaXRlKG4pO1xufVxuXG4vKipcbiAqIFNldCB0aGUgc3R5bGUgdG8gdGhlIGdpdmVuIHBvcHBlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBhcHBseSB0aGUgc3R5bGUgdG9cbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBzdHlsZXNcbiAqIE9iamVjdCB3aXRoIGEgbGlzdCBvZiBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHNldFN0eWxlcyhlbGVtZW50LCBzdHlsZXMpIHtcbiAgT2JqZWN0LmtleXMoc3R5bGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgdmFyIHVuaXQgPSAnJztcbiAgICAvLyBhZGQgdW5pdCBpZiB0aGUgdmFsdWUgaXMgbnVtZXJpYyBhbmQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmdcbiAgICBpZiAoWyd3aWR0aCcsICdoZWlnaHQnLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J10uaW5kZXhPZihwcm9wKSAhPT0gLTEgJiYgaXNOdW1lcmljKHN0eWxlc1twcm9wXSkpIHtcbiAgICAgIHVuaXQgPSAncHgnO1xuICAgIH1cbiAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gc3R5bGVzW3Byb3BdICsgdW5pdDtcbiAgfSk7XG59XG5cbi8qKlxuICogU2V0IHRoZSBhdHRyaWJ1dGVzIHRvIHRoZSBnaXZlbiBwb3BwZXJcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gYXBwbHkgdGhlIGF0dHJpYnV0ZXMgdG9cbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBzdHlsZXNcbiAqIE9iamVjdCB3aXRoIGEgbGlzdCBvZiBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZXMoZWxlbWVudCwgYXR0cmlidXRlcykge1xuICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgdmFyIHZhbHVlID0gYXR0cmlidXRlc1twcm9wXTtcbiAgICBpZiAodmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShwcm9wLCBhdHRyaWJ1dGVzW3Byb3BdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUocHJvcCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhLnN0eWxlcyAtIExpc3Qgb2Ygc3R5bGUgcHJvcGVydGllcyAtIHZhbHVlcyB0byBhcHBseSB0byBwb3BwZXIgZWxlbWVudFxuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEuYXR0cmlidXRlcyAtIExpc3Qgb2YgYXR0cmlidXRlIHByb3BlcnRpZXMgLSB2YWx1ZXMgdG8gYXBwbHkgdG8gcG9wcGVyIGVsZW1lbnRcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBzYW1lIGRhdGEgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGFwcGx5U3R5bGUoZGF0YSkge1xuICAvLyBhbnkgcHJvcGVydHkgcHJlc2VudCBpbiBgZGF0YS5zdHlsZXNgIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyLFxuICAvLyBpbiB0aGlzIHdheSB3ZSBjYW4gbWFrZSB0aGUgM3JkIHBhcnR5IG1vZGlmaWVycyBhZGQgY3VzdG9tIHN0eWxlcyB0byBpdFxuICAvLyBCZSBhd2FyZSwgbW9kaWZpZXJzIGNvdWxkIG92ZXJyaWRlIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhlIHByZXZpb3VzXG4gIC8vIGxpbmVzIG9mIHRoaXMgbW9kaWZpZXIhXG4gIHNldFN0eWxlcyhkYXRhLmluc3RhbmNlLnBvcHBlciwgZGF0YS5zdHlsZXMpO1xuXG4gIC8vIGFueSBwcm9wZXJ0eSBwcmVzZW50IGluIGBkYXRhLmF0dHJpYnV0ZXNgIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyLFxuICAvLyB0aGV5IHdpbGwgYmUgc2V0IGFzIEhUTUwgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudFxuICBzZXRBdHRyaWJ1dGVzKGRhdGEuaW5zdGFuY2UucG9wcGVyLCBkYXRhLmF0dHJpYnV0ZXMpO1xuXG4gIC8vIGlmIGFycm93RWxlbWVudCBpcyBkZWZpbmVkIGFuZCBhcnJvd1N0eWxlcyBoYXMgc29tZSBwcm9wZXJ0aWVzXG4gIGlmIChkYXRhLmFycm93RWxlbWVudCAmJiBPYmplY3Qua2V5cyhkYXRhLmFycm93U3R5bGVzKS5sZW5ndGgpIHtcbiAgICBzZXRTdHlsZXMoZGF0YS5hcnJvd0VsZW1lbnQsIGRhdGEuYXJyb3dTdHlsZXMpO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogU2V0IHRoZSB4LXBsYWNlbWVudCBhdHRyaWJ1dGUgYmVmb3JlIGV2ZXJ5dGhpbmcgZWxzZSBiZWNhdXNlIGl0IGNvdWxkIGJlIHVzZWRcbiAqIHRvIGFkZCBtYXJnaW5zIHRvIHRoZSBwb3BwZXIgbWFyZ2lucyBuZWVkcyB0byBiZSBjYWxjdWxhdGVkIHRvIGdldCB0aGVcbiAqIGNvcnJlY3QgcG9wcGVyIG9mZnNldHMuXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLm1vZGlmaWVyc1xuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcmVmZXJlbmNlIC0gVGhlIHJlZmVyZW5jZSBlbGVtZW50IHVzZWQgdG8gcG9zaXRpb24gdGhlIHBvcHBlclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcG9wcGVyIC0gVGhlIEhUTUwgZWxlbWVudCB1c2VkIGFzIHBvcHBlclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBQb3BwZXIuanMgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBhcHBseVN0eWxlT25Mb2FkKHJlZmVyZW5jZSwgcG9wcGVyLCBvcHRpb25zLCBtb2RpZmllck9wdGlvbnMsIHN0YXRlKSB7XG4gIC8vIGNvbXB1dGUgcmVmZXJlbmNlIGVsZW1lbnQgb2Zmc2V0c1xuICB2YXIgcmVmZXJlbmNlT2Zmc2V0cyA9IGdldFJlZmVyZW5jZU9mZnNldHMoc3RhdGUsIHBvcHBlciwgcmVmZXJlbmNlLCBvcHRpb25zLnBvc2l0aW9uRml4ZWQpO1xuXG4gIC8vIGNvbXB1dGUgYXV0byBwbGFjZW1lbnQsIHN0b3JlIHBsYWNlbWVudCBpbnNpZGUgdGhlIGRhdGEgb2JqZWN0LFxuICAvLyBtb2RpZmllcnMgd2lsbCBiZSBhYmxlIHRvIGVkaXQgYHBsYWNlbWVudGAgaWYgbmVlZGVkXG4gIC8vIGFuZCByZWZlciB0byBvcmlnaW5hbFBsYWNlbWVudCB0byBrbm93IHRoZSBvcmlnaW5hbCB2YWx1ZVxuICB2YXIgcGxhY2VtZW50ID0gY29tcHV0ZUF1dG9QbGFjZW1lbnQob3B0aW9ucy5wbGFjZW1lbnQsIHJlZmVyZW5jZU9mZnNldHMsIHBvcHBlciwgcmVmZXJlbmNlLCBvcHRpb25zLm1vZGlmaWVycy5mbGlwLmJvdW5kYXJpZXNFbGVtZW50LCBvcHRpb25zLm1vZGlmaWVycy5mbGlwLnBhZGRpbmcpO1xuXG4gIHBvcHBlci5zZXRBdHRyaWJ1dGUoJ3gtcGxhY2VtZW50JywgcGxhY2VtZW50KTtcblxuICAvLyBBcHBseSBgcG9zaXRpb25gIHRvIHBvcHBlciBiZWZvcmUgYW55dGhpbmcgZWxzZSBiZWNhdXNlXG4gIC8vIHdpdGhvdXQgdGhlIHBvc2l0aW9uIGFwcGxpZWQgd2UgY2FuJ3QgZ3VhcmFudGVlIGNvcnJlY3QgY29tcHV0YXRpb25zXG4gIHNldFN0eWxlcyhwb3BwZXIsIHsgcG9zaXRpb246IG9wdGlvbnMucG9zaXRpb25GaXhlZCA/ICdmaXhlZCcgOiAnYWJzb2x1dGUnIH0pO1xuXG4gIHJldHVybiBvcHRpb25zO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtCb29sZWFufSBzaG91bGRSb3VuZCAtIElmIHRoZSBvZmZzZXRzIHNob3VsZCBiZSByb3VuZGVkIGF0IGFsbFxuICogQHJldHVybnMge09iamVjdH0gVGhlIHBvcHBlcidzIHBvc2l0aW9uIG9mZnNldHMgcm91bmRlZFxuICpcbiAqIFRoZSB0YWxlIG9mIHBpeGVsLXBlcmZlY3QgcG9zaXRpb25pbmcuIEl0J3Mgc3RpbGwgbm90IDEwMCUgcGVyZmVjdCwgYnV0IGFzXG4gKiBnb29kIGFzIGl0IGNhbiBiZSB3aXRoaW4gcmVhc29uLlxuICogRGlzY3Vzc2lvbiBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vRmV6VnJhc3RhL3BvcHBlci5qcy9wdWxsLzcxNVxuICpcbiAqIExvdyBEUEkgc2NyZWVucyBjYXVzZSBhIHBvcHBlciB0byBiZSBibHVycnkgaWYgbm90IHVzaW5nIGZ1bGwgcGl4ZWxzIChTYWZhcmlcbiAqIGFzIHdlbGwgb24gSGlnaCBEUEkgc2NyZWVucykuXG4gKlxuICogRmlyZWZveCBwcmVmZXJzIG5vIHJvdW5kaW5nIGZvciBwb3NpdGlvbmluZyBhbmQgZG9lcyBub3QgaGF2ZSBibHVycmluZXNzIG9uXG4gKiBoaWdoIERQSSBzY3JlZW5zLlxuICpcbiAqIE9ubHkgaG9yaXpvbnRhbCBwbGFjZW1lbnQgYW5kIGxlZnQvcmlnaHQgdmFsdWVzIG5lZWQgdG8gYmUgY29uc2lkZXJlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0Um91bmRlZE9mZnNldHMoZGF0YSwgc2hvdWxkUm91bmQpIHtcbiAgdmFyIF9kYXRhJG9mZnNldHMgPSBkYXRhLm9mZnNldHMsXG4gICAgICBwb3BwZXIgPSBfZGF0YSRvZmZzZXRzLnBvcHBlcixcbiAgICAgIHJlZmVyZW5jZSA9IF9kYXRhJG9mZnNldHMucmVmZXJlbmNlO1xuICB2YXIgcm91bmQgPSBNYXRoLnJvdW5kLFxuICAgICAgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4gIHZhciBub1JvdW5kID0gZnVuY3Rpb24gbm9Sb3VuZCh2KSB7XG4gICAgcmV0dXJuIHY7XG4gIH07XG5cbiAgdmFyIHJlZmVyZW5jZVdpZHRoID0gcm91bmQocmVmZXJlbmNlLndpZHRoKTtcbiAgdmFyIHBvcHBlcldpZHRoID0gcm91bmQocG9wcGVyLndpZHRoKTtcblxuICB2YXIgaXNWZXJ0aWNhbCA9IFsnbGVmdCcsICdyaWdodCddLmluZGV4T2YoZGF0YS5wbGFjZW1lbnQpICE9PSAtMTtcbiAgdmFyIGlzVmFyaWF0aW9uID0gZGF0YS5wbGFjZW1lbnQuaW5kZXhPZignLScpICE9PSAtMTtcbiAgdmFyIHNhbWVXaWR0aFBhcml0eSA9IHJlZmVyZW5jZVdpZHRoICUgMiA9PT0gcG9wcGVyV2lkdGggJSAyO1xuICB2YXIgYm90aE9kZFdpZHRoID0gcmVmZXJlbmNlV2lkdGggJSAyID09PSAxICYmIHBvcHBlcldpZHRoICUgMiA9PT0gMTtcblxuICB2YXIgaG9yaXpvbnRhbFRvSW50ZWdlciA9ICFzaG91bGRSb3VuZCA/IG5vUm91bmQgOiBpc1ZlcnRpY2FsIHx8IGlzVmFyaWF0aW9uIHx8IHNhbWVXaWR0aFBhcml0eSA/IHJvdW5kIDogZmxvb3I7XG4gIHZhciB2ZXJ0aWNhbFRvSW50ZWdlciA9ICFzaG91bGRSb3VuZCA/IG5vUm91bmQgOiByb3VuZDtcblxuICByZXR1cm4ge1xuICAgIGxlZnQ6IGhvcml6b250YWxUb0ludGVnZXIoYm90aE9kZFdpZHRoICYmICFpc1ZhcmlhdGlvbiAmJiBzaG91bGRSb3VuZCA/IHBvcHBlci5sZWZ0IC0gMSA6IHBvcHBlci5sZWZ0KSxcbiAgICB0b3A6IHZlcnRpY2FsVG9JbnRlZ2VyKHBvcHBlci50b3ApLFxuICAgIGJvdHRvbTogdmVydGljYWxUb0ludGVnZXIocG9wcGVyLmJvdHRvbSksXG4gICAgcmlnaHQ6IGhvcml6b250YWxUb0ludGVnZXIocG9wcGVyLnJpZ2h0KVxuICB9O1xufVxuXG52YXIgaXNGaXJlZm94ID0gaXNCcm93c2VyICYmIC9GaXJlZm94L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZVN0eWxlKGRhdGEsIG9wdGlvbnMpIHtcbiAgdmFyIHggPSBvcHRpb25zLngsXG4gICAgICB5ID0gb3B0aW9ucy55O1xuICB2YXIgcG9wcGVyID0gZGF0YS5vZmZzZXRzLnBvcHBlcjtcblxuICAvLyBSZW1vdmUgdGhpcyBsZWdhY3kgc3VwcG9ydCBpbiBQb3BwZXIuanMgdjJcblxuICB2YXIgbGVnYWN5R3B1QWNjZWxlcmF0aW9uT3B0aW9uID0gZmluZChkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgcmV0dXJuIG1vZGlmaWVyLm5hbWUgPT09ICdhcHBseVN0eWxlJztcbiAgfSkuZ3B1QWNjZWxlcmF0aW9uO1xuICBpZiAobGVnYWN5R3B1QWNjZWxlcmF0aW9uT3B0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IGBncHVBY2NlbGVyYXRpb25gIG9wdGlvbiBtb3ZlZCB0byBgY29tcHV0ZVN0eWxlYCBtb2RpZmllciBhbmQgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBQb3BwZXIuanMhJyk7XG4gIH1cbiAgdmFyIGdwdUFjY2VsZXJhdGlvbiA9IGxlZ2FjeUdwdUFjY2VsZXJhdGlvbk9wdGlvbiAhPT0gdW5kZWZpbmVkID8gbGVnYWN5R3B1QWNjZWxlcmF0aW9uT3B0aW9uIDogb3B0aW9ucy5ncHVBY2NlbGVyYXRpb247XG5cbiAgdmFyIG9mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudChkYXRhLmluc3RhbmNlLnBvcHBlcik7XG4gIHZhciBvZmZzZXRQYXJlbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KG9mZnNldFBhcmVudCk7XG5cbiAgLy8gU3R5bGVzXG4gIHZhciBzdHlsZXMgPSB7XG4gICAgcG9zaXRpb246IHBvcHBlci5wb3NpdGlvblxuICB9O1xuXG4gIHZhciBvZmZzZXRzID0gZ2V0Um91bmRlZE9mZnNldHMoZGF0YSwgd2luZG93LmRldmljZVBpeGVsUmF0aW8gPCAyIHx8ICFpc0ZpcmVmb3gpO1xuXG4gIHZhciBzaWRlQSA9IHggPT09ICdib3R0b20nID8gJ3RvcCcgOiAnYm90dG9tJztcbiAgdmFyIHNpZGVCID0geSA9PT0gJ3JpZ2h0JyA/ICdsZWZ0JyA6ICdyaWdodCc7XG5cbiAgLy8gaWYgZ3B1QWNjZWxlcmF0aW9uIGlzIHNldCB0byBgdHJ1ZWAgYW5kIHRyYW5zZm9ybSBpcyBzdXBwb3J0ZWQsXG4gIC8vICB3ZSB1c2UgYHRyYW5zbGF0ZTNkYCB0byBhcHBseSB0aGUgcG9zaXRpb24gdG8gdGhlIHBvcHBlciB3ZVxuICAvLyBhdXRvbWF0aWNhbGx5IHVzZSB0aGUgc3VwcG9ydGVkIHByZWZpeGVkIHZlcnNpb24gaWYgbmVlZGVkXG4gIHZhciBwcmVmaXhlZFByb3BlcnR5ID0gZ2V0U3VwcG9ydGVkUHJvcGVydHlOYW1lKCd0cmFuc2Zvcm0nKTtcblxuICAvLyBub3csIGxldCdzIG1ha2UgYSBzdGVwIGJhY2sgYW5kIGxvb2sgYXQgdGhpcyBjb2RlIGNsb3NlbHkgKHd0Zj8pXG4gIC8vIElmIHRoZSBjb250ZW50IG9mIHRoZSBwb3BwZXIgZ3Jvd3Mgb25jZSBpdCdzIGJlZW4gcG9zaXRpb25lZCwgaXRcbiAgLy8gbWF5IGhhcHBlbiB0aGF0IHRoZSBwb3BwZXIgZ2V0cyBtaXNwbGFjZWQgYmVjYXVzZSBvZiB0aGUgbmV3IGNvbnRlbnRcbiAgLy8gb3ZlcmZsb3dpbmcgaXRzIHJlZmVyZW5jZSBlbGVtZW50XG4gIC8vIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgd2UgcHJvdmlkZSB0d28gb3B0aW9ucyAoeCBhbmQgeSksIHdoaWNoIGFsbG93XG4gIC8vIHRoZSBjb25zdW1lciB0byBkZWZpbmUgdGhlIG9mZnNldCBvcmlnaW4uXG4gIC8vIElmIHdlIHBvc2l0aW9uIGEgcG9wcGVyIG9uIHRvcCBvZiBhIHJlZmVyZW5jZSBlbGVtZW50LCB3ZSBjYW4gc2V0XG4gIC8vIGB4YCB0byBgdG9wYCB0byBtYWtlIHRoZSBwb3BwZXIgZ3JvdyB0b3dhcmRzIGl0cyB0b3AgaW5zdGVhZCBvZlxuICAvLyBpdHMgYm90dG9tLlxuICB2YXIgbGVmdCA9IHZvaWQgMCxcbiAgICAgIHRvcCA9IHZvaWQgMDtcbiAgaWYgKHNpZGVBID09PSAnYm90dG9tJykge1xuICAgIC8vIHdoZW4gb2Zmc2V0UGFyZW50IGlzIDxodG1sPiB0aGUgcG9zaXRpb25pbmcgaXMgcmVsYXRpdmUgdG8gdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuIChleGNsdWRpbmcgdGhlIHNjcm9sbGJhcilcbiAgICAvLyBhbmQgbm90IHRoZSBib3R0b20gb2YgdGhlIGh0bWwgZWxlbWVudFxuICAgIGlmIChvZmZzZXRQYXJlbnQubm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgICAgdG9wID0gLW9mZnNldFBhcmVudC5jbGllbnRIZWlnaHQgKyBvZmZzZXRzLmJvdHRvbTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9wID0gLW9mZnNldFBhcmVudFJlY3QuaGVpZ2h0ICsgb2Zmc2V0cy5ib3R0b207XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRvcCA9IG9mZnNldHMudG9wO1xuICB9XG4gIGlmIChzaWRlQiA9PT0gJ3JpZ2h0Jykge1xuICAgIGlmIChvZmZzZXRQYXJlbnQubm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgICAgbGVmdCA9IC1vZmZzZXRQYXJlbnQuY2xpZW50V2lkdGggKyBvZmZzZXRzLnJpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICBsZWZ0ID0gLW9mZnNldFBhcmVudFJlY3Qud2lkdGggKyBvZmZzZXRzLnJpZ2h0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZWZ0ID0gb2Zmc2V0cy5sZWZ0O1xuICB9XG4gIGlmIChncHVBY2NlbGVyYXRpb24gJiYgcHJlZml4ZWRQcm9wZXJ0eSkge1xuICAgIHN0eWxlc1twcmVmaXhlZFByb3BlcnR5XSA9ICd0cmFuc2xhdGUzZCgnICsgbGVmdCArICdweCwgJyArIHRvcCArICdweCwgMCknO1xuICAgIHN0eWxlc1tzaWRlQV0gPSAwO1xuICAgIHN0eWxlc1tzaWRlQl0gPSAwO1xuICAgIHN0eWxlcy53aWxsQ2hhbmdlID0gJ3RyYW5zZm9ybSc7XG4gIH0gZWxzZSB7XG4gICAgLy8gb3Rod2VyaXNlLCB3ZSB1c2UgdGhlIHN0YW5kYXJkIGB0b3BgLCBgbGVmdGAsIGBib3R0b21gIGFuZCBgcmlnaHRgIHByb3BlcnRpZXNcbiAgICB2YXIgaW52ZXJ0VG9wID0gc2lkZUEgPT09ICdib3R0b20nID8gLTEgOiAxO1xuICAgIHZhciBpbnZlcnRMZWZ0ID0gc2lkZUIgPT09ICdyaWdodCcgPyAtMSA6IDE7XG4gICAgc3R5bGVzW3NpZGVBXSA9IHRvcCAqIGludmVydFRvcDtcbiAgICBzdHlsZXNbc2lkZUJdID0gbGVmdCAqIGludmVydExlZnQ7XG4gICAgc3R5bGVzLndpbGxDaGFuZ2UgPSBzaWRlQSArICcsICcgKyBzaWRlQjtcbiAgfVxuXG4gIC8vIEF0dHJpYnV0ZXNcbiAgdmFyIGF0dHJpYnV0ZXMgPSB7XG4gICAgJ3gtcGxhY2VtZW50JzogZGF0YS5wbGFjZW1lbnRcbiAgfTtcblxuICAvLyBVcGRhdGUgYGRhdGFgIGF0dHJpYnV0ZXMsIHN0eWxlcyBhbmQgYXJyb3dTdHlsZXNcbiAgZGF0YS5hdHRyaWJ1dGVzID0gX2V4dGVuZHMoe30sIGF0dHJpYnV0ZXMsIGRhdGEuYXR0cmlidXRlcyk7XG4gIGRhdGEuc3R5bGVzID0gX2V4dGVuZHMoe30sIHN0eWxlcywgZGF0YS5zdHlsZXMpO1xuICBkYXRhLmFycm93U3R5bGVzID0gX2V4dGVuZHMoe30sIGRhdGEub2Zmc2V0cy5hcnJvdywgZGF0YS5hcnJvd1N0eWxlcyk7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogSGVscGVyIHVzZWQgdG8ga25vdyBpZiB0aGUgZ2l2ZW4gbW9kaWZpZXIgZGVwZW5kcyBmcm9tIGFub3RoZXIgb25lLjxiciAvPlxuICogSXQgY2hlY2tzIGlmIHRoZSBuZWVkZWQgbW9kaWZpZXIgaXMgbGlzdGVkIGFuZCBlbmFibGVkLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtBcnJheX0gbW9kaWZpZXJzIC0gbGlzdCBvZiBtb2RpZmllcnNcbiAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0aW5nTmFtZSAtIG5hbWUgb2YgcmVxdWVzdGluZyBtb2RpZmllclxuICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RlZE5hbWUgLSBuYW1lIG9mIHJlcXVlc3RlZCBtb2RpZmllclxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTW9kaWZpZXJSZXF1aXJlZChtb2RpZmllcnMsIHJlcXVlc3RpbmdOYW1lLCByZXF1ZXN0ZWROYW1lKSB7XG4gIHZhciByZXF1ZXN0aW5nID0gZmluZChtb2RpZmllcnMsIGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIG5hbWUgPSBfcmVmLm5hbWU7XG4gICAgcmV0dXJuIG5hbWUgPT09IHJlcXVlc3RpbmdOYW1lO1xuICB9KTtcblxuICB2YXIgaXNSZXF1aXJlZCA9ICEhcmVxdWVzdGluZyAmJiBtb2RpZmllcnMuc29tZShmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICByZXR1cm4gbW9kaWZpZXIubmFtZSA9PT0gcmVxdWVzdGVkTmFtZSAmJiBtb2RpZmllci5lbmFibGVkICYmIG1vZGlmaWVyLm9yZGVyIDwgcmVxdWVzdGluZy5vcmRlcjtcbiAgfSk7XG5cbiAgaWYgKCFpc1JlcXVpcmVkKSB7XG4gICAgdmFyIF9yZXF1ZXN0aW5nID0gJ2AnICsgcmVxdWVzdGluZ05hbWUgKyAnYCc7XG4gICAgdmFyIHJlcXVlc3RlZCA9ICdgJyArIHJlcXVlc3RlZE5hbWUgKyAnYCc7XG4gICAgY29uc29sZS53YXJuKHJlcXVlc3RlZCArICcgbW9kaWZpZXIgaXMgcmVxdWlyZWQgYnkgJyArIF9yZXF1ZXN0aW5nICsgJyBtb2RpZmllciBpbiBvcmRlciB0byB3b3JrLCBiZSBzdXJlIHRvIGluY2x1ZGUgaXQgYmVmb3JlICcgKyBfcmVxdWVzdGluZyArICchJyk7XG4gIH1cbiAgcmV0dXJuIGlzUmVxdWlyZWQ7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgdXBkYXRlIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBhcnJvdyhkYXRhLCBvcHRpb25zKSB7XG4gIHZhciBfZGF0YSRvZmZzZXRzJGFycm93O1xuXG4gIC8vIGFycm93IGRlcGVuZHMgb24ga2VlcFRvZ2V0aGVyIGluIG9yZGVyIHRvIHdvcmtcbiAgaWYgKCFpc01vZGlmaWVyUmVxdWlyZWQoZGF0YS5pbnN0YW5jZS5tb2RpZmllcnMsICdhcnJvdycsICdrZWVwVG9nZXRoZXInKSkge1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgdmFyIGFycm93RWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudDtcblxuICAvLyBpZiBhcnJvd0VsZW1lbnQgaXMgYSBzdHJpbmcsIHN1cHBvc2UgaXQncyBhIENTUyBzZWxlY3RvclxuICBpZiAodHlwZW9mIGFycm93RWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICBhcnJvd0VsZW1lbnQgPSBkYXRhLmluc3RhbmNlLnBvcHBlci5xdWVyeVNlbGVjdG9yKGFycm93RWxlbWVudCk7XG5cbiAgICAvLyBpZiBhcnJvd0VsZW1lbnQgaXMgbm90IGZvdW5kLCBkb24ndCBydW4gdGhlIG1vZGlmaWVyXG4gICAgaWYgKCFhcnJvd0VsZW1lbnQpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBpZiB0aGUgYXJyb3dFbGVtZW50IGlzbid0IGEgcXVlcnkgc2VsZWN0b3Igd2UgbXVzdCBjaGVjayB0aGF0IHRoZVxuICAgIC8vIHByb3ZpZGVkIERPTSBub2RlIGlzIGNoaWxkIG9mIGl0cyBwb3BwZXIgbm9kZVxuICAgIGlmICghZGF0YS5pbnN0YW5jZS5wb3BwZXIuY29udGFpbnMoYXJyb3dFbGVtZW50KSkge1xuICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBgYXJyb3cuZWxlbWVudGAgbXVzdCBiZSBjaGlsZCBvZiBpdHMgcG9wcGVyIGVsZW1lbnQhJyk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gIH1cblxuICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgdmFyIF9kYXRhJG9mZnNldHMgPSBkYXRhLm9mZnNldHMsXG4gICAgICBwb3BwZXIgPSBfZGF0YSRvZmZzZXRzLnBvcHBlcixcbiAgICAgIHJlZmVyZW5jZSA9IF9kYXRhJG9mZnNldHMucmVmZXJlbmNlO1xuXG4gIHZhciBpc1ZlcnRpY2FsID0gWydsZWZ0JywgJ3JpZ2h0J10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMTtcblxuICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgdmFyIHNpZGVDYXBpdGFsaXplZCA9IGlzVmVydGljYWwgPyAnVG9wJyA6ICdMZWZ0JztcbiAgdmFyIHNpZGUgPSBzaWRlQ2FwaXRhbGl6ZWQudG9Mb3dlckNhc2UoKTtcbiAgdmFyIGFsdFNpZGUgPSBpc1ZlcnRpY2FsID8gJ2xlZnQnIDogJ3RvcCc7XG4gIHZhciBvcFNpZGUgPSBpc1ZlcnRpY2FsID8gJ2JvdHRvbScgOiAncmlnaHQnO1xuICB2YXIgYXJyb3dFbGVtZW50U2l6ZSA9IGdldE91dGVyU2l6ZXMoYXJyb3dFbGVtZW50KVtsZW5dO1xuXG4gIC8vXG4gIC8vIGV4dGVuZHMga2VlcFRvZ2V0aGVyIGJlaGF2aW9yIG1ha2luZyBzdXJlIHRoZSBwb3BwZXIgYW5kIGl0c1xuICAvLyByZWZlcmVuY2UgaGF2ZSBlbm91Z2ggcGl4ZWxzIGluIGNvbmp1bmN0aW9uXG4gIC8vXG5cbiAgLy8gdG9wL2xlZnQgc2lkZVxuICBpZiAocmVmZXJlbmNlW29wU2lkZV0gLSBhcnJvd0VsZW1lbnRTaXplIDwgcG9wcGVyW3NpZGVdKSB7XG4gICAgZGF0YS5vZmZzZXRzLnBvcHBlcltzaWRlXSAtPSBwb3BwZXJbc2lkZV0gLSAocmVmZXJlbmNlW29wU2lkZV0gLSBhcnJvd0VsZW1lbnRTaXplKTtcbiAgfVxuICAvLyBib3R0b20vcmlnaHQgc2lkZVxuICBpZiAocmVmZXJlbmNlW3NpZGVdICsgYXJyb3dFbGVtZW50U2l6ZSA+IHBvcHBlcltvcFNpZGVdKSB7XG4gICAgZGF0YS5vZmZzZXRzLnBvcHBlcltzaWRlXSArPSByZWZlcmVuY2Vbc2lkZV0gKyBhcnJvd0VsZW1lbnRTaXplIC0gcG9wcGVyW29wU2lkZV07XG4gIH1cbiAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IGdldENsaWVudFJlY3QoZGF0YS5vZmZzZXRzLnBvcHBlcik7XG5cbiAgLy8gY29tcHV0ZSBjZW50ZXIgb2YgdGhlIHBvcHBlclxuICB2YXIgY2VudGVyID0gcmVmZXJlbmNlW3NpZGVdICsgcmVmZXJlbmNlW2xlbl0gLyAyIC0gYXJyb3dFbGVtZW50U2l6ZSAvIDI7XG5cbiAgLy8gQ29tcHV0ZSB0aGUgc2lkZVZhbHVlIHVzaW5nIHRoZSB1cGRhdGVkIHBvcHBlciBvZmZzZXRzXG4gIC8vIHRha2UgcG9wcGVyIG1hcmdpbiBpbiBhY2NvdW50IGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aGlzIGluZm8gYXZhaWxhYmxlXG4gIHZhciBjc3MgPSBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkoZGF0YS5pbnN0YW5jZS5wb3BwZXIpO1xuICB2YXIgcG9wcGVyTWFyZ2luU2lkZSA9IHBhcnNlRmxvYXQoY3NzWydtYXJnaW4nICsgc2lkZUNhcGl0YWxpemVkXSk7XG4gIHZhciBwb3BwZXJCb3JkZXJTaWRlID0gcGFyc2VGbG9hdChjc3NbJ2JvcmRlcicgKyBzaWRlQ2FwaXRhbGl6ZWQgKyAnV2lkdGgnXSk7XG4gIHZhciBzaWRlVmFsdWUgPSBjZW50ZXIgLSBkYXRhLm9mZnNldHMucG9wcGVyW3NpZGVdIC0gcG9wcGVyTWFyZ2luU2lkZSAtIHBvcHBlckJvcmRlclNpZGU7XG5cbiAgLy8gcHJldmVudCBhcnJvd0VsZW1lbnQgZnJvbSBiZWluZyBwbGFjZWQgbm90IGNvbnRpZ3VvdXNseSB0byBpdHMgcG9wcGVyXG4gIHNpZGVWYWx1ZSA9IE1hdGgubWF4KE1hdGgubWluKHBvcHBlcltsZW5dIC0gYXJyb3dFbGVtZW50U2l6ZSwgc2lkZVZhbHVlKSwgMCk7XG5cbiAgZGF0YS5hcnJvd0VsZW1lbnQgPSBhcnJvd0VsZW1lbnQ7XG4gIGRhdGEub2Zmc2V0cy5hcnJvdyA9IChfZGF0YSRvZmZzZXRzJGFycm93ID0ge30sIGRlZmluZVByb3BlcnR5KF9kYXRhJG9mZnNldHMkYXJyb3csIHNpZGUsIE1hdGgucm91bmQoc2lkZVZhbHVlKSksIGRlZmluZVByb3BlcnR5KF9kYXRhJG9mZnNldHMkYXJyb3csIGFsdFNpZGUsICcnKSwgX2RhdGEkb2Zmc2V0cyRhcnJvdyk7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogR2V0IHRoZSBvcHBvc2l0ZSBwbGFjZW1lbnQgdmFyaWF0aW9uIG9mIHRoZSBnaXZlbiBvbmVcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBwbGFjZW1lbnQgdmFyaWF0aW9uXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBmbGlwcGVkIHBsYWNlbWVudCB2YXJpYXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVWYXJpYXRpb24odmFyaWF0aW9uKSB7XG4gIGlmICh2YXJpYXRpb24gPT09ICdlbmQnKSB7XG4gICAgcmV0dXJuICdzdGFydCc7XG4gIH0gZWxzZSBpZiAodmFyaWF0aW9uID09PSAnc3RhcnQnKSB7XG4gICAgcmV0dXJuICdlbmQnO1xuICB9XG4gIHJldHVybiB2YXJpYXRpb247XG59XG5cbi8qKlxuICogTGlzdCBvZiBhY2NlcHRlZCBwbGFjZW1lbnRzIHRvIHVzZSBhcyB2YWx1ZXMgb2YgdGhlIGBwbGFjZW1lbnRgIG9wdGlvbi48YnIgLz5cbiAqIFZhbGlkIHBsYWNlbWVudHMgYXJlOlxuICogLSBgYXV0b2BcbiAqIC0gYHRvcGBcbiAqIC0gYHJpZ2h0YFxuICogLSBgYm90dG9tYFxuICogLSBgbGVmdGBcbiAqXG4gKiBFYWNoIHBsYWNlbWVudCBjYW4gaGF2ZSBhIHZhcmlhdGlvbiBmcm9tIHRoaXMgbGlzdDpcbiAqIC0gYC1zdGFydGBcbiAqIC0gYC1lbmRgXG4gKlxuICogVmFyaWF0aW9ucyBhcmUgaW50ZXJwcmV0ZWQgZWFzaWx5IGlmIHlvdSB0aGluayBvZiB0aGVtIGFzIHRoZSBsZWZ0IHRvIHJpZ2h0XG4gKiB3cml0dGVuIGxhbmd1YWdlcy4gSG9yaXpvbnRhbGx5IChgdG9wYCBhbmQgYGJvdHRvbWApLCBgc3RhcnRgIGlzIGxlZnQgYW5kIGBlbmRgXG4gKiBpcyByaWdodC48YnIgLz5cbiAqIFZlcnRpY2FsbHkgKGBsZWZ0YCBhbmQgYHJpZ2h0YCksIGBzdGFydGAgaXMgdG9wIGFuZCBgZW5kYCBpcyBib3R0b20uXG4gKlxuICogU29tZSB2YWxpZCBleGFtcGxlcyBhcmU6XG4gKiAtIGB0b3AtZW5kYCAob24gdG9wIG9mIHJlZmVyZW5jZSwgcmlnaHQgYWxpZ25lZClcbiAqIC0gYHJpZ2h0LXN0YXJ0YCAob24gcmlnaHQgb2YgcmVmZXJlbmNlLCB0b3AgYWxpZ25lZClcbiAqIC0gYGJvdHRvbWAgKG9uIGJvdHRvbSwgY2VudGVyZWQpXG4gKiAtIGBhdXRvLWVuZGAgKG9uIHRoZSBzaWRlIHdpdGggbW9yZSBzcGFjZSBhdmFpbGFibGUsIGFsaWdubWVudCBkZXBlbmRzIGJ5IHBsYWNlbWVudClcbiAqXG4gKiBAc3RhdGljXG4gKiBAdHlwZSB7QXJyYXl9XG4gKiBAZW51bSB7U3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWV0aG9kIHBsYWNlbWVudHNcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xudmFyIHBsYWNlbWVudHMgPSBbJ2F1dG8tc3RhcnQnLCAnYXV0bycsICdhdXRvLWVuZCcsICd0b3Atc3RhcnQnLCAndG9wJywgJ3RvcC1lbmQnLCAncmlnaHQtc3RhcnQnLCAncmlnaHQnLCAncmlnaHQtZW5kJywgJ2JvdHRvbS1lbmQnLCAnYm90dG9tJywgJ2JvdHRvbS1zdGFydCcsICdsZWZ0LWVuZCcsICdsZWZ0JywgJ2xlZnQtc3RhcnQnXTtcblxuLy8gR2V0IHJpZCBvZiBgYXV0b2AgYGF1dG8tc3RhcnRgIGFuZCBgYXV0by1lbmRgXG52YXIgdmFsaWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cy5zbGljZSgzKTtcblxuLyoqXG4gKiBHaXZlbiBhbiBpbml0aWFsIHBsYWNlbWVudCwgcmV0dXJucyBhbGwgdGhlIHN1YnNlcXVlbnQgcGxhY2VtZW50c1xuICogY2xvY2t3aXNlIChvciBjb3VudGVyLWNsb2Nrd2lzZSkuXG4gKlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtTdHJpbmd9IHBsYWNlbWVudCAtIEEgdmFsaWQgcGxhY2VtZW50IChpdCBhY2NlcHRzIHZhcmlhdGlvbnMpXG4gKiBAYXJndW1lbnQge0Jvb2xlYW59IGNvdW50ZXIgLSBTZXQgdG8gdHJ1ZSB0byB3YWxrIHRoZSBwbGFjZW1lbnRzIGNvdW50ZXJjbG9ja3dpc2VcbiAqIEByZXR1cm5zIHtBcnJheX0gcGxhY2VtZW50cyBpbmNsdWRpbmcgdGhlaXIgdmFyaWF0aW9uc1xuICovXG5mdW5jdGlvbiBjbG9ja3dpc2UocGxhY2VtZW50KSB7XG4gIHZhciBjb3VudGVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICB2YXIgaW5kZXggPSB2YWxpZFBsYWNlbWVudHMuaW5kZXhPZihwbGFjZW1lbnQpO1xuICB2YXIgYXJyID0gdmFsaWRQbGFjZW1lbnRzLnNsaWNlKGluZGV4ICsgMSkuY29uY2F0KHZhbGlkUGxhY2VtZW50cy5zbGljZSgwLCBpbmRleCkpO1xuICByZXR1cm4gY291bnRlciA/IGFyci5yZXZlcnNlKCkgOiBhcnI7XG59XG5cbnZhciBCRUhBVklPUlMgPSB7XG4gIEZMSVA6ICdmbGlwJyxcbiAgQ0xPQ0tXSVNFOiAnY2xvY2t3aXNlJyxcbiAgQ09VTlRFUkNMT0NLV0lTRTogJ2NvdW50ZXJjbG9ja3dpc2UnXG59O1xuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gZmxpcChkYXRhLCBvcHRpb25zKSB7XG4gIC8vIGlmIGBpbm5lcmAgbW9kaWZpZXIgaXMgZW5hYmxlZCwgd2UgY2FuJ3QgdXNlIHRoZSBgZmxpcGAgbW9kaWZpZXJcbiAgaWYgKGlzTW9kaWZpZXJFbmFibGVkKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCAnaW5uZXInKSkge1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgaWYgKGRhdGEuZmxpcHBlZCAmJiBkYXRhLnBsYWNlbWVudCA9PT0gZGF0YS5vcmlnaW5hbFBsYWNlbWVudCkge1xuICAgIC8vIHNlZW1zIGxpa2UgZmxpcCBpcyB0cnlpbmcgdG8gbG9vcCwgcHJvYmFibHkgdGhlcmUncyBub3QgZW5vdWdoIHNwYWNlIG9uIGFueSBvZiB0aGUgZmxpcHBhYmxlIHNpZGVzXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICB2YXIgYm91bmRhcmllcyA9IGdldEJvdW5kYXJpZXMoZGF0YS5pbnN0YW5jZS5wb3BwZXIsIGRhdGEuaW5zdGFuY2UucmVmZXJlbmNlLCBvcHRpb25zLnBhZGRpbmcsIG9wdGlvbnMuYm91bmRhcmllc0VsZW1lbnQsIGRhdGEucG9zaXRpb25GaXhlZCk7XG5cbiAgdmFyIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gIHZhciBwbGFjZW1lbnRPcHBvc2l0ZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHZhciB2YXJpYXRpb24gPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzFdIHx8ICcnO1xuXG4gIHZhciBmbGlwT3JkZXIgPSBbXTtcblxuICBzd2l0Y2ggKG9wdGlvbnMuYmVoYXZpb3IpIHtcbiAgICBjYXNlIEJFSEFWSU9SUy5GTElQOlxuICAgICAgZmxpcE9yZGVyID0gW3BsYWNlbWVudCwgcGxhY2VtZW50T3Bwb3NpdGVdO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBCRUhBVklPUlMuQ0xPQ0tXSVNFOlxuICAgICAgZmxpcE9yZGVyID0gY2xvY2t3aXNlKHBsYWNlbWVudCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEJFSEFWSU9SUy5DT1VOVEVSQ0xPQ0tXSVNFOlxuICAgICAgZmxpcE9yZGVyID0gY2xvY2t3aXNlKHBsYWNlbWVudCwgdHJ1ZSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgZmxpcE9yZGVyID0gb3B0aW9ucy5iZWhhdmlvcjtcbiAgfVxuXG4gIGZsaXBPcmRlci5mb3JFYWNoKGZ1bmN0aW9uIChzdGVwLCBpbmRleCkge1xuICAgIGlmIChwbGFjZW1lbnQgIT09IHN0ZXAgfHwgZmxpcE9yZGVyLmxlbmd0aCA9PT0gaW5kZXggKyAxKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICAgIHBsYWNlbWVudE9wcG9zaXRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcblxuICAgIHZhciBwb3BwZXJPZmZzZXRzID0gZGF0YS5vZmZzZXRzLnBvcHBlcjtcbiAgICB2YXIgcmVmT2Zmc2V0cyA9IGRhdGEub2Zmc2V0cy5yZWZlcmVuY2U7XG5cbiAgICAvLyB1c2luZyBmbG9vciBiZWNhdXNlIHRoZSByZWZlcmVuY2Ugb2Zmc2V0cyBtYXkgY29udGFpbiBkZWNpbWFscyB3ZSBhcmUgbm90IGdvaW5nIHRvIGNvbnNpZGVyIGhlcmVcbiAgICB2YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuICAgIHZhciBvdmVybGFwc1JlZiA9IHBsYWNlbWVudCA9PT0gJ2xlZnQnICYmIGZsb29yKHBvcHBlck9mZnNldHMucmlnaHQpID4gZmxvb3IocmVmT2Zmc2V0cy5sZWZ0KSB8fCBwbGFjZW1lbnQgPT09ICdyaWdodCcgJiYgZmxvb3IocG9wcGVyT2Zmc2V0cy5sZWZ0KSA8IGZsb29yKHJlZk9mZnNldHMucmlnaHQpIHx8IHBsYWNlbWVudCA9PT0gJ3RvcCcgJiYgZmxvb3IocG9wcGVyT2Zmc2V0cy5ib3R0b20pID4gZmxvb3IocmVmT2Zmc2V0cy50b3ApIHx8IHBsYWNlbWVudCA9PT0gJ2JvdHRvbScgJiYgZmxvb3IocG9wcGVyT2Zmc2V0cy50b3ApIDwgZmxvb3IocmVmT2Zmc2V0cy5ib3R0b20pO1xuXG4gICAgdmFyIG92ZXJmbG93c0xlZnQgPSBmbG9vcihwb3BwZXJPZmZzZXRzLmxlZnQpIDwgZmxvb3IoYm91bmRhcmllcy5sZWZ0KTtcbiAgICB2YXIgb3ZlcmZsb3dzUmlnaHQgPSBmbG9vcihwb3BwZXJPZmZzZXRzLnJpZ2h0KSA+IGZsb29yKGJvdW5kYXJpZXMucmlnaHQpO1xuICAgIHZhciBvdmVyZmxvd3NUb3AgPSBmbG9vcihwb3BwZXJPZmZzZXRzLnRvcCkgPCBmbG9vcihib3VuZGFyaWVzLnRvcCk7XG4gICAgdmFyIG92ZXJmbG93c0JvdHRvbSA9IGZsb29yKHBvcHBlck9mZnNldHMuYm90dG9tKSA+IGZsb29yKGJvdW5kYXJpZXMuYm90dG9tKTtcblxuICAgIHZhciBvdmVyZmxvd3NCb3VuZGFyaWVzID0gcGxhY2VtZW50ID09PSAnbGVmdCcgJiYgb3ZlcmZsb3dzTGVmdCB8fCBwbGFjZW1lbnQgPT09ICdyaWdodCcgJiYgb3ZlcmZsb3dzUmlnaHQgfHwgcGxhY2VtZW50ID09PSAndG9wJyAmJiBvdmVyZmxvd3NUb3AgfHwgcGxhY2VtZW50ID09PSAnYm90dG9tJyAmJiBvdmVyZmxvd3NCb3R0b207XG5cbiAgICAvLyBmbGlwIHRoZSB2YXJpYXRpb24gaWYgcmVxdWlyZWRcbiAgICB2YXIgaXNWZXJ0aWNhbCA9IFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgICAvLyBmbGlwcyB2YXJpYXRpb24gaWYgcmVmZXJlbmNlIGVsZW1lbnQgb3ZlcmZsb3dzIGJvdW5kYXJpZXNcbiAgICB2YXIgZmxpcHBlZFZhcmlhdGlvbkJ5UmVmID0gISFvcHRpb25zLmZsaXBWYXJpYXRpb25zICYmIChpc1ZlcnRpY2FsICYmIHZhcmlhdGlvbiA9PT0gJ3N0YXJ0JyAmJiBvdmVyZmxvd3NMZWZ0IHx8IGlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnZW5kJyAmJiBvdmVyZmxvd3NSaWdodCB8fCAhaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdzdGFydCcgJiYgb3ZlcmZsb3dzVG9wIHx8ICFpc1ZlcnRpY2FsICYmIHZhcmlhdGlvbiA9PT0gJ2VuZCcgJiYgb3ZlcmZsb3dzQm90dG9tKTtcblxuICAgIC8vIGZsaXBzIHZhcmlhdGlvbiBpZiBwb3BwZXIgY29udGVudCBvdmVyZmxvd3MgYm91bmRhcmllc1xuICAgIHZhciBmbGlwcGVkVmFyaWF0aW9uQnlDb250ZW50ID0gISFvcHRpb25zLmZsaXBWYXJpYXRpb25zQnlDb250ZW50ICYmIChpc1ZlcnRpY2FsICYmIHZhcmlhdGlvbiA9PT0gJ3N0YXJ0JyAmJiBvdmVyZmxvd3NSaWdodCB8fCBpc1ZlcnRpY2FsICYmIHZhcmlhdGlvbiA9PT0gJ2VuZCcgJiYgb3ZlcmZsb3dzTGVmdCB8fCAhaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdzdGFydCcgJiYgb3ZlcmZsb3dzQm90dG9tIHx8ICFpc1ZlcnRpY2FsICYmIHZhcmlhdGlvbiA9PT0gJ2VuZCcgJiYgb3ZlcmZsb3dzVG9wKTtcblxuICAgIHZhciBmbGlwcGVkVmFyaWF0aW9uID0gZmxpcHBlZFZhcmlhdGlvbkJ5UmVmIHx8IGZsaXBwZWRWYXJpYXRpb25CeUNvbnRlbnQ7XG5cbiAgICBpZiAob3ZlcmxhcHNSZWYgfHwgb3ZlcmZsb3dzQm91bmRhcmllcyB8fCBmbGlwcGVkVmFyaWF0aW9uKSB7XG4gICAgICAvLyB0aGlzIGJvb2xlYW4gdG8gZGV0ZWN0IGFueSBmbGlwIGxvb3BcbiAgICAgIGRhdGEuZmxpcHBlZCA9IHRydWU7XG5cbiAgICAgIGlmIChvdmVybGFwc1JlZiB8fCBvdmVyZmxvd3NCb3VuZGFyaWVzKSB7XG4gICAgICAgIHBsYWNlbWVudCA9IGZsaXBPcmRlcltpbmRleCArIDFdO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmxpcHBlZFZhcmlhdGlvbikge1xuICAgICAgICB2YXJpYXRpb24gPSBnZXRPcHBvc2l0ZVZhcmlhdGlvbih2YXJpYXRpb24pO1xuICAgICAgfVxuXG4gICAgICBkYXRhLnBsYWNlbWVudCA9IHBsYWNlbWVudCArICh2YXJpYXRpb24gPyAnLScgKyB2YXJpYXRpb24gOiAnJyk7XG5cbiAgICAgIC8vIHRoaXMgb2JqZWN0IGNvbnRhaW5zIGBwb3NpdGlvbmAsIHdlIHdhbnQgdG8gcHJlc2VydmUgaXQgYWxvbmcgd2l0aFxuICAgICAgLy8gYW55IGFkZGl0aW9uYWwgcHJvcGVydHkgd2UgbWF5IGFkZCBpbiB0aGUgZnV0dXJlXG4gICAgICBkYXRhLm9mZnNldHMucG9wcGVyID0gX2V4dGVuZHMoe30sIGRhdGEub2Zmc2V0cy5wb3BwZXIsIGdldFBvcHBlck9mZnNldHMoZGF0YS5pbnN0YW5jZS5wb3BwZXIsIGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UsIGRhdGEucGxhY2VtZW50KSk7XG5cbiAgICAgIGRhdGEgPSBydW5Nb2RpZmllcnMoZGF0YS5pbnN0YW5jZS5tb2RpZmllcnMsIGRhdGEsICdmbGlwJyk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgdXBkYXRlIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBrZWVwVG9nZXRoZXIoZGF0YSkge1xuICB2YXIgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyLFxuICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2U7XG5cbiAgdmFyIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gIHZhciBmbG9vciA9IE1hdGguZmxvb3I7XG4gIHZhciBpc1ZlcnRpY2FsID0gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMTtcbiAgdmFyIHNpZGUgPSBpc1ZlcnRpY2FsID8gJ3JpZ2h0JyA6ICdib3R0b20nO1xuICB2YXIgb3BTaWRlID0gaXNWZXJ0aWNhbCA/ICdsZWZ0JyA6ICd0b3AnO1xuICB2YXIgbWVhc3VyZW1lbnQgPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuXG4gIGlmIChwb3BwZXJbc2lkZV0gPCBmbG9vcihyZWZlcmVuY2Vbb3BTaWRlXSkpIHtcbiAgICBkYXRhLm9mZnNldHMucG9wcGVyW29wU2lkZV0gPSBmbG9vcihyZWZlcmVuY2Vbb3BTaWRlXSkgLSBwb3BwZXJbbWVhc3VyZW1lbnRdO1xuICB9XG4gIGlmIChwb3BwZXJbb3BTaWRlXSA+IGZsb29yKHJlZmVyZW5jZVtzaWRlXSkpIHtcbiAgICBkYXRhLm9mZnNldHMucG9wcGVyW29wU2lkZV0gPSBmbG9vcihyZWZlcmVuY2Vbc2lkZV0pO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgY29udGFpbmluZyB2YWx1ZSArIHVuaXQgaW50byBhIHB4IHZhbHVlIG51bWJlclxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2Yge21vZGlmaWVyc35vZmZzZXR9XG4gKiBAcHJpdmF0ZVxuICogQGFyZ3VtZW50IHtTdHJpbmd9IHN0ciAtIFZhbHVlICsgdW5pdCBzdHJpbmdcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBtZWFzdXJlbWVudCAtIGBoZWlnaHRgIG9yIGB3aWR0aGBcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBwb3BwZXJPZmZzZXRzXG4gKiBAYXJndW1lbnQge09iamVjdH0gcmVmZXJlbmNlT2Zmc2V0c1xuICogQHJldHVybnMge051bWJlcnxTdHJpbmd9XG4gKiBWYWx1ZSBpbiBwaXhlbHMsIG9yIG9yaWdpbmFsIHN0cmluZyBpZiBubyB2YWx1ZXMgd2VyZSBleHRyYWN0ZWRcbiAqL1xuZnVuY3Rpb24gdG9WYWx1ZShzdHIsIG1lYXN1cmVtZW50LCBwb3BwZXJPZmZzZXRzLCByZWZlcmVuY2VPZmZzZXRzKSB7XG4gIC8vIHNlcGFyYXRlIHZhbHVlIGZyb20gdW5pdFxuICB2YXIgc3BsaXQgPSBzdHIubWF0Y2goLygoPzpcXC18XFwrKT9cXGQqXFwuP1xcZCopKC4qKS8pO1xuICB2YXIgdmFsdWUgPSArc3BsaXRbMV07XG4gIHZhciB1bml0ID0gc3BsaXRbMl07XG5cbiAgLy8gSWYgaXQncyBub3QgYSBudW1iZXIgaXQncyBhbiBvcGVyYXRvciwgSSBndWVzc1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIGlmICh1bml0LmluZGV4T2YoJyUnKSA9PT0gMCkge1xuICAgIHZhciBlbGVtZW50ID0gdm9pZCAwO1xuICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgY2FzZSAnJXAnOlxuICAgICAgICBlbGVtZW50ID0gcG9wcGVyT2Zmc2V0cztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICclJzpcbiAgICAgIGNhc2UgJyVyJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGVsZW1lbnQgPSByZWZlcmVuY2VPZmZzZXRzO1xuICAgIH1cblxuICAgIHZhciByZWN0ID0gZ2V0Q2xpZW50UmVjdChlbGVtZW50KTtcbiAgICByZXR1cm4gcmVjdFttZWFzdXJlbWVudF0gLyAxMDAgKiB2YWx1ZTtcbiAgfSBlbHNlIGlmICh1bml0ID09PSAndmgnIHx8IHVuaXQgPT09ICd2dycpIHtcbiAgICAvLyBpZiBpcyBhIHZoIG9yIHZ3LCB3ZSBjYWxjdWxhdGUgdGhlIHNpemUgYmFzZWQgb24gdGhlIHZpZXdwb3J0XG4gICAgdmFyIHNpemUgPSB2b2lkIDA7XG4gICAgaWYgKHVuaXQgPT09ICd2aCcpIHtcbiAgICAgIHNpemUgPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNpemUgPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZSAvIDEwMCAqIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIGlzIGFuIGV4cGxpY2l0IHBpeGVsIHVuaXQsIHdlIGdldCByaWQgb2YgdGhlIHVuaXQgYW5kIGtlZXAgdGhlIHZhbHVlXG4gICAgLy8gaWYgaXMgYW4gaW1wbGljaXQgdW5pdCwgaXQncyBweCwgYW5kIHdlIHJldHVybiBqdXN0IHRoZSB2YWx1ZVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlIGFuIGBvZmZzZXRgIHN0cmluZyB0byBleHRyYXBvbGF0ZSBgeGAgYW5kIGB5YCBudW1lcmljIG9mZnNldHMuXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiB7bW9kaWZpZXJzfm9mZnNldH1cbiAqIEBwcml2YXRlXG4gKiBAYXJndW1lbnQge1N0cmluZ30gb2Zmc2V0XG4gKiBAYXJndW1lbnQge09iamVjdH0gcG9wcGVyT2Zmc2V0c1xuICogQGFyZ3VtZW50IHtPYmplY3R9IHJlZmVyZW5jZU9mZnNldHNcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBiYXNlUGxhY2VtZW50XG4gKiBAcmV0dXJucyB7QXJyYXl9IGEgdHdvIGNlbGxzIGFycmF5IHdpdGggeCBhbmQgeSBvZmZzZXRzIGluIG51bWJlcnNcbiAqL1xuZnVuY3Rpb24gcGFyc2VPZmZzZXQob2Zmc2V0LCBwb3BwZXJPZmZzZXRzLCByZWZlcmVuY2VPZmZzZXRzLCBiYXNlUGxhY2VtZW50KSB7XG4gIHZhciBvZmZzZXRzID0gWzAsIDBdO1xuXG4gIC8vIFVzZSBoZWlnaHQgaWYgcGxhY2VtZW50IGlzIGxlZnQgb3IgcmlnaHQgYW5kIGluZGV4IGlzIDAgb3RoZXJ3aXNlIHVzZSB3aWR0aFxuICAvLyBpbiB0aGlzIHdheSB0aGUgZmlyc3Qgb2Zmc2V0IHdpbGwgdXNlIGFuIGF4aXMgYW5kIHRoZSBzZWNvbmQgb25lXG4gIC8vIHdpbGwgdXNlIHRoZSBvdGhlciBvbmVcbiAgdmFyIHVzZUhlaWdodCA9IFsncmlnaHQnLCAnbGVmdCddLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgIT09IC0xO1xuXG4gIC8vIFNwbGl0IHRoZSBvZmZzZXQgc3RyaW5nIHRvIG9idGFpbiBhIGxpc3Qgb2YgdmFsdWVzIGFuZCBvcGVyYW5kc1xuICAvLyBUaGUgcmVnZXggYWRkcmVzc2VzIHZhbHVlcyB3aXRoIHRoZSBwbHVzIG9yIG1pbnVzIHNpZ24gaW4gZnJvbnQgKCsxMCwgLTIwLCBldGMpXG4gIHZhciBmcmFnbWVudHMgPSBvZmZzZXQuc3BsaXQoLyhcXCt8XFwtKS8pLm1hcChmdW5jdGlvbiAoZnJhZykge1xuICAgIHJldHVybiBmcmFnLnRyaW0oKTtcbiAgfSk7XG5cbiAgLy8gRGV0ZWN0IGlmIHRoZSBvZmZzZXQgc3RyaW5nIGNvbnRhaW5zIGEgcGFpciBvZiB2YWx1ZXMgb3IgYSBzaW5nbGUgb25lXG4gIC8vIHRoZXkgY291bGQgYmUgc2VwYXJhdGVkIGJ5IGNvbW1hIG9yIHNwYWNlXG4gIHZhciBkaXZpZGVyID0gZnJhZ21lbnRzLmluZGV4T2YoZmluZChmcmFnbWVudHMsIGZ1bmN0aW9uIChmcmFnKSB7XG4gICAgcmV0dXJuIGZyYWcuc2VhcmNoKC8sfFxccy8pICE9PSAtMTtcbiAgfSkpO1xuXG4gIGlmIChmcmFnbWVudHNbZGl2aWRlcl0gJiYgZnJhZ21lbnRzW2RpdmlkZXJdLmluZGV4T2YoJywnKSA9PT0gLTEpIHtcbiAgICBjb25zb2xlLndhcm4oJ09mZnNldHMgc2VwYXJhdGVkIGJ5IHdoaXRlIHNwYWNlKHMpIGFyZSBkZXByZWNhdGVkLCB1c2UgYSBjb21tYSAoLCkgaW5zdGVhZC4nKTtcbiAgfVxuXG4gIC8vIElmIGRpdmlkZXIgaXMgZm91bmQsIHdlIGRpdmlkZSB0aGUgbGlzdCBvZiB2YWx1ZXMgYW5kIG9wZXJhbmRzIHRvIGRpdmlkZVxuICAvLyB0aGVtIGJ5IG9mc2V0IFggYW5kIFkuXG4gIHZhciBzcGxpdFJlZ2V4ID0gL1xccyosXFxzKnxcXHMrLztcbiAgdmFyIG9wcyA9IGRpdmlkZXIgIT09IC0xID8gW2ZyYWdtZW50cy5zbGljZSgwLCBkaXZpZGVyKS5jb25jYXQoW2ZyYWdtZW50c1tkaXZpZGVyXS5zcGxpdChzcGxpdFJlZ2V4KVswXV0pLCBbZnJhZ21lbnRzW2RpdmlkZXJdLnNwbGl0KHNwbGl0UmVnZXgpWzFdXS5jb25jYXQoZnJhZ21lbnRzLnNsaWNlKGRpdmlkZXIgKyAxKSldIDogW2ZyYWdtZW50c107XG5cbiAgLy8gQ29udmVydCB0aGUgdmFsdWVzIHdpdGggdW5pdHMgdG8gYWJzb2x1dGUgcGl4ZWxzIHRvIGFsbG93IG91ciBjb21wdXRhdGlvbnNcbiAgb3BzID0gb3BzLm1hcChmdW5jdGlvbiAob3AsIGluZGV4KSB7XG4gICAgLy8gTW9zdCBvZiB0aGUgdW5pdHMgcmVseSBvbiB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHBvcHBlclxuICAgIHZhciBtZWFzdXJlbWVudCA9IChpbmRleCA9PT0gMSA/ICF1c2VIZWlnaHQgOiB1c2VIZWlnaHQpID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICAgIHZhciBtZXJnZVdpdGhQcmV2aW91cyA9IGZhbHNlO1xuICAgIHJldHVybiBvcFxuICAgIC8vIFRoaXMgYWdncmVnYXRlcyBhbnkgYCtgIG9yIGAtYCBzaWduIHRoYXQgYXJlbid0IGNvbnNpZGVyZWQgb3BlcmF0b3JzXG4gICAgLy8gZS5nLjogMTAgKyArNSA9PiBbMTAsICssICs1XVxuICAgIC5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIGlmIChhW2EubGVuZ3RoIC0gMV0gPT09ICcnICYmIFsnKycsICctJ10uaW5kZXhPZihiKSAhPT0gLTEpIHtcbiAgICAgICAgYVthLmxlbmd0aCAtIDFdID0gYjtcbiAgICAgICAgbWVyZ2VXaXRoUHJldmlvdXMgPSB0cnVlO1xuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH0gZWxzZSBpZiAobWVyZ2VXaXRoUHJldmlvdXMpIHtcbiAgICAgICAgYVthLmxlbmd0aCAtIDFdICs9IGI7XG4gICAgICAgIG1lcmdlV2l0aFByZXZpb3VzID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGEuY29uY2F0KGIpO1xuICAgICAgfVxuICAgIH0sIFtdKVxuICAgIC8vIEhlcmUgd2UgY29udmVydCB0aGUgc3RyaW5nIHZhbHVlcyBpbnRvIG51bWJlciB2YWx1ZXMgKGluIHB4KVxuICAgIC5tYXAoZnVuY3Rpb24gKHN0cikge1xuICAgICAgcmV0dXJuIHRvVmFsdWUoc3RyLCBtZWFzdXJlbWVudCwgcG9wcGVyT2Zmc2V0cywgcmVmZXJlbmNlT2Zmc2V0cyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIExvb3AgdHJvdWdoIHRoZSBvZmZzZXRzIGFycmF5cyBhbmQgZXhlY3V0ZSB0aGUgb3BlcmF0aW9uc1xuICBvcHMuZm9yRWFjaChmdW5jdGlvbiAob3AsIGluZGV4KSB7XG4gICAgb3AuZm9yRWFjaChmdW5jdGlvbiAoZnJhZywgaW5kZXgyKSB7XG4gICAgICBpZiAoaXNOdW1lcmljKGZyYWcpKSB7XG4gICAgICAgIG9mZnNldHNbaW5kZXhdICs9IGZyYWcgKiAob3BbaW5kZXgyIC0gMV0gPT09ICctJyA/IC0xIDogMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gb2Zmc2V0cztcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAYXJndW1lbnQge051bWJlcnxTdHJpbmd9IG9wdGlvbnMub2Zmc2V0PTBcbiAqIFRoZSBvZmZzZXQgdmFsdWUgYXMgZGVzY3JpYmVkIGluIHRoZSBtb2RpZmllciBkZXNjcmlwdGlvblxuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBvZmZzZXQoZGF0YSwgX3JlZikge1xuICB2YXIgb2Zmc2V0ID0gX3JlZi5vZmZzZXQ7XG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudCxcbiAgICAgIF9kYXRhJG9mZnNldHMgPSBkYXRhLm9mZnNldHMsXG4gICAgICBwb3BwZXIgPSBfZGF0YSRvZmZzZXRzLnBvcHBlcixcbiAgICAgIHJlZmVyZW5jZSA9IF9kYXRhJG9mZnNldHMucmVmZXJlbmNlO1xuXG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG5cbiAgdmFyIG9mZnNldHMgPSB2b2lkIDA7XG4gIGlmIChpc051bWVyaWMoK29mZnNldCkpIHtcbiAgICBvZmZzZXRzID0gWytvZmZzZXQsIDBdO1xuICB9IGVsc2Uge1xuICAgIG9mZnNldHMgPSBwYXJzZU9mZnNldChvZmZzZXQsIHBvcHBlciwgcmVmZXJlbmNlLCBiYXNlUGxhY2VtZW50KTtcbiAgfVxuXG4gIGlmIChiYXNlUGxhY2VtZW50ID09PSAnbGVmdCcpIHtcbiAgICBwb3BwZXIudG9wICs9IG9mZnNldHNbMF07XG4gICAgcG9wcGVyLmxlZnQgLT0gb2Zmc2V0c1sxXTtcbiAgfSBlbHNlIGlmIChiYXNlUGxhY2VtZW50ID09PSAncmlnaHQnKSB7XG4gICAgcG9wcGVyLnRvcCArPSBvZmZzZXRzWzBdO1xuICAgIHBvcHBlci5sZWZ0ICs9IG9mZnNldHNbMV07XG4gIH0gZWxzZSBpZiAoYmFzZVBsYWNlbWVudCA9PT0gJ3RvcCcpIHtcbiAgICBwb3BwZXIubGVmdCArPSBvZmZzZXRzWzBdO1xuICAgIHBvcHBlci50b3AgLT0gb2Zmc2V0c1sxXTtcbiAgfSBlbHNlIGlmIChiYXNlUGxhY2VtZW50ID09PSAnYm90dG9tJykge1xuICAgIHBvcHBlci5sZWZ0ICs9IG9mZnNldHNbMF07XG4gICAgcG9wcGVyLnRvcCArPSBvZmZzZXRzWzFdO1xuICB9XG5cbiAgZGF0YS5wb3BwZXIgPSBwb3BwZXI7XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBwcmV2ZW50T3ZlcmZsb3coZGF0YSwgb3B0aW9ucykge1xuICB2YXIgYm91bmRhcmllc0VsZW1lbnQgPSBvcHRpb25zLmJvdW5kYXJpZXNFbGVtZW50IHx8IGdldE9mZnNldFBhcmVudChkYXRhLmluc3RhbmNlLnBvcHBlcik7XG5cbiAgLy8gSWYgb2Zmc2V0UGFyZW50IGlzIHRoZSByZWZlcmVuY2UgZWxlbWVudCwgd2UgcmVhbGx5IHdhbnQgdG9cbiAgLy8gZ28gb25lIHN0ZXAgdXAgYW5kIHVzZSB0aGUgbmV4dCBvZmZzZXRQYXJlbnQgYXMgcmVmZXJlbmNlIHRvXG4gIC8vIGF2b2lkIHRvIG1ha2UgdGhpcyBtb2RpZmllciBjb21wbGV0ZWx5IHVzZWxlc3MgYW5kIGxvb2sgbGlrZSBicm9rZW5cbiAgaWYgKGRhdGEuaW5zdGFuY2UucmVmZXJlbmNlID09PSBib3VuZGFyaWVzRWxlbWVudCkge1xuICAgIGJvdW5kYXJpZXNFbGVtZW50ID0gZ2V0T2Zmc2V0UGFyZW50KGJvdW5kYXJpZXNFbGVtZW50KTtcbiAgfVxuXG4gIC8vIE5PVEU6IERPTSBhY2Nlc3MgaGVyZVxuICAvLyByZXNldHMgdGhlIHBvcHBlcidzIHBvc2l0aW9uIHNvIHRoYXQgdGhlIGRvY3VtZW50IHNpemUgY2FuIGJlIGNhbGN1bGF0ZWQgZXhjbHVkaW5nXG4gIC8vIHRoZSBzaXplIG9mIHRoZSBwb3BwZXIgZWxlbWVudCBpdHNlbGZcbiAgdmFyIHRyYW5zZm9ybVByb3AgPSBnZXRTdXBwb3J0ZWRQcm9wZXJ0eU5hbWUoJ3RyYW5zZm9ybScpO1xuICB2YXIgcG9wcGVyU3R5bGVzID0gZGF0YS5pbnN0YW5jZS5wb3BwZXIuc3R5bGU7IC8vIGFzc2lnbm1lbnQgdG8gaGVscCBtaW5pZmljYXRpb25cbiAgdmFyIHRvcCA9IHBvcHBlclN0eWxlcy50b3AsXG4gICAgICBsZWZ0ID0gcG9wcGVyU3R5bGVzLmxlZnQsXG4gICAgICB0cmFuc2Zvcm0gPSBwb3BwZXJTdHlsZXNbdHJhbnNmb3JtUHJvcF07XG5cbiAgcG9wcGVyU3R5bGVzLnRvcCA9ICcnO1xuICBwb3BwZXJTdHlsZXMubGVmdCA9ICcnO1xuICBwb3BwZXJTdHlsZXNbdHJhbnNmb3JtUHJvcF0gPSAnJztcblxuICB2YXIgYm91bmRhcmllcyA9IGdldEJvdW5kYXJpZXMoZGF0YS5pbnN0YW5jZS5wb3BwZXIsIGRhdGEuaW5zdGFuY2UucmVmZXJlbmNlLCBvcHRpb25zLnBhZGRpbmcsIGJvdW5kYXJpZXNFbGVtZW50LCBkYXRhLnBvc2l0aW9uRml4ZWQpO1xuXG4gIC8vIE5PVEU6IERPTSBhY2Nlc3MgaGVyZVxuICAvLyByZXN0b3JlcyB0aGUgb3JpZ2luYWwgc3R5bGUgcHJvcGVydGllcyBhZnRlciB0aGUgb2Zmc2V0cyBoYXZlIGJlZW4gY29tcHV0ZWRcbiAgcG9wcGVyU3R5bGVzLnRvcCA9IHRvcDtcbiAgcG9wcGVyU3R5bGVzLmxlZnQgPSBsZWZ0O1xuICBwb3BwZXJTdHlsZXNbdHJhbnNmb3JtUHJvcF0gPSB0cmFuc2Zvcm07XG5cbiAgb3B0aW9ucy5ib3VuZGFyaWVzID0gYm91bmRhcmllcztcblxuICB2YXIgb3JkZXIgPSBvcHRpb25zLnByaW9yaXR5O1xuICB2YXIgcG9wcGVyID0gZGF0YS5vZmZzZXRzLnBvcHBlcjtcblxuICB2YXIgY2hlY2sgPSB7XG4gICAgcHJpbWFyeTogZnVuY3Rpb24gcHJpbWFyeShwbGFjZW1lbnQpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHBvcHBlcltwbGFjZW1lbnRdO1xuICAgICAgaWYgKHBvcHBlcltwbGFjZW1lbnRdIDwgYm91bmRhcmllc1twbGFjZW1lbnRdICYmICFvcHRpb25zLmVzY2FwZVdpdGhSZWZlcmVuY2UpIHtcbiAgICAgICAgdmFsdWUgPSBNYXRoLm1heChwb3BwZXJbcGxhY2VtZW50XSwgYm91bmRhcmllc1twbGFjZW1lbnRdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eSh7fSwgcGxhY2VtZW50LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzZWNvbmRhcnk6IGZ1bmN0aW9uIHNlY29uZGFyeShwbGFjZW1lbnQpIHtcbiAgICAgIHZhciBtYWluU2lkZSA9IHBsYWNlbWVudCA9PT0gJ3JpZ2h0JyA/ICdsZWZ0JyA6ICd0b3AnO1xuICAgICAgdmFyIHZhbHVlID0gcG9wcGVyW21haW5TaWRlXTtcbiAgICAgIGlmIChwb3BwZXJbcGxhY2VtZW50XSA+IGJvdW5kYXJpZXNbcGxhY2VtZW50XSAmJiAhb3B0aW9ucy5lc2NhcGVXaXRoUmVmZXJlbmNlKSB7XG4gICAgICAgIHZhbHVlID0gTWF0aC5taW4ocG9wcGVyW21haW5TaWRlXSwgYm91bmRhcmllc1twbGFjZW1lbnRdIC0gKHBsYWNlbWVudCA9PT0gJ3JpZ2h0JyA/IHBvcHBlci53aWR0aCA6IHBvcHBlci5oZWlnaHQpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eSh7fSwgbWFpblNpZGUsIHZhbHVlKTtcbiAgICB9XG4gIH07XG5cbiAgb3JkZXIuZm9yRWFjaChmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgdmFyIHNpZGUgPSBbJ2xlZnQnLCAndG9wJ10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMSA/ICdwcmltYXJ5JyA6ICdzZWNvbmRhcnknO1xuICAgIHBvcHBlciA9IF9leHRlbmRzKHt9LCBwb3BwZXIsIGNoZWNrW3NpZGVdKHBsYWNlbWVudCkpO1xuICB9KTtcblxuICBkYXRhLm9mZnNldHMucG9wcGVyID0gcG9wcGVyO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBzaGlmdChkYXRhKSB7XG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgdmFyIHNoaWZ0dmFyaWF0aW9uID0gcGxhY2VtZW50LnNwbGl0KCctJylbMV07XG5cbiAgLy8gaWYgc2hpZnQgc2hpZnR2YXJpYXRpb24gaXMgc3BlY2lmaWVkLCBydW4gdGhlIG1vZGlmaWVyXG4gIGlmIChzaGlmdHZhcmlhdGlvbikge1xuICAgIHZhciBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZSxcbiAgICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXI7XG5cbiAgICB2YXIgaXNWZXJ0aWNhbCA9IFsnYm90dG9tJywgJ3RvcCddLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgIT09IC0xO1xuICAgIHZhciBzaWRlID0gaXNWZXJ0aWNhbCA/ICdsZWZ0JyA6ICd0b3AnO1xuICAgIHZhciBtZWFzdXJlbWVudCA9IGlzVmVydGljYWwgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG5cbiAgICB2YXIgc2hpZnRPZmZzZXRzID0ge1xuICAgICAgc3RhcnQ6IGRlZmluZVByb3BlcnR5KHt9LCBzaWRlLCByZWZlcmVuY2Vbc2lkZV0pLFxuICAgICAgZW5kOiBkZWZpbmVQcm9wZXJ0eSh7fSwgc2lkZSwgcmVmZXJlbmNlW3NpZGVdICsgcmVmZXJlbmNlW21lYXN1cmVtZW50XSAtIHBvcHBlclttZWFzdXJlbWVudF0pXG4gICAgfTtcblxuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBfZXh0ZW5kcyh7fSwgcG9wcGVyLCBzaGlmdE9mZnNldHNbc2hpZnR2YXJpYXRpb25dKTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gaGlkZShkYXRhKSB7XG4gIGlmICghaXNNb2RpZmllclJlcXVpcmVkKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCAnaGlkZScsICdwcmV2ZW50T3ZlcmZsb3cnKSkge1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgdmFyIHJlZlJlY3QgPSBkYXRhLm9mZnNldHMucmVmZXJlbmNlO1xuICB2YXIgYm91bmQgPSBmaW5kKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCBmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICByZXR1cm4gbW9kaWZpZXIubmFtZSA9PT0gJ3ByZXZlbnRPdmVyZmxvdyc7XG4gIH0pLmJvdW5kYXJpZXM7XG5cbiAgaWYgKHJlZlJlY3QuYm90dG9tIDwgYm91bmQudG9wIHx8IHJlZlJlY3QubGVmdCA+IGJvdW5kLnJpZ2h0IHx8IHJlZlJlY3QudG9wID4gYm91bmQuYm90dG9tIHx8IHJlZlJlY3QucmlnaHQgPCBib3VuZC5sZWZ0KSB7XG4gICAgLy8gQXZvaWQgdW5uZWNlc3NhcnkgRE9NIGFjY2VzcyBpZiB2aXNpYmlsaXR5IGhhc24ndCBjaGFuZ2VkXG4gICAgaWYgKGRhdGEuaGlkZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgZGF0YS5oaWRlID0gdHJ1ZTtcbiAgICBkYXRhLmF0dHJpYnV0ZXNbJ3gtb3V0LW9mLWJvdW5kYXJpZXMnXSA9ICcnO1xuICB9IGVsc2Uge1xuICAgIC8vIEF2b2lkIHVubmVjZXNzYXJ5IERPTSBhY2Nlc3MgaWYgdmlzaWJpbGl0eSBoYXNuJ3QgY2hhbmdlZFxuICAgIGlmIChkYXRhLmhpZGUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBkYXRhLmhpZGUgPSBmYWxzZTtcbiAgICBkYXRhLmF0dHJpYnV0ZXNbJ3gtb3V0LW9mLWJvdW5kYXJpZXMnXSA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGlubmVyKGRhdGEpIHtcbiAgdmFyIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICB2YXIgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyLFxuICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2U7XG5cbiAgdmFyIGlzSG9yaXogPSBbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMTtcblxuICB2YXIgc3VidHJhY3RMZW5ndGggPSBbJ3RvcCcsICdsZWZ0J10uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA9PT0gLTE7XG5cbiAgcG9wcGVyW2lzSG9yaXogPyAnbGVmdCcgOiAndG9wJ10gPSByZWZlcmVuY2VbYmFzZVBsYWNlbWVudF0gLSAoc3VidHJhY3RMZW5ndGggPyBwb3BwZXJbaXNIb3JpeiA/ICd3aWR0aCcgOiAnaGVpZ2h0J10gOiAwKTtcblxuICBkYXRhLnBsYWNlbWVudCA9IGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBnZXRDbGllbnRSZWN0KHBvcHBlcik7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogTW9kaWZpZXIgZnVuY3Rpb24sIGVhY2ggbW9kaWZpZXIgY2FuIGhhdmUgYSBmdW5jdGlvbiBvZiB0aGlzIHR5cGUgYXNzaWduZWRcbiAqIHRvIGl0cyBgZm5gIHByb3BlcnR5LjxiciAvPlxuICogVGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggdXBkYXRlLCB0aGlzIG1lYW5zIHRoYXQgeW91IG11c3RcbiAqIG1ha2Ugc3VyZSB0aGV5IGFyZSBwZXJmb3JtYW50IGVub3VnaCB0byBhdm9pZCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcy5cbiAqXG4gKiBAZnVuY3Rpb24gTW9kaWZpZXJGblxuICogQGFyZ3VtZW50IHtkYXRhT2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtkYXRhT2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cblxuLyoqXG4gKiBNb2RpZmllcnMgYXJlIHBsdWdpbnMgdXNlZCB0byBhbHRlciB0aGUgYmVoYXZpb3Igb2YgeW91ciBwb3BwZXJzLjxiciAvPlxuICogUG9wcGVyLmpzIHVzZXMgYSBzZXQgb2YgOSBtb2RpZmllcnMgdG8gcHJvdmlkZSBhbGwgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdGllc1xuICogbmVlZGVkIGJ5IHRoZSBsaWJyYXJ5LlxuICpcbiAqIFVzdWFsbHkgeW91IGRvbid0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGBvcmRlcmAsIGBmbmAgYW5kIGBvbkxvYWRgIHByb3BzLlxuICogQWxsIHRoZSBvdGhlciBwcm9wZXJ0aWVzIGFyZSBjb25maWd1cmF0aW9ucyB0aGF0IGNvdWxkIGJlIHR3ZWFrZWQuXG4gKiBAbmFtZXNwYWNlIG1vZGlmaWVyc1xuICovXG52YXIgbW9kaWZpZXJzID0ge1xuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBzaGlmdCB0aGUgcG9wcGVyIG9uIHRoZSBzdGFydCBvciBlbmQgb2YgaXRzIHJlZmVyZW5jZVxuICAgKiBlbGVtZW50LjxiciAvPlxuICAgKiBJdCB3aWxsIHJlYWQgdGhlIHZhcmlhdGlvbiBvZiB0aGUgYHBsYWNlbWVudGAgcHJvcGVydHkuPGJyIC8+XG4gICAqIEl0IGNhbiBiZSBvbmUgZWl0aGVyIGAtZW5kYCBvciBgLXN0YXJ0YC5cbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIHNoaWZ0OiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTEwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogMTAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogc2hpZnRcbiAgfSxcblxuICAvKipcbiAgICogVGhlIGBvZmZzZXRgIG1vZGlmaWVyIGNhbiBzaGlmdCB5b3VyIHBvcHBlciBvbiBib3RoIGl0cyBheGlzLlxuICAgKlxuICAgKiBJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgdW5pdHM6XG4gICAqIC0gYHB4YCBvciB1bml0LWxlc3MsIGludGVycHJldGVkIGFzIHBpeGVsc1xuICAgKiAtIGAlYCBvciBgJXJgLCBwZXJjZW50YWdlIHJlbGF0aXZlIHRvIHRoZSBsZW5ndGggb2YgdGhlIHJlZmVyZW5jZSBlbGVtZW50XG4gICAqIC0gYCVwYCwgcGVyY2VudGFnZSByZWxhdGl2ZSB0byB0aGUgbGVuZ3RoIG9mIHRoZSBwb3BwZXIgZWxlbWVudFxuICAgKiAtIGB2d2AsIENTUyB2aWV3cG9ydCB3aWR0aCB1bml0XG4gICAqIC0gYHZoYCwgQ1NTIHZpZXdwb3J0IGhlaWdodCB1bml0XG4gICAqXG4gICAqIEZvciBsZW5ndGggaXMgaW50ZW5kZWQgdGhlIG1haW4gYXhpcyByZWxhdGl2ZSB0byB0aGUgcGxhY2VtZW50IG9mIHRoZSBwb3BwZXIuPGJyIC8+XG4gICAqIFRoaXMgbWVhbnMgdGhhdCBpZiB0aGUgcGxhY2VtZW50IGlzIGB0b3BgIG9yIGBib3R0b21gLCB0aGUgbGVuZ3RoIHdpbGwgYmUgdGhlXG4gICAqIGB3aWR0aGAuIEluIGNhc2Ugb2YgYGxlZnRgIG9yIGByaWdodGAsIGl0IHdpbGwgYmUgdGhlIGBoZWlnaHRgLlxuICAgKlxuICAgKiBZb3UgY2FuIHByb3ZpZGUgYSBzaW5nbGUgdmFsdWUgKGFzIGBOdW1iZXJgIG9yIGBTdHJpbmdgKSwgb3IgYSBwYWlyIG9mIHZhbHVlc1xuICAgKiBhcyBgU3RyaW5nYCBkaXZpZGVkIGJ5IGEgY29tbWEgb3Igb25lIChvciBtb3JlKSB3aGl0ZSBzcGFjZXMuPGJyIC8+XG4gICAqIFRoZSBsYXR0ZXIgaXMgYSBkZXByZWNhdGVkIG1ldGhvZCBiZWNhdXNlIGl0IGxlYWRzIHRvIGNvbmZ1c2lvbiBhbmQgd2lsbCBiZVxuICAgKiByZW1vdmVkIGluIHYyLjxiciAvPlxuICAgKiBBZGRpdGlvbmFsbHksIGl0IGFjY2VwdHMgYWRkaXRpb25zIGFuZCBzdWJ0cmFjdGlvbnMgYmV0d2VlbiBkaWZmZXJlbnQgdW5pdHMuXG4gICAqIE5vdGUgdGhhdCBtdWx0aXBsaWNhdGlvbnMgYW5kIGRpdmlzaW9ucyBhcmVuJ3Qgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBWYWxpZCBleGFtcGxlcyBhcmU6XG4gICAqIGBgYFxuICAgKiAxMFxuICAgKiAnMTAlJ1xuICAgKiAnMTAsIDEwJ1xuICAgKiAnMTAlLCAxMCdcbiAgICogJzEwICsgMTAlJ1xuICAgKiAnMTAgLSA1dmggKyAzJSdcbiAgICogJy0xMHB4ICsgNXZoLCA1cHggLSA2JSdcbiAgICogYGBgXG4gICAqID4gKipOQioqOiBJZiB5b3UgZGVzaXJlIHRvIGFwcGx5IG9mZnNldHMgdG8geW91ciBwb3BwZXJzIGluIGEgd2F5IHRoYXQgbWF5IG1ha2UgdGhlbSBvdmVybGFwXG4gICAqID4gd2l0aCB0aGVpciByZWZlcmVuY2UgZWxlbWVudCwgdW5mb3J0dW5hdGVseSwgeW91IHdpbGwgaGF2ZSB0byBkaXNhYmxlIHRoZSBgZmxpcGAgbW9kaWZpZXIuXG4gICAqID4gWW91IGNhbiByZWFkIG1vcmUgb24gdGhpcyBhdCB0aGlzIFtpc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL0ZlelZyYXN0YS9wb3BwZXIuanMvaXNzdWVzLzM3MykuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBvZmZzZXQ6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9MjAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiAyMDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBvZmZzZXQsXG4gICAgLyoqIEBwcm9wIHtOdW1iZXJ8U3RyaW5nfSBvZmZzZXQ9MFxuICAgICAqIFRoZSBvZmZzZXQgdmFsdWUgYXMgZGVzY3JpYmVkIGluIHRoZSBtb2RpZmllciBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIG9mZnNldDogMFxuICB9LFxuXG4gIC8qKlxuICAgKiBNb2RpZmllciB1c2VkIHRvIHByZXZlbnQgdGhlIHBvcHBlciBmcm9tIGJlaW5nIHBvc2l0aW9uZWQgb3V0c2lkZSB0aGUgYm91bmRhcnkuXG4gICAqXG4gICAqIEEgc2NlbmFyaW8gZXhpc3RzIHdoZXJlIHRoZSByZWZlcmVuY2UgaXRzZWxmIGlzIG5vdCB3aXRoaW4gdGhlIGJvdW5kYXJpZXMuPGJyIC8+XG4gICAqIFdlIGNhbiBzYXkgaXQgaGFzIFwiZXNjYXBlZCB0aGUgYm91bmRhcmllc1wiIOKAlCBvciBqdXN0IFwiZXNjYXBlZFwiLjxiciAvPlxuICAgKiBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBkZWNpZGUgd2hldGhlciB0aGUgcG9wcGVyIHNob3VsZCBlaXRoZXI6XG4gICAqXG4gICAqIC0gZGV0YWNoIGZyb20gdGhlIHJlZmVyZW5jZSBhbmQgcmVtYWluIFwidHJhcHBlZFwiIGluIHRoZSBib3VuZGFyaWVzLCBvclxuICAgKiAtIGlmIGl0IHNob3VsZCBpZ25vcmUgdGhlIGJvdW5kYXJ5IGFuZCBcImVzY2FwZSB3aXRoIGl0cyByZWZlcmVuY2VcIlxuICAgKlxuICAgKiBXaGVuIGBlc2NhcGVXaXRoUmVmZXJlbmNlYCBpcyBzZXQgdG9gdHJ1ZWAgYW5kIHJlZmVyZW5jZSBpcyBjb21wbGV0ZWx5XG4gICAqIG91dHNpZGUgaXRzIGJvdW5kYXJpZXMsIHRoZSBwb3BwZXIgd2lsbCBvdmVyZmxvdyAob3IgY29tcGxldGVseSBsZWF2ZSlcbiAgICogdGhlIGJvdW5kYXJpZXMgaW4gb3JkZXIgdG8gcmVtYWluIGF0dGFjaGVkIHRvIHRoZSBlZGdlIG9mIHRoZSByZWZlcmVuY2UuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBwcmV2ZW50T3ZlcmZsb3c6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9MzAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiAzMDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBwcmV2ZW50T3ZlcmZsb3csXG4gICAgLyoqXG4gICAgICogQHByb3Age0FycmF5fSBbcHJpb3JpdHk9WydsZWZ0JywncmlnaHQnLCd0b3AnLCdib3R0b20nXV1cbiAgICAgKiBQb3BwZXIgd2lsbCB0cnkgdG8gcHJldmVudCBvdmVyZmxvdyBmb2xsb3dpbmcgdGhlc2UgcHJpb3JpdGllcyBieSBkZWZhdWx0LFxuICAgICAqIHRoZW4sIGl0IGNvdWxkIG92ZXJmbG93IG9uIHRoZSBsZWZ0IGFuZCBvbiB0b3Agb2YgdGhlIGBib3VuZGFyaWVzRWxlbWVudGBcbiAgICAgKi9cbiAgICBwcmlvcml0eTogWydsZWZ0JywgJ3JpZ2h0JywgJ3RvcCcsICdib3R0b20nXSxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7bnVtYmVyfSBwYWRkaW5nPTVcbiAgICAgKiBBbW91bnQgb2YgcGl4ZWwgdXNlZCB0byBkZWZpbmUgYSBtaW5pbXVtIGRpc3RhbmNlIGJldHdlZW4gdGhlIGJvdW5kYXJpZXNcbiAgICAgKiBhbmQgdGhlIHBvcHBlci4gVGhpcyBtYWtlcyBzdXJlIHRoZSBwb3BwZXIgYWx3YXlzIGhhcyBhIGxpdHRsZSBwYWRkaW5nXG4gICAgICogYmV0d2VlbiB0aGUgZWRnZXMgb2YgaXRzIGNvbnRhaW5lclxuICAgICAqL1xuICAgIHBhZGRpbmc6IDUsXG4gICAgLyoqXG4gICAgICogQHByb3Age1N0cmluZ3xIVE1MRWxlbWVudH0gYm91bmRhcmllc0VsZW1lbnQ9J3Njcm9sbFBhcmVudCdcbiAgICAgKiBCb3VuZGFyaWVzIHVzZWQgYnkgdGhlIG1vZGlmaWVyLiBDYW4gYmUgYHNjcm9sbFBhcmVudGAsIGB3aW5kb3dgLFxuICAgICAqIGB2aWV3cG9ydGAgb3IgYW55IERPTSBlbGVtZW50LlxuICAgICAqL1xuICAgIGJvdW5kYXJpZXNFbGVtZW50OiAnc2Nyb2xsUGFyZW50J1xuICB9LFxuXG4gIC8qKlxuICAgKiBNb2RpZmllciB1c2VkIHRvIG1ha2Ugc3VyZSB0aGUgcmVmZXJlbmNlIGFuZCBpdHMgcG9wcGVyIHN0YXkgbmVhciBlYWNoIG90aGVyXG4gICAqIHdpdGhvdXQgbGVhdmluZyBhbnkgZ2FwIGJldHdlZW4gdGhlIHR3by4gRXNwZWNpYWxseSB1c2VmdWwgd2hlbiB0aGUgYXJyb3cgaXNcbiAgICogZW5hYmxlZCBhbmQgeW91IHdhbnQgdG8gZW5zdXJlIHRoYXQgaXQgcG9pbnRzIHRvIGl0cyByZWZlcmVuY2UgZWxlbWVudC5cbiAgICogSXQgY2FyZXMgb25seSBhYm91dCB0aGUgZmlyc3QgYXhpcy4gWW91IGNhbiBzdGlsbCBoYXZlIHBvcHBlcnMgd2l0aCBtYXJnaW5cbiAgICogYmV0d2VlbiB0aGUgcG9wcGVyIGFuZCBpdHMgcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBrZWVwVG9nZXRoZXI6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9NDAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA0MDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBrZWVwVG9nZXRoZXJcbiAgfSxcblxuICAvKipcbiAgICogVGhpcyBtb2RpZmllciBpcyB1c2VkIHRvIG1vdmUgdGhlIGBhcnJvd0VsZW1lbnRgIG9mIHRoZSBwb3BwZXIgdG8gbWFrZVxuICAgKiBzdXJlIGl0IGlzIHBvc2l0aW9uZWQgYmV0d2VlbiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgYW5kIGl0cyBwb3BwZXIgZWxlbWVudC5cbiAgICogSXQgd2lsbCByZWFkIHRoZSBvdXRlciBzaXplIG9mIHRoZSBgYXJyb3dFbGVtZW50YCBub2RlIHRvIGRldGVjdCBob3cgbWFueVxuICAgKiBwaXhlbHMgb2YgY29uanVuY3Rpb24gYXJlIG5lZWRlZC5cbiAgICpcbiAgICogSXQgaGFzIG5vIGVmZmVjdCBpZiBubyBgYXJyb3dFbGVtZW50YCBpcyBwcm92aWRlZC5cbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGFycm93OiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTUwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogNTAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogYXJyb3csXG4gICAgLyoqIEBwcm9wIHtTdHJpbmd8SFRNTEVsZW1lbnR9IGVsZW1lbnQ9J1t4LWFycm93XScgLSBTZWxlY3RvciBvciBub2RlIHVzZWQgYXMgYXJyb3cgKi9cbiAgICBlbGVtZW50OiAnW3gtYXJyb3ddJ1xuICB9LFxuXG4gIC8qKlxuICAgKiBNb2RpZmllciB1c2VkIHRvIGZsaXAgdGhlIHBvcHBlcidzIHBsYWNlbWVudCB3aGVuIGl0IHN0YXJ0cyB0byBvdmVybGFwIGl0c1xuICAgKiByZWZlcmVuY2UgZWxlbWVudC5cbiAgICpcbiAgICogUmVxdWlyZXMgdGhlIGBwcmV2ZW50T3ZlcmZsb3dgIG1vZGlmaWVyIGJlZm9yZSBpdCBpbiBvcmRlciB0byB3b3JrLlxuICAgKlxuICAgKiAqKk5PVEU6KiogdGhpcyBtb2RpZmllciB3aWxsIGludGVycnVwdCB0aGUgY3VycmVudCB1cGRhdGUgY3ljbGUgYW5kIHdpbGxcbiAgICogcmVzdGFydCBpdCBpZiBpdCBkZXRlY3RzIHRoZSBuZWVkIHRvIGZsaXAgdGhlIHBsYWNlbWVudC5cbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGZsaXA6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9NjAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA2MDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBmbGlwLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtTdHJpbmd8QXJyYXl9IGJlaGF2aW9yPSdmbGlwJ1xuICAgICAqIFRoZSBiZWhhdmlvciB1c2VkIHRvIGNoYW5nZSB0aGUgcG9wcGVyJ3MgcGxhY2VtZW50LiBJdCBjYW4gYmUgb25lIG9mXG4gICAgICogYGZsaXBgLCBgY2xvY2t3aXNlYCwgYGNvdW50ZXJjbG9ja3dpc2VgIG9yIGFuIGFycmF5IHdpdGggYSBsaXN0IG9mIHZhbGlkXG4gICAgICogcGxhY2VtZW50cyAod2l0aCBvcHRpb25hbCB2YXJpYXRpb25zKVxuICAgICAqL1xuICAgIGJlaGF2aW9yOiAnZmxpcCcsXG4gICAgLyoqXG4gICAgICogQHByb3Age251bWJlcn0gcGFkZGluZz01XG4gICAgICogVGhlIHBvcHBlciB3aWxsIGZsaXAgaWYgaXQgaGl0cyB0aGUgZWRnZXMgb2YgdGhlIGBib3VuZGFyaWVzRWxlbWVudGBcbiAgICAgKi9cbiAgICBwYWRkaW5nOiA1LFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtTdHJpbmd8SFRNTEVsZW1lbnR9IGJvdW5kYXJpZXNFbGVtZW50PSd2aWV3cG9ydCdcbiAgICAgKiBUaGUgZWxlbWVudCB3aGljaCB3aWxsIGRlZmluZSB0aGUgYm91bmRhcmllcyBvZiB0aGUgcG9wcGVyIHBvc2l0aW9uLlxuICAgICAqIFRoZSBwb3BwZXIgd2lsbCBuZXZlciBiZSBwbGFjZWQgb3V0c2lkZSBvZiB0aGUgZGVmaW5lZCBib3VuZGFyaWVzXG4gICAgICogKGV4Y2VwdCBpZiBga2VlcFRvZ2V0aGVyYCBpcyBlbmFibGVkKVxuICAgICAqL1xuICAgIGJvdW5kYXJpZXNFbGVtZW50OiAndmlld3BvcnQnLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtCb29sZWFufSBmbGlwVmFyaWF0aW9ucz1mYWxzZVxuICAgICAqIFRoZSBwb3BwZXIgd2lsbCBzd2l0Y2ggcGxhY2VtZW50IHZhcmlhdGlvbiBiZXR3ZWVuIGAtc3RhcnRgIGFuZCBgLWVuZGAgd2hlblxuICAgICAqIHRoZSByZWZlcmVuY2UgZWxlbWVudCBvdmVybGFwcyBpdHMgYm91bmRhcmllcy5cbiAgICAgKlxuICAgICAqIFRoZSBvcmlnaW5hbCBwbGFjZW1lbnQgc2hvdWxkIGhhdmUgYSBzZXQgdmFyaWF0aW9uLlxuICAgICAqL1xuICAgIGZsaXBWYXJpYXRpb25zOiBmYWxzZSxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7Qm9vbGVhbn0gZmxpcFZhcmlhdGlvbnNCeUNvbnRlbnQ9ZmFsc2VcbiAgICAgKiBUaGUgcG9wcGVyIHdpbGwgc3dpdGNoIHBsYWNlbWVudCB2YXJpYXRpb24gYmV0d2VlbiBgLXN0YXJ0YCBhbmQgYC1lbmRgIHdoZW5cbiAgICAgKiB0aGUgcG9wcGVyIGVsZW1lbnQgb3ZlcmxhcHMgaXRzIHJlZmVyZW5jZSBib3VuZGFyaWVzLlxuICAgICAqXG4gICAgICogVGhlIG9yaWdpbmFsIHBsYWNlbWVudCBzaG91bGQgaGF2ZSBhIHNldCB2YXJpYXRpb24uXG4gICAgICovXG4gICAgZmxpcFZhcmlhdGlvbnNCeUNvbnRlbnQ6IGZhbHNlXG4gIH0sXG5cbiAgLyoqXG4gICAqIE1vZGlmaWVyIHVzZWQgdG8gbWFrZSB0aGUgcG9wcGVyIGZsb3cgdG93YXJkIHRoZSBpbm5lciBvZiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqIEJ5IGRlZmF1bHQsIHdoZW4gdGhpcyBtb2RpZmllciBpcyBkaXNhYmxlZCwgdGhlIHBvcHBlciB3aWxsIGJlIHBsYWNlZCBvdXRzaWRlXG4gICAqIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGlubmVyOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTcwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogNzAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD1mYWxzZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBpbm5lclxuICB9LFxuXG4gIC8qKlxuICAgKiBNb2RpZmllciB1c2VkIHRvIGhpZGUgdGhlIHBvcHBlciB3aGVuIGl0cyByZWZlcmVuY2UgZWxlbWVudCBpcyBvdXRzaWRlIG9mIHRoZVxuICAgKiBwb3BwZXIgYm91bmRhcmllcy4gSXQgd2lsbCBzZXQgYSBgeC1vdXQtb2YtYm91bmRhcmllc2AgYXR0cmlidXRlIHdoaWNoIGNhblxuICAgKiBiZSB1c2VkIHRvIGhpZGUgd2l0aCBhIENTUyBzZWxlY3RvciB0aGUgcG9wcGVyIHdoZW4gaXRzIHJlZmVyZW5jZSBpc1xuICAgKiBvdXQgb2YgYm91bmRhcmllcy5cbiAgICpcbiAgICogUmVxdWlyZXMgdGhlIGBwcmV2ZW50T3ZlcmZsb3dgIG1vZGlmaWVyIGJlZm9yZSBpdCBpbiBvcmRlciB0byB3b3JrLlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgaGlkZToge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj04MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDgwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGhpZGVcbiAgfSxcblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIHN0eWxlIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXIgZWxlbWVudCB0byBnZXRzXG4gICAqIHByb3Blcmx5IHBvc2l0aW9uZWQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIG1vZGlmaWVyIHdpbGwgbm90IHRvdWNoIHRoZSBET00sIGl0IGp1c3QgcHJlcGFyZXMgdGhlIHN0eWxlc1xuICAgKiBzbyB0aGF0IGBhcHBseVN0eWxlYCBtb2RpZmllciBjYW4gYXBwbHkgaXQuIFRoaXMgc2VwYXJhdGlvbiBpcyB1c2VmdWxcbiAgICogaW4gY2FzZSB5b3UgbmVlZCB0byByZXBsYWNlIGBhcHBseVN0eWxlYCB3aXRoIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uLlxuICAgKlxuICAgKiBUaGlzIG1vZGlmaWVyIGhhcyBgODUwYCBhcyBgb3JkZXJgIHZhbHVlIHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICogd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBvZiBQb3BwZXIuanMuIEV4cGVjdCB0aGUgbW9kaWZpZXJzIG9yZGVyaW5nIG1ldGhvZFxuICAgKiB0byBjaGFuZ2UgaW4gZnV0dXJlIG1ham9yIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5LlxuICAgKlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgY29tcHV0ZVN0eWxlOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTg1MCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogODUwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogY29tcHV0ZVN0eWxlLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtCb29sZWFufSBncHVBY2NlbGVyYXRpb249dHJ1ZVxuICAgICAqIElmIHRydWUsIGl0IHVzZXMgdGhlIENTUyAzRCB0cmFuc2Zvcm1hdGlvbiB0byBwb3NpdGlvbiB0aGUgcG9wcGVyLlxuICAgICAqIE90aGVyd2lzZSwgaXQgd2lsbCB1c2UgdGhlIGB0b3BgIGFuZCBgbGVmdGAgcHJvcGVydGllc1xuICAgICAqL1xuICAgIGdwdUFjY2VsZXJhdGlvbjogdHJ1ZSxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7c3RyaW5nfSBbeD0nYm90dG9tJ11cbiAgICAgKiBXaGVyZSB0byBhbmNob3IgdGhlIFggYXhpcyAoYGJvdHRvbWAgb3IgYHRvcGApLiBBS0EgWCBvZmZzZXQgb3JpZ2luLlxuICAgICAqIENoYW5nZSB0aGlzIGlmIHlvdXIgcG9wcGVyIHNob3VsZCBncm93IGluIGEgZGlyZWN0aW9uIGRpZmZlcmVudCBmcm9tIGBib3R0b21gXG4gICAgICovXG4gICAgeDogJ2JvdHRvbScsXG4gICAgLyoqXG4gICAgICogQHByb3Age3N0cmluZ30gW3g9J2xlZnQnXVxuICAgICAqIFdoZXJlIHRvIGFuY2hvciB0aGUgWSBheGlzIChgbGVmdGAgb3IgYHJpZ2h0YCkuIEFLQSBZIG9mZnNldCBvcmlnaW4uXG4gICAgICogQ2hhbmdlIHRoaXMgaWYgeW91ciBwb3BwZXIgc2hvdWxkIGdyb3cgaW4gYSBkaXJlY3Rpb24gZGlmZmVyZW50IGZyb20gYHJpZ2h0YFxuICAgICAqL1xuICAgIHk6ICdyaWdodCdcbiAgfSxcblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgY29tcHV0ZWQgc3R5bGVzIHRvIHRoZSBwb3BwZXIgZWxlbWVudC5cbiAgICpcbiAgICogQWxsIHRoZSBET00gbWFuaXB1bGF0aW9ucyBhcmUgbGltaXRlZCB0byB0aGlzIG1vZGlmaWVyLiBUaGlzIGlzIHVzZWZ1bCBpbiBjYXNlXG4gICAqIHlvdSB3YW50IHRvIGludGVncmF0ZSBQb3BwZXIuanMgaW5zaWRlIGEgZnJhbWV3b3JrIG9yIHZpZXcgbGlicmFyeSBhbmQgeW91XG4gICAqIHdhbnQgdG8gZGVsZWdhdGUgYWxsIHRoZSBET00gbWFuaXB1bGF0aW9ucyB0byBpdC5cbiAgICpcbiAgICogTm90ZSB0aGF0IGlmIHlvdSBkaXNhYmxlIHRoaXMgbW9kaWZpZXIsIHlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgcG9wcGVyIGVsZW1lbnRcbiAgICogaGFzIGl0cyBwb3NpdGlvbiBzZXQgdG8gYGFic29sdXRlYCBiZWZvcmUgUG9wcGVyLmpzIGNhbiBkbyBpdHMgd29yayFcbiAgICpcbiAgICogSnVzdCBkaXNhYmxlIHRoaXMgbW9kaWZpZXIgYW5kIGRlZmluZSB5b3VyIG93biB0byBhY2hpZXZlIHRoZSBkZXNpcmVkIGVmZmVjdC5cbiAgICpcbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGFwcGx5U3R5bGU6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9OTAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA5MDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBhcHBseVN0eWxlLFxuICAgIC8qKiBAcHJvcCB7RnVuY3Rpb259ICovXG4gICAgb25Mb2FkOiBhcHBseVN0eWxlT25Mb2FkLFxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMS4xMC4wLCB0aGUgcHJvcGVydHkgbW92ZWQgdG8gYGNvbXB1dGVTdHlsZWAgbW9kaWZpZXJcbiAgICAgKiBAcHJvcCB7Qm9vbGVhbn0gZ3B1QWNjZWxlcmF0aW9uPXRydWVcbiAgICAgKiBJZiB0cnVlLCBpdCB1c2VzIHRoZSBDU1MgM0QgdHJhbnNmb3JtYXRpb24gdG8gcG9zaXRpb24gdGhlIHBvcHBlci5cbiAgICAgKiBPdGhlcndpc2UsIGl0IHdpbGwgdXNlIHRoZSBgdG9wYCBhbmQgYGxlZnRgIHByb3BlcnRpZXNcbiAgICAgKi9cbiAgICBncHVBY2NlbGVyYXRpb246IHVuZGVmaW5lZFxuICB9XG59O1xuXG4vKipcbiAqIFRoZSBgZGF0YU9iamVjdGAgaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBpbmZvcm1hdGlvbiB1c2VkIGJ5IFBvcHBlci5qcy5cbiAqIFRoaXMgb2JqZWN0IGlzIHBhc3NlZCB0byBtb2RpZmllcnMgYW5kIHRvIHRoZSBgb25DcmVhdGVgIGFuZCBgb25VcGRhdGVgIGNhbGxiYWNrcy5cbiAqIEBuYW1lIGRhdGFPYmplY3RcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLmluc3RhbmNlIFRoZSBQb3BwZXIuanMgaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBkYXRhLnBsYWNlbWVudCBQbGFjZW1lbnQgYXBwbGllZCB0byBwb3BwZXJcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBkYXRhLm9yaWdpbmFsUGxhY2VtZW50IFBsYWNlbWVudCBvcmlnaW5hbGx5IGRlZmluZWQgb24gaW5pdFxuICogQHByb3BlcnR5IHtCb29sZWFufSBkYXRhLmZsaXBwZWQgVHJ1ZSBpZiBwb3BwZXIgaGFzIGJlZW4gZmxpcHBlZCBieSBmbGlwIG1vZGlmaWVyXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGRhdGEuaGlkZSBUcnVlIGlmIHRoZSByZWZlcmVuY2UgZWxlbWVudCBpcyBvdXQgb2YgYm91bmRhcmllcywgdXNlZnVsIHRvIGtub3cgd2hlbiB0byBoaWRlIHRoZSBwb3BwZXJcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IGRhdGEuYXJyb3dFbGVtZW50IE5vZGUgdXNlZCBhcyBhcnJvdyBieSBhcnJvdyBtb2RpZmllclxuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEuc3R5bGVzIEFueSBDU1MgcHJvcGVydHkgZGVmaW5lZCBoZXJlIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyLiBJdCBleHBlY3RzIHRoZSBKYXZhU2NyaXB0IG5vbWVuY2xhdHVyZSAoZWcuIGBtYXJnaW5Cb3R0b21gKVxuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEuYXJyb3dTdHlsZXMgQW55IENTUyBwcm9wZXJ0eSBkZWZpbmVkIGhlcmUgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXIgYXJyb3cuIEl0IGV4cGVjdHMgdGhlIEphdmFTY3JpcHQgbm9tZW5jbGF0dXJlIChlZy4gYG1hcmdpbkJvdHRvbWApXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5ib3VuZGFyaWVzIE9mZnNldHMgb2YgdGhlIHBvcHBlciBib3VuZGFyaWVzXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5vZmZzZXRzIFRoZSBtZWFzdXJlbWVudHMgb2YgcG9wcGVyLCByZWZlcmVuY2UgYW5kIGFycm93IGVsZW1lbnRzXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5vZmZzZXRzLnBvcHBlciBgdG9wYCwgYGxlZnRgLCBgd2lkdGhgLCBgaGVpZ2h0YCB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLm9mZnNldHMucmVmZXJlbmNlIGB0b3BgLCBgbGVmdGAsIGB3aWR0aGAsIGBoZWlnaHRgIHZhbHVlc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEub2Zmc2V0cy5hcnJvd10gYHRvcGAgYW5kIGBsZWZ0YCBvZmZzZXRzLCBvbmx5IG9uZSBvZiB0aGVtIHdpbGwgYmUgZGlmZmVyZW50IGZyb20gMFxuICovXG5cbi8qKlxuICogRGVmYXVsdCBvcHRpb25zIHByb3ZpZGVkIHRvIFBvcHBlci5qcyBjb25zdHJ1Y3Rvci48YnIgLz5cbiAqIFRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIHRoZSBgb3B0aW9uc2AgYXJndW1lbnQgb2YgUG9wcGVyLmpzLjxiciAvPlxuICogVG8gb3ZlcnJpZGUgYW4gb3B0aW9uLCBzaW1wbHkgcGFzcyBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZVxuICogc3RydWN0dXJlIG9mIHRoZSBgb3B0aW9uc2Agb2JqZWN0LCBhcyB0aGUgM3JkIGFyZ3VtZW50LiBGb3IgZXhhbXBsZTpcbiAqIGBgYFxuICogbmV3IFBvcHBlcihyZWYsIHBvcCwge1xuICogICBtb2RpZmllcnM6IHtcbiAqICAgICBwcmV2ZW50T3ZlcmZsb3c6IHsgZW5hYmxlZDogZmFsc2UgfVxuICogICB9XG4gKiB9KVxuICogYGBgXG4gKiBAdHlwZSB7T2JqZWN0fVxuICogQHN0YXRpY1xuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG52YXIgRGVmYXVsdHMgPSB7XG4gIC8qKlxuICAgKiBQb3BwZXIncyBwbGFjZW1lbnQuXG4gICAqIEBwcm9wIHtQb3BwZXIucGxhY2VtZW50c30gcGxhY2VtZW50PSdib3R0b20nXG4gICAqL1xuICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuXG4gIC8qKlxuICAgKiBTZXQgdGhpcyB0byB0cnVlIGlmIHlvdSB3YW50IHBvcHBlciB0byBwb3NpdGlvbiBpdCBzZWxmIGluICdmaXhlZCcgbW9kZVxuICAgKiBAcHJvcCB7Qm9vbGVhbn0gcG9zaXRpb25GaXhlZD1mYWxzZVxuICAgKi9cbiAgcG9zaXRpb25GaXhlZDogZmFsc2UsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZXZlbnRzIChyZXNpemUsIHNjcm9sbCkgYXJlIGluaXRpYWxseSBlbmFibGVkLlxuICAgKiBAcHJvcCB7Qm9vbGVhbn0gZXZlbnRzRW5hYmxlZD10cnVlXG4gICAqL1xuICBldmVudHNFbmFibGVkOiB0cnVlLFxuXG4gIC8qKlxuICAgKiBTZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBhdXRvbWF0aWNhbGx5IHJlbW92ZSB0aGUgcG9wcGVyIHdoZW5cbiAgICogeW91IGNhbGwgdGhlIGBkZXN0cm95YCBtZXRob2QuXG4gICAqIEBwcm9wIHtCb29sZWFufSByZW1vdmVPbkRlc3Ryb3k9ZmFsc2VcbiAgICovXG4gIHJlbW92ZU9uRGVzdHJveTogZmFsc2UsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGNhbGxlZCB3aGVuIHRoZSBwb3BwZXIgaXMgY3JlYXRlZC48YnIgLz5cbiAgICogQnkgZGVmYXVsdCwgaXQgaXMgc2V0IHRvIG5vLW9wLjxiciAvPlxuICAgKiBBY2Nlc3MgUG9wcGVyLmpzIGluc3RhbmNlIHdpdGggYGRhdGEuaW5zdGFuY2VgLlxuICAgKiBAcHJvcCB7b25DcmVhdGV9XG4gICAqL1xuICBvbkNyZWF0ZTogZnVuY3Rpb24gb25DcmVhdGUoKSB7fSxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIHBvcHBlciBpcyB1cGRhdGVkLiBUaGlzIGNhbGxiYWNrIGlzIG5vdCBjYWxsZWRcbiAgICogb24gdGhlIGluaXRpYWxpemF0aW9uL2NyZWF0aW9uIG9mIHRoZSBwb3BwZXIsIGJ1dCBvbmx5IG9uIHN1YnNlcXVlbnRcbiAgICogdXBkYXRlcy48YnIgLz5cbiAgICogQnkgZGVmYXVsdCwgaXQgaXMgc2V0IHRvIG5vLW9wLjxiciAvPlxuICAgKiBBY2Nlc3MgUG9wcGVyLmpzIGluc3RhbmNlIHdpdGggYGRhdGEuaW5zdGFuY2VgLlxuICAgKiBAcHJvcCB7b25VcGRhdGV9XG4gICAqL1xuICBvblVwZGF0ZTogZnVuY3Rpb24gb25VcGRhdGUoKSB7fSxcblxuICAvKipcbiAgICogTGlzdCBvZiBtb2RpZmllcnMgdXNlZCB0byBtb2RpZnkgdGhlIG9mZnNldHMgYmVmb3JlIHRoZXkgYXJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlci5cbiAgICogVGhleSBwcm92aWRlIG1vc3Qgb2YgdGhlIGZ1bmN0aW9uYWxpdGllcyBvZiBQb3BwZXIuanMuXG4gICAqIEBwcm9wIHttb2RpZmllcnN9XG4gICAqL1xuICBtb2RpZmllcnM6IG1vZGlmaWVyc1xufTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgb25DcmVhdGVcbiAqIEBwYXJhbSB7ZGF0YU9iamVjdH0gZGF0YVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIG9uVXBkYXRlXG4gKiBAcGFyYW0ge2RhdGFPYmplY3R9IGRhdGFcbiAqL1xuXG4vLyBVdGlsc1xuLy8gTWV0aG9kc1xudmFyIFBvcHBlciA9IGZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgUG9wcGVyLmpzIGluc3RhbmNlLlxuICAgKiBAY2xhc3MgUG9wcGVyXG4gICAqIEBwYXJhbSB7RWxlbWVudHxyZWZlcmVuY2VPYmplY3R9IHJlZmVyZW5jZSAtIFRoZSByZWZlcmVuY2UgZWxlbWVudCB1c2VkIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBwb3BwZXIgLSBUaGUgSFRNTCAvIFhNTCBlbGVtZW50IHVzZWQgYXMgdGhlIHBvcHBlclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFlvdXIgY3VzdG9tIG9wdGlvbnMgdG8gb3ZlcnJpZGUgdGhlIG9uZXMgZGVmaW5lZCBpbiBbRGVmYXVsdHNdKCNkZWZhdWx0cylcbiAgICogQHJldHVybiB7T2JqZWN0fSBpbnN0YW5jZSAtIFRoZSBnZW5lcmF0ZWQgUG9wcGVyLmpzIGluc3RhbmNlXG4gICAqL1xuICBmdW5jdGlvbiBQb3BwZXIocmVmZXJlbmNlLCBwb3BwZXIpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFBvcHBlcik7XG5cbiAgICB0aGlzLnNjaGVkdWxlVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZShfdGhpcy51cGRhdGUpO1xuICAgIH07XG5cbiAgICAvLyBtYWtlIHVwZGF0ZSgpIGRlYm91bmNlZCwgc28gdGhhdCBpdCBvbmx5IHJ1bnMgYXQgbW9zdCBvbmNlLXBlci10aWNrXG4gICAgdGhpcy51cGRhdGUgPSBkZWJvdW5jZSh0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpKTtcblxuICAgIC8vIHdpdGgge30gd2UgY3JlYXRlIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBvcHRpb25zIGluc2lkZSBpdFxuICAgIHRoaXMub3B0aW9ucyA9IF9leHRlbmRzKHt9LCBQb3BwZXIuRGVmYXVsdHMsIG9wdGlvbnMpO1xuXG4gICAgLy8gaW5pdCBzdGF0ZVxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0Rlc3Ryb3llZDogZmFsc2UsXG4gICAgICBpc0NyZWF0ZWQ6IGZhbHNlLFxuICAgICAgc2Nyb2xsUGFyZW50czogW11cbiAgICB9O1xuXG4gICAgLy8gZ2V0IHJlZmVyZW5jZSBhbmQgcG9wcGVyIGVsZW1lbnRzIChhbGxvdyBqUXVlcnkgd3JhcHBlcnMpXG4gICAgdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2UgJiYgcmVmZXJlbmNlLmpxdWVyeSA/IHJlZmVyZW5jZVswXSA6IHJlZmVyZW5jZTtcbiAgICB0aGlzLnBvcHBlciA9IHBvcHBlciAmJiBwb3BwZXIuanF1ZXJ5ID8gcG9wcGVyWzBdIDogcG9wcGVyO1xuXG4gICAgLy8gRGVlcCBtZXJnZSBtb2RpZmllcnMgb3B0aW9uc1xuICAgIHRoaXMub3B0aW9ucy5tb2RpZmllcnMgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhfZXh0ZW5kcyh7fSwgUG9wcGVyLkRlZmF1bHRzLm1vZGlmaWVycywgb3B0aW9ucy5tb2RpZmllcnMpKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBfdGhpcy5vcHRpb25zLm1vZGlmaWVyc1tuYW1lXSA9IF9leHRlbmRzKHt9LCBQb3BwZXIuRGVmYXVsdHMubW9kaWZpZXJzW25hbWVdIHx8IHt9LCBvcHRpb25zLm1vZGlmaWVycyA/IG9wdGlvbnMubW9kaWZpZXJzW25hbWVdIDoge30pO1xuICAgIH0pO1xuXG4gICAgLy8gUmVmYWN0b3JpbmcgbW9kaWZpZXJzJyBsaXN0IChPYmplY3QgPT4gQXJyYXkpXG4gICAgdGhpcy5tb2RpZmllcnMgPSBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMubW9kaWZpZXJzKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIG5hbWU6IG5hbWVcbiAgICAgIH0sIF90aGlzLm9wdGlvbnMubW9kaWZpZXJzW25hbWVdKTtcbiAgICB9KVxuICAgIC8vIHNvcnQgdGhlIG1vZGlmaWVycyBieSBvcmRlclxuICAgIC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS5vcmRlciAtIGIub3JkZXI7XG4gICAgfSk7XG5cbiAgICAvLyBtb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byBleGVjdXRlIGFyYml0cmFyeSBjb2RlIHdoZW4gUG9wcGVyLmpzIGdldCBpbml0ZWRcbiAgICAvLyBzdWNoIGNvZGUgaXMgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgb2YgaXRzIG1vZGlmaWVyXG4gICAgLy8gdGhleSBjb3VsZCBhZGQgbmV3IHByb3BlcnRpZXMgdG8gdGhlaXIgb3B0aW9ucyBjb25maWd1cmF0aW9uXG4gICAgLy8gQkUgQVdBUkU6IGRvbid0IGFkZCBvcHRpb25zIHRvIGBvcHRpb25zLm1vZGlmaWVycy5uYW1lYCBidXQgdG8gYG1vZGlmaWVyT3B0aW9uc2AhXG4gICAgdGhpcy5tb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXJPcHRpb25zKSB7XG4gICAgICBpZiAobW9kaWZpZXJPcHRpb25zLmVuYWJsZWQgJiYgaXNGdW5jdGlvbihtb2RpZmllck9wdGlvbnMub25Mb2FkKSkge1xuICAgICAgICBtb2RpZmllck9wdGlvbnMub25Mb2FkKF90aGlzLnJlZmVyZW5jZSwgX3RoaXMucG9wcGVyLCBfdGhpcy5vcHRpb25zLCBtb2RpZmllck9wdGlvbnMsIF90aGlzLnN0YXRlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGZpcmUgdGhlIGZpcnN0IHVwZGF0ZSB0byBwb3NpdGlvbiB0aGUgcG9wcGVyIGluIHRoZSByaWdodCBwbGFjZVxuICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICB2YXIgZXZlbnRzRW5hYmxlZCA9IHRoaXMub3B0aW9ucy5ldmVudHNFbmFibGVkO1xuICAgIGlmIChldmVudHNFbmFibGVkKSB7XG4gICAgICAvLyBzZXR1cCBldmVudCBsaXN0ZW5lcnMsIHRoZXkgd2lsbCB0YWtlIGNhcmUgb2YgdXBkYXRlIHRoZSBwb3NpdGlvbiBpbiBzcGVjaWZpYyBzaXR1YXRpb25zXG4gICAgICB0aGlzLmVuYWJsZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZS5ldmVudHNFbmFibGVkID0gZXZlbnRzRW5hYmxlZDtcbiAgfVxuXG4gIC8vIFdlIGNhbid0IHVzZSBjbGFzcyBwcm9wZXJ0aWVzIGJlY2F1c2UgdGhleSBkb24ndCBnZXQgbGlzdGVkIGluIHRoZVxuICAvLyBjbGFzcyBwcm90b3R5cGUgYW5kIGJyZWFrIHN0dWZmIGxpa2UgU2lub24gc3R1YnNcblxuXG4gIGNyZWF0ZUNsYXNzKFBvcHBlciwgW3tcbiAgICBrZXk6ICd1cGRhdGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGUkJDEoKSB7XG4gICAgICByZXR1cm4gdXBkYXRlLmNhbGwodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGVzdHJveScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3kkJDEoKSB7XG4gICAgICByZXR1cm4gZGVzdHJveS5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2VuYWJsZUV2ZW50TGlzdGVuZXJzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5hYmxlRXZlbnRMaXN0ZW5lcnMkJDEoKSB7XG4gICAgICByZXR1cm4gZW5hYmxlRXZlbnRMaXN0ZW5lcnMuY2FsbCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkaXNhYmxlRXZlbnRMaXN0ZW5lcnMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNhYmxlRXZlbnRMaXN0ZW5lcnMkJDEoKSB7XG4gICAgICByZXR1cm4gZGlzYWJsZUV2ZW50TGlzdGVuZXJzLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2NoZWR1bGVzIGFuIHVwZGF0ZS4gSXQgd2lsbCBydW4gb24gdGhlIG5leHQgVUkgdXBkYXRlIGF2YWlsYWJsZS5cbiAgICAgKiBAbWV0aG9kIHNjaGVkdWxlVXBkYXRlXG4gICAgICogQG1lbWJlcm9mIFBvcHBlclxuICAgICAqL1xuXG5cbiAgICAvKipcbiAgICAgKiBDb2xsZWN0aW9uIG9mIHV0aWxpdGllcyB1c2VmdWwgd2hlbiB3cml0aW5nIGN1c3RvbSBtb2RpZmllcnMuXG4gICAgICogU3RhcnRpbmcgZnJvbSB2ZXJzaW9uIDEuNywgdGhpcyBtZXRob2QgaXMgYXZhaWxhYmxlIG9ubHkgaWYgeW91XG4gICAgICogaW5jbHVkZSBgcG9wcGVyLXV0aWxzLmpzYCBiZWZvcmUgYHBvcHBlci5qc2AuXG4gICAgICpcbiAgICAgKiAqKkRFUFJFQ0FUSU9OKio6IFRoaXMgd2F5IHRvIGFjY2VzcyBQb3BwZXJVdGlscyBpcyBkZXByZWNhdGVkXG4gICAgICogYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB2MiEgVXNlIHRoZSBQb3BwZXJVdGlscyBtb2R1bGUgZGlyZWN0bHkgaW5zdGVhZC5cbiAgICAgKiBEdWUgdG8gdGhlIGhpZ2ggaW5zdGFiaWxpdHkgb2YgdGhlIG1ldGhvZHMgY29udGFpbmVkIGluIFV0aWxzLCB3ZSBjYW4ndFxuICAgICAqIGd1YXJhbnRlZSB0aGVtIHRvIGZvbGxvdyBzZW12ZXIuIFVzZSB0aGVtIGF0IHlvdXIgb3duIHJpc2shXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwcml2YXRlXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDEuOFxuICAgICAqIEBtZW1iZXIgVXRpbHNcbiAgICAgKiBAbWVtYmVyb2YgUG9wcGVyXG4gICAgICovXG5cbiAgfV0pO1xuICByZXR1cm4gUG9wcGVyO1xufSgpO1xuXG4vKipcbiAqIFRoZSBgcmVmZXJlbmNlT2JqZWN0YCBpcyBhbiBvYmplY3QgdGhhdCBwcm92aWRlcyBhbiBpbnRlcmZhY2UgY29tcGF0aWJsZSB3aXRoIFBvcHBlci5qc1xuICogYW5kIGxldHMgeW91IHVzZSBpdCBhcyByZXBsYWNlbWVudCBvZiBhIHJlYWwgRE9NIG5vZGUuPGJyIC8+XG4gKiBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBwb3NpdGlvbiBhIHBvcHBlciByZWxhdGl2ZWx5IHRvIGEgc2V0IG9mIGNvb3JkaW5hdGVzXG4gKiBpbiBjYXNlIHlvdSBkb24ndCBoYXZlIGEgRE9NIG5vZGUgdG8gdXNlIGFzIHJlZmVyZW5jZS5cbiAqXG4gKiBgYGBcbiAqIG5ldyBQb3BwZXIocmVmZXJlbmNlT2JqZWN0LCBwb3BwZXJOb2RlKTtcbiAqIGBgYFxuICpcbiAqIE5COiBUaGlzIGZlYXR1cmUgaXNuJ3Qgc3VwcG9ydGVkIGluIEludGVybmV0IEV4cGxvcmVyIDEwLlxuICogQG5hbWUgcmVmZXJlbmNlT2JqZWN0XG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBkYXRhLmdldEJvdW5kaW5nQ2xpZW50UmVjdFxuICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBzZXQgb2YgY29vcmRpbmF0ZXMgY29tcGF0aWJsZSB3aXRoIHRoZSBuYXRpdmUgYGdldEJvdW5kaW5nQ2xpZW50UmVjdGAgbWV0aG9kLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRhdGEuY2xpZW50V2lkdGhcbiAqIEFuIEVTNiBnZXR0ZXIgdGhhdCB3aWxsIHJldHVybiB0aGUgd2lkdGggb2YgdGhlIHZpcnR1YWwgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZGF0YS5jbGllbnRIZWlnaHRcbiAqIEFuIEVTNiBnZXR0ZXIgdGhhdCB3aWxsIHJldHVybiB0aGUgaGVpZ2h0IG9mIHRoZSB2aXJ0dWFsIHJlZmVyZW5jZSBlbGVtZW50LlxuICovXG5cblxuUG9wcGVyLlV0aWxzID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogZ2xvYmFsKS5Qb3BwZXJVdGlscztcblBvcHBlci5wbGFjZW1lbnRzID0gcGxhY2VtZW50cztcblBvcHBlci5EZWZhdWx0cyA9IERlZmF1bHRzO1xuXG5leHBvcnQgZGVmYXVsdCBQb3BwZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb3BwZXIuanMubWFwXG4iXSwic291cmNlUm9vdCI6IiJ9\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzP2YyOGMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBOztBQUVBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsVUFBVSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/process/browser.js\n");
|
||
|
||
/***/ })
|
||
|
||
/******/ });
|
||
/************************************************************************/
|
||
/******/ // The module cache
|
||
/******/ var __webpack_module_cache__ = {};
|
||
/******/
|
||
/******/ // The require function
|
||
/******/ function __webpack_require__(moduleId) {
|
||
/******/ // Check if module is in cache
|
||
/******/ if(__webpack_module_cache__[moduleId]) {
|
||
/******/ return __webpack_module_cache__[moduleId].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__;
|
||
/******/
|
||
/******/ // the startup function
|
||
/******/ // It's empty as some runtime module handles the default behavior
|
||
/******/ __webpack_require__.x = x => {};
|
||
/************************************************************************/
|
||
/******/ /* 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
|
||
/******/ // Promise = chunk loading, 0 = chunk loaded
|
||
/******/ var installedChunks = {
|
||
/******/ "/js/app": 0
|
||
/******/ };
|
||
/******/
|
||
/******/ var deferredModules = [
|
||
/******/ ["./resources/js/app.js"],
|
||
/******/ ["./resources/sass/app.scss"]
|
||
/******/ ];
|
||
/******/ // no chunk on demand loading
|
||
/******/
|
||
/******/ // no prefetching
|
||
/******/
|
||
/******/ // no preloaded
|
||
/******/
|
||
/******/ // no HMR
|
||
/******/
|
||
/******/ // no HMR manifest
|
||
/******/
|
||
/******/ var checkDeferredModules = x => {};
|
||
/******/
|
||
/******/ // install a JSONP callback for chunk loading
|
||
/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => {
|
||
/******/ var [chunkIds, moreModules, runtime, executeModules] = data;
|
||
/******/ // add "moreModules" to the modules object,
|
||
/******/ // then flag all "chunkIds" as loaded and fire callback
|
||
/******/ var moduleId, chunkId, i = 0, resolves = [];
|
||
/******/ for(;i < chunkIds.length; i++) {
|
||
/******/ chunkId = chunkIds[i];
|
||
/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {
|
||
/******/ resolves.push(installedChunks[chunkId][0]);
|
||
/******/ }
|
||
/******/ installedChunks[chunkId] = 0;
|
||
/******/ }
|
||
/******/ for(moduleId in moreModules) {
|
||
/******/ if(__webpack_require__.o(moreModules, moduleId)) {
|
||
/******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
|
||
/******/ }
|
||
/******/ }
|
||
/******/ if(runtime) runtime(__webpack_require__);
|
||
/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);
|
||
/******/ while(resolves.length) {
|
||
/******/ resolves.shift()();
|
||
/******/ }
|
||
/******/
|
||
/******/ // add entry modules from loaded chunk to deferred list
|
||
/******/ if(executeModules) deferredModules.push.apply(deferredModules, executeModules);
|
||
/******/
|
||
/******/ // run deferred modules when all chunks ready
|
||
/******/ return checkDeferredModules();
|
||
/******/ }
|
||
/******/
|
||
/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || [];
|
||
/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));
|
||
/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));
|
||
/******/
|
||
/******/ function checkDeferredModulesImpl() {
|
||
/******/ var result;
|
||
/******/ for(var i = 0; i < deferredModules.length; i++) {
|
||
/******/ var deferredModule = deferredModules[i];
|
||
/******/ var fulfilled = true;
|
||
/******/ for(var j = 1; j < deferredModule.length; j++) {
|
||
/******/ var depId = deferredModule[j];
|
||
/******/ if(installedChunks[depId] !== 0) fulfilled = false;
|
||
/******/ }
|
||
/******/ if(fulfilled) {
|
||
/******/ deferredModules.splice(i--, 1);
|
||
/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]);
|
||
/******/ }
|
||
/******/ }
|
||
/******/ if(deferredModules.length === 0) {
|
||
/******/ __webpack_require__.x();
|
||
/******/ __webpack_require__.x = x => {};
|
||
/******/ }
|
||
/******/ return result;
|
||
/******/ }
|
||
/******/ var startup = __webpack_require__.x;
|
||
/******/ __webpack_require__.x = () => {
|
||
/******/ // reset startup function so it can be called again when more startup code is added
|
||
/******/ __webpack_require__.x = startup || (x => {});
|
||
/******/ return (checkDeferredModules = checkDeferredModulesImpl)();
|
||
/******/ };
|
||
/******/ })();
|
||
/******/
|
||
/************************************************************************/
|
||
/******/ // run startup
|
||
/******/ __webpack_require__.x();
|
||
/******/ })()
|
||
; |