(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else if(typeof exports === 'object')
exports["AhoraCrypto"] = factory();
else
root["AhoraCrypto"] = factory();
})(this, () => {
return /******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ "./src/webwidget/webwidget.ts":
/*!************************************!*\
!*** ./src/webwidget/webwidget.ts ***!
\************************************/
/***/ ((__unused_webpack_module, exports) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.renderWebwidget = void 0;
/**
* Renders the AhoraCrypto web widget in the specified container element
* @param config Configuration object for the widget
* @param config.referral Optional referral identifier used for tracking traffic sources.
* If not provided, the domain of the container will be used automatically.
* The system extracts the base domain (e.g., "example.com" from "sub.example.com")
* @returns WebwidgetController that allows interaction with the iframe
*/
function renderWebwidget(config) {
// Extract container element
var container = document.getElementById(config.containerId);
if (!container) {
console.error("Container with ID '".concat(config.containerId, "' not found."));
throw new Error("Container with ID '".concat(config.containerId, "' not found."));
}
// Generate iframe URL with parameters
var baseUrl = "https://ahoracrypto.com/";
// Only add language to URL if it's specified
if (config.language) {
baseUrl += config.language + "/";
}
baseUrl += "webwidget/";
// Create URL params object
var params = new URLSearchParams();
// Add parameters if they exist (mapping from config param to iframe param)
if (config.cryptoCurrency)
params.append('crypto', config.cryptoCurrency);
if (config.fiatCurrency)
params.append('fiat', config.fiatCurrency);
if (config.logoUrl && config.logoUrl.trim() !== '')
params.append('lurl', config.logoUrl);
if (config.backgroundColor)
params.append('bgc', config.backgroundColor);
if (config.buttonColor)
params.append('btc', config.buttonColor);
if (config.borderRadius !== undefined)
params.append('br', config.borderRadius.toString());
if (config.borderWithShadow !== undefined)
params.append('bws', config.borderWithShadow ? '1' : '0');
if (config.paymentIntentId)
params.append('pi', config.paymentIntentId);
if (config.cryptos && config.cryptos.trim() !== '')
params.append('cryptos', config.cryptos);
if (config.defaultNetwork && config.defaultNetwork.trim() !== '')
params.append('defaultNetwork', config.defaultNetwork);
// Add referral parameter (if provided) or use current domain
var referral = config.referral;
if (!referral) {
// Extract domain from current URL (without subdomains, path, protocol, or port)
try {
var hostname = window.location.hostname;
// Extract the domain: split by dots and take the last two parts
// This handles cases like sub.domain.com -> domain.com
var parts = hostname.split('.');
if (parts.length >= 2) {
// For normal domains like example.com
var domain = parts.slice(-2).join('.');
referral = domain;
}
else {
// For localhost or IP addresses
referral = hostname;
}
params.append('referral', referral);
}
catch (e) {
console.warn('Could not extract domain for referral:', e);
}
}
// Always pass the current theme to the iframe
var theme = 'light';
try {
// Check first for a theme passed in the configuration
if (config.theme) {
theme = config.theme.toLowerCase();
}
else {
// If not in config, try our prefixed localStorage key first
var ahoraCryptoTheme = localStorage.getItem('ahoracrypto-theme');
if (ahoraCryptoTheme && (ahoraCryptoTheme === 'dark' || ahoraCryptoTheme === 'light')) {
theme = ahoraCryptoTheme;
}
// Fall back to generic 'theme' key in localStorage
else {
var savedTheme = localStorage.getItem('theme');
if (savedTheme && (savedTheme === 'dark' || savedTheme === 'light')) {
theme = savedTheme;
}
else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
// If not in localStorage, check system preference
theme = 'dark';
}
}
}
// Add a console log for debugging
console.log('Detected theme:', theme);
}
catch (e) {
// In case localStorage is not accessible
console.warn('Could not access localStorage for theme:', e);
// Default to light theme on error
theme = 'light';
}
// Always pass the current theme to the iframe
params.append('theme', theme);
// Create iframe element
var iframe = document.createElement('iframe');
// Default background colors based on theme
var defaultBgColor = theme === 'dark' ?
'rgb(55 55 55 / 1)' : 'white';
var defaultBgColor2 = theme === 'dark' ?
'rgb(55 55 55 / 1)' : 'white';
// Add custom styles to head
var styleElement = document.createElement('style');
styleElement.textContent = "\n .AhoraCrypto_iframe_container {\n max-width: 26rem;\n max-height: 600px;\n width: auto;\n height: auto;\n margin-left: auto;\n margin-right: auto;\n background-color: white;\n position: relative;\n overflow: hidden;\n border-radius: 24px;\n }\n \n .AhoraCrypto_iframe_with_shadow {\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n }\n \n @media (prefers-color-scheme: dark) {\n .AhoraCrypto_iframe_container {\n background-color: ".concat(config.backgroundColor ? "#".concat(config.backgroundColor) : 'rgb(55 55 55 / 1)', ";\n }\n }\n \n .AhoraCrypto_loading__container {\n z-index: 1;\n }\n \n /* Skeleton loading animation styles */\n .ahoracrypto-fixed {\n position: fixed;\n }\n \n .ahoracrypto-z-50 {\n z-index: 50;\n }\n\n .ahoracrypto-z-1 {\n z-index: 1;\n }\n \n .ahoracrypto-top-0 {\n top: 0;\n }\n \n .ahoracrypto-left-0 {\n left: 0;\n }\n \n .ahoracrypto-right-0 {\n right: 0;\n }\n \n .ahoracrypto-bottom-0 {\n bottom: 0;\n }\n \n .ahoracrypto-flex {\n display: flex;\n }\n \n .ahoracrypto-flex-1 {\n flex: 1 1 0%;\n }\n \n .ahoracrypto-flex-col {\n flex-direction: column;\n }\n \n .ahoracrypto-items-center {\n align-items: center;\n }\n \n .ahoracrypto-items-stretch {\n align-items: stretch;\n }\n \n .ahoracrypto-justify-center {\n justify-content: center;\n }\n \n .ahoracrypto-justify-between {\n justify-content: space-between;\n }\n \n .ahoracrypto-bg-gray-100 {\n background-color: #f3f4f6;\n }\n \n .ahoracrypto-bg-black {\n background-color: #000000;\n }\n \n .ahoracrypto-bg-opacity-50 {\n background-color: rgba(0, 0, 0, 0.5);\n }\n \n .ahoracrypto-max-w-26rem {\n max-width: 26rem;\n }\n \n .ahoracrypto-w-full {\n width: 100%;\n }\n \n .ahoracrypto-h-510px {\n height: 510px;\n }\n \n .ahoracrypto-mx-auto {\n margin-left: auto;\n margin-right: auto;\n }\n \n .ahoracrypto-bg-white {\n background-color: white;\n }\n \n .ahoracrypto-bg-brand-darkGray {\n background-color: rgb(55 55 55 / 1);\n }\n \n .ahoracrypto-bg-brand-darkGray2 {\n background-color: rgb(55 55 55 / 1);\n }\n \n .ahoracrypto-rounded-3xl {\n border-radius: 1.5rem;\n }\n \n .ahoracrypto-rounded-lg {\n border-radius: 0.5rem;\n }\n \n .ahoracrypto-rounded-full {\n border-radius: 9999px;\n }\n \n .ahoracrypto-rounded {\n border-radius: 0.25rem;\n }\n \n .ahoracrypto-shadow-lg {\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n }\n \n .ahoracrypto-p-4 {\n padding: 1rem;\n }\n \n .ahoracrypto-pt-6 {\n padding-top: 1.5rem;\n }\n \n .ahoracrypto-px-6 {\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n }\n\n .ahoracrypto-p-6 {\n padding: 1.5rem;\n }\n\n\n .ahoracrypto-relative {\n position: relative;\n }\n \n .ahoracrypto-absolute {\n position: absolute;\n }\n \n .ahoracrypto-inset-0 {\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n \n .ahoracrypto-overflow-hidden {\n overflow: hidden;\n }\n \n .ahoracrypto-animate-pulse {\n animation: ahoracryptoPulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n }\n \n @keyframes ahoracryptoPulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: .5;\n }\n }\n \n .ahoracrypto-w-10 {\n width: 2.5rem;\n }\n \n .ahoracrypto-h-10 {\n height: 2.5rem;\n }\n \n .ahoracrypto-w-8 {\n width: 2rem;\n }\n \n .ahoracrypto-h-8 {\n height: 2rem;\n }\n \n .ahoracrypto-bg-gray-300 {\n background-color: #d1d5db;\n }\n \n .ahoracrypto-mb-4 {\n margin-bottom: 1rem;\n }\n \n .ahoracrypto-mb-3 {\n margin-bottom: 0.75rem;\n }\n \n .ahoracrypto-h-24 {\n height: 6rem;\n }\n \n .ahoracrypto-h-14 {\n height: 3.5rem;\n }\n \n .ahoracrypto-h-5 {\n height: 1.25rem;\n }\n \n .ahoracrypto-h-4 {\n height: 1rem;\n }\n \n .ahoracrypto-w-1/4 {\n width: 25%;\n }\n \n .ahoracrypto-w-1/3 {\n width: 33.333333%;\n }\n \n .ahoracrypto-ml-4 {\n margin-left: 1rem;\n }\n \n .ahoracrypto-mt-3 {\n margin-top: 0.75rem;\n }\n \n .ahoracrypto-mt-2 {\n margin-top: 0.5rem;\n }\n \n .ahoracrypto-text-center {\n text-align: center;\n }\n \n .ahoracrypto-py-4 {\n padding-top: 1rem;\n padding-bottom: 1rem;\n }\n \n .ahoracrypto-py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n }\n\n .ahoracrypto-mb-2 {\n margin-bottom: 0.5rem;\n }\n\n .ahoracrypto-mb-4 {\n margin-bottom: 1rem;\n }\n\n .ahoracrypto-mb-6 {\n margin-bottom: 1.5rem;\n }\n\n .ahoracrypto-w-1/3 {\n width: 33.333333%;\n }\n\n /* A\u00F1adimos clases adicionales usadas en el skeleton loader */\n .ahoracrypto-justify-between {\n justify-content: space-between;\n }\n \n /* Media queries para responsive */\n @media (min-width: 640px) {\n .sm\\:ahoracrypto-h-510px {\n height: 510px;\n }\n \n .sm\\:ahoracrypto-rounded-3xl {\n border-radius: 1.5rem;\n }\n \n .sm\\:ahoracrypto-shadow-lg {\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n }\n }\n \n /* Aseguramos que todas las clases para las animaciones est\u00E9n definidas */\n .ahoracrypto-max-h-600px {\n max-height: 600px;\n }\n \n .ahoracrypto-h-full {\n height: 100%;\n }\n \n .ahoracrypto-w-full {\n width: 100%;\n }\n\n ");
document.head.appendChild(styleElement);
// Add shadow class conditionally
var baseClass = 'AhoraCrypto_iframe__f0bRD AhoraCrypto_iframe_container';
iframe.className = config.borderWithShadow !== false
? "".concat(baseClass, " AhoraCrypto_iframe_with_shadow")
: baseClass;
iframe.id = 'ahoracrypto-widget';
iframe.title = 'AhoraCrypto Widget';
// Ensure minimum dimensions of 416x510 regardless of user input
var defaultWidth = 416;
var defaultHeight = 510;
var width = config.iframeWidth != null ? config.iframeWidth : defaultWidth;
var height = config.iframeHeight != null ? config.iframeHeight : defaultHeight;
// Use a default border radius of 24px if not specified
var borderRadius = config.borderRadius != null ? config.borderRadius : 24;
// Set dimensions with inline styles to ensure they take precedence over CSS classes
iframe.style.width = '100%';
iframe.style.height = height + 'px';
iframe.style.backgroundColor = 'transparent';
iframe.style.border = 'none';
// Still set width/height attributes for compatibility
iframe.width = width.toString();
iframe.height = height.toString();
// Apply border radius (default or configured)
iframe.style.borderRadius = "".concat(borderRadius, "px");
iframe.frameBorder = '0';
iframe.src = baseUrl + '?' + params.toString();
iframe.allow = 'camera; microphone; clipboard-read; clipboard-write; payment';
iframe.setAttribute('allowpaymentrequest', 'true');
iframe.style.display = 'none'; // Initially hide iframe until it's ready
// Function to update styling based on theme
var updateThemeStyling = function (newTheme) {
var isDarkTheme = newTheme === 'dark';
// Update iframe background color if not using a custom background color
if (!config.backgroundColor) {
var bgColor = isDarkTheme ? 'rgb(55 55 55 / 1)' : 'white';
// Update main container background
if (iframe.parentElement) {
iframe.parentElement.style.backgroundColor = bgColor;
}
}
// Ensure the border radius is maintained after theme change
iframe.style.borderRadius = "".concat(borderRadius, "px");
// If loading container is still present, update its style too
var loadingEl = document.getElementById('loading-section');
if (loadingEl) {
loadingEl.style.backgroundColor = isDarkTheme ? 'rgba(40, 40, 40, 0.8)' : 'rgba(243, 244, 246, 0.8)';
// Find the skeleton section inside loading container and update its style
var skeletonEl = loadingEl.querySelector('section');
if (skeletonEl) {
skeletonEl.style.backgroundColor = isDarkTheme ? 'rgb(55 55 55 / 1)' : 'white';
// Ensure the skeleton section also maintains its border radius
skeletonEl.classList.add('ahoracrypto-rounded-3xl');
}
}
};
// Reutilizamos el valor del tema que ya obtuvimos anteriormente
var isDarkTheme = theme === 'dark';
console.log('Using dark theme for skeleton:', isDarkTheme);
// Add iframe to container first to establish positioning context
container.appendChild(iframe);
// Create a wrapper div to contener both the iframe and the loading animation
// This ensures they ocuppy the same space
var widgetWrapper = document.createElement('div');
widgetWrapper.className = 'ahoracrypto-relative';
widgetWrapper.style.width = '100%';
widgetWrapper.style.maxWidth = width + 'px';
widgetWrapper.style.height = height + 'px';
widgetWrapper.style.backgroundColor = isDarkTheme ? 'rgb(55 55 55 / 1)' : 'white';
widgetWrapper.style.borderRadius = "".concat(borderRadius, "px");
// Remove iframe from container and add it to the wrapper
container.removeChild(iframe);
widgetWrapper.appendChild(iframe);
// Apply initial theme styling
updateThemeStyling(theme);
// Create loading skeleton container
var loadingContainer = document.createElement('div');
loadingContainer.id = 'loading-section';
// Apply styles to make the loading container position absolutely within the wrapper
loadingContainer.className = 'ahoracrypto-absolute ahoracrypto-z-1 ahoracrypto-inset-0 ahoracrypto-flex ahoracrypto-items-center ahoracrypto-justify-center';
// Make sure the loading container is visible initially
loadingContainer.style.display = 'block';
loadingContainer.style.borderRadius = "".concat(borderRadius, "px");
// Apply a semi-transparent background based on theme - use explicit colors
loadingContainer.style.backgroundColor = isDarkTheme ? 'rgba(40, 40, 40, 0.8)' : 'rgba(243, 244, 246, 0.8)';
// Get dimensions for the skeleton section to match the iframe
var skeletonSection = document.createElement('section');
// Make sure the loading section matches the iframe dimensions
loadingContainer.style.width = '100%';
loadingContainer.style.maxWidth = width + 'px';
loadingContainer.style.height = height + 'px';
// Set fixed dimensions for the skeleton section to match the iframe
skeletonSection.style.maxWidth = width + 'px';
skeletonSection.style.height = height + 'px';
// Fix specific height for the skeleton section (removes h-full since that can cause issues)
var shadowClass = config.borderWithShadow !== false ? 'ahoracrypto-shadow-lg' : '';
// Set the className for skeletonSection
skeletonSection.className = "ahoracrypto-mx-auto ahoracrypto-rounded-3xl ".concat(shadowClass, " ahoracrypto-p-4 ahoracrypto-pt-6 ahoracrypto-relative ahoracrypto-overflow-hidden");
// Apply background color directly with style to ensure it's applied correctly
skeletonSection.style.backgroundColor = isDarkTheme ? 'rgb(55 55 55 / 1)' : 'white';
// If custom borderRadius is defined, apply it
if (borderRadius !== 24) { // Default is 24px
skeletonSection.style.borderRadius = "".concat(borderRadius, "px");
loadingContainer.style.borderRadius = "".concat(borderRadius, "px");
}
// Create the inner container with the skeleton UI - make it fill the entire height
var innerContainer = document.createElement('div');
innerContainer.className = "ahoracrypto-absolute ahoracrypto-inset-0 ahoracrypto-z-1 ahoracrypto-flex ahoracrypto-items-stretch ahoracrypto-justify-center";
// Apply background color directly with style
innerContainer.style.backgroundColor = isDarkTheme ? 'rgb(55 55 55 / 1)' : 'white';
// Create the skeleton pulse animation content - make it full height with flex column
var skeletonContent = document.createElement('div');
skeletonContent.className = 'ahoracrypto-animate-pulse ahoracrypto-w-full ahoracrypto-p-6 ahoracrypto-flex ahoracrypto-flex-col ahoracrypto-justify-between';
skeletonContent.style.height = '100%';
// Define color for skeleton elements based on theme
var skeletonElementColor = isDarkTheme ? 'rgb(89 89 89 / 1)' : '#d1d5db'; // Usar el color menos oscuro para elementos
skeletonContent.innerHTML = "\n
\n\n \n \n
\n\n
\n\n
\n\n \n
\n\n \n
\n
\n\n \n \n ");
// Assemble the loading skeleton
innerContainer.appendChild(skeletonContent);
skeletonSection.appendChild(innerContainer);
loadingContainer.appendChild(skeletonSection);
// Add the loading container to the wrapper
widgetWrapper.appendChild(loadingContainer);
// Add the wrapper to the container
container.appendChild(widgetWrapper);
// Ready state tracking
var isWidgetReady = false;
var readyCallbacks = [];
var pendingMessages = [];
var readyResolver = null;
var readyPromise = new Promise(function (resolve) {
readyResolver = resolve;
});
// Function to send a message to the iframe
var sendMessageToIframe = function (message) {
if (isWidgetReady && iframe.contentWindow) {
iframe.contentWindow.postMessage(message, '*');
}
else {
pendingMessages.push(message);
}
};
// Function to handle widget ready state
var handleWidgetReady = function () {
if (isWidgetReady)
return;
isWidgetReady = true;
setTimeout(function () {
// Show iframe and hide loading animation
loadingContainer.style.display = 'none';
iframe.style.display = 'block';
// Ensure iframe maintains its configured dimensions
//if (config.iframeWidth) {
iframe.style.width = '100%';
//}
if (config.iframeHeight) {
iframe.style.height = height + 'px';
}
// Ensure border radius is maintained
iframe.style.borderRadius = "".concat(borderRadius, "px");
// Also apply current theme styling to make sure all styles are in sync
updateThemeStyling(theme);
// Send any pending messages
pendingMessages.forEach(function (message) {
if (iframe.contentWindow) {
iframe.contentWindow.postMessage(message, '*');
}
});
pendingMessages = [];
// Execute ready callbacks
readyCallbacks.forEach(function (callback) { return callback(); });
readyCallbacks = [];
// Resolve the ready promise
if (readyResolver)
readyResolver();
}, 1000);
};
// Set up message listener for ready event from iframe
window.addEventListener('message', function (event) {
// Check if message is from our iframe
if (event.source === iframe.contentWindow && event.data) {
// Handle widget ready message
if (event.data.type === 'WIDGET_READY') {
handleWidgetReady();
}
// Handle theme changed message
else if (event.data.type === 'THEME_CHANGED' && event.data.theme) {
var newTheme = event.data.theme;
console.log('Theme changed from iframe:', newTheme);
// Store the theme in localStorage with a prefix to avoid collisions
try {
localStorage.setItem('ahoracrypto-theme', newTheme);
}
catch (e) {
console.warn('Could not save theme to localStorage:', e);
}
// Update our internal theme state
theme = newTheme;
// Update the styling to match the new theme
// This will also ensure border radius and other styles are preserved
updateThemeStyling(newTheme);
}
}
});
// Also listen for load event (as a fallback)
iframe.addEventListener('load', function () {
// Give the iframe content a moment to initialize after load
setTimeout(function () {
if (!isWidgetReady) {
console.warn('Widget iframe loaded but did not send WIDGET_READY message. Assuming it is ready.');
handleWidgetReady();
}
}, 1000); // Wait 1 second after load before assuming ready
});
// Create and return the widget controller
return {
iframe: iframe,
setWalletAddress: function (walletAddress) {
sendMessageToIframe({
type: 'SET_WALLET_ADDRESS',
walletAddress: walletAddress
});
},
setPaymentIntentId: function (paymentIntentId) {
sendMessageToIframe({
type: 'SET_PAYMENT_INTENT_ID',
paymentIntentId: paymentIntentId
});
},
sendSignedMessage: function (signature, address, messageHash) {
sendMessageToIframe({
type: 'SIGNED_MESSAGE',
signature: signature,
address: address,
messageHash: messageHash
});
},
requestMessageToSign: function () {
sendMessageToIframe({
type: 'REQUEST_MESSAGE_TO_SIGN'
});
},
connectWeb3Wallet: function (provider, accountAddress, chainId) {
// Provider objects cannot be sent via postMessage, so we extract the relevant information
sendMessageToIframe({
type: 'CONNECT_WEB3_WALLET',
accountAddress: accountAddress,
chainId: chainId
});
// Set up event listeners for wallet changes if provider has ethereum methods
if (provider && provider.on) {
// Listen for account changes
provider.on('accountsChanged', function (accounts) {
if (accounts && accounts.length > 0) {
sendMessageToIframe({
type: 'WALLET_ACCOUNT_CHANGED',
accountAddress: accounts[0]
});
}
});
// Listen for chain changes
provider.on('chainChanged', function (chainId) {
sendMessageToIframe({
type: 'WALLET_CHAIN_CHANGED',
chainId: typeof chainId === 'string' ? parseInt(chainId, 16) : chainId
});
});
// Listen for disconnect
provider.on('disconnect', function () {
sendMessageToIframe({
type: 'WALLET_DISCONNECTED'
});
});
}
},
onReady: function (callback) {
if (isWidgetReady) {
// If already ready, execute immediately
callback();
}
else {
// Otherwise add to callback queue
readyCallbacks.push(callback);
}
},
ready: function () {
return readyPromise;
},
isReady: function () {
return isWidgetReady;
},
setTheme: function (newTheme) {
// Update our internal state
theme = newTheme;
// Store in localStorage with prefix to avoid collisions
try {
localStorage.setItem('ahoracrypto-theme', newTheme);
}
catch (e) {
console.warn('Could not save theme to localStorage:', e);
}
// Update styling of the parent container
updateThemeStyling(newTheme);
// Also inform the iframe about the theme change
sendMessageToIframe({
type: 'SET_THEME',
theme: newTheme
});
}
};
}
exports.renderWebwidget = renderWebwidget;
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk.
(() => {
var exports = __webpack_exports__;
/*!**********************!*\
!*** ./src/index.ts ***!
\**********************/
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.renderWebwidget = void 0;
var webwidget_1 = __webpack_require__(/*! ./webwidget/webwidget */ "./src/webwidget/webwidget.ts");
Object.defineProperty(exports, "renderWebwidget", ({ enumerable: true, get: function () { return webwidget_1.renderWebwidget; } }));
})();
/******/ return __webpack_exports__;
/******/ })()
;
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsaUJBQWlCO0FBQ2pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCOzs7Ozs7O1VDN2F2QjtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOzs7Ozs7Ozs7O0FDdEJhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHVCQUF1QjtBQUN2QixrQkFBa0IsbUJBQU8sQ0FBQywyREFBdUI7QUFDakQsbURBQWtELEVBQUUscUNBQXFDLHVDQUF1QyxFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQWhvcmFDcnlwdG8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL0Fob3JhQ3J5cHRvLy4vc3JjL3dlYndpZGdldC93ZWJ3aWRnZXQudHMiLCJ3ZWJwYWNrOi8vQWhvcmFDcnlwdG8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vQWhvcmFDcnlwdG8vLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiQWhvcmFDcnlwdG9cIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiQWhvcmFDcnlwdG9cIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCAoKSA9PiB7XG5yZXR1cm4gIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlbmRlcldlYndpZGdldCA9IHZvaWQgMDtcbi8qKlxuICogUmVuZGVycyB0aGUgQWhvcmFDcnlwdG8gd2ViIHdpZGdldCBpbiB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciBlbGVtZW50XG4gKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgd2lkZ2V0XG4gKiBAcGFyYW0gY29uZmlnLnJlZmVycmFsIE9wdGlvbmFsIHJlZmVycmFsIGlkZW50aWZpZXIgdXNlZCBmb3IgdHJhY2tpbmcgdHJhZmZpYyBzb3VyY2VzLlxuICogICAgICAgICAgICAgICAgICAgICAgSWYgbm90IHByb3ZpZGVkLCB0aGUgZG9tYWluIG9mIHRoZSBjb250YWluZXIgd2lsbCBiZSB1c2VkIGF1dG9tYXRpY2FsbHkuXG4gKiAgICAgICAgICAgICAgICAgICAgICBUaGUgc3lzdGVtIGV4dHJhY3RzIHRoZSBiYXNlIGRvbWFpbiAoZS5nLiwgXCJleGFtcGxlLmNvbVwiIGZyb20gXCJzdWIuZXhhbXBsZS5jb21cIilcbiAqIEByZXR1cm5zIFdlYndpZGdldENvbnRyb2xsZXIgdGhhdCBhbGxvd3MgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaWZyYW1lXG4gKi9cbmZ1bmN0aW9uIHJlbmRlcldlYndpZGdldChjb25maWcpIHtcbiAgICAvLyBFeHRyYWN0IGNvbnRhaW5lciBlbGVtZW50XG4gICAgdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbmZpZy5jb250YWluZXJJZCk7XG4gICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkNvbnRhaW5lciB3aXRoIElEICdcIi5jb25jYXQoY29uZmlnLmNvbnRhaW5lcklkLCBcIicgbm90IGZvdW5kLlwiKSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRhaW5lciB3aXRoIElEICdcIi5jb25jYXQoY29uZmlnLmNvbnRhaW5lcklkLCBcIicgbm90IGZvdW5kLlwiKSk7XG4gICAgfVxuICAgIC8vIEdlbmVyYXRlIGlmcmFtZSBVUkwgd2l0aCBwYXJhbWV0ZXJzXG4gICAgdmFyIGJhc2VVcmwgPSBcImh0dHBzOi8vYWhvcmFjcnlwdG8uY29tL1wiO1xuICAgIC8vIE9ubHkgYWRkIGxhbmd1YWdlIHRvIFVSTCBpZiBpdCdzIHNwZWNpZmllZFxuICAgIGlmIChjb25maWcubGFuZ3VhZ2UpIHtcbiAgICAgICAgYmFzZVVybCArPSBjb25maWcubGFuZ3VhZ2UgKyBcIi9cIjtcbiAgICB9XG4gICAgYmFzZVVybCArPSBcIndlYndpZGdldC9cIjtcbiAgICAvLyBDcmVhdGUgVVJMIHBhcmFtcyBvYmplY3RcbiAgICB2YXIgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIC8vIEFkZCBwYXJhbWV0ZXJzIGlmIHRoZXkgZXhpc3QgKG1hcHBpbmcgZnJvbSBjb25maWcgcGFyYW0gdG8gaWZyYW1lIHBhcmFtKVxuICAgIGlmIChjb25maWcuY3J5cHRvQ3VycmVuY3kpXG4gICAgICAgIHBhcmFtcy5hcHBlbmQoJ2NyeXB0bycsIGNvbmZpZy5jcnlwdG9DdXJyZW5jeSk7XG4gICAgaWYgKGNvbmZpZy5maWF0Q3VycmVuY3kpXG4gICAgICAgIHBhcmFtcy5hcHBlbmQoJ2ZpYXQnLCBjb25maWcuZmlhdEN1cnJlbmN5KTtcbiAgICBpZiAoY29uZmlnLmxvZ29VcmwgJiYgY29uZmlnLmxvZ29VcmwudHJpbSgpICE9PSAnJylcbiAgICAgICAgcGFyYW1zLmFwcGVuZCgnbHVybCcsIGNvbmZpZy5sb2dvVXJsKTtcbiAgICBpZiAoY29uZmlnLmJhY2tncm91bmRDb2xvcilcbiAgICAgICAgcGFyYW1zLmFwcGVuZCgnYmdjJywgY29uZmlnLmJhY2tncm91bmRDb2xvcik7XG4gICAgaWYgKGNvbmZpZy5idXR0b25Db2xvcilcbiAgICAgICAgcGFyYW1zLmFwcGVuZCgnYnRjJywgY29uZmlnLmJ1dHRvbkNvbG9yKTtcbiAgICBpZiAoY29uZmlnLmJvcmRlclJhZGl1cyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICBwYXJhbXMuYXBwZW5kKCdicicsIGNvbmZpZy5ib3JkZXJSYWRpdXMudG9TdHJpbmcoKSk7XG4gICAgaWYgKGNvbmZpZy5ib3JkZXJXaXRoU2hhZG93ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIHBhcmFtcy5hcHBlbmQoJ2J3cycsIGNvbmZpZy5ib3JkZXJXaXRoU2hhZG93ID8gJzEnIDogJzAnKTtcbiAgICBpZiAoY29uZmlnLnBheW1lbnRJbnRlbnRJZClcbiAgICAgICAgcGFyYW1zLmFwcGVuZCgncGknLCBjb25maWcucGF5bWVudEludGVudElkKTtcbiAgICBpZiAoY29uZmlnLmNyeXB0b3MgJiYgY29uZmlnLmNyeXB0b3MudHJpbSgpICE9PSAnJylcbiAgICAgICAgcGFyYW1zLmFwcGVuZCgnY3J5cHRvcycsIGNvbmZpZy5jcnlwdG9zKTtcbiAgICBpZiAoY29uZmlnLmRlZmF1bHROZXR3b3JrICYmIGNvbmZpZy5kZWZhdWx0TmV0d29yay50cmltKCkgIT09ICcnKVxuICAgICAgICBwYXJhbXMuYXBwZW5kKCdkZWZhdWx0TmV0d29yaycsIGNvbmZpZy5kZWZhdWx0TmV0d29yayk7XG4gICAgLy8gQWRkIHJlZmVycmFsIHBhcmFtZXRlciAoaWYgcHJvdmlkZWQpIG9yIHVzZSBjdXJyZW50IGRvbWFpblxuICAgIHZhciByZWZlcnJhbCA9IGNvbmZpZy5yZWZlcnJhbDtcbiAgICBpZiAoIXJlZmVycmFsKSB7XG4gICAgICAgIC8vIEV4dHJhY3QgZG9tYWluIGZyb20gY3VycmVudCBVUkwgKHdpdGhvdXQgc3ViZG9tYWlucywgcGF0aCwgcHJvdG9jb2wsIG9yIHBvcnQpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaG9zdG5hbWUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7XG4gICAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBkb21haW46IHNwbGl0IGJ5IGRvdHMgYW5kIHRha2UgdGhlIGxhc3QgdHdvIHBhcnRzXG4gICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgY2FzZXMgbGlrZSBzdWIuZG9tYWluLmNvbSAtPiBkb21haW4uY29tXG4gICAgICAgICAgICB2YXIgcGFydHMgPSBob3N0bmFtZS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIG5vcm1hbCBkb21haW5zIGxpa2UgZXhhbXBsZS5jb21cbiAgICAgICAgICAgICAgICB2YXIgZG9tYWluID0gcGFydHMuc2xpY2UoLTIpLmpvaW4oJy4nKTtcbiAgICAgICAgICAgICAgICByZWZlcnJhbCA9IGRvbWFpbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEZvciBsb2NhbGhvc3Qgb3IgSVAgYWRkcmVzc2VzXG4gICAgICAgICAgICAgICAgcmVmZXJyYWwgPSBob3N0bmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoJ3JlZmVycmFsJywgcmVmZXJyYWwpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBleHRyYWN0IGRvbWFpbiBmb3IgcmVmZXJyYWw6JywgZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQWx3YXlzIHBhc3MgdGhlIGN1cnJlbnQgdGhlbWUgdG8gdGhlIGlmcmFtZVxuICAgIHZhciB0aGVtZSA9ICdsaWdodCc7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gQ2hlY2sgZmlyc3QgZm9yIGEgdGhlbWUgcGFzc2VkIGluIHRoZSBjb25maWd1cmF0aW9uXG4gICAgICAgIGlmIChjb25maWcudGhlbWUpIHtcbiAgICAgICAgICAgIHRoZW1lID0gY29uZmlnLnRoZW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBub3QgaW4gY29uZmlnLCB0cnkgb3VyIHByZWZpeGVkIGxvY2FsU3RvcmFnZSBrZXkgZmlyc3RcbiAgICAgICAgICAgIHZhciBhaG9yYUNyeXB0b1RoZW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Fob3JhY3J5cHRvLXRoZW1lJyk7XG4gICAgICAgICAgICBpZiAoYWhvcmFDcnlwdG9UaGVtZSAmJiAoYWhvcmFDcnlwdG9UaGVtZSA9PT0gJ2RhcmsnIHx8IGFob3JhQ3J5cHRvVGhlbWUgPT09ICdsaWdodCcpKSB7XG4gICAgICAgICAgICAgICAgdGhlbWUgPSBhaG9yYUNyeXB0b1RoZW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGdlbmVyaWMgJ3RoZW1lJyBrZXkgaW4gbG9jYWxTdG9yYWdlXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgc2F2ZWRUaGVtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0aGVtZScpO1xuICAgICAgICAgICAgICAgIGlmIChzYXZlZFRoZW1lICYmIChzYXZlZFRoZW1lID09PSAnZGFyaycgfHwgc2F2ZWRUaGVtZSA9PT0gJ2xpZ2h0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhlbWUgPSBzYXZlZFRoZW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh3aW5kb3cubWF0Y2hNZWRpYSAmJiB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm90IGluIGxvY2FsU3RvcmFnZSwgY2hlY2sgc3lzdGVtIHByZWZlcmVuY2VcbiAgICAgICAgICAgICAgICAgICAgdGhlbWUgPSAnZGFyayc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEFkZCBhIGNvbnNvbGUgbG9nIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgY29uc29sZS5sb2coJ0RldGVjdGVkIHRoZW1lOicsIHRoZW1lKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSW4gY2FzZSBsb2NhbFN0b3JhZ2UgaXMgbm90IGFjY2Vzc2libGVcbiAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgYWNjZXNzIGxvY2FsU3RvcmFnZSBmb3IgdGhlbWU6JywgZSk7XG4gICAgICAgIC8vIERlZmF1bHQgdG8gbGlnaHQgdGhlbWUgb24gZXJyb3JcbiAgICAgICAgdGhlbWUgPSAnbGlnaHQnO1xuICAgIH1cbiAgICAvLyBBbHdheXMgcGFzcyB0aGUgY3VycmVudCB0aGVtZSB0byB0aGUgaWZyYW1lXG4gICAgcGFyYW1zLmFwcGVuZCgndGhlbWUnLCB0aGVtZSk7XG4gICAgLy8gQ3JlYXRlIGlmcmFtZSBlbGVtZW50XG4gICAgdmFyIGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgIC8vIERlZmF1bHQgYmFja2dyb3VuZCBjb2xvcnMgYmFzZWQgb24gdGhlbWVcbiAgICB2YXIgZGVmYXVsdEJnQ29sb3IgPSB0aGVtZSA9PT0gJ2RhcmsnID9cbiAgICAgICAgJ3JnYig1NSA1NSA1NSAvIDEpJyA6ICd3aGl0ZSc7XG4gICAgdmFyIGRlZmF1bHRCZ0NvbG9yMiA9IHRoZW1lID09PSAnZGFyaycgP1xuICAgICAgICAncmdiKDU1IDU1IDU1IC8gMSknIDogJ3doaXRlJztcbiAgICAvLyBBZGQgY3VzdG9tIHN0eWxlcyB0byBoZWFkXG4gICAgdmFyIHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGVFbGVtZW50LnRleHRDb250ZW50ID0gXCJcXG4gICAgICAuQWhvcmFDcnlwdG9faWZyYW1lX2NvbnRhaW5lciB7XFxuICAgICAgICBtYXgtd2lkdGg6IDI2cmVtO1xcbiAgICAgICAgbWF4LWhlaWdodDogNjAwcHg7XFxuICAgICAgICB3aWR0aDogYXV0bztcXG4gICAgICAgIGhlaWdodDogYXV0bztcXG4gICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMjRweDtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLkFob3JhQ3J5cHRvX2lmcmFtZV93aXRoX3NoYWRvdyB7XFxuICAgICAgICBib3gtc2hhZG93OiAwIDEwcHggMTVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4xKSwgMCA0cHggNnB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xcbiAgICAgICAgLkFob3JhQ3J5cHRvX2lmcmFtZV9jb250YWluZXIge1xcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBcIi5jb25jYXQoY29uZmlnLmJhY2tncm91bmRDb2xvciA/IFwiI1wiLmNvbmNhdChjb25maWcuYmFja2dyb3VuZENvbG9yKSA6ICdyZ2IoNTUgNTUgNTUgLyAxKScsIFwiO1xcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuQWhvcmFDcnlwdG9fbG9hZGluZ19fY29udGFpbmVyIHtcXG4gICAgICAgIHotaW5kZXg6IDE7XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC8qIFNrZWxldG9uIGxvYWRpbmcgYW5pbWF0aW9uIHN0eWxlcyAqL1xcbiAgICAgIC5haG9yYWNyeXB0by1maXhlZCB7XFxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by16LTUwIHtcXG4gICAgICAgIHotaW5kZXg6IDUwO1xcbiAgICAgIH1cXG5cXG4gICAgICAuYWhvcmFjcnlwdG8tei0xIHtcXG4gICAgICAgIHotaW5kZXg6IDE7XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by10b3AtMCB7XFxuICAgICAgICB0b3A6IDA7XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by1sZWZ0LTAge1xcbiAgICAgICAgbGVmdDogMDtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLXJpZ2h0LTAge1xcbiAgICAgICAgcmlnaHQ6IDA7XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by1ib3R0b20tMCB7XFxuICAgICAgICBib3R0b206IDA7XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by1mbGV4IHtcXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by1mbGV4LTEge1xcbiAgICAgICAgZmxleDogMSAxIDAlO1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8tZmxleC1jb2wge1xcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLWl0ZW1zLWNlbnRlciB7XFxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8taXRlbXMtc3RyZXRjaCB7XFxuICAgICAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLWp1c3RpZnktY2VudGVyIHtcXG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8tanVzdGlmeS1iZXR3ZWVuIHtcXG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLWJnLWdyYXktMTAwIHtcXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2Y0ZjY7XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by1iZy1ibGFjayB7XFxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwO1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8tYmctb3BhY2l0eS01MCB7XFxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNSk7XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by1tYXgtdy0yNnJlbSB7XFxuICAgICAgICBtYXgtd2lkdGg6IDI2cmVtO1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8tdy1mdWxsIHtcXG4gICAgICAgIHdpZHRoOiAxMDAlO1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8taC01MTBweCB7XFxuICAgICAgICBoZWlnaHQ6IDUxMHB4O1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8tbXgtYXV0byB7XFxuICAgICAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLWJnLXdoaXRlIHtcXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8tYmctYnJhbmQtZGFya0dyYXkge1xcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDU1IDU1IDU1IC8gMSk7XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by1iZy1icmFuZC1kYXJrR3JheTIge1xcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDU1IDU1IDU1IC8gMSk7XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by1yb3VuZGVkLTN4bCB7XFxuICAgICAgICBib3JkZXItcmFkaXVzOiAxLjVyZW07XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by1yb3VuZGVkLWxnIHtcXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNXJlbTtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLXJvdW5kZWQtZnVsbCB7XFxuICAgICAgICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by1yb3VuZGVkIHtcXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAuMjVyZW07XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by1zaGFkb3ctbGcge1xcbiAgICAgICAgYm94LXNoYWRvdzogMCAxMHB4IDE1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMSksIDAgNHB4IDZweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by1wLTQge1xcbiAgICAgICAgcGFkZGluZzogMXJlbTtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLXB0LTYge1xcbiAgICAgICAgcGFkZGluZy10b3A6IDEuNXJlbTtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLXB4LTYge1xcbiAgICAgICAgcGFkZGluZy1sZWZ0OiAxLjVyZW07XFxuICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxLjVyZW07XFxuICAgICAgfVxcblxcbiAgICAgIC5haG9yYWNyeXB0by1wLTYge1xcbiAgICAgICAgcGFkZGluZzogMS41cmVtO1xcbiAgICAgIH1cXG5cXG5cXG4gICAgICAuYWhvcmFjcnlwdG8tcmVsYXRpdmUge1xcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8tYWJzb2x1dGUge1xcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8taW5zZXQtMCB7XFxuICAgICAgICB0b3A6IDA7XFxuICAgICAgICByaWdodDogMDtcXG4gICAgICAgIGJvdHRvbTogMDtcXG4gICAgICAgIGxlZnQ6IDA7XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by1vdmVyZmxvdy1oaWRkZW4ge1xcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLWFuaW1hdGUtcHVsc2Uge1xcbiAgICAgICAgYW5pbWF0aW9uOiBhaG9yYWNyeXB0b1B1bHNlIDJzIGN1YmljLWJlemllcigwLjQsIDAsIDAuNiwgMSkgaW5maW5pdGU7XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIEBrZXlmcmFtZXMgYWhvcmFjcnlwdG9QdWxzZSB7XFxuICAgICAgICAwJSwgMTAwJSB7XFxuICAgICAgICAgIG9wYWNpdHk6IDE7XFxuICAgICAgICB9XFxuICAgICAgICA1MCUge1xcbiAgICAgICAgICBvcGFjaXR5OiAuNTtcXG4gICAgICAgIH1cXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLXctMTAge1xcbiAgICAgICAgd2lkdGg6IDIuNXJlbTtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLWgtMTAge1xcbiAgICAgICAgaGVpZ2h0OiAyLjVyZW07XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by13LTgge1xcbiAgICAgICAgd2lkdGg6IDJyZW07XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by1oLTgge1xcbiAgICAgICAgaGVpZ2h0OiAycmVtO1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8tYmctZ3JheS0zMDAge1xcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2QxZDVkYjtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLW1iLTQge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMXJlbTtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLW1iLTMge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLWgtMjQge1xcbiAgICAgICAgaGVpZ2h0OiA2cmVtO1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8taC0xNCB7XFxuICAgICAgICBoZWlnaHQ6IDMuNXJlbTtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLWgtNSB7XFxuICAgICAgICBoZWlnaHQ6IDEuMjVyZW07XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC5haG9yYWNyeXB0by1oLTQge1xcbiAgICAgICAgaGVpZ2h0OiAxcmVtO1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8tdy0xLzQge1xcbiAgICAgICAgd2lkdGg6IDI1JTtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLXctMS8zIHtcXG4gICAgICAgIHdpZHRoOiAzMy4zMzMzMzMlO1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8tbWwtNCB7XFxuICAgICAgICBtYXJnaW4tbGVmdDogMXJlbTtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLW10LTMge1xcbiAgICAgICAgbWFyZ2luLXRvcDogMC43NXJlbTtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLW10LTIge1xcbiAgICAgICAgbWFyZ2luLXRvcDogMC41cmVtO1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8tdGV4dC1jZW50ZXIge1xcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8tcHktNCB7XFxuICAgICAgICBwYWRkaW5nLXRvcDogMXJlbTtcXG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAxcmVtO1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8tcHktMiB7XFxuICAgICAgICBwYWRkaW5nLXRvcDogMC41cmVtO1xcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcXG4gICAgICB9XFxuXFxuICAgICAgLmFob3JhY3J5cHRvLW1iLTIge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xcbiAgICAgIH1cXG5cXG4gICAgICAuYWhvcmFjcnlwdG8tbWItNCB7XFxuICAgICAgICBtYXJnaW4tYm90dG9tOiAxcmVtO1xcbiAgICAgIH1cXG5cXG4gICAgICAuYWhvcmFjcnlwdG8tbWItNiB7XFxuICAgICAgICBtYXJnaW4tYm90dG9tOiAxLjVyZW07XFxuICAgICAgfVxcblxcbiAgICAgIC5haG9yYWNyeXB0by13LTEvMyB7XFxuICAgICAgICB3aWR0aDogMzMuMzMzMzMzJTtcXG4gICAgICB9XFxuXFxuICAgICAgLyogQVxcdTAwRjFhZGltb3MgY2xhc2VzIGFkaWNpb25hbGVzIHVzYWRhcyBlbiBlbCBza2VsZXRvbiBsb2FkZXIgKi9cXG4gICAgICAuYWhvcmFjcnlwdG8tanVzdGlmeS1iZXR3ZWVuIHtcXG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLyogTWVkaWEgcXVlcmllcyBwYXJhIHJlc3BvbnNpdmUgKi9cXG4gICAgICBAbWVkaWEgKG1pbi13aWR0aDogNjQwcHgpIHtcXG4gICAgICAgIC5zbVxcXFw6YWhvcmFjcnlwdG8taC01MTBweCB7XFxuICAgICAgICAgIGhlaWdodDogNTEwcHg7XFxuICAgICAgICB9XFxuICAgICAgICBcXG4gICAgICAgIC5zbVxcXFw6YWhvcmFjcnlwdG8tcm91bmRlZC0zeGwge1xcbiAgICAgICAgICBib3JkZXItcmFkaXVzOiAxLjVyZW07XFxuICAgICAgICB9XFxuICAgICAgICBcXG4gICAgICAgIC5zbVxcXFw6YWhvcmFjcnlwdG8tc2hhZG93LWxnIHtcXG4gICAgICAgICAgYm94LXNoYWRvdzogMCAxMHB4IDE1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMSksIDAgNHB4IDZweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XFxuICAgICAgICB9XFxuICAgICAgfVxcbiAgICAgIFxcbiAgICAgIC8qIEFzZWd1cmFtb3MgcXVlIHRvZGFzIGxhcyBjbGFzZXMgcGFyYSBsYXMgYW5pbWFjaW9uZXMgZXN0XFx1MDBFOW4gZGVmaW5pZGFzICovXFxuICAgICAgLmFob3JhY3J5cHRvLW1heC1oLTYwMHB4IHtcXG4gICAgICAgIG1heC1oZWlnaHQ6IDYwMHB4O1xcbiAgICAgIH1cXG4gICAgICBcXG4gICAgICAuYWhvcmFjcnlwdG8taC1mdWxsIHtcXG4gICAgICAgIGhlaWdodDogMTAwJTtcXG4gICAgICB9XFxuICAgICAgXFxuICAgICAgLmFob3JhY3J5cHRvLXctZnVsbCB7XFxuICAgICAgICB3aWR0aDogMTAwJTtcXG4gICAgICB9XFxuXFxuICAgIFwiKTtcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7XG4gICAgLy8gQWRkIHNoYWRvdyBjbGFzcyBjb25kaXRpb25hbGx5XG4gICAgdmFyIGJhc2VDbGFzcyA9ICdBaG9yYUNyeXB0b19pZnJhbWVfX2YwYlJEIEFob3JhQ3J5cHRvX2lmcmFtZV9jb250YWluZXInO1xuICAgIGlmcmFtZS5jbGFzc05hbWUgPSBjb25maWcuYm9yZGVyV2l0aFNoYWRvdyAhPT0gZmFsc2VcbiAgICAgICAgPyBcIlwiLmNvbmNhdChiYXNlQ2xhc3MsIFwiIEFob3JhQ3J5cHRvX2lmcmFtZV93aXRoX3NoYWRvd1wiKVxuICAgICAgICA6IGJhc2VDbGFzcztcbiAgICBpZnJhbWUuaWQgPSAnYWhvcmFjcnlwdG8td2lkZ2V0JztcbiAgICBpZnJhbWUudGl0bGUgPSAnQWhvcmFDcnlwdG8gV2lkZ2V0JztcbiAgICAvLyBFbnN1cmUgbWluaW11bSBkaW1lbnNpb25zIG9mIDQxNng1MTAgcmVnYXJkbGVzcyBvZiB1c2VyIGlucHV0XG4gICAgdmFyIGRlZmF1bHRXaWR0aCA9IDQxNjtcbiAgICB2YXIgZGVmYXVsdEhlaWdodCA9IDUxMDtcbiAgICB2YXIgd2lkdGggPSBjb25maWcuaWZyYW1lV2lkdGggIT0gbnVsbCA/IGNvbmZpZy5pZnJhbWVXaWR0aCA6IGRlZmF1bHRXaWR0aDtcbiAgICB2YXIgaGVpZ2h0ID0gY29uZmlnLmlmcmFtZUhlaWdodCAhPSBudWxsID8gY29uZmlnLmlmcmFtZUhlaWdodCA6IGRlZmF1bHRIZWlnaHQ7XG4gICAgLy8gVXNlIGEgZGVmYXVsdCBib3JkZXIgcmFkaXVzIG9mIDI0cHggaWYgbm90IHNwZWNpZmllZFxuICAgIHZhciBib3JkZXJSYWRpdXMgPSBjb25maWcuYm9yZGVyUmFkaXVzICE9IG51bGwgPyBjb25maWcuYm9yZGVyUmFkaXVzIDogMjQ7XG4gICAgLy8gU2V0IGRpbWVuc2lvbnMgd2l0aCBpbmxpbmUgc3R5bGVzIHRvIGVuc3VyZSB0aGV5IHRha2UgcHJlY2VkZW5jZSBvdmVyIENTUyBjbGFzc2VzXG4gICAgaWZyYW1lLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICAgIGlmcmFtZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAndHJhbnNwYXJlbnQnO1xuICAgIGlmcmFtZS5zdHlsZS5ib3JkZXIgPSAnbm9uZSc7XG4gICAgLy8gU3RpbGwgc2V0IHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzIGZvciBjb21wYXRpYmlsaXR5XG4gICAgaWZyYW1lLndpZHRoID0gd2lkdGgudG9TdHJpbmcoKTtcbiAgICBpZnJhbWUuaGVpZ2h0ID0gaGVpZ2h0LnRvU3RyaW5nKCk7XG4gICAgLy8gQXBwbHkgYm9yZGVyIHJhZGl1cyAoZGVmYXVsdCBvciBjb25maWd1cmVkKVxuICAgIGlmcmFtZS5zdHlsZS5ib3JkZXJSYWRpdXMgPSBcIlwiLmNvbmNhdChib3JkZXJSYWRpdXMsIFwicHhcIik7XG4gICAgaWZyYW1lLmZyYW1lQm9yZGVyID0gJzAnO1xuICAgIGlmcmFtZS5zcmMgPSBiYXNlVXJsICsgJz8nICsgcGFyYW1zLnRvU3RyaW5nKCk7XG4gICAgaWZyYW1lLmFsbG93ID0gJ2NhbWVyYTsgbWljcm9waG9uZTsgY2xpcGJvYXJkLXJlYWQ7IGNsaXBib2FyZC13cml0ZTsgcGF5bWVudCc7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnYWxsb3dwYXltZW50cmVxdWVzdCcsICd0cnVlJyk7XG4gICAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IC8vIEluaXRpYWxseSBoaWRlIGlmcmFtZSB1bnRpbCBpdCdzIHJlYWR5XG4gICAgLy8gRnVuY3Rpb24gdG8gdXBkYXRlIHN0eWxpbmcgYmFzZWQgb24gdGhlbWVcbiAgICB2YXIgdXBkYXRlVGhlbWVTdHlsaW5nID0gZnVuY3Rpb24gKG5ld1RoZW1lKSB7XG4gICAgICAgIHZhciBpc0RhcmtUaGVtZSA9IG5ld1RoZW1lID09PSAnZGFyayc7XG4gICAgICAgIC8vIFVwZGF0ZSBpZnJhbWUgYmFja2dyb3VuZCBjb2xvciBpZiBub3QgdXNpbmcgYSBjdXN0b20gYmFja2dyb3VuZCBjb2xvclxuICAgICAgICBpZiAoIWNvbmZpZy5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgIHZhciBiZ0NvbG9yID0gaXNEYXJrVGhlbWUgPyAncmdiKDU1IDU1IDU1IC8gMSknIDogJ3doaXRlJztcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBtYWluIGNvbnRhaW5lciBiYWNrZ3JvdW5kXG4gICAgICAgICAgICBpZiAoaWZyYW1lLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUucGFyZW50RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBiZ0NvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSB0aGUgYm9yZGVyIHJhZGl1cyBpcyBtYWludGFpbmVkIGFmdGVyIHRoZW1lIGNoYW5nZVxuICAgICAgICBpZnJhbWUuc3R5bGUuYm9yZGVyUmFkaXVzID0gXCJcIi5jb25jYXQoYm9yZGVyUmFkaXVzLCBcInB4XCIpO1xuICAgICAgICAvLyBJZiBsb2FkaW5nIGNvbnRhaW5lciBpcyBzdGlsbCBwcmVzZW50LCB1cGRhdGUgaXRzIHN0eWxlIHRvb1xuICAgICAgICB2YXIgbG9hZGluZ0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvYWRpbmctc2VjdGlvbicpO1xuICAgICAgICBpZiAobG9hZGluZ0VsKSB7XG4gICAgICAgICAgICBsb2FkaW5nRWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gaXNEYXJrVGhlbWUgPyAncmdiYSg0MCwgNDAsIDQwLCAwLjgpJyA6ICdyZ2JhKDI0MywgMjQ0LCAyNDYsIDAuOCknO1xuICAgICAgICAgICAgLy8gRmluZCB0aGUgc2tlbGV0b24gc2VjdGlvbiBpbnNpZGUgbG9hZGluZyBjb250YWluZXIgYW5kIHVwZGF0ZSBpdHMgc3R5bGVcbiAgICAgICAgICAgIHZhciBza2VsZXRvbkVsID0gbG9hZGluZ0VsLnF1ZXJ5U2VsZWN0b3IoJ3NlY3Rpb24nKTtcbiAgICAgICAgICAgIGlmIChza2VsZXRvbkVsKSB7XG4gICAgICAgICAgICAgICAgc2tlbGV0b25FbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBpc0RhcmtUaGVtZSA/ICdyZ2IoNTUgNTUgNTUgLyAxKScgOiAnd2hpdGUnO1xuICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgc2tlbGV0b24gc2VjdGlvbiBhbHNvIG1haW50YWlucyBpdHMgYm9yZGVyIHJhZGl1c1xuICAgICAgICAgICAgICAgIHNrZWxldG9uRWwuY2xhc3NMaXN0LmFkZCgnYWhvcmFjcnlwdG8tcm91bmRlZC0zeGwnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gUmV1dGlsaXphbW9zIGVsIHZhbG9yIGRlbCB0ZW1hIHF1ZSB5YSBvYnR1dmltb3MgYW50ZXJpb3JtZW50ZVxuICAgIHZhciBpc0RhcmtUaGVtZSA9IHRoZW1lID09PSAnZGFyayc7XG4gICAgY29uc29sZS5sb2coJ1VzaW5nIGRhcmsgdGhlbWUgZm9yIHNrZWxldG9uOicsIGlzRGFya1RoZW1lKTtcbiAgICAvLyBBZGQgaWZyYW1lIHRvIGNvbnRhaW5lciBmaXJzdCB0byBlc3RhYmxpc2ggcG9zaXRpb25pbmcgY29udGV4dFxuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICAgIC8vIENyZWF0ZSBhIHdyYXBwZXIgZGl2IHRvIGNvbnRlbmVyIGJvdGggdGhlIGlmcmFtZSBhbmQgdGhlIGxvYWRpbmcgYW5pbWF0aW9uXG4gICAgLy8gVGhpcyBlbnN1cmVzIHRoZXkgb2N1cHB5IHRoZSBzYW1lIHNwYWNlXG4gICAgdmFyIHdpZGdldFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB3aWRnZXRXcmFwcGVyLmNsYXNzTmFtZSA9ICdhaG9yYWNyeXB0by1yZWxhdGl2ZSc7XG4gICAgd2lkZ2V0V3JhcHBlci5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICB3aWRnZXRXcmFwcGVyLnN0eWxlLm1heFdpZHRoID0gd2lkdGggKyAncHgnO1xuICAgIHdpZGdldFdyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgICB3aWRnZXRXcmFwcGVyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGlzRGFya1RoZW1lID8gJ3JnYig1NSA1NSA1NSAvIDEpJyA6ICd3aGl0ZSc7XG4gICAgd2lkZ2V0V3JhcHBlci5zdHlsZS5ib3JkZXJSYWRpdXMgPSBcIlwiLmNvbmNhdChib3JkZXJSYWRpdXMsIFwicHhcIik7XG4gICAgLy8gUmVtb3ZlIGlmcmFtZSBmcm9tIGNvbnRhaW5lciBhbmQgYWRkIGl0IHRvIHRoZSB3cmFwcGVyXG4gICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gICAgd2lkZ2V0V3JhcHBlci5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICAgIC8vIEFwcGx5IGluaXRpYWwgdGhlbWUgc3R5bGluZ1xuICAgIHVwZGF0ZVRoZW1lU3R5bGluZyh0aGVtZSk7XG4gICAgLy8gQ3JlYXRlIGxvYWRpbmcgc2tlbGV0b24gY29udGFpbmVyXG4gICAgdmFyIGxvYWRpbmdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBsb2FkaW5nQ29udGFpbmVyLmlkID0gJ2xvYWRpbmctc2VjdGlvbic7XG4gICAgLy8gQXBwbHkgc3R5bGVzIHRvIG1ha2UgdGhlIGxvYWRpbmcgY29udGFpbmVyIHBvc2l0aW9uIGFic29sdXRlbHkgd2l0aGluIHRoZSB3cmFwcGVyXG4gICAgbG9hZGluZ0NvbnRhaW5lci5jbGFzc05hbWUgPSAnYWhvcmFjcnlwdG8tYWJzb2x1dGUgYWhvcmFjcnlwdG8tei0xIGFob3JhY3J5cHRvLWluc2V0LTAgYWhvcmFjcnlwdG8tZmxleCBhaG9yYWNyeXB0by1pdGVtcy1jZW50ZXIgYWhvcmFjcnlwdG8tanVzdGlmeS1jZW50ZXInO1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgbG9hZGluZyBjb250YWluZXIgaXMgdmlzaWJsZSBpbml0aWFsbHlcbiAgICBsb2FkaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGxvYWRpbmdDb250YWluZXIuc3R5bGUuYm9yZGVyUmFkaXVzID0gXCJcIi5jb25jYXQoYm9yZGVyUmFkaXVzLCBcInB4XCIpO1xuICAgIC8vIEFwcGx5IGEgc2VtaS10cmFuc3BhcmVudCBiYWNrZ3JvdW5kIGJhc2VkIG9uIHRoZW1lIC0gdXNlIGV4cGxpY2l0IGNvbG9yc1xuICAgIGxvYWRpbmdDb250YWluZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gaXNEYXJrVGhlbWUgPyAncmdiYSg0MCwgNDAsIDQwLCAwLjgpJyA6ICdyZ2JhKDI0MywgMjQ0LCAyNDYsIDAuOCknO1xuICAgIC8vIEdldCBkaW1lbnNpb25zIGZvciB0aGUgc2tlbGV0b24gc2VjdGlvbiB0byBtYXRjaCB0aGUgaWZyYW1lXG4gICAgdmFyIHNrZWxldG9uU2VjdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcbiAgICAvLyBNYWtlIHN1cmUgdGhlIGxvYWRpbmcgc2VjdGlvbiBtYXRjaGVzIHRoZSBpZnJhbWUgZGltZW5zaW9uc1xuICAgIGxvYWRpbmdDb250YWluZXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgbG9hZGluZ0NvbnRhaW5lci5zdHlsZS5tYXhXaWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICBsb2FkaW5nQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gICAgLy8gU2V0IGZpeGVkIGRpbWVuc2lvbnMgZm9yIHRoZSBza2VsZXRvbiBzZWN0aW9uIHRvIG1hdGNoIHRoZSBpZnJhbWVcbiAgICBza2VsZXRvblNlY3Rpb24uc3R5bGUubWF4V2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgc2tlbGV0b25TZWN0aW9uLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gICAgLy8gRml4IHNwZWNpZmljIGhlaWdodCBmb3IgdGhlIHNrZWxldG9uIHNlY3Rpb24gKHJlbW92ZXMgaC1mdWxsIHNpbmNlIHRoYXQgY2FuIGNhdXNlIGlzc3VlcylcbiAgICB2YXIgc2hhZG93Q2xhc3MgPSBjb25maWcuYm9yZGVyV2l0aFNoYWRvdyAhPT0gZmFsc2UgPyAnYWhvcmFjcnlwdG8tc2hhZG93LWxnJyA6ICcnO1xuICAgIC8vIFNldCB0aGUgY2xhc3NOYW1lIGZvciBza2VsZXRvblNlY3Rpb25cbiAgICBza2VsZXRvblNlY3Rpb24uY2xhc3NOYW1lID0gXCJhaG9yYWNyeXB0by1teC1hdXRvIGFob3JhY3J5cHRvLXJvdW5kZWQtM3hsIFwiLmNvbmNhdChzaGFkb3dDbGFzcywgXCIgYWhvcmFjcnlwdG8tcC00IGFob3JhY3J5cHRvLXB0LTYgYWhvcmFjcnlwdG8tcmVsYXRpdmUgYWhvcmFjcnlwdG8tb3ZlcmZsb3ctaGlkZGVuXCIpO1xuICAgIC8vIEFwcGx5IGJhY2tncm91bmQgY29sb3IgZGlyZWN0bHkgd2l0aCBzdHlsZSB0byBlbnN1cmUgaXQncyBhcHBsaWVkIGNvcnJlY3RseVxuICAgIHNrZWxldG9uU2VjdGlvbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBpc0RhcmtUaGVtZSA/ICdyZ2IoNTUgNTUgNTUgLyAxKScgOiAnd2hpdGUnO1xuICAgIC8vIElmIGN1c3RvbSBib3JkZXJSYWRpdXMgaXMgZGVmaW5lZCwgYXBwbHkgaXRcbiAgICBpZiAoYm9yZGVyUmFkaXVzICE9PSAyNCkgeyAvLyBEZWZhdWx0IGlzIDI0cHhcbiAgICAgICAgc2tlbGV0b25TZWN0aW9uLnN0eWxlLmJvcmRlclJhZGl1cyA9IFwiXCIuY29uY2F0KGJvcmRlclJhZGl1cywgXCJweFwiKTtcbiAgICAgICAgbG9hZGluZ0NvbnRhaW5lci5zdHlsZS5ib3JkZXJSYWRpdXMgPSBcIlwiLmNvbmNhdChib3JkZXJSYWRpdXMsIFwicHhcIik7XG4gICAgfVxuICAgIC8vIENyZWF0ZSB0aGUgaW5uZXIgY29udGFpbmVyIHdpdGggdGhlIHNrZWxldG9uIFVJIC0gbWFrZSBpdCBmaWxsIHRoZSBlbnRpcmUgaGVpZ2h0XG4gICAgdmFyIGlubmVyQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgaW5uZXJDb250YWluZXIuY2xhc3NOYW1lID0gXCJhaG9yYWNyeXB0by1hYnNvbHV0ZSBhaG9yYWNyeXB0by1pbnNldC0wIGFob3JhY3J5cHRvLXotMSBhaG9yYWNyeXB0by1mbGV4IGFob3JhY3J5cHRvLWl0ZW1zLXN0cmV0Y2ggYWhvcmFjcnlwdG8tanVzdGlmeS1jZW50ZXJcIjtcbiAgICAvLyBBcHBseSBiYWNrZ3JvdW5kIGNvbG9yIGRpcmVjdGx5IHdpdGggc3R5bGVcbiAgICBpbm5lckNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBpc0RhcmtUaGVtZSA/ICdyZ2IoNTUgNTUgNTUgLyAxKScgOiAnd2hpdGUnO1xuICAgIC8vIENyZWF0ZSB0aGUgc2tlbGV0b24gcHVsc2UgYW5pbWF0aW9uIGNvbnRlbnQgLSBtYWtlIGl0IGZ1bGwgaGVpZ2h0IHdpdGggZmxleCBjb2x1bW5cbiAgICB2YXIgc2tlbGV0b25Db250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgc2tlbGV0b25Db250ZW50LmNsYXNzTmFtZSA9ICdhaG9yYWNyeXB0by1hbmltYXRlLXB1bHNlIGFob3JhY3J5cHRvLXctZnVsbCBhaG9yYWNyeXB0by1wLTYgYWhvcmFjcnlwdG8tZmxleCBhaG9yYWNyeXB0by1mbGV4LWNvbCBhaG9yYWNyeXB0by1qdXN0aWZ5LWJldHdlZW4nO1xuICAgIHNrZWxldG9uQ29udGVudC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgLy8gRGVmaW5lIGNvbG9yIGZvciBza2VsZXRvbiBlbGVtZW50cyBiYXNlZCBvbiB0aGVtZVxuICAgIHZhciBza2VsZXRvbkVsZW1lbnRDb2xvciA9IGlzRGFya1RoZW1lID8gJ3JnYig4OSA4OSA4OSAvIDEpJyA6ICcjZDFkNWRiJzsgLy8gVXNhciBlbCBjb2xvciBtZW5vcyBvc2N1cm8gcGFyYSBlbGVtZW50b3NcbiAgICBza2VsZXRvbkNvbnRlbnQuaW5uZXJIVE1MID0gXCJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImFob3JhY3J5cHRvLWZsZXggYWhvcmFjcnlwdG8tanVzdGlmeS1iZXR3ZWVuIGFob3JhY3J5cHRvLWl0ZW1zLWNlbnRlciBhaG9yYWNyeXB0by1tYi0yXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhaG9yYWNyeXB0by13LTEwIGFob3JhY3J5cHRvLWgtMTAgYWhvcmFjcnlwdG8tcm91bmRlZC1mdWxsIGFob3JhY3J5cHRvLWFuaW1hdGUtcHVsc2VcXFwiIHN0eWxlPVxcXCJiYWNrZ3JvdW5kLWNvbG9yOiBcIi5jb25jYXQoc2tlbGV0b25FbGVtZW50Q29sb3IsIFwiO1xcXCI+PC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWhvcmFjcnlwdG8tdy04IGFob3JhY3J5cHRvLWgtOCBhaG9yYWNyeXB0by1yb3VuZGVkIGFob3JhY3J5cHRvLWFuaW1hdGUtcHVsc2VcXFwiIHN0eWxlPVxcXCJiYWNrZ3JvdW5kLWNvbG9yOiBcIikuY29uY2F0KHNrZWxldG9uRWxlbWVudENvbG9yLCBcIjtcXFwiPjwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhaG9yYWNyeXB0by1mbGV4LTEgYWhvcmFjcnlwdG8tZmxleCBhaG9yYWNyeXB0by1mbGV4LWNvbCBhaG9yYWNyeXB0by1qdXN0aWZ5LWJldHdlZW4gYWhvcmFjcnlwdG8tcHktMlxcXCI+XFxuICAgICAgICAgICAgPCEtLSBBbW91bnQgSW5wdXQgLS0+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWhvcmFjcnlwdG8tcm91bmRlZC1sZyBhaG9yYWNyeXB0by1oLTI0IGFob3JhY3J5cHRvLW1iLTMgYWhvcmFjcnlwdG8tYW5pbWF0ZS1wdWxzZVxcXCIgc3R5bGU9XFxcImJhY2tncm91bmQtY29sb3I6IFwiKS5jb25jYXQoc2tlbGV0b25FbGVtZW50Q29sb3IsIFwiO1xcXCI+PC9kaXY+XFxuXFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWhvcmFjcnlwdG8tcm91bmRlZC1sZyBhaG9yYWNyeXB0by1oLTI0IGFob3JhY3J5cHRvLW1iLTMgYWhvcmFjcnlwdG8tYW5pbWF0ZS1wdWxzZVxcXCIgc3R5bGU9XFxcImJhY2tncm91bmQtY29sb3I6IFwiKS5jb25jYXQoc2tlbGV0b25FbGVtZW50Q29sb3IsIFwiO1xcXCI+PC9kaXY+XFxuXFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWhvcmFjcnlwdG8taC01IGFob3JhY3J5cHRvLXctMS80IGFob3JhY3J5cHRvLW1sLTQgYWhvcmFjcnlwdG8tbWItMyBhaG9yYWNyeXB0by1yb3VuZGVkLWxnIGFob3JhY3J5cHRvLWFuaW1hdGUtcHVsc2VcXFwiIHN0eWxlPVxcXCJiYWNrZ3JvdW5kLWNvbG9yOiBcIikuY29uY2F0KHNrZWxldG9uRWxlbWVudENvbG9yLCBcIjtcXFwiPjwvZGl2PlxcblxcbiAgICAgICAgICAgIDwhLS0gUGF5bWVudCBNZXRob2QgLS0+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWhvcmFjcnlwdG8taC0xNCBhaG9yYWNyeXB0by1yb3VuZGVkLWxnIGFob3JhY3J5cHRvLW1iLTQgYWhvcmFjcnlwdG8tZmxleCBhaG9yYWNyeXB0by1pdGVtcy1jZW50ZXIgYWhvcmFjcnlwdG8tYW5pbWF0ZS1wdWxzZVxcXCIgc3R5bGU9XFxcImJhY2tncm91bmQtY29sb3I6IFwiKS5jb25jYXQoc2tlbGV0b25FbGVtZW50Q29sb3IsIFwiO1xcXCI+PC9kaXY+XFxuXFxuICAgICAgICAgICAgPCEtLSBCdXkgQnV0dG9uIC0tPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFob3JhY3J5cHRvLWgtMTQgYWhvcmFjcnlwdG8tcm91bmRlZC1sZyBhaG9yYWNyeXB0by1hbmltYXRlLXB1bHNlXFxcIiBzdHlsZT1cXFwiYmFja2dyb3VuZC1jb2xvcjogXCIpLmNvbmNhdChza2VsZXRvbkVsZW1lbnRDb2xvciwgXCI7XFxcIj48L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBGb290ZXIgLS0+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhaG9yYWNyeXB0by1tdC0zIGFob3JhY3J5cHRvLXRleHQtY2VudGVyXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhaG9yYWNyeXB0by1oLTQgYWhvcmFjcnlwdG8tdy0xLzMgYWhvcmFjcnlwdG8tcm91bmRlZC1sZyBhaG9yYWNyeXB0by1teC1hdXRvIGFob3JhY3J5cHRvLWFuaW1hdGUtcHVsc2VcXFwiIHN0eWxlPVxcXCJiYWNrZ3JvdW5kLWNvbG9yOiBcIikuY29uY2F0KHNrZWxldG9uRWxlbWVudENvbG9yLCBcIjtcXFwiPjwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIFwiKTtcbiAgICAvLyBBc3NlbWJsZSB0aGUgbG9hZGluZyBza2VsZXRvblxuICAgIGlubmVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHNrZWxldG9uQ29udGVudCk7XG4gICAgc2tlbGV0b25TZWN0aW9uLmFwcGVuZENoaWxkKGlubmVyQ29udGFpbmVyKTtcbiAgICBsb2FkaW5nQ29udGFpbmVyLmFwcGVuZENoaWxkKHNrZWxldG9uU2VjdGlvbik7XG4gICAgLy8gQWRkIHRoZSBsb2FkaW5nIGNvbnRhaW5lciB0byB0aGUgd3JhcHBlclxuICAgIHdpZGdldFdyYXBwZXIuYXBwZW5kQ2hpbGQobG9hZGluZ0NvbnRhaW5lcik7XG4gICAgLy8gQWRkIHRoZSB3cmFwcGVyIHRvIHRoZSBjb250YWluZXJcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQod2lkZ2V0V3JhcHBlcik7XG4gICAgLy8gUmVhZHkgc3RhdGUgdHJhY2tpbmdcbiAgICB2YXIgaXNXaWRnZXRSZWFkeSA9IGZhbHNlO1xuICAgIHZhciByZWFkeUNhbGxiYWNrcyA9IFtdO1xuICAgIHZhciBwZW5kaW5nTWVzc2FnZXMgPSBbXTtcbiAgICB2YXIgcmVhZHlSZXNvbHZlciA9IG51bGw7XG4gICAgdmFyIHJlYWR5UHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIHJlYWR5UmVzb2x2ZXIgPSByZXNvbHZlO1xuICAgIH0pO1xuICAgIC8vIEZ1bmN0aW9uIHRvIHNlbmQgYSBtZXNzYWdlIHRvIHRoZSBpZnJhbWVcbiAgICB2YXIgc2VuZE1lc3NhZ2VUb0lmcmFtZSA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc1dpZGdldFJlYWR5ICYmIGlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgICAgICBpZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShtZXNzYWdlLCAnKicpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGVuZGluZ01lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIEZ1bmN0aW9uIHRvIGhhbmRsZSB3aWRnZXQgcmVhZHkgc3RhdGVcbiAgICB2YXIgaGFuZGxlV2lkZ2V0UmVhZHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpc1dpZGdldFJlYWR5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpc1dpZGdldFJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBTaG93IGlmcmFtZSBhbmQgaGlkZSBsb2FkaW5nIGFuaW1hdGlvblxuICAgICAgICAgICAgbG9hZGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgLy8gRW5zdXJlIGlmcmFtZSBtYWludGFpbnMgaXRzIGNvbmZpZ3VyZWQgZGltZW5zaW9uc1xuICAgICAgICAgICAgLy9pZiAoY29uZmlnLmlmcmFtZVdpZHRoKSB7XG4gICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgICAgICAvL31cbiAgICAgICAgICAgIGlmIChjb25maWcuaWZyYW1lSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBFbnN1cmUgYm9yZGVyIHJhZGl1cyBpcyBtYWludGFpbmVkXG4gICAgICAgICAgICBpZnJhbWUuc3R5bGUuYm9yZGVyUmFkaXVzID0gXCJcIi5jb25jYXQoYm9yZGVyUmFkaXVzLCBcInB4XCIpO1xuICAgICAgICAgICAgLy8gQWxzbyBhcHBseSBjdXJyZW50IHRoZW1lIHN0eWxpbmcgdG8gbWFrZSBzdXJlIGFsbCBzdHlsZXMgYXJlIGluIHN5bmNcbiAgICAgICAgICAgIHVwZGF0ZVRoZW1lU3R5bGluZyh0aGVtZSk7XG4gICAgICAgICAgICAvLyBTZW5kIGFueSBwZW5kaW5nIG1lc3NhZ2VzXG4gICAgICAgICAgICBwZW5kaW5nTWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGlmIChpZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICAgICAgICAgICAgICBpZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShtZXNzYWdlLCAnKicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGVuZGluZ01lc3NhZ2VzID0gW107XG4gICAgICAgICAgICAvLyBFeGVjdXRlIHJlYWR5IGNhbGxiYWNrc1xuICAgICAgICAgICAgcmVhZHlDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbiAoY2FsbGJhY2spIHsgcmV0dXJuIGNhbGxiYWNrKCk7IH0pO1xuICAgICAgICAgICAgcmVhZHlDYWxsYmFja3MgPSBbXTtcbiAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIHJlYWR5IHByb21pc2VcbiAgICAgICAgICAgIGlmIChyZWFkeVJlc29sdmVyKVxuICAgICAgICAgICAgICAgIHJlYWR5UmVzb2x2ZXIoKTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgfTtcbiAgICAvLyBTZXQgdXAgbWVzc2FnZSBsaXN0ZW5lciBmb3IgcmVhZHkgZXZlbnQgZnJvbSBpZnJhbWVcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAvLyBDaGVjayBpZiBtZXNzYWdlIGlzIGZyb20gb3VyIGlmcmFtZVxuICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBpZnJhbWUuY29udGVudFdpbmRvdyAmJiBldmVudC5kYXRhKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgd2lkZ2V0IHJlYWR5IG1lc3NhZ2VcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhLnR5cGUgPT09ICdXSURHRVRfUkVBRFknKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlV2lkZ2V0UmVhZHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGVtZSBjaGFuZ2VkIG1lc3NhZ2VcbiAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50LmRhdGEudHlwZSA9PT0gJ1RIRU1FX0NIQU5HRUQnICYmIGV2ZW50LmRhdGEudGhlbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3VGhlbWUgPSBldmVudC5kYXRhLnRoZW1lO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdUaGVtZSBjaGFuZ2VkIGZyb20gaWZyYW1lOicsIG5ld1RoZW1lKTtcbiAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgdGhlbWUgaW4gbG9jYWxTdG9yYWdlIHdpdGggYSBwcmVmaXggdG8gYXZvaWQgY29sbGlzaW9uc1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhaG9yYWNyeXB0by10aGVtZScsIG5ld1RoZW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3Qgc2F2ZSB0aGVtZSB0byBsb2NhbFN0b3JhZ2U6JywgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBvdXIgaW50ZXJuYWwgdGhlbWUgc3RhdGVcbiAgICAgICAgICAgICAgICB0aGVtZSA9IG5ld1RoZW1lO1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc3R5bGluZyB0byBtYXRjaCB0aGUgbmV3IHRoZW1lXG4gICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGFsc28gZW5zdXJlIGJvcmRlciByYWRpdXMgYW5kIG90aGVyIHN0eWxlcyBhcmUgcHJlc2VydmVkXG4gICAgICAgICAgICAgICAgdXBkYXRlVGhlbWVTdHlsaW5nKG5ld1RoZW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIC8vIEFsc28gbGlzdGVuIGZvciBsb2FkIGV2ZW50IChhcyBhIGZhbGxiYWNrKVxuICAgIGlmcmFtZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBHaXZlIHRoZSBpZnJhbWUgY29udGVudCBhIG1vbWVudCB0byBpbml0aWFsaXplIGFmdGVyIGxvYWRcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIWlzV2lkZ2V0UmVhZHkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1dpZGdldCBpZnJhbWUgbG9hZGVkIGJ1dCBkaWQgbm90IHNlbmQgV0lER0VUX1JFQURZIG1lc3NhZ2UuIEFzc3VtaW5nIGl0IGlzIHJlYWR5LicpO1xuICAgICAgICAgICAgICAgIGhhbmRsZVdpZGdldFJlYWR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMDApOyAvLyBXYWl0IDEgc2Vjb25kIGFmdGVyIGxvYWQgYmVmb3JlIGFzc3VtaW5nIHJlYWR5XG4gICAgfSk7XG4gICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gdGhlIHdpZGdldCBjb250cm9sbGVyXG4gICAgcmV0dXJuIHtcbiAgICAgICAgaWZyYW1lOiBpZnJhbWUsXG4gICAgICAgIHNldFdhbGxldEFkZHJlc3M6IGZ1bmN0aW9uICh3YWxsZXRBZGRyZXNzKSB7XG4gICAgICAgICAgICBzZW5kTWVzc2FnZVRvSWZyYW1lKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU0VUX1dBTExFVF9BRERSRVNTJyxcbiAgICAgICAgICAgICAgICB3YWxsZXRBZGRyZXNzOiB3YWxsZXRBZGRyZXNzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0UGF5bWVudEludGVudElkOiBmdW5jdGlvbiAocGF5bWVudEludGVudElkKSB7XG4gICAgICAgICAgICBzZW5kTWVzc2FnZVRvSWZyYW1lKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU0VUX1BBWU1FTlRfSU5URU5UX0lEJyxcbiAgICAgICAgICAgICAgICBwYXltZW50SW50ZW50SWQ6IHBheW1lbnRJbnRlbnRJZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNlbmRTaWduZWRNZXNzYWdlOiBmdW5jdGlvbiAoc2lnbmF0dXJlLCBhZGRyZXNzLCBtZXNzYWdlSGFzaCkge1xuICAgICAgICAgICAgc2VuZE1lc3NhZ2VUb0lmcmFtZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NJR05FRF9NRVNTQUdFJyxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmU6IHNpZ25hdHVyZSxcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VIYXNoOiBtZXNzYWdlSGFzaFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3RNZXNzYWdlVG9TaWduOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZW5kTWVzc2FnZVRvSWZyYW1lKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnUkVRVUVTVF9NRVNTQUdFX1RPX1NJR04nXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgY29ubmVjdFdlYjNXYWxsZXQ6IGZ1bmN0aW9uIChwcm92aWRlciwgYWNjb3VudEFkZHJlc3MsIGNoYWluSWQpIHtcbiAgICAgICAgICAgIC8vIFByb3ZpZGVyIG9iamVjdHMgY2Fubm90IGJlIHNlbnQgdmlhIHBvc3RNZXNzYWdlLCBzbyB3ZSBleHRyYWN0IHRoZSByZWxldmFudCBpbmZvcm1hdGlvblxuICAgICAgICAgICAgc2VuZE1lc3NhZ2VUb0lmcmFtZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0NPTk5FQ1RfV0VCM19XQUxMRVQnLFxuICAgICAgICAgICAgICAgIGFjY291bnRBZGRyZXNzOiBhY2NvdW50QWRkcmVzcyxcbiAgICAgICAgICAgICAgICBjaGFpbklkOiBjaGFpbklkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIFNldCB1cCBldmVudCBsaXN0ZW5lcnMgZm9yIHdhbGxldCBjaGFuZ2VzIGlmIHByb3ZpZGVyIGhhcyBldGhlcmV1bSBtZXRob2RzXG4gICAgICAgICAgICBpZiAocHJvdmlkZXIgJiYgcHJvdmlkZXIub24pIHtcbiAgICAgICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIGFjY291bnQgY2hhbmdlc1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyLm9uKCdhY2NvdW50c0NoYW5nZWQnLCBmdW5jdGlvbiAoYWNjb3VudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjY291bnRzICYmIGFjY291bnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlVG9JZnJhbWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdXQUxMRVRfQUNDT1VOVF9DSEFOR0VEJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50QWRkcmVzczogYWNjb3VudHNbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gTGlzdGVuIGZvciBjaGFpbiBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgcHJvdmlkZXIub24oJ2NoYWluQ2hhbmdlZCcsIGZ1bmN0aW9uIChjaGFpbklkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlVG9JZnJhbWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1dBTExFVF9DSEFJTl9DSEFOR0VEJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluSWQ6IHR5cGVvZiBjaGFpbklkID09PSAnc3RyaW5nJyA/IHBhcnNlSW50KGNoYWluSWQsIDE2KSA6IGNoYWluSWRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gTGlzdGVuIGZvciBkaXNjb25uZWN0XG4gICAgICAgICAgICAgICAgcHJvdmlkZXIub24oJ2Rpc2Nvbm5lY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlVG9JZnJhbWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1dBTExFVF9ESVNDT05ORUNURUQnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvblJlYWR5OiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmIChpc1dpZGdldFJlYWR5KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgYWxyZWFkeSByZWFkeSwgZXhlY3V0ZSBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgYWRkIHRvIGNhbGxiYWNrIHF1ZXVlXG4gICAgICAgICAgICAgICAgcmVhZHlDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlYWR5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVhZHlQcm9taXNlO1xuICAgICAgICB9LFxuICAgICAgICBpc1JlYWR5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNXaWRnZXRSZWFkeTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0VGhlbWU6IGZ1bmN0aW9uIChuZXdUaGVtZSkge1xuICAgICAgICAgICAgLy8gVXBkYXRlIG91ciBpbnRlcm5hbCBzdGF0ZVxuICAgICAgICAgICAgdGhlbWUgPSBuZXdUaGVtZTtcbiAgICAgICAgICAgIC8vIFN0b3JlIGluIGxvY2FsU3RvcmFnZSB3aXRoIHByZWZpeCB0byBhdm9pZCBjb2xsaXNpb25zXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhaG9yYWNyeXB0by10aGVtZScsIG5ld1RoZW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3Qgc2F2ZSB0aGVtZSB0byBsb2NhbFN0b3JhZ2U6JywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBVcGRhdGUgc3R5bGluZyBvZiB0aGUgcGFyZW50IGNvbnRhaW5lclxuICAgICAgICAgICAgdXBkYXRlVGhlbWVTdHlsaW5nKG5ld1RoZW1lKTtcbiAgICAgICAgICAgIC8vIEFsc28gaW5mb3JtIHRoZSBpZnJhbWUgYWJvdXQgdGhlIHRoZW1lIGNoYW5nZVxuICAgICAgICAgICAgc2VuZE1lc3NhZ2VUb0lmcmFtZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NFVF9USEVNRScsXG4gICAgICAgICAgICAgICAgdGhlbWU6IG5ld1RoZW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnRzLnJlbmRlcldlYndpZGdldCA9IHJlbmRlcldlYndpZGdldDtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmVuZGVyV2Vid2lkZ2V0ID0gdm9pZCAwO1xudmFyIHdlYndpZGdldF8xID0gcmVxdWlyZShcIi4vd2Vid2lkZ2V0L3dlYndpZGdldFwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInJlbmRlcldlYndpZGdldFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gd2Vid2lkZ2V0XzEucmVuZGVyV2Vid2lkZ2V0OyB9IH0pO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9