// EXPORTS __webpack_require__.d(__webpack_exports__, { NQ: () => (/* reexport */ getRetryPlugin), BC: () => (/* reexport */ resolveRetryConfig) }); // UNUSED EXPORTS: AdaptiveRetryStrategy, CONFIG_MAX_ATTEMPTS, CONFIG_RETRY_MODE, ENV_MAX_ATTEMPTS, ENV_RETRY_MODE, NODE_MAX_ATTEMPT_CONFIG_OPTIONS, NODE_RETRY_MODE_CONFIG_OPTIONS, StandardRetryStrategy, defaultDelayDecider, defaultRetryDecider, getOmitRetryHeadersPlugin, getRetryAfterHint, omitRetryHeadersMiddleware, omitRetryHeadersMiddlewareOptions, retryMiddleware, retryMiddlewareOptions // EXTERNAL MODULE: ./node_modules/@smithy/util-retry/dist-es/index.js + 8 modules var dist_es = __webpack_require__(9347); // EXTERNAL MODULE: ./node_modules/@smithy/protocol-http/dist-es/index.js + 5 modules var protocol_http_dist_es = __webpack_require__(6580); ;// CONCATENATED MODULE: ./node_modules/@smithy/middleware-retry/dist-es/defaultRetryQuota.js const defaultRetryQuota_getDefaultRetryQuota = (initialRetryTokens, options) => { const MAX_CAPACITY = initialRetryTokens; const noRetryIncrement = options?.noRetryIncrement ?? NO_RETRY_INCREMENT; const retryCost = options?.retryCost ?? RETRY_COST; const timeoutRetryCost = options?.timeoutRetryCost ?? TIMEOUT_RETRY_COST; let availableCapacity = initialRetryTokens; const getCapacityAmount = (error) => (error.name === "TimeoutError" ? timeoutRetryCost : retryCost); const hasRetryTokens = (error) => getCapacityAmount(error) <= availableCapacity; const retrieveRetryTokens = (error) => { if (!hasRetryTokens(error)) { throw new Error("No retry token available"); } const capacityAmount = getCapacityAmount(error); availableCapacity -= capacityAmount; return capacityAmount; }; const releaseRetryTokens = (capacityReleaseAmount) => { availableCapacity += capacityReleaseAmount ?? noRetryIncrement; availableCapacity = Math.min(availableCapacity, MAX_CAPACITY); }; return Object.freeze({ hasRetryTokens, retrieveRetryTokens, releaseRetryTokens, }); }; ;// CONCATENATED MODULE: ./node_modules/@smithy/middleware-retry/dist-es/delayDecider.js const delayDecider_defaultDelayDecider = (delayBase, attempts) => Math.floor(Math.min(MAXIMUM_RETRY_DELAY, Math.random() * 2 ** attempts * delayBase)); ;// CONCATENATED MODULE: ./node_modules/@smithy/middleware-retry/dist-es/StandardRetryStrategy.js class StandardRetryStrategy_StandardRetryStrategy { constructor(maxAttemptsProvider, options) { this.maxAttemptsProvider = maxAttemptsProvider; this.mode = RETRY_MODES.STANDARD; this.retryDecider = options?.retryDecider ?? defaultRetryDecider; this.delayDecider = options?.delayDecider ?? defaultDelayDecider; this.retryQuota = options?.retryQuota ?? getDefaultRetryQuota(INITIAL_RETRY_TOKENS); } shouldRetry(error, attempts, maxAttempts) { return attempts < maxAttempts && this.retryDecider(error) && this.retryQuota.hasRetryTokens(error); } async getMaxAttempts() { let maxAttempts; try { maxAttempts = await this.maxAttemptsProvider(); } catch (error) { maxAttempts = DEFAULT_MAX_ATTEMPTS; } return maxAttempts; } async retry(next, args, options) { let retryTokenAmount; let attempts = 0; let totalDelay = 0; const maxAttempts = await this.getMaxAttempts(); const { request } = args; if (HttpRequest.isInstance(request)) { request.headers[INVOCATION_ID_HEADER] = v4(); } while (true) { try { if (HttpRequest.isInstance(request)) { request.headers[REQUEST_HEADER] = `attempt=${attempts + 1}; max=${maxAttempts}`; } if (options?.beforeRequest) { await options.beforeRequest(); } const { response, output } = await next(args); if (options?.afterRequest) { options.afterRequest(response); } this.retryQuota.releaseRetryTokens(retryTokenAmount); output.$metadata.attempts = attempts + 1; output.$metadata.totalRetryDelay = totalDelay; return { response, output }; } catch (e) { const err = asSdkError(e); attempts++; if (this.shouldRetry(err, attempts, maxAttempts)) { retryTokenAmount = this.retryQuota.retrieveRetryTokens(err); const delayFromDecider = this.delayDecider(isThrottlingError(err) ? THROTTLING_RETRY_DELAY_BASE : DEFAULT_RETRY_DELAY_BASE, attempts); const delayFromResponse = getDelayFromRetryAfterHeader(err.$response); const delay = Math.max(delayFromResponse || 0, delayFromDecider); totalDelay += delay; await new Promise((resolve) => setTimeout(resolve, delay)); continue; } if (!err.$metadata) { err.$metadata = {}; } err.$metadata.attempts = attempts; err.$metadata.totalRetryDelay = totalDelay; throw err; } } } } const getDelayFromRetryAfterHeader = (response) => { if (!HttpResponse.isInstance(response)) return; const retryAfterHeaderName = Object.keys(response.headers).find((key) => key.toLowerCase() === "retry-after"); if (!retryAfterHeaderName) return; const retryAfter = response.headers[retryAfterHeaderName]; const retryAfterSeconds = Number(retryAfter); if (!Number.isNaN(retryAfterSeconds)) return retryAfterSeconds * 1000; const retryAfterDate = new Date(retryAfter); return retryAfterDate.getTime() - Date.now(); }; ;// CONCATENATED MODULE: ./node_modules/@smithy/middleware-retry/dist-es/AdaptiveRetryStrategy.js class AdaptiveRetryStrategy extends (/* unused pure expression or super */ null && (StandardRetryStrategy)) { constructor(maxAttemptsProvider, options) { const { rateLimiter, ...superOptions } = options ?? {}; super(maxAttemptsProvider, superOptions); this.rateLimiter = rateLimiter ?? new DefaultRateLimiter(); this.mode = RETRY_MODES.ADAPTIVE; } async retry(next, args) { return super.retry(next, args, { beforeRequest: async () => { return this.rateLimiter.getSendToken(); }, afterRequest: (response) => { this.rateLimiter.updateClientSendingRate(response); }, }); } } // EXTERNAL MODULE: ./node_modules/@smithy/util-middleware/dist-es/index.js + 2 modules var util_middleware_dist_es = __webpack_require__(8530); ;// CONCATENATED MODULE: ./node_modules/@smithy/middleware-retry/dist-es/configurations.js const ENV_MAX_ATTEMPTS = "AWS_MAX_ATTEMPTS"; const CONFIG_MAX_ATTEMPTS = "max_attempts"; const NODE_MAX_ATTEMPT_CONFIG_OPTIONS = { environmentVariableSelector: (env) => { const value = env[ENV_MAX_ATTEMPTS]; if (!value) return undefined; const maxAttempt = parseInt(value); if (Number.isNaN(maxAttempt)) { throw new Error(`Environment variable ${ENV_MAX_ATTEMPTS} mast be a number, got "${value}"`); } return maxAttempt; }, configFileSelector: (profile) => { const value = profile[CONFIG_MAX_ATTEMPTS]; if (!value) return undefined; const maxAttempt = parseInt(value); if (Number.isNaN(maxAttempt)) { throw new Error(`Shared config file entry ${CONFIG_MAX_ATTEMPTS} mast be a number, got "${value}"`); } return maxAttempt; }, default: dist_es/* DEFAULT_MAX_ATTEMPTS */.J, }; const resolveRetryConfig = (input) => { const { retryStrategy } = input; const maxAttempts = (0,util_middleware_dist_es/* normalizeProvider */.$)(input.maxAttempts ?? dist_es/* DEFAULT_MAX_ATTEMPTS */.J); return { ...input, maxAttempts, retryStrategy: async () => { if (retryStrategy) { return retryStrategy; } const retryMode = await (0,util_middleware_dist_es/* normalizeProvider */.$)(input.retryMode)(); if (retryMode === dist_es/* RETRY_MODES */.Ul.ADAPTIVE) { return new dist_es/* AdaptiveRetryStrategy */.AY(maxAttempts); } return new dist_es/* StandardRetryStrategy */.Uz(maxAttempts); }, }; }; const ENV_RETRY_MODE = "AWS_RETRY_MODE"; const CONFIG_RETRY_MODE = "retry_mode"; const NODE_RETRY_MODE_CONFIG_OPTIONS = { environmentVariableSelector: (env) => env[ENV_RETRY_MODE], configFileSelector: (profile) => profile[CONFIG_RETRY_MODE], default: dist_es/* DEFAULT_RETRY_MODE */.CA, }; ;// CONCATENATED MODULE: ./node_modules/@smithy/middleware-retry/dist-es/omitRetryHeadersMiddleware.js const omitRetryHeadersMiddleware = () => (next) => async (args) => { const { request } = args; if (HttpRequest.isInstance(request)) { delete request.headers[INVOCATION_ID_HEADER]; delete request.headers[REQUEST_HEADER]; } return next(args); }; const omitRetryHeadersMiddlewareOptions = { name: "omitRetryHeadersMiddleware", tags: ["RETRY", "HEADERS", "OMIT_RETRY_HEADERS"], relation: "before", toMiddleware: "awsAuthMiddleware", override: true, }; const getOmitRetryHeadersPlugin = (options) => ({ applyToStack: (clientStack) => { clientStack.addRelativeTo(omitRetryHeadersMiddleware(), omitRetryHeadersMiddlewareOptions); }, }); // EXTERNAL MODULE: ./node_modules/@smithy/service-error-classification/dist-es/index.js + 1 modules var service_error_classification_dist_es = __webpack_require__(804); // EXTERNAL MODULE: ./node_modules/@smithy/smithy-client/dist-es/index.js + 21 modules var smithy_client_dist_es = __webpack_require__(6938); ;// CONCATENATED MODULE: ./node_modules/@smithy/middleware-retry/node_modules/uuid/dist/esm-browser/native.js const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto); /* harmony default export */ const esm_browser_native = ({ randomUUID }); ;// CONCATENATED MODULE: ./node_modules/@smithy/middleware-retry/node_modules/uuid/dist/esm-browser/rng.js // Unique ID creation requires a high quality random # generator. In the browser we therefore // require the crypto API and do not support built-in fallback to lower quality random number // generators (like Math.random()). let getRandomValues; const rnds8 = new Uint8Array(16); function rng() { // lazy load so that environments that need to polyfill have a chance to do so if (!getRandomValues) { // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto); if (!getRandomValues) { throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported'); } } return getRandomValues(rnds8); } ;// CONCATENATED MODULE: ./node_modules/@smithy/middleware-retry/node_modules/uuid/dist/esm-browser/stringify.js /** * Convert array of 16 byte values to UUID string format of the form: * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX */ const byteToHex = []; for (let i = 0; i < 256; ++i) { byteToHex.push((i + 0x100).toString(16).slice(1)); } function unsafeStringify(arr, offset = 0) { // Note: Be careful editing this code! It's been tuned for performance // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]; } function stringify(arr, offset = 0) { const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one // of the following: // - One or more input array values don't map to a hex octet (leading to // "undefined" in the uuid) // - Invalid input values for the RFC `version` or `variant` fields if (!validate(uuid)) { throw TypeError('Stringified UUID is invalid'); } return uuid; } /* harmony default export */ const esm_browser_stringify = ((/* unused pure expression or super */ null && (stringify))); ;// CONCATENATED MODULE: ./node_modules/@smithy/middleware-retry/node_modules/uuid/dist/esm-browser/v4.js function v4_v4(options, buf, offset) { if (esm_browser_native.randomUUID && !buf && !options) { return esm_browser_native.randomUUID(); } options = options || {}; const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` rnds[6] = rnds[6] & 0x0f | 0x40; rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided if (buf) { offset = offset || 0; for (let i = 0; i < 16; ++i) { buf[offset + i] = rnds[i]; } return buf; } return unsafeStringify(rnds); } /* harmony default export */ const esm_browser_v4 = (v4_v4); ;// CONCATENATED MODULE: ./node_modules/@smithy/middleware-retry/dist-es/isStreamingPayload/isStreamingPayload.browser.js const isStreamingPayload = (request) => request?.body instanceof ReadableStream; ;// CONCATENATED MODULE: ./node_modules/@smithy/middleware-retry/dist-es/util.js const util_asSdkError = (error) => { if (error instanceof Error) return error; if (error instanceof Object) return Object.assign(new Error(), error); if (typeof error === "string") return new Error(error); return new Error(`AWS SDK error wrapper for ${error}`); }; ;// CONCATENATED MODULE: ./node_modules/@smithy/middleware-retry/dist-es/retryMiddleware.js const retryMiddleware = (options) => (next, context) => async (args) => { let retryStrategy = await options.retryStrategy(); const maxAttempts = await options.maxAttempts(); if (isRetryStrategyV2(retryStrategy)) { retryStrategy = retryStrategy; let retryToken = await retryStrategy.acquireInitialRetryToken(context["partition_id"]); let lastError = new Error(); let attempts = 0; let totalRetryDelay = 0; const { request } = args; const isRequest = protocol_http_dist_es/* HttpRequest */.aW.isInstance(request); if (isRequest) { request.headers[dist_es/* INVOCATION_ID_HEADER */.lk] = esm_browser_v4(); } while (true) { try { if (isRequest) { request.headers[dist_es/* REQUEST_HEADER */.r5] = `attempt=${attempts + 1}; max=${maxAttempts}`; } const { response, output } = await next(args); retryStrategy.recordSuccess(retryToken); output.$metadata.attempts = attempts + 1; output.$metadata.totalRetryDelay = totalRetryDelay; return { response, output }; } catch (e) { const retryErrorInfo = getRetryErrorInfo(e); lastError = util_asSdkError(e); if (isRequest && isStreamingPayload(request)) { (context.logger instanceof smithy_client_dist_es/* NoOpLogger */.vk ? console : context.logger)?.warn("An error was encountered in a non-retryable streaming request."); throw lastError; } try { retryToken = await retryStrategy.refreshRetryTokenForRetry(retryToken, retryErrorInfo); } catch (refreshError) { if (!lastError.$metadata) { lastError.$metadata = {}; } lastError.$metadata.attempts = attempts + 1; lastError.$metadata.totalRetryDelay = totalRetryDelay; throw lastError; } attempts = retryToken.getRetryCount(); const delay = retryToken.getRetryDelay(); totalRetryDelay += delay; await new Promise((resolve) => setTimeout(resolve, delay)); } } } else { retryStrategy = retryStrategy; if (retryStrategy?.mode) context.userAgent = [...(context.userAgent || []), ["cfg/retry-mode", retryStrategy.mode]]; return retryStrategy.retry(next, args); } }; const isRetryStrategyV2 = (retryStrategy) => typeof retryStrategy.acquireInitialRetryToken !== "undefined" && typeof retryStrategy.refreshRetryTokenForRetry !== "undefined" && typeof retryStrategy.recordSuccess !== "undefined"; const getRetryErrorInfo = (error) => { const errorInfo = { error, errorType: getRetryErrorType(error), }; const retryAfterHint = getRetryAfterHint(error.$response); if (retryAfterHint) { errorInfo.retryAfterHint = retryAfterHint; } return errorInfo; }; const getRetryErrorType = (error) => { if ((0,service_error_classification_dist_es/* isThrottlingError */.pK)(error)) return "THROTTLING"; if ((0,service_error_classification_dist_es/* isTransientError */.iH)(error)) return "TRANSIENT"; if ((0,service_error_classification_dist_es/* isServerError */.o7)(error)) return "SERVER_ERROR"; return "CLIENT_ERROR"; }; const retryMiddlewareOptions = { name: "retryMiddleware", tags: ["RETRY"], step: "finalizeRequest", priority: "high", override: true, }; const getRetryPlugin = (options) => ({ applyToStack: (clientStack) => { clientStack.add(retryMiddleware(options), retryMiddlewareOptions); }, }); const getRetryAfterHint = (response) => { if (!protocol_http_dist_es/* HttpResponse */.Zn.isInstance(response)) return; const retryAfterHeaderName = Object.keys(response.headers).find((key) => key.toLowerCase() === "retry-after"); if (!retryAfterHeaderName) return; const retryAfter = response.headers[retryAfterHeaderName]; const retryAfterSeconds = Number(retryAfter); if (!Number.isNaN(retryAfterSeconds)) return new Date(retryAfterSeconds * 1000); const retryAfterDate = new Date(retryAfter); return retryAfterDate; }; ;// CONCATENATED MODULE: ./node_modules/@smithy/middleware-retry/dist-es/index.js //# sourceURL=[module] //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYwLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxQkE7QUFDQTs7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ25EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQy9HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL21hdHRyei1jeC1saWJyYXJ5Ly4vbm9kZV9tb2R1bGVzL0BzbWl0aHkvbWlkZGxld2FyZS1yZXRyeS9kaXN0LWVzL2RlZmF1bHRSZXRyeVF1b3RhLmpzP2JiNGMiLCJ3ZWJwYWNrOi8vbWF0dHJ6LWN4LWxpYnJhcnkvLi9ub2RlX21vZHVsZXMvQHNtaXRoeS9taWRkbGV3YXJlLXJldHJ5L2Rpc3QtZXMvZGVsYXlEZWNpZGVyLmpzPzBiMGQiLCJ3ZWJwYWNrOi8vbWF0dHJ6LWN4LWxpYnJhcnkvLi9ub2RlX21vZHVsZXMvQHNtaXRoeS9taWRkbGV3YXJlLXJldHJ5L2Rpc3QtZXMvU3RhbmRhcmRSZXRyeVN0cmF0ZWd5LmpzPzQ2MzQiLCJ3ZWJwYWNrOi8vbWF0dHJ6LWN4LWxpYnJhcnkvLi9ub2RlX21vZHVsZXMvQHNtaXRoeS9taWRkbGV3YXJlLXJldHJ5L2Rpc3QtZXMvQWRhcHRpdmVSZXRyeVN0cmF0ZWd5LmpzP2E5ZWYiLCJ3ZWJwYWNrOi8vbWF0dHJ6LWN4LWxpYnJhcnkvLi9ub2RlX21vZHVsZXMvQHNtaXRoeS9taWRkbGV3YXJlLXJldHJ5L2Rpc3QtZXMvY29uZmlndXJhdGlvbnMuanM/ZGZmZCIsIndlYnBhY2s6Ly9tYXR0cnotY3gtbGlicmFyeS8uL25vZGVfbW9kdWxlcy9Ac21pdGh5L21pZGRsZXdhcmUtcmV0cnkvZGlzdC1lcy9vbWl0UmV0cnlIZWFkZXJzTWlkZGxld2FyZS5qcz9iMmY0Iiwid2VicGFjazovL21hdHRyei1jeC1saWJyYXJ5Ly4vbm9kZV9tb2R1bGVzL0BzbWl0aHkvbWlkZGxld2FyZS1yZXRyeS9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25hdGl2ZS5qcz9lMGE4Iiwid2VicGFjazovL21hdHRyei1jeC1saWJyYXJ5Ly4vbm9kZV9tb2R1bGVzL0BzbWl0aHkvbWlkZGxld2FyZS1yZXRyeS9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcz8zZWQ5Iiwid2VicGFjazovL21hdHRyei1jeC1saWJyYXJ5Ly4vbm9kZV9tb2R1bGVzL0BzbWl0aHkvbWlkZGxld2FyZS1yZXRyeS9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3N0cmluZ2lmeS5qcz85NWM3Iiwid2VicGFjazovL21hdHRyei1jeC1saWJyYXJ5Ly4vbm9kZV9tb2R1bGVzL0BzbWl0aHkvbWlkZGxld2FyZS1yZXRyeS9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y0LmpzPzgzM2EiLCJ3ZWJwYWNrOi8vbWF0dHJ6LWN4LWxpYnJhcnkvLi9ub2RlX21vZHVsZXMvQHNtaXRoeS9taWRkbGV3YXJlLXJldHJ5L2Rpc3QtZXMvaXNTdHJlYW1pbmdQYXlsb2FkL2lzU3RyZWFtaW5nUGF5bG9hZC5icm93c2VyLmpzPzE0NTIiLCJ3ZWJwYWNrOi8vbWF0dHJ6LWN4LWxpYnJhcnkvLi9ub2RlX21vZHVsZXMvQHNtaXRoeS9taWRkbGV3YXJlLXJldHJ5L2Rpc3QtZXMvdXRpbC5qcz83ZGJhIiwid2VicGFjazovL21hdHRyei1jeC1saWJyYXJ5Ly4vbm9kZV9tb2R1bGVzL0BzbWl0aHkvbWlkZGxld2FyZS1yZXRyeS9kaXN0LWVzL3JldHJ5TWlkZGxld2FyZS5qcz9iMDM0Iiwid2VicGFjazovL21hdHRyei1jeC1saWJyYXJ5Ly4vbm9kZV9tb2R1bGVzL0BzbWl0aHkvbWlkZGxld2FyZS1yZXRyeS9kaXN0LWVzL2luZGV4LmpzP2FjMjIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTk9fUkVUUllfSU5DUkVNRU5ULCBSRVRSWV9DT1NULCBUSU1FT1VUX1JFVFJZX0NPU1QgfSBmcm9tIFwiQHNtaXRoeS91dGlsLXJldHJ5XCI7XG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdFJldHJ5UXVvdGEgPSAoaW5pdGlhbFJldHJ5VG9rZW5zLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgTUFYX0NBUEFDSVRZID0gaW5pdGlhbFJldHJ5VG9rZW5zO1xuICAgIGNvbnN0IG5vUmV0cnlJbmNyZW1lbnQgPSBvcHRpb25zPy5ub1JldHJ5SW5jcmVtZW50ID8/IE5PX1JFVFJZX0lOQ1JFTUVOVDtcbiAgICBjb25zdCByZXRyeUNvc3QgPSBvcHRpb25zPy5yZXRyeUNvc3QgPz8gUkVUUllfQ09TVDtcbiAgICBjb25zdCB0aW1lb3V0UmV0cnlDb3N0ID0gb3B0aW9ucz8udGltZW91dFJldHJ5Q29zdCA/PyBUSU1FT1VUX1JFVFJZX0NPU1Q7XG4gICAgbGV0IGF2YWlsYWJsZUNhcGFjaXR5ID0gaW5pdGlhbFJldHJ5VG9rZW5zO1xuICAgIGNvbnN0IGdldENhcGFjaXR5QW1vdW50ID0gKGVycm9yKSA9PiAoZXJyb3IubmFtZSA9PT0gXCJUaW1lb3V0RXJyb3JcIiA/IHRpbWVvdXRSZXRyeUNvc3QgOiByZXRyeUNvc3QpO1xuICAgIGNvbnN0IGhhc1JldHJ5VG9rZW5zID0gKGVycm9yKSA9PiBnZXRDYXBhY2l0eUFtb3VudChlcnJvcikgPD0gYXZhaWxhYmxlQ2FwYWNpdHk7XG4gICAgY29uc3QgcmV0cmlldmVSZXRyeVRva2VucyA9IChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoIWhhc1JldHJ5VG9rZW5zKGVycm9yKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmV0cnkgdG9rZW4gYXZhaWxhYmxlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhcGFjaXR5QW1vdW50ID0gZ2V0Q2FwYWNpdHlBbW91bnQoZXJyb3IpO1xuICAgICAgICBhdmFpbGFibGVDYXBhY2l0eSAtPSBjYXBhY2l0eUFtb3VudDtcbiAgICAgICAgcmV0dXJuIGNhcGFjaXR5QW1vdW50O1xuICAgIH07XG4gICAgY29uc3QgcmVsZWFzZVJldHJ5VG9rZW5zID0gKGNhcGFjaXR5UmVsZWFzZUFtb3VudCkgPT4ge1xuICAgICAgICBhdmFpbGFibGVDYXBhY2l0eSArPSBjYXBhY2l0eVJlbGVhc2VBbW91bnQgPz8gbm9SZXRyeUluY3JlbWVudDtcbiAgICAgICAgYXZhaWxhYmxlQ2FwYWNpdHkgPSBNYXRoLm1pbihhdmFpbGFibGVDYXBhY2l0eSwgTUFYX0NBUEFDSVRZKTtcbiAgICB9O1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaGFzUmV0cnlUb2tlbnMsXG4gICAgICAgIHJldHJpZXZlUmV0cnlUb2tlbnMsXG4gICAgICAgIHJlbGVhc2VSZXRyeVRva2VucyxcbiAgICB9KTtcbn07XG4iLCJpbXBvcnQgeyBNQVhJTVVNX1JFVFJZX0RFTEFZIH0gZnJvbSBcIkBzbWl0aHkvdXRpbC1yZXRyeVwiO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHREZWxheURlY2lkZXIgPSAoZGVsYXlCYXNlLCBhdHRlbXB0cykgPT4gTWF0aC5mbG9vcihNYXRoLm1pbihNQVhJTVVNX1JFVFJZX0RFTEFZLCBNYXRoLnJhbmRvbSgpICogMiAqKiBhdHRlbXB0cyAqIGRlbGF5QmFzZSkpO1xuIiwiaW1wb3J0IHsgSHR0cFJlcXVlc3QsIEh0dHBSZXNwb25zZSB9IGZyb20gXCJAc21pdGh5L3Byb3RvY29sLWh0dHBcIjtcbmltcG9ydCB7IGlzVGhyb3R0bGluZ0Vycm9yIH0gZnJvbSBcIkBzbWl0aHkvc2VydmljZS1lcnJvci1jbGFzc2lmaWNhdGlvblwiO1xuaW1wb3J0IHsgREVGQVVMVF9NQVhfQVRURU1QVFMsIERFRkFVTFRfUkVUUllfREVMQVlfQkFTRSwgSU5JVElBTF9SRVRSWV9UT0tFTlMsIElOVk9DQVRJT05fSURfSEVBREVSLCBSRVFVRVNUX0hFQURFUiwgUkVUUllfTU9ERVMsIFRIUk9UVExJTkdfUkVUUllfREVMQVlfQkFTRSwgfSBmcm9tIFwiQHNtaXRoeS91dGlsLXJldHJ5XCI7XG5pbXBvcnQgeyB2NCB9IGZyb20gXCJ1dWlkXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0UmV0cnlRdW90YSB9IGZyb20gXCIuL2RlZmF1bHRSZXRyeVF1b3RhXCI7XG5pbXBvcnQgeyBkZWZhdWx0RGVsYXlEZWNpZGVyIH0gZnJvbSBcIi4vZGVsYXlEZWNpZGVyXCI7XG5pbXBvcnQgeyBkZWZhdWx0UmV0cnlEZWNpZGVyIH0gZnJvbSBcIi4vcmV0cnlEZWNpZGVyXCI7XG5pbXBvcnQgeyBhc1Nka0Vycm9yIH0gZnJvbSBcIi4vdXRpbFwiO1xuZXhwb3J0IGNsYXNzIFN0YW5kYXJkUmV0cnlTdHJhdGVneSB7XG4gICAgY29uc3RydWN0b3IobWF4QXR0ZW1wdHNQcm92aWRlciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLm1heEF0dGVtcHRzUHJvdmlkZXIgPSBtYXhBdHRlbXB0c1Byb3ZpZGVyO1xuICAgICAgICB0aGlzLm1vZGUgPSBSRVRSWV9NT0RFUy5TVEFOREFSRDtcbiAgICAgICAgdGhpcy5yZXRyeURlY2lkZXIgPSBvcHRpb25zPy5yZXRyeURlY2lkZXIgPz8gZGVmYXVsdFJldHJ5RGVjaWRlcjtcbiAgICAgICAgdGhpcy5kZWxheURlY2lkZXIgPSBvcHRpb25zPy5kZWxheURlY2lkZXIgPz8gZGVmYXVsdERlbGF5RGVjaWRlcjtcbiAgICAgICAgdGhpcy5yZXRyeVF1b3RhID0gb3B0aW9ucz8ucmV0cnlRdW90YSA/PyBnZXREZWZhdWx0UmV0cnlRdW90YShJTklUSUFMX1JFVFJZX1RPS0VOUyk7XG4gICAgfVxuICAgIHNob3VsZFJldHJ5KGVycm9yLCBhdHRlbXB0cywgbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgcmV0dXJuIGF0dGVtcHRzIDwgbWF4QXR0ZW1wdHMgJiYgdGhpcy5yZXRyeURlY2lkZXIoZXJyb3IpICYmIHRoaXMucmV0cnlRdW90YS5oYXNSZXRyeVRva2VucyhlcnJvcik7XG4gICAgfVxuICAgIGFzeW5jIGdldE1heEF0dGVtcHRzKCkge1xuICAgICAgICBsZXQgbWF4QXR0ZW1wdHM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtYXhBdHRlbXB0cyA9IGF3YWl0IHRoaXMubWF4QXR0ZW1wdHNQcm92aWRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbWF4QXR0ZW1wdHMgPSBERUZBVUxUX01BWF9BVFRFTVBUUztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4QXR0ZW1wdHM7XG4gICAgfVxuICAgIGFzeW5jIHJldHJ5KG5leHQsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHJldHJ5VG9rZW5BbW91bnQ7XG4gICAgICAgIGxldCBhdHRlbXB0cyA9IDA7XG4gICAgICAgIGxldCB0b3RhbERlbGF5ID0gMDtcbiAgICAgICAgY29uc3QgbWF4QXR0ZW1wdHMgPSBhd2FpdCB0aGlzLmdldE1heEF0dGVtcHRzKCk7XG4gICAgICAgIGNvbnN0IHsgcmVxdWVzdCB9ID0gYXJncztcbiAgICAgICAgaWYgKEh0dHBSZXF1ZXN0LmlzSW5zdGFuY2UocmVxdWVzdCkpIHtcbiAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVyc1tJTlZPQ0FUSU9OX0lEX0hFQURFUl0gPSB2NCgpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChIdHRwUmVxdWVzdC5pc0luc3RhbmNlKHJlcXVlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVyc1tSRVFVRVNUX0hFQURFUl0gPSBgYXR0ZW1wdD0ke2F0dGVtcHRzICsgMX07IG1heD0ke21heEF0dGVtcHRzfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5iZWZvcmVSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMuYmVmb3JlUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB7IHJlc3BvbnNlLCBvdXRwdXQgfSA9IGF3YWl0IG5leHQoYXJncyk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmFmdGVyUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmFmdGVyUmVxdWVzdChyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucmV0cnlRdW90YS5yZWxlYXNlUmV0cnlUb2tlbnMocmV0cnlUb2tlbkFtb3VudCk7XG4gICAgICAgICAgICAgICAgb3V0cHV0LiRtZXRhZGF0YS5hdHRlbXB0cyA9IGF0dGVtcHRzICsgMTtcbiAgICAgICAgICAgICAgICBvdXRwdXQuJG1ldGFkYXRhLnRvdGFsUmV0cnlEZWxheSA9IHRvdGFsRGVsYXk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzcG9uc2UsIG91dHB1dCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBhc1Nka0Vycm9yKGUpO1xuICAgICAgICAgICAgICAgIGF0dGVtcHRzKys7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkUmV0cnkoZXJyLCBhdHRlbXB0cywgbWF4QXR0ZW1wdHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJ5VG9rZW5BbW91bnQgPSB0aGlzLnJldHJ5UXVvdGEucmV0cmlldmVSZXRyeVRva2VucyhlcnIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxheUZyb21EZWNpZGVyID0gdGhpcy5kZWxheURlY2lkZXIoaXNUaHJvdHRsaW5nRXJyb3IoZXJyKSA/IFRIUk9UVExJTkdfUkVUUllfREVMQVlfQkFTRSA6IERFRkFVTFRfUkVUUllfREVMQVlfQkFTRSwgYXR0ZW1wdHMpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxheUZyb21SZXNwb25zZSA9IGdldERlbGF5RnJvbVJldHJ5QWZ0ZXJIZWFkZXIoZXJyLiRyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5tYXgoZGVsYXlGcm9tUmVzcG9uc2UgfHwgMCwgZGVsYXlGcm9tRGVjaWRlcik7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsRGVsYXkgKz0gZGVsYXk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWVyci4kbWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyLiRtZXRhZGF0YSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlcnIuJG1ldGFkYXRhLmF0dGVtcHRzID0gYXR0ZW1wdHM7XG4gICAgICAgICAgICAgICAgZXJyLiRtZXRhZGF0YS50b3RhbFJldHJ5RGVsYXkgPSB0b3RhbERlbGF5O1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmNvbnN0IGdldERlbGF5RnJvbVJldHJ5QWZ0ZXJIZWFkZXIgPSAocmVzcG9uc2UpID0+IHtcbiAgICBpZiAoIUh0dHBSZXNwb25zZS5pc0luc3RhbmNlKHJlc3BvbnNlKSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHJldHJ5QWZ0ZXJIZWFkZXJOYW1lID0gT2JqZWN0LmtleXMocmVzcG9uc2UuaGVhZGVycykuZmluZCgoa2V5KSA9PiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gXCJyZXRyeS1hZnRlclwiKTtcbiAgICBpZiAoIXJldHJ5QWZ0ZXJIZWFkZXJOYW1lKVxuICAgICAgICByZXR1cm47XG4gICAgY29uc3QgcmV0cnlBZnRlciA9IHJlc3BvbnNlLmhlYWRlcnNbcmV0cnlBZnRlckhlYWRlck5hbWVdO1xuICAgIGNvbnN0IHJldHJ5QWZ0ZXJTZWNvbmRzID0gTnVtYmVyKHJldHJ5QWZ0ZXIpO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKHJldHJ5QWZ0ZXJTZWNvbmRzKSlcbiAgICAgICAgcmV0dXJuIHJldHJ5QWZ0ZXJTZWNvbmRzICogMTAwMDtcbiAgICBjb25zdCByZXRyeUFmdGVyRGF0ZSA9IG5ldyBEYXRlKHJldHJ5QWZ0ZXIpO1xuICAgIHJldHVybiByZXRyeUFmdGVyRGF0ZS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpO1xufTtcbiIsImltcG9ydCB7IERlZmF1bHRSYXRlTGltaXRlciwgUkVUUllfTU9ERVMgfSBmcm9tIFwiQHNtaXRoeS91dGlsLXJldHJ5XCI7XG5pbXBvcnQgeyBTdGFuZGFyZFJldHJ5U3RyYXRlZ3kgfSBmcm9tIFwiLi9TdGFuZGFyZFJldHJ5U3RyYXRlZ3lcIjtcbmV4cG9ydCBjbGFzcyBBZGFwdGl2ZVJldHJ5U3RyYXRlZ3kgZXh0ZW5kcyBTdGFuZGFyZFJldHJ5U3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKG1heEF0dGVtcHRzUHJvdmlkZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyByYXRlTGltaXRlciwgLi4uc3VwZXJPcHRpb25zIH0gPSBvcHRpb25zID8/IHt9O1xuICAgICAgICBzdXBlcihtYXhBdHRlbXB0c1Byb3ZpZGVyLCBzdXBlck9wdGlvbnMpO1xuICAgICAgICB0aGlzLnJhdGVMaW1pdGVyID0gcmF0ZUxpbWl0ZXIgPz8gbmV3IERlZmF1bHRSYXRlTGltaXRlcigpO1xuICAgICAgICB0aGlzLm1vZGUgPSBSRVRSWV9NT0RFUy5BREFQVElWRTtcbiAgICB9XG4gICAgYXN5bmMgcmV0cnkobmV4dCwgYXJncykge1xuICAgICAgICByZXR1cm4gc3VwZXIucmV0cnkobmV4dCwgYXJncywge1xuICAgICAgICAgICAgYmVmb3JlUmVxdWVzdDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJhdGVMaW1pdGVyLmdldFNlbmRUb2tlbigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFmdGVyUmVxdWVzdDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yYXRlTGltaXRlci51cGRhdGVDbGllbnRTZW5kaW5nUmF0ZShyZXNwb25zZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBub3JtYWxpemVQcm92aWRlciB9IGZyb20gXCJAc21pdGh5L3V0aWwtbWlkZGxld2FyZVwiO1xuaW1wb3J0IHsgQWRhcHRpdmVSZXRyeVN0cmF0ZWd5LCBERUZBVUxUX01BWF9BVFRFTVBUUywgREVGQVVMVF9SRVRSWV9NT0RFLCBSRVRSWV9NT0RFUywgU3RhbmRhcmRSZXRyeVN0cmF0ZWd5LCB9IGZyb20gXCJAc21pdGh5L3V0aWwtcmV0cnlcIjtcbmV4cG9ydCBjb25zdCBFTlZfTUFYX0FUVEVNUFRTID0gXCJBV1NfTUFYX0FUVEVNUFRTXCI7XG5leHBvcnQgY29uc3QgQ09ORklHX01BWF9BVFRFTVBUUyA9IFwibWF4X2F0dGVtcHRzXCI7XG5leHBvcnQgY29uc3QgTk9ERV9NQVhfQVRURU1QVF9DT05GSUdfT1BUSU9OUyA9IHtcbiAgICBlbnZpcm9ubWVudFZhcmlhYmxlU2VsZWN0b3I6IChlbnYpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBlbnZbRU5WX01BWF9BVFRFTVBUU107XG4gICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBtYXhBdHRlbXB0ID0gcGFyc2VJbnQodmFsdWUpO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKG1heEF0dGVtcHQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudmlyb25tZW50IHZhcmlhYmxlICR7RU5WX01BWF9BVFRFTVBUU30gbWFzdCBiZSBhIG51bWJlciwgZ290IFwiJHt2YWx1ZX1cImApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXhBdHRlbXB0O1xuICAgIH0sXG4gICAgY29uZmlnRmlsZVNlbGVjdG9yOiAocHJvZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHByb2ZpbGVbQ09ORklHX01BWF9BVFRFTVBUU107XG4gICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBtYXhBdHRlbXB0ID0gcGFyc2VJbnQodmFsdWUpO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKG1heEF0dGVtcHQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNoYXJlZCBjb25maWcgZmlsZSBlbnRyeSAke0NPTkZJR19NQVhfQVRURU1QVFN9IG1hc3QgYmUgYSBudW1iZXIsIGdvdCBcIiR7dmFsdWV9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4QXR0ZW1wdDtcbiAgICB9LFxuICAgIGRlZmF1bHQ6IERFRkFVTFRfTUFYX0FUVEVNUFRTLFxufTtcbmV4cG9ydCBjb25zdCByZXNvbHZlUmV0cnlDb25maWcgPSAoaW5wdXQpID0+IHtcbiAgICBjb25zdCB7IHJldHJ5U3RyYXRlZ3kgfSA9IGlucHV0O1xuICAgIGNvbnN0IG1heEF0dGVtcHRzID0gbm9ybWFsaXplUHJvdmlkZXIoaW5wdXQubWF4QXR0ZW1wdHMgPz8gREVGQVVMVF9NQVhfQVRURU1QVFMpO1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlucHV0LFxuICAgICAgICBtYXhBdHRlbXB0cyxcbiAgICAgICAgcmV0cnlTdHJhdGVneTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJldHJ5U3RyYXRlZ3kpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0cnlTdHJhdGVneTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJldHJ5TW9kZSA9IGF3YWl0IG5vcm1hbGl6ZVByb3ZpZGVyKGlucHV0LnJldHJ5TW9kZSkoKTtcbiAgICAgICAgICAgIGlmIChyZXRyeU1vZGUgPT09IFJFVFJZX01PREVTLkFEQVBUSVZFKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGFwdGl2ZVJldHJ5U3RyYXRlZ3kobWF4QXR0ZW1wdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGFuZGFyZFJldHJ5U3RyYXRlZ3kobWF4QXR0ZW1wdHMpO1xuICAgICAgICB9LFxuICAgIH07XG59O1xuZXhwb3J0IGNvbnN0IEVOVl9SRVRSWV9NT0RFID0gXCJBV1NfUkVUUllfTU9ERVwiO1xuZXhwb3J0IGNvbnN0IENPTkZJR19SRVRSWV9NT0RFID0gXCJyZXRyeV9tb2RlXCI7XG5leHBvcnQgY29uc3QgTk9ERV9SRVRSWV9NT0RFX0NPTkZJR19PUFRJT05TID0ge1xuICAgIGVudmlyb25tZW50VmFyaWFibGVTZWxlY3RvcjogKGVudikgPT4gZW52W0VOVl9SRVRSWV9NT0RFXSxcbiAgICBjb25maWdGaWxlU2VsZWN0b3I6IChwcm9maWxlKSA9PiBwcm9maWxlW0NPTkZJR19SRVRSWV9NT0RFXSxcbiAgICBkZWZhdWx0OiBERUZBVUxUX1JFVFJZX01PREUsXG59O1xuIiwiaW1wb3J0IHsgSHR0cFJlcXVlc3QgfSBmcm9tIFwiQHNtaXRoeS9wcm90b2NvbC1odHRwXCI7XG5pbXBvcnQgeyBJTlZPQ0FUSU9OX0lEX0hFQURFUiwgUkVRVUVTVF9IRUFERVIgfSBmcm9tIFwiQHNtaXRoeS91dGlsLXJldHJ5XCI7XG5leHBvcnQgY29uc3Qgb21pdFJldHJ5SGVhZGVyc01pZGRsZXdhcmUgPSAoKSA9PiAobmV4dCkgPT4gYXN5bmMgKGFyZ3MpID0+IHtcbiAgICBjb25zdCB7IHJlcXVlc3QgfSA9IGFyZ3M7XG4gICAgaWYgKEh0dHBSZXF1ZXN0LmlzSW5zdGFuY2UocmVxdWVzdCkpIHtcbiAgICAgICAgZGVsZXRlIHJlcXVlc3QuaGVhZGVyc1tJTlZPQ0FUSU9OX0lEX0hFQURFUl07XG4gICAgICAgIGRlbGV0ZSByZXF1ZXN0LmhlYWRlcnNbUkVRVUVTVF9IRUFERVJdO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dChhcmdzKTtcbn07XG5leHBvcnQgY29uc3Qgb21pdFJldHJ5SGVhZGVyc01pZGRsZXdhcmVPcHRpb25zID0ge1xuICAgIG5hbWU6IFwib21pdFJldHJ5SGVhZGVyc01pZGRsZXdhcmVcIixcbiAgICB0YWdzOiBbXCJSRVRSWVwiLCBcIkhFQURFUlNcIiwgXCJPTUlUX1JFVFJZX0hFQURFUlNcIl0sXG4gICAgcmVsYXRpb246IFwiYmVmb3JlXCIsXG4gICAgdG9NaWRkbGV3YXJlOiBcImF3c0F1dGhNaWRkbGV3YXJlXCIsXG4gICAgb3ZlcnJpZGU6IHRydWUsXG59O1xuZXhwb3J0IGNvbnN0IGdldE9taXRSZXRyeUhlYWRlcnNQbHVnaW4gPSAob3B0aW9ucykgPT4gKHtcbiAgICBhcHBseVRvU3RhY2s6IChjbGllbnRTdGFjaykgPT4ge1xuICAgICAgICBjbGllbnRTdGFjay5hZGRSZWxhdGl2ZVRvKG9taXRSZXRyeUhlYWRlcnNNaWRkbGV3YXJlKCksIG9taXRSZXRyeUhlYWRlcnNNaWRkbGV3YXJlT3B0aW9ucyk7XG4gICAgfSxcbn0pO1xuIiwiY29uc3QgcmFuZG9tVVVJRCA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEICYmIGNyeXB0by5yYW5kb21VVUlELmJpbmQoY3J5cHRvKTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgcmFuZG9tVVVJRFxufTsiLCIvLyBVbmlxdWUgSUQgY3JlYXRpb24gcmVxdWlyZXMgYSBoaWdoIHF1YWxpdHkgcmFuZG9tICMgZ2VuZXJhdG9yLiBJbiB0aGUgYnJvd3NlciB3ZSB0aGVyZWZvcmVcbi8vIHJlcXVpcmUgdGhlIGNyeXB0byBBUEkgYW5kIGRvIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGZhbGxiYWNrIHRvIGxvd2VyIHF1YWxpdHkgcmFuZG9tIG51bWJlclxuLy8gZ2VuZXJhdG9ycyAobGlrZSBNYXRoLnJhbmRvbSgpKS5cbmxldCBnZXRSYW5kb21WYWx1ZXM7XG5jb25zdCBybmRzOCA9IG5ldyBVaW50OEFycmF5KDE2KTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJuZygpIHtcbiAgLy8gbGF6eSBsb2FkIHNvIHRoYXQgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBwb2x5ZmlsbCBoYXZlIGEgY2hhbmNlIHRvIGRvIHNvXG4gIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gZ2V0UmFuZG9tVmFsdWVzIG5lZWRzIHRvIGJlIGludm9rZWQgaW4gYSBjb250ZXh0IHdoZXJlIFwidGhpc1wiIGlzIGEgQ3J5cHRvIGltcGxlbWVudGF0aW9uLlxuICAgIGdldFJhbmRvbVZhbHVlcyA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xuXG5jb25zdCBieXRlVG9IZXggPSBbXTtcblxuZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICBieXRlVG9IZXgucHVzaCgoaSArIDB4MTAwKS50b1N0cmluZygxNikuc2xpY2UoMSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5zYWZlU3RyaW5naWZ5KGFyciwgb2Zmc2V0ID0gMCkge1xuICAvLyBOb3RlOiBCZSBjYXJlZnVsIGVkaXRpbmcgdGhpcyBjb2RlISAgSXQncyBiZWVuIHR1bmVkIGZvciBwZXJmb3JtYW5jZVxuICAvLyBhbmQgd29ya3MgaW4gd2F5cyB5b3UgbWF5IG5vdCBleHBlY3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQvcHVsbC80MzRcbiAgcmV0dXJuIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnkoYXJyLCBvZmZzZXQgPSAwKSB7XG4gIGNvbnN0IHV1aWQgPSB1bnNhZmVTdHJpbmdpZnkoYXJyLCBvZmZzZXQpOyAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG5cbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICByZXR1cm4gdXVpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaW5naWZ5OyIsImltcG9ydCBuYXRpdmUgZnJvbSAnLi9uYXRpdmUuanMnO1xuaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVTdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIGlmIChuYXRpdmUucmFuZG9tVVVJRCAmJiAhYnVmICYmICFvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5hdGl2ZS5yYW5kb21VVUlEKCk7XG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgY29uc3Qgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7IC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcblxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwOyAvLyBDb3B5IGJ5dGVzIHRvIGJ1ZmZlciwgaWYgcHJvdmlkZWRcblxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIHJldHVybiB1bnNhZmVTdHJpbmdpZnkocm5kcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHY0OyIsImV4cG9ydCBjb25zdCBpc1N0cmVhbWluZ1BheWxvYWQgPSAocmVxdWVzdCkgPT4gcmVxdWVzdD8uYm9keSBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtO1xuIiwiZXhwb3J0IGNvbnN0IGFzU2RrRXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcilcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCksIGVycm9yKTtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiKVxuICAgICAgICByZXR1cm4gbmV3IEVycm9yKGVycm9yKTtcbiAgICByZXR1cm4gbmV3IEVycm9yKGBBV1MgU0RLIGVycm9yIHdyYXBwZXIgZm9yICR7ZXJyb3J9YCk7XG59O1xuIiwiaW1wb3J0IHsgSHR0cFJlcXVlc3QsIEh0dHBSZXNwb25zZSB9IGZyb20gXCJAc21pdGh5L3Byb3RvY29sLWh0dHBcIjtcbmltcG9ydCB7IGlzU2VydmVyRXJyb3IsIGlzVGhyb3R0bGluZ0Vycm9yLCBpc1RyYW5zaWVudEVycm9yIH0gZnJvbSBcIkBzbWl0aHkvc2VydmljZS1lcnJvci1jbGFzc2lmaWNhdGlvblwiO1xuaW1wb3J0IHsgTm9PcExvZ2dlciB9IGZyb20gXCJAc21pdGh5L3NtaXRoeS1jbGllbnRcIjtcbmltcG9ydCB7IElOVk9DQVRJT05fSURfSEVBREVSLCBSRVFVRVNUX0hFQURFUiB9IGZyb20gXCJAc21pdGh5L3V0aWwtcmV0cnlcIjtcbmltcG9ydCB7IHY0IH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB7IGlzU3RyZWFtaW5nUGF5bG9hZCB9IGZyb20gXCIuL2lzU3RyZWFtaW5nUGF5bG9hZC9pc1N0cmVhbWluZ1BheWxvYWRcIjtcbmltcG9ydCB7IGFzU2RrRXJyb3IgfSBmcm9tIFwiLi91dGlsXCI7XG5leHBvcnQgY29uc3QgcmV0cnlNaWRkbGV3YXJlID0gKG9wdGlvbnMpID0+IChuZXh0LCBjb250ZXh0KSA9PiBhc3luYyAoYXJncykgPT4ge1xuICAgIGxldCByZXRyeVN0cmF0ZWd5ID0gYXdhaXQgb3B0aW9ucy5yZXRyeVN0cmF0ZWd5KCk7XG4gICAgY29uc3QgbWF4QXR0ZW1wdHMgPSBhd2FpdCBvcHRpb25zLm1heEF0dGVtcHRzKCk7XG4gICAgaWYgKGlzUmV0cnlTdHJhdGVneVYyKHJldHJ5U3RyYXRlZ3kpKSB7XG4gICAgICAgIHJldHJ5U3RyYXRlZ3kgPSByZXRyeVN0cmF0ZWd5O1xuICAgICAgICBsZXQgcmV0cnlUb2tlbiA9IGF3YWl0IHJldHJ5U3RyYXRlZ3kuYWNxdWlyZUluaXRpYWxSZXRyeVRva2VuKGNvbnRleHRbXCJwYXJ0aXRpb25faWRcIl0pO1xuICAgICAgICBsZXQgbGFzdEVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgICAgIGxldCBhdHRlbXB0cyA9IDA7XG4gICAgICAgIGxldCB0b3RhbFJldHJ5RGVsYXkgPSAwO1xuICAgICAgICBjb25zdCB7IHJlcXVlc3QgfSA9IGFyZ3M7XG4gICAgICAgIGNvbnN0IGlzUmVxdWVzdCA9IEh0dHBSZXF1ZXN0LmlzSW5zdGFuY2UocmVxdWVzdCk7XG4gICAgICAgIGlmIChpc1JlcXVlc3QpIHtcbiAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVyc1tJTlZPQ0FUSU9OX0lEX0hFQURFUl0gPSB2NCgpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChpc1JlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzW1JFUVVFU1RfSEVBREVSXSA9IGBhdHRlbXB0PSR7YXR0ZW1wdHMgKyAxfTsgbWF4PSR7bWF4QXR0ZW1wdHN9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeyByZXNwb25zZSwgb3V0cHV0IH0gPSBhd2FpdCBuZXh0KGFyZ3MpO1xuICAgICAgICAgICAgICAgIHJldHJ5U3RyYXRlZ3kucmVjb3JkU3VjY2VzcyhyZXRyeVRva2VuKTtcbiAgICAgICAgICAgICAgICBvdXRwdXQuJG1ldGFkYXRhLmF0dGVtcHRzID0gYXR0ZW1wdHMgKyAxO1xuICAgICAgICAgICAgICAgIG91dHB1dC4kbWV0YWRhdGEudG90YWxSZXRyeURlbGF5ID0gdG90YWxSZXRyeURlbGF5O1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJlc3BvbnNlLCBvdXRwdXQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0cnlFcnJvckluZm8gPSBnZXRSZXRyeUVycm9ySW5mbyhlKTtcbiAgICAgICAgICAgICAgICBsYXN0RXJyb3IgPSBhc1Nka0Vycm9yKGUpO1xuICAgICAgICAgICAgICAgIGlmIChpc1JlcXVlc3QgJiYgaXNTdHJlYW1pbmdQYXlsb2FkKHJlcXVlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIChjb250ZXh0LmxvZ2dlciBpbnN0YW5jZW9mIE5vT3BMb2dnZXIgPyBjb25zb2xlIDogY29udGV4dC5sb2dnZXIpPy53YXJuKFwiQW4gZXJyb3Igd2FzIGVuY291bnRlcmVkIGluIGEgbm9uLXJldHJ5YWJsZSBzdHJlYW1pbmcgcmVxdWVzdC5cIik7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGxhc3RFcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cnlUb2tlbiA9IGF3YWl0IHJldHJ5U3RyYXRlZ3kucmVmcmVzaFJldHJ5VG9rZW5Gb3JSZXRyeShyZXRyeVRva2VuLCByZXRyeUVycm9ySW5mbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChyZWZyZXNoRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXN0RXJyb3IuJG1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0RXJyb3IuJG1ldGFkYXRhID0ge307XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGFzdEVycm9yLiRtZXRhZGF0YS5hdHRlbXB0cyA9IGF0dGVtcHRzICsgMTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdEVycm9yLiRtZXRhZGF0YS50b3RhbFJldHJ5RGVsYXkgPSB0b3RhbFJldHJ5RGVsYXk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGxhc3RFcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXR0ZW1wdHMgPSByZXRyeVRva2VuLmdldFJldHJ5Q291bnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWxheSA9IHJldHJ5VG9rZW4uZ2V0UmV0cnlEZWxheSgpO1xuICAgICAgICAgICAgICAgIHRvdGFsUmV0cnlEZWxheSArPSBkZWxheTtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXRyeVN0cmF0ZWd5ID0gcmV0cnlTdHJhdGVneTtcbiAgICAgICAgaWYgKHJldHJ5U3RyYXRlZ3k/Lm1vZGUpXG4gICAgICAgICAgICBjb250ZXh0LnVzZXJBZ2VudCA9IFsuLi4oY29udGV4dC51c2VyQWdlbnQgfHwgW10pLCBbXCJjZmcvcmV0cnktbW9kZVwiLCByZXRyeVN0cmF0ZWd5Lm1vZGVdXTtcbiAgICAgICAgcmV0dXJuIHJldHJ5U3RyYXRlZ3kucmV0cnkobmV4dCwgYXJncyk7XG4gICAgfVxufTtcbmNvbnN0IGlzUmV0cnlTdHJhdGVneVYyID0gKHJldHJ5U3RyYXRlZ3kpID0+IHR5cGVvZiByZXRyeVN0cmF0ZWd5LmFjcXVpcmVJbml0aWFsUmV0cnlUb2tlbiAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHR5cGVvZiByZXRyeVN0cmF0ZWd5LnJlZnJlc2hSZXRyeVRva2VuRm9yUmV0cnkgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICB0eXBlb2YgcmV0cnlTdHJhdGVneS5yZWNvcmRTdWNjZXNzICE9PSBcInVuZGVmaW5lZFwiO1xuY29uc3QgZ2V0UmV0cnlFcnJvckluZm8gPSAoZXJyb3IpID0+IHtcbiAgICBjb25zdCBlcnJvckluZm8gPSB7XG4gICAgICAgIGVycm9yLFxuICAgICAgICBlcnJvclR5cGU6IGdldFJldHJ5RXJyb3JUeXBlKGVycm9yKSxcbiAgICB9O1xuICAgIGNvbnN0IHJldHJ5QWZ0ZXJIaW50ID0gZ2V0UmV0cnlBZnRlckhpbnQoZXJyb3IuJHJlc3BvbnNlKTtcbiAgICBpZiAocmV0cnlBZnRlckhpbnQpIHtcbiAgICAgICAgZXJyb3JJbmZvLnJldHJ5QWZ0ZXJIaW50ID0gcmV0cnlBZnRlckhpbnQ7XG4gICAgfVxuICAgIHJldHVybiBlcnJvckluZm87XG59O1xuY29uc3QgZ2V0UmV0cnlFcnJvclR5cGUgPSAoZXJyb3IpID0+IHtcbiAgICBpZiAoaXNUaHJvdHRsaW5nRXJyb3IoZXJyb3IpKVxuICAgICAgICByZXR1cm4gXCJUSFJPVFRMSU5HXCI7XG4gICAgaWYgKGlzVHJhbnNpZW50RXJyb3IoZXJyb3IpKVxuICAgICAgICByZXR1cm4gXCJUUkFOU0lFTlRcIjtcbiAgICBpZiAoaXNTZXJ2ZXJFcnJvcihlcnJvcikpXG4gICAgICAgIHJldHVybiBcIlNFUlZFUl9FUlJPUlwiO1xuICAgIHJldHVybiBcIkNMSUVOVF9FUlJPUlwiO1xufTtcbmV4cG9ydCBjb25zdCByZXRyeU1pZGRsZXdhcmVPcHRpb25zID0ge1xuICAgIG5hbWU6IFwicmV0cnlNaWRkbGV3YXJlXCIsXG4gICAgdGFnczogW1wiUkVUUllcIl0sXG4gICAgc3RlcDogXCJmaW5hbGl6ZVJlcXVlc3RcIixcbiAgICBwcmlvcml0eTogXCJoaWdoXCIsXG4gICAgb3ZlcnJpZGU6IHRydWUsXG59O1xuZXhwb3J0IGNvbnN0IGdldFJldHJ5UGx1Z2luID0gKG9wdGlvbnMpID0+ICh7XG4gICAgYXBwbHlUb1N0YWNrOiAoY2xpZW50U3RhY2spID0+IHtcbiAgICAgICAgY2xpZW50U3RhY2suYWRkKHJldHJ5TWlkZGxld2FyZShvcHRpb25zKSwgcmV0cnlNaWRkbGV3YXJlT3B0aW9ucyk7XG4gICAgfSxcbn0pO1xuZXhwb3J0IGNvbnN0IGdldFJldHJ5QWZ0ZXJIaW50ID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKCFIdHRwUmVzcG9uc2UuaXNJbnN0YW5jZShyZXNwb25zZSkpXG4gICAgICAgIHJldHVybjtcbiAgICBjb25zdCByZXRyeUFmdGVySGVhZGVyTmFtZSA9IE9iamVjdC5rZXlzKHJlc3BvbnNlLmhlYWRlcnMpLmZpbmQoKGtleSkgPT4ga2V5LnRvTG93ZXJDYXNlKCkgPT09IFwicmV0cnktYWZ0ZXJcIik7XG4gICAgaWYgKCFyZXRyeUFmdGVySGVhZGVyTmFtZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSByZXNwb25zZS5oZWFkZXJzW3JldHJ5QWZ0ZXJIZWFkZXJOYW1lXTtcbiAgICBjb25zdCByZXRyeUFmdGVyU2Vjb25kcyA9IE51bWJlcihyZXRyeUFmdGVyKTtcbiAgICBpZiAoIU51bWJlci5pc05hTihyZXRyeUFmdGVyU2Vjb25kcykpXG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShyZXRyeUFmdGVyU2Vjb25kcyAqIDEwMDApO1xuICAgIGNvbnN0IHJldHJ5QWZ0ZXJEYXRlID0gbmV3IERhdGUocmV0cnlBZnRlcik7XG4gICAgcmV0dXJuIHJldHJ5QWZ0ZXJEYXRlO1xufTtcbiIsImV4cG9ydCAqIGZyb20gXCIuL0FkYXB0aXZlUmV0cnlTdHJhdGVneVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vU3RhbmRhcmRSZXRyeVN0cmF0ZWd5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25maWd1cmF0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVsYXlEZWNpZGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vbWl0UmV0cnlIZWFkZXJzTWlkZGxld2FyZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmV0cnlEZWNpZGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXRyeU1pZGRsZXdhcmVcIjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== //# sourceURL=webpack-internal:///260