HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers10/base.komma.pro/wwwroot/js/app.js
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["/js/app"],{

/***/ "./node_modules/@sentry/browser/esm/backend.js":
/*!*****************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/backend.js ***!
  \*****************************************************/
/*! exports provided: BrowserBackend */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BrowserBackend", function() { return BrowserBackend; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _eventbuilder__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./eventbuilder */ "./node_modules/@sentry/browser/esm/eventbuilder.js");
/* harmony import */ var _transports__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./transports */ "./node_modules/@sentry/browser/esm/transports/index.js");






/**
 * The Sentry Browser SDK Backend.
 * @hidden
 */
var BrowserBackend = /** @class */ (function (_super) {
    tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BrowserBackend, _super);
    function BrowserBackend() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    /**
     * @inheritDoc
     */
    BrowserBackend.prototype._setupTransport = function () {
        if (!this._options.dsn) {
            // We return the noop transport here in case there is no Dsn.
            return _super.prototype._setupTransport.call(this);
        }
        var transportOptions = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._options.transportOptions, { dsn: this._options.dsn });
        if (this._options.transport) {
            return new this._options.transport(transportOptions);
        }
        if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["supportsFetch"])()) {
            return new _transports__WEBPACK_IMPORTED_MODULE_5__["FetchTransport"](transportOptions);
        }
        return new _transports__WEBPACK_IMPORTED_MODULE_5__["XHRTransport"](transportOptions);
    };
    /**
     * @inheritDoc
     */
    BrowserBackend.prototype.eventFromException = function (exception, hint) {
        var syntheticException = (hint && hint.syntheticException) || undefined;
        var event = Object(_eventbuilder__WEBPACK_IMPORTED_MODULE_4__["eventFromUnknownInput"])(exception, syntheticException, {
            attachStacktrace: this._options.attachStacktrace,
        });
        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addExceptionMechanism"])(event, {
            handled: true,
            type: 'generic',
        });
        event.level = _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Severity"].Error;
        if (hint && hint.event_id) {
            event.event_id = hint.event_id;
        }
        return _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["SyncPromise"].resolve(event);
    };
    /**
     * @inheritDoc
     */
    BrowserBackend.prototype.eventFromMessage = function (message, level, hint) {
        if (level === void 0) { level = _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Severity"].Info; }
        var syntheticException = (hint && hint.syntheticException) || undefined;
        var event = Object(_eventbuilder__WEBPACK_IMPORTED_MODULE_4__["eventFromString"])(message, syntheticException, {
            attachStacktrace: this._options.attachStacktrace,
        });
        event.level = level;
        if (hint && hint.event_id) {
            event.event_id = hint.event_id;
        }
        return _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["SyncPromise"].resolve(event);
    };
    return BrowserBackend;
}(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["BaseBackend"]));

//# sourceMappingURL=backend.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/client.js":
/*!****************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/client.js ***!
  \****************************************************/
/*! exports provided: BrowserClient */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BrowserClient", function() { return BrowserClient; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./backend */ "./node_modules/@sentry/browser/esm/backend.js");
/* harmony import */ var _integrations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./integrations */ "./node_modules/@sentry/browser/esm/integrations/index.js");
/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./version */ "./node_modules/@sentry/browser/esm/version.js");






/**
 * The Sentry Browser SDK Client.
 *
 * @see BrowserOptions for documentation on configuration options.
 * @see SentryClient for usage documentation.
 */
var BrowserClient = /** @class */ (function (_super) {
    tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BrowserClient, _super);
    /**
     * Creates a new Browser SDK instance.
     *
     * @param options Configuration options for this SDK.
     */
    function BrowserClient(options) {
        if (options === void 0) { options = {}; }
        return _super.call(this, _backend__WEBPACK_IMPORTED_MODULE_3__["BrowserBackend"], options) || this;
    }
    /**
     * @inheritDoc
     */
    BrowserClient.prototype._prepareEvent = function (event, scope, hint) {
        event.platform = event.platform || 'javascript';
        event.sdk = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event.sdk, { name: _version__WEBPACK_IMPORTED_MODULE_5__["SDK_NAME"], packages: tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](((event.sdk && event.sdk.packages) || []), [
                {
                    name: 'npm:@sentry/browser',
                    version: _version__WEBPACK_IMPORTED_MODULE_5__["SDK_VERSION"],
                },
            ]), version: _version__WEBPACK_IMPORTED_MODULE_5__["SDK_VERSION"] });
        return _super.prototype._prepareEvent.call(this, event, scope, hint);
    };
    /**
     * @inheritDoc
     */
    BrowserClient.prototype._sendEvent = function (event) {
        var integration = this.getIntegration(_integrations__WEBPACK_IMPORTED_MODULE_4__["Breadcrumbs"]);
        if (integration) {
            integration.addSentryBreadcrumb(event);
        }
        _super.prototype._sendEvent.call(this, event);
    };
    /**
     * Show a report dialog to the user to send feedback to a specific event.
     *
     * @param options Set individual options for the dialog
     */
    BrowserClient.prototype.showReportDialog = function (options) {
        if (options === void 0) { options = {}; }
        // doesn't work without a document (React Native)
        var document = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getGlobalObject"])().document;
        if (!document) {
            return;
        }
        if (!this._isEnabled()) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error('Trying to call showReportDialog with Sentry Client is disabled');
            return;
        }
        var dsn = options.dsn || this.getDsn();
        if (!options.eventId) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error('Missing `eventId` option in showReportDialog call');
            return;
        }
        if (!dsn) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error('Missing `Dsn` option in showReportDialog call');
            return;
        }
        var script = document.createElement('script');
        script.async = true;
        script.src = new _sentry_core__WEBPACK_IMPORTED_MODULE_1__["API"](dsn).getReportDialogEndpoint(options);
        if (options.onLoad) {
            script.onload = options.onLoad;
        }
        (document.head || document.body).appendChild(script);
    };
    return BrowserClient;
}(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["BaseClient"]));

//# sourceMappingURL=client.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/eventbuilder.js":
/*!**********************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/eventbuilder.js ***!
  \**********************************************************/
/*! exports provided: eventFromUnknownInput, eventFromString */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eventFromUnknownInput", function() { return eventFromUnknownInput; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eventFromString", function() { return eventFromString; });
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _parsers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./parsers */ "./node_modules/@sentry/browser/esm/parsers.js");
/* harmony import */ var _tracekit__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tracekit */ "./node_modules/@sentry/browser/esm/tracekit.js");



/** JSDoc */
function eventFromUnknownInput(exception, syntheticException, options) {
    if (options === void 0) { options = {}; }
    var event;
    if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isErrorEvent"])(exception) && exception.error) {
        // If it is an ErrorEvent with `error` property, extract it to get actual Error
        var errorEvent = exception;
        exception = errorEvent.error; // tslint:disable-line:no-parameter-reassignment
        event = Object(_parsers__WEBPACK_IMPORTED_MODULE_1__["eventFromStacktrace"])(Object(_tracekit__WEBPACK_IMPORTED_MODULE_2__["computeStackTrace"])(exception));
        return event;
    }
    if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isDOMError"])(exception) || Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isDOMException"])(exception)) {
        // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)
        // then we just extract the name and message, as they don't provide anything else
        // https://developer.mozilla.org/en-US/docs/Web/API/DOMError
        // https://developer.mozilla.org/en-US/docs/Web/API/DOMException
        var domException = exception;
        var name_1 = domException.name || (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isDOMError"])(domException) ? 'DOMError' : 'DOMException');
        var message = domException.message ? name_1 + ": " + domException.message : name_1;
        event = eventFromString(message, syntheticException, options);
        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["addExceptionTypeValue"])(event, message);
        return event;
    }
    if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isError"])(exception)) {
        // we have a real Error object, do nothing
        event = Object(_parsers__WEBPACK_IMPORTED_MODULE_1__["eventFromStacktrace"])(Object(_tracekit__WEBPACK_IMPORTED_MODULE_2__["computeStackTrace"])(exception));
        return event;
    }
    if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isPlainObject"])(exception) || Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isEvent"])(exception)) {
        // If it is plain Object or Event, serialize it manually and extract options
        // This will allow us to group events based on top-level keys
        // which is much better than creating new group when any key/value change
        var objectException = exception;
        event = Object(_parsers__WEBPACK_IMPORTED_MODULE_1__["eventFromPlainObject"])(objectException, syntheticException, options.rejection);
        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["addExceptionMechanism"])(event, {
            synthetic: true,
        });
        return event;
    }
    // If none of previous checks were valid, then it means that it's not:
    // - an instance of DOMError
    // - an instance of DOMException
    // - an instance of Event
    // - an instance of Error
    // - a valid ErrorEvent (one with an error property)
    // - a plain Object
    //
    // So bail out and capture it as a simple message:
    event = eventFromString(exception, syntheticException, options);
    Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["addExceptionTypeValue"])(event, "" + exception, undefined);
    Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["addExceptionMechanism"])(event, {
        synthetic: true,
    });
    return event;
}
// this._options.attachStacktrace
/** JSDoc */
function eventFromString(input, syntheticException, options) {
    if (options === void 0) { options = {}; }
    var event = {
        message: input,
    };
    if (options.attachStacktrace && syntheticException) {
        var stacktrace = Object(_tracekit__WEBPACK_IMPORTED_MODULE_2__["computeStackTrace"])(syntheticException);
        var frames_1 = Object(_parsers__WEBPACK_IMPORTED_MODULE_1__["prepareFramesForEvent"])(stacktrace.stack);
        event.stacktrace = {
            frames: frames_1,
        };
    }
    return event;
}
//# sourceMappingURL=eventbuilder.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/exports.js":
/*!*****************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/exports.js ***!
  \*****************************************************/
/*! exports provided: Severity, Status, addGlobalEventProcessor, addBreadcrumb, captureException, captureEvent, captureMessage, configureScope, getHubFromCarrier, getCurrentHub, Hub, Scope, startTransaction, setContext, setExtra, setExtras, setTag, setTags, setUser, withScope, BrowserClient, defaultIntegrations, forceLoad, init, lastEventId, onLoad, showReportDialog, flush, close, wrap, SDK_NAME, SDK_VERSION */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Severity", function() { return _sentry_types__WEBPACK_IMPORTED_MODULE_0__["Severity"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Status", function() { return _sentry_types__WEBPACK_IMPORTED_MODULE_0__["Status"]; });

/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addGlobalEventProcessor", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addBreadcrumb", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["addBreadcrumb"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureException", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["captureException"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureEvent", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["captureEvent"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureMessage", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["captureMessage"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "configureScope", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["configureScope"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getHubFromCarrier", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["getHubFromCarrier"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getCurrentHub", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Hub", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["Hub"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scope", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["Scope"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startTransaction", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["startTransaction"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setContext", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setContext"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtra", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setExtra"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtras", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setExtras"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTag", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setTag"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTags", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setTags"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setUser", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setUser"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withScope", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["withScope"]; });

/* harmony import */ var _client__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./client */ "./node_modules/@sentry/browser/esm/client.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BrowserClient", function() { return _client__WEBPACK_IMPORTED_MODULE_2__["BrowserClient"]; });

/* harmony import */ var _sdk__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdk */ "./node_modules/@sentry/browser/esm/sdk.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultIntegrations", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["defaultIntegrations"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceLoad", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["forceLoad"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "init", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["init"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lastEventId", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["lastEventId"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onLoad", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["onLoad"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "showReportDialog", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["showReportDialog"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flush", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["flush"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "close", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["close"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "wrap", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["wrap"]; });

/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./version */ "./node_modules/@sentry/browser/esm/version.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SDK_NAME", function() { return _version__WEBPACK_IMPORTED_MODULE_4__["SDK_NAME"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SDK_VERSION", function() { return _version__WEBPACK_IMPORTED_MODULE_4__["SDK_VERSION"]; });






//# sourceMappingURL=exports.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/helpers.js":
/*!*****************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/helpers.js ***!
  \*****************************************************/
/*! exports provided: shouldIgnoreOnError, ignoreNextOnError, wrap */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shouldIgnoreOnError", function() { return shouldIgnoreOnError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ignoreNextOnError", function() { return ignoreNextOnError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wrap", function() { return wrap; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");



var ignoreOnError = 0;
/**
 * @hidden
 */
function shouldIgnoreOnError() {
    return ignoreOnError > 0;
}
/**
 * @hidden
 */
function ignoreNextOnError() {
    // onerror should trigger before setTimeout
    ignoreOnError += 1;
    setTimeout(function () {
        ignoreOnError -= 1;
    });
}
/**
 * Instruments the given function and sends an event to Sentry every time the
 * function throws an exception.
 *
 * @param fn A function to wrap.
 * @returns The wrapped function.
 * @hidden
 */
function wrap(fn, options, before) {
    if (options === void 0) { options = {}; }
    // tslint:disable-next-line:strict-type-predicates
    if (typeof fn !== 'function') {
        return fn;
    }
    try {
        // We don't wanna wrap it twice
        if (fn.__sentry__) {
            return fn;
        }
        // If this has already been wrapped in the past, return that wrapped function
        if (fn.__sentry_wrapped__) {
            return fn.__sentry_wrapped__;
        }
    }
    catch (e) {
        // Just accessing custom props in some Selenium environments
        // can cause a "Permission denied" exception (see raven-js#495).
        // Bail on wrapping and return the function as-is (defers to window.onerror).
        return fn;
    }
    var sentryWrapped = function () {
        var args = Array.prototype.slice.call(arguments);
        // tslint:disable:no-unsafe-any
        try {
            // tslint:disable-next-line:strict-type-predicates
            if (before && typeof before === 'function') {
                before.apply(this, arguments);
            }
            var wrappedArguments = args.map(function (arg) { return wrap(arg, options); });
            if (fn.handleEvent) {
                // Attempt to invoke user-land function
                // NOTE: If you are a Sentry user, and you are seeing this stack frame, it
                //       means the sentry.javascript SDK caught an error invoking your application code. This
                //       is expected behavior and NOT indicative of a bug with sentry.javascript.
                return fn.handleEvent.apply(this, wrappedArguments);
            }
            // Attempt to invoke user-land function
            // NOTE: If you are a Sentry user, and you are seeing this stack frame, it
            //       means the sentry.javascript SDK caught an error invoking your application code. This
            //       is expected behavior and NOT indicative of a bug with sentry.javascript.
            return fn.apply(this, wrappedArguments);
            // tslint:enable:no-unsafe-any
        }
        catch (ex) {
            ignoreNextOnError();
            Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["withScope"])(function (scope) {
                scope.addEventProcessor(function (event) {
                    var processedEvent = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event);
                    if (options.mechanism) {
                        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["addExceptionTypeValue"])(processedEvent, undefined, undefined);
                        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["addExceptionMechanism"])(processedEvent, options.mechanism);
                    }
                    processedEvent.extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, processedEvent.extra, { arguments: args });
                    return processedEvent;
                });
                Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["captureException"])(ex);
            });
            throw ex;
        }
    };
    // Accessing some objects may throw
    // ref: https://github.com/getsentry/sentry-javascript/issues/1168
    try {
        for (var property in fn) {
            if (Object.prototype.hasOwnProperty.call(fn, property)) {
                sentryWrapped[property] = fn[property];
            }
        }
    }
    catch (_oO) { } // tslint:disable-line:no-empty
    fn.prototype = fn.prototype || {};
    sentryWrapped.prototype = fn.prototype;
    Object.defineProperty(fn, '__sentry_wrapped__', {
        enumerable: false,
        value: sentryWrapped,
    });
    // Signal that this function has been wrapped/filled already
    // for both debugging and to prevent it to being wrapped/filled twice
    Object.defineProperties(sentryWrapped, {
        __sentry__: {
            enumerable: false,
            value: true,
        },
        __sentry_original__: {
            enumerable: false,
            value: fn,
        },
    });
    // Restore original function name (not all browsers allow that)
    try {
        var descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name');
        if (descriptor.configurable) {
            Object.defineProperty(sentryWrapped, 'name', {
                get: function () {
                    return fn.name;
                },
            });
        }
    }
    catch (_oO) {
        /*no-empty*/
    }
    return sentryWrapped;
}
//# sourceMappingURL=helpers.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/index.js":
/*!***************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/index.js ***!
  \***************************************************/
/*! exports provided: Severity, Status, addGlobalEventProcessor, addBreadcrumb, captureException, captureEvent, captureMessage, configureScope, getHubFromCarrier, getCurrentHub, Hub, Scope, startTransaction, setContext, setExtra, setExtras, setTag, setTags, setUser, withScope, BrowserClient, defaultIntegrations, forceLoad, init, lastEventId, onLoad, showReportDialog, flush, close, wrap, SDK_NAME, SDK_VERSION, Integrations, Transports */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Integrations", function() { return INTEGRATIONS; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _exports__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./exports */ "./node_modules/@sentry/browser/esm/exports.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Severity", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["Severity"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Status", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["Status"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addGlobalEventProcessor", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addBreadcrumb", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["addBreadcrumb"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureException", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["captureException"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureEvent", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["captureEvent"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureMessage", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["captureMessage"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "configureScope", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["configureScope"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getHubFromCarrier", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["getHubFromCarrier"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getCurrentHub", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Hub", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["Hub"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scope", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["Scope"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startTransaction", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["startTransaction"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setContext", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setContext"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtra", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setExtra"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtras", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setExtras"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTag", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setTag"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTags", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setTags"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setUser", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setUser"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withScope", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["withScope"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BrowserClient", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["BrowserClient"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultIntegrations", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["defaultIntegrations"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceLoad", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["forceLoad"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "init", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["init"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lastEventId", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["lastEventId"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onLoad", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["onLoad"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "showReportDialog", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["showReportDialog"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flush", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["flush"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "close", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["close"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "wrap", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["wrap"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SDK_NAME", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["SDK_NAME"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SDK_VERSION", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["SDK_VERSION"]; });

/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _integrations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./integrations */ "./node_modules/@sentry/browser/esm/integrations/index.js");
/* harmony import */ var _transports__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./transports */ "./node_modules/@sentry/browser/esm/transports/index.js");
/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "Transports", function() { return _transports__WEBPACK_IMPORTED_MODULE_5__; });






var windowIntegrations = {};
// This block is needed to add compatibility with the integrations packages when used with a CDN
// tslint:disable: no-unsafe-any
var _window = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["getGlobalObject"])();
if (_window.Sentry && _window.Sentry.Integrations) {
    windowIntegrations = _window.Sentry.Integrations;
}
// tslint:enable: no-unsafe-any
var INTEGRATIONS = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, windowIntegrations, _sentry_core__WEBPACK_IMPORTED_MODULE_2__["Integrations"], _integrations__WEBPACK_IMPORTED_MODULE_4__);

//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/integrations/breadcrumbs.js":
/*!**********************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/integrations/breadcrumbs.js ***!
  \**********************************************************************/
/*! exports provided: Breadcrumbs */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Breadcrumbs", function() { return Breadcrumbs; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");




/**
 * Default Breadcrumbs instrumentations
 * TODO: Deprecated - with v6, this will be renamed to `Instrument`
 */
var Breadcrumbs = /** @class */ (function () {
    /**
     * @inheritDoc
     */
    function Breadcrumbs(options) {
        /**
         * @inheritDoc
         */
        this.name = Breadcrumbs.id;
        this._options = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ console: true, dom: true, fetch: true, history: true, sentry: true, xhr: true }, options);
    }
    /**
     * Create a breadcrumb of `sentry` from the events themselves
     */
    Breadcrumbs.prototype.addSentryBreadcrumb = function (event) {
        if (!this._options.sentry) {
            return;
        }
        Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
            category: "sentry." + (event.type === 'transaction' ? 'transaction' : 'event'),
            event_id: event.event_id,
            level: event.level,
            message: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["getEventDescription"])(event),
        }, {
            event: event,
        });
    };
    /**
     * Creates breadcrumbs from console API calls
     */
    Breadcrumbs.prototype._consoleBreadcrumb = function (handlerData) {
        var breadcrumb = {
            category: 'console',
            data: {
                arguments: handlerData.args,
                logger: 'console',
            },
            level: _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Severity"].fromString(handlerData.level),
            message: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["safeJoin"])(handlerData.args, ' '),
        };
        if (handlerData.level === 'assert') {
            if (handlerData.args[0] === false) {
                breadcrumb.message = "Assertion failed: " + (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["safeJoin"])(handlerData.args.slice(1), ' ') || 'console.assert');
                breadcrumb.data.arguments = handlerData.args.slice(1);
            }
            else {
                // Don't capture a breadcrumb for passed assertions
                return;
            }
        }
        Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb(breadcrumb, {
            input: handlerData.args,
            level: handlerData.level,
        });
    };
    /**
     * Creates breadcrumbs from DOM API calls
     */
    Breadcrumbs.prototype._domBreadcrumb = function (handlerData) {
        var target;
        // Accessing event.target can throw (see getsentry/raven-js#838, #768)
        try {
            target = handlerData.event.target
                ? Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["htmlTreeAsString"])(handlerData.event.target)
                : Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["htmlTreeAsString"])(handlerData.event);
        }
        catch (e) {
            target = '<unknown>';
        }
        if (target.length === 0) {
            return;
        }
        Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
            category: "ui." + handlerData.name,
            message: target,
        }, {
            event: handlerData.event,
            name: handlerData.name,
        });
    };
    /**
     * Creates breadcrumbs from XHR API calls
     */
    Breadcrumbs.prototype._xhrBreadcrumb = function (handlerData) {
        if (handlerData.endTimestamp) {
            // We only capture complete, non-sentry requests
            if (handlerData.xhr.__sentry_own_request__) {
                return;
            }
            Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
                category: 'xhr',
                data: handlerData.xhr.__sentry_xhr__,
                type: 'http',
            }, {
                xhr: handlerData.xhr,
            });
            return;
        }
    };
    /**
     * Creates breadcrumbs from fetch API calls
     */
    Breadcrumbs.prototype._fetchBreadcrumb = function (handlerData) {
        // We only capture complete fetch requests
        if (!handlerData.endTimestamp) {
            return;
        }
        if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {
            // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)
            return;
        }
        if (handlerData.error) {
            Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
                category: 'fetch',
                data: handlerData.fetchData,
                level: _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Severity"].Error,
                type: 'http',
            }, {
                data: handlerData.error,
                input: handlerData.args,
            });
        }
        else {
            Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
                category: 'fetch',
                data: tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, handlerData.fetchData, { status_code: handlerData.response.status }),
                type: 'http',
            }, {
                input: handlerData.args,
                response: handlerData.response,
            });
        }
    };
    /**
     * Creates breadcrumbs from history API calls
     */
    Breadcrumbs.prototype._historyBreadcrumb = function (handlerData) {
        var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["getGlobalObject"])();
        var from = handlerData.from;
        var to = handlerData.to;
        var parsedLoc = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["parseUrl"])(global.location.href);
        var parsedFrom = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["parseUrl"])(from);
        var parsedTo = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["parseUrl"])(to);
        // Initial pushState doesn't provide `from` information
        if (!parsedFrom.path) {
            parsedFrom = parsedLoc;
        }
        // Use only the path component of the URL if the URL matches the current
        // document (almost all the time when using pushState)
        if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {
            // tslint:disable-next-line:no-parameter-reassignment
            to = parsedTo.relative;
        }
        if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {
            // tslint:disable-next-line:no-parameter-reassignment
            from = parsedFrom.relative;
        }
        Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
            category: 'navigation',
            data: {
                from: from,
                to: to,
            },
        });
    };
    /**
     * Instrument browser built-ins w/ breadcrumb capturing
     *  - Console API
     *  - DOM API (click/typing)
     *  - XMLHttpRequest API
     *  - Fetch API
     *  - History API
     */
    Breadcrumbs.prototype.setupOnce = function () {
        var _this = this;
        if (this._options.console) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
                callback: function () {
                    var args = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        args[_i] = arguments[_i];
                    }
                    _this._consoleBreadcrumb.apply(_this, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
                },
                type: 'console',
            });
        }
        if (this._options.dom) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
                callback: function () {
                    var args = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        args[_i] = arguments[_i];
                    }
                    _this._domBreadcrumb.apply(_this, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
                },
                type: 'dom',
            });
        }
        if (this._options.xhr) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
                callback: function () {
                    var args = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        args[_i] = arguments[_i];
                    }
                    _this._xhrBreadcrumb.apply(_this, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
                },
                type: 'xhr',
            });
        }
        if (this._options.fetch) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
                callback: function () {
                    var args = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        args[_i] = arguments[_i];
                    }
                    _this._fetchBreadcrumb.apply(_this, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
                },
                type: 'fetch',
            });
        }
        if (this._options.history) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
                callback: function () {
                    var args = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        args[_i] = arguments[_i];
                    }
                    _this._historyBreadcrumb.apply(_this, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
                },
                type: 'history',
            });
        }
    };
    /**
     * @inheritDoc
     */
    Breadcrumbs.id = 'Breadcrumbs';
    return Breadcrumbs;
}());

//# sourceMappingURL=breadcrumbs.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/integrations/globalhandlers.js":
/*!*************************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/integrations/globalhandlers.js ***!
  \*************************************************************************/
/*! exports provided: GlobalHandlers */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GlobalHandlers", function() { return GlobalHandlers; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _eventbuilder__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../eventbuilder */ "./node_modules/@sentry/browser/esm/eventbuilder.js");
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../helpers */ "./node_modules/@sentry/browser/esm/helpers.js");






/** Global handlers */
var GlobalHandlers = /** @class */ (function () {
    /** JSDoc */
    function GlobalHandlers(options) {
        /**
         * @inheritDoc
         */
        this.name = GlobalHandlers.id;
        /** JSDoc */
        this._onErrorHandlerInstalled = false;
        /** JSDoc */
        this._onUnhandledRejectionHandlerInstalled = false;
        this._options = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ onerror: true, onunhandledrejection: true }, options);
    }
    /**
     * @inheritDoc
     */
    GlobalHandlers.prototype.setupOnce = function () {
        Error.stackTraceLimit = 50;
        if (this._options.onerror) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["logger"].log('Global Handler attached: onerror');
            this._installGlobalOnErrorHandler();
        }
        if (this._options.onunhandledrejection) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["logger"].log('Global Handler attached: onunhandledrejection');
            this._installGlobalOnUnhandledRejectionHandler();
        }
    };
    /** JSDoc */
    GlobalHandlers.prototype._installGlobalOnErrorHandler = function () {
        var _this = this;
        if (this._onErrorHandlerInstalled) {
            return;
        }
        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
            callback: function (data) {
                var error = data.error;
                var currentHub = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])();
                var hasIntegration = currentHub.getIntegration(GlobalHandlers);
                var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;
                if (!hasIntegration || Object(_helpers__WEBPACK_IMPORTED_MODULE_5__["shouldIgnoreOnError"])() || isFailedOwnDelivery) {
                    return;
                }
                var client = currentHub.getClient();
                var event = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["isPrimitive"])(error)
                    ? _this._eventFromIncompleteOnError(data.msg, data.url, data.line, data.column)
                    : _this._enhanceEventWithInitialFrame(Object(_eventbuilder__WEBPACK_IMPORTED_MODULE_4__["eventFromUnknownInput"])(error, undefined, {
                        attachStacktrace: client && client.getOptions().attachStacktrace,
                        rejection: false,
                    }), data.url, data.line, data.column);
                Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addExceptionMechanism"])(event, {
                    handled: false,
                    type: 'onerror',
                });
                currentHub.captureEvent(event, {
                    originalException: error,
                });
            },
            type: 'error',
        });
        this._onErrorHandlerInstalled = true;
    };
    /** JSDoc */
    GlobalHandlers.prototype._installGlobalOnUnhandledRejectionHandler = function () {
        var _this = this;
        if (this._onUnhandledRejectionHandlerInstalled) {
            return;
        }
        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
            callback: function (e) {
                var error = e;
                // dig the object of the rejection out of known event types
                try {
                    // PromiseRejectionEvents store the object of the rejection under 'reason'
                    // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent
                    if ('reason' in e) {
                        error = e.reason;
                    }
                    // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents
                    // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into
                    // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec
                    // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and
                    // https://github.com/getsentry/sentry-javascript/issues/2380
                    else if ('detail' in e && 'reason' in e.detail) {
                        error = e.detail.reason;
                    }
                }
                catch (_oO) {
                    // no-empty
                }
                var currentHub = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])();
                var hasIntegration = currentHub.getIntegration(GlobalHandlers);
                var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;
                if (!hasIntegration || Object(_helpers__WEBPACK_IMPORTED_MODULE_5__["shouldIgnoreOnError"])() || isFailedOwnDelivery) {
                    return true;
                }
                var client = currentHub.getClient();
                var event = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["isPrimitive"])(error)
                    ? _this._eventFromIncompleteRejection(error)
                    : Object(_eventbuilder__WEBPACK_IMPORTED_MODULE_4__["eventFromUnknownInput"])(error, undefined, {
                        attachStacktrace: client && client.getOptions().attachStacktrace,
                        rejection: true,
                    });
                event.level = _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Severity"].Error;
                Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addExceptionMechanism"])(event, {
                    handled: false,
                    type: 'onunhandledrejection',
                });
                currentHub.captureEvent(event, {
                    originalException: error,
                });
                return;
            },
            type: 'unhandledrejection',
        });
        this._onUnhandledRejectionHandlerInstalled = true;
    };
    /**
     * This function creates a stack from an old, error-less onerror handler.
     */
    GlobalHandlers.prototype._eventFromIncompleteOnError = function (msg, url, line, column) {
        var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;
        // If 'message' is ErrorEvent, get real message from inside
        var message = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["isErrorEvent"])(msg) ? msg.message : msg;
        var name;
        if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["isString"])(message)) {
            var groups = message.match(ERROR_TYPES_RE);
            if (groups) {
                name = groups[1];
                message = groups[2];
            }
        }
        var event = {
            exception: {
                values: [
                    {
                        type: name || 'Error',
                        value: message,
                    },
                ],
            },
        };
        return this._enhanceEventWithInitialFrame(event, url, line, column);
    };
    /**
     * This function creates an Event from an TraceKitStackTrace that has part of it missing.
     */
    GlobalHandlers.prototype._eventFromIncompleteRejection = function (error) {
        return {
            exception: {
                values: [
                    {
                        type: 'UnhandledRejection',
                        value: "Non-Error promise rejection captured with value: " + error,
                    },
                ],
            },
        };
    };
    /** JSDoc */
    GlobalHandlers.prototype._enhanceEventWithInitialFrame = function (event, url, line, column) {
        event.exception = event.exception || {};
        event.exception.values = event.exception.values || [];
        event.exception.values[0] = event.exception.values[0] || {};
        event.exception.values[0].stacktrace = event.exception.values[0].stacktrace || {};
        event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames || [];
        var colno = isNaN(parseInt(column, 10)) ? undefined : column;
        var lineno = isNaN(parseInt(line, 10)) ? undefined : line;
        var filename = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["isString"])(url) && url.length > 0 ? url : Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["getLocationHref"])();
        if (event.exception.values[0].stacktrace.frames.length === 0) {
            event.exception.values[0].stacktrace.frames.push({
                colno: colno,
                filename: filename,
                function: '?',
                in_app: true,
                lineno: lineno,
            });
        }
        return event;
    };
    /**
     * @inheritDoc
     */
    GlobalHandlers.id = 'GlobalHandlers';
    return GlobalHandlers;
}());

//# sourceMappingURL=globalhandlers.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/integrations/index.js":
/*!****************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/integrations/index.js ***!
  \****************************************************************/
/*! exports provided: GlobalHandlers, TryCatch, Breadcrumbs, LinkedErrors, UserAgent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _globalhandlers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./globalhandlers */ "./node_modules/@sentry/browser/esm/integrations/globalhandlers.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GlobalHandlers", function() { return _globalhandlers__WEBPACK_IMPORTED_MODULE_0__["GlobalHandlers"]; });

/* harmony import */ var _trycatch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./trycatch */ "./node_modules/@sentry/browser/esm/integrations/trycatch.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TryCatch", function() { return _trycatch__WEBPACK_IMPORTED_MODULE_1__["TryCatch"]; });

/* harmony import */ var _breadcrumbs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./breadcrumbs */ "./node_modules/@sentry/browser/esm/integrations/breadcrumbs.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Breadcrumbs", function() { return _breadcrumbs__WEBPACK_IMPORTED_MODULE_2__["Breadcrumbs"]; });

/* harmony import */ var _linkederrors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./linkederrors */ "./node_modules/@sentry/browser/esm/integrations/linkederrors.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LinkedErrors", function() { return _linkederrors__WEBPACK_IMPORTED_MODULE_3__["LinkedErrors"]; });

/* harmony import */ var _useragent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./useragent */ "./node_modules/@sentry/browser/esm/integrations/useragent.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "UserAgent", function() { return _useragent__WEBPACK_IMPORTED_MODULE_4__["UserAgent"]; });






//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/integrations/linkederrors.js":
/*!***********************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/integrations/linkederrors.js ***!
  \***********************************************************************/
/*! exports provided: LinkedErrors */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LinkedErrors", function() { return LinkedErrors; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _parsers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../parsers */ "./node_modules/@sentry/browser/esm/parsers.js");
/* harmony import */ var _tracekit__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../tracekit */ "./node_modules/@sentry/browser/esm/tracekit.js");





var DEFAULT_KEY = 'cause';
var DEFAULT_LIMIT = 5;
/** Adds SDK info to an event. */
var LinkedErrors = /** @class */ (function () {
    /**
     * @inheritDoc
     */
    function LinkedErrors(options) {
        if (options === void 0) { options = {}; }
        /**
         * @inheritDoc
         */
        this.name = LinkedErrors.id;
        this._key = options.key || DEFAULT_KEY;
        this._limit = options.limit || DEFAULT_LIMIT;
    }
    /**
     * @inheritDoc
     */
    LinkedErrors.prototype.setupOnce = function () {
        Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"])(function (event, hint) {
            var self = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().getIntegration(LinkedErrors);
            if (self) {
                return self._handler(event, hint);
            }
            return event;
        });
    };
    /**
     * @inheritDoc
     */
    LinkedErrors.prototype._handler = function (event, hint) {
        if (!event.exception || !event.exception.values || !hint || !Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isInstanceOf"])(hint.originalException, Error)) {
            return event;
        }
        var linkedErrors = this._walkErrorTree(hint.originalException, this._key);
        event.exception.values = tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](linkedErrors, event.exception.values);
        return event;
    };
    /**
     * @inheritDoc
     */
    LinkedErrors.prototype._walkErrorTree = function (error, key, stack) {
        if (stack === void 0) { stack = []; }
        if (!Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isInstanceOf"])(error[key], Error) || stack.length + 1 >= this._limit) {
            return stack;
        }
        var stacktrace = Object(_tracekit__WEBPACK_IMPORTED_MODULE_4__["computeStackTrace"])(error[key]);
        var exception = Object(_parsers__WEBPACK_IMPORTED_MODULE_3__["exceptionFromStacktrace"])(stacktrace);
        return this._walkErrorTree(error[key], key, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"]([exception], stack));
    };
    /**
     * @inheritDoc
     */
    LinkedErrors.id = 'LinkedErrors';
    return LinkedErrors;
}());

//# sourceMappingURL=linkederrors.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/integrations/trycatch.js":
/*!*******************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/integrations/trycatch.js ***!
  \*******************************************************************/
/*! exports provided: TryCatch */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TryCatch", function() { return TryCatch; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../helpers */ "./node_modules/@sentry/browser/esm/helpers.js");



var DEFAULT_EVENT_TARGET = [
    'EventTarget',
    'Window',
    'Node',
    'ApplicationCache',
    'AudioTrackList',
    'ChannelMergerNode',
    'CryptoOperation',
    'EventSource',
    'FileReader',
    'HTMLUnknownElement',
    'IDBDatabase',
    'IDBRequest',
    'IDBTransaction',
    'KeyOperation',
    'MediaController',
    'MessagePort',
    'ModalWindow',
    'Notification',
    'SVGElementInstance',
    'Screen',
    'TextTrack',
    'TextTrackCue',
    'TextTrackList',
    'WebSocket',
    'WebSocketWorker',
    'Worker',
    'XMLHttpRequest',
    'XMLHttpRequestEventTarget',
    'XMLHttpRequestUpload',
];
/** Wrap timer functions and event targets to catch errors and provide better meta data */
var TryCatch = /** @class */ (function () {
    /**
     * @inheritDoc
     */
    function TryCatch(options) {
        /**
         * @inheritDoc
         */
        this.name = TryCatch.id;
        this._options = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ XMLHttpRequest: true, eventTarget: true, requestAnimationFrame: true, setInterval: true, setTimeout: true }, options);
    }
    /** JSDoc */
    TryCatch.prototype._wrapTimeFunction = function (original) {
        return function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var originalCallback = args[0];
            args[0] = Object(_helpers__WEBPACK_IMPORTED_MODULE_2__["wrap"])(originalCallback, {
                mechanism: {
                    data: { function: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(original) },
                    handled: true,
                    type: 'instrument',
                },
            });
            return original.apply(this, args);
        };
    };
    /** JSDoc */
    TryCatch.prototype._wrapRAF = function (original) {
        return function (callback) {
            return original.call(this, Object(_helpers__WEBPACK_IMPORTED_MODULE_2__["wrap"])(callback, {
                mechanism: {
                    data: {
                        function: 'requestAnimationFrame',
                        handler: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(original),
                    },
                    handled: true,
                    type: 'instrument',
                },
            }));
        };
    };
    /** JSDoc */
    TryCatch.prototype._wrapEventTarget = function (target) {
        var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
        var proto = global[target] && global[target].prototype;
        if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {
            return;
        }
        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(proto, 'addEventListener', function (original) {
            return function (eventName, fn, options) {
                try {
                    // tslint:disable-next-line:no-unbound-method strict-type-predicates
                    if (typeof fn.handleEvent === 'function') {
                        fn.handleEvent = Object(_helpers__WEBPACK_IMPORTED_MODULE_2__["wrap"])(fn.handleEvent.bind(fn), {
                            mechanism: {
                                data: {
                                    function: 'handleEvent',
                                    handler: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(fn),
                                    target: target,
                                },
                                handled: true,
                                type: 'instrument',
                            },
                        });
                    }
                }
                catch (err) {
                    // can sometimes get 'Permission denied to access property "handle Event'
                }
                return original.call(this, eventName, Object(_helpers__WEBPACK_IMPORTED_MODULE_2__["wrap"])(fn, {
                    mechanism: {
                        data: {
                            function: 'addEventListener',
                            handler: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(fn),
                            target: target,
                        },
                        handled: true,
                        type: 'instrument',
                    },
                }), options);
            };
        });
        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(proto, 'removeEventListener', function (original) {
            return function (eventName, fn, options) {
                var callback = fn;
                try {
                    callback = callback && (callback.__sentry_wrapped__ || callback);
                }
                catch (e) {
                    // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments
                }
                return original.call(this, eventName, callback, options);
            };
        });
    };
    /** JSDoc */
    TryCatch.prototype._wrapXHR = function (originalSend) {
        return function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var xhr = this; // tslint:disable-line:no-this-assignment
            var xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];
            xmlHttpRequestProps.forEach(function (prop) {
                if (prop in xhr && typeof xhr[prop] === 'function') {
                    Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(xhr, prop, function (original) {
                        var wrapOptions = {
                            mechanism: {
                                data: {
                                    function: prop,
                                    handler: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(original),
                                },
                                handled: true,
                                type: 'instrument',
                            },
                        };
                        // If Instrument integration has been called before TryCatch, get the name of original function
                        if (original.__sentry_original__) {
                            wrapOptions.mechanism.data.handler = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(original.__sentry_original__);
                        }
                        // Otherwise wrap directly
                        return Object(_helpers__WEBPACK_IMPORTED_MODULE_2__["wrap"])(original, wrapOptions);
                    });
                }
            });
            return originalSend.apply(this, args);
        };
    };
    /**
     * Wrap timer functions and event targets to catch errors
     * and provide better metadata.
     */
    TryCatch.prototype.setupOnce = function () {
        var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
        if (this._options.setTimeout) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(global, 'setTimeout', this._wrapTimeFunction.bind(this));
        }
        if (this._options.setInterval) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(global, 'setInterval', this._wrapTimeFunction.bind(this));
        }
        if (this._options.requestAnimationFrame) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(global, 'requestAnimationFrame', this._wrapRAF.bind(this));
        }
        if (this._options.XMLHttpRequest && 'XMLHttpRequest' in global) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(XMLHttpRequest.prototype, 'send', this._wrapXHR.bind(this));
        }
        if (this._options.eventTarget) {
            var eventTarget = Array.isArray(this._options.eventTarget) ? this._options.eventTarget : DEFAULT_EVENT_TARGET;
            eventTarget.forEach(this._wrapEventTarget.bind(this));
        }
    };
    /**
     * @inheritDoc
     */
    TryCatch.id = 'TryCatch';
    return TryCatch;
}());

//# sourceMappingURL=trycatch.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/integrations/useragent.js":
/*!********************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/integrations/useragent.js ***!
  \********************************************************************/
/*! exports provided: UserAgent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UserAgent", function() { return UserAgent; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");



var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getGlobalObject"])();
/** UserAgent */
var UserAgent = /** @class */ (function () {
    function UserAgent() {
        /**
         * @inheritDoc
         */
        this.name = UserAgent.id;
    }
    /**
     * @inheritDoc
     */
    UserAgent.prototype.setupOnce = function () {
        Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"])(function (event) {
            if (Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().getIntegration(UserAgent)) {
                if (!global.navigator || !global.location) {
                    return event;
                }
                var request = event.request || {};
                request.url = request.url || global.location.href;
                request.headers = request.headers || {};
                request.headers['User-Agent'] = global.navigator.userAgent;
                return tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event, { request: request });
            }
            return event;
        });
    };
    /**
     * @inheritDoc
     */
    UserAgent.id = 'UserAgent';
    return UserAgent;
}());

//# sourceMappingURL=useragent.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/parsers.js":
/*!*****************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/parsers.js ***!
  \*****************************************************/
/*! exports provided: exceptionFromStacktrace, eventFromPlainObject, eventFromStacktrace, prepareFramesForEvent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exceptionFromStacktrace", function() { return exceptionFromStacktrace; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eventFromPlainObject", function() { return eventFromPlainObject; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eventFromStacktrace", function() { return eventFromStacktrace; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prepareFramesForEvent", function() { return prepareFramesForEvent; });
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _tracekit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tracekit */ "./node_modules/@sentry/browser/esm/tracekit.js");


var STACKTRACE_LIMIT = 50;
/**
 * This function creates an exception from an TraceKitStackTrace
 * @param stacktrace TraceKitStackTrace that will be converted to an exception
 * @hidden
 */
function exceptionFromStacktrace(stacktrace) {
    var frames = prepareFramesForEvent(stacktrace.stack);
    var exception = {
        type: stacktrace.name,
        value: stacktrace.message,
    };
    if (frames && frames.length) {
        exception.stacktrace = { frames: frames };
    }
    // tslint:disable-next-line:strict-type-predicates
    if (exception.type === undefined && exception.value === '') {
        exception.value = 'Unrecoverable error caught';
    }
    return exception;
}
/**
 * @hidden
 */
function eventFromPlainObject(exception, syntheticException, rejection) {
    var event = {
        exception: {
            values: [
                {
                    type: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isEvent"])(exception) ? exception.constructor.name : rejection ? 'UnhandledRejection' : 'Error',
                    value: "Non-Error " + (rejection ? 'promise rejection' : 'exception') + " captured with keys: " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["extractExceptionKeysForMessage"])(exception),
                },
            ],
        },
        extra: {
            __serialized__: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["normalizeToSize"])(exception),
        },
    };
    if (syntheticException) {
        var stacktrace = Object(_tracekit__WEBPACK_IMPORTED_MODULE_1__["computeStackTrace"])(syntheticException);
        var frames_1 = prepareFramesForEvent(stacktrace.stack);
        event.stacktrace = {
            frames: frames_1,
        };
    }
    return event;
}
/**
 * @hidden
 */
function eventFromStacktrace(stacktrace) {
    var exception = exceptionFromStacktrace(stacktrace);
    return {
        exception: {
            values: [exception],
        },
    };
}
/**
 * @hidden
 */
function prepareFramesForEvent(stack) {
    if (!stack || !stack.length) {
        return [];
    }
    var localStack = stack;
    var firstFrameFunction = localStack[0].func || '';
    var lastFrameFunction = localStack[localStack.length - 1].func || '';
    // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)
    if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) {
        localStack = localStack.slice(1);
    }
    // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)
    if (lastFrameFunction.indexOf('sentryWrapped') !== -1) {
        localStack = localStack.slice(0, -1);
    }
    // The frame where the crash happened, should be the last entry in the array
    return localStack
        .slice(0, STACKTRACE_LIMIT)
        .map(function (frame) { return ({
        colno: frame.column === null ? undefined : frame.column,
        filename: frame.url || localStack[0].url,
        function: frame.func || '?',
        in_app: true,
        lineno: frame.line === null ? undefined : frame.line,
    }); })
        .reverse();
}
//# sourceMappingURL=parsers.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/sdk.js":
/*!*************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/sdk.js ***!
  \*************************************************/
/*! exports provided: defaultIntegrations, init, showReportDialog, lastEventId, forceLoad, onLoad, flush, close, wrap */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultIntegrations", function() { return defaultIntegrations; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "init", function() { return init; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "showReportDialog", function() { return showReportDialog; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lastEventId", function() { return lastEventId; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forceLoad", function() { return forceLoad; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onLoad", function() { return onLoad; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "flush", function() { return flush; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "close", function() { return close; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wrap", function() { return wrap; });
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _client__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./client */ "./node_modules/@sentry/browser/esm/client.js");
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ "./node_modules/@sentry/browser/esm/helpers.js");
/* harmony import */ var _integrations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./integrations */ "./node_modules/@sentry/browser/esm/integrations/index.js");





var defaultIntegrations = [
    new _sentry_core__WEBPACK_IMPORTED_MODULE_0__["Integrations"].InboundFilters(),
    new _sentry_core__WEBPACK_IMPORTED_MODULE_0__["Integrations"].FunctionToString(),
    new _integrations__WEBPACK_IMPORTED_MODULE_4__["TryCatch"](),
    new _integrations__WEBPACK_IMPORTED_MODULE_4__["Breadcrumbs"](),
    new _integrations__WEBPACK_IMPORTED_MODULE_4__["GlobalHandlers"](),
    new _integrations__WEBPACK_IMPORTED_MODULE_4__["LinkedErrors"](),
    new _integrations__WEBPACK_IMPORTED_MODULE_4__["UserAgent"](),
];
/**
 * The Sentry Browser SDK Client.
 *
 * To use this SDK, call the {@link init} function as early as possible when
 * loading the web page. To set context information or send manual events, use
 * the provided methods.
 *
 * @example
 *
 * ```
 *
 * import { init } from '@sentry/browser';
 *
 * init({
 *   dsn: '__DSN__',
 *   // ...
 * });
 * ```
 *
 * @example
 * ```
 *
 * import { configureScope } from '@sentry/browser';
 * configureScope((scope: Scope) => {
 *   scope.setExtra({ battery: 0.7 });
 *   scope.setTag({ user_mode: 'admin' });
 *   scope.setUser({ id: '4711' });
 * });
 * ```
 *
 * @example
 * ```
 *
 * import { addBreadcrumb } from '@sentry/browser';
 * addBreadcrumb({
 *   message: 'My Breadcrumb',
 *   // ...
 * });
 * ```
 *
 * @example
 *
 * ```
 *
 * import * as Sentry from '@sentry/browser';
 * Sentry.captureMessage('Hello, world!');
 * Sentry.captureException(new Error('Good bye'));
 * Sentry.captureEvent({
 *   message: 'Manual',
 *   stacktrace: [
 *     // ...
 *   ],
 * });
 * ```
 *
 * @see {@link BrowserOptions} for documentation on configuration options.
 */
function init(options) {
    if (options === void 0) { options = {}; }
    if (options.defaultIntegrations === undefined) {
        options.defaultIntegrations = defaultIntegrations;
    }
    if (options.release === undefined) {
        var window_1 = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
        // This supports the variable that sentry-webpack-plugin injects
        if (window_1.SENTRY_RELEASE && window_1.SENTRY_RELEASE.id) {
            options.release = window_1.SENTRY_RELEASE.id;
        }
    }
    Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["initAndBind"])(_client__WEBPACK_IMPORTED_MODULE_2__["BrowserClient"], options);
}
/**
 * Present the user with a report dialog.
 *
 * @param options Everything is optional, we try to fetch all info need from the global scope.
 */
function showReportDialog(options) {
    if (options === void 0) { options = {}; }
    if (!options.eventId) {
        options.eventId = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])().lastEventId();
    }
    var client = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])().getClient();
    if (client) {
        client.showReportDialog(options);
    }
}
/**
 * This is the getter for lastEventId.
 *
 * @returns The last event id of a captured event.
 */
function lastEventId() {
    return Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])().lastEventId();
}
/**
 * This function is here to be API compatible with the loader.
 * @hidden
 */
function forceLoad() {
    // Noop
}
/**
 * This function is here to be API compatible with the loader.
 * @hidden
 */
function onLoad(callback) {
    callback();
}
/**
 * A promise that resolves when all current events have been sent.
 * If you provide a timeout and the queue takes longer to drain the promise returns false.
 *
 * @param timeout Maximum time in ms the client should wait.
 */
function flush(timeout) {
    var client = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])().getClient();
    if (client) {
        return client.flush(timeout);
    }
    return _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].reject(false);
}
/**
 * A promise that resolves when all current events have been sent.
 * If you provide a timeout and the queue takes longer to drain the promise returns false.
 *
 * @param timeout Maximum time in ms the client should wait.
 */
function close(timeout) {
    var client = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])().getClient();
    if (client) {
        return client.close(timeout);
    }
    return _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].reject(false);
}
/**
 * Wrap code within a try/catch block so the SDK is able to capture errors.
 *
 * @param fn A function to wrap.
 *
 * @returns The result of wrapped function call.
 */
function wrap(fn) {
    return Object(_helpers__WEBPACK_IMPORTED_MODULE_3__["wrap"])(fn)(); // tslint:disable-line:no-unsafe-any
}
//# sourceMappingURL=sdk.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/tracekit.js":
/*!******************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/tracekit.js ***!
  \******************************************************/
/*! exports provided: computeStackTrace */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computeStackTrace", function() { return computeStackTrace; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
// tslint:disable:object-literal-sort-keys

// global reference to slice
var UNKNOWN_FUNCTION = '?';
// Chromium based browsers: Chrome, Brave, new Opera, new Edge
var chrome = /^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;
// gecko regex: `(?:bundle|\d+\.js)`: `bundle` is for react native, `\d+\.js` also but specifically for ram bundles because it
// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js
// We need this specific case for now because we want no other regex to match.
var gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js))(?::(\d+))?(?::(\d+))?\s*$/i;
var winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;
var geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
var chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/;
/** JSDoc */
function computeStackTrace(ex) {
    // tslint:disable:no-unsafe-any
    var stack = null;
    var popSize = ex && ex.framesToPop;
    try {
        // This must be tried first because Opera 10 *destroys*
        // its stacktrace property if you try to access the stack
        // property first!!
        stack = computeStackTraceFromStacktraceProp(ex);
        if (stack) {
            return popFrames(stack, popSize);
        }
    }
    catch (e) {
        // no-empty
    }
    try {
        stack = computeStackTraceFromStackProp(ex);
        if (stack) {
            return popFrames(stack, popSize);
        }
    }
    catch (e) {
        // no-empty
    }
    return {
        message: extractMessage(ex),
        name: ex && ex.name,
        stack: [],
        failed: true,
    };
}
/** JSDoc */
// tslint:disable-next-line:cyclomatic-complexity
function computeStackTraceFromStackProp(ex) {
    // tslint:disable:no-conditional-assignment
    if (!ex || !ex.stack) {
        return null;
    }
    var stack = [];
    var lines = ex.stack.split('\n');
    var isEval;
    var submatch;
    var parts;
    var element;
    for (var i = 0; i < lines.length; ++i) {
        if ((parts = chrome.exec(lines[i]))) {
            var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line
            isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line
            if (isEval && (submatch = chromeEval.exec(parts[2]))) {
                // throw out eval line/column and use top-most line/column number
                parts[2] = submatch[1]; // url
                parts[3] = submatch[2]; // line
                parts[4] = submatch[3]; // column
            }
            element = {
                // working with the regexp above is super painful. it is quite a hack, but just stripping the `address at `
                // prefix here seems like the quickest solution for now.
                url: parts[2] && parts[2].indexOf('address at ') === 0 ? parts[2].substr('address at '.length) : parts[2],
                func: parts[1] || UNKNOWN_FUNCTION,
                args: isNative ? [parts[2]] : [],
                line: parts[3] ? +parts[3] : null,
                column: parts[4] ? +parts[4] : null,
            };
        }
        else if ((parts = winjs.exec(lines[i]))) {
            element = {
                url: parts[2],
                func: parts[1] || UNKNOWN_FUNCTION,
                args: [],
                line: +parts[3],
                column: parts[4] ? +parts[4] : null,
            };
        }
        else if ((parts = gecko.exec(lines[i]))) {
            isEval = parts[3] && parts[3].indexOf(' > eval') > -1;
            if (isEval && (submatch = geckoEval.exec(parts[3]))) {
                // throw out eval line/column and use top-most line number
                parts[1] = parts[1] || "eval";
                parts[3] = submatch[1];
                parts[4] = submatch[2];
                parts[5] = ''; // no column when eval
            }
            else if (i === 0 && !parts[5] && ex.columnNumber !== void 0) {
                // FireFox uses this awesome columnNumber property for its top frame
                // Also note, Firefox's column number is 0-based and everything else expects 1-based,
                // so adding 1
                // NOTE: this hack doesn't work if top-most frame is eval
                stack[0].column = ex.columnNumber + 1;
            }
            element = {
                url: parts[3],
                func: parts[1] || UNKNOWN_FUNCTION,
                args: parts[2] ? parts[2].split(',') : [],
                line: parts[4] ? +parts[4] : null,
                column: parts[5] ? +parts[5] : null,
            };
        }
        else {
            continue;
        }
        if (!element.func && element.line) {
            element.func = UNKNOWN_FUNCTION;
        }
        stack.push(element);
    }
    if (!stack.length) {
        return null;
    }
    return {
        message: extractMessage(ex),
        name: ex.name,
        stack: stack,
    };
}
/** JSDoc */
function computeStackTraceFromStacktraceProp(ex) {
    if (!ex || !ex.stacktrace) {
        return null;
    }
    // Access and store the stacktrace property before doing ANYTHING
    // else to it because Opera is not very good at providing it
    // reliably in other circumstances.
    var stacktrace = ex.stacktrace;
    var opera10Regex = / line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i;
    var opera11Regex = / line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\))? in (.*):\s*$/i;
    var lines = stacktrace.split('\n');
    var stack = [];
    var parts;
    for (var line = 0; line < lines.length; line += 2) {
        // tslint:disable:no-conditional-assignment
        var element = null;
        if ((parts = opera10Regex.exec(lines[line]))) {
            element = {
                url: parts[2],
                func: parts[3],
                args: [],
                line: +parts[1],
                column: null,
            };
        }
        else if ((parts = opera11Regex.exec(lines[line]))) {
            element = {
                url: parts[6],
                func: parts[3] || parts[4],
                args: parts[5] ? parts[5].split(',') : [],
                line: +parts[1],
                column: +parts[2],
            };
        }
        if (element) {
            if (!element.func && element.line) {
                element.func = UNKNOWN_FUNCTION;
            }
            stack.push(element);
        }
    }
    if (!stack.length) {
        return null;
    }
    return {
        message: extractMessage(ex),
        name: ex.name,
        stack: stack,
    };
}
/** Remove N number of frames from the stack */
function popFrames(stacktrace, popSize) {
    try {
        return tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, stacktrace, { stack: stacktrace.stack.slice(popSize) });
    }
    catch (e) {
        return stacktrace;
    }
}
/**
 * There are cases where stacktrace.message is an Event object
 * https://github.com/getsentry/sentry-javascript/issues/1949
 * In this specific case we try to extract stacktrace.message.error.message
 */
function extractMessage(ex) {
    var message = ex && ex.message;
    if (!message) {
        return 'No error message';
    }
    if (message.error && typeof message.error.message === 'string') {
        return message.error.message;
    }
    return message;
}
//# sourceMappingURL=tracekit.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/transports/base.js":
/*!*************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/transports/base.js ***!
  \*************************************************************/
/*! exports provided: BaseTransport */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseTransport", function() { return BaseTransport; });
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");


/** Base Transport class implementation */
var BaseTransport = /** @class */ (function () {
    function BaseTransport(options) {
        this.options = options;
        /** A simple buffer holding all requests. */
        this._buffer = new _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["PromiseBuffer"](30);
        this._api = new _sentry_core__WEBPACK_IMPORTED_MODULE_0__["API"](this.options.dsn);
        // tslint:disable-next-line:deprecation
        this.url = this._api.getStoreEndpointWithUrlEncodedAuth();
    }
    /**
     * @inheritDoc
     */
    BaseTransport.prototype.sendEvent = function (_) {
        throw new _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SentryError"]('Transport Class has to implement `sendEvent` method');
    };
    /**
     * @inheritDoc
     */
    BaseTransport.prototype.close = function (timeout) {
        return this._buffer.drain(timeout);
    };
    return BaseTransport;
}());

//# sourceMappingURL=base.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/transports/fetch.js":
/*!**************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/transports/fetch.js ***!
  \**************************************************************/
/*! exports provided: FetchTransport */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FetchTransport", function() { return FetchTransport; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ "./node_modules/@sentry/browser/esm/transports/base.js");





var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["getGlobalObject"])();
/** `fetch` based transport */
var FetchTransport = /** @class */ (function (_super) {
    tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FetchTransport, _super);
    function FetchTransport() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        /** Locks transport after receiving 429 response */
        _this._disabledUntil = new Date(Date.now());
        return _this;
    }
    /**
     * @inheritDoc
     */
    FetchTransport.prototype.sendEvent = function (event) {
        var _this = this;
        if (new Date(Date.now()) < this._disabledUntil) {
            return Promise.reject({
                event: event,
                reason: "Transport locked till " + this._disabledUntil + " due to too many requests.",
                status: 429,
            });
        }
        var sentryReq = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["eventToSentryRequest"])(event, this._api);
        var options = {
            body: sentryReq.body,
            method: 'POST',
            // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default
            // https://caniuse.com/#feat=referrer-policy
            // It doesn't. And it throw exception instead of ignoring this parameter...
            // REF: https://github.com/getsentry/raven-js/issues/1233
            referrerPolicy: (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["supportsReferrerPolicy"])() ? 'origin' : ''),
        };
        if (this.options.headers !== undefined) {
            options.headers = this.options.headers;
        }
        return this._buffer.add(new _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["SyncPromise"](function (resolve, reject) {
            global
                .fetch(sentryReq.url, options)
                .then(function (response) {
                var status = _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].fromHttpCode(response.status);
                if (status === _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].Success) {
                    resolve({ status: status });
                    return;
                }
                if (status === _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].RateLimit) {
                    var now = Date.now();
                    _this._disabledUntil = new Date(now + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["parseRetryAfterHeader"])(now, response.headers.get('Retry-After')));
                    _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["logger"].warn("Too many requests, backing off till: " + _this._disabledUntil);
                }
                reject(response);
            })
                .catch(reject);
        }));
    };
    return FetchTransport;
}(_base__WEBPACK_IMPORTED_MODULE_4__["BaseTransport"]));

//# sourceMappingURL=fetch.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/transports/index.js":
/*!**************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/transports/index.js ***!
  \**************************************************************/
/*! exports provided: BaseTransport, FetchTransport, XHRTransport */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "./node_modules/@sentry/browser/esm/transports/base.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BaseTransport", function() { return _base__WEBPACK_IMPORTED_MODULE_0__["BaseTransport"]; });

/* harmony import */ var _fetch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fetch */ "./node_modules/@sentry/browser/esm/transports/fetch.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FetchTransport", function() { return _fetch__WEBPACK_IMPORTED_MODULE_1__["FetchTransport"]; });

/* harmony import */ var _xhr__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./xhr */ "./node_modules/@sentry/browser/esm/transports/xhr.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "XHRTransport", function() { return _xhr__WEBPACK_IMPORTED_MODULE_2__["XHRTransport"]; });




//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/transports/xhr.js":
/*!************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/transports/xhr.js ***!
  \************************************************************/
/*! exports provided: XHRTransport */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "XHRTransport", function() { return XHRTransport; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ "./node_modules/@sentry/browser/esm/transports/base.js");





/** `XHR` based transport */
var XHRTransport = /** @class */ (function (_super) {
    tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](XHRTransport, _super);
    function XHRTransport() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        /** Locks transport after receiving 429 response */
        _this._disabledUntil = new Date(Date.now());
        return _this;
    }
    /**
     * @inheritDoc
     */
    XHRTransport.prototype.sendEvent = function (event) {
        var _this = this;
        if (new Date(Date.now()) < this._disabledUntil) {
            return Promise.reject({
                event: event,
                reason: "Transport locked till " + this._disabledUntil + " due to too many requests.",
                status: 429,
            });
        }
        var sentryReq = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["eventToSentryRequest"])(event, this._api);
        return this._buffer.add(new _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["SyncPromise"](function (resolve, reject) {
            var request = new XMLHttpRequest();
            request.onreadystatechange = function () {
                if (request.readyState !== 4) {
                    return;
                }
                var status = _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].fromHttpCode(request.status);
                if (status === _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].Success) {
                    resolve({ status: status });
                    return;
                }
                if (status === _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].RateLimit) {
                    var now = Date.now();
                    _this._disabledUntil = new Date(now + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["parseRetryAfterHeader"])(now, request.getResponseHeader('Retry-After')));
                    _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["logger"].warn("Too many requests, backing off till: " + _this._disabledUntil);
                }
                reject(request);
            };
            request.open('POST', sentryReq.url);
            for (var header in _this.options.headers) {
                if (_this.options.headers.hasOwnProperty(header)) {
                    request.setRequestHeader(header, _this.options.headers[header]);
                }
            }
            request.send(sentryReq.body);
        }));
    };
    return XHRTransport;
}(_base__WEBPACK_IMPORTED_MODULE_4__["BaseTransport"]));

//# sourceMappingURL=xhr.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/version.js":
/*!*****************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/version.js ***!
  \*****************************************************/
/*! exports provided: SDK_NAME, SDK_VERSION */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SDK_NAME", function() { return SDK_NAME; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SDK_VERSION", function() { return SDK_VERSION; });
var SDK_NAME = 'sentry.javascript.browser';
var SDK_VERSION = '5.16.1';
//# sourceMappingURL=version.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/api.js":
/*!**********************************************!*\
  !*** ./node_modules/@sentry/core/esm/api.js ***!
  \**********************************************/
/*! exports provided: API */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "API", function() { return API; });
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");

var SENTRY_API_VERSION = '7';
/** Helper class to provide urls to different Sentry endpoints. */
var API = /** @class */ (function () {
    /** Create a new instance of API */
    function API(dsn) {
        this.dsn = dsn;
        this._dsnObject = new _sentry_utils__WEBPACK_IMPORTED_MODULE_0__["Dsn"](dsn);
    }
    /** Returns the Dsn object. */
    API.prototype.getDsn = function () {
        return this._dsnObject;
    };
    /** Returns the prefix to construct Sentry ingestion API endpoints. */
    API.prototype.getBaseApiEndpoint = function () {
        var dsn = this._dsnObject;
        var protocol = dsn.protocol ? dsn.protocol + ":" : '';
        var port = dsn.port ? ":" + dsn.port : '';
        return protocol + "//" + dsn.host + port + (dsn.path ? "/" + dsn.path : '') + "/api/";
    };
    /** Returns the store endpoint URL. */
    API.prototype.getStoreEndpoint = function () {
        return this._getIngestEndpoint('store');
    };
    /** Returns the envelope endpoint URL. */
    API.prototype._getEnvelopeEndpoint = function () {
        return this._getIngestEndpoint('envelope');
    };
    /** Returns the ingest API endpoint for target. */
    API.prototype._getIngestEndpoint = function (target) {
        var base = this.getBaseApiEndpoint();
        var dsn = this._dsnObject;
        return "" + base + dsn.projectId + "/" + target + "/";
    };
    /**
     * Returns the store endpoint URL with auth in the query string.
     *
     * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.
     */
    API.prototype.getStoreEndpointWithUrlEncodedAuth = function () {
        return this.getStoreEndpoint() + "?" + this._encodedAuth();
    };
    /**
     * Returns the envelope endpoint URL with auth in the query string.
     *
     * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.
     */
    API.prototype.getEnvelopeEndpointWithUrlEncodedAuth = function () {
        return this._getEnvelopeEndpoint() + "?" + this._encodedAuth();
    };
    /** Returns a URL-encoded string with auth config suitable for a query string. */
    API.prototype._encodedAuth = function () {
        var dsn = this._dsnObject;
        var auth = {
            // We send only the minimum set of required information. See
            // https://github.com/getsentry/sentry-javascript/issues/2572.
            sentry_key: dsn.user,
            sentry_version: SENTRY_API_VERSION,
        };
        return Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["urlEncode"])(auth);
    };
    /** Returns only the path component for the store endpoint. */
    API.prototype.getStoreEndpointPath = function () {
        var dsn = this._dsnObject;
        return (dsn.path ? "/" + dsn.path : '') + "/api/" + dsn.projectId + "/store/";
    };
    /**
     * Returns an object that can be used in request headers.
     * This is needed for node and the old /store endpoint in sentry
     */
    API.prototype.getRequestHeaders = function (clientName, clientVersion) {
        var dsn = this._dsnObject;
        var header = ["Sentry sentry_version=" + SENTRY_API_VERSION];
        header.push("sentry_client=" + clientName + "/" + clientVersion);
        header.push("sentry_key=" + dsn.user);
        if (dsn.pass) {
            header.push("sentry_secret=" + dsn.pass);
        }
        return {
            'Content-Type': 'application/json',
            'X-Sentry-Auth': header.join(', '),
        };
    };
    /** Returns the url to the report dialog endpoint. */
    API.prototype.getReportDialogEndpoint = function (dialogOptions) {
        if (dialogOptions === void 0) { dialogOptions = {}; }
        var dsn = this._dsnObject;
        var endpoint = this.getBaseApiEndpoint() + "embed/error-page/";
        var encodedOptions = [];
        encodedOptions.push("dsn=" + dsn.toString());
        for (var key in dialogOptions) {
            if (key === 'user') {
                if (!dialogOptions.user) {
                    continue;
                }
                if (dialogOptions.user.name) {
                    encodedOptions.push("name=" + encodeURIComponent(dialogOptions.user.name));
                }
                if (dialogOptions.user.email) {
                    encodedOptions.push("email=" + encodeURIComponent(dialogOptions.user.email));
                }
            }
            else {
                encodedOptions.push(encodeURIComponent(key) + "=" + encodeURIComponent(dialogOptions[key]));
            }
        }
        if (encodedOptions.length) {
            return endpoint + "?" + encodedOptions.join('&');
        }
        return endpoint;
    };
    return API;
}());

//# sourceMappingURL=api.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/basebackend.js":
/*!******************************************************!*\
  !*** ./node_modules/@sentry/core/esm/basebackend.js ***!
  \******************************************************/
/*! exports provided: BaseBackend */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseBackend", function() { return BaseBackend; });
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _transports_noop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./transports/noop */ "./node_modules/@sentry/core/esm/transports/noop.js");


/**
 * This is the base implemention of a Backend.
 * @hidden
 */
var BaseBackend = /** @class */ (function () {
    /** Creates a new backend instance. */
    function BaseBackend(options) {
        this._options = options;
        if (!this._options.dsn) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_0__["logger"].warn('No DSN provided, backend will not do anything.');
        }
        this._transport = this._setupTransport();
    }
    /**
     * Sets up the transport so it can be used later to send requests.
     */
    BaseBackend.prototype._setupTransport = function () {
        return new _transports_noop__WEBPACK_IMPORTED_MODULE_1__["NoopTransport"]();
    };
    /**
     * @inheritDoc
     */
    BaseBackend.prototype.eventFromException = function (_exception, _hint) {
        throw new _sentry_utils__WEBPACK_IMPORTED_MODULE_0__["SentryError"]('Backend has to implement `eventFromException` method');
    };
    /**
     * @inheritDoc
     */
    BaseBackend.prototype.eventFromMessage = function (_message, _level, _hint) {
        throw new _sentry_utils__WEBPACK_IMPORTED_MODULE_0__["SentryError"]('Backend has to implement `eventFromMessage` method');
    };
    /**
     * @inheritDoc
     */
    BaseBackend.prototype.sendEvent = function (event) {
        this._transport.sendEvent(event).then(null, function (reason) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_0__["logger"].error("Error while sending event: " + reason);
        });
    };
    /**
     * @inheritDoc
     */
    BaseBackend.prototype.getTransport = function () {
        return this._transport;
    };
    return BaseBackend;
}());

//# sourceMappingURL=basebackend.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/baseclient.js":
/*!*****************************************************!*\
  !*** ./node_modules/@sentry/core/esm/baseclient.js ***!
  \*****************************************************/
/*! exports provided: BaseClient */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseClient", function() { return BaseClient; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _integration__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./integration */ "./node_modules/@sentry/core/esm/integration.js");




/**
 * Base implementation for all JavaScript SDK clients.
 *
 * Call the constructor with the corresponding backend constructor and options
 * specific to the client subclass. To access these options later, use
 * {@link Client.getOptions}. Also, the Backend instance is available via
 * {@link Client.getBackend}.
 *
 * If a Dsn is specified in the options, it will be parsed and stored. Use
 * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is
 * invalid, the constructor will throw a {@link SentryException}. Note that
 * without a valid Dsn, the SDK will not send any events to Sentry.
 *
 * Before sending an event via the backend, it is passed through
 * {@link BaseClient.prepareEvent} to add SDK information and scope data
 * (breadcrumbs and context). To add more custom information, override this
 * method and extend the resulting prepared event.
 *
 * To issue automatically created events (e.g. via instrumentation), use
 * {@link Client.captureEvent}. It will prepare the event and pass it through
 * the callback lifecycle. To issue auto-breadcrumbs, use
 * {@link Client.addBreadcrumb}.
 *
 * @example
 * class NodeClient extends BaseClient<NodeBackend, NodeOptions> {
 *   public constructor(options: NodeOptions) {
 *     super(NodeBackend, options);
 *   }
 *
 *   // ...
 * }
 */
var BaseClient = /** @class */ (function () {
    /**
     * Initializes this client instance.
     *
     * @param backendClass A constructor function to create the backend.
     * @param options Options for the client.
     */
    function BaseClient(backendClass, options) {
        /** Array of used integrations. */
        this._integrations = {};
        /** Is the client still processing a call? */
        this._processing = false;
        this._backend = new backendClass(options);
        this._options = options;
        if (options.dsn) {
            this._dsn = new _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["Dsn"](options.dsn);
        }
    }
    /**
     * @inheritDoc
     */
    BaseClient.prototype.captureException = function (exception, hint, scope) {
        var _this = this;
        var eventId = hint && hint.event_id;
        this._processing = true;
        this._getBackend()
            .eventFromException(exception, hint)
            .then(function (event) {
            eventId = _this.captureEvent(event, hint, scope);
        });
        return eventId;
    };
    /**
     * @inheritDoc
     */
    BaseClient.prototype.captureMessage = function (message, level, hint, scope) {
        var _this = this;
        var eventId = hint && hint.event_id;
        this._processing = true;
        var promisedEvent = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isPrimitive"])(message)
            ? this._getBackend().eventFromMessage("" + message, level, hint)
            : this._getBackend().eventFromException(message, hint);
        promisedEvent.then(function (event) {
            eventId = _this.captureEvent(event, hint, scope);
        });
        return eventId;
    };
    /**
     * @inheritDoc
     */
    BaseClient.prototype.captureEvent = function (event, hint, scope) {
        var _this = this;
        var eventId = hint && hint.event_id;
        this._processing = true;
        this._processEvent(event, hint, scope)
            .then(function (finalEvent) {
            // We need to check for finalEvent in case beforeSend returned null
            eventId = finalEvent && finalEvent.event_id;
            _this._processing = false;
        })
            .then(null, function (reason) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error(reason);
            _this._processing = false;
        });
        return eventId;
    };
    /**
     * @inheritDoc
     */
    BaseClient.prototype.getDsn = function () {
        return this._dsn;
    };
    /**
     * @inheritDoc
     */
    BaseClient.prototype.getOptions = function () {
        return this._options;
    };
    /**
     * @inheritDoc
     */
    BaseClient.prototype.flush = function (timeout) {
        var _this = this;
        return this._isClientProcessing(timeout).then(function (status) {
            clearInterval(status.interval);
            return _this._getBackend()
                .getTransport()
                .close(timeout)
                .then(function (transportFlushed) { return status.ready && transportFlushed; });
        });
    };
    /**
     * @inheritDoc
     */
    BaseClient.prototype.close = function (timeout) {
        var _this = this;
        return this.flush(timeout).then(function (result) {
            _this.getOptions().enabled = false;
            return result;
        });
    };
    /**
     * Sets up the integrations
     */
    BaseClient.prototype.setupIntegrations = function () {
        if (this._isEnabled()) {
            this._integrations = Object(_integration__WEBPACK_IMPORTED_MODULE_3__["setupIntegrations"])(this._options);
        }
    };
    /**
     * @inheritDoc
     */
    BaseClient.prototype.getIntegration = function (integration) {
        try {
            return this._integrations[integration.id] || null;
        }
        catch (_oO) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("Cannot retrieve integration " + integration.id + " from the current Client");
            return null;
        }
    };
    /** Waits for the client to be done with processing. */
    BaseClient.prototype._isClientProcessing = function (timeout) {
        var _this = this;
        return new _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["SyncPromise"](function (resolve) {
            var ticked = 0;
            var tick = 1;
            var interval = 0;
            clearInterval(interval);
            interval = setInterval(function () {
                if (!_this._processing) {
                    resolve({
                        interval: interval,
                        ready: true,
                    });
                }
                else {
                    ticked += tick;
                    if (timeout && ticked >= timeout) {
                        resolve({
                            interval: interval,
                            ready: false,
                        });
                    }
                }
            }, tick);
        });
    };
    /** Returns the current backend. */
    BaseClient.prototype._getBackend = function () {
        return this._backend;
    };
    /** Determines whether this SDK is enabled and a valid Dsn is present. */
    BaseClient.prototype._isEnabled = function () {
        return this.getOptions().enabled !== false && this._dsn !== undefined;
    };
    /**
     * Adds common information to events.
     *
     * The information includes release and environment from `options`,
     * breadcrumbs and context (extra, tags and user) from the scope.
     *
     * Information that is already present in the event is never overwritten. For
     * nested objects, such as the context, keys are merged.
     *
     * @param event The original event.
     * @param hint May contain additional information about the original exception.
     * @param scope A scope containing event metadata.
     * @returns A new event with more information.
     */
    BaseClient.prototype._prepareEvent = function (event, scope, hint) {
        var _this = this;
        var _a = this.getOptions().normalizeDepth, normalizeDepth = _a === void 0 ? 3 : _a;
        var prepared = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event, { event_id: event.event_id || (hint && hint.event_id ? hint.event_id : Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["uuid4"])()), timestamp: event.timestamp || Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["timestampWithMs"])() });
        this._applyClientOptions(prepared);
        this._applyIntegrationsMetadata(prepared);
        // If we have scope given to us, use it as the base for further modifications.
        // This allows us to prevent unnecessary copying of data if `captureContext` is not provided.
        var finalScope = scope;
        if (hint && hint.captureContext) {
            finalScope = _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["Scope"].clone(finalScope).update(hint.captureContext);
        }
        // We prepare the result here with a resolved Event.
        var result = _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["SyncPromise"].resolve(prepared);
        // This should be the last thing called, since we want that
        // {@link Hub.addEventProcessor} gets the finished prepared event.
        if (finalScope) {
            // In case we have a hub we reassign it.
            result = finalScope.applyToEvent(prepared, hint);
        }
        return result.then(function (evt) {
            // tslint:disable-next-line:strict-type-predicates
            if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {
                return _this._normalizeEvent(evt, normalizeDepth);
            }
            return evt;
        });
    };
    /**
     * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.
     * Normalized keys:
     * - `breadcrumbs.data`
     * - `user`
     * - `contexts`
     * - `extra`
     * @param event Event
     * @returns Normalized event
     */
    BaseClient.prototype._normalizeEvent = function (event, depth) {
        if (!event) {
            return null;
        }
        // tslint:disable:no-unsafe-any
        return tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event, (event.breadcrumbs && {
            breadcrumbs: event.breadcrumbs.map(function (b) { return (tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, b, (b.data && {
                data: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["normalize"])(b.data, depth),
            }))); }),
        }), (event.user && {
            user: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["normalize"])(event.user, depth),
        }), (event.contexts && {
            contexts: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["normalize"])(event.contexts, depth),
        }), (event.extra && {
            extra: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["normalize"])(event.extra, depth),
        }));
    };
    /**
     *  Enhances event using the client configuration.
     *  It takes care of all "static" values like environment, release and `dist`,
     *  as well as truncating overly long values.
     * @param event event instance to be enhanced
     */
    BaseClient.prototype._applyClientOptions = function (event) {
        var _a = this.getOptions(), environment = _a.environment, release = _a.release, dist = _a.dist, _b = _a.maxValueLength, maxValueLength = _b === void 0 ? 250 : _b;
        if (event.environment === undefined && environment !== undefined) {
            event.environment = environment;
        }
        if (event.release === undefined && release !== undefined) {
            event.release = release;
        }
        if (event.dist === undefined && dist !== undefined) {
            event.dist = dist;
        }
        if (event.message) {
            event.message = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["truncate"])(event.message, maxValueLength);
        }
        var exception = event.exception && event.exception.values && event.exception.values[0];
        if (exception && exception.value) {
            exception.value = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["truncate"])(exception.value, maxValueLength);
        }
        var request = event.request;
        if (request && request.url) {
            request.url = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["truncate"])(request.url, maxValueLength);
        }
    };
    /**
     * This function adds all used integrations to the SDK info in the event.
     * @param sdkInfo The sdkInfo of the event that will be filled with all integrations.
     */
    BaseClient.prototype._applyIntegrationsMetadata = function (event) {
        var sdkInfo = event.sdk;
        var integrationsArray = Object.keys(this._integrations);
        if (sdkInfo && integrationsArray.length > 0) {
            sdkInfo.integrations = integrationsArray;
        }
    };
    /**
     * Tells the backend to send this event
     * @param event The Sentry event to send
     */
    BaseClient.prototype._sendEvent = function (event) {
        this._getBackend().sendEvent(event);
    };
    /**
     * Processes an event (either error or message) and sends it to Sentry.
     *
     * This also adds breadcrumbs and context information to the event. However,
     * platform specific meta data (such as the User's IP address) must be added
     * by the SDK implementor.
     *
     *
     * @param event The event to send to Sentry.
     * @param hint May contain additional information about the original exception.
     * @param scope A scope containing event metadata.
     * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.
     */
    BaseClient.prototype._processEvent = function (event, hint, scope) {
        var _this = this;
        var _a = this.getOptions(), beforeSend = _a.beforeSend, sampleRate = _a.sampleRate;
        if (!this._isEnabled()) {
            return _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["SyncPromise"].reject('SDK not enabled, will not send event.');
        }
        var isTransaction = event.type === 'transaction';
        // 1.0 === 100% events are sent
        // 0.0 === 0% events are sent
        // Sampling for transaction happens somewhere else
        if (!isTransaction && typeof sampleRate === 'number' && Math.random() > sampleRate) {
            return _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["SyncPromise"].reject('This event has been sampled, will not send event.');
        }
        return new _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["SyncPromise"](function (resolve, reject) {
            _this._prepareEvent(event, scope, hint)
                .then(function (prepared) {
                if (prepared === null) {
                    reject('An event processor returned null, will not send event.');
                    return;
                }
                var finalEvent = prepared;
                var isInternalException = hint && hint.data && hint.data.__sentry__ === true;
                // We skip beforeSend in case of transactions
                if (isInternalException || !beforeSend || isTransaction) {
                    _this._sendEvent(finalEvent);
                    resolve(finalEvent);
                    return;
                }
                var beforeSendResult = beforeSend(prepared, hint);
                // tslint:disable-next-line:strict-type-predicates
                if (typeof beforeSendResult === 'undefined') {
                    _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error('`beforeSend` method has to return `null` or a valid event.');
                }
                else if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isThenable"])(beforeSendResult)) {
                    _this._handleAsyncBeforeSend(beforeSendResult, resolve, reject);
                }
                else {
                    finalEvent = beforeSendResult;
                    if (finalEvent === null) {
                        _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].log('`beforeSend` returned `null`, will not send event.');
                        resolve(null);
                        return;
                    }
                    // From here on we are really async
                    _this._sendEvent(finalEvent);
                    resolve(finalEvent);
                }
            })
                .then(null, function (reason) {
                _this.captureException(reason, {
                    data: {
                        __sentry__: true,
                    },
                    originalException: reason,
                });
                reject("Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\nReason: " + reason);
            });
        });
    };
    /**
     * Resolves before send Promise and calls resolve/reject on parent SyncPromise.
     */
    BaseClient.prototype._handleAsyncBeforeSend = function (beforeSend, resolve, reject) {
        var _this = this;
        beforeSend
            .then(function (processedEvent) {
            if (processedEvent === null) {
                reject('`beforeSend` returned `null`, will not send event.');
                return;
            }
            // From here on we are really async
            _this._sendEvent(processedEvent);
            resolve(processedEvent);
        })
            .then(null, function (e) {
            reject("beforeSend rejected with " + e);
        });
    };
    return BaseClient;
}());

//# sourceMappingURL=baseclient.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/index.js":
/*!************************************************!*\
  !*** ./node_modules/@sentry/core/esm/index.js ***!
  \************************************************/
/*! exports provided: addBreadcrumb, captureException, captureEvent, captureMessage, configureScope, startTransaction, setContext, setExtra, setExtras, setTag, setTags, setUser, withScope, addGlobalEventProcessor, getCurrentHub, getHubFromCarrier, Hub, Scope, API, BaseClient, BaseBackend, eventToSentryRequest, initAndBind, NoopTransport, Integrations */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/minimal */ "./node_modules/@sentry/minimal/esm/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addBreadcrumb", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["addBreadcrumb"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureException", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["captureException"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureEvent", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["captureEvent"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureMessage", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["captureMessage"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "configureScope", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["configureScope"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startTransaction", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["startTransaction"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setContext", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setContext"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtra", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setExtra"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtras", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setExtras"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTag", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setTag"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTags", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setTags"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setUser", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setUser"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withScope", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["withScope"]; });

/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addGlobalEventProcessor", function() { return _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getCurrentHub", function() { return _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getHubFromCarrier", function() { return _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["getHubFromCarrier"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Hub", function() { return _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["Hub"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scope", function() { return _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["Scope"]; });

/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./api */ "./node_modules/@sentry/core/esm/api.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "API", function() { return _api__WEBPACK_IMPORTED_MODULE_2__["API"]; });

/* harmony import */ var _baseclient__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./baseclient */ "./node_modules/@sentry/core/esm/baseclient.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BaseClient", function() { return _baseclient__WEBPACK_IMPORTED_MODULE_3__["BaseClient"]; });

/* harmony import */ var _basebackend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./basebackend */ "./node_modules/@sentry/core/esm/basebackend.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BaseBackend", function() { return _basebackend__WEBPACK_IMPORTED_MODULE_4__["BaseBackend"]; });

/* harmony import */ var _request__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./request */ "./node_modules/@sentry/core/esm/request.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eventToSentryRequest", function() { return _request__WEBPACK_IMPORTED_MODULE_5__["eventToSentryRequest"]; });

/* harmony import */ var _sdk__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./sdk */ "./node_modules/@sentry/core/esm/sdk.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "initAndBind", function() { return _sdk__WEBPACK_IMPORTED_MODULE_6__["initAndBind"]; });

/* harmony import */ var _transports_noop__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./transports/noop */ "./node_modules/@sentry/core/esm/transports/noop.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NoopTransport", function() { return _transports_noop__WEBPACK_IMPORTED_MODULE_7__["NoopTransport"]; });

/* harmony import */ var _integrations__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./integrations */ "./node_modules/@sentry/core/esm/integrations/index.js");
/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "Integrations", function() { return _integrations__WEBPACK_IMPORTED_MODULE_8__; });










//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/integration.js":
/*!******************************************************!*\
  !*** ./node_modules/@sentry/core/esm/integration.js ***!
  \******************************************************/
/*! exports provided: installedIntegrations, getIntegrationsToSetup, setupIntegration, setupIntegrations */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "installedIntegrations", function() { return installedIntegrations; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIntegrationsToSetup", function() { return getIntegrationsToSetup; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setupIntegration", function() { return setupIntegration; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setupIntegrations", function() { return setupIntegrations; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");



var installedIntegrations = [];
/** Gets integration to install */
function getIntegrationsToSetup(options) {
    var defaultIntegrations = (options.defaultIntegrations && tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](options.defaultIntegrations)) || [];
    var userIntegrations = options.integrations;
    var integrations = [];
    if (Array.isArray(userIntegrations)) {
        var userIntegrationsNames_1 = userIntegrations.map(function (i) { return i.name; });
        var pickedIntegrationsNames_1 = [];
        // Leave only unique default integrations, that were not overridden with provided user integrations
        defaultIntegrations.forEach(function (defaultIntegration) {
            if (userIntegrationsNames_1.indexOf(defaultIntegration.name) === -1 &&
                pickedIntegrationsNames_1.indexOf(defaultIntegration.name) === -1) {
                integrations.push(defaultIntegration);
                pickedIntegrationsNames_1.push(defaultIntegration.name);
            }
        });
        // Don't add same user integration twice
        userIntegrations.forEach(function (userIntegration) {
            if (pickedIntegrationsNames_1.indexOf(userIntegration.name) === -1) {
                integrations.push(userIntegration);
                pickedIntegrationsNames_1.push(userIntegration.name);
            }
        });
    }
    else if (typeof userIntegrations === 'function') {
        integrations = userIntegrations(defaultIntegrations);
        integrations = Array.isArray(integrations) ? integrations : [integrations];
    }
    else {
        integrations = tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](defaultIntegrations);
    }
    // Make sure that if present, `Debug` integration will always run last
    var integrationsNames = integrations.map(function (i) { return i.name; });
    var alwaysLastToRun = 'Debug';
    if (integrationsNames.indexOf(alwaysLastToRun) !== -1) {
        integrations.push.apply(integrations, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1)));
    }
    return integrations;
}
/** Setup given integration */
function setupIntegration(integration) {
    if (installedIntegrations.indexOf(integration.name) !== -1) {
        return;
    }
    integration.setupOnce(_sentry_hub__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"], _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"]);
    installedIntegrations.push(integration.name);
    _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].log("Integration installed: " + integration.name);
}
/**
 * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default
 * integrations are added unless they were already provided before.
 * @param integrations array of integration instances
 * @param withDefault should enable default integrations
 */
function setupIntegrations(options) {
    var integrations = {};
    getIntegrationsToSetup(options).forEach(function (integration) {
        integrations[integration.name] = integration;
        setupIntegration(integration);
    });
    return integrations;
}
//# sourceMappingURL=integration.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/integrations/functiontostring.js":
/*!************************************************************************!*\
  !*** ./node_modules/@sentry/core/esm/integrations/functiontostring.js ***!
  \************************************************************************/
/*! exports provided: FunctionToString */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FunctionToString", function() { return FunctionToString; });
var originalFunctionToString;
/** Patch toString calls to return proper name for wrapped functions */
var FunctionToString = /** @class */ (function () {
    function FunctionToString() {
        /**
         * @inheritDoc
         */
        this.name = FunctionToString.id;
    }
    /**
     * @inheritDoc
     */
    FunctionToString.prototype.setupOnce = function () {
        originalFunctionToString = Function.prototype.toString;
        Function.prototype.toString = function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var context = this.__sentry_original__ || this;
            // tslint:disable-next-line:no-unsafe-any
            return originalFunctionToString.apply(context, args);
        };
    };
    /**
     * @inheritDoc
     */
    FunctionToString.id = 'FunctionToString';
    return FunctionToString;
}());

//# sourceMappingURL=functiontostring.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/integrations/inboundfilters.js":
/*!**********************************************************************!*\
  !*** ./node_modules/@sentry/core/esm/integrations/inboundfilters.js ***!
  \**********************************************************************/
/*! exports provided: InboundFilters */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InboundFilters", function() { return InboundFilters; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");



// "Script error." is hard coded into browsers for errors that it can't read.
// this is the result of a script being pulled in from an external domain and CORS.
var DEFAULT_IGNORE_ERRORS = [/^Script error\.?$/, /^Javascript error: Script error\.? on line 0$/];
/** Inbound filters configurable by the user */
var InboundFilters = /** @class */ (function () {
    function InboundFilters(_options) {
        if (_options === void 0) { _options = {}; }
        this._options = _options;
        /**
         * @inheritDoc
         */
        this.name = InboundFilters.id;
    }
    /**
     * @inheritDoc
     */
    InboundFilters.prototype.setupOnce = function () {
        Object(_sentry_hub__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"])(function (event) {
            var hub = Object(_sentry_hub__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])();
            if (!hub) {
                return event;
            }
            var self = hub.getIntegration(InboundFilters);
            if (self) {
                var client = hub.getClient();
                var clientOptions = client ? client.getOptions() : {};
                var options = self._mergeOptions(clientOptions);
                if (self._shouldDropEvent(event, options)) {
                    return null;
                }
            }
            return event;
        });
    };
    /** JSDoc */
    InboundFilters.prototype._shouldDropEvent = function (event, options) {
        if (this._isSentryError(event, options)) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("Event dropped due to being internal Sentry Error.\nEvent: " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event));
            return true;
        }
        if (this._isIgnoredError(event, options)) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("Event dropped due to being matched by `ignoreErrors` option.\nEvent: " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event));
            return true;
        }
        if (this._isBlacklistedUrl(event, options)) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("Event dropped due to being matched by `blacklistUrls` option.\nEvent: " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event) + ".\nUrl: " + this._getEventFilterUrl(event));
            return true;
        }
        if (!this._isWhitelistedUrl(event, options)) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("Event dropped due to not being matched by `whitelistUrls` option.\nEvent: " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event) + ".\nUrl: " + this._getEventFilterUrl(event));
            return true;
        }
        return false;
    };
    /** JSDoc */
    InboundFilters.prototype._isSentryError = function (event, options) {
        if (options === void 0) { options = {}; }
        if (!options.ignoreInternal) {
            return false;
        }
        try {
            return ((event &&
                event.exception &&
                event.exception.values &&
                event.exception.values[0] &&
                event.exception.values[0].type === 'SentryError') ||
                false);
        }
        catch (_oO) {
            return false;
        }
    };
    /** JSDoc */
    InboundFilters.prototype._isIgnoredError = function (event, options) {
        if (options === void 0) { options = {}; }
        if (!options.ignoreErrors || !options.ignoreErrors.length) {
            return false;
        }
        return this._getPossibleEventMessages(event).some(function (message) {
            // Not sure why TypeScript complains here...
            return options.ignoreErrors.some(function (pattern) { return Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isMatchingPattern"])(message, pattern); });
        });
    };
    /** JSDoc */
    InboundFilters.prototype._isBlacklistedUrl = function (event, options) {
        if (options === void 0) { options = {}; }
        // TODO: Use Glob instead?
        if (!options.blacklistUrls || !options.blacklistUrls.length) {
            return false;
        }
        var url = this._getEventFilterUrl(event);
        return !url ? false : options.blacklistUrls.some(function (pattern) { return Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isMatchingPattern"])(url, pattern); });
    };
    /** JSDoc */
    InboundFilters.prototype._isWhitelistedUrl = function (event, options) {
        if (options === void 0) { options = {}; }
        // TODO: Use Glob instead?
        if (!options.whitelistUrls || !options.whitelistUrls.length) {
            return true;
        }
        var url = this._getEventFilterUrl(event);
        return !url ? true : options.whitelistUrls.some(function (pattern) { return Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isMatchingPattern"])(url, pattern); });
    };
    /** JSDoc */
    InboundFilters.prototype._mergeOptions = function (clientOptions) {
        if (clientOptions === void 0) { clientOptions = {}; }
        return {
            blacklistUrls: tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"]((this._options.blacklistUrls || []), (clientOptions.blacklistUrls || [])),
            ignoreErrors: tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"]((this._options.ignoreErrors || []), (clientOptions.ignoreErrors || []), DEFAULT_IGNORE_ERRORS),
            ignoreInternal: typeof this._options.ignoreInternal !== 'undefined' ? this._options.ignoreInternal : true,
            whitelistUrls: tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"]((this._options.whitelistUrls || []), (clientOptions.whitelistUrls || [])),
        };
    };
    /** JSDoc */
    InboundFilters.prototype._getPossibleEventMessages = function (event) {
        if (event.message) {
            return [event.message];
        }
        if (event.exception) {
            try {
                var _a = (event.exception.values && event.exception.values[0]) || {}, _b = _a.type, type = _b === void 0 ? '' : _b, _c = _a.value, value = _c === void 0 ? '' : _c;
                return ["" + value, type + ": " + value];
            }
            catch (oO) {
                _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error("Cannot extract message for event " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event));
                return [];
            }
        }
        return [];
    };
    /** JSDoc */
    InboundFilters.prototype._getEventFilterUrl = function (event) {
        try {
            if (event.stacktrace) {
                var frames_1 = event.stacktrace.frames;
                return (frames_1 && frames_1[frames_1.length - 1].filename) || null;
            }
            if (event.exception) {
                var frames_2 = event.exception.values && event.exception.values[0].stacktrace && event.exception.values[0].stacktrace.frames;
                return (frames_2 && frames_2[frames_2.length - 1].filename) || null;
            }
            return null;
        }
        catch (oO) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error("Cannot extract url for event " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event));
            return null;
        }
    };
    /**
     * @inheritDoc
     */
    InboundFilters.id = 'InboundFilters';
    return InboundFilters;
}());

//# sourceMappingURL=inboundfilters.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/integrations/index.js":
/*!*************************************************************!*\
  !*** ./node_modules/@sentry/core/esm/integrations/index.js ***!
  \*************************************************************/
/*! exports provided: FunctionToString, InboundFilters */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _functiontostring__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functiontostring */ "./node_modules/@sentry/core/esm/integrations/functiontostring.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FunctionToString", function() { return _functiontostring__WEBPACK_IMPORTED_MODULE_0__["FunctionToString"]; });

/* harmony import */ var _inboundfilters__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./inboundfilters */ "./node_modules/@sentry/core/esm/integrations/inboundfilters.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "InboundFilters", function() { return _inboundfilters__WEBPACK_IMPORTED_MODULE_1__["InboundFilters"]; });



//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/request.js":
/*!**************************************************!*\
  !*** ./node_modules/@sentry/core/esm/request.js ***!
  \**************************************************/
/*! exports provided: eventToSentryRequest */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eventToSentryRequest", function() { return eventToSentryRequest; });
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");

/** Creates a SentryRequest from an event. */
function eventToSentryRequest(event, api) {
    var useEnvelope = event.type === 'transaction';
    var req = {
        body: JSON.stringify(event),
        url: useEnvelope ? api.getEnvelopeEndpointWithUrlEncodedAuth() : api.getStoreEndpointWithUrlEncodedAuth(),
    };
    // https://develop.sentry.dev/sdk/envelopes/
    // Since we don't need to manipulate envelopes nor store them, there is no
    // exported concept of an Envelope with operations including serialization and
    // deserialization. Instead, we only implement a minimal subset of the spec to
    // serialize events inline here.
    if (useEnvelope) {
        var envelopeHeaders = JSON.stringify({
            event_id: event.event_id,
            // We need to add * 1000 since we divide it by 1000 by default but JS works with ms precision
            // The reason we use timestampWithMs here is that all clocks across the SDK use the same clock
            sent_at: new Date(Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["timestampWithMs"])() * 1000).toISOString(),
        });
        var itemHeaders = JSON.stringify({
            type: event.type,
        });
        // The trailing newline is optional. We intentionally don't send it to avoid
        // sending unnecessary bytes.
        //
        // const envelope = `${envelopeHeaders}\n${itemHeaders}\n${req.body}\n`;
        var envelope = envelopeHeaders + "\n" + itemHeaders + "\n" + req.body;
        req.body = envelope;
    }
    return req;
}
//# sourceMappingURL=request.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/sdk.js":
/*!**********************************************!*\
  !*** ./node_modules/@sentry/core/esm/sdk.js ***!
  \**********************************************/
/*! exports provided: initAndBind */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initAndBind", function() { return initAndBind; });
/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");


/**
 * Internal function to create a new SDK client instance. The client is
 * installed and then bound to the current scope.
 *
 * @param clientClass The client class to instanciate.
 * @param options Options to pass to the client.
 */
function initAndBind(clientClass, options) {
    if (options.debug === true) {
        _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["logger"].enable();
    }
    var hub = Object(_sentry_hub__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])();
    var client = new clientClass(options);
    hub.bindClient(client);
}
//# sourceMappingURL=sdk.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/transports/noop.js":
/*!**********************************************************!*\
  !*** ./node_modules/@sentry/core/esm/transports/noop.js ***!
  \**********************************************************/
/*! exports provided: NoopTransport */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NoopTransport", function() { return NoopTransport; });
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");


/** Noop transport */
var NoopTransport = /** @class */ (function () {
    function NoopTransport() {
    }
    /**
     * @inheritDoc
     */
    NoopTransport.prototype.sendEvent = function (_) {
        return _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].resolve({
            reason: "NoopTransport: Event has been skipped because no Dsn is configured.",
            status: _sentry_types__WEBPACK_IMPORTED_MODULE_0__["Status"].Skipped,
        });
    };
    /**
     * @inheritDoc
     */
    NoopTransport.prototype.close = function (_) {
        return _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].resolve(true);
    };
    return NoopTransport;
}());

//# sourceMappingURL=noop.js.map

/***/ }),

/***/ "./node_modules/@sentry/hub/esm/hub.js":
/*!*********************************************!*\
  !*** ./node_modules/@sentry/hub/esm/hub.js ***!
  \*********************************************/
/*! exports provided: API_VERSION, Hub, getMainCarrier, makeMain, getCurrentHub, getHubFromCarrier, setHubOnCarrier */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "API_VERSION", function() { return API_VERSION; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Hub", function() { return Hub; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMainCarrier", function() { return getMainCarrier; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "makeMain", function() { return makeMain; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCurrentHub", function() { return getCurrentHub; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getHubFromCarrier", function() { return getHubFromCarrier; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setHubOnCarrier", function() { return setHubOnCarrier; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _scope__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./scope */ "./node_modules/@sentry/hub/esm/scope.js");



/**
 * API compatibility version of this hub.
 *
 * WARNING: This number should only be incresed when the global interface
 * changes a and new methods are introduced.
 *
 * @hidden
 */
var API_VERSION = 3;
/**
 * Default maximum number of breadcrumbs added to an event. Can be overwritten
 * with {@link Options.maxBreadcrumbs}.
 */
var DEFAULT_BREADCRUMBS = 100;
/**
 * Absolute maximum number of breadcrumbs added to an event. The
 * `maxBreadcrumbs` option cannot be higher than this value.
 */
var MAX_BREADCRUMBS = 100;
/**
 * @inheritDoc
 */
var Hub = /** @class */ (function () {
    /**
     * Creates a new instance of the hub, will push one {@link Layer} into the
     * internal stack on creation.
     *
     * @param client bound to the hub.
     * @param scope bound to the hub.
     * @param version number, higher number means higher priority.
     */
    function Hub(client, scope, _version) {
        if (scope === void 0) { scope = new _scope__WEBPACK_IMPORTED_MODULE_2__["Scope"](); }
        if (_version === void 0) { _version = API_VERSION; }
        this._version = _version;
        /** Is a {@link Layer}[] containing the client and scope */
        this._stack = [];
        this._stack.push({ client: client, scope: scope });
    }
    /**
     * Internal helper function to call a method on the top client if it exists.
     *
     * @param method The method to call on the client.
     * @param args Arguments to pass to the client function.
     */
    Hub.prototype._invokeClient = function (method) {
        var _a;
        var args = [];
        for (var _i = 1; _i < arguments.length; _i++) {
            args[_i - 1] = arguments[_i];
        }
        var top = this.getStackTop();
        if (top && top.client && top.client[method]) {
            (_a = top.client)[method].apply(_a, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args, [top.scope]));
        }
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.isOlderThan = function (version) {
        return this._version < version;
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.bindClient = function (client) {
        var top = this.getStackTop();
        top.client = client;
        if (client && client.setupIntegrations) {
            client.setupIntegrations();
        }
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.pushScope = function () {
        // We want to clone the content of prev scope
        var stack = this.getStack();
        var parentScope = stack.length > 0 ? stack[stack.length - 1].scope : undefined;
        var scope = _scope__WEBPACK_IMPORTED_MODULE_2__["Scope"].clone(parentScope);
        this.getStack().push({
            client: this.getClient(),
            scope: scope,
        });
        return scope;
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.popScope = function () {
        return this.getStack().pop() !== undefined;
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.withScope = function (callback) {
        var scope = this.pushScope();
        try {
            callback(scope);
        }
        finally {
            this.popScope();
        }
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.getClient = function () {
        return this.getStackTop().client;
    };
    /** Returns the scope of the top stack. */
    Hub.prototype.getScope = function () {
        return this.getStackTop().scope;
    };
    /** Returns the scope stack for domains or the process. */
    Hub.prototype.getStack = function () {
        return this._stack;
    };
    /** Returns the topmost scope layer in the order domain > local > process. */
    Hub.prototype.getStackTop = function () {
        return this._stack[this._stack.length - 1];
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.captureException = function (exception, hint) {
        var eventId = (this._lastEventId = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["uuid4"])());
        var finalHint = hint;
        // If there's no explicit hint provided, mimick the same thing that would happen
        // in the minimal itself to create a consistent behavior.
        // We don't do this in the client, as it's the lowest level API, and doing this,
        // would prevent user from having full control over direct calls.
        if (!hint) {
            var syntheticException = void 0;
            try {
                throw new Error('Sentry syntheticException');
            }
            catch (exception) {
                syntheticException = exception;
            }
            finalHint = {
                originalException: exception,
                syntheticException: syntheticException,
            };
        }
        this._invokeClient('captureException', exception, tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, finalHint, { event_id: eventId }));
        return eventId;
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.captureMessage = function (message, level, hint) {
        var eventId = (this._lastEventId = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["uuid4"])());
        var finalHint = hint;
        // If there's no explicit hint provided, mimick the same thing that would happen
        // in the minimal itself to create a consistent behavior.
        // We don't do this in the client, as it's the lowest level API, and doing this,
        // would prevent user from having full control over direct calls.
        if (!hint) {
            var syntheticException = void 0;
            try {
                throw new Error(message);
            }
            catch (exception) {
                syntheticException = exception;
            }
            finalHint = {
                originalException: message,
                syntheticException: syntheticException,
            };
        }
        this._invokeClient('captureMessage', message, level, tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, finalHint, { event_id: eventId }));
        return eventId;
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.captureEvent = function (event, hint) {
        var eventId = (this._lastEventId = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["uuid4"])());
        this._invokeClient('captureEvent', event, tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, hint, { event_id: eventId }));
        return eventId;
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.lastEventId = function () {
        return this._lastEventId;
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.addBreadcrumb = function (breadcrumb, hint) {
        var top = this.getStackTop();
        if (!top.scope || !top.client) {
            return;
        }
        var _a = (top.client.getOptions && top.client.getOptions()) || {}, _b = _a.beforeBreadcrumb, beforeBreadcrumb = _b === void 0 ? null : _b, _c = _a.maxBreadcrumbs, maxBreadcrumbs = _c === void 0 ? DEFAULT_BREADCRUMBS : _c;
        if (maxBreadcrumbs <= 0) {
            return;
        }
        var timestamp = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["timestampWithMs"])();
        var mergedBreadcrumb = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ timestamp: timestamp }, breadcrumb);
        var finalBreadcrumb = beforeBreadcrumb
            ? Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["consoleSandbox"])(function () { return beforeBreadcrumb(mergedBreadcrumb, hint); })
            : mergedBreadcrumb;
        if (finalBreadcrumb === null) {
            return;
        }
        top.scope.addBreadcrumb(finalBreadcrumb, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS));
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.setUser = function (user) {
        var top = this.getStackTop();
        if (!top.scope) {
            return;
        }
        top.scope.setUser(user);
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.setTags = function (tags) {
        var top = this.getStackTop();
        if (!top.scope) {
            return;
        }
        top.scope.setTags(tags);
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.setExtras = function (extras) {
        var top = this.getStackTop();
        if (!top.scope) {
            return;
        }
        top.scope.setExtras(extras);
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.setTag = function (key, value) {
        var top = this.getStackTop();
        if (!top.scope) {
            return;
        }
        top.scope.setTag(key, value);
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.setExtra = function (key, extra) {
        var top = this.getStackTop();
        if (!top.scope) {
            return;
        }
        top.scope.setExtra(key, extra);
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.setContext = function (name, context) {
        var top = this.getStackTop();
        if (!top.scope) {
            return;
        }
        top.scope.setContext(name, context);
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.configureScope = function (callback) {
        var top = this.getStackTop();
        if (top.scope && top.client) {
            callback(top.scope);
        }
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.run = function (callback) {
        var oldHub = makeMain(this);
        try {
            callback(this);
        }
        finally {
            makeMain(oldHub);
        }
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.getIntegration = function (integration) {
        var client = this.getClient();
        if (!client) {
            return null;
        }
        try {
            return client.getIntegration(integration);
        }
        catch (_oO) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["logger"].warn("Cannot retrieve integration " + integration.id + " from the current Hub");
            return null;
        }
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.startSpan = function (context) {
        return this._callExtensionMethod('startSpan', context);
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.startTransaction = function (context) {
        return this._callExtensionMethod('startTransaction', context);
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.traceHeaders = function () {
        return this._callExtensionMethod('traceHeaders');
    };
    /**
     * Calls global extension method and binding current instance to the function call
     */
    // @ts-ignore
    Hub.prototype._callExtensionMethod = function (method) {
        var args = [];
        for (var _i = 1; _i < arguments.length; _i++) {
            args[_i - 1] = arguments[_i];
        }
        var carrier = getMainCarrier();
        var sentry = carrier.__SENTRY__;
        // tslint:disable-next-line: strict-type-predicates
        if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') {
            return sentry.extensions[method].apply(this, args);
        }
        _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["logger"].warn("Extension method " + method + " couldn't be found, doing nothing.");
    };
    return Hub;
}());

/** Returns the global shim registry. */
function getMainCarrier() {
    var carrier = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
    carrier.__SENTRY__ = carrier.__SENTRY__ || {
        extensions: {},
        hub: undefined,
    };
    return carrier;
}
/**
 * Replaces the current main hub with the passed one on the global object
 *
 * @returns The old replaced hub
 */
function makeMain(hub) {
    var registry = getMainCarrier();
    var oldHub = getHubFromCarrier(registry);
    setHubOnCarrier(registry, hub);
    return oldHub;
}
/**
 * Returns the default hub instance.
 *
 * If a hub is already registered in the global carrier but this module
 * contains a more recent version, it replaces the registered version.
 * Otherwise, the currently registered hub will be returned.
 */
function getCurrentHub() {
    // Get main carrier (global for every environment)
    var registry = getMainCarrier();
    // If there's no hub, or its an old API, assign a new one
    if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) {
        setHubOnCarrier(registry, new Hub());
    }
    // Prefer domains over global if they are there (applicable only to Node environment)
    if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["isNodeEnv"])()) {
        return getHubFromActiveDomain(registry);
    }
    // Return hub that lives on a global object
    return getHubFromCarrier(registry);
}
/**
 * Try to read the hub from an active domain, fallback to the registry if one doesnt exist
 * @returns discovered hub
 */
function getHubFromActiveDomain(registry) {
    try {
        var property = 'domain';
        var carrier = getMainCarrier();
        var sentry = carrier.__SENTRY__;
        // tslint:disable-next-line: strict-type-predicates
        if (!sentry || !sentry.extensions || !sentry.extensions[property]) {
            return getHubFromCarrier(registry);
        }
        var domain = sentry.extensions[property];
        var activeDomain = domain.active;
        // If there no active domain, just return global hub
        if (!activeDomain) {
            return getHubFromCarrier(registry);
        }
        // If there's no hub on current domain, or its an old API, assign a new one
        if (!hasHubOnCarrier(activeDomain) || getHubFromCarrier(activeDomain).isOlderThan(API_VERSION)) {
            var registryHubTopStack = getHubFromCarrier(registry).getStackTop();
            setHubOnCarrier(activeDomain, new Hub(registryHubTopStack.client, _scope__WEBPACK_IMPORTED_MODULE_2__["Scope"].clone(registryHubTopStack.scope)));
        }
        // Return hub that lives on a domain
        return getHubFromCarrier(activeDomain);
    }
    catch (_Oo) {
        // Return hub that lives on a global object
        return getHubFromCarrier(registry);
    }
}
/**
 * This will tell whether a carrier has a hub on it or not
 * @param carrier object
 */
function hasHubOnCarrier(carrier) {
    if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {
        return true;
    }
    return false;
}
/**
 * This will create a new {@link Hub} and add to the passed object on
 * __SENTRY__.hub.
 * @param carrier object
 * @hidden
 */
function getHubFromCarrier(carrier) {
    if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {
        return carrier.__SENTRY__.hub;
    }
    carrier.__SENTRY__ = carrier.__SENTRY__ || {};
    carrier.__SENTRY__.hub = new Hub();
    return carrier.__SENTRY__.hub;
}
/**
 * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute
 * @param carrier object
 * @param hub Hub
 */
function setHubOnCarrier(carrier, hub) {
    if (!carrier) {
        return false;
    }
    carrier.__SENTRY__ = carrier.__SENTRY__ || {};
    carrier.__SENTRY__.hub = hub;
    return true;
}
//# sourceMappingURL=hub.js.map

/***/ }),

/***/ "./node_modules/@sentry/hub/esm/index.js":
/*!***********************************************!*\
  !*** ./node_modules/@sentry/hub/esm/index.js ***!
  \***********************************************/
/*! exports provided: addGlobalEventProcessor, Scope, getCurrentHub, getHubFromCarrier, getMainCarrier, Hub, makeMain, setHubOnCarrier */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _scope__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./scope */ "./node_modules/@sentry/hub/esm/scope.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addGlobalEventProcessor", function() { return _scope__WEBPACK_IMPORTED_MODULE_0__["addGlobalEventProcessor"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scope", function() { return _scope__WEBPACK_IMPORTED_MODULE_0__["Scope"]; });

/* harmony import */ var _hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./hub */ "./node_modules/@sentry/hub/esm/hub.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getCurrentHub", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getHubFromCarrier", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["getHubFromCarrier"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getMainCarrier", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["getMainCarrier"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Hub", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["Hub"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "makeMain", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["makeMain"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setHubOnCarrier", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["setHubOnCarrier"]; });



//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/hub/esm/scope.js":
/*!***********************************************!*\
  !*** ./node_modules/@sentry/hub/esm/scope.js ***!
  \***********************************************/
/*! exports provided: Scope, addGlobalEventProcessor */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Scope", function() { return Scope; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addGlobalEventProcessor", function() { return addGlobalEventProcessor; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");


/**
 * Holds additional event information. {@link Scope.applyToEvent} will be
 * called by the client before an event will be sent.
 */
var Scope = /** @class */ (function () {
    function Scope() {
        /** Flag if notifiying is happening. */
        this._notifyingListeners = false;
        /** Callback for client to receive scope changes. */
        this._scopeListeners = [];
        /** Callback list that will be called after {@link applyToEvent}. */
        this._eventProcessors = [];
        /** Array of breadcrumbs. */
        this._breadcrumbs = [];
        /** User */
        this._user = {};
        /** Tags */
        this._tags = {};
        /** Extra */
        this._extra = {};
        /** Contexts */
        this._contexts = {};
    }
    /**
     * Add internal on change listener. Used for sub SDKs that need to store the scope.
     * @hidden
     */
    Scope.prototype.addScopeListener = function (callback) {
        this._scopeListeners.push(callback);
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.addEventProcessor = function (callback) {
        this._eventProcessors.push(callback);
        return this;
    };
    /**
     * This will be called on every set call.
     */
    Scope.prototype._notifyScopeListeners = function () {
        var _this = this;
        if (!this._notifyingListeners) {
            this._notifyingListeners = true;
            setTimeout(function () {
                _this._scopeListeners.forEach(function (callback) {
                    callback(_this);
                });
                _this._notifyingListeners = false;
            });
        }
    };
    /**
     * This will be called after {@link applyToEvent} is finished.
     */
    Scope.prototype._notifyEventProcessors = function (processors, event, hint, index) {
        var _this = this;
        if (index === void 0) { index = 0; }
        return new _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"](function (resolve, reject) {
            var processor = processors[index];
            // tslint:disable-next-line:strict-type-predicates
            if (event === null || typeof processor !== 'function') {
                resolve(event);
            }
            else {
                var result = processor(tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event), hint);
                if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["isThenable"])(result)) {
                    result
                        .then(function (final) { return _this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve); })
                        .then(null, reject);
                }
                else {
                    _this._notifyEventProcessors(processors, result, hint, index + 1)
                        .then(resolve)
                        .then(null, reject);
                }
            }
        });
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setUser = function (user) {
        this._user = user || {};
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setTags = function (tags) {
        this._tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._tags, tags);
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setTag = function (key, value) {
        var _a;
        this._tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._tags, (_a = {}, _a[key] = value, _a));
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setExtras = function (extras) {
        this._extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._extra, extras);
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setExtra = function (key, extra) {
        var _a;
        this._extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._extra, (_a = {}, _a[key] = extra, _a));
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setFingerprint = function (fingerprint) {
        this._fingerprint = fingerprint;
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setLevel = function (level) {
        this._level = level;
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setTransaction = function (transaction) {
        this._transaction = transaction;
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setContext = function (key, context) {
        var _a;
        this._contexts = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._contexts, (_a = {}, _a[key] = context, _a));
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setSpan = function (span) {
        this._span = span;
        this._notifyScopeListeners();
        return this;
    };
    /**
     * Internal getter for Span, used in Hub.
     * @hidden
     */
    Scope.prototype.getSpan = function () {
        return this._span;
    };
    /**
     * Inherit values from the parent scope.
     * @param scope to clone.
     */
    Scope.clone = function (scope) {
        var newScope = new Scope();
        if (scope) {
            newScope._breadcrumbs = tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](scope._breadcrumbs);
            newScope._tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, scope._tags);
            newScope._extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, scope._extra);
            newScope._contexts = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, scope._contexts);
            newScope._user = scope._user;
            newScope._level = scope._level;
            newScope._span = scope._span;
            newScope._transaction = scope._transaction;
            newScope._fingerprint = scope._fingerprint;
            newScope._eventProcessors = tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](scope._eventProcessors);
        }
        return newScope;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.update = function (captureContext) {
        if (!captureContext) {
            return this;
        }
        if (typeof captureContext === 'function') {
            var updatedScope = captureContext(this);
            return updatedScope instanceof Scope ? updatedScope : this;
        }
        if (captureContext instanceof Scope) {
            this._tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._tags, captureContext._tags);
            this._extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._extra, captureContext._extra);
            this._contexts = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._contexts, captureContext._contexts);
            if (captureContext._user) {
                this._user = captureContext._user;
            }
            if (captureContext._level) {
                this._level = captureContext._level;
            }
            if (captureContext._fingerprint) {
                this._fingerprint = captureContext._fingerprint;
            }
        }
        else if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["isPlainObject"])(captureContext)) {
            // tslint:disable-next-line:no-parameter-reassignment
            captureContext = captureContext;
            this._tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._tags, captureContext.tags);
            this._extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._extra, captureContext.extra);
            this._contexts = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._contexts, captureContext.contexts);
            if (captureContext.user) {
                this._user = captureContext.user;
            }
            if (captureContext.level) {
                this._level = captureContext.level;
            }
            if (captureContext.fingerprint) {
                this._fingerprint = captureContext.fingerprint;
            }
        }
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.clear = function () {
        this._breadcrumbs = [];
        this._tags = {};
        this._extra = {};
        this._user = {};
        this._contexts = {};
        this._level = undefined;
        this._transaction = undefined;
        this._fingerprint = undefined;
        this._span = undefined;
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.addBreadcrumb = function (breadcrumb, maxBreadcrumbs) {
        var mergedBreadcrumb = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ timestamp: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["timestampWithMs"])() }, breadcrumb);
        this._breadcrumbs =
            maxBreadcrumbs !== undefined && maxBreadcrumbs >= 0
                ? tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](this._breadcrumbs, [mergedBreadcrumb]).slice(-maxBreadcrumbs)
                : tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](this._breadcrumbs, [mergedBreadcrumb]);
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.clearBreadcrumbs = function () {
        this._breadcrumbs = [];
        this._notifyScopeListeners();
        return this;
    };
    /**
     * Applies fingerprint from the scope to the event if there's one,
     * uses message if there's one instead or get rid of empty fingerprint
     */
    Scope.prototype._applyFingerprint = function (event) {
        // Make sure it's an array first and we actually have something in place
        event.fingerprint = event.fingerprint
            ? Array.isArray(event.fingerprint)
                ? event.fingerprint
                : [event.fingerprint]
            : [];
        // If we have something on the scope, then merge it with event
        if (this._fingerprint) {
            event.fingerprint = event.fingerprint.concat(this._fingerprint);
        }
        // If we have no data at all, remove empty array default
        if (event.fingerprint && !event.fingerprint.length) {
            delete event.fingerprint;
        }
    };
    /**
     * Applies the current context and fingerprint to the event.
     * Note that breadcrumbs will be added by the client.
     * Also if the event has already breadcrumbs on it, we do not merge them.
     * @param event Event
     * @param hint May contain additional informartion about the original exception.
     * @hidden
     */
    Scope.prototype.applyToEvent = function (event, hint) {
        if (this._extra && Object.keys(this._extra).length) {
            event.extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._extra, event.extra);
        }
        if (this._tags && Object.keys(this._tags).length) {
            event.tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._tags, event.tags);
        }
        if (this._user && Object.keys(this._user).length) {
            event.user = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._user, event.user);
        }
        if (this._contexts && Object.keys(this._contexts).length) {
            event.contexts = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._contexts, event.contexts);
        }
        if (this._level) {
            event.level = this._level;
        }
        if (this._transaction) {
            event.transaction = this._transaction;
        }
        this._applyFingerprint(event);
        event.breadcrumbs = tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"]((event.breadcrumbs || []), this._breadcrumbs);
        event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined;
        return this._notifyEventProcessors(tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](getGlobalEventProcessors(), this._eventProcessors), event, hint);
    };
    return Scope;
}());

/**
 * Retruns the global event processors.
 */
function getGlobalEventProcessors() {
    var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
    global.__SENTRY__ = global.__SENTRY__ || {};
    global.__SENTRY__.globalEventProcessors = global.__SENTRY__.globalEventProcessors || [];
    return global.__SENTRY__.globalEventProcessors;
}
/**
 * Add a EventProcessor to be kept globally.
 * @param callback EventProcessor to add
 */
function addGlobalEventProcessor(callback) {
    getGlobalEventProcessors().push(callback);
}
//# sourceMappingURL=scope.js.map

/***/ }),

/***/ "./node_modules/@sentry/minimal/esm/index.js":
/*!***************************************************!*\
  !*** ./node_modules/@sentry/minimal/esm/index.js ***!
  \***************************************************/
/*! exports provided: captureException, captureMessage, captureEvent, configureScope, addBreadcrumb, setContext, setExtras, setTags, setExtra, setTag, setUser, withScope, _callOnClient, startTransaction */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "captureException", function() { return captureException; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "captureMessage", function() { return captureMessage; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "captureEvent", function() { return captureEvent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "configureScope", function() { return configureScope; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addBreadcrumb", function() { return addBreadcrumb; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setContext", function() { return setContext; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setExtras", function() { return setExtras; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setTags", function() { return setTags; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setExtra", function() { return setExtra; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setTag", function() { return setTag; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setUser", function() { return setUser; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "withScope", function() { return withScope; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_callOnClient", function() { return _callOnClient; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "startTransaction", function() { return startTransaction; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");


/**
 * This calls a function on the current hub.
 * @param method function to call on hub.
 * @param args to pass to function.
 */
function callOnHub(method) {
    var args = [];
    for (var _i = 1; _i < arguments.length; _i++) {
        args[_i - 1] = arguments[_i];
    }
    var hub = Object(_sentry_hub__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])();
    if (hub && hub[method]) {
        // tslint:disable-next-line:no-unsafe-any
        return hub[method].apply(hub, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
    }
    throw new Error("No hub defined or " + method + " was not found on the hub, please open a bug report.");
}
/**
 * Captures an exception event and sends it to Sentry.
 *
 * @param exception An exception-like object.
 * @returns The generated eventId.
 */
function captureException(exception, captureContext) {
    var syntheticException;
    try {
        throw new Error('Sentry syntheticException');
    }
    catch (exception) {
        syntheticException = exception;
    }
    return callOnHub('captureException', exception, {
        captureContext: captureContext,
        originalException: exception,
        syntheticException: syntheticException,
    });
}
/**
 * Captures a message event and sends it to Sentry.
 *
 * @param message The message to send to Sentry.
 * @param level Define the level of the message.
 * @returns The generated eventId.
 */
function captureMessage(message, captureContext) {
    var syntheticException;
    try {
        throw new Error(message);
    }
    catch (exception) {
        syntheticException = exception;
    }
    // This is necessary to provide explicit scopes upgrade, without changing the original
    // arrity of the `captureMessage(message, level)` method.
    var level = typeof captureContext === 'string' ? captureContext : undefined;
    var context = typeof captureContext !== 'string' ? { captureContext: captureContext } : undefined;
    return callOnHub('captureMessage', message, level, tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ originalException: message, syntheticException: syntheticException }, context));
}
/**
 * Captures a manually created event and sends it to Sentry.
 *
 * @param event The event to send to Sentry.
 * @returns The generated eventId.
 */
function captureEvent(event) {
    return callOnHub('captureEvent', event);
}
/**
 * Callback to set context information onto the scope.
 * @param callback Callback function that receives Scope.
 */
function configureScope(callback) {
    callOnHub('configureScope', callback);
}
/**
 * Records a new breadcrumb which will be attached to future events.
 *
 * Breadcrumbs will be added to subsequent events to provide more context on
 * user's actions prior to an error or crash.
 *
 * @param breadcrumb The breadcrumb to record.
 */
function addBreadcrumb(breadcrumb) {
    callOnHub('addBreadcrumb', breadcrumb);
}
/**
 * Sets context data with the given name.
 * @param name of the context
 * @param context Any kind of data. This data will be normalized.
 */
function setContext(name, context) {
    callOnHub('setContext', name, context);
}
/**
 * Set an object that will be merged sent as extra data with the event.
 * @param extras Extras object to merge into current context.
 */
function setExtras(extras) {
    callOnHub('setExtras', extras);
}
/**
 * Set an object that will be merged sent as tags data with the event.
 * @param tags Tags context object to merge into current context.
 */
function setTags(tags) {
    callOnHub('setTags', tags);
}
/**
 * Set key:value that will be sent as extra data with the event.
 * @param key String of extra
 * @param extra Any kind of data. This data will be normalized.
 */
function setExtra(key, extra) {
    callOnHub('setExtra', key, extra);
}
/**
 * Set key:value that will be sent as tags data with the event.
 * @param key String key of tag
 * @param value String value of tag
 */
function setTag(key, value) {
    callOnHub('setTag', key, value);
}
/**
 * Updates user context information for future events.
 *
 * @param user User context object to be set in the current context. Pass `null` to unset the user.
 */
function setUser(user) {
    callOnHub('setUser', user);
}
/**
 * Creates a new scope with and executes the given operation within.
 * The scope is automatically removed once the operation
 * finishes or throws.
 *
 * This is essentially a convenience function for:
 *
 *     pushScope();
 *     callback();
 *     popScope();
 *
 * @param callback that will be enclosed into push/popScope.
 */
function withScope(callback) {
    callOnHub('withScope', callback);
}
/**
 * Calls a function on the latest client. Use this with caution, it's meant as
 * in "internal" helper so we don't need to expose every possible function in
 * the shim. It is not guaranteed that the client actually implements the
 * function.
 *
 * @param method The method to call on the client/client.
 * @param args Arguments to pass to the client/fontend.
 * @hidden
 */
function _callOnClient(method) {
    var args = [];
    for (var _i = 1; _i < arguments.length; _i++) {
        args[_i - 1] = arguments[_i];
    }
    callOnHub.apply(void 0, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](['_invokeClient', method], args));
}
/**
 * Starts a Transaction. This is the entry point to do manual tracing. You can
 * add child spans to transactions. Spans themselves can have children, building
 * a tree structure. This function returns a Transaction and you need to keep
 * track of the instance yourself. When you call `.finish()` on the transaction
 * it will be sent to Sentry.
 */
function startTransaction(context) {
    return callOnHub('startTransaction', tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, context));
}
//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/types/esm/index.js":
/*!*************************************************!*\
  !*** ./node_modules/@sentry/types/esm/index.js ***!
  \*************************************************/
/*! exports provided: LogLevel, Severity, Status */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _loglevel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./loglevel */ "./node_modules/@sentry/types/esm/loglevel.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogLevel", function() { return _loglevel__WEBPACK_IMPORTED_MODULE_0__["LogLevel"]; });

/* harmony import */ var _severity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./severity */ "./node_modules/@sentry/types/esm/severity.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Severity", function() { return _severity__WEBPACK_IMPORTED_MODULE_1__["Severity"]; });

/* harmony import */ var _status__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./status */ "./node_modules/@sentry/types/esm/status.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Status", function() { return _status__WEBPACK_IMPORTED_MODULE_2__["Status"]; });




//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/types/esm/loglevel.js":
/*!****************************************************!*\
  !*** ./node_modules/@sentry/types/esm/loglevel.js ***!
  \****************************************************/
/*! exports provided: LogLevel */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LogLevel", function() { return LogLevel; });
/** Console logging verbosity for the SDK. */
var LogLevel;
(function (LogLevel) {
    /** No logs will be generated. */
    LogLevel[LogLevel["None"] = 0] = "None";
    /** Only SDK internal errors will be logged. */
    LogLevel[LogLevel["Error"] = 1] = "Error";
    /** Information useful for debugging the SDK will be logged. */
    LogLevel[LogLevel["Debug"] = 2] = "Debug";
    /** All SDK actions will be logged. */
    LogLevel[LogLevel["Verbose"] = 3] = "Verbose";
})(LogLevel || (LogLevel = {}));
//# sourceMappingURL=loglevel.js.map

/***/ }),

/***/ "./node_modules/@sentry/types/esm/severity.js":
/*!****************************************************!*\
  !*** ./node_modules/@sentry/types/esm/severity.js ***!
  \****************************************************/
/*! exports provided: Severity */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Severity", function() { return Severity; });
/** JSDoc */
var Severity;
(function (Severity) {
    /** JSDoc */
    Severity["Fatal"] = "fatal";
    /** JSDoc */
    Severity["Error"] = "error";
    /** JSDoc */
    Severity["Warning"] = "warning";
    /** JSDoc */
    Severity["Log"] = "log";
    /** JSDoc */
    Severity["Info"] = "info";
    /** JSDoc */
    Severity["Debug"] = "debug";
    /** JSDoc */
    Severity["Critical"] = "critical";
})(Severity || (Severity = {}));
// tslint:disable:completed-docs
// tslint:disable:no-unnecessary-qualifier no-namespace
(function (Severity) {
    /**
     * Converts a string-based level into a {@link Severity}.
     *
     * @param level string representation of Severity
     * @returns Severity
     */
    function fromString(level) {
        switch (level) {
            case 'debug':
                return Severity.Debug;
            case 'info':
                return Severity.Info;
            case 'warn':
            case 'warning':
                return Severity.Warning;
            case 'error':
                return Severity.Error;
            case 'fatal':
                return Severity.Fatal;
            case 'critical':
                return Severity.Critical;
            case 'log':
            default:
                return Severity.Log;
        }
    }
    Severity.fromString = fromString;
})(Severity || (Severity = {}));
//# sourceMappingURL=severity.js.map

/***/ }),

/***/ "./node_modules/@sentry/types/esm/status.js":
/*!**************************************************!*\
  !*** ./node_modules/@sentry/types/esm/status.js ***!
  \**************************************************/
/*! exports provided: Status */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Status", function() { return Status; });
/** The status of an event. */
var Status;
(function (Status) {
    /** The status could not be determined. */
    Status["Unknown"] = "unknown";
    /** The event was skipped due to configuration or callbacks. */
    Status["Skipped"] = "skipped";
    /** The event was sent to Sentry successfully. */
    Status["Success"] = "success";
    /** The client is currently rate limited and will try again later. */
    Status["RateLimit"] = "rate_limit";
    /** The event could not be processed. */
    Status["Invalid"] = "invalid";
    /** A server-side error ocurred during submission. */
    Status["Failed"] = "failed";
})(Status || (Status = {}));
// tslint:disable:completed-docs
// tslint:disable:no-unnecessary-qualifier no-namespace
(function (Status) {
    /**
     * Converts a HTTP status code into a {@link Status}.
     *
     * @param code The HTTP response status code.
     * @returns The send status or {@link Status.Unknown}.
     */
    function fromHttpCode(code) {
        if (code >= 200 && code < 300) {
            return Status.Success;
        }
        if (code === 429) {
            return Status.RateLimit;
        }
        if (code >= 400 && code < 500) {
            return Status.Invalid;
        }
        if (code >= 500) {
            return Status.Failed;
        }
        return Status.Unknown;
    }
    Status.fromHttpCode = fromHttpCode;
})(Status || (Status = {}));
//# sourceMappingURL=status.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/async.js":
/*!*************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/async.js ***!
  \*************************************************/
/*! exports provided: forget */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forget", function() { return forget; });
/**
 * Consumes the promise and logs the error when it rejects.
 * @param promise A promise to forget.
 */
function forget(promise) {
    promise.then(null, function (e) {
        // TODO: Use a better logging mechanism
        console.error(e);
    });
}
//# sourceMappingURL=async.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/dsn.js":
/*!***********************************************!*\
  !*** ./node_modules/@sentry/utils/esm/dsn.js ***!
  \***********************************************/
/*! exports provided: Dsn */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Dsn", function() { return Dsn; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./error */ "./node_modules/@sentry/utils/esm/error.js");


/** Regular expression used to parse a Dsn. */
var DSN_REGEX = /^(?:(\w+):)\/\/(?:(\w+)(?::(\w+))?@)([\w\.-]+)(?::(\d+))?\/(.+)/;
/** Error message */
var ERROR_MESSAGE = 'Invalid Dsn';
/** The Sentry Dsn, identifying a Sentry instance and project. */
var Dsn = /** @class */ (function () {
    /** Creates a new Dsn component */
    function Dsn(from) {
        if (typeof from === 'string') {
            this._fromString(from);
        }
        else {
            this._fromComponents(from);
        }
        this._validate();
    }
    /**
     * Renders the string representation of this Dsn.
     *
     * By default, this will render the public representation without the password
     * component. To get the deprecated private representation, set `withPassword`
     * to true.
     *
     * @param withPassword When set to true, the password will be included.
     */
    Dsn.prototype.toString = function (withPassword) {
        if (withPassword === void 0) { withPassword = false; }
        // tslint:disable-next-line:no-this-assignment
        var _a = this, host = _a.host, path = _a.path, pass = _a.pass, port = _a.port, projectId = _a.projectId, protocol = _a.protocol, user = _a.user;
        return (protocol + "://" + user + (withPassword && pass ? ":" + pass : '') +
            ("@" + host + (port ? ":" + port : '') + "/" + (path ? path + "/" : path) + projectId));
    };
    /** Parses a string into this Dsn. */
    Dsn.prototype._fromString = function (str) {
        var match = DSN_REGEX.exec(str);
        if (!match) {
            throw new _error__WEBPACK_IMPORTED_MODULE_1__["SentryError"](ERROR_MESSAGE);
        }
        var _a = tslib__WEBPACK_IMPORTED_MODULE_0__["__read"](match.slice(1), 6), protocol = _a[0], user = _a[1], _b = _a[2], pass = _b === void 0 ? '' : _b, host = _a[3], _c = _a[4], port = _c === void 0 ? '' : _c, lastPath = _a[5];
        var path = '';
        var projectId = lastPath;
        var split = projectId.split('/');
        if (split.length > 1) {
            path = split.slice(0, -1).join('/');
            projectId = split.pop();
        }
        this._fromComponents({ host: host, pass: pass, path: path, projectId: projectId, port: port, protocol: protocol, user: user });
    };
    /** Maps Dsn components into this instance. */
    Dsn.prototype._fromComponents = function (components) {
        this.protocol = components.protocol;
        this.user = components.user;
        this.pass = components.pass || '';
        this.host = components.host;
        this.port = components.port || '';
        this.path = components.path || '';
        this.projectId = components.projectId;
    };
    /** Validates this Dsn and throws on error. */
    Dsn.prototype._validate = function () {
        var _this = this;
        ['protocol', 'user', 'host', 'projectId'].forEach(function (component) {
            if (!_this[component]) {
                throw new _error__WEBPACK_IMPORTED_MODULE_1__["SentryError"](ERROR_MESSAGE);
            }
        });
        if (this.protocol !== 'http' && this.protocol !== 'https') {
            throw new _error__WEBPACK_IMPORTED_MODULE_1__["SentryError"](ERROR_MESSAGE);
        }
        if (this.port && isNaN(parseInt(this.port, 10))) {
            throw new _error__WEBPACK_IMPORTED_MODULE_1__["SentryError"](ERROR_MESSAGE);
        }
    };
    return Dsn;
}());

//# sourceMappingURL=dsn.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/error.js":
/*!*************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/error.js ***!
  \*************************************************/
/*! exports provided: SentryError */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SentryError", function() { return SentryError; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _polyfill__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./polyfill */ "./node_modules/@sentry/utils/esm/polyfill.js");


/** An error emitted by Sentry SDKs and related utilities. */
var SentryError = /** @class */ (function (_super) {
    tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SentryError, _super);
    function SentryError(message) {
        var _newTarget = this.constructor;
        var _this = _super.call(this, message) || this;
        _this.message = message;
        // tslint:disable:no-unsafe-any
        _this.name = _newTarget.prototype.constructor.name;
        Object(_polyfill__WEBPACK_IMPORTED_MODULE_1__["setPrototypeOf"])(_this, _newTarget.prototype);
        return _this;
    }
    return SentryError;
}(Error));

//# sourceMappingURL=error.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/index.js":
/*!*************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/index.js ***!
  \*************************************************/
/*! exports provided: forget, SentryError, isError, isErrorEvent, isDOMError, isDOMException, isString, isPrimitive, isPlainObject, isEvent, isElement, isRegExp, isThenable, isSyntheticEvent, isInstanceOf, logger, Memo, dynamicRequire, isNodeEnv, getGlobalObject, uuid4, parseUrl, getEventDescription, consoleSandbox, addExceptionTypeValue, addExceptionMechanism, getLocationHref, htmlTreeAsString, crossPlatformPerformance, timestampWithMs, parseSemver, parseRetryAfterHeader, getFunctionName, addContextToFrame, fill, urlEncode, normalizeToSize, walk, normalize, extractExceptionKeysForMessage, dropUndefinedKeys, resolve, relative, normalizePath, isAbsolute, join, dirname, basename, PromiseBuffer, truncate, snipLine, safeJoin, isMatchingPattern, supportsErrorEvent, supportsDOMError, supportsDOMException, supportsFetch, supportsNativeFetch, supportsReportingObserver, supportsReferrerPolicy, supportsHistory, SyncPromise, addInstrumentationHandler, Dsn */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./async */ "./node_modules/@sentry/utils/esm/async.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forget", function() { return _async__WEBPACK_IMPORTED_MODULE_0__["forget"]; });

/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./error */ "./node_modules/@sentry/utils/esm/error.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SentryError", function() { return _error__WEBPACK_IMPORTED_MODULE_1__["SentryError"]; });

/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isError", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isError"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isErrorEvent", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isErrorEvent"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isDOMError", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isDOMError"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isDOMException", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isDOMException"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isString", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isString"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isPrimitive", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isPrimitive"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isPlainObject", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isPlainObject"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isEvent", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isEvent"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isElement", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isElement"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isRegExp", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isRegExp"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isThenable", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isThenable"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isSyntheticEvent", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isSyntheticEvent"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isInstanceOf", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isInstanceOf"]; });

/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./logger */ "./node_modules/@sentry/utils/esm/logger.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logger", function() { return _logger__WEBPACK_IMPORTED_MODULE_3__["logger"]; });

/* harmony import */ var _memo__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./memo */ "./node_modules/@sentry/utils/esm/memo.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Memo", function() { return _memo__WEBPACK_IMPORTED_MODULE_4__["Memo"]; });

/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./misc */ "./node_modules/@sentry/utils/esm/misc.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dynamicRequire", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["dynamicRequire"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isNodeEnv", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["isNodeEnv"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getGlobalObject", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["getGlobalObject"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "uuid4", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["uuid4"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "parseUrl", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["parseUrl"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getEventDescription", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["getEventDescription"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "consoleSandbox", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["consoleSandbox"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addExceptionTypeValue", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["addExceptionTypeValue"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addExceptionMechanism", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["addExceptionMechanism"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getLocationHref", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["getLocationHref"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "htmlTreeAsString", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["htmlTreeAsString"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "crossPlatformPerformance", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["crossPlatformPerformance"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timestampWithMs", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["timestampWithMs"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "parseSemver", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["parseSemver"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "parseRetryAfterHeader", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["parseRetryAfterHeader"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getFunctionName", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["getFunctionName"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addContextToFrame", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["addContextToFrame"]; });

/* harmony import */ var _object__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./object */ "./node_modules/@sentry/utils/esm/object.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fill", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["fill"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "urlEncode", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["urlEncode"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "normalizeToSize", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["normalizeToSize"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "walk", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["walk"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "normalize", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["normalize"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "extractExceptionKeysForMessage", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["extractExceptionKeysForMessage"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dropUndefinedKeys", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["dropUndefinedKeys"]; });

/* harmony import */ var _path__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./path */ "./node_modules/@sentry/utils/esm/path.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "resolve", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["resolve"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "relative", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["relative"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "normalizePath", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["normalizePath"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isAbsolute", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["isAbsolute"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "join", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["join"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dirname", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["dirname"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "basename", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["basename"]; });

/* harmony import */ var _promisebuffer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./promisebuffer */ "./node_modules/@sentry/utils/esm/promisebuffer.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PromiseBuffer", function() { return _promisebuffer__WEBPACK_IMPORTED_MODULE_8__["PromiseBuffer"]; });

/* harmony import */ var _string__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./string */ "./node_modules/@sentry/utils/esm/string.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "truncate", function() { return _string__WEBPACK_IMPORTED_MODULE_9__["truncate"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "snipLine", function() { return _string__WEBPACK_IMPORTED_MODULE_9__["snipLine"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "safeJoin", function() { return _string__WEBPACK_IMPORTED_MODULE_9__["safeJoin"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isMatchingPattern", function() { return _string__WEBPACK_IMPORTED_MODULE_9__["isMatchingPattern"]; });

/* harmony import */ var _supports__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./supports */ "./node_modules/@sentry/utils/esm/supports.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsErrorEvent", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsErrorEvent"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsDOMError", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsDOMError"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsDOMException", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsDOMException"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsFetch", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsFetch"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsNativeFetch", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsNativeFetch"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsReportingObserver", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsReportingObserver"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsReferrerPolicy", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsReferrerPolicy"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsHistory", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsHistory"]; });

/* harmony import */ var _syncpromise__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./syncpromise */ "./node_modules/@sentry/utils/esm/syncpromise.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SyncPromise", function() { return _syncpromise__WEBPACK_IMPORTED_MODULE_11__["SyncPromise"]; });

/* harmony import */ var _instrument__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./instrument */ "./node_modules/@sentry/utils/esm/instrument.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addInstrumentationHandler", function() { return _instrument__WEBPACK_IMPORTED_MODULE_12__["addInstrumentationHandler"]; });

/* harmony import */ var _dsn__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./dsn */ "./node_modules/@sentry/utils/esm/dsn.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Dsn", function() { return _dsn__WEBPACK_IMPORTED_MODULE_13__["Dsn"]; });















//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/instrument.js":
/*!******************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/instrument.js ***!
  \******************************************************/
/*! exports provided: addInstrumentationHandler */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addInstrumentationHandler", function() { return addInstrumentationHandler; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./logger */ "./node_modules/@sentry/utils/esm/logger.js");
/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./misc */ "./node_modules/@sentry/utils/esm/misc.js");
/* harmony import */ var _object__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./object */ "./node_modules/@sentry/utils/esm/object.js");
/* harmony import */ var _supports__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./supports */ "./node_modules/@sentry/utils/esm/supports.js");
/* tslint:disable:only-arrow-functions no-unsafe-any */






var global = Object(_misc__WEBPACK_IMPORTED_MODULE_3__["getGlobalObject"])();
/**
 * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc.
 *  - Console API
 *  - Fetch API
 *  - XHR API
 *  - History API
 *  - DOM API (click/typing)
 *  - Error API
 *  - UnhandledRejection API
 */
var handlers = {};
var instrumented = {};
/** Instruments given API */
function instrument(type) {
    if (instrumented[type]) {
        return;
    }
    instrumented[type] = true;
    switch (type) {
        case 'console':
            instrumentConsole();
            break;
        case 'dom':
            instrumentDOM();
            break;
        case 'xhr':
            instrumentXHR();
            break;
        case 'fetch':
            instrumentFetch();
            break;
        case 'history':
            instrumentHistory();
            break;
        case 'error':
            instrumentError();
            break;
        case 'unhandledrejection':
            instrumentUnhandledRejection();
            break;
        default:
            _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn('unknown instrumentation type:', type);
    }
}
/**
 * Add handler that will be called when given type of instrumentation triggers.
 * Use at your own risk, this might break without changelog notice, only used internally.
 * @hidden
 */
function addInstrumentationHandler(handler) {
    // tslint:disable-next-line:strict-type-predicates
    if (!handler || typeof handler.type !== 'string' || typeof handler.callback !== 'function') {
        return;
    }
    handlers[handler.type] = handlers[handler.type] || [];
    handlers[handler.type].push(handler.callback);
    instrument(handler.type);
}
/** JSDoc */
function triggerHandlers(type, data) {
    var e_1, _a;
    if (!type || !handlers[type]) {
        return;
    }
    try {
        for (var _b = tslib__WEBPACK_IMPORTED_MODULE_0__["__values"](handlers[type] || []), _c = _b.next(); !_c.done; _c = _b.next()) {
            var handler = _c.value;
            try {
                handler(data);
            }
            catch (e) {
                _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error("Error while triggering instrumentation handler.\nType: " + type + "\nName: " + Object(_misc__WEBPACK_IMPORTED_MODULE_3__["getFunctionName"])(handler) + "\nError: " + e);
            }
        }
    }
    catch (e_1_1) { e_1 = { error: e_1_1 }; }
    finally {
        try {
            if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
        }
        finally { if (e_1) throw e_1.error; }
    }
}
/** JSDoc */
function instrumentConsole() {
    if (!('console' in global)) {
        return;
    }
    ['debug', 'info', 'warn', 'error', 'log', 'assert'].forEach(function (level) {
        if (!(level in global.console)) {
            return;
        }
        Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(global.console, level, function (originalConsoleLevel) {
            return function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                triggerHandlers('console', { args: args, level: level });
                // this fails for some browsers. :(
                if (originalConsoleLevel) {
                    Function.prototype.apply.call(originalConsoleLevel, global.console, args);
                }
            };
        });
    });
}
/** JSDoc */
function instrumentFetch() {
    if (!Object(_supports__WEBPACK_IMPORTED_MODULE_5__["supportsNativeFetch"])()) {
        return;
    }
    Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(global, 'fetch', function (originalFetch) {
        return function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var commonHandlerData = {
                args: args,
                fetchData: {
                    method: getFetchMethod(args),
                    url: getFetchUrl(args),
                },
                startTimestamp: Date.now(),
            };
            triggerHandlers('fetch', tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, commonHandlerData));
            return originalFetch.apply(global, args).then(function (response) {
                triggerHandlers('fetch', tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, commonHandlerData, { endTimestamp: Date.now(), response: response }));
                return response;
            }, function (error) {
                triggerHandlers('fetch', tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, commonHandlerData, { endTimestamp: Date.now(), error: error }));
                throw error;
            });
        };
    });
}
/** Extract `method` from fetch call arguments */
function getFetchMethod(fetchArgs) {
    if (fetchArgs === void 0) { fetchArgs = []; }
    if ('Request' in global && Object(_is__WEBPACK_IMPORTED_MODULE_1__["isInstanceOf"])(fetchArgs[0], Request) && fetchArgs[0].method) {
        return String(fetchArgs[0].method).toUpperCase();
    }
    if (fetchArgs[1] && fetchArgs[1].method) {
        return String(fetchArgs[1].method).toUpperCase();
    }
    return 'GET';
}
/** Extract `url` from fetch call arguments */
function getFetchUrl(fetchArgs) {
    if (fetchArgs === void 0) { fetchArgs = []; }
    if (typeof fetchArgs[0] === 'string') {
        return fetchArgs[0];
    }
    if ('Request' in global && Object(_is__WEBPACK_IMPORTED_MODULE_1__["isInstanceOf"])(fetchArgs[0], Request)) {
        return fetchArgs[0].url;
    }
    return String(fetchArgs[0]);
}
/** JSDoc */
function instrumentXHR() {
    if (!('XMLHttpRequest' in global)) {
        return;
    }
    var xhrproto = XMLHttpRequest.prototype;
    Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(xhrproto, 'open', function (originalOpen) {
        return function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var url = args[1];
            this.__sentry_xhr__ = {
                method: Object(_is__WEBPACK_IMPORTED_MODULE_1__["isString"])(args[0]) ? args[0].toUpperCase() : args[0],
                url: args[1],
            };
            // if Sentry key appears in URL, don't capture it as a request
            if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isString"])(url) && this.__sentry_xhr__.method === 'POST' && url.match(/sentry_key/)) {
                this.__sentry_own_request__ = true;
            }
            return originalOpen.apply(this, args);
        };
    });
    Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(xhrproto, 'send', function (originalSend) {
        return function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var xhr = this; // tslint:disable-line:no-this-assignment
            var commonHandlerData = {
                args: args,
                startTimestamp: Date.now(),
                xhr: xhr,
            };
            triggerHandlers('xhr', tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, commonHandlerData));
            xhr.addEventListener('readystatechange', function () {
                if (xhr.readyState === 4) {
                    try {
                        // touching statusCode in some platforms throws
                        // an exception
                        if (xhr.__sentry_xhr__) {
                            xhr.__sentry_xhr__.status_code = xhr.status;
                        }
                    }
                    catch (e) {
                        /* do nothing */
                    }
                    triggerHandlers('xhr', tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, commonHandlerData, { endTimestamp: Date.now() }));
                }
            });
            return originalSend.apply(this, args);
        };
    });
}
var lastHref;
/** JSDoc */
function instrumentHistory() {
    if (!Object(_supports__WEBPACK_IMPORTED_MODULE_5__["supportsHistory"])()) {
        return;
    }
    var oldOnPopState = global.onpopstate;
    global.onpopstate = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var to = global.location.href;
        // keep track of the current URL state, as we always receive only the updated state
        var from = lastHref;
        lastHref = to;
        triggerHandlers('history', {
            from: from,
            to: to,
        });
        if (oldOnPopState) {
            return oldOnPopState.apply(this, args);
        }
    };
    /** @hidden */
    function historyReplacementFunction(originalHistoryFunction) {
        return function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var url = args.length > 2 ? args[2] : undefined;
            if (url) {
                // coerce to string (this is what pushState does)
                var from = lastHref;
                var to = String(url);
                // keep track of the current URL state, as we always receive only the updated state
                lastHref = to;
                triggerHandlers('history', {
                    from: from,
                    to: to,
                });
            }
            return originalHistoryFunction.apply(this, args);
        };
    }
    Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(global.history, 'pushState', historyReplacementFunction);
    Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(global.history, 'replaceState', historyReplacementFunction);
}
/** JSDoc */
function instrumentDOM() {
    if (!('document' in global)) {
        return;
    }
    // Capture breadcrumbs from any click that is unhandled / bubbled up all the way
    // to the document. Do this before we instrument addEventListener.
    global.document.addEventListener('click', domEventHandler('click', triggerHandlers.bind(null, 'dom')), false);
    global.document.addEventListener('keypress', keypressEventHandler(triggerHandlers.bind(null, 'dom')), false);
    // After hooking into document bubbled up click and keypresses events, we also hook into user handled click & keypresses.
    ['EventTarget', 'Node'].forEach(function (target) {
        var proto = global[target] && global[target].prototype;
        if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {
            return;
        }
        Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(proto, 'addEventListener', function (original) {
            return function (eventName, fn, options) {
                if (fn && fn.handleEvent) {
                    if (eventName === 'click') {
                        Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(fn, 'handleEvent', function (innerOriginal) {
                            return function (event) {
                                domEventHandler('click', triggerHandlers.bind(null, 'dom'))(event);
                                return innerOriginal.call(this, event);
                            };
                        });
                    }
                    if (eventName === 'keypress') {
                        Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(fn, 'handleEvent', function (innerOriginal) {
                            return function (event) {
                                keypressEventHandler(triggerHandlers.bind(null, 'dom'))(event);
                                return innerOriginal.call(this, event);
                            };
                        });
                    }
                }
                else {
                    if (eventName === 'click') {
                        domEventHandler('click', triggerHandlers.bind(null, 'dom'), true)(this);
                    }
                    if (eventName === 'keypress') {
                        keypressEventHandler(triggerHandlers.bind(null, 'dom'))(this);
                    }
                }
                return original.call(this, eventName, fn, options);
            };
        });
        Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(proto, 'removeEventListener', function (original) {
            return function (eventName, fn, options) {
                var callback = fn;
                try {
                    callback = callback && (callback.__sentry_wrapped__ || callback);
                }
                catch (e) {
                    // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments
                }
                return original.call(this, eventName, callback, options);
            };
        });
    });
}
var debounceDuration = 1000;
var debounceTimer = 0;
var keypressTimeout;
var lastCapturedEvent;
/**
 * Wraps addEventListener to capture UI breadcrumbs
 * @param name the event name (e.g. "click")
 * @param handler function that will be triggered
 * @param debounce decides whether it should wait till another event loop
 * @returns wrapped breadcrumb events handler
 * @hidden
 */
function domEventHandler(name, handler, debounce) {
    if (debounce === void 0) { debounce = false; }
    return function (event) {
        // reset keypress timeout; e.g. triggering a 'click' after
        // a 'keypress' will reset the keypress debounce so that a new
        // set of keypresses can be recorded
        keypressTimeout = undefined;
        // It's possible this handler might trigger multiple times for the same
        // event (e.g. event propagation through node ancestors). Ignore if we've
        // already captured the event.
        if (!event || lastCapturedEvent === event) {
            return;
        }
        lastCapturedEvent = event;
        if (debounceTimer) {
            clearTimeout(debounceTimer);
        }
        if (debounce) {
            debounceTimer = setTimeout(function () {
                handler({ event: event, name: name });
            });
        }
        else {
            handler({ event: event, name: name });
        }
    };
}
/**
 * Wraps addEventListener to capture keypress UI events
 * @param handler function that will be triggered
 * @returns wrapped keypress events handler
 * @hidden
 */
function keypressEventHandler(handler) {
    // TODO: if somehow user switches keypress target before
    //       debounce timeout is triggered, we will only capture
    //       a single breadcrumb from the FIRST target (acceptable?)
    return function (event) {
        var target;
        try {
            target = event.target;
        }
        catch (e) {
            // just accessing event properties can throw an exception in some rare circumstances
            // see: https://github.com/getsentry/raven-js/issues/838
            return;
        }
        var tagName = target && target.tagName;
        // only consider keypress events on actual input elements
        // this will disregard keypresses targeting body (e.g. tabbing
        // through elements, hotkeys, etc)
        if (!tagName || (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)) {
            return;
        }
        // record first keypress in a series, but ignore subsequent
        // keypresses until debounce clears
        if (!keypressTimeout) {
            domEventHandler('input', handler)(event);
        }
        clearTimeout(keypressTimeout);
        keypressTimeout = setTimeout(function () {
            keypressTimeout = undefined;
        }, debounceDuration);
    };
}
var _oldOnErrorHandler = null;
/** JSDoc */
function instrumentError() {
    _oldOnErrorHandler = global.onerror;
    global.onerror = function (msg, url, line, column, error) {
        triggerHandlers('error', {
            column: column,
            error: error,
            line: line,
            msg: msg,
            url: url,
        });
        if (_oldOnErrorHandler) {
            return _oldOnErrorHandler.apply(this, arguments);
        }
        return false;
    };
}
var _oldOnUnhandledRejectionHandler = null;
/** JSDoc */
function instrumentUnhandledRejection() {
    _oldOnUnhandledRejectionHandler = global.onunhandledrejection;
    global.onunhandledrejection = function (e) {
        triggerHandlers('unhandledrejection', e);
        if (_oldOnUnhandledRejectionHandler) {
            return _oldOnUnhandledRejectionHandler.apply(this, arguments);
        }
        return true;
    };
}
//# sourceMappingURL=instrument.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/is.js":
/*!**********************************************!*\
  !*** ./node_modules/@sentry/utils/esm/is.js ***!
  \**********************************************/
/*! exports provided: isError, isErrorEvent, isDOMError, isDOMException, isString, isPrimitive, isPlainObject, isEvent, isElement, isRegExp, isThenable, isSyntheticEvent, isInstanceOf */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isError", function() { return isError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isErrorEvent", function() { return isErrorEvent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDOMError", function() { return isDOMError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDOMException", function() { return isDOMException; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isString", function() { return isString; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPrimitive", function() { return isPrimitive; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPlainObject", function() { return isPlainObject; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isEvent", function() { return isEvent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isElement", function() { return isElement; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isRegExp", function() { return isRegExp; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isThenable", function() { return isThenable; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isSyntheticEvent", function() { return isSyntheticEvent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isInstanceOf", function() { return isInstanceOf; });
/**
 * Checks whether given value's type is one of a few Error or Error-like
 * {@link isError}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isError(wat) {
    switch (Object.prototype.toString.call(wat)) {
        case '[object Error]':
            return true;
        case '[object Exception]':
            return true;
        case '[object DOMException]':
            return true;
        default:
            return isInstanceOf(wat, Error);
    }
}
/**
 * Checks whether given value's type is ErrorEvent
 * {@link isErrorEvent}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isErrorEvent(wat) {
    return Object.prototype.toString.call(wat) === '[object ErrorEvent]';
}
/**
 * Checks whether given value's type is DOMError
 * {@link isDOMError}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isDOMError(wat) {
    return Object.prototype.toString.call(wat) === '[object DOMError]';
}
/**
 * Checks whether given value's type is DOMException
 * {@link isDOMException}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isDOMException(wat) {
    return Object.prototype.toString.call(wat) === '[object DOMException]';
}
/**
 * Checks whether given value's type is a string
 * {@link isString}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isString(wat) {
    return Object.prototype.toString.call(wat) === '[object String]';
}
/**
 * Checks whether given value's is a primitive (undefined, null, number, boolean, string)
 * {@link isPrimitive}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isPrimitive(wat) {
    return wat === null || (typeof wat !== 'object' && typeof wat !== 'function');
}
/**
 * Checks whether given value's type is an object literal
 * {@link isPlainObject}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isPlainObject(wat) {
    return Object.prototype.toString.call(wat) === '[object Object]';
}
/**
 * Checks whether given value's type is an Event instance
 * {@link isEvent}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isEvent(wat) {
    // tslint:disable-next-line:strict-type-predicates
    return typeof Event !== 'undefined' && isInstanceOf(wat, Event);
}
/**
 * Checks whether given value's type is an Element instance
 * {@link isElement}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isElement(wat) {
    // tslint:disable-next-line:strict-type-predicates
    return typeof Element !== 'undefined' && isInstanceOf(wat, Element);
}
/**
 * Checks whether given value's type is an regexp
 * {@link isRegExp}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isRegExp(wat) {
    return Object.prototype.toString.call(wat) === '[object RegExp]';
}
/**
 * Checks whether given value has a then function.
 * @param wat A value to be checked.
 */
function isThenable(wat) {
    // tslint:disable:no-unsafe-any
    return Boolean(wat && wat.then && typeof wat.then === 'function');
    // tslint:enable:no-unsafe-any
}
/**
 * Checks whether given value's type is a SyntheticEvent
 * {@link isSyntheticEvent}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isSyntheticEvent(wat) {
    // tslint:disable-next-line:no-unsafe-any
    return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;
}
/**
 * Checks whether given value's type is an instance of provided constructor.
 * {@link isInstanceOf}.
 *
 * @param wat A value to be checked.
 * @param base A constructor to be used in a check.
 * @returns A boolean representing the result.
 */
function isInstanceOf(wat, base) {
    try {
        // tslint:disable-next-line:no-unsafe-any
        return wat instanceof base;
    }
    catch (_e) {
        return false;
    }
}
//# sourceMappingURL=is.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/logger.js":
/*!**************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/logger.js ***!
  \**************************************************/
/*! exports provided: logger */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logger", function() { return logger; });
/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./misc */ "./node_modules/@sentry/utils/esm/misc.js");

// TODO: Implement different loggers for different environments
var global = Object(_misc__WEBPACK_IMPORTED_MODULE_0__["getGlobalObject"])();
/** Prefix for logging strings */
var PREFIX = 'Sentry Logger ';
/** JSDoc */
var Logger = /** @class */ (function () {
    /** JSDoc */
    function Logger() {
        this._enabled = false;
    }
    /** JSDoc */
    Logger.prototype.disable = function () {
        this._enabled = false;
    };
    /** JSDoc */
    Logger.prototype.enable = function () {
        this._enabled = true;
    };
    /** JSDoc */
    Logger.prototype.log = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        if (!this._enabled) {
            return;
        }
        Object(_misc__WEBPACK_IMPORTED_MODULE_0__["consoleSandbox"])(function () {
            global.console.log(PREFIX + "[Log]: " + args.join(' ')); // tslint:disable-line:no-console
        });
    };
    /** JSDoc */
    Logger.prototype.warn = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        if (!this._enabled) {
            return;
        }
        Object(_misc__WEBPACK_IMPORTED_MODULE_0__["consoleSandbox"])(function () {
            global.console.warn(PREFIX + "[Warn]: " + args.join(' ')); // tslint:disable-line:no-console
        });
    };
    /** JSDoc */
    Logger.prototype.error = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        if (!this._enabled) {
            return;
        }
        Object(_misc__WEBPACK_IMPORTED_MODULE_0__["consoleSandbox"])(function () {
            global.console.error(PREFIX + "[Error]: " + args.join(' ')); // tslint:disable-line:no-console
        });
    };
    return Logger;
}());
// Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used
global.__SENTRY__ = global.__SENTRY__ || {};
var logger = global.__SENTRY__.logger || (global.__SENTRY__.logger = new Logger());

//# sourceMappingURL=logger.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/memo.js":
/*!************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/memo.js ***!
  \************************************************/
/*! exports provided: Memo */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Memo", function() { return Memo; });
// tslint:disable:no-unsafe-any
/**
 * Memo class used for decycle json objects. Uses WeakSet if available otherwise array.
 */
var Memo = /** @class */ (function () {
    function Memo() {
        // tslint:disable-next-line
        this._hasWeakSet = typeof WeakSet === 'function';
        this._inner = this._hasWeakSet ? new WeakSet() : [];
    }
    /**
     * Sets obj to remember.
     * @param obj Object to remember
     */
    Memo.prototype.memoize = function (obj) {
        if (this._hasWeakSet) {
            if (this._inner.has(obj)) {
                return true;
            }
            this._inner.add(obj);
            return false;
        }
        // tslint:disable-next-line:prefer-for-of
        for (var i = 0; i < this._inner.length; i++) {
            var value = this._inner[i];
            if (value === obj) {
                return true;
            }
        }
        this._inner.push(obj);
        return false;
    };
    /**
     * Removes object from internal storage.
     * @param obj Object to forget
     */
    Memo.prototype.unmemoize = function (obj) {
        if (this._hasWeakSet) {
            this._inner.delete(obj);
        }
        else {
            for (var i = 0; i < this._inner.length; i++) {
                if (this._inner[i] === obj) {
                    this._inner.splice(i, 1);
                    break;
                }
            }
        }
    };
    return Memo;
}());

//# sourceMappingURL=memo.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/misc.js":
/*!************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/misc.js ***!
  \************************************************/
/*! exports provided: dynamicRequire, isNodeEnv, getGlobalObject, uuid4, parseUrl, getEventDescription, consoleSandbox, addExceptionTypeValue, addExceptionMechanism, getLocationHref, htmlTreeAsString, crossPlatformPerformance, timestampWithMs, parseSemver, parseRetryAfterHeader, getFunctionName, addContextToFrame */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* WEBPACK VAR INJECTION */(function(process, global, module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dynamicRequire", function() { return dynamicRequire; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isNodeEnv", function() { return isNodeEnv; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getGlobalObject", function() { return getGlobalObject; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uuid4", function() { return uuid4; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseUrl", function() { return parseUrl; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getEventDescription", function() { return getEventDescription; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "consoleSandbox", function() { return consoleSandbox; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addExceptionTypeValue", function() { return addExceptionTypeValue; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addExceptionMechanism", function() { return addExceptionMechanism; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocationHref", function() { return getLocationHref; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "htmlTreeAsString", function() { return htmlTreeAsString; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "crossPlatformPerformance", function() { return crossPlatformPerformance; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timestampWithMs", function() { return timestampWithMs; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseSemver", function() { return parseSemver; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseRetryAfterHeader", function() { return parseRetryAfterHeader; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getFunctionName", function() { return getFunctionName; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addContextToFrame", function() { return addContextToFrame; });
/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");
/* harmony import */ var _string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./string */ "./node_modules/@sentry/utils/esm/string.js");


/**
 * Requires a module which is protected against bundler minification.
 *
 * @param request The module path to resolve
 */
function dynamicRequire(mod, request) {
    // tslint:disable-next-line: no-unsafe-any
    return mod.require(request);
}
/**
 * Checks whether we're in the Node.js or Browser environment
 *
 * @returns Answer to given question
 */
function isNodeEnv() {
    // tslint:disable:strict-type-predicates
    return Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';
}
var fallbackGlobalObject = {};
/**
 * Safely get global scope object
 *
 * @returns Global scope object
 */
function getGlobalObject() {
    return (isNodeEnv()
        ? global
        : typeof window !== 'undefined'
            ? window
            : typeof self !== 'undefined'
                ? self
                : fallbackGlobalObject);
}
/**
 * UUID4 generator
 *
 * @returns string Generated UUID4.
 */
function uuid4() {
    var global = getGlobalObject();
    var crypto = global.crypto || global.msCrypto;
    if (!(crypto === void 0) && crypto.getRandomValues) {
        // Use window.crypto API if available
        var arr = new Uint16Array(8);
        crypto.getRandomValues(arr);
        // set 4 in byte 7
        // tslint:disable-next-line:no-bitwise
        arr[3] = (arr[3] & 0xfff) | 0x4000;
        // set 2 most significant bits of byte 9 to '10'
        // tslint:disable-next-line:no-bitwise
        arr[4] = (arr[4] & 0x3fff) | 0x8000;
        var pad = function (num) {
            var v = num.toString(16);
            while (v.length < 4) {
                v = "0" + v;
            }
            return v;
        };
        return (pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + pad(arr[5]) + pad(arr[6]) + pad(arr[7]));
    }
    // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523
    return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        // tslint:disable-next-line:no-bitwise
        var r = (Math.random() * 16) | 0;
        // tslint:disable-next-line:no-bitwise
        var v = c === 'x' ? r : (r & 0x3) | 0x8;
        return v.toString(16);
    });
}
/**
 * Parses string form of URL into an object
 * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B
 * // intentionally using regex and not <a/> href parsing trick because React Native and other
 * // environments where DOM might not be available
 * @returns parsed URL object
 */
function parseUrl(url) {
    if (!url) {
        return {};
    }
    var match = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);
    if (!match) {
        return {};
    }
    // coerce to undefined values to empty string so we don't get 'undefined'
    var query = match[6] || '';
    var fragment = match[8] || '';
    return {
        host: match[4],
        path: match[5],
        protocol: match[2],
        relative: match[5] + query + fragment,
    };
}
/**
 * Extracts either message or type+value from an event that can be used for user-facing logs
 * @returns event's description
 */
function getEventDescription(event) {
    if (event.message) {
        return event.message;
    }
    if (event.exception && event.exception.values && event.exception.values[0]) {
        var exception = event.exception.values[0];
        if (exception.type && exception.value) {
            return exception.type + ": " + exception.value;
        }
        return exception.type || exception.value || event.event_id || '<unknown>';
    }
    return event.event_id || '<unknown>';
}
/** JSDoc */
function consoleSandbox(callback) {
    var global = getGlobalObject();
    var levels = ['debug', 'info', 'warn', 'error', 'log', 'assert'];
    if (!('console' in global)) {
        return callback();
    }
    var originalConsole = global.console;
    var wrappedLevels = {};
    // Restore all wrapped console methods
    levels.forEach(function (level) {
        if (level in global.console && originalConsole[level].__sentry_original__) {
            wrappedLevels[level] = originalConsole[level];
            originalConsole[level] = originalConsole[level].__sentry_original__;
        }
    });
    // Perform callback manipulations
    var result = callback();
    // Revert restoration to wrapped state
    Object.keys(wrappedLevels).forEach(function (level) {
        originalConsole[level] = wrappedLevels[level];
    });
    return result;
}
/**
 * Adds exception values, type and value to an synthetic Exception.
 * @param event The event to modify.
 * @param value Value of the exception.
 * @param type Type of the exception.
 * @hidden
 */
function addExceptionTypeValue(event, value, type) {
    event.exception = event.exception || {};
    event.exception.values = event.exception.values || [];
    event.exception.values[0] = event.exception.values[0] || {};
    event.exception.values[0].value = event.exception.values[0].value || value || '';
    event.exception.values[0].type = event.exception.values[0].type || type || 'Error';
}
/**
 * Adds exception mechanism to a given event.
 * @param event The event to modify.
 * @param mechanism Mechanism of the mechanism.
 * @hidden
 */
function addExceptionMechanism(event, mechanism) {
    if (mechanism === void 0) { mechanism = {}; }
    // TODO: Use real type with `keyof Mechanism` thingy and maybe make it better?
    try {
        // @ts-ignore
        // tslint:disable:no-non-null-assertion
        event.exception.values[0].mechanism = event.exception.values[0].mechanism || {};
        Object.keys(mechanism).forEach(function (key) {
            // @ts-ignore
            event.exception.values[0].mechanism[key] = mechanism[key];
        });
    }
    catch (_oO) {
        // no-empty
    }
}
/**
 * A safe form of location.href
 */
function getLocationHref() {
    try {
        return document.location.href;
    }
    catch (oO) {
        return '';
    }
}
/**
 * Given a child DOM element, returns a query-selector statement describing that
 * and its ancestors
 * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]
 * @returns generated DOM path
 */
function htmlTreeAsString(elem) {
    // try/catch both:
    // - accessing event.target (see getsentry/raven-js#838, #768)
    // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly
    // - can throw an exception in some circumstances.
    try {
        var currentElem = elem;
        var MAX_TRAVERSE_HEIGHT = 5;
        var MAX_OUTPUT_LEN = 80;
        var out = [];
        var height = 0;
        var len = 0;
        var separator = ' > ';
        var sepLength = separator.length;
        var nextStr = void 0;
        while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {
            nextStr = _htmlElementAsString(currentElem);
            // bail out if
            // - nextStr is the 'html' element
            // - the length of the string that would be created exceeds MAX_OUTPUT_LEN
            //   (ignore this limit if we are on the first iteration)
            if (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)) {
                break;
            }
            out.push(nextStr);
            len += nextStr.length;
            currentElem = currentElem.parentNode;
        }
        return out.reverse().join(separator);
    }
    catch (_oO) {
        return '<unknown>';
    }
}
/**
 * Returns a simple, query-selector representation of a DOM element
 * e.g. [HTMLElement] => input#foo.btn[name=baz]
 * @returns generated DOM path
 */
function _htmlElementAsString(el) {
    var elem = el;
    var out = [];
    var className;
    var classes;
    var key;
    var attr;
    var i;
    if (!elem || !elem.tagName) {
        return '';
    }
    out.push(elem.tagName.toLowerCase());
    if (elem.id) {
        out.push("#" + elem.id);
    }
    className = elem.className;
    if (className && Object(_is__WEBPACK_IMPORTED_MODULE_0__["isString"])(className)) {
        classes = className.split(/\s+/);
        for (i = 0; i < classes.length; i++) {
            out.push("." + classes[i]);
        }
    }
    var attrWhitelist = ['type', 'name', 'title', 'alt'];
    for (i = 0; i < attrWhitelist.length; i++) {
        key = attrWhitelist[i];
        attr = elem.getAttribute(key);
        if (attr) {
            out.push("[" + key + "=\"" + attr + "\"]");
        }
    }
    return out.join('');
}
var INITIAL_TIME = Date.now();
var prevNow = 0;
var performanceFallback = {
    now: function () {
        var now = Date.now() - INITIAL_TIME;
        if (now < prevNow) {
            now = prevNow;
        }
        prevNow = now;
        return now;
    },
    timeOrigin: INITIAL_TIME,
};
var crossPlatformPerformance = (function () {
    if (isNodeEnv()) {
        try {
            var perfHooks = dynamicRequire(module, 'perf_hooks');
            return perfHooks.performance;
        }
        catch (_) {
            return performanceFallback;
        }
    }
    if (getGlobalObject().performance) {
        // Polyfill for performance.timeOrigin.
        //
        // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin
        // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.
        // tslint:disable-next-line:strict-type-predicates
        if (performance.timeOrigin === undefined) {
            // As of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always a
            // valid fallback. In the absence of a initial time provided by the browser, fallback to INITIAL_TIME.
            // @ts-ignore
            // tslint:disable-next-line:deprecation
            performance.timeOrigin = (performance.timing && performance.timing.navigationStart) || INITIAL_TIME;
        }
    }
    return getGlobalObject().performance || performanceFallback;
})();
/**
 * Returns a timestamp in seconds with milliseconds precision since the UNIX epoch calculated with the monotonic clock.
 */
function timestampWithMs() {
    return (crossPlatformPerformance.timeOrigin + crossPlatformPerformance.now()) / 1000;
}
// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
var SEMVER_REGEXP = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
/**
 * Parses input into a SemVer interface
 * @param input string representation of a semver version
 */
function parseSemver(input) {
    var match = input.match(SEMVER_REGEXP) || [];
    var major = parseInt(match[1], 10);
    var minor = parseInt(match[2], 10);
    var patch = parseInt(match[3], 10);
    return {
        buildmetadata: match[5],
        major: isNaN(major) ? undefined : major,
        minor: isNaN(minor) ? undefined : minor,
        patch: isNaN(patch) ? undefined : patch,
        prerelease: match[4],
    };
}
var defaultRetryAfter = 60 * 1000; // 60 seconds
/**
 * Extracts Retry-After value from the request header or returns default value
 * @param now current unix timestamp
 * @param header string representation of 'Retry-After' header
 */
function parseRetryAfterHeader(now, header) {
    if (!header) {
        return defaultRetryAfter;
    }
    var headerDelay = parseInt("" + header, 10);
    if (!isNaN(headerDelay)) {
        return headerDelay * 1000;
    }
    var headerDate = Date.parse("" + header);
    if (!isNaN(headerDate)) {
        return headerDate - now;
    }
    return defaultRetryAfter;
}
var defaultFunctionName = '<anonymous>';
/**
 * Safely extract function name from itself
 */
function getFunctionName(fn) {
    try {
        if (!fn || typeof fn !== 'function') {
            return defaultFunctionName;
        }
        return fn.name || defaultFunctionName;
    }
    catch (e) {
        // Just accessing custom props in some Selenium environments
        // can cause a "Permission denied" exception (see raven-js#495).
        return defaultFunctionName;
    }
}
/**
 * This function adds context (pre/post/line) lines to the provided frame
 *
 * @param lines string[] containing all lines
 * @param frame StackFrame that will be mutated
 * @param linesOfContext number of context lines we want to add pre/post
 */
function addContextToFrame(lines, frame, linesOfContext) {
    if (linesOfContext === void 0) { linesOfContext = 5; }
    var lineno = frame.lineno || 0;
    var maxLines = lines.length;
    var sourceLine = Math.max(Math.min(maxLines, lineno - 1), 0);
    frame.pre_context = lines
        .slice(Math.max(0, sourceLine - linesOfContext), sourceLine)
        .map(function (line) { return Object(_string__WEBPACK_IMPORTED_MODULE_1__["snipLine"])(line, 0); });
    frame.context_line = Object(_string__WEBPACK_IMPORTED_MODULE_1__["snipLine"])(lines[Math.min(maxLines - 1, sourceLine)], frame.colno || 0);
    frame.post_context = lines
        .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext)
        .map(function (line) { return Object(_string__WEBPACK_IMPORTED_MODULE_1__["snipLine"])(line, 0); });
}
//# sourceMappingURL=misc.js.map
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../../../webpack/buildin/harmony-module.js */ "./node_modules/webpack/buildin/harmony-module.js")(module)))

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/object.js":
/*!**************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/object.js ***!
  \**************************************************/
/*! exports provided: fill, urlEncode, normalizeToSize, walk, normalize, extractExceptionKeysForMessage, dropUndefinedKeys */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fill", function() { return fill; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "urlEncode", function() { return urlEncode; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalizeToSize", function() { return normalizeToSize; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "walk", function() { return walk; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalize", function() { return normalize; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "extractExceptionKeysForMessage", function() { return extractExceptionKeysForMessage; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dropUndefinedKeys", function() { return dropUndefinedKeys; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");
/* harmony import */ var _memo__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./memo */ "./node_modules/@sentry/utils/esm/memo.js");
/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./misc */ "./node_modules/@sentry/utils/esm/misc.js");
/* harmony import */ var _string__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./string */ "./node_modules/@sentry/utils/esm/string.js");





/**
 * Wrap a given object method with a higher-order function
 *
 * @param source An object that contains a method to be wrapped.
 * @param name A name of method to be wrapped.
 * @param replacement A function that should be used to wrap a given method.
 * @returns void
 */
function fill(source, name, replacement) {
    if (!(name in source)) {
        return;
    }
    var original = source[name];
    var wrapped = replacement(original);
    // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work
    // otherwise it'll throw "TypeError: Object.defineProperties called on non-object"
    // tslint:disable-next-line:strict-type-predicates
    if (typeof wrapped === 'function') {
        try {
            wrapped.prototype = wrapped.prototype || {};
            Object.defineProperties(wrapped, {
                __sentry_original__: {
                    enumerable: false,
                    value: original,
                },
            });
        }
        catch (_Oo) {
            // This can throw if multiple fill happens on a global object like XMLHttpRequest
            // Fixes https://github.com/getsentry/sentry-javascript/issues/2043
        }
    }
    source[name] = wrapped;
}
/**
 * Encodes given object into url-friendly format
 *
 * @param object An object that contains serializable values
 * @returns string Encoded
 */
function urlEncode(object) {
    return Object.keys(object)
        .map(
    // tslint:disable-next-line:no-unsafe-any
    function (key) { return encodeURIComponent(key) + "=" + encodeURIComponent(object[key]); })
        .join('&');
}
/**
 * Transforms any object into an object literal with all it's attributes
 * attached to it.
 *
 * @param value Initial source that we have to transform in order to be usable by the serializer
 */
function getWalkSource(value) {
    if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isError"])(value)) {
        var error = value;
        var err = {
            message: error.message,
            name: error.name,
            stack: error.stack,
        };
        for (var i in error) {
            if (Object.prototype.hasOwnProperty.call(error, i)) {
                err[i] = error[i];
            }
        }
        return err;
    }
    if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isEvent"])(value)) {
        var event_1 = value;
        var source = {};
        source.type = event_1.type;
        // Accessing event.target can throw (see getsentry/raven-js#838, #768)
        try {
            source.target = Object(_is__WEBPACK_IMPORTED_MODULE_1__["isElement"])(event_1.target)
                ? Object(_misc__WEBPACK_IMPORTED_MODULE_3__["htmlTreeAsString"])(event_1.target)
                : Object.prototype.toString.call(event_1.target);
        }
        catch (_oO) {
            source.target = '<unknown>';
        }
        try {
            source.currentTarget = Object(_is__WEBPACK_IMPORTED_MODULE_1__["isElement"])(event_1.currentTarget)
                ? Object(_misc__WEBPACK_IMPORTED_MODULE_3__["htmlTreeAsString"])(event_1.currentTarget)
                : Object.prototype.toString.call(event_1.currentTarget);
        }
        catch (_oO) {
            source.currentTarget = '<unknown>';
        }
        // tslint:disable-next-line:strict-type-predicates
        if (typeof CustomEvent !== 'undefined' && Object(_is__WEBPACK_IMPORTED_MODULE_1__["isInstanceOf"])(value, CustomEvent)) {
            source.detail = event_1.detail;
        }
        for (var i in event_1) {
            if (Object.prototype.hasOwnProperty.call(event_1, i)) {
                source[i] = event_1;
            }
        }
        return source;
    }
    return value;
}
/** Calculates bytes size of input string */
function utf8Length(value) {
    // tslint:disable-next-line:no-bitwise
    return ~-encodeURI(value).split(/%..|./).length;
}
/** Calculates bytes size of input object */
function jsonSize(value) {
    return utf8Length(JSON.stringify(value));
}
/** JSDoc */
function normalizeToSize(object, 
// Default Node.js REPL depth
depth, 
// 100kB, as 200kB is max payload size, so half sounds reasonable
maxSize) {
    if (depth === void 0) { depth = 3; }
    if (maxSize === void 0) { maxSize = 100 * 1024; }
    var serialized = normalize(object, depth);
    if (jsonSize(serialized) > maxSize) {
        return normalizeToSize(object, depth - 1, maxSize);
    }
    return serialized;
}
/** Transforms any input value into a string form, either primitive value or a type of the input */
function serializeValue(value) {
    var type = Object.prototype.toString.call(value);
    // Node.js REPL notation
    if (typeof value === 'string') {
        return value;
    }
    if (type === '[object Object]') {
        return '[Object]';
    }
    if (type === '[object Array]') {
        return '[Array]';
    }
    var normalized = normalizeValue(value);
    return Object(_is__WEBPACK_IMPORTED_MODULE_1__["isPrimitive"])(normalized) ? normalized : type;
}
/**
 * normalizeValue()
 *
 * Takes unserializable input and make it serializable friendly
 *
 * - translates undefined/NaN values to "[undefined]"/"[NaN]" respectively,
 * - serializes Error objects
 * - filter global objects
 */
// tslint:disable-next-line:cyclomatic-complexity
function normalizeValue(value, key) {
    if (key === 'domain' && value && typeof value === 'object' && value._events) {
        return '[Domain]';
    }
    if (key === 'domainEmitter') {
        return '[DomainEmitter]';
    }
    if (typeof global !== 'undefined' && value === global) {
        return '[Global]';
    }
    if (typeof window !== 'undefined' && value === window) {
        return '[Window]';
    }
    if (typeof document !== 'undefined' && value === document) {
        return '[Document]';
    }
    // React's SyntheticEvent thingy
    if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isSyntheticEvent"])(value)) {
        return '[SyntheticEvent]';
    }
    // tslint:disable-next-line:no-tautology-expression
    if (typeof value === 'number' && value !== value) {
        return '[NaN]';
    }
    if (value === void 0) {
        return '[undefined]';
    }
    if (typeof value === 'function') {
        return "[Function: " + Object(_misc__WEBPACK_IMPORTED_MODULE_3__["getFunctionName"])(value) + "]";
    }
    return value;
}
/**
 * Walks an object to perform a normalization on it
 *
 * @param key of object that's walked in current iteration
 * @param value object to be walked
 * @param depth Optional number indicating how deep should walking be performed
 * @param memo Optional Memo class handling decycling
 */
function walk(key, value, depth, memo) {
    if (depth === void 0) { depth = +Infinity; }
    if (memo === void 0) { memo = new _memo__WEBPACK_IMPORTED_MODULE_2__["Memo"](); }
    // If we reach the maximum depth, serialize whatever has left
    if (depth === 0) {
        return serializeValue(value);
    }
    // If value implements `toJSON` method, call it and return early
    // tslint:disable:no-unsafe-any
    if (value !== null && value !== undefined && typeof value.toJSON === 'function') {
        return value.toJSON();
    }
    // tslint:enable:no-unsafe-any
    // If normalized value is a primitive, there are no branches left to walk, so we can just bail out, as theres no point in going down that branch any further
    var normalized = normalizeValue(value, key);
    if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isPrimitive"])(normalized)) {
        return normalized;
    }
    // Create source that we will use for next itterations, either objectified error object (Error type with extracted keys:value pairs) or the input itself
    var source = getWalkSource(value);
    // Create an accumulator that will act as a parent for all future itterations of that branch
    var acc = Array.isArray(value) ? [] : {};
    // If we already walked that branch, bail out, as it's circular reference
    if (memo.memoize(value)) {
        return '[Circular ~]';
    }
    // Walk all keys of the source
    for (var innerKey in source) {
        // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.
        if (!Object.prototype.hasOwnProperty.call(source, innerKey)) {
            continue;
        }
        // Recursively walk through all the child nodes
        acc[innerKey] = walk(innerKey, source[innerKey], depth - 1, memo);
    }
    // Once walked through all the branches, remove the parent from memo storage
    memo.unmemoize(value);
    // Return accumulated values
    return acc;
}
/**
 * normalize()
 *
 * - Creates a copy to prevent original input mutation
 * - Skip non-enumerablers
 * - Calls `toJSON` if implemented
 * - Removes circular references
 * - Translates non-serializeable values (undefined/NaN/Functions) to serializable format
 * - Translates known global objects/Classes to a string representations
 * - Takes care of Error objects serialization
 * - Optionally limit depth of final output
 */
function normalize(input, depth) {
    try {
        // tslint:disable-next-line:no-unsafe-any
        return JSON.parse(JSON.stringify(input, function (key, value) { return walk(key, value, depth); }));
    }
    catch (_oO) {
        return '**non-serializable**';
    }
}
/**
 * Given any captured exception, extract its keys and create a sorted
 * and truncated list that will be used inside the event message.
 * eg. `Non-error exception captured with keys: foo, bar, baz`
 */
function extractExceptionKeysForMessage(exception, maxLength) {
    if (maxLength === void 0) { maxLength = 40; }
    // tslint:disable:strict-type-predicates
    var keys = Object.keys(getWalkSource(exception));
    keys.sort();
    if (!keys.length) {
        return '[object has no keys]';
    }
    if (keys[0].length >= maxLength) {
        return Object(_string__WEBPACK_IMPORTED_MODULE_4__["truncate"])(keys[0], maxLength);
    }
    for (var includedKeys = keys.length; includedKeys > 0; includedKeys--) {
        var serialized = keys.slice(0, includedKeys).join(', ');
        if (serialized.length > maxLength) {
            continue;
        }
        if (includedKeys === keys.length) {
            return serialized;
        }
        return Object(_string__WEBPACK_IMPORTED_MODULE_4__["truncate"])(serialized, maxLength);
    }
    return '';
}
/**
 * Given any object, return the new object with removed keys that value was `undefined`.
 * Works recursively on objects and arrays.
 */
function dropUndefinedKeys(val) {
    var e_1, _a;
    if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isPlainObject"])(val)) {
        var obj = val;
        var rv = {};
        try {
            for (var _b = tslib__WEBPACK_IMPORTED_MODULE_0__["__values"](Object.keys(obj)), _c = _b.next(); !_c.done; _c = _b.next()) {
                var key = _c.value;
                if (typeof obj[key] !== 'undefined') {
                    rv[key] = dropUndefinedKeys(obj[key]);
                }
            }
        }
        catch (e_1_1) { e_1 = { error: e_1_1 }; }
        finally {
            try {
                if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
            }
            finally { if (e_1) throw e_1.error; }
        }
        return rv;
    }
    if (Array.isArray(val)) {
        return val.map(dropUndefinedKeys);
    }
    return val;
}
//# sourceMappingURL=object.js.map
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/path.js":
/*!************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/path.js ***!
  \************************************************/
/*! exports provided: resolve, relative, normalizePath, isAbsolute, join, dirname, basename */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resolve", function() { return resolve; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "relative", function() { return relative; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalizePath", function() { return normalizePath; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isAbsolute", function() { return isAbsolute; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "join", function() { return join; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dirname", function() { return dirname; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "basename", function() { return basename; });
// Slightly modified (no IE8 support, ES6) and transcribed to TypeScript
// https://raw.githubusercontent.com/calvinmetcalf/rollup-plugin-node-builtins/master/src/es6/path.js
/** JSDoc */
function normalizeArray(parts, allowAboveRoot) {
    // if the path tries to go above the root, `up` ends up > 0
    var up = 0;
    for (var i = parts.length - 1; i >= 0; i--) {
        var last = parts[i];
        if (last === '.') {
            parts.splice(i, 1);
        }
        else if (last === '..') {
            parts.splice(i, 1);
            up++;
        }
        else if (up) {
            parts.splice(i, 1);
            up--;
        }
    }
    // if the path is allowed to go above the root, restore leading ..s
    if (allowAboveRoot) {
        for (; up--; up) {
            parts.unshift('..');
        }
    }
    return parts;
}
// Split a filename into [root, dir, basename, ext], unix version
// 'root' is just a slash, or nothing.
var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
/** JSDoc */
function splitPath(filename) {
    var parts = splitPathRe.exec(filename);
    return parts ? parts.slice(1) : [];
}
// path.resolve([from ...], to)
// posix version
/** JSDoc */
function resolve() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var resolvedPath = '';
    var resolvedAbsolute = false;
    for (var i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {
        var path = i >= 0 ? args[i] : '/';
        // Skip empty entries
        if (!path) {
            continue;
        }
        resolvedPath = path + "/" + resolvedPath;
        resolvedAbsolute = path.charAt(0) === '/';
    }
    // At this point the path should be resolved to a full absolute path, but
    // handle relative paths to be safe (might happen when process.cwd() fails)
    // Normalize the path
    resolvedPath = normalizeArray(resolvedPath.split('/').filter(function (p) { return !!p; }), !resolvedAbsolute).join('/');
    return (resolvedAbsolute ? '/' : '') + resolvedPath || '.';
}
/** JSDoc */
function trim(arr) {
    var start = 0;
    for (; start < arr.length; start++) {
        if (arr[start] !== '') {
            break;
        }
    }
    var end = arr.length - 1;
    for (; end >= 0; end--) {
        if (arr[end] !== '') {
            break;
        }
    }
    if (start > end) {
        return [];
    }
    return arr.slice(start, end - start + 1);
}
// path.relative(from, to)
// posix version
/** JSDoc */
function relative(from, to) {
    // tslint:disable:no-parameter-reassignment
    from = resolve(from).substr(1);
    to = resolve(to).substr(1);
    var fromParts = trim(from.split('/'));
    var toParts = trim(to.split('/'));
    var length = Math.min(fromParts.length, toParts.length);
    var samePartsLength = length;
    for (var i = 0; i < length; i++) {
        if (fromParts[i] !== toParts[i]) {
            samePartsLength = i;
            break;
        }
    }
    var outputParts = [];
    for (var i = samePartsLength; i < fromParts.length; i++) {
        outputParts.push('..');
    }
    outputParts = outputParts.concat(toParts.slice(samePartsLength));
    return outputParts.join('/');
}
// path.normalize(path)
// posix version
/** JSDoc */
function normalizePath(path) {
    var isPathAbsolute = isAbsolute(path);
    var trailingSlash = path.substr(-1) === '/';
    // Normalize the path
    var normalizedPath = normalizeArray(path.split('/').filter(function (p) { return !!p; }), !isPathAbsolute).join('/');
    if (!normalizedPath && !isPathAbsolute) {
        normalizedPath = '.';
    }
    if (normalizedPath && trailingSlash) {
        normalizedPath += '/';
    }
    return (isPathAbsolute ? '/' : '') + normalizedPath;
}
// posix version
/** JSDoc */
function isAbsolute(path) {
    return path.charAt(0) === '/';
}
// posix version
/** JSDoc */
function join() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    return normalizePath(args.join('/'));
}
/** JSDoc */
function dirname(path) {
    var result = splitPath(path);
    var root = result[0];
    var dir = result[1];
    if (!root && !dir) {
        // No dirname whatsoever
        return '.';
    }
    if (dir) {
        // It has a dirname, strip trailing slash
        dir = dir.substr(0, dir.length - 1);
    }
    return root + dir;
}
/** JSDoc */
function basename(path, ext) {
    var f = splitPath(path)[2];
    if (ext && f.substr(ext.length * -1) === ext) {
        f = f.substr(0, f.length - ext.length);
    }
    return f;
}
//# sourceMappingURL=path.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/polyfill.js":
/*!****************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/polyfill.js ***!
  \****************************************************/
/*! exports provided: setPrototypeOf */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setPrototypeOf", function() { return setPrototypeOf; });
var setPrototypeOf = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array ? setProtoOf : mixinProperties); // tslint:disable-line:no-unbound-method
/**
 * setPrototypeOf polyfill using __proto__
 */
function setProtoOf(obj, proto) {
    // @ts-ignore
    obj.__proto__ = proto;
    return obj;
}
/**
 * setPrototypeOf polyfill using mixin
 */
function mixinProperties(obj, proto) {
    for (var prop in proto) {
        if (!obj.hasOwnProperty(prop)) {
            // @ts-ignore
            obj[prop] = proto[prop];
        }
    }
    return obj;
}
//# sourceMappingURL=polyfill.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/promisebuffer.js":
/*!*********************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/promisebuffer.js ***!
  \*********************************************************/
/*! exports provided: PromiseBuffer */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PromiseBuffer", function() { return PromiseBuffer; });
/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./error */ "./node_modules/@sentry/utils/esm/error.js");
/* harmony import */ var _syncpromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./syncpromise */ "./node_modules/@sentry/utils/esm/syncpromise.js");


/** A simple queue that holds promises. */
var PromiseBuffer = /** @class */ (function () {
    function PromiseBuffer(_limit) {
        this._limit = _limit;
        /** Internal set of queued Promises */
        this._buffer = [];
    }
    /**
     * Says if the buffer is ready to take more requests
     */
    PromiseBuffer.prototype.isReady = function () {
        return this._limit === undefined || this.length() < this._limit;
    };
    /**
     * Add a promise to the queue.
     *
     * @param task Can be any PromiseLike<T>
     * @returns The original promise.
     */
    PromiseBuffer.prototype.add = function (task) {
        var _this = this;
        if (!this.isReady()) {
            return _syncpromise__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].reject(new _error__WEBPACK_IMPORTED_MODULE_0__["SentryError"]('Not adding Promise due to buffer limit reached.'));
        }
        if (this._buffer.indexOf(task) === -1) {
            this._buffer.push(task);
        }
        task
            .then(function () { return _this.remove(task); })
            .then(null, function () {
            return _this.remove(task).then(null, function () {
                // We have to add this catch here otherwise we have an unhandledPromiseRejection
                // because it's a new Promise chain.
            });
        });
        return task;
    };
    /**
     * Remove a promise to the queue.
     *
     * @param task Can be any PromiseLike<T>
     * @returns Removed promise.
     */
    PromiseBuffer.prototype.remove = function (task) {
        var removedTask = this._buffer.splice(this._buffer.indexOf(task), 1)[0];
        return removedTask;
    };
    /**
     * This function returns the number of unresolved promises in the queue.
     */
    PromiseBuffer.prototype.length = function () {
        return this._buffer.length;
    };
    /**
     * This will drain the whole queue, returns true if queue is empty or drained.
     * If timeout is provided and the queue takes longer to drain, the promise still resolves but with false.
     *
     * @param timeout Number in ms to wait until it resolves with false.
     */
    PromiseBuffer.prototype.drain = function (timeout) {
        var _this = this;
        return new _syncpromise__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"](function (resolve) {
            var capturedSetTimeout = setTimeout(function () {
                if (timeout && timeout > 0) {
                    resolve(false);
                }
            }, timeout);
            _syncpromise__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].all(_this._buffer)
                .then(function () {
                clearTimeout(capturedSetTimeout);
                resolve(true);
            })
                .then(null, function () {
                resolve(true);
            });
        });
    };
    return PromiseBuffer;
}());

//# sourceMappingURL=promisebuffer.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/string.js":
/*!**************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/string.js ***!
  \**************************************************/
/*! exports provided: truncate, snipLine, safeJoin, isMatchingPattern */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "truncate", function() { return truncate; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "snipLine", function() { return snipLine; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "safeJoin", function() { return safeJoin; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isMatchingPattern", function() { return isMatchingPattern; });
/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");

/**
 * Truncates given string to the maximum characters count
 *
 * @param str An object that contains serializable values
 * @param max Maximum number of characters in truncated string
 * @returns string Encoded
 */
function truncate(str, max) {
    if (max === void 0) { max = 0; }
    // tslint:disable-next-line:strict-type-predicates
    if (typeof str !== 'string' || max === 0) {
        return str;
    }
    return str.length <= max ? str : str.substr(0, max) + "...";
}
/**
 * This is basically just `trim_line` from
 * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67
 *
 * @param str An object that contains serializable values
 * @param max Maximum number of characters in truncated string
 * @returns string Encoded
 */
function snipLine(line, colno) {
    var newLine = line;
    var ll = newLine.length;
    if (ll <= 150) {
        return newLine;
    }
    if (colno > ll) {
        colno = ll; // tslint:disable-line:no-parameter-reassignment
    }
    var start = Math.max(colno - 60, 0);
    if (start < 5) {
        start = 0;
    }
    var end = Math.min(start + 140, ll);
    if (end > ll - 5) {
        end = ll;
    }
    if (end === ll) {
        start = Math.max(end - 140, 0);
    }
    newLine = newLine.slice(start, end);
    if (start > 0) {
        newLine = "'{snip} " + newLine;
    }
    if (end < ll) {
        newLine += ' {snip}';
    }
    return newLine;
}
/**
 * Join values in array
 * @param input array of values to be joined together
 * @param delimiter string to be placed in-between values
 * @returns Joined values
 */
function safeJoin(input, delimiter) {
    if (!Array.isArray(input)) {
        return '';
    }
    var output = [];
    // tslint:disable-next-line:prefer-for-of
    for (var i = 0; i < input.length; i++) {
        var value = input[i];
        try {
            output.push(String(value));
        }
        catch (e) {
            output.push('[value cannot be serialized]');
        }
    }
    return output.join(delimiter);
}
/**
 * Checks if the value matches a regex or includes the string
 * @param value The string value to be checked against
 * @param pattern Either a regex or a string that must be contained in value
 */
function isMatchingPattern(value, pattern) {
    if (!Object(_is__WEBPACK_IMPORTED_MODULE_0__["isString"])(value)) {
        return false;
    }
    if (Object(_is__WEBPACK_IMPORTED_MODULE_0__["isRegExp"])(pattern)) {
        return pattern.test(value);
    }
    if (typeof pattern === 'string') {
        return value.indexOf(pattern) !== -1;
    }
    return false;
}
//# sourceMappingURL=string.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/supports.js":
/*!****************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/supports.js ***!
  \****************************************************/
/*! exports provided: supportsErrorEvent, supportsDOMError, supportsDOMException, supportsFetch, supportsNativeFetch, supportsReportingObserver, supportsReferrerPolicy, supportsHistory */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsErrorEvent", function() { return supportsErrorEvent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsDOMError", function() { return supportsDOMError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsDOMException", function() { return supportsDOMException; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsFetch", function() { return supportsFetch; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsNativeFetch", function() { return supportsNativeFetch; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsReportingObserver", function() { return supportsReportingObserver; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsReferrerPolicy", function() { return supportsReferrerPolicy; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsHistory", function() { return supportsHistory; });
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./logger */ "./node_modules/@sentry/utils/esm/logger.js");
/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./misc */ "./node_modules/@sentry/utils/esm/misc.js");


/**
 * Tells whether current environment supports ErrorEvent objects
 * {@link supportsErrorEvent}.
 *
 * @returns Answer to the given question.
 */
function supportsErrorEvent() {
    try {
        // tslint:disable:no-unused-expression
        new ErrorEvent('');
        return true;
    }
    catch (e) {
        return false;
    }
}
/**
 * Tells whether current environment supports DOMError objects
 * {@link supportsDOMError}.
 *
 * @returns Answer to the given question.
 */
function supportsDOMError() {
    try {
        // It really needs 1 argument, not 0.
        // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':
        // 1 argument required, but only 0 present.
        // @ts-ignore
        // tslint:disable:no-unused-expression
        new DOMError('');
        return true;
    }
    catch (e) {
        return false;
    }
}
/**
 * Tells whether current environment supports DOMException objects
 * {@link supportsDOMException}.
 *
 * @returns Answer to the given question.
 */
function supportsDOMException() {
    try {
        // tslint:disable:no-unused-expression
        new DOMException('');
        return true;
    }
    catch (e) {
        return false;
    }
}
/**
 * Tells whether current environment supports Fetch API
 * {@link supportsFetch}.
 *
 * @returns Answer to the given question.
 */
function supportsFetch() {
    if (!('fetch' in Object(_misc__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])())) {
        return false;
    }
    try {
        // tslint:disable-next-line:no-unused-expression
        new Headers();
        // tslint:disable-next-line:no-unused-expression
        new Request('');
        // tslint:disable-next-line:no-unused-expression
        new Response();
        return true;
    }
    catch (e) {
        return false;
    }
}
/**
 * isNativeFetch checks if the given function is a native implementation of fetch()
 */
function isNativeFetch(func) {
    return func && /^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/.test(func.toString());
}
/**
 * Tells whether current environment supports Fetch API natively
 * {@link supportsNativeFetch}.
 *
 * @returns true if `window.fetch` is natively implemented, false otherwise
 */
function supportsNativeFetch() {
    if (!supportsFetch()) {
        return false;
    }
    var global = Object(_misc__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
    // Fast path to avoid DOM I/O
    // tslint:disable-next-line:no-unbound-method
    if (isNativeFetch(global.fetch)) {
        return true;
    }
    // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)
    // so create a "pure" iframe to see if that has native fetch
    var result = false;
    var doc = global.document;
    // tslint:disable-next-line:no-unbound-method deprecation
    if (doc && typeof doc.createElement === "function") {
        try {
            var sandbox = doc.createElement('iframe');
            sandbox.hidden = true;
            doc.head.appendChild(sandbox);
            if (sandbox.contentWindow && sandbox.contentWindow.fetch) {
                // tslint:disable-next-line:no-unbound-method
                result = isNativeFetch(sandbox.contentWindow.fetch);
            }
            doc.head.removeChild(sandbox);
        }
        catch (err) {
            _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);
        }
    }
    return result;
}
/**
 * Tells whether current environment supports ReportingObserver API
 * {@link supportsReportingObserver}.
 *
 * @returns Answer to the given question.
 */
function supportsReportingObserver() {
    // tslint:disable-next-line: no-unsafe-any
    return 'ReportingObserver' in Object(_misc__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
}
/**
 * Tells whether current environment supports Referrer Policy API
 * {@link supportsReferrerPolicy}.
 *
 * @returns Answer to the given question.
 */
function supportsReferrerPolicy() {
    // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default
    // https://caniuse.com/#feat=referrer-policy
    // It doesn't. And it throw exception instead of ignoring this parameter...
    // REF: https://github.com/getsentry/raven-js/issues/1233
    if (!supportsFetch()) {
        return false;
    }
    try {
        // tslint:disable:no-unused-expression
        new Request('_', {
            referrerPolicy: 'origin',
        });
        return true;
    }
    catch (e) {
        return false;
    }
}
/**
 * Tells whether current environment supports History API
 * {@link supportsHistory}.
 *
 * @returns Answer to the given question.
 */
function supportsHistory() {
    // NOTE: in Chrome App environment, touching history.pushState, *even inside
    //       a try/catch block*, will cause Chrome to output an error to console.error
    // borrowed from: https://github.com/angular/angular.js/pull/13945/files
    var global = Object(_misc__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
    var chrome = global.chrome;
    // tslint:disable-next-line:no-unsafe-any
    var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;
    var hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState;
    return !isChromePackagedApp && hasHistoryApi;
}
//# sourceMappingURL=supports.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/syncpromise.js":
/*!*******************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/syncpromise.js ***!
  \*******************************************************/
/*! exports provided: SyncPromise */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SyncPromise", function() { return SyncPromise; });
/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");

/** SyncPromise internal states */
var States;
(function (States) {
    /** Pending */
    States["PENDING"] = "PENDING";
    /** Resolved / OK */
    States["RESOLVED"] = "RESOLVED";
    /** Rejected / Error */
    States["REJECTED"] = "REJECTED";
})(States || (States = {}));
/**
 * Thenable class that behaves like a Promise and follows it's interface
 * but is not async internally
 */
var SyncPromise = /** @class */ (function () {
    function SyncPromise(executor) {
        var _this = this;
        this._state = States.PENDING;
        this._handlers = [];
        /** JSDoc */
        this._resolve = function (value) {
            _this._setResult(States.RESOLVED, value);
        };
        /** JSDoc */
        this._reject = function (reason) {
            _this._setResult(States.REJECTED, reason);
        };
        /** JSDoc */
        this._setResult = function (state, value) {
            if (_this._state !== States.PENDING) {
                return;
            }
            if (Object(_is__WEBPACK_IMPORTED_MODULE_0__["isThenable"])(value)) {
                value.then(_this._resolve, _this._reject);
                return;
            }
            _this._state = state;
            _this._value = value;
            _this._executeHandlers();
        };
        // TODO: FIXME
        /** JSDoc */
        this._attachHandler = function (handler) {
            _this._handlers = _this._handlers.concat(handler);
            _this._executeHandlers();
        };
        /** JSDoc */
        this._executeHandlers = function () {
            if (_this._state === States.PENDING) {
                return;
            }
            var cachedHandlers = _this._handlers.slice();
            _this._handlers = [];
            cachedHandlers.forEach(function (handler) {
                if (handler.done) {
                    return;
                }
                if (_this._state === States.RESOLVED) {
                    if (handler.onfulfilled) {
                        handler.onfulfilled(_this._value);
                    }
                }
                if (_this._state === States.REJECTED) {
                    if (handler.onrejected) {
                        handler.onrejected(_this._value);
                    }
                }
                handler.done = true;
            });
        };
        try {
            executor(this._resolve, this._reject);
        }
        catch (e) {
            this._reject(e);
        }
    }
    /** JSDoc */
    SyncPromise.prototype.toString = function () {
        return '[object SyncPromise]';
    };
    /** JSDoc */
    SyncPromise.resolve = function (value) {
        return new SyncPromise(function (resolve) {
            resolve(value);
        });
    };
    /** JSDoc */
    SyncPromise.reject = function (reason) {
        return new SyncPromise(function (_, reject) {
            reject(reason);
        });
    };
    /** JSDoc */
    SyncPromise.all = function (collection) {
        return new SyncPromise(function (resolve, reject) {
            if (!Array.isArray(collection)) {
                reject(new TypeError("Promise.all requires an array as input."));
                return;
            }
            if (collection.length === 0) {
                resolve([]);
                return;
            }
            var counter = collection.length;
            var resolvedCollection = [];
            collection.forEach(function (item, index) {
                SyncPromise.resolve(item)
                    .then(function (value) {
                    resolvedCollection[index] = value;
                    counter -= 1;
                    if (counter !== 0) {
                        return;
                    }
                    resolve(resolvedCollection);
                })
                    .then(null, reject);
            });
        });
    };
    /** JSDoc */
    SyncPromise.prototype.then = function (onfulfilled, onrejected) {
        var _this = this;
        return new SyncPromise(function (resolve, reject) {
            _this._attachHandler({
                done: false,
                onfulfilled: function (result) {
                    if (!onfulfilled) {
                        // TODO: ¯\_(ツ)_/¯
                        // TODO: FIXME
                        resolve(result);
                        return;
                    }
                    try {
                        resolve(onfulfilled(result));
                        return;
                    }
                    catch (e) {
                        reject(e);
                        return;
                    }
                },
                onrejected: function (reason) {
                    if (!onrejected) {
                        reject(reason);
                        return;
                    }
                    try {
                        resolve(onrejected(reason));
                        return;
                    }
                    catch (e) {
                        reject(e);
                        return;
                    }
                },
            });
        });
    };
    /** JSDoc */
    SyncPromise.prototype.catch = function (onrejected) {
        return this.then(function (val) { return val; }, onrejected);
    };
    /** JSDoc */
    SyncPromise.prototype.finally = function (onfinally) {
        var _this = this;
        return new SyncPromise(function (resolve, reject) {
            var val;
            var isRejected;
            return _this.then(function (value) {
                isRejected = false;
                val = value;
                if (onfinally) {
                    onfinally();
                }
            }, function (reason) {
                isRejected = true;
                val = reason;
                if (onfinally) {
                    onfinally();
                }
            }).then(function () {
                if (isRejected) {
                    reject(val);
                    return;
                }
                resolve(val);
            });
        });
    };
    return SyncPromise;
}());

//# sourceMappingURL=syncpromise.js.map

/***/ }),

/***/ "./node_modules/process/browser.js":
/*!*****************************************!*\
  !*** ./node_modules/process/browser.js ***!
  \*****************************************/
/*! no static exports found */
/***/ (function(module, exports) {

// shim for using process in browser
var process = module.exports = {};

// cached from whatever global is present so that test runners that stub it
// don't break things.  But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals.  It's inside a
// function because try/catches deoptimize in certain engines.

var cachedSetTimeout;
var cachedClearTimeout;

function defaultSetTimout() {
    throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
    throw new Error('clearTimeout has not been defined');
}
(function () {
    try {
        if (typeof setTimeout === 'function') {
            cachedSetTimeout = setTimeout;
        } else {
            cachedSetTimeout = defaultSetTimout;
        }
    } catch (e) {
        cachedSetTimeout = defaultSetTimout;
    }
    try {
        if (typeof clearTimeout === 'function') {
            cachedClearTimeout = clearTimeout;
        } else {
            cachedClearTimeout = defaultClearTimeout;
        }
    } catch (e) {
        cachedClearTimeout = defaultClearTimeout;
    }
} ())
function runTimeout(fun) {
    if (cachedSetTimeout === setTimeout) {
        //normal enviroments in sane situations
        return setTimeout(fun, 0);
    }
    // if setTimeout wasn't available but was latter defined
    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
        cachedSetTimeout = setTimeout;
        return setTimeout(fun, 0);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedSetTimeout(fun, 0);
    } catch(e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
            return cachedSetTimeout.call(null, fun, 0);
        } catch(e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
            return cachedSetTimeout.call(this, fun, 0);
        }
    }


}
function runClearTimeout(marker) {
    if (cachedClearTimeout === clearTimeout) {
        //normal enviroments in sane situations
        return clearTimeout(marker);
    }
    // if clearTimeout wasn't available but was latter defined
    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
        cachedClearTimeout = clearTimeout;
        return clearTimeout(marker);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedClearTimeout(marker);
    } catch (e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
            return cachedClearTimeout.call(null, marker);
        } catch (e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
            return cachedClearTimeout.call(this, marker);
        }
    }



}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;

function cleanUpNextTick() {
    if (!draining || !currentQueue) {
        return;
    }
    draining = false;
    if (currentQueue.length) {
        queue = currentQueue.concat(queue);
    } else {
        queueIndex = -1;
    }
    if (queue.length) {
        drainQueue();
    }
}

function drainQueue() {
    if (draining) {
        return;
    }
    var timeout = runTimeout(cleanUpNextTick);
    draining = true;

    var len = queue.length;
    while(len) {
        currentQueue = queue;
        queue = [];
        while (++queueIndex < len) {
            if (currentQueue) {
                currentQueue[queueIndex].run();
            }
        }
        queueIndex = -1;
        len = queue.length;
    }
    currentQueue = null;
    draining = false;
    runClearTimeout(timeout);
}

process.nextTick = function (fun) {
    var args = new Array(arguments.length - 1);
    if (arguments.length > 1) {
        for (var i = 1; i < arguments.length; i++) {
            args[i - 1] = arguments[i];
        }
    }
    queue.push(new Item(fun, args));
    if (queue.length === 1 && !draining) {
        runTimeout(drainQueue);
    }
};

// v8 likes predictible objects
function Item(fun, array) {
    this.fun = fun;
    this.array = array;
}
Item.prototype.run = function () {
    this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};

function noop() {}

process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;

process.listeners = function (name) { return [] }

process.binding = function (name) {
    throw new Error('process.binding is not supported');
};

process.cwd = function () { return '/' };
process.chdir = function (dir) {
    throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };


/***/ }),

/***/ "./node_modules/tslib/tslib.es6.js":
/*!*****************************************!*\
  !*** ./node_modules/tslib/tslib.es6.js ***!
  \*****************************************/
/*! exports provided: __extends, __assign, __rest, __decorate, __param, __metadata, __awaiter, __generator, __exportStar, __values, __read, __spread, __spreadArrays, __await, __asyncGenerator, __asyncDelegator, __asyncValues, __makeTemplateObject, __importStar, __importDefault */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__extends", function() { return __extends; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__assign", function() { return __assign; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__rest", function() { return __rest; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__decorate", function() { return __decorate; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__param", function() { return __param; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__metadata", function() { return __metadata; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__awaiter", function() { return __awaiter; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__generator", function() { return __generator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__exportStar", function() { return __exportStar; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__values", function() { return __values; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__read", function() { return __read; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__spread", function() { return __spread; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__spreadArrays", function() { return __spreadArrays; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__await", function() { return __await; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncGenerator", function() { return __asyncGenerator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncDelegator", function() { return __asyncDelegator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncValues", function() { return __asyncValues; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__makeTemplateObject", function() { return __makeTemplateObject; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importStar", function() { return __importStar; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importDefault", function() { return __importDefault; });
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/* global Reflect, Promise */

var extendStatics = function(d, b) {
    extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
    return extendStatics(d, b);
};

function __extends(d, b) {
    extendStatics(d, b);
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}

var __assign = function() {
    __assign = Object.assign || function __assign(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
        }
        return t;
    }
    return __assign.apply(this, arguments);
}

function __rest(s, e) {
    var t = {};
    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
        t[p] = s[p];
    if (s != null && typeof Object.getOwnPropertySymbols === "function")
        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
                t[p[i]] = s[p[i]];
        }
    return t;
}

function __decorate(decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
}

function __param(paramIndex, decorator) {
    return function (target, key) { decorator(target, key, paramIndex); }
}

function __metadata(metadataKey, metadataValue) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
}

function __awaiter(thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
}

function __generator(thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
}

function __exportStar(m, exports) {
    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}

function __values(o) {
    var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
    if (m) return m.call(o);
    return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
}

function __read(o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
}

function __spread() {
    for (var ar = [], i = 0; i < arguments.length; i++)
        ar = ar.concat(__read(arguments[i]));
    return ar;
}

function __spreadArrays() {
    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
    for (var r = Array(s), k = 0, i = 0; i < il; i++)
        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
            r[k] = a[j];
    return r;
};

function __await(v) {
    return this instanceof __await ? (this.v = v, this) : new __await(v);
}

function __asyncGenerator(thisArg, _arguments, generator) {
    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
    var g = generator.apply(thisArg, _arguments || []), i, q = [];
    return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
    function fulfill(value) { resume("next", value); }
    function reject(value) { resume("throw", value); }
    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
}

function __asyncDelegator(o) {
    var i, p;
    return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
}

function __asyncValues(o) {
    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
    var m = o[Symbol.asyncIterator], i;
    return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
}

function __makeTemplateObject(cooked, raw) {
    if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
    return cooked;
};

function __importStar(mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
    result.default = mod;
    return result;
}

function __importDefault(mod) {
    return (mod && mod.__esModule) ? mod : { default: mod };
}


/***/ }),

/***/ "./node_modules/webpack/buildin/global.js":
/*!***********************************!*\
  !*** (webpack)/buildin/global.js ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports) {

var g;

// This works in non-strict mode
g = (function() {
	return this;
})();

try {
	// This works if eval is allowed (see CSP)
	g = g || new Function("return this")();
} catch (e) {
	// This works if the window reference is available
	if (typeof window === "object") g = window;
}

// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}

module.exports = g;


/***/ }),

/***/ "./node_modules/webpack/buildin/harmony-module.js":
/*!*******************************************!*\
  !*** (webpack)/buildin/harmony-module.js ***!
  \*******************************************/
/*! no static exports found */
/***/ (function(module, exports) {

module.exports = function(originalModule) {
	if (!originalModule.webpackPolyfill) {
		var module = Object.create(originalModule);
		// module.parent = undefined by default
		if (!module.children) module.children = [];
		Object.defineProperty(module, "loaded", {
			enumerable: true,
			get: function() {
				return module.l;
			}
		});
		Object.defineProperty(module, "id", {
			enumerable: true,
			get: function() {
				return module.i;
			}
		});
		Object.defineProperty(module, "exports", {
			enumerable: true
		});
		module.webpackPolyfill = 1;
	}
	return module;
};


/***/ }),

/***/ "./resources/js/app.js":
/*!*****************************!*\
  !*** ./resources/js/app.js ***!
  \*****************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _sentry_browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/browser */ "./node_modules/@sentry/browser/esm/index.js");
/** ==========================================================================
 *  Dependencies
 *  =========================================================================*/
// We first import Sentry and trigger it if the sentry dsn is defined
// Because then all errors are logged

if (window.sentry_dsn !== undefined) _sentry_browser__WEBPACK_IMPORTED_MODULE_0__["init"]({
  dsn: window.sentry_dsn
});
/**
 * External
 */

__webpack_require__(/*! hammerjs */ "./node_modules/hammerjs/hammer.js");

__webpack_require__(/*! objectFitPolyfill */ "./node_modules/objectFitPolyfill/dist/objectFitPolyfill.min.js");
/** ==========================================================================
 *  Global functionalities
 *  =========================================================================*/


__webpack_require__(/*! ./global/helpers */ "./resources/js/global/helpers.js"); // Should be first


__webpack_require__(/*! ./global/browserHandler */ "./resources/js/global/browserHandler.js");

__webpack_require__(/*! ./global/scrollHandler */ "./resources/js/global/scrollHandler.js");
/** ==========================================================================
 *  Component functionalities
 *  =========================================================================*/


__webpack_require__(/*! ./components/chocolateFactory */ "./resources/js/components/chocolateFactory.js");

__webpack_require__(/*! ./components/cookieHandler */ "./resources/js/components/cookieHandler.js"); // require('./components/InputHandler');


__webpack_require__(/*! ./components/mapsHandler */ "./resources/js/components/mapsHandler.js");

__webpack_require__(/*! ./components/overlayMenuHandler */ "./resources/js/components/overlayMenuHandler.js");

__webpack_require__(/*! ./components/scrollToHandler */ "./resources/js/components/scrollToHandler.js");

__webpack_require__(/*! ./components/sliderHandler */ "./resources/js/components/sliderHandler.js");

__webpack_require__(/*! ./components/tabsHandler */ "./resources/js/components/tabsHandler.js");

__webpack_require__(/*! ./components/youtubeHandler */ "./resources/js/components/youtubeHandler.js");

/***/ }),

/***/ "./resources/js/components/chocolateFactory.js":
/*!*****************************************************!*\
  !*** ./resources/js/components/chocolateFactory.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
 | Prevent Bots handler
 |
 | We named this chocolate factory and belonging confusing js hooks
 | to prevent smart bots from blocking these variable or functions.
 |
 ========================================================================== */
var ChocolateFactory = {
  bannedVisitor: [],

  /** Get all the chocolate factory and start
   *  Looping through those start flashing tickets
   */
  enter: function enter() {
    var chocolateFactories = document.querySelectorAll('.js-chocolate-factory');

    if (isset(chocolateFactories)) {
      var amountOfChocolateFactories = chocolateFactories.length;

      for (var i = 0; i < amountOfChocolateFactories; i++) {
        var ChocolateBar = chocolateFactories[i];

        ChocolateFactory._flashTicket(ChocolateBar);
      }
    }
  },

  /**
   * If factory has a golden ticket
   * Then we can make them go on the tour if there has been click on the ticket
   *
   * @param chocolateBar
   * @private
   */
  _flashTicket: function _flashTicket(chocolateBar) {
    // Try get the ticket from the chocolateBar
    var goldenTicket = chocolateBar.querySelector('.js-golden-ticket'); // Only continue if chocolate bar has a golden ticket

    if (isset(goldenTicket)) {
      goldenTicket.addEventListener('click', function () {
        ChocolateFactory.enjoyTheTour(chocolateBar);
      });
    } else {
      console.log('To bad, no golden tickets has been found.');
    }
  },

  /**
   * Start the tour through the factory
   * And get the names and properties of the members of the group
   * If there are members in the group of course
   *
   * @param chocolateFactory
   */
  enjoyTheTour: function enjoyTheTour(chocolateFactory) {
    // Ask for the tour group
    var tourGroup = chocolateFactory.querySelectorAll('input, textarea');

    if (isset(tourGroup)) {
      // For each visitor we want a belonging Oompa Loompa
      var oompaLoompas = {};
      var amountOfOompaLoompas = 0;
      var tourGroupSize = tourGroup.length;

      for (var i = 0; i < tourGroupSize; i++) {
        // Get the visitor from the group
        var visitor = tourGroup[i]; // Ask for its name

        var visitorName = visitor.getAttribute('name'); // Check if the visitor is banned

        if (ChocolateFactory._isVisitorBanned(visitorName)) continue;
        oompaLoompas[visitorName] = ChocolateFactory._getArrangement(visitor);
        amountOfOompaLoompas++;
      } // Check for insurance that there are oompa loompas


      if (amountOfOompaLoompas === 0) return; // Send submit request

      ChocolateFactory._finishTour(oompaLoompas, chocolateFactory);
    } else {
      console.log('To bad, no members to visit this factory');
    }
  },

  /**
   * Check if the visitor name isn't allow
   *
   * @param visitorName
   * @returns {boolean}
   * @private
   */
  _isVisitorBanned: function _isVisitorBanned(visitorName) {
    if (ChocolateFactory.bannedVisitor.indexOf(visitorName) !== -1) {
      return true;
    }

    return false;
  },

  /**
   * Most get visitor have a normal arrangement
   * But sometimes there are special cases
   * Like a Selector or checkbox
   *
   * @param visitor
   * @returns {*}
   * @private
   */
  _getArrangement: function _getArrangement(visitor) {
    var visitorType = visitor.nodeName;

    switch (visitorType) {
      default:
        return visitor.value;
    }
  },

  /**
   * Finish the tour
   * If successful show thanks message
   * Or show defined error message or fallback
   *
   * @param group
   * @param chocolateFactory
   * @returns {*|void}
   * @private
   */
  _finishTour: function _finishTour(group, chocolateFactory) {
    // Add willie to the group
    group = ChocolateFactory._addWillieWonka(group); // Get the gate for finish the tour

    var gate = '/contact/process';

    try {
      Ajax.post(gate, group, function (HttpRequest) {
        var response = JSON.parse(HttpRequest.response);

        switch (HttpRequest.status) {
          case 200:
            return ChocolateFactory._thanksForVisiting(response.redirectUrl);

          case 422:
            return ChocolateFactory._giveFeedbackToMembers(response.errors, chocolateFactory);

          default:
            break;
        }

        return ChocolateFactory._unknownGapInFactory(chocolateFactory);
      });
    } catch (e) {
      return ChocolateFactory._unknownGapInFactory(chocolateFactory);
    }
  },

  /**
   * Add willie wonka to the group
   * Ps... it actually the secret code!
   *
   * @param group
   * @returns {*}
   * @private
   */
  _addWillieWonka: function _addWillieWonka(group) {
    group._willie = 'wonka';
    return group;
  },

  /**
   * Add the feedback to the desired area.
   * Most likely to the visitor directly, but sometime to the factory desired feedback area
   *
   * @param errors
   * @param chocolateFactory
   * @private
   */
  _giveFeedbackToMembers: function _giveFeedbackToMembers(errors, chocolateFactory) {
    // Grab the factory feedback area
    var feedbackArea = chocolateFactory.querySelector('.js-error-area'); // Clear the current html

    if (isset(feedbackArea)) feedbackArea.innerHTML = ''; // Clear the previous marked jackets

    ChocolateFactory._clearPreviousMarkedJackets(chocolateFactory);

    Object.keys(errors).forEach(function (visitor) {
      var jacket = null;
      var visitorFeedbackArea = null; // Honey elements doesn't has a accessible element

      if (visitor !== '_honey' && visitor !== '_secretCode') {
        // Grab the visitor
        var visitorNode = chocolateFactory.querySelector('#' + visitor); // Find the jacket of a visitor

        jacket = ChocolateFactory._grabVisitorJacket(visitorNode); // If found get the desired area

        if (isset(jacket)) visitorFeedbackArea = jacket.querySelector('.js-form-group-error'); // Clear the current html

        if (isset(visitorFeedbackArea)) visitorFeedbackArea.innerHTML = '';
      } // Get the feedback for this visitor


      var visitorFeedback = errors[visitor]; // Spit out each line

      var visitorFeedbackAmount = visitorFeedback.length;

      for (var i = 0; i < visitorFeedbackAmount; i++) {
        var visitorFeedbackLine = visitorFeedback[i]; // console.log(visitor, visitorFeedbackLine);
        // Honey elements doesn't has a accessible element area

        if (visitor !== '_honey' && visitor !== '_secretCode') {
          // Mark the jacket
          if (isset(jacket)) jacket.classList.add('has-error'); // Append feedback to visitor feedback area if defined

          if (isset(visitorFeedbackArea) && visitorFeedbackLine.length > 0) {
            var currentFeedbackArea = visitorFeedbackArea.innerHTML;
            currentFeedbackArea += '<span>' + capitalizeFirstLetter(visitorFeedbackLine) + '</span>';
            visitorFeedbackArea.innerHTML = currentFeedbackArea;
          }
        } // Append feedback to factory feedback area if defined


        if (isset(feedbackArea) && visitorFeedbackLine.length > 0) {
          var _currentFeedbackArea = feedbackArea.innerHTML;
          _currentFeedbackArea += '<li>' + capitalizeFirstLetter(visitorFeedbackLine) + '</li>';
          feedbackArea.innerHTML = _currentFeedbackArea;
        }
      }
    });
  },

  /**
   * Clear the previous marked jackets
   *
   * @param chocolateFactory
   * @private
   */
  _clearPreviousMarkedJackets: function _clearPreviousMarkedJackets(chocolateFactory) {
    var markedJackets = chocolateFactory.querySelectorAll('.has-error');
    var markedJacketsAmount = markedJackets.length;

    for (var i = 0; i < markedJacketsAmount; i++) {
      markedJackets[i].classList.remove('has-error');
    }
  },

  /**
   * Grab the jacket of the visitor
   *
   * @param visitor
   * @returns {null|*|(() => (Node | null))|ActiveX.IXMLDOMNode|(Node & ParentNode)}
   * @private
   */
  _grabVisitorJacket: function _grabVisitorJacket(visitor) {
    // Check if visitor is defined
    if (!isset(visitor)) return null; // Do loop settings

    currentLayer = visitor;
    safetyBreak = 0; // Grab the next layer till it is the jacket (or safetyBreak has been reached

    do {
      safetyBreak++;
      currentLayer = currentLayer.parentNode;
      if (currentLayer.classList.contains('js-form-group')) return currentLayer;
    } while (currentLayer.tagName !== 'BODY' && safetyBreak <= 10);

    return null;
  },

  /**
   * Redirect the visitor to the thanks page
   *
   * @param nextStop
   * @private
   */
  _thanksForVisiting: function _thanksForVisiting(nextStop) {
    window.location = nextStop;
  },

  /**
   * Unknown error occurred, log the error
   *
   * @param chocolateFactory
   * @private
   */
  _unknownGapInFactory: function _unknownGapInFactory(chocolateFactory) {
    console.log(chocolateFactory);
    console.log('ChocolateFactory: Unkown Error');
  }
};
ChocolateFactory.enter();

/***/ }),

/***/ "./resources/js/components/cookieHandler.js":
/*!**************************************************!*\
  !*** ./resources/js/components/cookieHandler.js ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
   Cookie handler
   - Primary usage for toggling the cookie message and/or switch
 ========================================================================== */
var CookieHandler = {
  cookieBar: null,
  cookieMessage: null,
  cookieFadeOutAnimationDuration: 400,
  acceptTracking: false,
  // Initialize cookie handler
  init: function init() {
    // Bind cookie bar to cookieMessage
    CookieHandler.cookieMessage = document.querySelector('.js-cookie-bar'); // Bind cookie bar to cookieBar

    CookieHandler.cookieBar = document.querySelector('.js-cookie-bar'); // If isset init the functions for cookie bar

    if (isset(CookieHandler.cookieBar)) {
      CookieHandler.initCookieBar();
    } // If either type of cookie has been found check if settings are defined


    if (isset(CookieHandler.cookieMessage)) {
      CookieHandler.checkForCookieSettings();
    }
  },
  // Init the cookie bar actions
  initCookieBar: function initCookieBar() {
    var closeButton = CookieHandler.cookieBar.querySelector('.js-disable-cookie-bar');

    if (isset(closeButton)) {
      closeButton.addEventListener('click', CookieHandler.closeCookieMessage);
    }
  },
  checkForCookieSettings: function checkForCookieSettings() {
    if (Cookie.get('cookieMessage')) {
      document.body.classList.add('is-cookies-accepted');
    } else {
      document.body.classList.remove('is-cookies-accepted');
    }
  },
  closeCookieMessage: function closeCookieMessage() {
    Cookie.set('cookieMessage', true, 90);
    CookieHandler.cookieMessage.classList.add('is-transitioning-out');
    document.body.classList.add('is-cookies-accepted');
  }
};
CookieHandler.init();

/***/ }),

/***/ "./resources/js/components/mapsHandler.js":
/*!************************************************!*\
  !*** ./resources/js/components/mapsHandler.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
    Google Maps handler
    - https://developers.google.com/maps/documentation/javascript/adding-a-google-map
 ========================================================================== */
var MapsHandler = {
  map: '',
  key: 'AIzaSyCVGPUmRmQRxXvzzWu3Xyu77XebQxQ-f4Y',
  location: {
    lat: 51.261089,
    lng: 5.598172
  },
  styling: '',
  init: function init() {
    // Get map by id
    MapsHandler.map = document.querySelector('.js-google-map'); // Check if a map is defined

    if (isset(MapsHandler.map)) {
      if (MapsHandler.map.hasAttribute('data-google-lat')) MapsHandler.location.lat = parseFloat(MapsHandler.map.getAttribute('data-google-lat'));
      if (MapsHandler.map.hasAttribute('data-google-lng')) MapsHandler.location.lng = parseFloat(MapsHandler.map.getAttribute('data-google-lng'));
      MapsHandler.setCustomStyling(); // See if google variable exists

      if (typeof google == 'undefined' || typeof google.maps == 'undefined') {
        // Load external script
        getScript('https://maps.googleapis.com/maps/api/js?key=' + MapsHandler.key, MapsHandler.drawMap);
      } else {
        MapsHandler.drawMap();
      }
    }
  },
  drawMap: function drawMap() {
    // Create a map
    var map = new google.maps.Map(MapsHandler.map, {
      zoom: 14,
      center: MapsHandler.location,
      disableDefaultUI: true,
      styles: MapsHandler.styling
    });
    var contentString = '<div><p>Plan een route op ' + '<a target="_blank" href="https://www.google.com/maps/dir/?api=1&destination=' + MapsHandler.location.lat + ',' + MapsHandler.location.lng + '" class="link">' + 'google maps</a> ' + '</p></div>';
    var infowindow = new google.maps.InfoWindow({
      content: contentString
    }); // Add a marker

    var marker = new google.maps.Marker({
      position: MapsHandler.location,
      map: map // label: 'A'

    });
    marker.addListener('click', function () {
      infowindow.open(map, marker);
    });
  },
  setCustomStyling: function setCustomStyling() {
    MapsHandler.styling = [{
      "featureType": "water",
      "elementType": "geometry",
      "stylers": [{
        "color": "#e9e9e9"
      }, {
        "lightness": 17
      }]
    }, {
      "featureType": "landscape",
      "elementType": "geometry",
      "stylers": [{
        "color": "#f5f5f5"
      }, {
        "lightness": 20
      }]
    }, {
      "featureType": "road.highway",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#ffffff"
      }, {
        "lightness": 17
      }]
    }, {
      "featureType": "road.highway",
      "elementType": "geometry.stroke",
      "stylers": [{
        "color": "#ffffff"
      }, {
        "lightness": 29
      }, {
        "weight": 0.2
      }]
    }, {
      "featureType": "road.arterial",
      "elementType": "geometry",
      "stylers": [{
        "color": "#ffffff"
      }, {
        "lightness": 18
      }]
    }, {
      "featureType": "road.local",
      "elementType": "geometry",
      "stylers": [{
        "color": "#ffffff"
      }, {
        "lightness": 16
      }]
    }, {
      "featureType": "poi",
      "elementType": "geometry",
      "stylers": [{
        "color": "#f5f5f5"
      }, {
        "lightness": 21
      }]
    }, {
      "featureType": "poi.park",
      "elementType": "geometry",
      "stylers": [{
        "color": "#dedede"
      }, {
        "lightness": 21
      }]
    }, {
      "elementType": "labels.text.stroke",
      "stylers": [{
        "visibility": "on"
      }, {
        "color": "#ffffff"
      }, {
        "lightness": 16
      }]
    }, {
      "elementType": "labels.text.fill",
      "stylers": [{
        "saturation": 36
      }, {
        "color": "#333333"
      }, {
        "lightness": 40
      }]
    }, {
      "elementType": "labels.icon",
      "stylers": [{
        "visibility": "off"
      }]
    }, {
      "featureType": "transit",
      "elementType": "geometry",
      "stylers": [{
        "color": "#f2f2f2"
      }, {
        "lightness": 19
      }]
    }, {
      "featureType": "administrative",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#fefefe"
      }, {
        "lightness": 20
      }]
    }, {
      "featureType": "administrative",
      "elementType": "geometry.stroke",
      "stylers": [{
        "color": "#fefefe"
      }, {
        "lightness": 17
      }, {
        "weight": 1.2
      }]
    }];
  }
};
MapsHandler.init();

/***/ }),

/***/ "./resources/js/components/overlayMenuHandler.js":
/*!*******************************************************!*\
  !*** ./resources/js/components/overlayMenuHandler.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* ==========================================================================
   Navigation handler
   - Handles the showing and hiding of the overlay-menu component which has the proper classes.
 ========================================================================== */
var bodyScrollLock = __webpack_require__(/*! body-scroll-lock */ "./node_modules/body-scroll-lock/lib/bodyScrollLock.min.js");

var OverlayMenuHandler = {
  // init: function () {
  //     const overlayMenuTrigger = document.querySelector('.js-overlay-menu-trigger');
  //     OverlayMenuHandler.initOverlayMenu(overlayMenuTrigger);
  // },
  init: function init() {
    var overlayMenuTriggerList = document.querySelectorAll('.js-overlay-menu-trigger');
    var overlayMenuTriggerListCount = overlayMenuTriggerList.length;

    if (isset(overlayMenuTriggerList) && overlayMenuTriggerListCount !== 0) {
      for (var i = 0; i < overlayMenuTriggerListCount; i++) {
        var overlayMenuTrigger = overlayMenuTriggerList[i];
        OverlayMenuHandler.initOverlayMenu(overlayMenuTrigger);
      }
    }
  },
  initOverlayMenu: function initOverlayMenu(overlayMenuTrigger) {
    overlayMenuTrigger.addEventListener('click', OverlayMenuHandler.toggleOverlayMenu, false);
  },
  toggleOverlayMenu: function toggleOverlayMenu(event) {
    var overlayMenuNav = document.querySelector('.js-overlay-menu'); // const overlayMenuBody = overlayMenu.querySelector('.js-overlay-menu-persist-scrolling');
    // Bail if overlayMenu doesn't exist

    if (!overlayMenuNav) return; // Clear previously locked scroll on the body

    bodyScrollLock.enableBodyScroll(overlayMenuNav); // If the overlayMenu is already active, collapse it and quit

    if (document.body.classList.contains('is-overlay-menu-active')) {
      overlayMenuNav.querySelectorAll('[tabindex="0"]').forEach(function (elem) {
        elem.tabIndex = -1;
      });
      document.body.classList.remove('is-overlay-menu-active');
      return;
    } // Lock scrolling on the body


    bodyScrollLock.disableBodyScroll(overlayMenuNav);
    overlayMenuNav.querySelectorAll('[tabindex="-1"]').forEach(function (elem) {
      elem.tabIndex = 0;
    }); // Toggle active overlayMenu by setting a class on the body

    document.body.classList.toggle('is-overlay-menu-active');
    overlayMenuNav.hidden = false;
  }
};
OverlayMenuHandler.init();

/***/ }),

/***/ "./resources/js/components/scrollToHandler.js":
/*!****************************************************!*\
  !*** ./resources/js/components/scrollToHandler.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
    Scroll To Click handler
 ========================================================================== */
var ScrollToHandler = {
  // Animation settings
  offset: 60,
  //pixel
  duration: 1400,
  //ms
  // Animation variables
  body: null,
  start: 0,
  change: 0,
  currentTime: 0,
  allowAnimation: false,
  scrollToAnimation: null,
  // Watch the EasingFunction helper for the available methods
  easing: 'easeInOutQuad',
  init: function init() {
    var anchorLinks = document.querySelectorAll('.js-scroll-to-target');
    var anchorLinksAmount = anchorLinks.length;

    for (var i = 0; i < anchorLinksAmount; i++) {
      var anchorLink = anchorLinks[i];
      anchorLink.addEventListener('click', function (event) {
        ScrollToHandler.prepareScrollTo(this.getAttribute('href'));
        event.preventDefault();
      });
    }
  },

  /**
   * Prepare the Handler for the animation
   */
  prepareScrollTo: function prepareScrollTo(elementId) {
    // Get the scroll to element
    elementId = elementId.substr(elementId.indexOf('#') + 1);
    var scrollToElement = document.getElementById(elementId);
    if (scrollToElement == null) return;
    var scrollToElementPosition = scrollToElement.getBoundingClientRect(); // Reset or define the Handler variables

    ScrollToHandler.body = document.documentElement;
    ScrollToHandler.start = Math.max(ScrollToHandler.body.scrollTop, document.body.scrollTop, window.pageYOffset); //Use Math.max because safari doesn't support document.documentElement.scrollTop

    ScrollToHandler.change = scrollToElementPosition.top + ScrollToHandler.start - ScrollToHandler.start - ScrollToHandler.offset;
    ScrollToHandler.startTime = 'now' in window.performance ? performance.now() : new Date().getTime();
    ScrollToHandler.allowAnimation = true; // Trigger animation

    scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll); // Stop on scroll

    window.addEventListener('mousedown', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('wheel', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('DOMMouseScroll', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('mousewheel', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('keyup', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('touchmove', ScrollToHandler.abortScrollAnimation);
  },

  /*
   * Animate the scroll position
   */
  animateScroll: function animateScroll(timestamp) {
    // Calculate progress from 0 - 1
    var progress = Math.min(1, (timestamp - ScrollToHandler.startTime) / ScrollToHandler.duration);
    if (progress < 0) progress = 0; // Convert progress with easing function

    progress = EasingFunctions[ScrollToHandler.easing](progress);
    var newScrollTop = ScrollToHandler.start + ScrollToHandler.change * progress;
    ScrollToHandler.body.scrollTop = newScrollTop;
    if (ScrollToHandler.body.scrollTop === 0) document.body.scrollTop = newScrollTop; // Safari doesn't support so if ScrollToHandler.body.scrollTop is 0 force the scroll position through document.body.scrollTop

    if (progress < 1 && ScrollToHandler.allowAnimation) {
      scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll);
    }
  },

  /*
   * Abort the scroll animation
   */
  abortScrollAnimation: function abortScrollAnimation(event) {
    ScrollToHandler.allowAnimation = false;
    cancelAnimationFrame(ScrollToHandler.scrollToAnimation);
  }
};
ScrollToHandler.init();

/***/ }),

/***/ "./resources/js/components/sliderHandler.js":
/*!**************************************************!*\
  !*** ./resources/js/components/sliderHandler.js ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* Example

const headerImageSliderSetting = new SliderProjectorSetting({
    sliderProjectorId: 'header-image-slider',
    slideQuery: '#header-image-slider .placeholder figure',
    dots: '#header-image-slider .slider-navigation-labels .navigation span',
    autoSlider: true,
    sliderInterval: 4000
});
headerImageSliderSetting = headerImageSliderSetting.prepareParameters();

const headerImageSlider = new SliderProjector(headerImageSliderSetting).init();

 */
var Sliders = [];
var sliderContainers = document.querySelectorAll('.js-slider');
var sliderContainersLength = sliderContainers.length;

for (var i = 0; i < sliderContainersLength; i++) {
  var slider = sliderContainers[i];
  var sliderId = slider.getAttribute('id');

  if (sliderId !== null) {
    var Slidersetting = new SliderSetting({
      sliderId: sliderId,
      autoSlider: slider.getAttribute('data-auto-slide'),
      slideQuery: '#' + sliderId + ' .js-slider-slide',
      navigationButtons: '#' + sliderId + ' .js-slider-button',
      dots: '#' + sliderId + ' .js-slider-indicator'
    });
    Sliders.push(new Slider(Slidersetting.prepareParameters()).init());
  } else console.log('An image slider has no id...');
}

function SliderSetting(settingsObject) {
  var self = this;
  this.sliderId = '';
  this.autoSlider = false;
  this.sliderInterval = 4000;
  this.navigationButtons = '';
  this.dots = '';
  this.slideQuery = '';

  this.setSliderId = function (string) {
    this.sliderId = string;
    return this;
  };

  this.setAutoSlider = function (_boolean) {
    this.autoSlider = _boolean;
    return this;
  };

  this.setSliderInterval = function (integer) {
    this.sliderInterval = integer;
    return this;
  };

  this.setSlideQuery = function (string) {
    this.slideQuery = string;
    return this;
  };

  this.setNavigationButtons = function (string) {
    this.navigationButtons = string;
    return this;
  };

  this.setDots = function (string) {
    this.dots = string;
    return this;
  };

  this.getSliderId = function () {
    return this.sliderId;
  };

  this.getAutoSlider = function () {
    var autoSlide = this.autoSlider;

    if (!Number.isInteger(autoSlide)) {
      if (autoSlide == false) autoSlide = false;else autoSlide = true;
    }

    return autoSlide;
  };

  this.getSliderInterval = function () {
    return this.sliderInterval;
  };

  this.getSlideQuery = function () {
    return this.slideQuery;
  };

  this.getNavigationButtons = function () {
    return this.navigationButtons;
  };

  this.getDots = function () {
    return this.dots;
  }; // Invert setters to getters


  this.prepareParameters = function () {
    return {
      sliderId: self.getSliderId(),
      autoSlider: self.getAutoSlider(),
      sliderInterval: self.getSliderInterval(),
      navigationButtons: self.getNavigationButtons(),
      dots: self.getDots(),
      slideQuery: self.getSlideQuery()
    };
  }; // Mass assign settings


  this.fill = function () {
    // Object.keys(settingsObject).forEach(function (key) {
    //     self[key] = settingsObject[key];
    // });
    var settingsObjectKeys = Object.keys(settingsObject);
    var settingsObjectLength = settingsObjectKeys.length;

    for (var _i = 0; _i < settingsObjectLength; _i++) {
      var key = settingsObjectKeys[_i];
      self[key] = settingsObject[key];
    }
  };

  this.fill();
  return {
    sliderId: self.setSliderId,
    autoSlider: self.setAutoSlider,
    sliderInterval: self.setSliderInterval,
    navigationButtons: self.setNavigationButtons,
    dots: self.setDots,
    slideQuery: self.setSlideQuery,
    prepareParameters: self.prepareParameters
  };
}

function Slider(settings) {
  //Define Slider object
  var self = this;
  this.sliderObject = ''; //SlideParameters

  this.activeSlideId = 0;
  this.previousSlideId = 0;
  this.nextSlideId = 0;
  this.availableSlides = 1;
  this.slides = [];
  this.autoSliderInterval = null;
  this.settings = {};

  this.init = function () {
    //Append settings to self
    this.settings = settings; //Assign needed elements and calculations

    this.sliderObject = document.getElementById(this.settings.sliderId);
    this.slides = document.querySelectorAll(this.settings.slideQuery);
    this.availableSlides = this.slides.length;
    this.activeSlideId = 0; // Set active slide (and possible previous and next classes)

    this.setSlide(); // Swipe interaction

    var swipeGestures = new Hammer(this.sliderObject);
    swipeGestures.on('swipeleft', function () {
      self.resetAutoSlider();
      self.nextSlide();
      self.setSlide();
    });
    swipeGestures.on('swiperight', function () {
      self.resetAutoSlider();
      self.previousSlide();
      self.setSlide();
    });

    if (this.settings.navigationButtons !== '') {
      // Click interaction
      var navigationButtons = document.querySelectorAll(this.settings.navigationButtons);
      var navigationButtonsLength = navigationButtons.length;

      for (var _i2 = 0; _i2 < navigationButtonsLength; _i2++) {
        var navigationButton = navigationButtons[_i2];
        navigationButton.addEventListener('click', function () {
          self.clickNavigationButton(this);
        });
      }
    }

    if (this.settings.dots !== '') {
      // Click interaction
      var dots = document.querySelectorAll(this.settings.dots);
      var dotsLength = dots.length; // console.log(this.settings.dots);
      // console.log(dots);

      for (var _i3 = 0; _i3 < dotsLength; _i3++) {
        var dot = dots[_i3];
        dot.addEventListener('click', function () {
          self.clickDot(this);
        });
      }
    }

    self.autoSlider();
  };

  this.autoSlider = function () {
    // Reset the interval if defined
    if (this.autoSliderInterval !== null) clearInterval(this.autoSliderInterval); // Check if should auto slide before creating the interval
    // We do this inhere, because the autoslide function is also called by other functionality

    if (this.settings.autoSlider !== false && Number.isInteger(this.settings.sliderInterval)) {
      this.autoSliderInterval = setInterval(function () {
        self.nextSlide();
        self.setSlide();
      }, this.settings.sliderInterval);
    }
  };

  this.resetAutoSlider = self.autoSlider;

  this.nextSlide = function () {
    this.activeSlideId++;
    if (this.activeSlideId >= this.availableSlides) this.activeSlideId = 0;
  };

  this.previousSlide = function () {
    this.activeSlideId--;
    if (this.activeSlideId < 0) this.activeSlideId = this.availableSlides - 1;
  };

  this.setSlide = function () {
    // Loop through the form elements
    var slidesLength = self.slides.length;

    for (var _i4 = 0; _i4 < slidesLength; _i4++) {
      var slide = self.slides[_i4];
      slide.style.pointerEvents = "none"; // Needed for swipe functionality
      // Convert data set attribute to desired type

      var slideOrder = parseInt(slide.getAttribute('data-order')); // Remove and set active for all slides

      if (slideOrder !== self.activeSlideId) slide.classList.remove('is-active');else slide.classList.add('is-active');
    }

    if (self.settings.dots !== '') {
      self.setActiveDot();
    }
  };

  this.clickNavigationButton = function (navButton) {
    var navButtonDirection = navButton.getAttribute('aria-label');
    if (navButtonDirection === 'next') this.nextSlide();else if (navButtonDirection === 'previous') this.previousSlide();
    self.setSlide();
    self.resetAutoSlider();
  };

  this.clickDot = function (clickedDot) {
    self.activeSlideId = parseInt(clickedDot.getAttribute('data-order'));
    self.setSlide();
    self.resetAutoSlider();
  };

  this.setActiveDot = function () {
    var dots = document.querySelectorAll(this.settings.dots);
    var dotsLength = dots.length;

    for (var _i5 = 0; _i5 < dotsLength; _i5++) {
      var dot = dots[_i5];
      dotOrder = parseInt(dot.getAttribute('data-order'));

      if (dotOrder !== self.activeSlideId) {
        dot.classList.remove('is-active');
        dot.tabIndex = 0;
      } else {
        dot.classList.add('is-active');
        dot.tabIndex = -1;
      }
    }
  };
}

/***/ }),

/***/ "./resources/js/components/tabsHandler.js":
/*!************************************************!*\
  !*** ./resources/js/components/tabsHandler.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
   Tabs handler
   - Handles the tabs component which has the proper classes.
 ========================================================================== */
var TabsHandler = {
  tabsList: null,
  tabs: null,
  init: function init() {
    TabsHandler.tabsList = document.querySelectorAll('.js-tabs');
    var tabsListCount = TabsHandler.tabsList.length;

    if (isset(TabsHandler.tabsList) && tabsListCount !== 0) {
      for (var i = 0; i < tabsListCount; i++) {
        var _tabs = TabsHandler.tabsList[i];
        TabsHandler.initTabs(_tabs);
      }
    }
  },
  initTabs: function initTabs(tabs) {
    var container = tabs.querySelector('.js-tabs-container'); // Check if container element exists

    if (container == null) {
      console.error("There is no container for the content tabs defined.");
      return;
    }

    var triggers = tabs.querySelectorAll('.js-tabs-trigger');
    var tabsContent = container.querySelectorAll('.js-tabs-content'); // Check if number of triggers and tabs match

    if (triggers.length !== tabs.length) {
      console.error("There are ".concat(triggers.length, " trigger buttons and ").concat(tabs.length, " tabs. These must match."));
    }

    tabs.addEventListener('click', function (event) {
      // Check if clicked on a step button (prev or next)
      if (event.target.closest('.js-tabs-step')) {
        var dir = event.target.closest('.js-tabs-step').getAttribute('data-step');
        TabsHandler.stepTabs(dir, triggers, tabsContent);
      } // Bail if we didn't click on the trigger element


      if (!event.target.classList.contains('js-tabs-trigger')) return; // Bail if already active

      if (event.target.classList.contains('is-active')) {
        return;
      }

      TabsHandler.toggleTabs(event.target.dataset.tabId, triggers, tabsContent);
    });
  },
  toggleTabs: function toggleTabs(tabId, triggers, tabsContent) {
    if (isset(triggers) && triggers.length > 0) {
      // Loop through all tabs
      for (var i = 0; i < triggers.length; i++) {
        var tabsTab = tabsContent[i];
        var tabsTrigger = triggers[i];
        tabsTrigger.classList.remove('is-active');
        tabsTrigger.tabIndex = 0;
        tabsTab.classList.remove('is-active');

        if (tabsTab.dataset.tabId === tabId) {
          tabsTrigger.classList.add('is-active');
          tabsTrigger.tabIndex = -1;
          tabsTab.classList.add('is-active');
        }
      }
    }
  },
  stepTabs: function stepTabs(dir, triggers, tabsContent) {
    var triggerCount = triggers.length;
    var activeId = 1;
    var newId = 0;

    if (isset(triggers) && triggerCount > 0) {
      // Loop through all tabs
      for (var i = 0; i < triggerCount; i++) {
        var tabsTab = tabsContent[i];
        var tabsTrigger = triggers[i]; // Set activeId

        if (tabsTab.classList.contains('is-active')) {
          activeId = Number(tabsTab.getAttribute('data-tab-id'));
        } // Check what next Id will be


        if (dir === 'next') {
          if (activeId === triggerCount) {
            newId = 0;
          } else {
            newId = activeId;
          }
        } else if (dir === 'prev') {
          if (activeId === 1) {
            newId = triggerCount - 1;
          } else {
            newId = activeId - 2;
          }
        } // Remove active class


        tabsTrigger.tabIndex = 0;
        tabsTab.classList.remove('is-active');
        tabsTrigger.classList.remove('is-active');
      }

      triggers[newId].tabIndex = -1;
      triggers[newId].classList.add('is-active');
      tabs[newId].classList.add('is-active');
    }
  }
};
TabsHandler.init();

/***/ }),

/***/ "./resources/js/components/youtubeHandler.js":
/*!***************************************************!*\
  !*** ./resources/js/components/youtubeHandler.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
    Youtube handler
 ========================================================================== */
var YoutubeHandler = {
  youtubeClass: '.js-youtube-player',
  players: [],
  init: function init() {
    // Get the youtube players containers
    var youtubePlayers = document.querySelectorAll(YoutubeHandler.youtubeClass);
    var youtubePlayersAmount = youtubePlayers.length;

    for (var i = 0; i < youtubePlayersAmount; i++) {
      var youtubePlayer = youtubePlayers[i];
      var youtubePlayerId = youtubePlayer.getAttribute('id');

      if (youtubePlayerId !== null) {
        // Strip the necessary data from the html and create objects from it
        var youtubeElement = {
          id: youtubePlayer.getAttribute('id'),
          link: youtubePlayer.getAttribute('data-youtube-link'),
          autoPlay: parseInt(youtubePlayer.getAttribute('data-auto-play'))
        };
        YoutubeHandler.players.push(youtubeElement);
      } else {
        console.log("Element not include because there isn't a id on the player");
        console.log(youtubePlayer);
      }
    }

    if (youtubePlayersAmount >= 1) YoutubeHandler.initYoutube();
  },

  /**
   * Check if external script is loaded
   *
   */
  initYoutube: function initYoutube() {
    // See if YT variable exists
    if (typeof YT == 'undefined' || typeof YT.Player == 'undefined') {
      // Setup API ready function
      window.onYouTubePlayerAPIReady = function () {
        YoutubeHandler.loadPlayers();
      }; // Load external script


      getScript('https://www.youtube.com/iframe_api'); // If YT already exists load player
    } else {
      YoutubeHandler.loadPlayers();
    }
  },

  /**
   * Create the Youtube player(s) with parameters
   * And rewrite the players to key them by the element id
   *
   */
  loadPlayers: function loadPlayers() {
    var players = [];
    var youtubePlayersAmount = YoutubeHandler.players.length;

    for (var i = 0; i < youtubePlayersAmount; i++) {
      var youtubePlayer = YoutubeHandler.players[i]; // Load player

      youtubePlayer.player = new YT.Player(youtubePlayer.id, {
        height: 200,
        width: 200,
        videoId: youtubePlayer.link,
        host: 'https://www.youtube-nocookie.com',
        playerVars: {
          modestbranding: 0,
          rel: 0,
          disablekb: 1,
          autoplay: youtubePlayer.autoPlay
        },
        events: {
          // 'onReady': YoutubeHandler.onReady,
          'onStateChange': YoutubeHandler.onStateChange
        }
      });
      players[youtubePlayer.id] = youtubePlayer;
    }

    YoutubeHandler.players = players;
  },

  /**
   * When player is ready to play
   */
  onReady: function onReady(event) {
    var playerContainerId = event.target.getIframe().getAttribute('id');
    var player = YoutubeHandler.players[playerContainerId].player; // Show video
    // setTimeout(function(){ $('#' + playerContainerId).stop().animate({ opacity: 1 },1000) },800);
    // If not on tablet or mobile, play on high quality
    // player.mute();
    // player.playVideo();
    // player.setPlaybackQuality('hd1080');
  },

  /**
   * Listener for Youtube state change
   */
  onStateChange: function onStateChange(event) {
    var playerContainerId = event.target.getIframe().getAttribute('id');
    var player = YoutubeHandler.players[playerContainerId].player;
    var videoState = event.data; // Loop video

    if (event.data === YT.PlayerState.ENDED) {
      player.playVideo();
    }
  }
};
YoutubeHandler.init();

/***/ }),

/***/ "./resources/js/global/browserHandler.js":
/*!***********************************************!*\
  !*** ./resources/js/global/browserHandler.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
   Browser Handler
 ========================================================================== */
var BrowserHandler = {
  userAgent: '',
  browserInfo: '',
  init: function init() {
    BrowserHandler.userAgent = window.navigator.userAgent;
    BrowserHandler.browserInfo = BrowserHandler.getBrowserInfo();
    BrowserHandler.handleIE();
    BrowserHandler.handleSafari();
  },
  handleIE: function handleIE() {
    // Detect versions below ie11
    var msie = BrowserHandler.userAgent.indexOf('MSIE ');
    var ielt11 = msie > 0; // Detect ie11

    var ie11 = !!navigator.userAgent.match(/Trident.*rv\:11\./); // If Internet Explorer

    if (ielt11 || ie11) {
      // Default version
      var version = '11'; // Way to detect version < 11

      if (ielt11) version = parseInt(BrowserHandler.userAgent.substring(msie + 5, BrowserHandler.userAgent.indexOf(".", msie))); // Append classes to HTML (we have to do this separately because else ie will fail)

      document.body.classList.add('ie');
      document.body.classList.add('v' + version);
    }
  },
  // Fallback for older safari version
  handleSafari: function handleSafari() {
    if (BrowserHandler.browserInfo.name === 'Safari' && BrowserHandler.browserInfo.version <= 10) {
      document.getElementsByTagName('html')[0].classList.add('ie');
    }
  },
  getBrowserInfo: function getBrowserInfo() {
    var ua = navigator.userAgent,
        tem,
        M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];

    if (/trident/i.test(M[1])) {
      tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
      return {
        name: 'IE ',
        version: tem[1] || ''
      };
    }

    if (M[1] === 'Chrome') {
      tem = ua.match(/\bOPR\/(\d+)/);

      if (tem != null) {
        return {
          name: 'Opera',
          version: tem[1]
        };
      }
    }

    M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];

    if ((tem = ua.match(/version\/(\d+)/i)) != null) {
      M.splice(1, 1, tem[1]);
    }

    return {
      name: M[0],
      version: M[1]
    };
  }
};
BrowserHandler.init();

/***/ }),

/***/ "./resources/js/global/helpers.js":
/*!****************************************!*\
  !*** ./resources/js/global/helpers.js ***!
  \****************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
    Helper functions
 ========================================================================== */

/*
 * Simple isset method for this does not exist in javascript
 */
window.isset = function (obj) {
  return typeof obj !== 'undefined' && obj !== null;
};
/*
 * Easing Functions - inspired from http://gizma.com/easing/
 * only considering the t value for the range [0, 1] => [0, 1]
 */


window.EasingFunctions = {
  // no easing, no acceleration
  linear: function linear(t) {
    return t;
  },
  // accelerating from zero velocity
  easeInQuad: function easeInQuad(t) {
    return t * t;
  },
  // decelerating to zero velocity
  easeOutQuad: function easeOutQuad(t) {
    return t * (2 - t);
  },
  // acceleration until halfway, then deceleration
  easeInOutQuad: function easeInOutQuad(t) {
    return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
  },
  // accelerating from zero velocity
  easeInCubic: function easeInCubic(t) {
    return t * t * t;
  },
  // decelerating to zero velocity
  easeOutCubic: function easeOutCubic(t) {
    return --t * t * t + 1;
  },
  // acceleration until halfway, then deceleration
  easeInOutCubic: function easeInOutCubic(t) {
    return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;
  },
  // accelerating from zero velocity
  easeInQuart: function easeInQuart(t) {
    return t * t * t * t;
  },
  // decelerating to zero velocity
  easeOutQuart: function easeOutQuart(t) {
    return 1 - --t * t * t * t;
  },
  // acceleration until halfway, then deceleration
  easeInOutQuart: function easeInOutQuart(t) {
    return t < .5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;
  },
  // accelerating from zero velocity
  easeInQuint: function easeInQuint(t) {
    return t * t * t * t * t;
  },
  // decelerating to zero velocity
  easeOutQuint: function easeOutQuint(t) {
    return 1 + --t * t * t * t * t;
  },
  // acceleration until halfway, then deceleration
  easeInOutQuint: function easeInOutQuint(t) {
    return t < .5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t;
  }
};
/*
 * Vanilla version of the $.getScript
 */

window.getScript = function (source, callback) {
  var script = document.createElement('script');
  script.async = 1;
  window.scripts = document.getElementsByTagName('script');
  var prior = scripts[scripts.length - 1];

  script.onload = script.onreadystatechange = function (_, isAbort) {
    if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {
      script.onload = script.onreadystatechange = null;
      script = undefined;

      if (!isAbort) {
        if (callback) callback();
      }
    }
  };

  script.src = source;
  prior.parentNode.insertBefore(script, prior);
};
/**
 * Returns a function, that, as long as it continues to be invoked, will not
 * be triggered. The function will be called after it stops being called for
 * N milliseconds. If `immediate` is passed, trigger the function on the
 * leading edge, instead of the trailing.
 * @param func
 * @param wait
 * @param immediate
 * @returns {Function}
 */


window.debounce = function (func, wait, immediate) {
  var timeout;
  return function () {
    var context = this,
        args = arguments;

    var later = function later() {
      timeout = null;
      if (!immediate) func.apply(context, args);
    };

    var callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
    if (callNow) func.apply(context, args);
  };
};
/*
 * Cookie helper class
 */


window.Cookie = {
  set: function set(name, value, days) {
    var domain, domainParts, date, expires, host;

    if (days) {
      date = new Date();
      date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
      expires = "; expires=" + date.toGMTString();
    } else {
      expires = "";
    }

    host = location.host;

    if (isIPOrLocalHost(location.hostname)) {
      document.cookie = name + "=" + value + expires + "; path=/";
    } else {
      // Remember the cookie on all sub domains.
      //
      // Start with trying to set cookie to the top domain.
      // (example: if user is on foo.com, try to set
      //  cookie to domain ".com")
      //
      // If the cookie will not be set, it means ".com"
      // is a top level domain and we need to
      // set the cookie to ".foo.com"
      domainParts = host.split('.');
      domainParts.shift();
      domain = '.' + domainParts.join('.'); // For development purpose, remove this when moving to production
      // domain = '.komma.pro';

      document.cookie = name + "=" + value + expires + "; path=/; domain=" + domain; // check if cookie was successfuly set to the given domain
      // (otherwise it was a Top-Level Domain)

      if (Cookie.get(name) == null || Cookie.get(name) != value) {
        // append "." to current domain
        domain = '.' + host;
        document.cookie = name + "=" + value + expires + "; path=/; domain=" + domain;
      }
    }
  },
  get: function get(name) {
    window.nameEQ = name + "=";
    window.ca = document.cookie.split(';');

    for (var i = 0; i < ca.length; i++) {
      var c = ca[i];

      while (c.charAt(0) === ' ') {
        c = c.substring(1, c.length);
      }

      if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
    }

    return null;
  },
  erase: function erase(name) {
    Cookie.set(name, '', -1);
  }
};

window.isIPOrLocalHost = function (value) {
  return isIpAddress(value) || value === 'localhost';
};

window.isIpAddress = function (ipaddress) {
  return /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(ipaddress);
};
/*
 * Javascript version of the number_format method of PHP
 */


window.number_format = function (number, decimals, dec_point, thousands_sep) {
  // Strip all characters but numerical ones.
  number = (number + '').replace(/[^0-9+\-Ee.]/g, '');

  var n = !isFinite(+number) ? 0 : +number,
      prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
      sep = typeof thousands_sep === 'undefined' ? ',' : thousands_sep,
      dec = typeof dec_point === 'undefined' ? '.' : dec_point,
      s = '',
      toFixedFix = function toFixedFix(n, prec) {
    var k = Math.pow(10, prec);
    return '' + Math.round(n * k) / k;
  }; // Fix for IE parseFloat(0.55).toFixed(0) = 0;


  s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');

  if (s[0].length > 3) {
    s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
  }

  if ((s[1] || '').length < prec) {
    s[1] = s[1] || '';
    s[1] += new Array(prec - s[1].length + 1).join('0');
  }

  return s.join(dec);
};
/**
 * Element.closest() polyfill
 * https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill
 */


if (!Element.prototype.closest) {
  if (!Element.prototype.matches) {
    Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
  }

  Element.prototype.closest = function (s) {
    var el = this;
    var ancestor = this;
    if (!document.documentElement.contains(el)) return null;

    do {
      if (ancestor.matches(s)) return ancestor;
      ancestor = ancestor.parentElement;
    } while (ancestor !== null);

    return null;
  };
}

window.Ajax = {
  //TODO: Can we create a prepare request function ??
  get: function get(url, callback) {
    var xhr = new XMLHttpRequest();
    var token = document.querySelector('meta[name="csrf-token"]').content;
    xhr.open('get', url, true);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.setRequestHeader('X-CSRF-TOKEN', token);
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

    xhr.onreadystatechange = function () {
      if (xhr.readyState === 4) {
        callback(xhr);
      }
    };

    xhr.send();
  },
  post: function post(url, data, callback) {
    var xhr = new XMLHttpRequest();
    var token = document.querySelector('meta[name="csrf-token"]').content;
    xhr.open('post', url, true);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.setRequestHeader('X-CSRF-TOKEN', token);
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

    xhr.onreadystatechange = function () {
      if (xhr.readyState === 4) {
        callback(xhr);
      }
    };

    xhr.send(JSON.stringify(data));
  }
};
/**
 * Capitalize the first letter of the string
 * @param string
 * @returns {string}
 */

window.capitalizeFirstLetter = function (string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
};
/**
 * Convert snake case into camelcase
 *
 * @param string
 * @returns {*}
 */


function snakeToCamel(string) {
  return string.replace(/(\-\w)/g, function (m) {
    return m[1].toUpperCase();
  });
}
/**
 * Get the index of an element inside its parent
 */


function indexInParent(node) {
  window.children = node.parentNode.childNodes;
  var num = 0;

  for (var i = 0; i < children.length; i++) {
    if (children[i] == node) return num;
    if (children[i].nodeType == 1) num++;
  }

  return -1;
}
/**
 * For security reasons iOS Safari only allows document.execCommand('copy') for text within a contentEditable container.
 * The workaround is to detect iOS Safari and quickly toggle contentEditable before executing document.execCommand('copy').
 * Wheb input or textarea is READONLY you can prevent the unwanted popup with copy/paste functions and the input keyboard
 * Code from: https://stackoverflow.com/a/46981847
 */


function copyToClipboard(el) {
  // resolve the element
  el = typeof el === 'string' ? document.querySelector(el) : el; // handle iOS as a special case

  if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {
    // save current contentEditable/readOnly status
    window.editable = el.contentEditable;
    window.readOnly = el.readOnly; // convert to editable with readonly to stop iOS keyboard opening

    el.contentEditable = true;
    el.readOnly = true; // create a selectable range

    var range = document.createRange();
    range.selectNodeContents(el); // select the range

    window.selection = window.getSelection();
    selection.removeAllRanges();
    selection.addRange(range);
    el.setSelectionRange(0, 999999); // restore contentEditable/readOnly to original state

    el.contentEditable = editable;
    el.readOnly = readOnly;
  } else {
    el.select();
  } // execute copy command


  document.execCommand('copy');
}

/***/ }),

/***/ "./resources/js/global/scrollHandler.js":
/*!**********************************************!*\
  !*** ./resources/js/global/scrollHandler.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
   Scroll handler
   - Handler the objects which are bind on scroll events or visible in viewport
 ========================================================================== */
var ScrollHandler = {
  // Variables for debounce and throttle effects
  time: Date.now(),
  timeout: null,
  waitThrottle: 1000,
  waitDebounce: 300,
  // Variables for scroll direction
  lastScrollTopPosition: 0,
  scrollDirectionDown: true,
  scrollDirectionUp: false,
  //Initialisation
  init: function init() {
    // Trigger start on start up
    ScrollHandler.triggerOnInit(); // Throttle scroll

    window.addEventListener('scroll', function () {
      if (ScrollHandler.time + ScrollHandler.waitThrottle - Date.now() < 0) {
        ScrollHandler.triggerThrottle();
        ScrollHandler.time = Date.now();
      }
    }); // Smooth scroll

    window.addEventListener('scroll', function () {
      ScrollHandler.triggerSmooth();
    }); // Debounce scroll

    window.addEventListener('scroll', function () {
      if (isset(ScrollHandler.timeout)) clearTimeout(ScrollHandler.timeout);
      ScrollHandler.timeout = setTimeout(ScrollHandler.triggerDebounce, ScrollHandler.waitDebounce);
    });
  },
  // Trigger on start up
  triggerOnInit: function triggerOnInit() {
    ScrollHandler.triggerElementInViewportAnimation();
  },
  // Trigger scroll functions with throttle (preferred)
  triggerThrottle: function triggerThrottle() {
    // console.log('Throttled scroll');
    ScrollHandler.triggerElementInViewportAnimation();
  },
  // Trigger scroll on debounce
  triggerDebounce: function triggerDebounce() {// console.log('Debounce scroll');
  },
  // Trigger scroll on the flight
  triggerSmooth: function triggerSmooth() {
    // console.log('Smooth scroll');
    ScrollHandler.detectScrollDirection();
    ScrollHandler.toggleStickyHeader();
  },
  // Detect if part of a given element is visible in the viewport
  // El must be a node element
  detectIfElementIsPartlyInViewport: function detectIfElementIsPartlyInViewport(el) {
    if (isset(el)) {
      var rect = el.getBoundingClientRect(); // DOMRect { x: 8, y: 8, width: 100, height: 100, top: 8, right: 108, bottom: 108, left: 8 }

      var windowHeight = window.innerHeight || document.documentElement.clientHeight;
      var windowWidth = window.innerWidth || document.documentElement.clientWidth;
      var verticalInView = rect.top <= windowHeight && rect.top + rect.height >= 0;
      var horizontalInView = rect.left <= windowWidth && rect.left + rect.width >= 0;
      return verticalInView && horizontalInView;
    }
  },
  // Detect if a given element is fully visible in the viewport
  // El must be a node element
  detectIfElementIsFullyInViewport: function detectIfElementIsFullyInViewport(el) {
    if (isset(el)) {
      var rect = el.getBoundingClientRect();
      return rect.top >= 0 && rect.bottom <= window.innerHeight;
    }
  },
  detectScrollDirection: function detectScrollDirection() {
    var scrollTopPosition = window.pageYOffset || document.documentElement.scrollTop; // Credits: "https://github.com/qeremy/so/blob/master/so.dom.js#L426"

    if (scrollTopPosition >= ScrollHandler.lastScrollTopPosition) {
      ScrollHandler.scrollDirectionDown = true;
      ScrollHandler.scrollDirectionUp = false;
    } else {
      ScrollHandler.scrollDirectionDown = false;
      ScrollHandler.scrollDirectionUp = true;
    }

    ScrollHandler.lastScrollTopPosition = scrollTopPosition;
  },
  // Trigger animation on elements that have 'element-in-viewport' and that are in the viewport
  // These animation can only be triggered once, if you want more then that you should write an specific function for this
  triggerElementInViewportAnimation: function triggerElementInViewportAnimation() {
    var elements = document.querySelectorAll('.element-in-viewport');
    var elementsLength = elements.length;

    for (var e = 0; e < elementsLength; e++) {
      var element = elements[e];

      if (ScrollHandler.detectIfElementIsPartlyInViewport(element)) {
        element.classList.remove('element-in-viewport');
      }
    }
  },
  // ------------------------------ CUSTOM SCROLL HANDLERS ------------------------------------
  // Hide or show sticky navigation when header isn't visible
  toggleStickyHeader: function toggleStickyHeader() {
    var stickyHeader = document.querySelector('.js-sticky-header');
    var visibleStickyHeaderClass = 'is-sticky-header-visible';
    var subnavList = document.querySelectorAll('.js-subnav');
    var subNavIsVisible = false;
    if (stickyHeader) stickyHeader.hidden = false;

    for (var i = 0; i < subnavList.length; i++) {
      if (window.getComputedStyle(subnavList[i], null).visibility == "visible") {
        return subNavIsVisible = true;
      }
    }

    if (isset(stickyHeader) && !subNavIsVisible) {
      // Hide when scrolling DOWN (OR within offset)
      if (ScrollHandler.scrollDirectionDown || ScrollHandler.lastScrollTopPosition < 110) {
        document.body.classList.remove(visibleStickyHeaderClass);
      } // Show when scrolling UP and outside of offset
      else {
          document.body.classList.add(visibleStickyHeaderClass);
        }
    }
  }
};
ScrollHandler.init();

/***/ }),

/***/ "./resources/sass/style.scss":
/*!***********************************!*\
  !*** ./resources/sass/style.scss ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports) {

// removed by extract-text-webpack-plugin

/***/ }),

/***/ 0:
/*!***************************************************************!*\
  !*** multi ./resources/js/app.js ./resources/sass/style.scss ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

__webpack_require__(/*! /Users/julesgraus/webDevelopment/Boilerplate-Base/resources/js/app.js */"./resources/js/app.js");
module.exports = __webpack_require__(/*! /Users/julesgraus/webDevelopment/Boilerplate-Base/resources/sass/style.scss */"./resources/sass/style.scss");


/***/ })

},[[0,"/js/manifest","/js/vendor"]]]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9iYWNrZW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2NsaWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9ldmVudGJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vZXhwb3J0cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9oZWxwZXJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2ludGVncmF0aW9ucy9icmVhZGNydW1icy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9pbnRlZ3JhdGlvbnMvZ2xvYmFsaGFuZGxlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vaW50ZWdyYXRpb25zL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2ludGVncmF0aW9ucy9saW5rZWRlcnJvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vaW50ZWdyYXRpb25zL3RyeWNhdGNoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2ludGVncmF0aW9ucy91c2VyYWdlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vcGFyc2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9zZGsuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vdHJhY2VraXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vdHJhbnNwb3J0cy9iYXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL3RyYW5zcG9ydHMvZmV0Y2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vdHJhbnNwb3J0cy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS90cmFuc3BvcnRzL3hoci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS92ZXJzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvZXNtL2FwaS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL2VzbS9iYXNlYmFja2VuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL2VzbS9iYXNlY2xpZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvZXNtL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvZXNtL2ludGVncmF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvZXNtL2ludGVncmF0aW9ucy9mdW5jdGlvbnRvc3RyaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvZXNtL2ludGVncmF0aW9ucy9pbmJvdW5kZmlsdGVycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL2VzbS9pbnRlZ3JhdGlvbnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9lc20vcmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL2VzbS9zZGsuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9lc20vdHJhbnNwb3J0cy9ub29wLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9lc20vaHViLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaHViL2VzbS9zY29wZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9taW5pbWFsL2VzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90eXBlcy9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHlwZXMvZXNtL2xvZ2xldmVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL2VzbS9zZXZlcml0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90eXBlcy9lc20vc3RhdHVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9hc3luYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vZHNuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9lcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL2luc3RydW1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL2lzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9sb2dnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL21lbW8uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL21pc2MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL29iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vcGF0aC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vcG9seWZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL3Byb21pc2VidWZmZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL3N0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vc3VwcG9ydHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL3N5bmNwcm9taXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9oYXJtb255LW1vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYXBwLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb21wb25lbnRzL2Nob2NvbGF0ZUZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMvY29va2llSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tcG9uZW50cy9tYXBzSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tcG9uZW50cy9vdmVybGF5TWVudUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMvc2Nyb2xsVG9IYW5kbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb21wb25lbnRzL3NsaWRlckhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMvdGFic0hhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMveW91dHViZUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2dsb2JhbC9icm93c2VySGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZ2xvYmFsL2hlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2dsb2JhbC9zY3JvbGxIYW5kbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9zYXNzL3N0eWxlLnNjc3M/YzY0ZCJdLCJuYW1lcyI6WyJ3aW5kb3ciLCJzZW50cnlfZHNuIiwidW5kZWZpbmVkIiwiU2VudHJ5IiwiZHNuIiwicmVxdWlyZSIsIkNob2NvbGF0ZUZhY3RvcnkiLCJiYW5uZWRWaXNpdG9yIiwiZW50ZXIiLCJjaG9jb2xhdGVGYWN0b3JpZXMiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJpc3NldCIsImFtb3VudE9mQ2hvY29sYXRlRmFjdG9yaWVzIiwibGVuZ3RoIiwiaSIsIkNob2NvbGF0ZUJhciIsIl9mbGFzaFRpY2tldCIsImNob2NvbGF0ZUJhciIsImdvbGRlblRpY2tldCIsInF1ZXJ5U2VsZWN0b3IiLCJhZGRFdmVudExpc3RlbmVyIiwiZW5qb3lUaGVUb3VyIiwiY29uc29sZSIsImxvZyIsImNob2NvbGF0ZUZhY3RvcnkiLCJ0b3VyR3JvdXAiLCJvb21wYUxvb21wYXMiLCJhbW91bnRPZk9vbXBhTG9vbXBhcyIsInRvdXJHcm91cFNpemUiLCJ2aXNpdG9yIiwidmlzaXRvck5hbWUiLCJnZXRBdHRyaWJ1dGUiLCJfaXNWaXNpdG9yQmFubmVkIiwiX2dldEFycmFuZ2VtZW50IiwiX2ZpbmlzaFRvdXIiLCJpbmRleE9mIiwidmlzaXRvclR5cGUiLCJub2RlTmFtZSIsInZhbHVlIiwiZ3JvdXAiLCJfYWRkV2lsbGllV29ua2EiLCJnYXRlIiwiQWpheCIsInBvc3QiLCJIdHRwUmVxdWVzdCIsInJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwic3RhdHVzIiwiX3RoYW5rc0ZvclZpc2l0aW5nIiwicmVkaXJlY3RVcmwiLCJfZ2l2ZUZlZWRiYWNrVG9NZW1iZXJzIiwiZXJyb3JzIiwiX3Vua25vd25HYXBJbkZhY3RvcnkiLCJlIiwiX3dpbGxpZSIsImZlZWRiYWNrQXJlYSIsImlubmVySFRNTCIsIl9jbGVhclByZXZpb3VzTWFya2VkSmFja2V0cyIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwiamFja2V0IiwidmlzaXRvckZlZWRiYWNrQXJlYSIsInZpc2l0b3JOb2RlIiwiX2dyYWJWaXNpdG9ySmFja2V0IiwidmlzaXRvckZlZWRiYWNrIiwidmlzaXRvckZlZWRiYWNrQW1vdW50IiwidmlzaXRvckZlZWRiYWNrTGluZSIsImNsYXNzTGlzdCIsImFkZCIsImN1cnJlbnRGZWVkYmFja0FyZWEiLCJjYXBpdGFsaXplRmlyc3RMZXR0ZXIiLCJtYXJrZWRKYWNrZXRzIiwibWFya2VkSmFja2V0c0Ftb3VudCIsInJlbW92ZSIsImN1cnJlbnRMYXllciIsInNhZmV0eUJyZWFrIiwicGFyZW50Tm9kZSIsImNvbnRhaW5zIiwidGFnTmFtZSIsIm5leHRTdG9wIiwibG9jYXRpb24iLCJDb29raWVIYW5kbGVyIiwiY29va2llQmFyIiwiY29va2llTWVzc2FnZSIsImNvb2tpZUZhZGVPdXRBbmltYXRpb25EdXJhdGlvbiIsImFjY2VwdFRyYWNraW5nIiwiaW5pdCIsImluaXRDb29raWVCYXIiLCJjaGVja0ZvckNvb2tpZVNldHRpbmdzIiwiY2xvc2VCdXR0b24iLCJjbG9zZUNvb2tpZU1lc3NhZ2UiLCJDb29raWUiLCJnZXQiLCJib2R5Iiwic2V0IiwiTWFwc0hhbmRsZXIiLCJtYXAiLCJrZXkiLCJsYXQiLCJsbmciLCJzdHlsaW5nIiwiaGFzQXR0cmlidXRlIiwicGFyc2VGbG9hdCIsInNldEN1c3RvbVN0eWxpbmciLCJnb29nbGUiLCJtYXBzIiwiZ2V0U2NyaXB0IiwiZHJhd01hcCIsIk1hcCIsInpvb20iLCJjZW50ZXIiLCJkaXNhYmxlRGVmYXVsdFVJIiwic3R5bGVzIiwiY29udGVudFN0cmluZyIsImluZm93aW5kb3ciLCJJbmZvV2luZG93IiwiY29udGVudCIsIm1hcmtlciIsIk1hcmtlciIsInBvc2l0aW9uIiwiYWRkTGlzdGVuZXIiLCJvcGVuIiwiYm9keVNjcm9sbExvY2siLCJPdmVybGF5TWVudUhhbmRsZXIiLCJvdmVybGF5TWVudVRyaWdnZXJMaXN0Iiwib3ZlcmxheU1lbnVUcmlnZ2VyTGlzdENvdW50Iiwib3ZlcmxheU1lbnVUcmlnZ2VyIiwiaW5pdE92ZXJsYXlNZW51IiwidG9nZ2xlT3ZlcmxheU1lbnUiLCJldmVudCIsIm92ZXJsYXlNZW51TmF2IiwiZW5hYmxlQm9keVNjcm9sbCIsImVsZW0iLCJ0YWJJbmRleCIsImRpc2FibGVCb2R5U2Nyb2xsIiwidG9nZ2xlIiwiaGlkZGVuIiwiU2Nyb2xsVG9IYW5kbGVyIiwib2Zmc2V0IiwiZHVyYXRpb24iLCJzdGFydCIsImNoYW5nZSIsImN1cnJlbnRUaW1lIiwiYWxsb3dBbmltYXRpb24iLCJzY3JvbGxUb0FuaW1hdGlvbiIsImVhc2luZyIsImFuY2hvckxpbmtzIiwiYW5jaG9yTGlua3NBbW91bnQiLCJhbmNob3JMaW5rIiwicHJlcGFyZVNjcm9sbFRvIiwicHJldmVudERlZmF1bHQiLCJlbGVtZW50SWQiLCJzdWJzdHIiLCJzY3JvbGxUb0VsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsInNjcm9sbFRvRWxlbWVudFBvc2l0aW9uIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiZG9jdW1lbnRFbGVtZW50IiwiTWF0aCIsIm1heCIsInNjcm9sbFRvcCIsInBhZ2VZT2Zmc2V0IiwidG9wIiwic3RhcnRUaW1lIiwicGVyZm9ybWFuY2UiLCJub3ciLCJEYXRlIiwiZ2V0VGltZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImFuaW1hdGVTY3JvbGwiLCJhYm9ydFNjcm9sbEFuaW1hdGlvbiIsInRpbWVzdGFtcCIsInByb2dyZXNzIiwibWluIiwiRWFzaW5nRnVuY3Rpb25zIiwibmV3U2Nyb2xsVG9wIiwiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJTbGlkZXJzIiwic2xpZGVyQ29udGFpbmVycyIsInNsaWRlckNvbnRhaW5lcnNMZW5ndGgiLCJzbGlkZXIiLCJzbGlkZXJJZCIsIlNsaWRlcnNldHRpbmciLCJTbGlkZXJTZXR0aW5nIiwiYXV0b1NsaWRlciIsInNsaWRlUXVlcnkiLCJuYXZpZ2F0aW9uQnV0dG9ucyIsImRvdHMiLCJwdXNoIiwiU2xpZGVyIiwicHJlcGFyZVBhcmFtZXRlcnMiLCJzZXR0aW5nc09iamVjdCIsInNlbGYiLCJzbGlkZXJJbnRlcnZhbCIsInNldFNsaWRlcklkIiwic3RyaW5nIiwic2V0QXV0b1NsaWRlciIsImJvb2xlYW4iLCJzZXRTbGlkZXJJbnRlcnZhbCIsImludGVnZXIiLCJzZXRTbGlkZVF1ZXJ5Iiwic2V0TmF2aWdhdGlvbkJ1dHRvbnMiLCJzZXREb3RzIiwiZ2V0U2xpZGVySWQiLCJnZXRBdXRvU2xpZGVyIiwiYXV0b1NsaWRlIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwiZ2V0U2xpZGVySW50ZXJ2YWwiLCJnZXRTbGlkZVF1ZXJ5IiwiZ2V0TmF2aWdhdGlvbkJ1dHRvbnMiLCJnZXREb3RzIiwiZmlsbCIsInNldHRpbmdzT2JqZWN0S2V5cyIsInNldHRpbmdzT2JqZWN0TGVuZ3RoIiwic2V0dGluZ3MiLCJzbGlkZXJPYmplY3QiLCJhY3RpdmVTbGlkZUlkIiwicHJldmlvdXNTbGlkZUlkIiwibmV4dFNsaWRlSWQiLCJhdmFpbGFibGVTbGlkZXMiLCJzbGlkZXMiLCJhdXRvU2xpZGVySW50ZXJ2YWwiLCJzZXRTbGlkZSIsInN3aXBlR2VzdHVyZXMiLCJIYW1tZXIiLCJvbiIsInJlc2V0QXV0b1NsaWRlciIsIm5leHRTbGlkZSIsInByZXZpb3VzU2xpZGUiLCJuYXZpZ2F0aW9uQnV0dG9uc0xlbmd0aCIsIm5hdmlnYXRpb25CdXR0b24iLCJjbGlja05hdmlnYXRpb25CdXR0b24iLCJkb3RzTGVuZ3RoIiwiZG90IiwiY2xpY2tEb3QiLCJjbGVhckludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJzbGlkZXNMZW5ndGgiLCJzbGlkZSIsInN0eWxlIiwicG9pbnRlckV2ZW50cyIsInNsaWRlT3JkZXIiLCJwYXJzZUludCIsInNldEFjdGl2ZURvdCIsIm5hdkJ1dHRvbiIsIm5hdkJ1dHRvbkRpcmVjdGlvbiIsImNsaWNrZWREb3QiLCJkb3RPcmRlciIsIlRhYnNIYW5kbGVyIiwidGFic0xpc3QiLCJ0YWJzIiwidGFic0xpc3RDb3VudCIsImluaXRUYWJzIiwiY29udGFpbmVyIiwiZXJyb3IiLCJ0cmlnZ2VycyIsInRhYnNDb250ZW50IiwidGFyZ2V0IiwiY2xvc2VzdCIsImRpciIsInN0ZXBUYWJzIiwidG9nZ2xlVGFicyIsImRhdGFzZXQiLCJ0YWJJZCIsInRhYnNUYWIiLCJ0YWJzVHJpZ2dlciIsInRyaWdnZXJDb3VudCIsImFjdGl2ZUlkIiwibmV3SWQiLCJZb3V0dWJlSGFuZGxlciIsInlvdXR1YmVDbGFzcyIsInBsYXllcnMiLCJ5b3V0dWJlUGxheWVycyIsInlvdXR1YmVQbGF5ZXJzQW1vdW50IiwieW91dHViZVBsYXllciIsInlvdXR1YmVQbGF5ZXJJZCIsInlvdXR1YmVFbGVtZW50IiwiaWQiLCJsaW5rIiwiYXV0b1BsYXkiLCJpbml0WW91dHViZSIsIllUIiwiUGxheWVyIiwib25Zb3VUdWJlUGxheWVyQVBJUmVhZHkiLCJsb2FkUGxheWVycyIsInBsYXllciIsImhlaWdodCIsIndpZHRoIiwidmlkZW9JZCIsImhvc3QiLCJwbGF5ZXJWYXJzIiwibW9kZXN0YnJhbmRpbmciLCJyZWwiLCJkaXNhYmxla2IiLCJhdXRvcGxheSIsImV2ZW50cyIsIm9uU3RhdGVDaGFuZ2UiLCJvblJlYWR5IiwicGxheWVyQ29udGFpbmVySWQiLCJnZXRJZnJhbWUiLCJ2aWRlb1N0YXRlIiwiZGF0YSIsIlBsYXllclN0YXRlIiwiRU5ERUQiLCJwbGF5VmlkZW8iLCJCcm93c2VySGFuZGxlciIsInVzZXJBZ2VudCIsImJyb3dzZXJJbmZvIiwibmF2aWdhdG9yIiwiZ2V0QnJvd3NlckluZm8iLCJoYW5kbGVJRSIsImhhbmRsZVNhZmFyaSIsIm1zaWUiLCJpZWx0MTEiLCJpZTExIiwibWF0Y2giLCJ2ZXJzaW9uIiwic3Vic3RyaW5nIiwibmFtZSIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwidWEiLCJ0ZW0iLCJNIiwidGVzdCIsImV4ZWMiLCJhcHBOYW1lIiwiYXBwVmVyc2lvbiIsInNwbGljZSIsIm9iaiIsImxpbmVhciIsInQiLCJlYXNlSW5RdWFkIiwiZWFzZU91dFF1YWQiLCJlYXNlSW5PdXRRdWFkIiwiZWFzZUluQ3ViaWMiLCJlYXNlT3V0Q3ViaWMiLCJlYXNlSW5PdXRDdWJpYyIsImVhc2VJblF1YXJ0IiwiZWFzZU91dFF1YXJ0IiwiZWFzZUluT3V0UXVhcnQiLCJlYXNlSW5RdWludCIsImVhc2VPdXRRdWludCIsImVhc2VJbk91dFF1aW50Iiwic291cmNlIiwiY2FsbGJhY2siLCJzY3JpcHQiLCJjcmVhdGVFbGVtZW50IiwiYXN5bmMiLCJzY3JpcHRzIiwicHJpb3IiLCJvbmxvYWQiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJfIiwiaXNBYm9ydCIsInJlYWR5U3RhdGUiLCJzcmMiLCJpbnNlcnRCZWZvcmUiLCJkZWJvdW5jZSIsImZ1bmMiLCJ3YWl0IiwiaW1tZWRpYXRlIiwidGltZW91dCIsImNvbnRleHQiLCJhcmdzIiwiYXJndW1lbnRzIiwibGF0ZXIiLCJhcHBseSIsImNhbGxOb3ciLCJjbGVhclRpbWVvdXQiLCJzZXRUaW1lb3V0IiwiZGF5cyIsImRvbWFpbiIsImRvbWFpblBhcnRzIiwiZGF0ZSIsImV4cGlyZXMiLCJzZXRUaW1lIiwidG9HTVRTdHJpbmciLCJpc0lQT3JMb2NhbEhvc3QiLCJob3N0bmFtZSIsImNvb2tpZSIsInNwbGl0Iiwic2hpZnQiLCJqb2luIiwibmFtZUVRIiwiY2EiLCJjIiwiY2hhckF0IiwiZXJhc2UiLCJpc0lwQWRkcmVzcyIsImlwYWRkcmVzcyIsIm51bWJlcl9mb3JtYXQiLCJudW1iZXIiLCJkZWNpbWFscyIsImRlY19wb2ludCIsInRob3VzYW5kc19zZXAiLCJyZXBsYWNlIiwibiIsImlzRmluaXRlIiwicHJlYyIsImFicyIsInNlcCIsImRlYyIsInMiLCJ0b0ZpeGVkRml4IiwiayIsInBvdyIsInJvdW5kIiwiQXJyYXkiLCJFbGVtZW50IiwicHJvdG90eXBlIiwibWF0Y2hlcyIsIm1zTWF0Y2hlc1NlbGVjdG9yIiwid2Via2l0TWF0Y2hlc1NlbGVjdG9yIiwiZWwiLCJhbmNlc3RvciIsInBhcmVudEVsZW1lbnQiLCJ1cmwiLCJ4aHIiLCJYTUxIdHRwUmVxdWVzdCIsInRva2VuIiwic2V0UmVxdWVzdEhlYWRlciIsInNlbmQiLCJzdHJpbmdpZnkiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwic25ha2VUb0NhbWVsIiwibSIsImluZGV4SW5QYXJlbnQiLCJub2RlIiwiY2hpbGRyZW4iLCJjaGlsZE5vZGVzIiwibnVtIiwibm9kZVR5cGUiLCJjb3B5VG9DbGlwYm9hcmQiLCJlZGl0YWJsZSIsImNvbnRlbnRFZGl0YWJsZSIsInJlYWRPbmx5IiwicmFuZ2UiLCJjcmVhdGVSYW5nZSIsInNlbGVjdE5vZGVDb250ZW50cyIsInNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsInJlbW92ZUFsbFJhbmdlcyIsImFkZFJhbmdlIiwic2V0U2VsZWN0aW9uUmFuZ2UiLCJzZWxlY3QiLCJleGVjQ29tbWFuZCIsIlNjcm9sbEhhbmRsZXIiLCJ0aW1lIiwid2FpdFRocm90dGxlIiwid2FpdERlYm91bmNlIiwibGFzdFNjcm9sbFRvcFBvc2l0aW9uIiwic2Nyb2xsRGlyZWN0aW9uRG93biIsInNjcm9sbERpcmVjdGlvblVwIiwidHJpZ2dlck9uSW5pdCIsInRyaWdnZXJUaHJvdHRsZSIsInRyaWdnZXJTbW9vdGgiLCJ0cmlnZ2VyRGVib3VuY2UiLCJ0cmlnZ2VyRWxlbWVudEluVmlld3BvcnRBbmltYXRpb24iLCJkZXRlY3RTY3JvbGxEaXJlY3Rpb24iLCJ0b2dnbGVTdGlja3lIZWFkZXIiLCJkZXRlY3RJZkVsZW1lbnRJc1BhcnRseUluVmlld3BvcnQiLCJyZWN0Iiwid2luZG93SGVpZ2h0IiwiaW5uZXJIZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJ3aW5kb3dXaWR0aCIsImlubmVyV2lkdGgiLCJjbGllbnRXaWR0aCIsInZlcnRpY2FsSW5WaWV3IiwiaG9yaXpvbnRhbEluVmlldyIsImxlZnQiLCJkZXRlY3RJZkVsZW1lbnRJc0Z1bGx5SW5WaWV3cG9ydCIsImJvdHRvbSIsInNjcm9sbFRvcFBvc2l0aW9uIiwiZWxlbWVudHMiLCJlbGVtZW50c0xlbmd0aCIsImVsZW1lbnQiLCJzdGlja3lIZWFkZXIiLCJ2aXNpYmxlU3RpY2t5SGVhZGVyQ2xhc3MiLCJzdWJuYXZMaXN0Iiwic3ViTmF2SXNWaXNpYmxlIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsInZpc2liaWxpdHkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWlDO0FBQ1U7QUFDRjtBQUN5QztBQUNWO0FBQ1o7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksK0NBQWlCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDZiwrQjs7Ozs7Ozs7Ozs7O0FDOUVBO0FBQUE7QUFBQTtBQUFBO0FBQWlDO0FBQ1c7QUFDNUM7QUFDQTtBQUNBLElBQUksK0NBQWlCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsZ0VBQWM7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNzQjtBQUN2QixpQzs7Ozs7Ozs7Ozs7O0FDakJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBd0I7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QjtBQUNIO0FBQ0o7QUFDSjtBQXBKaUIsQ0FBdEI7QUF3SkFoQyxhQUFhLENBQUMxVyxJQUFkLEc7Ozs7Ozs7Ozs7O0FDN0pBLHlDIiwiZmlsZSI6Ii9qcy9hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgQmFzZUJhY2tlbmQgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgU2V2ZXJpdHkgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGFkZEV4Y2VwdGlvbk1lY2hhbmlzbSwgc3VwcG9ydHNGZXRjaCwgU3luY1Byb21pc2UgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IGV2ZW50RnJvbVN0cmluZywgZXZlbnRGcm9tVW5rbm93bklucHV0IH0gZnJvbSAnLi9ldmVudGJ1aWxkZXInO1xuaW1wb3J0IHsgRmV0Y2hUcmFuc3BvcnQsIFhIUlRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0cyc7XG4vKipcbiAqIFRoZSBTZW50cnkgQnJvd3NlciBTREsgQmFja2VuZC5cbiAqIEBoaWRkZW5cbiAqL1xudmFyIEJyb3dzZXJCYWNrZW5kID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliXzEuX19leHRlbmRzKEJyb3dzZXJCYWNrZW5kLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEJyb3dzZXJCYWNrZW5kKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQnJvd3NlckJhY2tlbmQucHJvdG90eXBlLl9zZXR1cFRyYW5zcG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9vcHRpb25zLmRzbikge1xuICAgICAgICAgICAgLy8gV2UgcmV0dXJuIHRoZSBub29wIHRyYW5zcG9ydCBoZXJlIGluIGNhc2UgdGhlcmUgaXMgbm8gRHNuLlxuICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuX3NldHVwVHJhbnNwb3J0LmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRyYW5zcG9ydE9wdGlvbnMgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl9vcHRpb25zLnRyYW5zcG9ydE9wdGlvbnMsIHsgZHNuOiB0aGlzLl9vcHRpb25zLmRzbiB9KTtcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMudHJhbnNwb3J0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMuX29wdGlvbnMudHJhbnNwb3J0KHRyYW5zcG9ydE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdXBwb3J0c0ZldGNoKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRmV0Y2hUcmFuc3BvcnQodHJhbnNwb3J0T3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBYSFJUcmFuc3BvcnQodHJhbnNwb3J0T3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJyb3dzZXJCYWNrZW5kLnByb3RvdHlwZS5ldmVudEZyb21FeGNlcHRpb24gPSBmdW5jdGlvbiAoZXhjZXB0aW9uLCBoaW50KSB7XG4gICAgICAgIHZhciBzeW50aGV0aWNFeGNlcHRpb24gPSAoaGludCAmJiBoaW50LnN5bnRoZXRpY0V4Y2VwdGlvbikgfHwgdW5kZWZpbmVkO1xuICAgICAgICB2YXIgZXZlbnQgPSBldmVudEZyb21Vbmtub3duSW5wdXQoZXhjZXB0aW9uLCBzeW50aGV0aWNFeGNlcHRpb24sIHtcbiAgICAgICAgICAgIGF0dGFjaFN0YWNrdHJhY2U6IHRoaXMuX29wdGlvbnMuYXR0YWNoU3RhY2t0cmFjZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGFkZEV4Y2VwdGlvbk1lY2hhbmlzbShldmVudCwge1xuICAgICAgICAgICAgaGFuZGxlZDogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6ICdnZW5lcmljJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGV2ZW50LmxldmVsID0gU2V2ZXJpdHkuRXJyb3I7XG4gICAgICAgIGlmIChoaW50ICYmIGhpbnQuZXZlbnRfaWQpIHtcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50X2lkID0gaGludC5ldmVudF9pZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3luY1Byb21pc2UucmVzb2x2ZShldmVudCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJyb3dzZXJCYWNrZW5kLnByb3RvdHlwZS5ldmVudEZyb21NZXNzYWdlID0gZnVuY3Rpb24gKG1lc3NhZ2UsIGxldmVsLCBoaW50KSB7XG4gICAgICAgIGlmIChsZXZlbCA9PT0gdm9pZCAwKSB7IGxldmVsID0gU2V2ZXJpdHkuSW5mbzsgfVxuICAgICAgICB2YXIgc3ludGhldGljRXhjZXB0aW9uID0gKGhpbnQgJiYgaGludC5zeW50aGV0aWNFeGNlcHRpb24pIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGV2ZW50ID0gZXZlbnRGcm9tU3RyaW5nKG1lc3NhZ2UsIHN5bnRoZXRpY0V4Y2VwdGlvbiwge1xuICAgICAgICAgICAgYXR0YWNoU3RhY2t0cmFjZTogdGhpcy5fb3B0aW9ucy5hdHRhY2hTdGFja3RyYWNlLFxuICAgICAgICB9KTtcbiAgICAgICAgZXZlbnQubGV2ZWwgPSBsZXZlbDtcbiAgICAgICAgaWYgKGhpbnQgJiYgaGludC5ldmVudF9pZCkge1xuICAgICAgICAgICAgZXZlbnQuZXZlbnRfaWQgPSBoaW50LmV2ZW50X2lkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZXNvbHZlKGV2ZW50KTtcbiAgICB9O1xuICAgIHJldHVybiBCcm93c2VyQmFja2VuZDtcbn0oQmFzZUJhY2tlbmQpKTtcbmV4cG9ydCB7IEJyb3dzZXJCYWNrZW5kIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYWNrZW5kLmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBUEksIEJhc2VDbGllbnQgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0LCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IEJyb3dzZXJCYWNrZW5kIH0gZnJvbSAnLi9iYWNrZW5kJztcbmltcG9ydCB7IEJyZWFkY3J1bWJzIH0gZnJvbSAnLi9pbnRlZ3JhdGlvbnMnO1xuaW1wb3J0IHsgU0RLX05BTUUsIFNES19WRVJTSU9OIH0gZnJvbSAnLi92ZXJzaW9uJztcbi8qKlxuICogVGhlIFNlbnRyeSBCcm93c2VyIFNESyBDbGllbnQuXG4gKlxuICogQHNlZSBCcm93c2VyT3B0aW9ucyBmb3IgZG9jdW1lbnRhdGlvbiBvbiBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKiBAc2VlIFNlbnRyeUNsaWVudCBmb3IgdXNhZ2UgZG9jdW1lbnRhdGlvbi5cbiAqL1xudmFyIEJyb3dzZXJDbGllbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoQnJvd3NlckNsaWVudCwgX3N1cGVyKTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEJyb3dzZXIgU0RLIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGlzIFNESy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBCcm93c2VyQ2xpZW50KG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIEJyb3dzZXJCYWNrZW5kLCBvcHRpb25zKSB8fCB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJyb3dzZXJDbGllbnQucHJvdG90eXBlLl9wcmVwYXJlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIHNjb3BlLCBoaW50KSB7XG4gICAgICAgIGV2ZW50LnBsYXRmb3JtID0gZXZlbnQucGxhdGZvcm0gfHwgJ2phdmFzY3JpcHQnO1xuICAgICAgICBldmVudC5zZGsgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCBldmVudC5zZGssIHsgbmFtZTogU0RLX05BTUUsIHBhY2thZ2VzOiB0c2xpYl8xLl9fc3ByZWFkKCgoZXZlbnQuc2RrICYmIGV2ZW50LnNkay5wYWNrYWdlcykgfHwgW10pLCBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbnBtOkBzZW50cnkvYnJvd3NlcicsXG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb246IFNES19WRVJTSU9OLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdKSwgdmVyc2lvbjogU0RLX1ZFUlNJT04gfSk7XG4gICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLl9wcmVwYXJlRXZlbnQuY2FsbCh0aGlzLCBldmVudCwgc2NvcGUsIGhpbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBCcm93c2VyQ2xpZW50LnByb3RvdHlwZS5fc2VuZEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBpbnRlZ3JhdGlvbiA9IHRoaXMuZ2V0SW50ZWdyYXRpb24oQnJlYWRjcnVtYnMpO1xuICAgICAgICBpZiAoaW50ZWdyYXRpb24pIHtcbiAgICAgICAgICAgIGludGVncmF0aW9uLmFkZFNlbnRyeUJyZWFkY3J1bWIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuX3NlbmRFdmVudC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNob3cgYSByZXBvcnQgZGlhbG9nIHRvIHRoZSB1c2VyIHRvIHNlbmQgZmVlZGJhY2sgdG8gYSBzcGVjaWZpYyBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFNldCBpbmRpdmlkdWFsIG9wdGlvbnMgZm9yIHRoZSBkaWFsb2dcbiAgICAgKi9cbiAgICBCcm93c2VyQ2xpZW50LnByb3RvdHlwZS5zaG93UmVwb3J0RGlhbG9nID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgLy8gZG9lc24ndCB3b3JrIHdpdGhvdXQgYSBkb2N1bWVudCAoUmVhY3QgTmF0aXZlKVxuICAgICAgICB2YXIgZG9jdW1lbnQgPSBnZXRHbG9iYWxPYmplY3QoKS5kb2N1bWVudDtcbiAgICAgICAgaWYgKCFkb2N1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5faXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignVHJ5aW5nIHRvIGNhbGwgc2hvd1JlcG9ydERpYWxvZyB3aXRoIFNlbnRyeSBDbGllbnQgaXMgZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZHNuID0gb3B0aW9ucy5kc24gfHwgdGhpcy5nZXREc24oKTtcbiAgICAgICAgaWYgKCFvcHRpb25zLmV2ZW50SWQpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignTWlzc2luZyBgZXZlbnRJZGAgb3B0aW9uIGluIHNob3dSZXBvcnREaWFsb2cgY2FsbCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZHNuKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ01pc3NpbmcgYERzbmAgb3B0aW9uIGluIHNob3dSZXBvcnREaWFsb2cgY2FsbCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgc2NyaXB0LmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgc2NyaXB0LnNyYyA9IG5ldyBBUEkoZHNuKS5nZXRSZXBvcnREaWFsb2dFbmRwb2ludChvcHRpb25zKTtcbiAgICAgICAgaWYgKG9wdGlvbnMub25Mb2FkKSB7XG4gICAgICAgICAgICBzY3JpcHQub25sb2FkID0gb3B0aW9ucy5vbkxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICB9O1xuICAgIHJldHVybiBCcm93c2VyQ2xpZW50O1xufShCYXNlQ2xpZW50KSk7XG5leHBvcnQgeyBCcm93c2VyQ2xpZW50IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jbGllbnQuanMubWFwIiwiaW1wb3J0IHsgYWRkRXhjZXB0aW9uTWVjaGFuaXNtLCBhZGRFeGNlcHRpb25UeXBlVmFsdWUsIGlzRE9NRXJyb3IsIGlzRE9NRXhjZXB0aW9uLCBpc0Vycm9yLCBpc0Vycm9yRXZlbnQsIGlzRXZlbnQsIGlzUGxhaW5PYmplY3QsIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBldmVudEZyb21QbGFpbk9iamVjdCwgZXZlbnRGcm9tU3RhY2t0cmFjZSwgcHJlcGFyZUZyYW1lc0ZvckV2ZW50IH0gZnJvbSAnLi9wYXJzZXJzJztcbmltcG9ydCB7IGNvbXB1dGVTdGFja1RyYWNlIH0gZnJvbSAnLi90cmFjZWtpdCc7XG4vKiogSlNEb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVudEZyb21Vbmtub3duSW5wdXQoZXhjZXB0aW9uLCBzeW50aGV0aWNFeGNlcHRpb24sIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIHZhciBldmVudDtcbiAgICBpZiAoaXNFcnJvckV2ZW50KGV4Y2VwdGlvbikgJiYgZXhjZXB0aW9uLmVycm9yKSB7XG4gICAgICAgIC8vIElmIGl0IGlzIGFuIEVycm9yRXZlbnQgd2l0aCBgZXJyb3JgIHByb3BlcnR5LCBleHRyYWN0IGl0IHRvIGdldCBhY3R1YWwgRXJyb3JcbiAgICAgICAgdmFyIGVycm9yRXZlbnQgPSBleGNlcHRpb247XG4gICAgICAgIGV4Y2VwdGlvbiA9IGVycm9yRXZlbnQuZXJyb3I7IC8vIHRzbGludDpkaXNhYmxlLWxpbmU6bm8tcGFyYW1ldGVyLXJlYXNzaWdubWVudFxuICAgICAgICBldmVudCA9IGV2ZW50RnJvbVN0YWNrdHJhY2UoY29tcHV0ZVN0YWNrVHJhY2UoZXhjZXB0aW9uKSk7XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICB9XG4gICAgaWYgKGlzRE9NRXJyb3IoZXhjZXB0aW9uKSB8fCBpc0RPTUV4Y2VwdGlvbihleGNlcHRpb24pKSB7XG4gICAgICAgIC8vIElmIGl0IGlzIGEgRE9NRXJyb3Igb3IgRE9NRXhjZXB0aW9uICh3aGljaCBhcmUgbGVnYWN5IEFQSXMsIGJ1dCBzdGlsbCBzdXBwb3J0ZWQgaW4gc29tZSBicm93c2VycylcbiAgICAgICAgLy8gdGhlbiB3ZSBqdXN0IGV4dHJhY3QgdGhlIG5hbWUgYW5kIG1lc3NhZ2UsIGFzIHRoZXkgZG9uJ3QgcHJvdmlkZSBhbnl0aGluZyBlbHNlXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9ET01FcnJvclxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRE9NRXhjZXB0aW9uXG4gICAgICAgIHZhciBkb21FeGNlcHRpb24gPSBleGNlcHRpb247XG4gICAgICAgIHZhciBuYW1lXzEgPSBkb21FeGNlcHRpb24ubmFtZSB8fCAoaXNET01FcnJvcihkb21FeGNlcHRpb24pID8gJ0RPTUVycm9yJyA6ICdET01FeGNlcHRpb24nKTtcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBkb21FeGNlcHRpb24ubWVzc2FnZSA/IG5hbWVfMSArIFwiOiBcIiArIGRvbUV4Y2VwdGlvbi5tZXNzYWdlIDogbmFtZV8xO1xuICAgICAgICBldmVudCA9IGV2ZW50RnJvbVN0cmluZyhtZXNzYWdlLCBzeW50aGV0aWNFeGNlcHRpb24sIG9wdGlvbnMpO1xuICAgICAgICBhZGRFeGNlcHRpb25UeXBlVmFsdWUoZXZlbnQsIG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKGV4Y2VwdGlvbikpIHtcbiAgICAgICAgLy8gd2UgaGF2ZSBhIHJlYWwgRXJyb3Igb2JqZWN0LCBkbyBub3RoaW5nXG4gICAgICAgIGV2ZW50ID0gZXZlbnRGcm9tU3RhY2t0cmFjZShjb21wdXRlU3RhY2tUcmFjZShleGNlcHRpb24pKTtcbiAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgIH1cbiAgICBpZiAoaXNQbGFpbk9iamVjdChleGNlcHRpb24pIHx8IGlzRXZlbnQoZXhjZXB0aW9uKSkge1xuICAgICAgICAvLyBJZiBpdCBpcyBwbGFpbiBPYmplY3Qgb3IgRXZlbnQsIHNlcmlhbGl6ZSBpdCBtYW51YWxseSBhbmQgZXh0cmFjdCBvcHRpb25zXG4gICAgICAgIC8vIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBncm91cCBldmVudHMgYmFzZWQgb24gdG9wLWxldmVsIGtleXNcbiAgICAgICAgLy8gd2hpY2ggaXMgbXVjaCBiZXR0ZXIgdGhhbiBjcmVhdGluZyBuZXcgZ3JvdXAgd2hlbiBhbnkga2V5L3ZhbHVlIGNoYW5nZVxuICAgICAgICB2YXIgb2JqZWN0RXhjZXB0aW9uID0gZXhjZXB0aW9uO1xuICAgICAgICBldmVudCA9IGV2ZW50RnJvbVBsYWluT2JqZWN0KG9iamVjdEV4Y2VwdGlvbiwgc3ludGhldGljRXhjZXB0aW9uLCBvcHRpb25zLnJlamVjdGlvbik7XG4gICAgICAgIGFkZEV4Y2VwdGlvbk1lY2hhbmlzbShldmVudCwge1xuICAgICAgICAgICAgc3ludGhldGljOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgIH1cbiAgICAvLyBJZiBub25lIG9mIHByZXZpb3VzIGNoZWNrcyB3ZXJlIHZhbGlkLCB0aGVuIGl0IG1lYW5zIHRoYXQgaXQncyBub3Q6XG4gICAgLy8gLSBhbiBpbnN0YW5jZSBvZiBET01FcnJvclxuICAgIC8vIC0gYW4gaW5zdGFuY2Ugb2YgRE9NRXhjZXB0aW9uXG4gICAgLy8gLSBhbiBpbnN0YW5jZSBvZiBFdmVudFxuICAgIC8vIC0gYW4gaW5zdGFuY2Ugb2YgRXJyb3JcbiAgICAvLyAtIGEgdmFsaWQgRXJyb3JFdmVudCAob25lIHdpdGggYW4gZXJyb3IgcHJvcGVydHkpXG4gICAgLy8gLSBhIHBsYWluIE9iamVjdFxuICAgIC8vXG4gICAgLy8gU28gYmFpbCBvdXQgYW5kIGNhcHR1cmUgaXQgYXMgYSBzaW1wbGUgbWVzc2FnZTpcbiAgICBldmVudCA9IGV2ZW50RnJvbVN0cmluZyhleGNlcHRpb24sIHN5bnRoZXRpY0V4Y2VwdGlvbiwgb3B0aW9ucyk7XG4gICAgYWRkRXhjZXB0aW9uVHlwZVZhbHVlKGV2ZW50LCBcIlwiICsgZXhjZXB0aW9uLCB1bmRlZmluZWQpO1xuICAgIGFkZEV4Y2VwdGlvbk1lY2hhbmlzbShldmVudCwge1xuICAgICAgICBzeW50aGV0aWM6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIGV2ZW50O1xufVxuLy8gdGhpcy5fb3B0aW9ucy5hdHRhY2hTdGFja3RyYWNlXG4vKiogSlNEb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVudEZyb21TdHJpbmcoaW5wdXQsIHN5bnRoZXRpY0V4Y2VwdGlvbiwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgdmFyIGV2ZW50ID0ge1xuICAgICAgICBtZXNzYWdlOiBpbnB1dCxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zLmF0dGFjaFN0YWNrdHJhY2UgJiYgc3ludGhldGljRXhjZXB0aW9uKSB7XG4gICAgICAgIHZhciBzdGFja3RyYWNlID0gY29tcHV0ZVN0YWNrVHJhY2Uoc3ludGhldGljRXhjZXB0aW9uKTtcbiAgICAgICAgdmFyIGZyYW1lc18xID0gcHJlcGFyZUZyYW1lc0ZvckV2ZW50KHN0YWNrdHJhY2Uuc3RhY2spO1xuICAgICAgICBldmVudC5zdGFja3RyYWNlID0ge1xuICAgICAgICAgICAgZnJhbWVzOiBmcmFtZXNfMSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGV2ZW50O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXZlbnRidWlsZGVyLmpzLm1hcCIsImV4cG9ydCB7IFNldmVyaXR5LCBTdGF0dXMsIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5leHBvcnQgeyBhZGRHbG9iYWxFdmVudFByb2Nlc3NvciwgYWRkQnJlYWRjcnVtYiwgY2FwdHVyZUV4Y2VwdGlvbiwgY2FwdHVyZUV2ZW50LCBjYXB0dXJlTWVzc2FnZSwgY29uZmlndXJlU2NvcGUsIGdldEh1YkZyb21DYXJyaWVyLCBnZXRDdXJyZW50SHViLCBIdWIsIFNjb3BlLCBzdGFydFRyYW5zYWN0aW9uLCBzZXRDb250ZXh0LCBzZXRFeHRyYSwgc2V0RXh0cmFzLCBzZXRUYWcsIHNldFRhZ3MsIHNldFVzZXIsIHdpdGhTY29wZSwgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuZXhwb3J0IHsgQnJvd3NlckNsaWVudCB9IGZyb20gJy4vY2xpZW50JztcbmV4cG9ydCB7IGRlZmF1bHRJbnRlZ3JhdGlvbnMsIGZvcmNlTG9hZCwgaW5pdCwgbGFzdEV2ZW50SWQsIG9uTG9hZCwgc2hvd1JlcG9ydERpYWxvZywgZmx1c2gsIGNsb3NlLCB3cmFwIH0gZnJvbSAnLi9zZGsnO1xuZXhwb3J0IHsgU0RLX05BTUUsIFNES19WRVJTSU9OIH0gZnJvbSAnLi92ZXJzaW9uJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV4cG9ydHMuanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGNhcHR1cmVFeGNlcHRpb24sIHdpdGhTY29wZSB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBhZGRFeGNlcHRpb25NZWNoYW5pc20sIGFkZEV4Y2VwdGlvblR5cGVWYWx1ZSB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xudmFyIGlnbm9yZU9uRXJyb3IgPSAwO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRJZ25vcmVPbkVycm9yKCkge1xuICAgIHJldHVybiBpZ25vcmVPbkVycm9yID4gMDtcbn1cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlTmV4dE9uRXJyb3IoKSB7XG4gICAgLy8gb25lcnJvciBzaG91bGQgdHJpZ2dlciBiZWZvcmUgc2V0VGltZW91dFxuICAgIGlnbm9yZU9uRXJyb3IgKz0gMTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWdub3JlT25FcnJvciAtPSAxO1xuICAgIH0pO1xufVxuLyoqXG4gKiBJbnN0cnVtZW50cyB0aGUgZ2l2ZW4gZnVuY3Rpb24gYW5kIHNlbmRzIGFuIGV2ZW50IHRvIFNlbnRyeSBldmVyeSB0aW1lIHRoZVxuICogZnVuY3Rpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiAqXG4gKiBAcGFyYW0gZm4gQSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHJldHVybnMgVGhlIHdyYXBwZWQgZnVuY3Rpb24uXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwKGZuLCBvcHRpb25zLCBiZWZvcmUpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIFdlIGRvbid0IHdhbm5hIHdyYXAgaXQgdHdpY2VcbiAgICAgICAgaWYgKGZuLl9fc2VudHJ5X18pIHtcbiAgICAgICAgICAgIHJldHVybiBmbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGlzIGhhcyBhbHJlYWR5IGJlZW4gd3JhcHBlZCBpbiB0aGUgcGFzdCwgcmV0dXJuIHRoYXQgd3JhcHBlZCBmdW5jdGlvblxuICAgICAgICBpZiAoZm4uX19zZW50cnlfd3JhcHBlZF9fKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4uX19zZW50cnlfd3JhcHBlZF9fO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIEp1c3QgYWNjZXNzaW5nIGN1c3RvbSBwcm9wcyBpbiBzb21lIFNlbGVuaXVtIGVudmlyb25tZW50c1xuICAgICAgICAvLyBjYW4gY2F1c2UgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXhjZXB0aW9uIChzZWUgcmF2ZW4tanMjNDk1KS5cbiAgICAgICAgLy8gQmFpbCBvbiB3cmFwcGluZyBhbmQgcmV0dXJuIHRoZSBmdW5jdGlvbiBhcy1pcyAoZGVmZXJzIHRvIHdpbmRvdy5vbmVycm9yKS5cbiAgICAgICAgcmV0dXJuIGZuO1xuICAgIH1cbiAgICB2YXIgc2VudHJ5V3JhcHBlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnNhZmUtYW55XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuICAgICAgICAgICAgaWYgKGJlZm9yZSAmJiB0eXBlb2YgYmVmb3JlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgd3JhcHBlZEFyZ3VtZW50cyA9IGFyZ3MubWFwKGZ1bmN0aW9uIChhcmcpIHsgcmV0dXJuIHdyYXAoYXJnLCBvcHRpb25zKTsgfSk7XG4gICAgICAgICAgICBpZiAoZm4uaGFuZGxlRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGludm9rZSB1c2VyLWxhbmQgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBJZiB5b3UgYXJlIGEgU2VudHJ5IHVzZXIsIGFuZCB5b3UgYXJlIHNlZWluZyB0aGlzIHN0YWNrIGZyYW1lLCBpdFxuICAgICAgICAgICAgICAgIC8vICAgICAgIG1lYW5zIHRoZSBzZW50cnkuamF2YXNjcmlwdCBTREsgY2F1Z2h0IGFuIGVycm9yIGludm9raW5nIHlvdXIgYXBwbGljYXRpb24gY29kZS4gVGhpc1xuICAgICAgICAgICAgICAgIC8vICAgICAgIGlzIGV4cGVjdGVkIGJlaGF2aW9yIGFuZCBOT1QgaW5kaWNhdGl2ZSBvZiBhIGJ1ZyB3aXRoIHNlbnRyeS5qYXZhc2NyaXB0LlxuICAgICAgICAgICAgICAgIHJldHVybiBmbi5oYW5kbGVFdmVudC5hcHBseSh0aGlzLCB3cmFwcGVkQXJndW1lbnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gaW52b2tlIHVzZXItbGFuZCBmdW5jdGlvblxuICAgICAgICAgICAgLy8gTk9URTogSWYgeW91IGFyZSBhIFNlbnRyeSB1c2VyLCBhbmQgeW91IGFyZSBzZWVpbmcgdGhpcyBzdGFjayBmcmFtZSwgaXRcbiAgICAgICAgICAgIC8vICAgICAgIG1lYW5zIHRoZSBzZW50cnkuamF2YXNjcmlwdCBTREsgY2F1Z2h0IGFuIGVycm9yIGludm9raW5nIHlvdXIgYXBwbGljYXRpb24gY29kZS4gVGhpc1xuICAgICAgICAgICAgLy8gICAgICAgaXMgZXhwZWN0ZWQgYmVoYXZpb3IgYW5kIE5PVCBpbmRpY2F0aXZlIG9mIGEgYnVnIHdpdGggc2VudHJ5LmphdmFzY3JpcHQuXG4gICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgd3JhcHBlZEFyZ3VtZW50cyk7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZW5hYmxlOm5vLXVuc2FmZS1hbnlcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGlnbm9yZU5leHRPbkVycm9yKCk7XG4gICAgICAgICAgICB3aXRoU2NvcGUoZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuYWRkRXZlbnRQcm9jZXNzb3IoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9jZXNzZWRFdmVudCA9IHRzbGliXzEuX19hc3NpZ24oe30sIGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubWVjaGFuaXNtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRFeGNlcHRpb25UeXBlVmFsdWUocHJvY2Vzc2VkRXZlbnQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEV4Y2VwdGlvbk1lY2hhbmlzbShwcm9jZXNzZWRFdmVudCwgb3B0aW9ucy5tZWNoYW5pc20pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEV2ZW50LmV4dHJhID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgcHJvY2Vzc2VkRXZlbnQuZXh0cmEsIHsgYXJndW1lbnRzOiBhcmdzIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkRXZlbnQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2FwdHVyZUV4Y2VwdGlvbihleCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBBY2Nlc3Npbmcgc29tZSBvYmplY3RzIG1heSB0aHJvd1xuICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdC9pc3N1ZXMvMTE2OFxuICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGZuKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZuLCBwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICBzZW50cnlXcmFwcGVkW3Byb3BlcnR5XSA9IGZuW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoX29PKSB7IH0gLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1lbXB0eVxuICAgIGZuLnByb3RvdHlwZSA9IGZuLnByb3RvdHlwZSB8fCB7fTtcbiAgICBzZW50cnlXcmFwcGVkLnByb3RvdHlwZSA9IGZuLnByb3RvdHlwZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICdfX3NlbnRyeV93cmFwcGVkX18nLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogc2VudHJ5V3JhcHBlZCxcbiAgICB9KTtcbiAgICAvLyBTaWduYWwgdGhhdCB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHdyYXBwZWQvZmlsbGVkIGFscmVhZHlcbiAgICAvLyBmb3IgYm90aCBkZWJ1Z2dpbmcgYW5kIHRvIHByZXZlbnQgaXQgdG8gYmVpbmcgd3JhcHBlZC9maWxsZWQgdHdpY2VcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzZW50cnlXcmFwcGVkLCB7XG4gICAgICAgIF9fc2VudHJ5X186IHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIF9fc2VudHJ5X29yaWdpbmFsX186IHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IGZuLFxuICAgICAgICB9LFxuICAgIH0pO1xuICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgZnVuY3Rpb24gbmFtZSAobm90IGFsbCBicm93c2VycyBhbGxvdyB0aGF0KVxuICAgIHRyeSB7XG4gICAgICAgIHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzZW50cnlXcmFwcGVkLCAnbmFtZScpO1xuICAgICAgICBpZiAoZGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZW50cnlXcmFwcGVkLCAnbmFtZScsIHtcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLm5hbWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChfb08pIHtcbiAgICAgICAgLypuby1lbXB0eSovXG4gICAgfVxuICAgIHJldHVybiBzZW50cnlXcmFwcGVkO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGVscGVycy5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuZXhwb3J0ICogZnJvbSAnLi9leHBvcnRzJztcbmltcG9ydCB7IEludGVncmF0aW9ucyBhcyBDb3JlSW50ZWdyYXRpb25zIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0ICogYXMgQnJvd3NlckludGVncmF0aW9ucyBmcm9tICcuL2ludGVncmF0aW9ucyc7XG5pbXBvcnQgKiBhcyBUcmFuc3BvcnRzIGZyb20gJy4vdHJhbnNwb3J0cyc7XG52YXIgd2luZG93SW50ZWdyYXRpb25zID0ge307XG4vLyBUaGlzIGJsb2NrIGlzIG5lZWRlZCB0byBhZGQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBpbnRlZ3JhdGlvbnMgcGFja2FnZXMgd2hlbiB1c2VkIHdpdGggYSBDRE5cbi8vIHRzbGludDpkaXNhYmxlOiBuby11bnNhZmUtYW55XG52YXIgX3dpbmRvdyA9IGdldEdsb2JhbE9iamVjdCgpO1xuaWYgKF93aW5kb3cuU2VudHJ5ICYmIF93aW5kb3cuU2VudHJ5LkludGVncmF0aW9ucykge1xuICAgIHdpbmRvd0ludGVncmF0aW9ucyA9IF93aW5kb3cuU2VudHJ5LkludGVncmF0aW9ucztcbn1cbi8vIHRzbGludDplbmFibGU6IG5vLXVuc2FmZS1hbnlcbnZhciBJTlRFR1JBVElPTlMgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB3aW5kb3dJbnRlZ3JhdGlvbnMsIENvcmVJbnRlZ3JhdGlvbnMsIEJyb3dzZXJJbnRlZ3JhdGlvbnMpO1xuZXhwb3J0IHsgSU5URUdSQVRJT05TIGFzIEludGVncmF0aW9ucywgVHJhbnNwb3J0cyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGdldEN1cnJlbnRIdWIgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgU2V2ZXJpdHkgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIsIGdldEV2ZW50RGVzY3JpcHRpb24sIGdldEdsb2JhbE9iamVjdCwgaHRtbFRyZWVBc1N0cmluZywgcGFyc2VVcmwsIHNhZmVKb2luLCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuLyoqXG4gKiBEZWZhdWx0IEJyZWFkY3J1bWJzIGluc3RydW1lbnRhdGlvbnNcbiAqIFRPRE86IERlcHJlY2F0ZWQgLSB3aXRoIHY2LCB0aGlzIHdpbGwgYmUgcmVuYW1lZCB0byBgSW5zdHJ1bWVudGBcbiAqL1xudmFyIEJyZWFkY3J1bWJzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgZnVuY3Rpb24gQnJlYWRjcnVtYnMob3B0aW9ucykge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGluaGVyaXREb2NcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmFtZSA9IEJyZWFkY3J1bWJzLmlkO1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gdHNsaWJfMS5fX2Fzc2lnbih7IGNvbnNvbGU6IHRydWUsIGRvbTogdHJ1ZSwgZmV0Y2g6IHRydWUsIGhpc3Rvcnk6IHRydWUsIHNlbnRyeTogdHJ1ZSwgeGhyOiB0cnVlIH0sIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBicmVhZGNydW1iIG9mIGBzZW50cnlgIGZyb20gdGhlIGV2ZW50cyB0aGVtc2VsdmVzXG4gICAgICovXG4gICAgQnJlYWRjcnVtYnMucHJvdG90eXBlLmFkZFNlbnRyeUJyZWFkY3J1bWIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9vcHRpb25zLnNlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGdldEN1cnJlbnRIdWIoKS5hZGRCcmVhZGNydW1iKHtcbiAgICAgICAgICAgIGNhdGVnb3J5OiBcInNlbnRyeS5cIiArIChldmVudC50eXBlID09PSAndHJhbnNhY3Rpb24nID8gJ3RyYW5zYWN0aW9uJyA6ICdldmVudCcpLFxuICAgICAgICAgICAgZXZlbnRfaWQ6IGV2ZW50LmV2ZW50X2lkLFxuICAgICAgICAgICAgbGV2ZWw6IGV2ZW50LmxldmVsLFxuICAgICAgICAgICAgbWVzc2FnZTogZ2V0RXZlbnREZXNjcmlwdGlvbihldmVudCksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGJyZWFkY3J1bWJzIGZyb20gY29uc29sZSBBUEkgY2FsbHNcbiAgICAgKi9cbiAgICBCcmVhZGNydW1icy5wcm90b3R5cGUuX2NvbnNvbGVCcmVhZGNydW1iID0gZnVuY3Rpb24gKGhhbmRsZXJEYXRhKSB7XG4gICAgICAgIHZhciBicmVhZGNydW1iID0ge1xuICAgICAgICAgICAgY2F0ZWdvcnk6ICdjb25zb2xlJyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBhcmd1bWVudHM6IGhhbmRsZXJEYXRhLmFyZ3MsXG4gICAgICAgICAgICAgICAgbG9nZ2VyOiAnY29uc29sZScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGV2ZWw6IFNldmVyaXR5LmZyb21TdHJpbmcoaGFuZGxlckRhdGEubGV2ZWwpLFxuICAgICAgICAgICAgbWVzc2FnZTogc2FmZUpvaW4oaGFuZGxlckRhdGEuYXJncywgJyAnKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGhhbmRsZXJEYXRhLmxldmVsID09PSAnYXNzZXJ0Jykge1xuICAgICAgICAgICAgaWYgKGhhbmRsZXJEYXRhLmFyZ3NbMF0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgYnJlYWRjcnVtYi5tZXNzYWdlID0gXCJBc3NlcnRpb24gZmFpbGVkOiBcIiArIChzYWZlSm9pbihoYW5kbGVyRGF0YS5hcmdzLnNsaWNlKDEpLCAnICcpIHx8ICdjb25zb2xlLmFzc2VydCcpO1xuICAgICAgICAgICAgICAgIGJyZWFkY3J1bWIuZGF0YS5hcmd1bWVudHMgPSBoYW5kbGVyRGF0YS5hcmdzLnNsaWNlKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgY2FwdHVyZSBhIGJyZWFkY3J1bWIgZm9yIHBhc3NlZCBhc3NlcnRpb25zXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldEN1cnJlbnRIdWIoKS5hZGRCcmVhZGNydW1iKGJyZWFkY3J1bWIsIHtcbiAgICAgICAgICAgIGlucHV0OiBoYW5kbGVyRGF0YS5hcmdzLFxuICAgICAgICAgICAgbGV2ZWw6IGhhbmRsZXJEYXRhLmxldmVsLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYnJlYWRjcnVtYnMgZnJvbSBET00gQVBJIGNhbGxzXG4gICAgICovXG4gICAgQnJlYWRjcnVtYnMucHJvdG90eXBlLl9kb21CcmVhZGNydW1iID0gZnVuY3Rpb24gKGhhbmRsZXJEYXRhKSB7XG4gICAgICAgIHZhciB0YXJnZXQ7XG4gICAgICAgIC8vIEFjY2Vzc2luZyBldmVudC50YXJnZXQgY2FuIHRocm93IChzZWUgZ2V0c2VudHJ5L3JhdmVuLWpzIzgzOCwgIzc2OClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRhcmdldCA9IGhhbmRsZXJEYXRhLmV2ZW50LnRhcmdldFxuICAgICAgICAgICAgICAgID8gaHRtbFRyZWVBc1N0cmluZyhoYW5kbGVyRGF0YS5ldmVudC50YXJnZXQpXG4gICAgICAgICAgICAgICAgOiBodG1sVHJlZUFzU3RyaW5nKGhhbmRsZXJEYXRhLmV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGFyZ2V0ID0gJzx1bmtub3duPic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnZXRDdXJyZW50SHViKCkuYWRkQnJlYWRjcnVtYih7XG4gICAgICAgICAgICBjYXRlZ29yeTogXCJ1aS5cIiArIGhhbmRsZXJEYXRhLm5hbWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0YXJnZXQsXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGV2ZW50OiBoYW5kbGVyRGF0YS5ldmVudCxcbiAgICAgICAgICAgIG5hbWU6IGhhbmRsZXJEYXRhLm5hbWUsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBicmVhZGNydW1icyBmcm9tIFhIUiBBUEkgY2FsbHNcbiAgICAgKi9cbiAgICBCcmVhZGNydW1icy5wcm90b3R5cGUuX3hockJyZWFkY3J1bWIgPSBmdW5jdGlvbiAoaGFuZGxlckRhdGEpIHtcbiAgICAgICAgaWYgKGhhbmRsZXJEYXRhLmVuZFRpbWVzdGFtcCkge1xuICAgICAgICAgICAgLy8gV2Ugb25seSBjYXB0dXJlIGNvbXBsZXRlLCBub24tc2VudHJ5IHJlcXVlc3RzXG4gICAgICAgICAgICBpZiAoaGFuZGxlckRhdGEueGhyLl9fc2VudHJ5X293bl9yZXF1ZXN0X18pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnZXRDdXJyZW50SHViKCkuYWRkQnJlYWRjcnVtYih7XG4gICAgICAgICAgICAgICAgY2F0ZWdvcnk6ICd4aHInLFxuICAgICAgICAgICAgICAgIGRhdGE6IGhhbmRsZXJEYXRhLnhoci5fX3NlbnRyeV94aHJfXyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnaHR0cCcsXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgeGhyOiBoYW5kbGVyRGF0YS54aHIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBicmVhZGNydW1icyBmcm9tIGZldGNoIEFQSSBjYWxsc1xuICAgICAqL1xuICAgIEJyZWFkY3J1bWJzLnByb3RvdHlwZS5fZmV0Y2hCcmVhZGNydW1iID0gZnVuY3Rpb24gKGhhbmRsZXJEYXRhKSB7XG4gICAgICAgIC8vIFdlIG9ubHkgY2FwdHVyZSBjb21wbGV0ZSBmZXRjaCByZXF1ZXN0c1xuICAgICAgICBpZiAoIWhhbmRsZXJEYXRhLmVuZFRpbWVzdGFtcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYW5kbGVyRGF0YS5mZXRjaERhdGEudXJsLm1hdGNoKC9zZW50cnlfa2V5LykgJiYgaGFuZGxlckRhdGEuZmV0Y2hEYXRhLm1ldGhvZCA9PT0gJ1BPU1QnKSB7XG4gICAgICAgICAgICAvLyBXZSB3aWxsIG5vdCBjcmVhdGUgYnJlYWRjcnVtYnMgZm9yIGZldGNoIHJlcXVlc3RzIHRoYXQgY29udGFpbiBgc2VudHJ5X2tleWAgKGludGVybmFsIHNlbnRyeSByZXF1ZXN0cylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFuZGxlckRhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgIGdldEN1cnJlbnRIdWIoKS5hZGRCcmVhZGNydW1iKHtcbiAgICAgICAgICAgICAgICBjYXRlZ29yeTogJ2ZldGNoJyxcbiAgICAgICAgICAgICAgICBkYXRhOiBoYW5kbGVyRGF0YS5mZXRjaERhdGEsXG4gICAgICAgICAgICAgICAgbGV2ZWw6IFNldmVyaXR5LkVycm9yLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdodHRwJyxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBoYW5kbGVyRGF0YS5lcnJvcixcbiAgICAgICAgICAgICAgICBpbnB1dDogaGFuZGxlckRhdGEuYXJncyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ2V0Q3VycmVudEh1YigpLmFkZEJyZWFkY3J1bWIoe1xuICAgICAgICAgICAgICAgIGNhdGVnb3J5OiAnZmV0Y2gnLFxuICAgICAgICAgICAgICAgIGRhdGE6IHRzbGliXzEuX19hc3NpZ24oe30sIGhhbmRsZXJEYXRhLmZldGNoRGF0YSwgeyBzdGF0dXNfY29kZTogaGFuZGxlckRhdGEucmVzcG9uc2Uuc3RhdHVzIH0pLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdodHRwJyxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBpbnB1dDogaGFuZGxlckRhdGEuYXJncyxcbiAgICAgICAgICAgICAgICByZXNwb25zZTogaGFuZGxlckRhdGEucmVzcG9uc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBicmVhZGNydW1icyBmcm9tIGhpc3RvcnkgQVBJIGNhbGxzXG4gICAgICovXG4gICAgQnJlYWRjcnVtYnMucHJvdG90eXBlLl9oaXN0b3J5QnJlYWRjcnVtYiA9IGZ1bmN0aW9uIChoYW5kbGVyRGF0YSkge1xuICAgICAgICB2YXIgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG4gICAgICAgIHZhciBmcm9tID0gaGFuZGxlckRhdGEuZnJvbTtcbiAgICAgICAgdmFyIHRvID0gaGFuZGxlckRhdGEudG87XG4gICAgICAgIHZhciBwYXJzZWRMb2MgPSBwYXJzZVVybChnbG9iYWwubG9jYXRpb24uaHJlZik7XG4gICAgICAgIHZhciBwYXJzZWRGcm9tID0gcGFyc2VVcmwoZnJvbSk7XG4gICAgICAgIHZhciBwYXJzZWRUbyA9IHBhcnNlVXJsKHRvKTtcbiAgICAgICAgLy8gSW5pdGlhbCBwdXNoU3RhdGUgZG9lc24ndCBwcm92aWRlIGBmcm9tYCBpbmZvcm1hdGlvblxuICAgICAgICBpZiAoIXBhcnNlZEZyb20ucGF0aCkge1xuICAgICAgICAgICAgcGFyc2VkRnJvbSA9IHBhcnNlZExvYztcbiAgICAgICAgfVxuICAgICAgICAvLyBVc2Ugb25seSB0aGUgcGF0aCBjb21wb25lbnQgb2YgdGhlIFVSTCBpZiB0aGUgVVJMIG1hdGNoZXMgdGhlIGN1cnJlbnRcbiAgICAgICAgLy8gZG9jdW1lbnQgKGFsbW9zdCBhbGwgdGhlIHRpbWUgd2hlbiB1c2luZyBwdXNoU3RhdGUpXG4gICAgICAgIGlmIChwYXJzZWRMb2MucHJvdG9jb2wgPT09IHBhcnNlZFRvLnByb3RvY29sICYmIHBhcnNlZExvYy5ob3N0ID09PSBwYXJzZWRUby5ob3N0KSB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tcGFyYW1ldGVyLXJlYXNzaWdubWVudFxuICAgICAgICAgICAgdG8gPSBwYXJzZWRUby5yZWxhdGl2ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkTG9jLnByb3RvY29sID09PSBwYXJzZWRGcm9tLnByb3RvY29sICYmIHBhcnNlZExvYy5ob3N0ID09PSBwYXJzZWRGcm9tLmhvc3QpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1wYXJhbWV0ZXItcmVhc3NpZ25tZW50XG4gICAgICAgICAgICBmcm9tID0gcGFyc2VkRnJvbS5yZWxhdGl2ZTtcbiAgICAgICAgfVxuICAgICAgICBnZXRDdXJyZW50SHViKCkuYWRkQnJlYWRjcnVtYih7XG4gICAgICAgICAgICBjYXRlZ29yeTogJ25hdmlnYXRpb24nLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGZyb206IGZyb20sXG4gICAgICAgICAgICAgICAgdG86IHRvLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnN0cnVtZW50IGJyb3dzZXIgYnVpbHQtaW5zIHcvIGJyZWFkY3J1bWIgY2FwdHVyaW5nXG4gICAgICogIC0gQ29uc29sZSBBUElcbiAgICAgKiAgLSBET00gQVBJIChjbGljay90eXBpbmcpXG4gICAgICogIC0gWE1MSHR0cFJlcXVlc3QgQVBJXG4gICAgICogIC0gRmV0Y2ggQVBJXG4gICAgICogIC0gSGlzdG9yeSBBUElcbiAgICAgKi9cbiAgICBCcmVhZGNydW1icy5wcm90b3R5cGUuc2V0dXBPbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5jb25zb2xlKSB7XG4gICAgICAgICAgICBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyKHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9jb25zb2xlQnJlYWRjcnVtYi5hcHBseShfdGhpcywgdHNsaWJfMS5fX3NwcmVhZChhcmdzKSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnY29uc29sZScsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5kb20pIHtcbiAgICAgICAgICAgIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2RvbUJyZWFkY3J1bWIuYXBwbHkoX3RoaXMsIHRzbGliXzEuX19zcHJlYWQoYXJncykpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHlwZTogJ2RvbScsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy54aHIpIHtcbiAgICAgICAgICAgIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3hockJyZWFkY3J1bWIuYXBwbHkoX3RoaXMsIHRzbGliXzEuX19zcHJlYWQoYXJncykpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHlwZTogJ3hocicsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5mZXRjaCkge1xuICAgICAgICAgICAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZmV0Y2hCcmVhZGNydW1iLmFwcGx5KF90aGlzLCB0c2xpYl8xLl9fc3ByZWFkKGFyZ3MpKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHR5cGU6ICdmZXRjaCcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5oaXN0b3J5KSB7XG4gICAgICAgICAgICBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyKHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9oaXN0b3J5QnJlYWRjcnVtYi5hcHBseShfdGhpcywgdHNsaWJfMS5fX3NwcmVhZChhcmdzKSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnaGlzdG9yeScsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBCcmVhZGNydW1icy5pZCA9ICdCcmVhZGNydW1icyc7XG4gICAgcmV0dXJuIEJyZWFkY3J1bWJzO1xufSgpKTtcbmV4cG9ydCB7IEJyZWFkY3J1bWJzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icmVhZGNydW1icy5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBTZXZlcml0eSB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgYWRkRXhjZXB0aW9uTWVjaGFuaXNtLCBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyLCBnZXRMb2NhdGlvbkhyZWYsIGlzRXJyb3JFdmVudCwgaXNQcmltaXRpdmUsIGlzU3RyaW5nLCBsb2dnZXIsIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBldmVudEZyb21Vbmtub3duSW5wdXQgfSBmcm9tICcuLi9ldmVudGJ1aWxkZXInO1xuaW1wb3J0IHsgc2hvdWxkSWdub3JlT25FcnJvciB9IGZyb20gJy4uL2hlbHBlcnMnO1xuLyoqIEdsb2JhbCBoYW5kbGVycyAqL1xudmFyIEdsb2JhbEhhbmRsZXJzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIGZ1bmN0aW9uIEdsb2JhbEhhbmRsZXJzKG9wdGlvbnMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbmhlcml0RG9jXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5hbWUgPSBHbG9iYWxIYW5kbGVycy5pZDtcbiAgICAgICAgLyoqIEpTRG9jICovXG4gICAgICAgIHRoaXMuX29uRXJyb3JIYW5kbGVySW5zdGFsbGVkID0gZmFsc2U7XG4gICAgICAgIC8qKiBKU0RvYyAqL1xuICAgICAgICB0aGlzLl9vblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXJJbnN0YWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IHRzbGliXzEuX19hc3NpZ24oeyBvbmVycm9yOiB0cnVlLCBvbnVuaGFuZGxlZHJlamVjdGlvbjogdHJ1ZSB9LCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBHbG9iYWxIYW5kbGVycy5wcm90b3R5cGUuc2V0dXBPbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBFcnJvci5zdGFja1RyYWNlTGltaXQgPSA1MDtcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMub25lcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmxvZygnR2xvYmFsIEhhbmRsZXIgYXR0YWNoZWQ6IG9uZXJyb3InKTtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbGxHbG9iYWxPbkVycm9ySGFuZGxlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLm9udW5oYW5kbGVkcmVqZWN0aW9uKSB7XG4gICAgICAgICAgICBsb2dnZXIubG9nKCdHbG9iYWwgSGFuZGxlciBhdHRhY2hlZDogb251bmhhbmRsZWRyZWplY3Rpb24nKTtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbGxHbG9iYWxPblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgR2xvYmFsSGFuZGxlcnMucHJvdG90eXBlLl9pbnN0YWxsR2xvYmFsT25FcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLl9vbkVycm9ySGFuZGxlckluc3RhbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZGF0YS5lcnJvcjtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudEh1YiA9IGdldEN1cnJlbnRIdWIoKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzSW50ZWdyYXRpb24gPSBjdXJyZW50SHViLmdldEludGVncmF0aW9uKEdsb2JhbEhhbmRsZXJzKTtcbiAgICAgICAgICAgICAgICB2YXIgaXNGYWlsZWRPd25EZWxpdmVyeSA9IGVycm9yICYmIGVycm9yLl9fc2VudHJ5X293bl9yZXF1ZXN0X18gPT09IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNJbnRlZ3JhdGlvbiB8fCBzaG91bGRJZ25vcmVPbkVycm9yKCkgfHwgaXNGYWlsZWRPd25EZWxpdmVyeSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBjbGllbnQgPSBjdXJyZW50SHViLmdldENsaWVudCgpO1xuICAgICAgICAgICAgICAgIHZhciBldmVudCA9IGlzUHJpbWl0aXZlKGVycm9yKVxuICAgICAgICAgICAgICAgICAgICA/IF90aGlzLl9ldmVudEZyb21JbmNvbXBsZXRlT25FcnJvcihkYXRhLm1zZywgZGF0YS51cmwsIGRhdGEubGluZSwgZGF0YS5jb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgIDogX3RoaXMuX2VuaGFuY2VFdmVudFdpdGhJbml0aWFsRnJhbWUoZXZlbnRGcm9tVW5rbm93bklucHV0KGVycm9yLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaFN0YWNrdHJhY2U6IGNsaWVudCAmJiBjbGllbnQuZ2V0T3B0aW9ucygpLmF0dGFjaFN0YWNrdHJhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3Rpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9KSwgZGF0YS51cmwsIGRhdGEubGluZSwgZGF0YS5jb2x1bW4pO1xuICAgICAgICAgICAgICAgIGFkZEV4Y2VwdGlvbk1lY2hhbmlzbShldmVudCwge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29uZXJyb3InLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRIdWIuY2FwdHVyZUV2ZW50KGV2ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRXhjZXB0aW9uOiBlcnJvcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fb25FcnJvckhhbmRsZXJJbnN0YWxsZWQgPSB0cnVlO1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgR2xvYmFsSGFuZGxlcnMucHJvdG90eXBlLl9pbnN0YWxsR2xvYmFsT25VbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5fb25VbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVySW5zdGFsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBlO1xuICAgICAgICAgICAgICAgIC8vIGRpZyB0aGUgb2JqZWN0IG9mIHRoZSByZWplY3Rpb24gb3V0IG9mIGtub3duIGV2ZW50IHR5cGVzXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJvbWlzZVJlamVjdGlvbkV2ZW50cyBzdG9yZSB0aGUgb2JqZWN0IG9mIHRoZSByZWplY3Rpb24gdW5kZXIgJ3JlYXNvbidcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qcm9taXNlUmVqZWN0aW9uRXZlbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKCdyZWFzb24nIGluIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZS5yZWFzb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nLCBzb21ld2hlcmUsIChsaWtlbHkgYSBicm93c2VyIGV4dGVuc2lvbikgZWZmZWN0aXZlbHkgY2FzdHMgUHJvbWlzZVJlamVjdGlvbkV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAvLyB0byBDdXN0b21FdmVudHMsIG1vdmluZyB0aGUgYHByb21pc2VgIGFuZCBgcmVhc29uYCBhdHRyaWJ1dGVzIG9mIHRoZSBQUkUgaW50b1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgQ3VzdG9tRXZlbnQncyBgZGV0YWlsYCBhdHRyaWJ1dGUsIHNpbmNlIHRoZXkncmUgbm90IHBhcnQgb2YgQ3VzdG9tRXZlbnQncyBzcGVjXG4gICAgICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ3VzdG9tRXZlbnQgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzIzODBcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJ2RldGFpbCcgaW4gZSAmJiAncmVhc29uJyBpbiBlLmRldGFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlLmRldGFpbC5yZWFzb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF9vTykge1xuICAgICAgICAgICAgICAgICAgICAvLyBuby1lbXB0eVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudEh1YiA9IGdldEN1cnJlbnRIdWIoKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzSW50ZWdyYXRpb24gPSBjdXJyZW50SHViLmdldEludGVncmF0aW9uKEdsb2JhbEhhbmRsZXJzKTtcbiAgICAgICAgICAgICAgICB2YXIgaXNGYWlsZWRPd25EZWxpdmVyeSA9IGVycm9yICYmIGVycm9yLl9fc2VudHJ5X293bl9yZXF1ZXN0X18gPT09IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNJbnRlZ3JhdGlvbiB8fCBzaG91bGRJZ25vcmVPbkVycm9yKCkgfHwgaXNGYWlsZWRPd25EZWxpdmVyeSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGNsaWVudCA9IGN1cnJlbnRIdWIuZ2V0Q2xpZW50KCk7XG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50ID0gaXNQcmltaXRpdmUoZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgID8gX3RoaXMuX2V2ZW50RnJvbUluY29tcGxldGVSZWplY3Rpb24oZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIDogZXZlbnRGcm9tVW5rbm93bklucHV0KGVycm9yLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaFN0YWNrdHJhY2U6IGNsaWVudCAmJiBjbGllbnQuZ2V0T3B0aW9ucygpLmF0dGFjaFN0YWNrdHJhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3Rpb246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGV2ZW50LmxldmVsID0gU2V2ZXJpdHkuRXJyb3I7XG4gICAgICAgICAgICAgICAgYWRkRXhjZXB0aW9uTWVjaGFuaXNtKGV2ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnb251bmhhbmRsZWRyZWplY3Rpb24nLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRIdWIuY2FwdHVyZUV2ZW50KGV2ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRXhjZXB0aW9uOiBlcnJvcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHlwZTogJ3VuaGFuZGxlZHJlamVjdGlvbicsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9vblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXJJbnN0YWxsZWQgPSB0cnVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgc3RhY2sgZnJvbSBhbiBvbGQsIGVycm9yLWxlc3Mgb25lcnJvciBoYW5kbGVyLlxuICAgICAqL1xuICAgIEdsb2JhbEhhbmRsZXJzLnByb3RvdHlwZS5fZXZlbnRGcm9tSW5jb21wbGV0ZU9uRXJyb3IgPSBmdW5jdGlvbiAobXNnLCB1cmwsIGxpbmUsIGNvbHVtbikge1xuICAgICAgICB2YXIgRVJST1JfVFlQRVNfUkUgPSAvXig/OltVdV1uY2F1Z2h0ICg/OmV4Y2VwdGlvbjogKT8pPyg/OigoPzpFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkl8KUVycm9yKTogKT8oLiopJC9pO1xuICAgICAgICAvLyBJZiAnbWVzc2FnZScgaXMgRXJyb3JFdmVudCwgZ2V0IHJlYWwgbWVzc2FnZSBmcm9tIGluc2lkZVxuICAgICAgICB2YXIgbWVzc2FnZSA9IGlzRXJyb3JFdmVudChtc2cpID8gbXNnLm1lc3NhZ2UgOiBtc2c7XG4gICAgICAgIHZhciBuYW1lO1xuICAgICAgICBpZiAoaXNTdHJpbmcobWVzc2FnZSkpIHtcbiAgICAgICAgICAgIHZhciBncm91cHMgPSBtZXNzYWdlLm1hdGNoKEVSUk9SX1RZUEVTX1JFKTtcbiAgICAgICAgICAgIGlmIChncm91cHMpIHtcbiAgICAgICAgICAgICAgICBuYW1lID0gZ3JvdXBzWzFdO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBncm91cHNbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGV2ZW50ID0ge1xuICAgICAgICAgICAgZXhjZXB0aW9uOiB7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG5hbWUgfHwgJ0Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZUV2ZW50V2l0aEluaXRpYWxGcmFtZShldmVudCwgdXJsLCBsaW5lLCBjb2x1bW4pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGFuIEV2ZW50IGZyb20gYW4gVHJhY2VLaXRTdGFja1RyYWNlIHRoYXQgaGFzIHBhcnQgb2YgaXQgbWlzc2luZy5cbiAgICAgKi9cbiAgICBHbG9iYWxIYW5kbGVycy5wcm90b3R5cGUuX2V2ZW50RnJvbUluY29tcGxldGVSZWplY3Rpb24gPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4Y2VwdGlvbjoge1xuICAgICAgICAgICAgICAgIHZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVW5oYW5kbGVkUmVqZWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcIk5vbi1FcnJvciBwcm9taXNlIHJlamVjdGlvbiBjYXB0dXJlZCB3aXRoIHZhbHVlOiBcIiArIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgR2xvYmFsSGFuZGxlcnMucHJvdG90eXBlLl9lbmhhbmNlRXZlbnRXaXRoSW5pdGlhbEZyYW1lID0gZnVuY3Rpb24gKGV2ZW50LCB1cmwsIGxpbmUsIGNvbHVtbikge1xuICAgICAgICBldmVudC5leGNlcHRpb24gPSBldmVudC5leGNlcHRpb24gfHwge307XG4gICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgPSBldmVudC5leGNlcHRpb24udmFsdWVzIHx8IFtdO1xuICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXSB8fCB7fTtcbiAgICAgICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5zdGFja3RyYWNlID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5zdGFja3RyYWNlIHx8IHt9O1xuICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnN0YWNrdHJhY2UuZnJhbWVzID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5zdGFja3RyYWNlLmZyYW1lcyB8fCBbXTtcbiAgICAgICAgdmFyIGNvbG5vID0gaXNOYU4ocGFyc2VJbnQoY29sdW1uLCAxMCkpID8gdW5kZWZpbmVkIDogY29sdW1uO1xuICAgICAgICB2YXIgbGluZW5vID0gaXNOYU4ocGFyc2VJbnQobGluZSwgMTApKSA/IHVuZGVmaW5lZCA6IGxpbmU7XG4gICAgICAgIHZhciBmaWxlbmFtZSA9IGlzU3RyaW5nKHVybCkgJiYgdXJsLmxlbmd0aCA+IDAgPyB1cmwgOiBnZXRMb2NhdGlvbkhyZWYoKTtcbiAgICAgICAgaWYgKGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0uc3RhY2t0cmFjZS5mcmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnN0YWNrdHJhY2UuZnJhbWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvbG5vOiBjb2xubyxcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb246ICc/JyxcbiAgICAgICAgICAgICAgICBpbl9hcHA6IHRydWUsXG4gICAgICAgICAgICAgICAgbGluZW5vOiBsaW5lbm8sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEdsb2JhbEhhbmRsZXJzLmlkID0gJ0dsb2JhbEhhbmRsZXJzJztcbiAgICByZXR1cm4gR2xvYmFsSGFuZGxlcnM7XG59KCkpO1xuZXhwb3J0IHsgR2xvYmFsSGFuZGxlcnMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdsb2JhbGhhbmRsZXJzLmpzLm1hcCIsImV4cG9ydCB7IEdsb2JhbEhhbmRsZXJzIH0gZnJvbSAnLi9nbG9iYWxoYW5kbGVycyc7XG5leHBvcnQgeyBUcnlDYXRjaCB9IGZyb20gJy4vdHJ5Y2F0Y2gnO1xuZXhwb3J0IHsgQnJlYWRjcnVtYnMgfSBmcm9tICcuL2JyZWFkY3J1bWJzJztcbmV4cG9ydCB7IExpbmtlZEVycm9ycyB9IGZyb20gJy4vbGlua2VkZXJyb3JzJztcbmV4cG9ydCB7IFVzZXJBZ2VudCB9IGZyb20gJy4vdXNlcmFnZW50Jztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBhZGRHbG9iYWxFdmVudFByb2Nlc3NvciwgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBpc0luc3RhbmNlT2YgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IGV4Y2VwdGlvbkZyb21TdGFja3RyYWNlIH0gZnJvbSAnLi4vcGFyc2Vycyc7XG5pbXBvcnQgeyBjb21wdXRlU3RhY2tUcmFjZSB9IGZyb20gJy4uL3RyYWNla2l0JztcbnZhciBERUZBVUxUX0tFWSA9ICdjYXVzZSc7XG52YXIgREVGQVVMVF9MSU1JVCA9IDU7XG4vKiogQWRkcyBTREsgaW5mbyB0byBhbiBldmVudC4gKi9cbnZhciBMaW5rZWRFcnJvcnMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMaW5rZWRFcnJvcnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGluaGVyaXREb2NcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmFtZSA9IExpbmtlZEVycm9ycy5pZDtcbiAgICAgICAgdGhpcy5fa2V5ID0gb3B0aW9ucy5rZXkgfHwgREVGQVVMVF9LRVk7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gb3B0aW9ucy5saW1pdCB8fCBERUZBVUxUX0xJTUlUO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIExpbmtlZEVycm9ycy5wcm90b3R5cGUuc2V0dXBPbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcihmdW5jdGlvbiAoZXZlbnQsIGhpbnQpIHtcbiAgICAgICAgICAgIHZhciBzZWxmID0gZ2V0Q3VycmVudEh1YigpLmdldEludGVncmF0aW9uKExpbmtlZEVycm9ycyk7XG4gICAgICAgICAgICBpZiAoc2VsZikge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9oYW5kbGVyKGV2ZW50LCBoaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBldmVudDtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIExpbmtlZEVycm9ycy5wcm90b3R5cGUuX2hhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGhpbnQpIHtcbiAgICAgICAgaWYgKCFldmVudC5leGNlcHRpb24gfHwgIWV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgfHwgIWhpbnQgfHwgIWlzSW5zdGFuY2VPZihoaW50Lm9yaWdpbmFsRXhjZXB0aW9uLCBFcnJvcikpIHtcbiAgICAgICAgICAgIHJldHVybiBldmVudDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGlua2VkRXJyb3JzID0gdGhpcy5fd2Fsa0Vycm9yVHJlZShoaW50Lm9yaWdpbmFsRXhjZXB0aW9uLCB0aGlzLl9rZXkpO1xuICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzID0gdHNsaWJfMS5fX3NwcmVhZChsaW5rZWRFcnJvcnMsIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMpO1xuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIExpbmtlZEVycm9ycy5wcm90b3R5cGUuX3dhbGtFcnJvclRyZWUgPSBmdW5jdGlvbiAoZXJyb3IsIGtleSwgc3RhY2spIHtcbiAgICAgICAgaWYgKHN0YWNrID09PSB2b2lkIDApIHsgc3RhY2sgPSBbXTsgfVxuICAgICAgICBpZiAoIWlzSW5zdGFuY2VPZihlcnJvcltrZXldLCBFcnJvcikgfHwgc3RhY2subGVuZ3RoICsgMSA+PSB0aGlzLl9saW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YWNrO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdGFja3RyYWNlID0gY29tcHV0ZVN0YWNrVHJhY2UoZXJyb3Jba2V5XSk7XG4gICAgICAgIHZhciBleGNlcHRpb24gPSBleGNlcHRpb25Gcm9tU3RhY2t0cmFjZShzdGFja3RyYWNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dhbGtFcnJvclRyZWUoZXJyb3Jba2V5XSwga2V5LCB0c2xpYl8xLl9fc3ByZWFkKFtleGNlcHRpb25dLCBzdGFjaykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBMaW5rZWRFcnJvcnMuaWQgPSAnTGlua2VkRXJyb3JzJztcbiAgICByZXR1cm4gTGlua2VkRXJyb3JzO1xufSgpKTtcbmV4cG9ydCB7IExpbmtlZEVycm9ycyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGlua2VkZXJyb3JzLmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBmaWxsLCBnZXRGdW5jdGlvbk5hbWUsIGdldEdsb2JhbE9iamVjdCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgd3JhcCB9IGZyb20gJy4uL2hlbHBlcnMnO1xudmFyIERFRkFVTFRfRVZFTlRfVEFSR0VUID0gW1xuICAgICdFdmVudFRhcmdldCcsXG4gICAgJ1dpbmRvdycsXG4gICAgJ05vZGUnLFxuICAgICdBcHBsaWNhdGlvbkNhY2hlJyxcbiAgICAnQXVkaW9UcmFja0xpc3QnLFxuICAgICdDaGFubmVsTWVyZ2VyTm9kZScsXG4gICAgJ0NyeXB0b09wZXJhdGlvbicsXG4gICAgJ0V2ZW50U291cmNlJyxcbiAgICAnRmlsZVJlYWRlcicsXG4gICAgJ0hUTUxVbmtub3duRWxlbWVudCcsXG4gICAgJ0lEQkRhdGFiYXNlJyxcbiAgICAnSURCUmVxdWVzdCcsXG4gICAgJ0lEQlRyYW5zYWN0aW9uJyxcbiAgICAnS2V5T3BlcmF0aW9uJyxcbiAgICAnTWVkaWFDb250cm9sbGVyJyxcbiAgICAnTWVzc2FnZVBvcnQnLFxuICAgICdNb2RhbFdpbmRvdycsXG4gICAgJ05vdGlmaWNhdGlvbicsXG4gICAgJ1NWR0VsZW1lbnRJbnN0YW5jZScsXG4gICAgJ1NjcmVlbicsXG4gICAgJ1RleHRUcmFjaycsXG4gICAgJ1RleHRUcmFja0N1ZScsXG4gICAgJ1RleHRUcmFja0xpc3QnLFxuICAgICdXZWJTb2NrZXQnLFxuICAgICdXZWJTb2NrZXRXb3JrZXInLFxuICAgICdXb3JrZXInLFxuICAgICdYTUxIdHRwUmVxdWVzdCcsXG4gICAgJ1hNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQnLFxuICAgICdYTUxIdHRwUmVxdWVzdFVwbG9hZCcsXG5dO1xuLyoqIFdyYXAgdGltZXIgZnVuY3Rpb25zIGFuZCBldmVudCB0YXJnZXRzIHRvIGNhdGNoIGVycm9ycyBhbmQgcHJvdmlkZSBiZXR0ZXIgbWV0YSBkYXRhICovXG52YXIgVHJ5Q2F0Y2ggPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBUcnlDYXRjaChvcHRpb25zKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW5oZXJpdERvY1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5uYW1lID0gVHJ5Q2F0Y2guaWQ7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSB0c2xpYl8xLl9fYXNzaWduKHsgWE1MSHR0cFJlcXVlc3Q6IHRydWUsIGV2ZW50VGFyZ2V0OiB0cnVlLCByZXF1ZXN0QW5pbWF0aW9uRnJhbWU6IHRydWUsIHNldEludGVydmFsOiB0cnVlLCBzZXRUaW1lb3V0OiB0cnVlIH0sIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKiogSlNEb2MgKi9cbiAgICBUcnlDYXRjaC5wcm90b3R5cGUuX3dyYXBUaW1lRnVuY3Rpb24gPSBmdW5jdGlvbiAob3JpZ2luYWwpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBvcmlnaW5hbENhbGxiYWNrID0gYXJnc1swXTtcbiAgICAgICAgICAgIGFyZ3NbMF0gPSB3cmFwKG9yaWdpbmFsQ2FsbGJhY2ssIHtcbiAgICAgICAgICAgICAgICBtZWNoYW5pc206IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogeyBmdW5jdGlvbjogZ2V0RnVuY3Rpb25OYW1lKG9yaWdpbmFsKSB9LFxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW5zdHJ1bWVudCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgVHJ5Q2F0Y2gucHJvdG90eXBlLl93cmFwUkFGID0gZnVuY3Rpb24gKG9yaWdpbmFsKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5jYWxsKHRoaXMsIHdyYXAoY2FsbGJhY2ssIHtcbiAgICAgICAgICAgICAgICBtZWNoYW5pc206IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb246ICdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogZ2V0RnVuY3Rpb25OYW1lKG9yaWdpbmFsKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2luc3RydW1lbnQnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBUcnlDYXRjaC5wcm90b3R5cGUuX3dyYXBFdmVudFRhcmdldCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgdmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuICAgICAgICB2YXIgcHJvdG8gPSBnbG9iYWxbdGFyZ2V0XSAmJiBnbG9iYWxbdGFyZ2V0XS5wcm90b3R5cGU7XG4gICAgICAgIGlmICghcHJvdG8gfHwgIXByb3RvLmhhc093blByb3BlcnR5IHx8ICFwcm90by5oYXNPd25Qcm9wZXJ0eSgnYWRkRXZlbnRMaXN0ZW5lcicpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZmlsbChwcm90bywgJ2FkZEV2ZW50TGlzdGVuZXInLCBmdW5jdGlvbiAob3JpZ2luYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnROYW1lLCBmbiwgb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bmJvdW5kLW1ldGhvZCBzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4uaGFuZGxlRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZuLmhhbmRsZUV2ZW50ID0gd3JhcChmbi5oYW5kbGVFdmVudC5iaW5kKGZuKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lY2hhbmlzbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbjogJ2hhbmRsZUV2ZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IGdldEZ1bmN0aW9uTmFtZShmbiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2luc3RydW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbiBzb21ldGltZXMgZ2V0ICdQZXJtaXNzaW9uIGRlbmllZCB0byBhY2Nlc3MgcHJvcGVydHkgXCJoYW5kbGUgRXZlbnQnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5jYWxsKHRoaXMsIGV2ZW50TmFtZSwgd3JhcChmbiwge1xuICAgICAgICAgICAgICAgICAgICBtZWNoYW5pc206IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbjogJ2FkZEV2ZW50TGlzdGVuZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IGdldEZ1bmN0aW9uTmFtZShmbiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnN0cnVtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgZmlsbChwcm90bywgJ3JlbW92ZUV2ZW50TGlzdGVuZXInLCBmdW5jdGlvbiAob3JpZ2luYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnROYW1lLCBmbiwgb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGZuO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgJiYgKGNhbGxiYWNrLl9fc2VudHJ5X3dyYXBwZWRfXyB8fCBjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgYWNjZXNzaW5nIF9fc2VudHJ5X3dyYXBwZWRfXyB3aWxsIHRocm93IGluIHNvbWUgU2VsZW5pdW0gZW52aXJvbm1lbnRzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5jYWxsKHRoaXMsIGV2ZW50TmFtZSwgY2FsbGJhY2ssIG9wdGlvbnMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBUcnlDYXRjaC5wcm90b3R5cGUuX3dyYXBYSFIgPSBmdW5jdGlvbiAob3JpZ2luYWxTZW5kKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgeGhyID0gdGhpczsgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby10aGlzLWFzc2lnbm1lbnRcbiAgICAgICAgICAgIHZhciB4bWxIdHRwUmVxdWVzdFByb3BzID0gWydvbmxvYWQnLCAnb25lcnJvcicsICdvbnByb2dyZXNzJywgJ29ucmVhZHlzdGF0ZWNoYW5nZSddO1xuICAgICAgICAgICAgeG1sSHR0cFJlcXVlc3RQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3AgaW4geGhyICYmIHR5cGVvZiB4aHJbcHJvcF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsbCh4aHIsIHByb3AsIGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdyYXBPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lY2hhbmlzbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbjogcHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IGdldEZ1bmN0aW9uTmFtZShvcmlnaW5hbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnN0cnVtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIEluc3RydW1lbnQgaW50ZWdyYXRpb24gaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSBUcnlDYXRjaCwgZ2V0IHRoZSBuYW1lIG9mIG9yaWdpbmFsIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWwuX19zZW50cnlfb3JpZ2luYWxfXykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBPcHRpb25zLm1lY2hhbmlzbS5kYXRhLmhhbmRsZXIgPSBnZXRGdW5jdGlvbk5hbWUob3JpZ2luYWwuX19zZW50cnlfb3JpZ2luYWxfXyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd3JhcCBkaXJlY3RseVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAob3JpZ2luYWwsIHdyYXBPcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxTZW5kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogV3JhcCB0aW1lciBmdW5jdGlvbnMgYW5kIGV2ZW50IHRhcmdldHMgdG8gY2F0Y2ggZXJyb3JzXG4gICAgICogYW5kIHByb3ZpZGUgYmV0dGVyIG1ldGFkYXRhLlxuICAgICAqL1xuICAgIFRyeUNhdGNoLnByb3RvdHlwZS5zZXR1cE9uY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuc2V0VGltZW91dCkge1xuICAgICAgICAgICAgZmlsbChnbG9iYWwsICdzZXRUaW1lb3V0JywgdGhpcy5fd3JhcFRpbWVGdW5jdGlvbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5zZXRJbnRlcnZhbCkge1xuICAgICAgICAgICAgZmlsbChnbG9iYWwsICdzZXRJbnRlcnZhbCcsIHRoaXMuX3dyYXBUaW1lRnVuY3Rpb24uYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgICAgICBmaWxsKGdsb2JhbCwgJ3JlcXVlc3RBbmltYXRpb25GcmFtZScsIHRoaXMuX3dyYXBSQUYuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuWE1MSHR0cFJlcXVlc3QgJiYgJ1hNTEh0dHBSZXF1ZXN0JyBpbiBnbG9iYWwpIHtcbiAgICAgICAgICAgIGZpbGwoWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLCAnc2VuZCcsIHRoaXMuX3dyYXBYSFIuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuZXZlbnRUYXJnZXQpIHtcbiAgICAgICAgICAgIHZhciBldmVudFRhcmdldCA9IEFycmF5LmlzQXJyYXkodGhpcy5fb3B0aW9ucy5ldmVudFRhcmdldCkgPyB0aGlzLl9vcHRpb25zLmV2ZW50VGFyZ2V0IDogREVGQVVMVF9FVkVOVF9UQVJHRVQ7XG4gICAgICAgICAgICBldmVudFRhcmdldC5mb3JFYWNoKHRoaXMuX3dyYXBFdmVudFRhcmdldC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBUcnlDYXRjaC5pZCA9ICdUcnlDYXRjaCc7XG4gICAgcmV0dXJuIFRyeUNhdGNoO1xufSgpKTtcbmV4cG9ydCB7IFRyeUNhdGNoIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cnljYXRjaC5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IsIGdldEN1cnJlbnRIdWIgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG52YXIgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG4vKiogVXNlckFnZW50ICovXG52YXIgVXNlckFnZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFVzZXJBZ2VudCgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbmhlcml0RG9jXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5hbWUgPSBVc2VyQWdlbnQuaWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgVXNlckFnZW50LnByb3RvdHlwZS5zZXR1cE9uY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgaWYgKGdldEN1cnJlbnRIdWIoKS5nZXRJbnRlZ3JhdGlvbihVc2VyQWdlbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFnbG9iYWwubmF2aWdhdG9yIHx8ICFnbG9iYWwubG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3QgfHwge307XG4gICAgICAgICAgICAgICAgcmVxdWVzdC51cmwgPSByZXF1ZXN0LnVybCB8fCBnbG9iYWwubG9jYXRpb24uaHJlZjtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMgPSByZXF1ZXN0LmhlYWRlcnMgfHwge307XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzWydVc2VyLUFnZW50J10gPSBnbG9iYWwubmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHNsaWJfMS5fX2Fzc2lnbih7fSwgZXZlbnQsIHsgcmVxdWVzdDogcmVxdWVzdCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBldmVudDtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFVzZXJBZ2VudC5pZCA9ICdVc2VyQWdlbnQnO1xuICAgIHJldHVybiBVc2VyQWdlbnQ7XG59KCkpO1xuZXhwb3J0IHsgVXNlckFnZW50IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VyYWdlbnQuanMubWFwIiwiaW1wb3J0IHsgZXh0cmFjdEV4Y2VwdGlvbktleXNGb3JNZXNzYWdlLCBpc0V2ZW50LCBub3JtYWxpemVUb1NpemUgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IGNvbXB1dGVTdGFja1RyYWNlIH0gZnJvbSAnLi90cmFjZWtpdCc7XG52YXIgU1RBQ0tUUkFDRV9MSU1JVCA9IDUwO1xuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW4gZXhjZXB0aW9uIGZyb20gYW4gVHJhY2VLaXRTdGFja1RyYWNlXG4gKiBAcGFyYW0gc3RhY2t0cmFjZSBUcmFjZUtpdFN0YWNrVHJhY2UgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhbiBleGNlcHRpb25cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4Y2VwdGlvbkZyb21TdGFja3RyYWNlKHN0YWNrdHJhY2UpIHtcbiAgICB2YXIgZnJhbWVzID0gcHJlcGFyZUZyYW1lc0ZvckV2ZW50KHN0YWNrdHJhY2Uuc3RhY2spO1xuICAgIHZhciBleGNlcHRpb24gPSB7XG4gICAgICAgIHR5cGU6IHN0YWNrdHJhY2UubmFtZSxcbiAgICAgICAgdmFsdWU6IHN0YWNrdHJhY2UubWVzc2FnZSxcbiAgICB9O1xuICAgIGlmIChmcmFtZXMgJiYgZnJhbWVzLmxlbmd0aCkge1xuICAgICAgICBleGNlcHRpb24uc3RhY2t0cmFjZSA9IHsgZnJhbWVzOiBmcmFtZXMgfTtcbiAgICB9XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICBpZiAoZXhjZXB0aW9uLnR5cGUgPT09IHVuZGVmaW5lZCAmJiBleGNlcHRpb24udmFsdWUgPT09ICcnKSB7XG4gICAgICAgIGV4Y2VwdGlvbi52YWx1ZSA9ICdVbnJlY292ZXJhYmxlIGVycm9yIGNhdWdodCc7XG4gICAgfVxuICAgIHJldHVybiBleGNlcHRpb247XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50RnJvbVBsYWluT2JqZWN0KGV4Y2VwdGlvbiwgc3ludGhldGljRXhjZXB0aW9uLCByZWplY3Rpb24pIHtcbiAgICB2YXIgZXZlbnQgPSB7XG4gICAgICAgIGV4Y2VwdGlvbjoge1xuICAgICAgICAgICAgdmFsdWVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBpc0V2ZW50KGV4Y2VwdGlvbikgPyBleGNlcHRpb24uY29uc3RydWN0b3IubmFtZSA6IHJlamVjdGlvbiA/ICdVbmhhbmRsZWRSZWplY3Rpb24nIDogJ0Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiTm9uLUVycm9yIFwiICsgKHJlamVjdGlvbiA/ICdwcm9taXNlIHJlamVjdGlvbicgOiAnZXhjZXB0aW9uJykgKyBcIiBjYXB0dXJlZCB3aXRoIGtleXM6IFwiICsgZXh0cmFjdEV4Y2VwdGlvbktleXNGb3JNZXNzYWdlKGV4Y2VwdGlvbiksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICBfX3NlcmlhbGl6ZWRfXzogbm9ybWFsaXplVG9TaXplKGV4Y2VwdGlvbiksXG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBpZiAoc3ludGhldGljRXhjZXB0aW9uKSB7XG4gICAgICAgIHZhciBzdGFja3RyYWNlID0gY29tcHV0ZVN0YWNrVHJhY2Uoc3ludGhldGljRXhjZXB0aW9uKTtcbiAgICAgICAgdmFyIGZyYW1lc18xID0gcHJlcGFyZUZyYW1lc0ZvckV2ZW50KHN0YWNrdHJhY2Uuc3RhY2spO1xuICAgICAgICBldmVudC5zdGFja3RyYWNlID0ge1xuICAgICAgICAgICAgZnJhbWVzOiBmcmFtZXNfMSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGV2ZW50O1xufVxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVudEZyb21TdGFja3RyYWNlKHN0YWNrdHJhY2UpIHtcbiAgICB2YXIgZXhjZXB0aW9uID0gZXhjZXB0aW9uRnJvbVN0YWNrdHJhY2Uoc3RhY2t0cmFjZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZXhjZXB0aW9uOiB7XG4gICAgICAgICAgICB2YWx1ZXM6IFtleGNlcHRpb25dLFxuICAgICAgICB9LFxuICAgIH07XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVGcmFtZXNGb3JFdmVudChzdGFjaykge1xuICAgIGlmICghc3RhY2sgfHwgIXN0YWNrLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHZhciBsb2NhbFN0YWNrID0gc3RhY2s7XG4gICAgdmFyIGZpcnN0RnJhbWVGdW5jdGlvbiA9IGxvY2FsU3RhY2tbMF0uZnVuYyB8fCAnJztcbiAgICB2YXIgbGFzdEZyYW1lRnVuY3Rpb24gPSBsb2NhbFN0YWNrW2xvY2FsU3RhY2subGVuZ3RoIC0gMV0uZnVuYyB8fCAnJztcbiAgICAvLyBJZiBzdGFjayBzdGFydHMgd2l0aCBvbmUgb2Ygb3VyIEFQSSBjYWxscywgcmVtb3ZlIGl0IChzdGFydHMsIG1lYW5pbmcgaXQncyB0aGUgdG9wIG9mIHRoZSBzdGFjayAtIGFrYSBsYXN0IGNhbGwpXG4gICAgaWYgKGZpcnN0RnJhbWVGdW5jdGlvbi5pbmRleE9mKCdjYXB0dXJlTWVzc2FnZScpICE9PSAtMSB8fCBmaXJzdEZyYW1lRnVuY3Rpb24uaW5kZXhPZignY2FwdHVyZUV4Y2VwdGlvbicpICE9PSAtMSkge1xuICAgICAgICBsb2NhbFN0YWNrID0gbG9jYWxTdGFjay5zbGljZSgxKTtcbiAgICB9XG4gICAgLy8gSWYgc3RhY2sgZW5kcyB3aXRoIG9uZSBvZiBvdXIgaW50ZXJuYWwgQVBJIGNhbGxzLCByZW1vdmUgaXQgKGVuZHMsIG1lYW5pbmcgaXQncyB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayAtIGFrYSB0b3AtbW9zdCBjYWxsKVxuICAgIGlmIChsYXN0RnJhbWVGdW5jdGlvbi5pbmRleE9mKCdzZW50cnlXcmFwcGVkJykgIT09IC0xKSB7XG4gICAgICAgIGxvY2FsU3RhY2sgPSBsb2NhbFN0YWNrLnNsaWNlKDAsIC0xKTtcbiAgICB9XG4gICAgLy8gVGhlIGZyYW1lIHdoZXJlIHRoZSBjcmFzaCBoYXBwZW5lZCwgc2hvdWxkIGJlIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcnJheVxuICAgIHJldHVybiBsb2NhbFN0YWNrXG4gICAgICAgIC5zbGljZSgwLCBTVEFDS1RSQUNFX0xJTUlUKVxuICAgICAgICAubWFwKGZ1bmN0aW9uIChmcmFtZSkgeyByZXR1cm4gKHtcbiAgICAgICAgY29sbm86IGZyYW1lLmNvbHVtbiA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGZyYW1lLmNvbHVtbixcbiAgICAgICAgZmlsZW5hbWU6IGZyYW1lLnVybCB8fCBsb2NhbFN0YWNrWzBdLnVybCxcbiAgICAgICAgZnVuY3Rpb246IGZyYW1lLmZ1bmMgfHwgJz8nLFxuICAgICAgICBpbl9hcHA6IHRydWUsXG4gICAgICAgIGxpbmVubzogZnJhbWUubGluZSA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGZyYW1lLmxpbmUsXG4gICAgfSk7IH0pXG4gICAgICAgIC5yZXZlcnNlKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZXJzLmpzLm1hcCIsImltcG9ydCB7IGdldEN1cnJlbnRIdWIsIGluaXRBbmRCaW5kLCBJbnRlZ3JhdGlvbnMgYXMgQ29yZUludGVncmF0aW9ucyB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QsIFN5bmNQcm9taXNlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBCcm93c2VyQ2xpZW50IH0gZnJvbSAnLi9jbGllbnQnO1xuaW1wb3J0IHsgd3JhcCBhcyBpbnRlcm5hbFdyYXAgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYnMsIEdsb2JhbEhhbmRsZXJzLCBMaW5rZWRFcnJvcnMsIFRyeUNhdGNoLCBVc2VyQWdlbnQgfSBmcm9tICcuL2ludGVncmF0aW9ucyc7XG5leHBvcnQgdmFyIGRlZmF1bHRJbnRlZ3JhdGlvbnMgPSBbXG4gICAgbmV3IENvcmVJbnRlZ3JhdGlvbnMuSW5ib3VuZEZpbHRlcnMoKSxcbiAgICBuZXcgQ29yZUludGVncmF0aW9ucy5GdW5jdGlvblRvU3RyaW5nKCksXG4gICAgbmV3IFRyeUNhdGNoKCksXG4gICAgbmV3IEJyZWFkY3J1bWJzKCksXG4gICAgbmV3IEdsb2JhbEhhbmRsZXJzKCksXG4gICAgbmV3IExpbmtlZEVycm9ycygpLFxuICAgIG5ldyBVc2VyQWdlbnQoKSxcbl07XG4vKipcbiAqIFRoZSBTZW50cnkgQnJvd3NlciBTREsgQ2xpZW50LlxuICpcbiAqIFRvIHVzZSB0aGlzIFNESywgY2FsbCB0aGUge0BsaW5rIGluaXR9IGZ1bmN0aW9uIGFzIGVhcmx5IGFzIHBvc3NpYmxlIHdoZW5cbiAqIGxvYWRpbmcgdGhlIHdlYiBwYWdlLiBUbyBzZXQgY29udGV4dCBpbmZvcm1hdGlvbiBvciBzZW5kIG1hbnVhbCBldmVudHMsIHVzZVxuICogdGhlIHByb3ZpZGVkIG1ldGhvZHMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqXG4gKiBpbXBvcnQgeyBpbml0IH0gZnJvbSAnQHNlbnRyeS9icm93c2VyJztcbiAqXG4gKiBpbml0KHtcbiAqICAgZHNuOiAnX19EU05fXycsXG4gKiAgIC8vIC4uLlxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgXG4gKlxuICogaW1wb3J0IHsgY29uZmlndXJlU2NvcGUgfSBmcm9tICdAc2VudHJ5L2Jyb3dzZXInO1xuICogY29uZmlndXJlU2NvcGUoKHNjb3BlOiBTY29wZSkgPT4ge1xuICogICBzY29wZS5zZXRFeHRyYSh7IGJhdHRlcnk6IDAuNyB9KTtcbiAqICAgc2NvcGUuc2V0VGFnKHsgdXNlcl9tb2RlOiAnYWRtaW4nIH0pO1xuICogICBzY29wZS5zZXRVc2VyKHsgaWQ6ICc0NzExJyB9KTtcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICpcbiAqIGltcG9ydCB7IGFkZEJyZWFkY3J1bWIgfSBmcm9tICdAc2VudHJ5L2Jyb3dzZXInO1xuICogYWRkQnJlYWRjcnVtYih7XG4gKiAgIG1lc3NhZ2U6ICdNeSBCcmVhZGNydW1iJyxcbiAqICAgLy8gLi4uXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgXG4gKlxuICogaW1wb3J0ICogYXMgU2VudHJ5IGZyb20gJ0BzZW50cnkvYnJvd3Nlcic7XG4gKiBTZW50cnkuY2FwdHVyZU1lc3NhZ2UoJ0hlbGxvLCB3b3JsZCEnKTtcbiAqIFNlbnRyeS5jYXB0dXJlRXhjZXB0aW9uKG5ldyBFcnJvcignR29vZCBieWUnKSk7XG4gKiBTZW50cnkuY2FwdHVyZUV2ZW50KHtcbiAqICAgbWVzc2FnZTogJ01hbnVhbCcsXG4gKiAgIHN0YWNrdHJhY2U6IFtcbiAqICAgICAvLyAuLi5cbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHNlZSB7QGxpbmsgQnJvd3Nlck9wdGlvbnN9IGZvciBkb2N1bWVudGF0aW9uIG9uIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXQob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgaWYgKG9wdGlvbnMuZGVmYXVsdEludGVncmF0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuZGVmYXVsdEludGVncmF0aW9ucyA9IGRlZmF1bHRJbnRlZ3JhdGlvbnM7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnJlbGVhc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgd2luZG93XzEgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgICAgICAgLy8gVGhpcyBzdXBwb3J0cyB0aGUgdmFyaWFibGUgdGhhdCBzZW50cnktd2VicGFjay1wbHVnaW4gaW5qZWN0c1xuICAgICAgICBpZiAod2luZG93XzEuU0VOVFJZX1JFTEVBU0UgJiYgd2luZG93XzEuU0VOVFJZX1JFTEVBU0UuaWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucmVsZWFzZSA9IHdpbmRvd18xLlNFTlRSWV9SRUxFQVNFLmlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXRBbmRCaW5kKEJyb3dzZXJDbGllbnQsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBQcmVzZW50IHRoZSB1c2VyIHdpdGggYSByZXBvcnQgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIEV2ZXJ5dGhpbmcgaXMgb3B0aW9uYWwsIHdlIHRyeSB0byBmZXRjaCBhbGwgaW5mbyBuZWVkIGZyb20gdGhlIGdsb2JhbCBzY29wZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3dSZXBvcnREaWFsb2cob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgaWYgKCFvcHRpb25zLmV2ZW50SWQpIHtcbiAgICAgICAgb3B0aW9ucy5ldmVudElkID0gZ2V0Q3VycmVudEh1YigpLmxhc3RFdmVudElkKCk7XG4gICAgfVxuICAgIHZhciBjbGllbnQgPSBnZXRDdXJyZW50SHViKCkuZ2V0Q2xpZW50KCk7XG4gICAgaWYgKGNsaWVudCkge1xuICAgICAgICBjbGllbnQuc2hvd1JlcG9ydERpYWxvZyhvcHRpb25zKTtcbiAgICB9XG59XG4vKipcbiAqIFRoaXMgaXMgdGhlIGdldHRlciBmb3IgbGFzdEV2ZW50SWQuXG4gKlxuICogQHJldHVybnMgVGhlIGxhc3QgZXZlbnQgaWQgb2YgYSBjYXB0dXJlZCBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhc3RFdmVudElkKCkge1xuICAgIHJldHVybiBnZXRDdXJyZW50SHViKCkubGFzdEV2ZW50SWQoKTtcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBoZXJlIHRvIGJlIEFQSSBjb21wYXRpYmxlIHdpdGggdGhlIGxvYWRlci5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcmNlTG9hZCgpIHtcbiAgICAvLyBOb29wXG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgaGVyZSB0byBiZSBBUEkgY29tcGF0aWJsZSB3aXRoIHRoZSBsb2FkZXIuXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkxvYWQoY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjaygpO1xufVxuLyoqXG4gKiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBjdXJyZW50IGV2ZW50cyBoYXZlIGJlZW4gc2VudC5cbiAqIElmIHlvdSBwcm92aWRlIGEgdGltZW91dCBhbmQgdGhlIHF1ZXVlIHRha2VzIGxvbmdlciB0byBkcmFpbiB0aGUgcHJvbWlzZSByZXR1cm5zIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB0aW1lb3V0IE1heGltdW0gdGltZSBpbiBtcyB0aGUgY2xpZW50IHNob3VsZCB3YWl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmx1c2godGltZW91dCkge1xuICAgIHZhciBjbGllbnQgPSBnZXRDdXJyZW50SHViKCkuZ2V0Q2xpZW50KCk7XG4gICAgaWYgKGNsaWVudCkge1xuICAgICAgICByZXR1cm4gY2xpZW50LmZsdXNoKHRpbWVvdXQpO1xuICAgIH1cbiAgICByZXR1cm4gU3luY1Byb21pc2UucmVqZWN0KGZhbHNlKTtcbn1cbi8qKlxuICogQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgY3VycmVudCBldmVudHMgaGF2ZSBiZWVuIHNlbnQuXG4gKiBJZiB5b3UgcHJvdmlkZSBhIHRpbWVvdXQgYW5kIHRoZSBxdWV1ZSB0YWtlcyBsb25nZXIgdG8gZHJhaW4gdGhlIHByb21pc2UgcmV0dXJucyBmYWxzZS5cbiAqXG4gKiBAcGFyYW0gdGltZW91dCBNYXhpbXVtIHRpbWUgaW4gbXMgdGhlIGNsaWVudCBzaG91bGQgd2FpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlKHRpbWVvdXQpIHtcbiAgICB2YXIgY2xpZW50ID0gZ2V0Q3VycmVudEh1YigpLmdldENsaWVudCgpO1xuICAgIGlmIChjbGllbnQpIHtcbiAgICAgICAgcmV0dXJuIGNsaWVudC5jbG9zZSh0aW1lb3V0KTtcbiAgICB9XG4gICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlamVjdChmYWxzZSk7XG59XG4vKipcbiAqIFdyYXAgY29kZSB3aXRoaW4gYSB0cnkvY2F0Y2ggYmxvY2sgc28gdGhlIFNESyBpcyBhYmxlIHRvIGNhcHR1cmUgZXJyb3JzLlxuICpcbiAqIEBwYXJhbSBmbiBBIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKlxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB3cmFwcGVkIGZ1bmN0aW9uIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwKGZuKSB7XG4gICAgcmV0dXJuIGludGVybmFsV3JhcChmbikoKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby11bnNhZmUtYW55XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZGsuanMubWFwIiwiLy8gdHNsaW50OmRpc2FibGU6b2JqZWN0LWxpdGVyYWwtc29ydC1rZXlzXG5pbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuLy8gZ2xvYmFsIHJlZmVyZW5jZSB0byBzbGljZVxudmFyIFVOS05PV05fRlVOQ1RJT04gPSAnPyc7XG4vLyBDaHJvbWl1bSBiYXNlZCBicm93c2VyczogQ2hyb21lLCBCcmF2ZSwgbmV3IE9wZXJhLCBuZXcgRWRnZVxudmFyIGNocm9tZSA9IC9eXFxzKmF0ICg/OiguKj8pID9cXCgpPygoPzpmaWxlfGh0dHBzP3xibG9ifGNocm9tZS1leHRlbnNpb258YWRkcmVzc3xuYXRpdmV8ZXZhbHx3ZWJwYWNrfDxhbm9ueW1vdXM+fFstYS16XSs6fC4qYnVuZGxlfFxcLykuKj8pKD86OihcXGQrKSk/KD86OihcXGQrKSk/XFwpP1xccyokL2k7XG4vLyBnZWNrbyByZWdleDogYCg/OmJ1bmRsZXxcXGQrXFwuanMpYDogYGJ1bmRsZWAgaXMgZm9yIHJlYWN0IG5hdGl2ZSwgYFxcZCtcXC5qc2AgYWxzbyBidXQgc3BlY2lmaWNhbGx5IGZvciByYW0gYnVuZGxlcyBiZWNhdXNlIGl0XG4vLyBnZW5lcmF0ZXMgZmlsZW5hbWVzIHdpdGhvdXQgYSBwcmVmaXggbGlrZSBgZmlsZTovL2AgdGhlIGZpbGVuYW1lcyBpbiB0aGUgc3RhY2t0cmFjZSBhcmUganVzdCA0Mi5qc1xuLy8gV2UgbmVlZCB0aGlzIHNwZWNpZmljIGNhc2UgZm9yIG5vdyBiZWNhdXNlIHdlIHdhbnQgbm8gb3RoZXIgcmVnZXggdG8gbWF0Y2guXG52YXIgZ2Vja28gPSAvXlxccyooLio/KSg/OlxcKCguKj8pXFwpKT8oPzpefEApPygoPzpmaWxlfGh0dHBzP3xibG9ifGNocm9tZXx3ZWJwYWNrfHJlc291cmNlfG1vei1leHRlbnNpb24pLio/OlxcLy4qP3xcXFtuYXRpdmUgY29kZVxcXXxbXkBdKig/OmJ1bmRsZXxcXGQrXFwuanMpKSg/OjooXFxkKykpPyg/OjooXFxkKykpP1xccyokL2k7XG52YXIgd2luanMgPSAvXlxccyphdCAoPzooKD86XFxbb2JqZWN0IG9iamVjdFxcXSk/LispICk/XFwoPygoPzpmaWxlfG1zLWFwcHh8aHR0cHM/fHdlYnBhY2t8YmxvYik6Lio/KTooXFxkKykoPzo6KFxcZCspKT9cXCk/XFxzKiQvaTtcbnZhciBnZWNrb0V2YWwgPSAvKFxcUyspIGxpbmUgKFxcZCspKD86ID4gZXZhbCBsaW5lIFxcZCspKiA+IGV2YWwvaTtcbnZhciBjaHJvbWVFdmFsID0gL1xcKChcXFMqKSg/OjooXFxkKykpKD86OihcXGQrKSlcXCkvO1xuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVN0YWNrVHJhY2UoZXgpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnNhZmUtYW55XG4gICAgdmFyIHN0YWNrID0gbnVsbDtcbiAgICB2YXIgcG9wU2l6ZSA9IGV4ICYmIGV4LmZyYW1lc1RvUG9wO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgbXVzdCBiZSB0cmllZCBmaXJzdCBiZWNhdXNlIE9wZXJhIDEwICpkZXN0cm95cypcbiAgICAgICAgLy8gaXRzIHN0YWNrdHJhY2UgcHJvcGVydHkgaWYgeW91IHRyeSB0byBhY2Nlc3MgdGhlIHN0YWNrXG4gICAgICAgIC8vIHByb3BlcnR5IGZpcnN0ISFcbiAgICAgICAgc3RhY2sgPSBjb21wdXRlU3RhY2tUcmFjZUZyb21TdGFja3RyYWNlUHJvcChleCk7XG4gICAgICAgIGlmIChzdGFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHBvcEZyYW1lcyhzdGFjaywgcG9wU2l6ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gbm8tZW1wdHlcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgc3RhY2sgPSBjb21wdXRlU3RhY2tUcmFjZUZyb21TdGFja1Byb3AoZXgpO1xuICAgICAgICBpZiAoc3RhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBwb3BGcmFtZXMoc3RhY2ssIHBvcFNpemUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIG5vLWVtcHR5XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIG1lc3NhZ2U6IGV4dHJhY3RNZXNzYWdlKGV4KSxcbiAgICAgICAgbmFtZTogZXggJiYgZXgubmFtZSxcbiAgICAgICAgc3RhY2s6IFtdLFxuICAgICAgICBmYWlsZWQ6IHRydWUsXG4gICAgfTtcbn1cbi8qKiBKU0RvYyAqL1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmN5Y2xvbWF0aWMtY29tcGxleGl0eVxuZnVuY3Rpb24gY29tcHV0ZVN0YWNrVHJhY2VGcm9tU3RhY2tQcm9wKGV4KSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGU6bm8tY29uZGl0aW9uYWwtYXNzaWdubWVudFxuICAgIGlmICghZXggfHwgIWV4LnN0YWNrKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgc3RhY2sgPSBbXTtcbiAgICB2YXIgbGluZXMgPSBleC5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgdmFyIGlzRXZhbDtcbiAgICB2YXIgc3VibWF0Y2g7XG4gICAgdmFyIHBhcnRzO1xuICAgIHZhciBlbGVtZW50O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKChwYXJ0cyA9IGNocm9tZS5leGVjKGxpbmVzW2ldKSkpIHtcbiAgICAgICAgICAgIHZhciBpc05hdGl2ZSA9IHBhcnRzWzJdICYmIHBhcnRzWzJdLmluZGV4T2YoJ25hdGl2ZScpID09PSAwOyAvLyBzdGFydCBvZiBsaW5lXG4gICAgICAgICAgICBpc0V2YWwgPSBwYXJ0c1syXSAmJiBwYXJ0c1syXS5pbmRleE9mKCdldmFsJykgPT09IDA7IC8vIHN0YXJ0IG9mIGxpbmVcbiAgICAgICAgICAgIGlmIChpc0V2YWwgJiYgKHN1Ym1hdGNoID0gY2hyb21lRXZhbC5leGVjKHBhcnRzWzJdKSkpIHtcbiAgICAgICAgICAgICAgICAvLyB0aHJvdyBvdXQgZXZhbCBsaW5lL2NvbHVtbiBhbmQgdXNlIHRvcC1tb3N0IGxpbmUvY29sdW1uIG51bWJlclxuICAgICAgICAgICAgICAgIHBhcnRzWzJdID0gc3VibWF0Y2hbMV07IC8vIHVybFxuICAgICAgICAgICAgICAgIHBhcnRzWzNdID0gc3VibWF0Y2hbMl07IC8vIGxpbmVcbiAgICAgICAgICAgICAgICBwYXJ0c1s0XSA9IHN1Ym1hdGNoWzNdOyAvLyBjb2x1bW5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgLy8gd29ya2luZyB3aXRoIHRoZSByZWdleHAgYWJvdmUgaXMgc3VwZXIgcGFpbmZ1bC4gaXQgaXMgcXVpdGUgYSBoYWNrLCBidXQganVzdCBzdHJpcHBpbmcgdGhlIGBhZGRyZXNzIGF0IGBcbiAgICAgICAgICAgICAgICAvLyBwcmVmaXggaGVyZSBzZWVtcyBsaWtlIHRoZSBxdWlja2VzdCBzb2x1dGlvbiBmb3Igbm93LlxuICAgICAgICAgICAgICAgIHVybDogcGFydHNbMl0gJiYgcGFydHNbMl0uaW5kZXhPZignYWRkcmVzcyBhdCAnKSA9PT0gMCA/IHBhcnRzWzJdLnN1YnN0cignYWRkcmVzcyBhdCAnLmxlbmd0aCkgOiBwYXJ0c1syXSxcbiAgICAgICAgICAgICAgICBmdW5jOiBwYXJ0c1sxXSB8fCBVTktOT1dOX0ZVTkNUSU9OLFxuICAgICAgICAgICAgICAgIGFyZ3M6IGlzTmF0aXZlID8gW3BhcnRzWzJdXSA6IFtdLFxuICAgICAgICAgICAgICAgIGxpbmU6IHBhcnRzWzNdID8gK3BhcnRzWzNdIDogbnVsbCxcbiAgICAgICAgICAgICAgICBjb2x1bW46IHBhcnRzWzRdID8gK3BhcnRzWzRdIDogbnVsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKHBhcnRzID0gd2luanMuZXhlYyhsaW5lc1tpXSkpKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgIHVybDogcGFydHNbMl0sXG4gICAgICAgICAgICAgICAgZnVuYzogcGFydHNbMV0gfHwgVU5LTk9XTl9GVU5DVElPTixcbiAgICAgICAgICAgICAgICBhcmdzOiBbXSxcbiAgICAgICAgICAgICAgICBsaW5lOiArcGFydHNbM10sXG4gICAgICAgICAgICAgICAgY29sdW1uOiBwYXJ0c1s0XSA/ICtwYXJ0c1s0XSA6IG51bGwsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChwYXJ0cyA9IGdlY2tvLmV4ZWMobGluZXNbaV0pKSkge1xuICAgICAgICAgICAgaXNFdmFsID0gcGFydHNbM10gJiYgcGFydHNbM10uaW5kZXhPZignID4gZXZhbCcpID4gLTE7XG4gICAgICAgICAgICBpZiAoaXNFdmFsICYmIChzdWJtYXRjaCA9IGdlY2tvRXZhbC5leGVjKHBhcnRzWzNdKSkpIHtcbiAgICAgICAgICAgICAgICAvLyB0aHJvdyBvdXQgZXZhbCBsaW5lL2NvbHVtbiBhbmQgdXNlIHRvcC1tb3N0IGxpbmUgbnVtYmVyXG4gICAgICAgICAgICAgICAgcGFydHNbMV0gPSBwYXJ0c1sxXSB8fCBcImV2YWxcIjtcbiAgICAgICAgICAgICAgICBwYXJ0c1szXSA9IHN1Ym1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIHBhcnRzWzRdID0gc3VibWF0Y2hbMl07XG4gICAgICAgICAgICAgICAgcGFydHNbNV0gPSAnJzsgLy8gbm8gY29sdW1uIHdoZW4gZXZhbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaSA9PT0gMCAmJiAhcGFydHNbNV0gJiYgZXguY29sdW1uTnVtYmVyICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICAvLyBGaXJlRm94IHVzZXMgdGhpcyBhd2Vzb21lIGNvbHVtbk51bWJlciBwcm9wZXJ0eSBmb3IgaXRzIHRvcCBmcmFtZVxuICAgICAgICAgICAgICAgIC8vIEFsc28gbm90ZSwgRmlyZWZveCdzIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZCBhbmQgZXZlcnl0aGluZyBlbHNlIGV4cGVjdHMgMS1iYXNlZCxcbiAgICAgICAgICAgICAgICAvLyBzbyBhZGRpbmcgMVxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMgaGFjayBkb2Vzbid0IHdvcmsgaWYgdG9wLW1vc3QgZnJhbWUgaXMgZXZhbFxuICAgICAgICAgICAgICAgIHN0YWNrWzBdLmNvbHVtbiA9IGV4LmNvbHVtbk51bWJlciArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgIHVybDogcGFydHNbM10sXG4gICAgICAgICAgICAgICAgZnVuYzogcGFydHNbMV0gfHwgVU5LTk9XTl9GVU5DVElPTixcbiAgICAgICAgICAgICAgICBhcmdzOiBwYXJ0c1syXSA/IHBhcnRzWzJdLnNwbGl0KCcsJykgOiBbXSxcbiAgICAgICAgICAgICAgICBsaW5lOiBwYXJ0c1s0XSA/ICtwYXJ0c1s0XSA6IG51bGwsXG4gICAgICAgICAgICAgICAgY29sdW1uOiBwYXJ0c1s1XSA/ICtwYXJ0c1s1XSA6IG51bGwsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbGVtZW50LmZ1bmMgJiYgZWxlbWVudC5saW5lKSB7XG4gICAgICAgICAgICBlbGVtZW50LmZ1bmMgPSBVTktOT1dOX0ZVTkNUSU9OO1xuICAgICAgICB9XG4gICAgICAgIHN0YWNrLnB1c2goZWxlbWVudCk7XG4gICAgfVxuICAgIGlmICghc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBtZXNzYWdlOiBleHRyYWN0TWVzc2FnZShleCksXG4gICAgICAgIG5hbWU6IGV4Lm5hbWUsXG4gICAgICAgIHN0YWNrOiBzdGFjayxcbiAgICB9O1xufVxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBjb21wdXRlU3RhY2tUcmFjZUZyb21TdGFja3RyYWNlUHJvcChleCkge1xuICAgIGlmICghZXggfHwgIWV4LnN0YWNrdHJhY2UpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIEFjY2VzcyBhbmQgc3RvcmUgdGhlIHN0YWNrdHJhY2UgcHJvcGVydHkgYmVmb3JlIGRvaW5nIEFOWVRISU5HXG4gICAgLy8gZWxzZSB0byBpdCBiZWNhdXNlIE9wZXJhIGlzIG5vdCB2ZXJ5IGdvb2QgYXQgcHJvdmlkaW5nIGl0XG4gICAgLy8gcmVsaWFibHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy5cbiAgICB2YXIgc3RhY2t0cmFjZSA9IGV4LnN0YWNrdHJhY2U7XG4gICAgdmFyIG9wZXJhMTBSZWdleCA9IC8gbGluZSAoXFxkKykuKnNjcmlwdCAoPzppbiApPyhcXFMrKSg/OjogaW4gZnVuY3Rpb24gKFxcUyspKT8kL2k7XG4gICAgdmFyIG9wZXJhMTFSZWdleCA9IC8gbGluZSAoXFxkKyksIGNvbHVtbiAoXFxkKylcXHMqKD86aW4gKD86PGFub255bW91cyBmdW5jdGlvbjogKFtePl0rKT58KFteXFwpXSspKVxcKCguKilcXCkpPyBpbiAoLiopOlxccyokL2k7XG4gICAgdmFyIGxpbmVzID0gc3RhY2t0cmFjZS5zcGxpdCgnXFxuJyk7XG4gICAgdmFyIHN0YWNrID0gW107XG4gICAgdmFyIHBhcnRzO1xuICAgIGZvciAodmFyIGxpbmUgPSAwOyBsaW5lIDwgbGluZXMubGVuZ3RoOyBsaW5lICs9IDIpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGU6bm8tY29uZGl0aW9uYWwtYXNzaWdubWVudFxuICAgICAgICB2YXIgZWxlbWVudCA9IG51bGw7XG4gICAgICAgIGlmICgocGFydHMgPSBvcGVyYTEwUmVnZXguZXhlYyhsaW5lc1tsaW5lXSkpKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgIHVybDogcGFydHNbMl0sXG4gICAgICAgICAgICAgICAgZnVuYzogcGFydHNbM10sXG4gICAgICAgICAgICAgICAgYXJnczogW10sXG4gICAgICAgICAgICAgICAgbGluZTogK3BhcnRzWzFdLFxuICAgICAgICAgICAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKHBhcnRzID0gb3BlcmExMVJlZ2V4LmV4ZWMobGluZXNbbGluZV0pKSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IHtcbiAgICAgICAgICAgICAgICB1cmw6IHBhcnRzWzZdLFxuICAgICAgICAgICAgICAgIGZ1bmM6IHBhcnRzWzNdIHx8IHBhcnRzWzRdLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHBhcnRzWzVdID8gcGFydHNbNV0uc3BsaXQoJywnKSA6IFtdLFxuICAgICAgICAgICAgICAgIGxpbmU6ICtwYXJ0c1sxXSxcbiAgICAgICAgICAgICAgICBjb2x1bW46ICtwYXJ0c1syXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudC5mdW5jICYmIGVsZW1lbnQubGluZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuZnVuYyA9IFVOS05PV05fRlVOQ1RJT047XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFjay5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBtZXNzYWdlOiBleHRyYWN0TWVzc2FnZShleCksXG4gICAgICAgIG5hbWU6IGV4Lm5hbWUsXG4gICAgICAgIHN0YWNrOiBzdGFjayxcbiAgICB9O1xufVxuLyoqIFJlbW92ZSBOIG51bWJlciBvZiBmcmFtZXMgZnJvbSB0aGUgc3RhY2sgKi9cbmZ1bmN0aW9uIHBvcEZyYW1lcyhzdGFja3RyYWNlLCBwb3BTaXplKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRzbGliXzEuX19hc3NpZ24oe30sIHN0YWNrdHJhY2UsIHsgc3RhY2s6IHN0YWNrdHJhY2Uuc3RhY2suc2xpY2UocG9wU2l6ZSkgfSk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBzdGFja3RyYWNlO1xuICAgIH1cbn1cbi8qKlxuICogVGhlcmUgYXJlIGNhc2VzIHdoZXJlIHN0YWNrdHJhY2UubWVzc2FnZSBpcyBhbiBFdmVudCBvYmplY3RcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzE5NDlcbiAqIEluIHRoaXMgc3BlY2lmaWMgY2FzZSB3ZSB0cnkgdG8gZXh0cmFjdCBzdGFja3RyYWNlLm1lc3NhZ2UuZXJyb3IubWVzc2FnZVxuICovXG5mdW5jdGlvbiBleHRyYWN0TWVzc2FnZShleCkge1xuICAgIHZhciBtZXNzYWdlID0gZXggJiYgZXgubWVzc2FnZTtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuICdObyBlcnJvciBtZXNzYWdlJztcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgdHlwZW9mIG1lc3NhZ2UuZXJyb3IubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZXJyb3IubWVzc2FnZTtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjZWtpdC5qcy5tYXAiLCJpbXBvcnQgeyBBUEkgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgUHJvbWlzZUJ1ZmZlciwgU2VudHJ5RXJyb3IgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbi8qKiBCYXNlIFRyYW5zcG9ydCBjbGFzcyBpbXBsZW1lbnRhdGlvbiAqL1xudmFyIEJhc2VUcmFuc3BvcnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmFzZVRyYW5zcG9ydChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIC8qKiBBIHNpbXBsZSBidWZmZXIgaG9sZGluZyBhbGwgcmVxdWVzdHMuICovXG4gICAgICAgIHRoaXMuX2J1ZmZlciA9IG5ldyBQcm9taXNlQnVmZmVyKDMwKTtcbiAgICAgICAgdGhpcy5fYXBpID0gbmV3IEFQSSh0aGlzLm9wdGlvbnMuZHNuKTtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRlcHJlY2F0aW9uXG4gICAgICAgIHRoaXMudXJsID0gdGhpcy5fYXBpLmdldFN0b3JlRW5kcG9pbnRXaXRoVXJsRW5jb2RlZEF1dGgoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBCYXNlVHJhbnNwb3J0LnByb3RvdHlwZS5zZW5kRXZlbnQgPSBmdW5jdGlvbiAoXykge1xuICAgICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoJ1RyYW5zcG9ydCBDbGFzcyBoYXMgdG8gaW1wbGVtZW50IGBzZW5kRXZlbnRgIG1ldGhvZCcpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBCYXNlVHJhbnNwb3J0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWZmZXIuZHJhaW4odGltZW91dCk7XG4gICAgfTtcbiAgICByZXR1cm4gQmFzZVRyYW5zcG9ydDtcbn0oKSk7XG5leHBvcnQgeyBCYXNlVHJhbnNwb3J0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXNlLmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBldmVudFRvU2VudHJ5UmVxdWVzdCB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBTdGF0dXMgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCwgbG9nZ2VyLCBwYXJzZVJldHJ5QWZ0ZXJIZWFkZXIsIHN1cHBvcnRzUmVmZXJyZXJQb2xpY3ksIFN5bmNQcm9taXNlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBCYXNlVHJhbnNwb3J0IH0gZnJvbSAnLi9iYXNlJztcbnZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbi8qKiBgZmV0Y2hgIGJhc2VkIHRyYW5zcG9ydCAqL1xudmFyIEZldGNoVHJhbnNwb3J0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliXzEuX19leHRlbmRzKEZldGNoVHJhbnNwb3J0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZldGNoVHJhbnNwb3J0KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgLyoqIExvY2tzIHRyYW5zcG9ydCBhZnRlciByZWNlaXZpbmcgNDI5IHJlc3BvbnNlICovXG4gICAgICAgIF90aGlzLl9kaXNhYmxlZFVudGlsID0gbmV3IERhdGUoRGF0ZS5ub3coKSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBGZXRjaFRyYW5zcG9ydC5wcm90b3R5cGUuc2VuZEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChuZXcgRGF0ZShEYXRlLm5vdygpKSA8IHRoaXMuX2Rpc2FibGVkVW50aWwpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgICAgIHJlYXNvbjogXCJUcmFuc3BvcnQgbG9ja2VkIHRpbGwgXCIgKyB0aGlzLl9kaXNhYmxlZFVudGlsICsgXCIgZHVlIHRvIHRvbyBtYW55IHJlcXVlc3RzLlwiLFxuICAgICAgICAgICAgICAgIHN0YXR1czogNDI5LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNlbnRyeVJlcSA9IGV2ZW50VG9TZW50cnlSZXF1ZXN0KGV2ZW50LCB0aGlzLl9hcGkpO1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGJvZHk6IHNlbnRyeVJlcS5ib2R5LFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAvLyBEZXNwaXRlIGFsbCBzdGFycyBpbiB0aGUgc2t5IHNheWluZyB0aGF0IEVkZ2Ugc3VwcG9ydHMgb2xkIGRyYWZ0IHN5bnRheCwgYWthICduZXZlcicsICdhbHdheXMnLCAnb3JpZ2luJyBhbmQgJ2RlZmF1bHRcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vY2FuaXVzZS5jb20vI2ZlYXQ9cmVmZXJyZXItcG9saWN5XG4gICAgICAgICAgICAvLyBJdCBkb2Vzbid0LiBBbmQgaXQgdGhyb3cgZXhjZXB0aW9uIGluc3RlYWQgb2YgaWdub3JpbmcgdGhpcyBwYXJhbWV0ZXIuLi5cbiAgICAgICAgICAgIC8vIFJFRjogaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9yYXZlbi1qcy9pc3N1ZXMvMTIzM1xuICAgICAgICAgICAgcmVmZXJyZXJQb2xpY3k6IChzdXBwb3J0c1JlZmVycmVyUG9saWN5KCkgPyAnb3JpZ2luJyA6ICcnKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oZWFkZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHRoaXMub3B0aW9ucy5oZWFkZXJzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9idWZmZXIuYWRkKG5ldyBTeW5jUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBnbG9iYWxcbiAgICAgICAgICAgICAgICAuZmV0Y2goc2VudHJ5UmVxLnVybCwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RhdHVzID0gU3RhdHVzLmZyb21IdHRwQ29kZShyZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IFN0YXR1cy5TdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBzdGF0dXM6IHN0YXR1cyB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBTdGF0dXMuUmF0ZUxpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZGlzYWJsZWRVbnRpbCA9IG5ldyBEYXRlKG5vdyArIHBhcnNlUmV0cnlBZnRlckhlYWRlcihub3csIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdSZXRyeS1BZnRlcicpKSk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiVG9vIG1hbnkgcmVxdWVzdHMsIGJhY2tpbmcgb2ZmIHRpbGw6IFwiICsgX3RoaXMuX2Rpc2FibGVkVW50aWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWplY3QocmVzcG9uc2UpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2gocmVqZWN0KTtcbiAgICAgICAgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIEZldGNoVHJhbnNwb3J0O1xufShCYXNlVHJhbnNwb3J0KSk7XG5leHBvcnQgeyBGZXRjaFRyYW5zcG9ydCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmV0Y2guanMubWFwIiwiZXhwb3J0IHsgQmFzZVRyYW5zcG9ydCB9IGZyb20gJy4vYmFzZSc7XG5leHBvcnQgeyBGZXRjaFRyYW5zcG9ydCB9IGZyb20gJy4vZmV0Y2gnO1xuZXhwb3J0IHsgWEhSVHJhbnNwb3J0IH0gZnJvbSAnLi94aHInO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGV2ZW50VG9TZW50cnlSZXF1ZXN0IH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IFN0YXR1cyB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgbG9nZ2VyLCBwYXJzZVJldHJ5QWZ0ZXJIZWFkZXIsIFN5bmNQcm9taXNlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBCYXNlVHJhbnNwb3J0IH0gZnJvbSAnLi9iYXNlJztcbi8qKiBgWEhSYCBiYXNlZCB0cmFuc3BvcnQgKi9cbnZhciBYSFJUcmFuc3BvcnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoWEhSVHJhbnNwb3J0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFhIUlRyYW5zcG9ydCgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIC8qKiBMb2NrcyB0cmFuc3BvcnQgYWZ0ZXIgcmVjZWl2aW5nIDQyOSByZXNwb25zZSAqL1xuICAgICAgICBfdGhpcy5fZGlzYWJsZWRVbnRpbCA9IG5ldyBEYXRlKERhdGUubm93KCkpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgWEhSVHJhbnNwb3J0LnByb3RvdHlwZS5zZW5kRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKG5ldyBEYXRlKERhdGUubm93KCkpIDwgdGhpcy5fZGlzYWJsZWRVbnRpbCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHtcbiAgICAgICAgICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgICAgICAgICAgcmVhc29uOiBcIlRyYW5zcG9ydCBsb2NrZWQgdGlsbCBcIiArIHRoaXMuX2Rpc2FibGVkVW50aWwgKyBcIiBkdWUgdG8gdG9vIG1hbnkgcmVxdWVzdHMuXCIsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiA0MjksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2VudHJ5UmVxID0gZXZlbnRUb1NlbnRyeVJlcXVlc3QoZXZlbnQsIHRoaXMuX2FwaSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWZmZXIuYWRkKG5ldyBTeW5jUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSBTdGF0dXMuZnJvbUh0dHBDb2RlKHJlcXVlc3Quc3RhdHVzKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBTdGF0dXMuU3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgc3RhdHVzOiBzdGF0dXMgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gU3RhdHVzLlJhdGVMaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2Rpc2FibGVkVW50aWwgPSBuZXcgRGF0ZShub3cgKyBwYXJzZVJldHJ5QWZ0ZXJIZWFkZXIobm93LCByZXF1ZXN0LmdldFJlc3BvbnNlSGVhZGVyKCdSZXRyeS1BZnRlcicpKSk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiVG9vIG1hbnkgcmVxdWVzdHMsIGJhY2tpbmcgb2ZmIHRpbGw6IFwiICsgX3RoaXMuX2Rpc2FibGVkVW50aWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWplY3QocmVxdWVzdCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVxdWVzdC5vcGVuKCdQT1NUJywgc2VudHJ5UmVxLnVybCk7XG4gICAgICAgICAgICBmb3IgKHZhciBoZWFkZXIgaW4gX3RoaXMub3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMuaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShoZWFkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIF90aGlzLm9wdGlvbnMuaGVhZGVyc1toZWFkZXJdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXF1ZXN0LnNlbmQoc2VudHJ5UmVxLmJvZHkpO1xuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gWEhSVHJhbnNwb3J0O1xufShCYXNlVHJhbnNwb3J0KSk7XG5leHBvcnQgeyBYSFJUcmFuc3BvcnQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXhoci5qcy5tYXAiLCJleHBvcnQgdmFyIFNES19OQU1FID0gJ3NlbnRyeS5qYXZhc2NyaXB0LmJyb3dzZXInO1xuZXhwb3J0IHZhciBTREtfVkVSU0lPTiA9ICc1LjE2LjEnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmVyc2lvbi5qcy5tYXAiLCJpbXBvcnQgeyBEc24sIHVybEVuY29kZSB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xudmFyIFNFTlRSWV9BUElfVkVSU0lPTiA9ICc3Jztcbi8qKiBIZWxwZXIgY2xhc3MgdG8gcHJvdmlkZSB1cmxzIHRvIGRpZmZlcmVudCBTZW50cnkgZW5kcG9pbnRzLiAqL1xudmFyIEFQSSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKiogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEFQSSAqL1xuICAgIGZ1bmN0aW9uIEFQSShkc24pIHtcbiAgICAgICAgdGhpcy5kc24gPSBkc247XG4gICAgICAgIHRoaXMuX2Rzbk9iamVjdCA9IG5ldyBEc24oZHNuKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdGhlIERzbiBvYmplY3QuICovXG4gICAgQVBJLnByb3RvdHlwZS5nZXREc24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kc25PYmplY3Q7XG4gICAgfTtcbiAgICAvKiogUmV0dXJucyB0aGUgcHJlZml4IHRvIGNvbnN0cnVjdCBTZW50cnkgaW5nZXN0aW9uIEFQSSBlbmRwb2ludHMuICovXG4gICAgQVBJLnByb3RvdHlwZS5nZXRCYXNlQXBpRW5kcG9pbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkc24gPSB0aGlzLl9kc25PYmplY3Q7XG4gICAgICAgIHZhciBwcm90b2NvbCA9IGRzbi5wcm90b2NvbCA/IGRzbi5wcm90b2NvbCArIFwiOlwiIDogJyc7XG4gICAgICAgIHZhciBwb3J0ID0gZHNuLnBvcnQgPyBcIjpcIiArIGRzbi5wb3J0IDogJyc7XG4gICAgICAgIHJldHVybiBwcm90b2NvbCArIFwiLy9cIiArIGRzbi5ob3N0ICsgcG9ydCArIChkc24ucGF0aCA/IFwiL1wiICsgZHNuLnBhdGggOiAnJykgKyBcIi9hcGkvXCI7XG4gICAgfTtcbiAgICAvKiogUmV0dXJucyB0aGUgc3RvcmUgZW5kcG9pbnQgVVJMLiAqL1xuICAgIEFQSS5wcm90b3R5cGUuZ2V0U3RvcmVFbmRwb2ludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEluZ2VzdEVuZHBvaW50KCdzdG9yZScpO1xuICAgIH07XG4gICAgLyoqIFJldHVybnMgdGhlIGVudmVsb3BlIGVuZHBvaW50IFVSTC4gKi9cbiAgICBBUEkucHJvdG90eXBlLl9nZXRFbnZlbG9wZUVuZHBvaW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0SW5nZXN0RW5kcG9pbnQoJ2VudmVsb3BlJyk7XG4gICAgfTtcbiAgICAvKiogUmV0dXJucyB0aGUgaW5nZXN0IEFQSSBlbmRwb2ludCBmb3IgdGFyZ2V0LiAqL1xuICAgIEFQSS5wcm90b3R5cGUuX2dldEluZ2VzdEVuZHBvaW50ID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICB2YXIgYmFzZSA9IHRoaXMuZ2V0QmFzZUFwaUVuZHBvaW50KCk7XG4gICAgICAgIHZhciBkc24gPSB0aGlzLl9kc25PYmplY3Q7XG4gICAgICAgIHJldHVybiBcIlwiICsgYmFzZSArIGRzbi5wcm9qZWN0SWQgKyBcIi9cIiArIHRhcmdldCArIFwiL1wiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RvcmUgZW5kcG9pbnQgVVJMIHdpdGggYXV0aCBpbiB0aGUgcXVlcnkgc3RyaW5nLlxuICAgICAqXG4gICAgICogU2VuZGluZyBhdXRoIGFzIHBhcnQgb2YgdGhlIHF1ZXJ5IHN0cmluZyBhbmQgbm90IGFzIGN1c3RvbSBIVFRQIGhlYWRlcnMgYXZvaWRzIENPUlMgcHJlZmxpZ2h0IHJlcXVlc3RzLlxuICAgICAqL1xuICAgIEFQSS5wcm90b3R5cGUuZ2V0U3RvcmVFbmRwb2ludFdpdGhVcmxFbmNvZGVkQXV0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RvcmVFbmRwb2ludCgpICsgXCI/XCIgKyB0aGlzLl9lbmNvZGVkQXV0aCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZW52ZWxvcGUgZW5kcG9pbnQgVVJMIHdpdGggYXV0aCBpbiB0aGUgcXVlcnkgc3RyaW5nLlxuICAgICAqXG4gICAgICogU2VuZGluZyBhdXRoIGFzIHBhcnQgb2YgdGhlIHF1ZXJ5IHN0cmluZyBhbmQgbm90IGFzIGN1c3RvbSBIVFRQIGhlYWRlcnMgYXZvaWRzIENPUlMgcHJlZmxpZ2h0IHJlcXVlc3RzLlxuICAgICAqL1xuICAgIEFQSS5wcm90b3R5cGUuZ2V0RW52ZWxvcGVFbmRwb2ludFdpdGhVcmxFbmNvZGVkQXV0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEVudmVsb3BlRW5kcG9pbnQoKSArIFwiP1wiICsgdGhpcy5fZW5jb2RlZEF1dGgoKTtcbiAgICB9O1xuICAgIC8qKiBSZXR1cm5zIGEgVVJMLWVuY29kZWQgc3RyaW5nIHdpdGggYXV0aCBjb25maWcgc3VpdGFibGUgZm9yIGEgcXVlcnkgc3RyaW5nLiAqL1xuICAgIEFQSS5wcm90b3R5cGUuX2VuY29kZWRBdXRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZHNuID0gdGhpcy5fZHNuT2JqZWN0O1xuICAgICAgICB2YXIgYXV0aCA9IHtcbiAgICAgICAgICAgIC8vIFdlIHNlbmQgb25seSB0aGUgbWluaW11bSBzZXQgb2YgcmVxdWlyZWQgaW5mb3JtYXRpb24uIFNlZVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdC9pc3N1ZXMvMjU3Mi5cbiAgICAgICAgICAgIHNlbnRyeV9rZXk6IGRzbi51c2VyLFxuICAgICAgICAgICAgc2VudHJ5X3ZlcnNpb246IFNFTlRSWV9BUElfVkVSU0lPTixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHVybEVuY29kZShhdXRoKTtcbiAgICB9O1xuICAgIC8qKiBSZXR1cm5zIG9ubHkgdGhlIHBhdGggY29tcG9uZW50IGZvciB0aGUgc3RvcmUgZW5kcG9pbnQuICovXG4gICAgQVBJLnByb3RvdHlwZS5nZXRTdG9yZUVuZHBvaW50UGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRzbiA9IHRoaXMuX2Rzbk9iamVjdDtcbiAgICAgICAgcmV0dXJuIChkc24ucGF0aCA/IFwiL1wiICsgZHNuLnBhdGggOiAnJykgKyBcIi9hcGkvXCIgKyBkc24ucHJvamVjdElkICsgXCIvc3RvcmUvXCI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGluIHJlcXVlc3QgaGVhZGVycy5cbiAgICAgKiBUaGlzIGlzIG5lZWRlZCBmb3Igbm9kZSBhbmQgdGhlIG9sZCAvc3RvcmUgZW5kcG9pbnQgaW4gc2VudHJ5XG4gICAgICovXG4gICAgQVBJLnByb3RvdHlwZS5nZXRSZXF1ZXN0SGVhZGVycyA9IGZ1bmN0aW9uIChjbGllbnROYW1lLCBjbGllbnRWZXJzaW9uKSB7XG4gICAgICAgIHZhciBkc24gPSB0aGlzLl9kc25PYmplY3Q7XG4gICAgICAgIHZhciBoZWFkZXIgPSBbXCJTZW50cnkgc2VudHJ5X3ZlcnNpb249XCIgKyBTRU5UUllfQVBJX1ZFUlNJT05dO1xuICAgICAgICBoZWFkZXIucHVzaChcInNlbnRyeV9jbGllbnQ9XCIgKyBjbGllbnROYW1lICsgXCIvXCIgKyBjbGllbnRWZXJzaW9uKTtcbiAgICAgICAgaGVhZGVyLnB1c2goXCJzZW50cnlfa2V5PVwiICsgZHNuLnVzZXIpO1xuICAgICAgICBpZiAoZHNuLnBhc3MpIHtcbiAgICAgICAgICAgIGhlYWRlci5wdXNoKFwic2VudHJ5X3NlY3JldD1cIiArIGRzbi5wYXNzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICdYLVNlbnRyeS1BdXRoJzogaGVhZGVyLmpvaW4oJywgJyksXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKiogUmV0dXJucyB0aGUgdXJsIHRvIHRoZSByZXBvcnQgZGlhbG9nIGVuZHBvaW50LiAqL1xuICAgIEFQSS5wcm90b3R5cGUuZ2V0UmVwb3J0RGlhbG9nRW5kcG9pbnQgPSBmdW5jdGlvbiAoZGlhbG9nT3B0aW9ucykge1xuICAgICAgICBpZiAoZGlhbG9nT3B0aW9ucyA9PT0gdm9pZCAwKSB7IGRpYWxvZ09wdGlvbnMgPSB7fTsgfVxuICAgICAgICB2YXIgZHNuID0gdGhpcy5fZHNuT2JqZWN0O1xuICAgICAgICB2YXIgZW5kcG9pbnQgPSB0aGlzLmdldEJhc2VBcGlFbmRwb2ludCgpICsgXCJlbWJlZC9lcnJvci1wYWdlL1wiO1xuICAgICAgICB2YXIgZW5jb2RlZE9wdGlvbnMgPSBbXTtcbiAgICAgICAgZW5jb2RlZE9wdGlvbnMucHVzaChcImRzbj1cIiArIGRzbi50b1N0cmluZygpKTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGRpYWxvZ09wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICd1c2VyJykge1xuICAgICAgICAgICAgICAgIGlmICghZGlhbG9nT3B0aW9ucy51c2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlhbG9nT3B0aW9ucy51c2VyLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2RlZE9wdGlvbnMucHVzaChcIm5hbWU9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoZGlhbG9nT3B0aW9ucy51c2VyLm5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRpYWxvZ09wdGlvbnMudXNlci5lbWFpbCkge1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGVkT3B0aW9ucy5wdXNoKFwiZW1haWw9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoZGlhbG9nT3B0aW9ucy51c2VyLmVtYWlsKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZW5jb2RlZE9wdGlvbnMucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGRpYWxvZ09wdGlvbnNba2V5XSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmNvZGVkT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbmRwb2ludCArIFwiP1wiICsgZW5jb2RlZE9wdGlvbnMuam9pbignJicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbmRwb2ludDtcbiAgICB9O1xuICAgIHJldHVybiBBUEk7XG59KCkpO1xuZXhwb3J0IHsgQVBJIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcGkuanMubWFwIiwiaW1wb3J0IHsgbG9nZ2VyLCBTZW50cnlFcnJvciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgTm9vcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0cy9ub29wJztcbi8qKlxuICogVGhpcyBpcyB0aGUgYmFzZSBpbXBsZW1lbnRpb24gb2YgYSBCYWNrZW5kLlxuICogQGhpZGRlblxuICovXG52YXIgQmFzZUJhY2tlbmQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqIENyZWF0ZXMgYSBuZXcgYmFja2VuZCBpbnN0YW5jZS4gKi9cbiAgICBmdW5jdGlvbiBCYXNlQmFja2VuZChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICBpZiAoIXRoaXMuX29wdGlvbnMuZHNuKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignTm8gRFNOIHByb3ZpZGVkLCBiYWNrZW5kIHdpbGwgbm90IGRvIGFueXRoaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydCA9IHRoaXMuX3NldHVwVHJhbnNwb3J0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdXAgdGhlIHRyYW5zcG9ydCBzbyBpdCBjYW4gYmUgdXNlZCBsYXRlciB0byBzZW5kIHJlcXVlc3RzLlxuICAgICAqL1xuICAgIEJhc2VCYWNrZW5kLnByb3RvdHlwZS5fc2V0dXBUcmFuc3BvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm9vcFRyYW5zcG9ydCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBCYXNlQmFja2VuZC5wcm90b3R5cGUuZXZlbnRGcm9tRXhjZXB0aW9uID0gZnVuY3Rpb24gKF9leGNlcHRpb24sIF9oaW50KSB7XG4gICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcignQmFja2VuZCBoYXMgdG8gaW1wbGVtZW50IGBldmVudEZyb21FeGNlcHRpb25gIG1ldGhvZCcpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBCYXNlQmFja2VuZC5wcm90b3R5cGUuZXZlbnRGcm9tTWVzc2FnZSA9IGZ1bmN0aW9uIChfbWVzc2FnZSwgX2xldmVsLCBfaGludCkge1xuICAgICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoJ0JhY2tlbmQgaGFzIHRvIGltcGxlbWVudCBgZXZlbnRGcm9tTWVzc2FnZWAgbWV0aG9kJyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VCYWNrZW5kLnByb3RvdHlwZS5zZW5kRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0LnNlbmRFdmVudChldmVudCkudGhlbihudWxsLCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJFcnJvciB3aGlsZSBzZW5kaW5nIGV2ZW50OiBcIiArIHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBCYXNlQmFja2VuZC5wcm90b3R5cGUuZ2V0VHJhbnNwb3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0O1xuICAgIH07XG4gICAgcmV0dXJuIEJhc2VCYWNrZW5kO1xufSgpKTtcbmV4cG9ydCB7IEJhc2VCYWNrZW5kIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXNlYmFja2VuZC5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgU2NvcGUgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgeyBEc24sIGlzUHJpbWl0aXZlLCBpc1RoZW5hYmxlLCBsb2dnZXIsIG5vcm1hbGl6ZSwgU3luY1Byb21pc2UsIHRpbWVzdGFtcFdpdGhNcywgdHJ1bmNhdGUsIHV1aWQ0LCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgc2V0dXBJbnRlZ3JhdGlvbnMgfSBmcm9tICcuL2ludGVncmF0aW9uJztcbi8qKlxuICogQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsIEphdmFTY3JpcHQgU0RLIGNsaWVudHMuXG4gKlxuICogQ2FsbCB0aGUgY29uc3RydWN0b3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBiYWNrZW5kIGNvbnN0cnVjdG9yIGFuZCBvcHRpb25zXG4gKiBzcGVjaWZpYyB0byB0aGUgY2xpZW50IHN1YmNsYXNzLiBUbyBhY2Nlc3MgdGhlc2Ugb3B0aW9ucyBsYXRlciwgdXNlXG4gKiB7QGxpbmsgQ2xpZW50LmdldE9wdGlvbnN9LiBBbHNvLCB0aGUgQmFja2VuZCBpbnN0YW5jZSBpcyBhdmFpbGFibGUgdmlhXG4gKiB7QGxpbmsgQ2xpZW50LmdldEJhY2tlbmR9LlxuICpcbiAqIElmIGEgRHNuIGlzIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucywgaXQgd2lsbCBiZSBwYXJzZWQgYW5kIHN0b3JlZC4gVXNlXG4gKiB7QGxpbmsgQ2xpZW50LmdldERzbn0gdG8gcmV0cmlldmUgdGhlIERzbiBhdCBhbnkgbW9tZW50LiBJbiBjYXNlIHRoZSBEc24gaXNcbiAqIGludmFsaWQsIHRoZSBjb25zdHJ1Y3RvciB3aWxsIHRocm93IGEge0BsaW5rIFNlbnRyeUV4Y2VwdGlvbn0uIE5vdGUgdGhhdFxuICogd2l0aG91dCBhIHZhbGlkIERzbiwgdGhlIFNESyB3aWxsIG5vdCBzZW5kIGFueSBldmVudHMgdG8gU2VudHJ5LlxuICpcbiAqIEJlZm9yZSBzZW5kaW5nIGFuIGV2ZW50IHZpYSB0aGUgYmFja2VuZCwgaXQgaXMgcGFzc2VkIHRocm91Z2hcbiAqIHtAbGluayBCYXNlQ2xpZW50LnByZXBhcmVFdmVudH0gdG8gYWRkIFNESyBpbmZvcm1hdGlvbiBhbmQgc2NvcGUgZGF0YVxuICogKGJyZWFkY3J1bWJzIGFuZCBjb250ZXh0KS4gVG8gYWRkIG1vcmUgY3VzdG9tIGluZm9ybWF0aW9uLCBvdmVycmlkZSB0aGlzXG4gKiBtZXRob2QgYW5kIGV4dGVuZCB0aGUgcmVzdWx0aW5nIHByZXBhcmVkIGV2ZW50LlxuICpcbiAqIFRvIGlzc3VlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBldmVudHMgKGUuZy4gdmlhIGluc3RydW1lbnRhdGlvbiksIHVzZVxuICoge0BsaW5rIENsaWVudC5jYXB0dXJlRXZlbnR9LiBJdCB3aWxsIHByZXBhcmUgdGhlIGV2ZW50IGFuZCBwYXNzIGl0IHRocm91Z2hcbiAqIHRoZSBjYWxsYmFjayBsaWZlY3ljbGUuIFRvIGlzc3VlIGF1dG8tYnJlYWRjcnVtYnMsIHVzZVxuICoge0BsaW5rIENsaWVudC5hZGRCcmVhZGNydW1ifS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY2xhc3MgTm9kZUNsaWVudCBleHRlbmRzIEJhc2VDbGllbnQ8Tm9kZUJhY2tlbmQsIE5vZGVPcHRpb25zPiB7XG4gKiAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBOb2RlT3B0aW9ucykge1xuICogICAgIHN1cGVyKE5vZGVCYWNrZW5kLCBvcHRpb25zKTtcbiAqICAgfVxuICpcbiAqICAgLy8gLi4uXG4gKiB9XG4gKi9cbnZhciBCYXNlQ2xpZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHRoaXMgY2xpZW50IGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJhY2tlbmRDbGFzcyBBIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgYmFja2VuZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgY2xpZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEJhc2VDbGllbnQoYmFja2VuZENsYXNzLCBvcHRpb25zKSB7XG4gICAgICAgIC8qKiBBcnJheSBvZiB1c2VkIGludGVncmF0aW9ucy4gKi9cbiAgICAgICAgdGhpcy5faW50ZWdyYXRpb25zID0ge307XG4gICAgICAgIC8qKiBJcyB0aGUgY2xpZW50IHN0aWxsIHByb2Nlc3NpbmcgYSBjYWxsPyAqL1xuICAgICAgICB0aGlzLl9wcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2JhY2tlbmQgPSBuZXcgYmFja2VuZENsYXNzKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgaWYgKG9wdGlvbnMuZHNuKSB7XG4gICAgICAgICAgICB0aGlzLl9kc24gPSBuZXcgRHNuKG9wdGlvbnMuZHNuKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLmNhcHR1cmVFeGNlcHRpb24gPSBmdW5jdGlvbiAoZXhjZXB0aW9uLCBoaW50LCBzY29wZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZXZlbnRJZCA9IGhpbnQgJiYgaGludC5ldmVudF9pZDtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc2luZyA9IHRydWU7XG4gICAgICAgIHRoaXMuX2dldEJhY2tlbmQoKVxuICAgICAgICAgICAgLmV2ZW50RnJvbUV4Y2VwdGlvbihleGNlcHRpb24sIGhpbnQpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50SWQgPSBfdGhpcy5jYXB0dXJlRXZlbnQoZXZlbnQsIGhpbnQsIHNjb3BlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBldmVudElkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5jYXB0dXJlTWVzc2FnZSA9IGZ1bmN0aW9uIChtZXNzYWdlLCBsZXZlbCwgaGludCwgc2NvcGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGV2ZW50SWQgPSBoaW50ICYmIGhpbnQuZXZlbnRfaWQ7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSB0cnVlO1xuICAgICAgICB2YXIgcHJvbWlzZWRFdmVudCA9IGlzUHJpbWl0aXZlKG1lc3NhZ2UpXG4gICAgICAgICAgICA/IHRoaXMuX2dldEJhY2tlbmQoKS5ldmVudEZyb21NZXNzYWdlKFwiXCIgKyBtZXNzYWdlLCBsZXZlbCwgaGludClcbiAgICAgICAgICAgIDogdGhpcy5fZ2V0QmFja2VuZCgpLmV2ZW50RnJvbUV4Y2VwdGlvbihtZXNzYWdlLCBoaW50KTtcbiAgICAgICAgcHJvbWlzZWRFdmVudC50aGVuKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgZXZlbnRJZCA9IF90aGlzLmNhcHR1cmVFdmVudChldmVudCwgaGludCwgc2NvcGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGV2ZW50SWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLmNhcHR1cmVFdmVudCA9IGZ1bmN0aW9uIChldmVudCwgaGludCwgc2NvcGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGV2ZW50SWQgPSBoaW50ICYmIGhpbnQuZXZlbnRfaWQ7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9wcm9jZXNzRXZlbnQoZXZlbnQsIGhpbnQsIHNjb3BlKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGZpbmFsRXZlbnQpIHtcbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgZm9yIGZpbmFsRXZlbnQgaW4gY2FzZSBiZWZvcmVTZW5kIHJldHVybmVkIG51bGxcbiAgICAgICAgICAgIGV2ZW50SWQgPSBmaW5hbEV2ZW50ICYmIGZpbmFsRXZlbnQuZXZlbnRfaWQ7XG4gICAgICAgICAgICBfdGhpcy5fcHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4obnVsbCwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHJlYXNvbik7XG4gICAgICAgICAgICBfdGhpcy5fcHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGV2ZW50SWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLmdldERzbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RzbjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKHRpbWVvdXQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzQ2xpZW50UHJvY2Vzc2luZyh0aW1lb3V0KS50aGVuKGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoc3RhdHVzLmludGVydmFsKTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5fZ2V0QmFja2VuZCgpXG4gICAgICAgICAgICAgICAgLmdldFRyYW5zcG9ydCgpXG4gICAgICAgICAgICAgICAgLmNsb3NlKHRpbWVvdXQpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHRyYW5zcG9ydEZsdXNoZWQpIHsgcmV0dXJuIHN0YXR1cy5yZWFkeSAmJiB0cmFuc3BvcnRGbHVzaGVkOyB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKHRpbWVvdXQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuZmx1c2godGltZW91dCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICBfdGhpcy5nZXRPcHRpb25zKCkuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIHVwIHRoZSBpbnRlZ3JhdGlvbnNcbiAgICAgKi9cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5zZXR1cEludGVncmF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnRlZ3JhdGlvbnMgPSBzZXR1cEludGVncmF0aW9ucyh0aGlzLl9vcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5nZXRJbnRlZ3JhdGlvbiA9IGZ1bmN0aW9uIChpbnRlZ3JhdGlvbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludGVncmF0aW9uc1tpbnRlZ3JhdGlvbi5pZF0gfHwgbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX29PKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIkNhbm5vdCByZXRyaWV2ZSBpbnRlZ3JhdGlvbiBcIiArIGludGVncmF0aW9uLmlkICsgXCIgZnJvbSB0aGUgY3VycmVudCBDbGllbnRcIik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqIFdhaXRzIGZvciB0aGUgY2xpZW50IHRvIGJlIGRvbmUgd2l0aCBwcm9jZXNzaW5nLiAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLl9pc0NsaWVudFByb2Nlc3NpbmcgPSBmdW5jdGlvbiAodGltZW91dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICB2YXIgdGlja2VkID0gMDtcbiAgICAgICAgICAgIHZhciB0aWNrID0gMTtcbiAgICAgICAgICAgIHZhciBpbnRlcnZhbCA9IDA7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX3RoaXMuX3Byb2Nlc3NpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbDogaW50ZXJ2YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFkeTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aWNrZWQgKz0gdGljaztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQgJiYgdGlja2VkID49IHRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsOiBpbnRlcnZhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHRpY2spO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKiBSZXR1cm5zIHRoZSBjdXJyZW50IGJhY2tlbmQuICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuX2dldEJhY2tlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYWNrZW5kO1xuICAgIH07XG4gICAgLyoqIERldGVybWluZXMgd2hldGhlciB0aGlzIFNESyBpcyBlbmFibGVkIGFuZCBhIHZhbGlkIERzbiBpcyBwcmVzZW50LiAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLl9pc0VuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9wdGlvbnMoKS5lbmFibGVkICE9PSBmYWxzZSAmJiB0aGlzLl9kc24gIT09IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgY29tbW9uIGluZm9ybWF0aW9uIHRvIGV2ZW50cy5cbiAgICAgKlxuICAgICAqIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyByZWxlYXNlIGFuZCBlbnZpcm9ubWVudCBmcm9tIGBvcHRpb25zYCxcbiAgICAgKiBicmVhZGNydW1icyBhbmQgY29udGV4dCAoZXh0cmEsIHRhZ3MgYW5kIHVzZXIpIGZyb20gdGhlIHNjb3BlLlxuICAgICAqXG4gICAgICogSW5mb3JtYXRpb24gdGhhdCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGV2ZW50IGlzIG5ldmVyIG92ZXJ3cml0dGVuLiBGb3JcbiAgICAgKiBuZXN0ZWQgb2JqZWN0cywgc3VjaCBhcyB0aGUgY29udGV4dCwga2V5cyBhcmUgbWVyZ2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBvcmlnaW5hbCBldmVudC5cbiAgICAgKiBAcGFyYW0gaGludCBNYXkgY29udGFpbiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBleGNlcHRpb24uXG4gICAgICogQHBhcmFtIHNjb3BlIEEgc2NvcGUgY29udGFpbmluZyBldmVudCBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBldmVudCB3aXRoIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuX3ByZXBhcmVFdmVudCA9IGZ1bmN0aW9uIChldmVudCwgc2NvcGUsIGhpbnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9hID0gdGhpcy5nZXRPcHRpb25zKCkubm9ybWFsaXplRGVwdGgsIG5vcm1hbGl6ZURlcHRoID0gX2EgPT09IHZvaWQgMCA/IDMgOiBfYTtcbiAgICAgICAgdmFyIHByZXBhcmVkID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgZXZlbnQsIHsgZXZlbnRfaWQ6IGV2ZW50LmV2ZW50X2lkIHx8IChoaW50ICYmIGhpbnQuZXZlbnRfaWQgPyBoaW50LmV2ZW50X2lkIDogdXVpZDQoKSksIHRpbWVzdGFtcDogZXZlbnQudGltZXN0YW1wIHx8IHRpbWVzdGFtcFdpdGhNcygpIH0pO1xuICAgICAgICB0aGlzLl9hcHBseUNsaWVudE9wdGlvbnMocHJlcGFyZWQpO1xuICAgICAgICB0aGlzLl9hcHBseUludGVncmF0aW9uc01ldGFkYXRhKHByZXBhcmVkKTtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBzY29wZSBnaXZlbiB0byB1cywgdXNlIGl0IGFzIHRoZSBiYXNlIGZvciBmdXJ0aGVyIG1vZGlmaWNhdGlvbnMuXG4gICAgICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgY29weWluZyBvZiBkYXRhIGlmIGBjYXB0dXJlQ29udGV4dGAgaXMgbm90IHByb3ZpZGVkLlxuICAgICAgICB2YXIgZmluYWxTY29wZSA9IHNjb3BlO1xuICAgICAgICBpZiAoaGludCAmJiBoaW50LmNhcHR1cmVDb250ZXh0KSB7XG4gICAgICAgICAgICBmaW5hbFNjb3BlID0gU2NvcGUuY2xvbmUoZmluYWxTY29wZSkudXBkYXRlKGhpbnQuY2FwdHVyZUNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIHByZXBhcmUgdGhlIHJlc3VsdCBoZXJlIHdpdGggYSByZXNvbHZlZCBFdmVudC5cbiAgICAgICAgdmFyIHJlc3VsdCA9IFN5bmNQcm9taXNlLnJlc29sdmUocHJlcGFyZWQpO1xuICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSB0aGUgbGFzdCB0aGluZyBjYWxsZWQsIHNpbmNlIHdlIHdhbnQgdGhhdFxuICAgICAgICAvLyB7QGxpbmsgSHViLmFkZEV2ZW50UHJvY2Vzc29yfSBnZXRzIHRoZSBmaW5pc2hlZCBwcmVwYXJlZCBldmVudC5cbiAgICAgICAgaWYgKGZpbmFsU2NvcGUpIHtcbiAgICAgICAgICAgIC8vIEluIGNhc2Ugd2UgaGF2ZSBhIGh1YiB3ZSByZWFzc2lnbiBpdC5cbiAgICAgICAgICAgIHJlc3VsdCA9IGZpbmFsU2NvcGUuYXBwbHlUb0V2ZW50KHByZXBhcmVkLCBoaW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygbm9ybWFsaXplRGVwdGggPT09ICdudW1iZXInICYmIG5vcm1hbGl6ZURlcHRoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fbm9ybWFsaXplRXZlbnQoZXZ0LCBub3JtYWxpemVEZXB0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXZ0O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgYG5vcm1hbGl6ZWAgZnVuY3Rpb24gb24gbmVjZXNzYXJ5IGBFdmVudGAgYXR0cmlidXRlcyB0byBtYWtlIHRoZW0gc2FmZSBmb3Igc2VyaWFsaXphdGlvbi5cbiAgICAgKiBOb3JtYWxpemVkIGtleXM6XG4gICAgICogLSBgYnJlYWRjcnVtYnMuZGF0YWBcbiAgICAgKiAtIGB1c2VyYFxuICAgICAqIC0gYGNvbnRleHRzYFxuICAgICAqIC0gYGV4dHJhYFxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudFxuICAgICAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgZXZlbnRcbiAgICAgKi9cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5fbm9ybWFsaXplRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGRlcHRoKSB7XG4gICAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLXVuc2FmZS1hbnlcbiAgICAgICAgcmV0dXJuIHRzbGliXzEuX19hc3NpZ24oe30sIGV2ZW50LCAoZXZlbnQuYnJlYWRjcnVtYnMgJiYge1xuICAgICAgICAgICAgYnJlYWRjcnVtYnM6IGV2ZW50LmJyZWFkY3J1bWJzLm1hcChmdW5jdGlvbiAoYikgeyByZXR1cm4gKHRzbGliXzEuX19hc3NpZ24oe30sIGIsIChiLmRhdGEgJiYge1xuICAgICAgICAgICAgICAgIGRhdGE6IG5vcm1hbGl6ZShiLmRhdGEsIGRlcHRoKSxcbiAgICAgICAgICAgIH0pKSk7IH0pLFxuICAgICAgICB9KSwgKGV2ZW50LnVzZXIgJiYge1xuICAgICAgICAgICAgdXNlcjogbm9ybWFsaXplKGV2ZW50LnVzZXIsIGRlcHRoKSxcbiAgICAgICAgfSksIChldmVudC5jb250ZXh0cyAmJiB7XG4gICAgICAgICAgICBjb250ZXh0czogbm9ybWFsaXplKGV2ZW50LmNvbnRleHRzLCBkZXB0aCksXG4gICAgICAgIH0pLCAoZXZlbnQuZXh0cmEgJiYge1xuICAgICAgICAgICAgZXh0cmE6IG5vcm1hbGl6ZShldmVudC5leHRyYSwgZGVwdGgpLFxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiAgRW5oYW5jZXMgZXZlbnQgdXNpbmcgdGhlIGNsaWVudCBjb25maWd1cmF0aW9uLlxuICAgICAqICBJdCB0YWtlcyBjYXJlIG9mIGFsbCBcInN0YXRpY1wiIHZhbHVlcyBsaWtlIGVudmlyb25tZW50LCByZWxlYXNlIGFuZCBgZGlzdGAsXG4gICAgICogIGFzIHdlbGwgYXMgdHJ1bmNhdGluZyBvdmVybHkgbG9uZyB2YWx1ZXMuXG4gICAgICogQHBhcmFtIGV2ZW50IGV2ZW50IGluc3RhbmNlIHRvIGJlIGVuaGFuY2VkXG4gICAgICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuX2FwcGx5Q2xpZW50T3B0aW9ucyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmdldE9wdGlvbnMoKSwgZW52aXJvbm1lbnQgPSBfYS5lbnZpcm9ubWVudCwgcmVsZWFzZSA9IF9hLnJlbGVhc2UsIGRpc3QgPSBfYS5kaXN0LCBfYiA9IF9hLm1heFZhbHVlTGVuZ3RoLCBtYXhWYWx1ZUxlbmd0aCA9IF9iID09PSB2b2lkIDAgPyAyNTAgOiBfYjtcbiAgICAgICAgaWYgKGV2ZW50LmVudmlyb25tZW50ID09PSB1bmRlZmluZWQgJiYgZW52aXJvbm1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXZlbnQuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQucmVsZWFzZSA9PT0gdW5kZWZpbmVkICYmIHJlbGVhc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXZlbnQucmVsZWFzZSA9IHJlbGVhc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmRpc3QgPT09IHVuZGVmaW5lZCAmJiBkaXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV2ZW50LmRpc3QgPSBkaXN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5tZXNzYWdlKSB7XG4gICAgICAgICAgICBldmVudC5tZXNzYWdlID0gdHJ1bmNhdGUoZXZlbnQubWVzc2FnZSwgbWF4VmFsdWVMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBleGNlcHRpb24gPSBldmVudC5leGNlcHRpb24gJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyAmJiBldmVudC5leGNlcHRpb24udmFsdWVzWzBdO1xuICAgICAgICBpZiAoZXhjZXB0aW9uICYmIGV4Y2VwdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgZXhjZXB0aW9uLnZhbHVlID0gdHJ1bmNhdGUoZXhjZXB0aW9uLnZhbHVlLCBtYXhWYWx1ZUxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlcXVlc3QgPSBldmVudC5yZXF1ZXN0O1xuICAgICAgICBpZiAocmVxdWVzdCAmJiByZXF1ZXN0LnVybCkge1xuICAgICAgICAgICAgcmVxdWVzdC51cmwgPSB0cnVuY2F0ZShyZXF1ZXN0LnVybCwgbWF4VmFsdWVMZW5ndGgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYWxsIHVzZWQgaW50ZWdyYXRpb25zIHRvIHRoZSBTREsgaW5mbyBpbiB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHNka0luZm8gVGhlIHNka0luZm8gb2YgdGhlIGV2ZW50IHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCBhbGwgaW50ZWdyYXRpb25zLlxuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLl9hcHBseUludGVncmF0aW9uc01ldGFkYXRhID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBzZGtJbmZvID0gZXZlbnQuc2RrO1xuICAgICAgICB2YXIgaW50ZWdyYXRpb25zQXJyYXkgPSBPYmplY3Qua2V5cyh0aGlzLl9pbnRlZ3JhdGlvbnMpO1xuICAgICAgICBpZiAoc2RrSW5mbyAmJiBpbnRlZ3JhdGlvbnNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzZGtJbmZvLmludGVncmF0aW9ucyA9IGludGVncmF0aW9uc0FycmF5O1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUZWxscyB0aGUgYmFja2VuZCB0byBzZW5kIHRoaXMgZXZlbnRcbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIFNlbnRyeSBldmVudCB0byBzZW5kXG4gICAgICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuX3NlbmRFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB0aGlzLl9nZXRCYWNrZW5kKCkuc2VuZEV2ZW50KGV2ZW50KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbiBldmVudCAoZWl0aGVyIGVycm9yIG9yIG1lc3NhZ2UpIGFuZCBzZW5kcyBpdCB0byBTZW50cnkuXG4gICAgICpcbiAgICAgKiBUaGlzIGFsc28gYWRkcyBicmVhZGNydW1icyBhbmQgY29udGV4dCBpbmZvcm1hdGlvbiB0byB0aGUgZXZlbnQuIEhvd2V2ZXIsXG4gICAgICogcGxhdGZvcm0gc3BlY2lmaWMgbWV0YSBkYXRhIChzdWNoIGFzIHRoZSBVc2VyJ3MgSVAgYWRkcmVzcykgbXVzdCBiZSBhZGRlZFxuICAgICAqIGJ5IHRoZSBTREsgaW1wbGVtZW50b3IuXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gc2VuZCB0byBTZW50cnkuXG4gICAgICogQHBhcmFtIGhpbnQgTWF5IGNvbnRhaW4gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uLlxuICAgICAqIEBwYXJhbSBzY29wZSBBIHNjb3BlIGNvbnRhaW5pbmcgZXZlbnQgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMgQSBTeW5jUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGV2ZW50IG9yIHJlamVjdHMgaW4gY2FzZSBldmVudCB3YXMvd2lsbCBub3QgYmUgc2VuZC5cbiAgICAgKi9cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5fcHJvY2Vzc0V2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCBoaW50LCBzY29wZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmdldE9wdGlvbnMoKSwgYmVmb3JlU2VuZCA9IF9hLmJlZm9yZVNlbmQsIHNhbXBsZVJhdGUgPSBfYS5zYW1wbGVSYXRlO1xuICAgICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gU3luY1Byb21pc2UucmVqZWN0KCdTREsgbm90IGVuYWJsZWQsIHdpbGwgbm90IHNlbmQgZXZlbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlzVHJhbnNhY3Rpb24gPSBldmVudC50eXBlID09PSAndHJhbnNhY3Rpb24nO1xuICAgICAgICAvLyAxLjAgPT09IDEwMCUgZXZlbnRzIGFyZSBzZW50XG4gICAgICAgIC8vIDAuMCA9PT0gMCUgZXZlbnRzIGFyZSBzZW50XG4gICAgICAgIC8vIFNhbXBsaW5nIGZvciB0cmFuc2FjdGlvbiBoYXBwZW5zIHNvbWV3aGVyZSBlbHNlXG4gICAgICAgIGlmICghaXNUcmFuc2FjdGlvbiAmJiB0eXBlb2Ygc2FtcGxlUmF0ZSA9PT0gJ251bWJlcicgJiYgTWF0aC5yYW5kb20oKSA+IHNhbXBsZVJhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZWplY3QoJ1RoaXMgZXZlbnQgaGFzIGJlZW4gc2FtcGxlZCwgd2lsbCBub3Qgc2VuZCBldmVudC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIF90aGlzLl9wcmVwYXJlRXZlbnQoZXZlbnQsIHNjb3BlLCBoaW50KVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChwcmVwYXJlZCkge1xuICAgICAgICAgICAgICAgIGlmIChwcmVwYXJlZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0FuIGV2ZW50IHByb2Nlc3NvciByZXR1cm5lZCBudWxsLCB3aWxsIG5vdCBzZW5kIGV2ZW50LicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBmaW5hbEV2ZW50ID0gcHJlcGFyZWQ7XG4gICAgICAgICAgICAgICAgdmFyIGlzSW50ZXJuYWxFeGNlcHRpb24gPSBoaW50ICYmIGhpbnQuZGF0YSAmJiBoaW50LmRhdGEuX19zZW50cnlfXyA9PT0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyBXZSBza2lwIGJlZm9yZVNlbmQgaW4gY2FzZSBvZiB0cmFuc2FjdGlvbnNcbiAgICAgICAgICAgICAgICBpZiAoaXNJbnRlcm5hbEV4Y2VwdGlvbiB8fCAhYmVmb3JlU2VuZCB8fCBpc1RyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9zZW5kRXZlbnQoZmluYWxFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmluYWxFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGJlZm9yZVNlbmRSZXN1bHQgPSBiZWZvcmVTZW5kKHByZXBhcmVkLCBoaW50KTtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYmVmb3JlU2VuZFJlc3VsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdgYmVmb3JlU2VuZGAgbWV0aG9kIGhhcyB0byByZXR1cm4gYG51bGxgIG9yIGEgdmFsaWQgZXZlbnQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzVGhlbmFibGUoYmVmb3JlU2VuZFJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2hhbmRsZUFzeW5jQmVmb3JlU2VuZChiZWZvcmVTZW5kUmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxFdmVudCA9IGJlZm9yZVNlbmRSZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbEV2ZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKCdgYmVmb3JlU2VuZGAgcmV0dXJuZWQgYG51bGxgLCB3aWxsIG5vdCBzZW5kIGV2ZW50LicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBGcm9tIGhlcmUgb24gd2UgYXJlIHJlYWxseSBhc3luY1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fc2VuZEV2ZW50KGZpbmFsRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZpbmFsRXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4obnVsbCwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgICAgIF90aGlzLmNhcHR1cmVFeGNlcHRpb24ocmVhc29uLCB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fc2VudHJ5X186IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRXhjZXB0aW9uOiByZWFzb24sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KFwiRXZlbnQgcHJvY2Vzc2luZyBwaXBlbGluZSB0aHJldyBhbiBlcnJvciwgb3JpZ2luYWwgZXZlbnQgd2lsbCBub3QgYmUgc2VudC4gRGV0YWlscyBoYXZlIGJlZW4gc2VudCBhcyBhIG5ldyBldmVudC5cXG5SZWFzb246IFwiICsgcmVhc29uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIGJlZm9yZSBzZW5kIFByb21pc2UgYW5kIGNhbGxzIHJlc29sdmUvcmVqZWN0IG9uIHBhcmVudCBTeW5jUHJvbWlzZS5cbiAgICAgKi9cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5faGFuZGxlQXN5bmNCZWZvcmVTZW5kID0gZnVuY3Rpb24gKGJlZm9yZVNlbmQsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBiZWZvcmVTZW5kXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocHJvY2Vzc2VkRXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzZWRFdmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlamVjdCgnYGJlZm9yZVNlbmRgIHJldHVybmVkIGBudWxsYCwgd2lsbCBub3Qgc2VuZCBldmVudC4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGcm9tIGhlcmUgb24gd2UgYXJlIHJlYWxseSBhc3luY1xuICAgICAgICAgICAgX3RoaXMuX3NlbmRFdmVudChwcm9jZXNzZWRFdmVudCk7XG4gICAgICAgICAgICByZXNvbHZlKHByb2Nlc3NlZEV2ZW50KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKG51bGwsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZWplY3QoXCJiZWZvcmVTZW5kIHJlamVjdGVkIHdpdGggXCIgKyBlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQmFzZUNsaWVudDtcbn0oKSk7XG5leHBvcnQgeyBCYXNlQ2xpZW50IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXNlY2xpZW50LmpzLm1hcCIsImV4cG9ydCB7IGFkZEJyZWFkY3J1bWIsIGNhcHR1cmVFeGNlcHRpb24sIGNhcHR1cmVFdmVudCwgY2FwdHVyZU1lc3NhZ2UsIGNvbmZpZ3VyZVNjb3BlLCBzdGFydFRyYW5zYWN0aW9uLCBzZXRDb250ZXh0LCBzZXRFeHRyYSwgc2V0RXh0cmFzLCBzZXRUYWcsIHNldFRhZ3MsIHNldFVzZXIsIHdpdGhTY29wZSwgfSBmcm9tICdAc2VudHJ5L21pbmltYWwnO1xuZXhwb3J0IHsgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IsIGdldEN1cnJlbnRIdWIsIGdldEh1YkZyb21DYXJyaWVyLCBIdWIsIFNjb3BlIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuZXhwb3J0IHsgQVBJIH0gZnJvbSAnLi9hcGknO1xuZXhwb3J0IHsgQmFzZUNsaWVudCB9IGZyb20gJy4vYmFzZWNsaWVudCc7XG5leHBvcnQgeyBCYXNlQmFja2VuZCB9IGZyb20gJy4vYmFzZWJhY2tlbmQnO1xuZXhwb3J0IHsgZXZlbnRUb1NlbnRyeVJlcXVlc3QgfSBmcm9tICcuL3JlcXVlc3QnO1xuZXhwb3J0IHsgaW5pdEFuZEJpbmQgfSBmcm9tICcuL3Nkayc7XG5leHBvcnQgeyBOb29wVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnRzL25vb3AnO1xuaW1wb3J0ICogYXMgSW50ZWdyYXRpb25zIGZyb20gJy4vaW50ZWdyYXRpb25zJztcbmV4cG9ydCB7IEludGVncmF0aW9ucyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5leHBvcnQgdmFyIGluc3RhbGxlZEludGVncmF0aW9ucyA9IFtdO1xuLyoqIEdldHMgaW50ZWdyYXRpb24gdG8gaW5zdGFsbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVncmF0aW9uc1RvU2V0dXAob3B0aW9ucykge1xuICAgIHZhciBkZWZhdWx0SW50ZWdyYXRpb25zID0gKG9wdGlvbnMuZGVmYXVsdEludGVncmF0aW9ucyAmJiB0c2xpYl8xLl9fc3ByZWFkKG9wdGlvbnMuZGVmYXVsdEludGVncmF0aW9ucykpIHx8IFtdO1xuICAgIHZhciB1c2VySW50ZWdyYXRpb25zID0gb3B0aW9ucy5pbnRlZ3JhdGlvbnM7XG4gICAgdmFyIGludGVncmF0aW9ucyA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHVzZXJJbnRlZ3JhdGlvbnMpKSB7XG4gICAgICAgIHZhciB1c2VySW50ZWdyYXRpb25zTmFtZXNfMSA9IHVzZXJJbnRlZ3JhdGlvbnMubWFwKGZ1bmN0aW9uIChpKSB7IHJldHVybiBpLm5hbWU7IH0pO1xuICAgICAgICB2YXIgcGlja2VkSW50ZWdyYXRpb25zTmFtZXNfMSA9IFtdO1xuICAgICAgICAvLyBMZWF2ZSBvbmx5IHVuaXF1ZSBkZWZhdWx0IGludGVncmF0aW9ucywgdGhhdCB3ZXJlIG5vdCBvdmVycmlkZGVuIHdpdGggcHJvdmlkZWQgdXNlciBpbnRlZ3JhdGlvbnNcbiAgICAgICAgZGVmYXVsdEludGVncmF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChkZWZhdWx0SW50ZWdyYXRpb24pIHtcbiAgICAgICAgICAgIGlmICh1c2VySW50ZWdyYXRpb25zTmFtZXNfMS5pbmRleE9mKGRlZmF1bHRJbnRlZ3JhdGlvbi5uYW1lKSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICBwaWNrZWRJbnRlZ3JhdGlvbnNOYW1lc18xLmluZGV4T2YoZGVmYXVsdEludGVncmF0aW9uLm5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGludGVncmF0aW9ucy5wdXNoKGRlZmF1bHRJbnRlZ3JhdGlvbik7XG4gICAgICAgICAgICAgICAgcGlja2VkSW50ZWdyYXRpb25zTmFtZXNfMS5wdXNoKGRlZmF1bHRJbnRlZ3JhdGlvbi5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIERvbid0IGFkZCBzYW1lIHVzZXIgaW50ZWdyYXRpb24gdHdpY2VcbiAgICAgICAgdXNlckludGVncmF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uICh1c2VySW50ZWdyYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChwaWNrZWRJbnRlZ3JhdGlvbnNOYW1lc18xLmluZGV4T2YodXNlckludGVncmF0aW9uLm5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGludGVncmF0aW9ucy5wdXNoKHVzZXJJbnRlZ3JhdGlvbik7XG4gICAgICAgICAgICAgICAgcGlja2VkSW50ZWdyYXRpb25zTmFtZXNfMS5wdXNoKHVzZXJJbnRlZ3JhdGlvbi5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB1c2VySW50ZWdyYXRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGludGVncmF0aW9ucyA9IHVzZXJJbnRlZ3JhdGlvbnMoZGVmYXVsdEludGVncmF0aW9ucyk7XG4gICAgICAgIGludGVncmF0aW9ucyA9IEFycmF5LmlzQXJyYXkoaW50ZWdyYXRpb25zKSA/IGludGVncmF0aW9ucyA6IFtpbnRlZ3JhdGlvbnNdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaW50ZWdyYXRpb25zID0gdHNsaWJfMS5fX3NwcmVhZChkZWZhdWx0SW50ZWdyYXRpb25zKTtcbiAgICB9XG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgaWYgcHJlc2VudCwgYERlYnVnYCBpbnRlZ3JhdGlvbiB3aWxsIGFsd2F5cyBydW4gbGFzdFxuICAgIHZhciBpbnRlZ3JhdGlvbnNOYW1lcyA9IGludGVncmF0aW9ucy5tYXAoZnVuY3Rpb24gKGkpIHsgcmV0dXJuIGkubmFtZTsgfSk7XG4gICAgdmFyIGFsd2F5c0xhc3RUb1J1biA9ICdEZWJ1Zyc7XG4gICAgaWYgKGludGVncmF0aW9uc05hbWVzLmluZGV4T2YoYWx3YXlzTGFzdFRvUnVuKSAhPT0gLTEpIHtcbiAgICAgICAgaW50ZWdyYXRpb25zLnB1c2guYXBwbHkoaW50ZWdyYXRpb25zLCB0c2xpYl8xLl9fc3ByZWFkKGludGVncmF0aW9ucy5zcGxpY2UoaW50ZWdyYXRpb25zTmFtZXMuaW5kZXhPZihhbHdheXNMYXN0VG9SdW4pLCAxKSkpO1xuICAgIH1cbiAgICByZXR1cm4gaW50ZWdyYXRpb25zO1xufVxuLyoqIFNldHVwIGdpdmVuIGludGVncmF0aW9uICovXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBJbnRlZ3JhdGlvbihpbnRlZ3JhdGlvbikge1xuICAgIGlmIChpbnN0YWxsZWRJbnRlZ3JhdGlvbnMuaW5kZXhPZihpbnRlZ3JhdGlvbi5uYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbnRlZ3JhdGlvbi5zZXR1cE9uY2UoYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IsIGdldEN1cnJlbnRIdWIpO1xuICAgIGluc3RhbGxlZEludGVncmF0aW9ucy5wdXNoKGludGVncmF0aW9uLm5hbWUpO1xuICAgIGxvZ2dlci5sb2coXCJJbnRlZ3JhdGlvbiBpbnN0YWxsZWQ6IFwiICsgaW50ZWdyYXRpb24ubmFtZSk7XG59XG4vKipcbiAqIEdpdmVuIGEgbGlzdCBvZiBpbnRlZ3JhdGlvbiBpbnN0YW5jZXMgdGhpcyBpbnN0YWxscyB0aGVtIGFsbC4gV2hlbiBgd2l0aERlZmF1bHRzYCBpcyBzZXQgdG8gYHRydWVgIHRoZW4gYWxsIGRlZmF1bHRcbiAqIGludGVncmF0aW9ucyBhcmUgYWRkZWQgdW5sZXNzIHRoZXkgd2VyZSBhbHJlYWR5IHByb3ZpZGVkIGJlZm9yZS5cbiAqIEBwYXJhbSBpbnRlZ3JhdGlvbnMgYXJyYXkgb2YgaW50ZWdyYXRpb24gaW5zdGFuY2VzXG4gKiBAcGFyYW0gd2l0aERlZmF1bHQgc2hvdWxkIGVuYWJsZSBkZWZhdWx0IGludGVncmF0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBJbnRlZ3JhdGlvbnMob3B0aW9ucykge1xuICAgIHZhciBpbnRlZ3JhdGlvbnMgPSB7fTtcbiAgICBnZXRJbnRlZ3JhdGlvbnNUb1NldHVwKG9wdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKGludGVncmF0aW9uKSB7XG4gICAgICAgIGludGVncmF0aW9uc1tpbnRlZ3JhdGlvbi5uYW1lXSA9IGludGVncmF0aW9uO1xuICAgICAgICBzZXR1cEludGVncmF0aW9uKGludGVncmF0aW9uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gaW50ZWdyYXRpb25zO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50ZWdyYXRpb24uanMubWFwIiwidmFyIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZztcbi8qKiBQYXRjaCB0b1N0cmluZyBjYWxscyB0byByZXR1cm4gcHJvcGVyIG5hbWUgZm9yIHdyYXBwZWQgZnVuY3Rpb25zICovXG52YXIgRnVuY3Rpb25Ub1N0cmluZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGdW5jdGlvblRvU3RyaW5nKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGluaGVyaXREb2NcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmFtZSA9IEZ1bmN0aW9uVG9TdHJpbmcuaWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgRnVuY3Rpb25Ub1N0cmluZy5wcm90b3R5cGUuc2V0dXBPbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmcgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XG4gICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5fX3NlbnRyeV9vcmlnaW5hbF9fIHx8IHRoaXM7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5zYWZlLWFueVxuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgRnVuY3Rpb25Ub1N0cmluZy5pZCA9ICdGdW5jdGlvblRvU3RyaW5nJztcbiAgICByZXR1cm4gRnVuY3Rpb25Ub1N0cmluZztcbn0oKSk7XG5leHBvcnQgeyBGdW5jdGlvblRvU3RyaW5nIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mdW5jdGlvbnRvc3RyaW5nLmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBhZGRHbG9iYWxFdmVudFByb2Nlc3NvciwgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IGdldEV2ZW50RGVzY3JpcHRpb24sIGlzTWF0Y2hpbmdQYXR0ZXJuLCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbi8vIFwiU2NyaXB0IGVycm9yLlwiIGlzIGhhcmQgY29kZWQgaW50byBicm93c2VycyBmb3IgZXJyb3JzIHRoYXQgaXQgY2FuJ3QgcmVhZC5cbi8vIHRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhIHNjcmlwdCBiZWluZyBwdWxsZWQgaW4gZnJvbSBhbiBleHRlcm5hbCBkb21haW4gYW5kIENPUlMuXG52YXIgREVGQVVMVF9JR05PUkVfRVJST1JTID0gWy9eU2NyaXB0IGVycm9yXFwuPyQvLCAvXkphdmFzY3JpcHQgZXJyb3I6IFNjcmlwdCBlcnJvclxcLj8gb24gbGluZSAwJC9dO1xuLyoqIEluYm91bmQgZmlsdGVycyBjb25maWd1cmFibGUgYnkgdGhlIHVzZXIgKi9cbnZhciBJbmJvdW5kRmlsdGVycyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJbmJvdW5kRmlsdGVycyhfb3B0aW9ucykge1xuICAgICAgICBpZiAoX29wdGlvbnMgPT09IHZvaWQgMCkgeyBfb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbmhlcml0RG9jXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5hbWUgPSBJbmJvdW5kRmlsdGVycy5pZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBJbmJvdW5kRmlsdGVycy5wcm90b3R5cGUuc2V0dXBPbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcihmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBodWIgPSBnZXRDdXJyZW50SHViKCk7XG4gICAgICAgICAgICBpZiAoIWh1Yikge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzZWxmID0gaHViLmdldEludGVncmF0aW9uKEluYm91bmRGaWx0ZXJzKTtcbiAgICAgICAgICAgIGlmIChzZWxmKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNsaWVudCA9IGh1Yi5nZXRDbGllbnQoKTtcbiAgICAgICAgICAgICAgICB2YXIgY2xpZW50T3B0aW9ucyA9IGNsaWVudCA/IGNsaWVudC5nZXRPcHRpb25zKCkgOiB7fTtcbiAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHNlbGYuX21lcmdlT3B0aW9ucyhjbGllbnRPcHRpb25zKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fc2hvdWxkRHJvcEV2ZW50KGV2ZW50LCBvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgSW5ib3VuZEZpbHRlcnMucHJvdG90eXBlLl9zaG91bGREcm9wRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzU2VudHJ5RXJyb3IoZXZlbnQsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIkV2ZW50IGRyb3BwZWQgZHVlIHRvIGJlaW5nIGludGVybmFsIFNlbnRyeSBFcnJvci5cXG5FdmVudDogXCIgKyBnZXRFdmVudERlc2NyaXB0aW9uKGV2ZW50KSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faXNJZ25vcmVkRXJyb3IoZXZlbnQsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIkV2ZW50IGRyb3BwZWQgZHVlIHRvIGJlaW5nIG1hdGNoZWQgYnkgYGlnbm9yZUVycm9yc2Agb3B0aW9uLlxcbkV2ZW50OiBcIiArIGdldEV2ZW50RGVzY3JpcHRpb24oZXZlbnQpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pc0JsYWNrbGlzdGVkVXJsKGV2ZW50LCBvcHRpb25zKSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJFdmVudCBkcm9wcGVkIGR1ZSB0byBiZWluZyBtYXRjaGVkIGJ5IGBibGFja2xpc3RVcmxzYCBvcHRpb24uXFxuRXZlbnQ6IFwiICsgZ2V0RXZlbnREZXNjcmlwdGlvbihldmVudCkgKyBcIi5cXG5Vcmw6IFwiICsgdGhpcy5fZ2V0RXZlbnRGaWx0ZXJVcmwoZXZlbnQpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5faXNXaGl0ZWxpc3RlZFVybChldmVudCwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiRXZlbnQgZHJvcHBlZCBkdWUgdG8gbm90IGJlaW5nIG1hdGNoZWQgYnkgYHdoaXRlbGlzdFVybHNgIG9wdGlvbi5cXG5FdmVudDogXCIgKyBnZXRFdmVudERlc2NyaXB0aW9uKGV2ZW50KSArIFwiLlxcblVybDogXCIgKyB0aGlzLl9nZXRFdmVudEZpbHRlclVybChldmVudCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgSW5ib3VuZEZpbHRlcnMucHJvdG90eXBlLl9pc1NlbnRyeUVycm9yID0gZnVuY3Rpb24gKGV2ZW50LCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVJbnRlcm5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gKChldmVudCAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmV4Y2VwdGlvbiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgJiZcbiAgICAgICAgICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS50eXBlID09PSAnU2VudHJ5RXJyb3InKSB8fFxuICAgICAgICAgICAgICAgIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX29PKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIEluYm91bmRGaWx0ZXJzLnByb3RvdHlwZS5faXNJZ25vcmVkRXJyb3IgPSBmdW5jdGlvbiAoZXZlbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUVycm9ycyB8fCAhb3B0aW9ucy5pZ25vcmVFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFBvc3NpYmxlRXZlbnRNZXNzYWdlcyhldmVudCkuc29tZShmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgICAgICAgLy8gTm90IHN1cmUgd2h5IFR5cGVTY3JpcHQgY29tcGxhaW5zIGhlcmUuLi5cbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmlnbm9yZUVycm9ycy5zb21lKGZ1bmN0aW9uIChwYXR0ZXJuKSB7IHJldHVybiBpc01hdGNoaW5nUGF0dGVybihtZXNzYWdlLCBwYXR0ZXJuKTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgSW5ib3VuZEZpbHRlcnMucHJvdG90eXBlLl9pc0JsYWNrbGlzdGVkVXJsID0gZnVuY3Rpb24gKGV2ZW50LCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIC8vIFRPRE86IFVzZSBHbG9iIGluc3RlYWQ/XG4gICAgICAgIGlmICghb3B0aW9ucy5ibGFja2xpc3RVcmxzIHx8ICFvcHRpb25zLmJsYWNrbGlzdFVybHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHVybCA9IHRoaXMuX2dldEV2ZW50RmlsdGVyVXJsKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuICF1cmwgPyBmYWxzZSA6IG9wdGlvbnMuYmxhY2tsaXN0VXJscy5zb21lKGZ1bmN0aW9uIChwYXR0ZXJuKSB7IHJldHVybiBpc01hdGNoaW5nUGF0dGVybih1cmwsIHBhdHRlcm4pOyB9KTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIEluYm91bmRGaWx0ZXJzLnByb3RvdHlwZS5faXNXaGl0ZWxpc3RlZFVybCA9IGZ1bmN0aW9uIChldmVudCwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICAvLyBUT0RPOiBVc2UgR2xvYiBpbnN0ZWFkP1xuICAgICAgICBpZiAoIW9wdGlvbnMud2hpdGVsaXN0VXJscyB8fCAhb3B0aW9ucy53aGl0ZWxpc3RVcmxzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHVybCA9IHRoaXMuX2dldEV2ZW50RmlsdGVyVXJsKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuICF1cmwgPyB0cnVlIDogb3B0aW9ucy53aGl0ZWxpc3RVcmxzLnNvbWUoZnVuY3Rpb24gKHBhdHRlcm4pIHsgcmV0dXJuIGlzTWF0Y2hpbmdQYXR0ZXJuKHVybCwgcGF0dGVybik7IH0pO1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgSW5ib3VuZEZpbHRlcnMucHJvdG90eXBlLl9tZXJnZU9wdGlvbnMgPSBmdW5jdGlvbiAoY2xpZW50T3B0aW9ucykge1xuICAgICAgICBpZiAoY2xpZW50T3B0aW9ucyA9PT0gdm9pZCAwKSB7IGNsaWVudE9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmxhY2tsaXN0VXJsczogdHNsaWJfMS5fX3NwcmVhZCgodGhpcy5fb3B0aW9ucy5ibGFja2xpc3RVcmxzIHx8IFtdKSwgKGNsaWVudE9wdGlvbnMuYmxhY2tsaXN0VXJscyB8fCBbXSkpLFxuICAgICAgICAgICAgaWdub3JlRXJyb3JzOiB0c2xpYl8xLl9fc3ByZWFkKCh0aGlzLl9vcHRpb25zLmlnbm9yZUVycm9ycyB8fCBbXSksIChjbGllbnRPcHRpb25zLmlnbm9yZUVycm9ycyB8fCBbXSksIERFRkFVTFRfSUdOT1JFX0VSUk9SUyksXG4gICAgICAgICAgICBpZ25vcmVJbnRlcm5hbDogdHlwZW9mIHRoaXMuX29wdGlvbnMuaWdub3JlSW50ZXJuYWwgIT09ICd1bmRlZmluZWQnID8gdGhpcy5fb3B0aW9ucy5pZ25vcmVJbnRlcm5hbCA6IHRydWUsXG4gICAgICAgICAgICB3aGl0ZWxpc3RVcmxzOiB0c2xpYl8xLl9fc3ByZWFkKCh0aGlzLl9vcHRpb25zLndoaXRlbGlzdFVybHMgfHwgW10pLCAoY2xpZW50T3B0aW9ucy53aGl0ZWxpc3RVcmxzIHx8IFtdKSksXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBJbmJvdW5kRmlsdGVycy5wcm90b3R5cGUuX2dldFBvc3NpYmxlRXZlbnRNZXNzYWdlcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQubWVzc2FnZSkge1xuICAgICAgICAgICAgcmV0dXJuIFtldmVudC5tZXNzYWdlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQuZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBfYSA9IChldmVudC5leGNlcHRpb24udmFsdWVzICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0pIHx8IHt9LCBfYiA9IF9hLnR5cGUsIHR5cGUgPSBfYiA9PT0gdm9pZCAwID8gJycgOiBfYiwgX2MgPSBfYS52YWx1ZSwgdmFsdWUgPSBfYyA9PT0gdm9pZCAwID8gJycgOiBfYztcbiAgICAgICAgICAgICAgICByZXR1cm4gW1wiXCIgKyB2YWx1ZSwgdHlwZSArIFwiOiBcIiArIHZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChvTykge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkNhbm5vdCBleHRyYWN0IG1lc3NhZ2UgZm9yIGV2ZW50IFwiICsgZ2V0RXZlbnREZXNjcmlwdGlvbihldmVudCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBJbmJvdW5kRmlsdGVycy5wcm90b3R5cGUuX2dldEV2ZW50RmlsdGVyVXJsID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc3RhY2t0cmFjZSkge1xuICAgICAgICAgICAgICAgIHZhciBmcmFtZXNfMSA9IGV2ZW50LnN0YWNrdHJhY2UuZnJhbWVzO1xuICAgICAgICAgICAgICAgIHJldHVybiAoZnJhbWVzXzEgJiYgZnJhbWVzXzFbZnJhbWVzXzEubGVuZ3RoIC0gMV0uZmlsZW5hbWUpIHx8IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXZlbnQuZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyYW1lc18yID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyAmJiBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnN0YWNrdHJhY2UgJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5zdGFja3RyYWNlLmZyYW1lcztcbiAgICAgICAgICAgICAgICByZXR1cm4gKGZyYW1lc18yICYmIGZyYW1lc18yW2ZyYW1lc18yLmxlbmd0aCAtIDFdLmZpbGVuYW1lKSB8fCBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKG9PKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJDYW5ub3QgZXh0cmFjdCB1cmwgZm9yIGV2ZW50IFwiICsgZ2V0RXZlbnREZXNjcmlwdGlvbihldmVudCkpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSW5ib3VuZEZpbHRlcnMuaWQgPSAnSW5ib3VuZEZpbHRlcnMnO1xuICAgIHJldHVybiBJbmJvdW5kRmlsdGVycztcbn0oKSk7XG5leHBvcnQgeyBJbmJvdW5kRmlsdGVycyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5ib3VuZGZpbHRlcnMuanMubWFwIiwiZXhwb3J0IHsgRnVuY3Rpb25Ub1N0cmluZyB9IGZyb20gJy4vZnVuY3Rpb250b3N0cmluZyc7XG5leHBvcnQgeyBJbmJvdW5kRmlsdGVycyB9IGZyb20gJy4vaW5ib3VuZGZpbHRlcnMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgdGltZXN0YW1wV2l0aE1zIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG4vKiogQ3JlYXRlcyBhIFNlbnRyeVJlcXVlc3QgZnJvbSBhbiBldmVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVudFRvU2VudHJ5UmVxdWVzdChldmVudCwgYXBpKSB7XG4gICAgdmFyIHVzZUVudmVsb3BlID0gZXZlbnQudHlwZSA9PT0gJ3RyYW5zYWN0aW9uJztcbiAgICB2YXIgcmVxID0ge1xuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShldmVudCksXG4gICAgICAgIHVybDogdXNlRW52ZWxvcGUgPyBhcGkuZ2V0RW52ZWxvcGVFbmRwb2ludFdpdGhVcmxFbmNvZGVkQXV0aCgpIDogYXBpLmdldFN0b3JlRW5kcG9pbnRXaXRoVXJsRW5jb2RlZEF1dGgoKSxcbiAgICB9O1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcC5zZW50cnkuZGV2L3Nkay9lbnZlbG9wZXMvXG4gICAgLy8gU2luY2Ugd2UgZG9uJ3QgbmVlZCB0byBtYW5pcHVsYXRlIGVudmVsb3BlcyBub3Igc3RvcmUgdGhlbSwgdGhlcmUgaXMgbm9cbiAgICAvLyBleHBvcnRlZCBjb25jZXB0IG9mIGFuIEVudmVsb3BlIHdpdGggb3BlcmF0aW9ucyBpbmNsdWRpbmcgc2VyaWFsaXphdGlvbiBhbmRcbiAgICAvLyBkZXNlcmlhbGl6YXRpb24uIEluc3RlYWQsIHdlIG9ubHkgaW1wbGVtZW50IGEgbWluaW1hbCBzdWJzZXQgb2YgdGhlIHNwZWMgdG9cbiAgICAvLyBzZXJpYWxpemUgZXZlbnRzIGlubGluZSBoZXJlLlxuICAgIGlmICh1c2VFbnZlbG9wZSkge1xuICAgICAgICB2YXIgZW52ZWxvcGVIZWFkZXJzID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZXZlbnRfaWQ6IGV2ZW50LmV2ZW50X2lkLFxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBhZGQgKiAxMDAwIHNpbmNlIHdlIGRpdmlkZSBpdCBieSAxMDAwIGJ5IGRlZmF1bHQgYnV0IEpTIHdvcmtzIHdpdGggbXMgcHJlY2lzaW9uXG4gICAgICAgICAgICAvLyBUaGUgcmVhc29uIHdlIHVzZSB0aW1lc3RhbXBXaXRoTXMgaGVyZSBpcyB0aGF0IGFsbCBjbG9ja3MgYWNyb3NzIHRoZSBTREsgdXNlIHRoZSBzYW1lIGNsb2NrXG4gICAgICAgICAgICBzZW50X2F0OiBuZXcgRGF0ZSh0aW1lc3RhbXBXaXRoTXMoKSAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgaXRlbUhlYWRlcnMgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICB0eXBlOiBldmVudC50eXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gVGhlIHRyYWlsaW5nIG5ld2xpbmUgaXMgb3B0aW9uYWwuIFdlIGludGVudGlvbmFsbHkgZG9uJ3Qgc2VuZCBpdCB0byBhdm9pZFxuICAgICAgICAvLyBzZW5kaW5nIHVubmVjZXNzYXJ5IGJ5dGVzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBjb25zdCBlbnZlbG9wZSA9IGAke2VudmVsb3BlSGVhZGVyc31cXG4ke2l0ZW1IZWFkZXJzfVxcbiR7cmVxLmJvZHl9XFxuYDtcbiAgICAgICAgdmFyIGVudmVsb3BlID0gZW52ZWxvcGVIZWFkZXJzICsgXCJcXG5cIiArIGl0ZW1IZWFkZXJzICsgXCJcXG5cIiArIHJlcS5ib2R5O1xuICAgICAgICByZXEuYm9keSA9IGVudmVsb3BlO1xuICAgIH1cbiAgICByZXR1cm4gcmVxO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVxdWVzdC5qcy5tYXAiLCJpbXBvcnQgeyBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG4vKipcbiAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBTREsgY2xpZW50IGluc3RhbmNlLiBUaGUgY2xpZW50IGlzXG4gKiBpbnN0YWxsZWQgYW5kIHRoZW4gYm91bmQgdG8gdGhlIGN1cnJlbnQgc2NvcGUuXG4gKlxuICogQHBhcmFtIGNsaWVudENsYXNzIFRoZSBjbGllbnQgY2xhc3MgdG8gaW5zdGFuY2lhdGUuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNsaWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRBbmRCaW5kKGNsaWVudENsYXNzLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuZGVidWcgPT09IHRydWUpIHtcbiAgICAgICAgbG9nZ2VyLmVuYWJsZSgpO1xuICAgIH1cbiAgICB2YXIgaHViID0gZ2V0Q3VycmVudEh1YigpO1xuICAgIHZhciBjbGllbnQgPSBuZXcgY2xpZW50Q2xhc3Mob3B0aW9ucyk7XG4gICAgaHViLmJpbmRDbGllbnQoY2xpZW50KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNkay5qcy5tYXAiLCJpbXBvcnQgeyBTdGF0dXMgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IFN5bmNQcm9taXNlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG4vKiogTm9vcCB0cmFuc3BvcnQgKi9cbnZhciBOb29wVHJhbnNwb3J0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5vb3BUcmFuc3BvcnQoKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgTm9vcFRyYW5zcG9ydC5wcm90b3R5cGUuc2VuZEV2ZW50ID0gZnVuY3Rpb24gKF8pIHtcbiAgICAgICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgcmVhc29uOiBcIk5vb3BUcmFuc3BvcnQ6IEV2ZW50IGhhcyBiZWVuIHNraXBwZWQgYmVjYXVzZSBubyBEc24gaXMgY29uZmlndXJlZC5cIixcbiAgICAgICAgICAgIHN0YXR1czogU3RhdHVzLlNraXBwZWQsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBOb29wVHJhbnNwb3J0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uIChfKSB7XG4gICAgICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICAgIH07XG4gICAgcmV0dXJuIE5vb3BUcmFuc3BvcnQ7XG59KCkpO1xuZXhwb3J0IHsgTm9vcFRyYW5zcG9ydCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9vcC5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgY29uc29sZVNhbmRib3gsIGdldEdsb2JhbE9iamVjdCwgaXNOb2RlRW52LCBsb2dnZXIsIHRpbWVzdGFtcFdpdGhNcywgdXVpZDQgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IFNjb3BlIH0gZnJvbSAnLi9zY29wZSc7XG4vKipcbiAqIEFQSSBjb21wYXRpYmlsaXR5IHZlcnNpb24gb2YgdGhpcyBodWIuXG4gKlxuICogV0FSTklORzogVGhpcyBudW1iZXIgc2hvdWxkIG9ubHkgYmUgaW5jcmVzZWQgd2hlbiB0aGUgZ2xvYmFsIGludGVyZmFjZVxuICogY2hhbmdlcyBhIGFuZCBuZXcgbWV0aG9kcyBhcmUgaW50cm9kdWNlZC5cbiAqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCB2YXIgQVBJX1ZFUlNJT04gPSAzO1xuLyoqXG4gKiBEZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIGJyZWFkY3J1bWJzIGFkZGVkIHRvIGFuIGV2ZW50LiBDYW4gYmUgb3ZlcndyaXR0ZW5cbiAqIHdpdGgge0BsaW5rIE9wdGlvbnMubWF4QnJlYWRjcnVtYnN9LlxuICovXG52YXIgREVGQVVMVF9CUkVBRENSVU1CUyA9IDEwMDtcbi8qKlxuICogQWJzb2x1dGUgbWF4aW11bSBudW1iZXIgb2YgYnJlYWRjcnVtYnMgYWRkZWQgdG8gYW4gZXZlbnQuIFRoZVxuICogYG1heEJyZWFkY3J1bWJzYCBvcHRpb24gY2Fubm90IGJlIGhpZ2hlciB0aGFuIHRoaXMgdmFsdWUuXG4gKi9cbnZhciBNQVhfQlJFQURDUlVNQlMgPSAxMDA7XG4vKipcbiAqIEBpbmhlcml0RG9jXG4gKi9cbnZhciBIdWIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgaHViLCB3aWxsIHB1c2ggb25lIHtAbGluayBMYXllcn0gaW50byB0aGVcbiAgICAgKiBpbnRlcm5hbCBzdGFjayBvbiBjcmVhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjbGllbnQgYm91bmQgdG8gdGhlIGh1Yi5cbiAgICAgKiBAcGFyYW0gc2NvcGUgYm91bmQgdG8gdGhlIGh1Yi5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBudW1iZXIsIGhpZ2hlciBudW1iZXIgbWVhbnMgaGlnaGVyIHByaW9yaXR5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEh1YihjbGllbnQsIHNjb3BlLCBfdmVyc2lvbikge1xuICAgICAgICBpZiAoc2NvcGUgPT09IHZvaWQgMCkgeyBzY29wZSA9IG5ldyBTY29wZSgpOyB9XG4gICAgICAgIGlmIChfdmVyc2lvbiA9PT0gdm9pZCAwKSB7IF92ZXJzaW9uID0gQVBJX1ZFUlNJT047IH1cbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IF92ZXJzaW9uO1xuICAgICAgICAvKiogSXMgYSB7QGxpbmsgTGF5ZXJ9W10gY29udGFpbmluZyB0aGUgY2xpZW50IGFuZCBzY29wZSAqL1xuICAgICAgICB0aGlzLl9zdGFjayA9IFtdO1xuICAgICAgICB0aGlzLl9zdGFjay5wdXNoKHsgY2xpZW50OiBjbGllbnQsIHNjb3BlOiBzY29wZSB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9uIHRvIGNhbGwgYSBtZXRob2Qgb24gdGhlIHRvcCBjbGllbnQgaWYgaXQgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIGNhbGwgb24gdGhlIGNsaWVudC5cbiAgICAgKiBAcGFyYW0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY2xpZW50IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuX2ludm9rZUNsaWVudCA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdG9wID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgICAgICBpZiAodG9wICYmIHRvcC5jbGllbnQgJiYgdG9wLmNsaWVudFttZXRob2RdKSB7XG4gICAgICAgICAgICAoX2EgPSB0b3AuY2xpZW50KVttZXRob2RdLmFwcGx5KF9hLCB0c2xpYl8xLl9fc3ByZWFkKGFyZ3MsIFt0b3Auc2NvcGVdKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5pc09sZGVyVGhhbiA9IGZ1bmN0aW9uICh2ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uIDwgdmVyc2lvbjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5iaW5kQ2xpZW50ID0gZnVuY3Rpb24gKGNsaWVudCkge1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgICAgICB0b3AuY2xpZW50ID0gY2xpZW50O1xuICAgICAgICBpZiAoY2xpZW50ICYmIGNsaWVudC5zZXR1cEludGVncmF0aW9ucykge1xuICAgICAgICAgICAgY2xpZW50LnNldHVwSW50ZWdyYXRpb25zKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5wdXNoU2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFdlIHdhbnQgdG8gY2xvbmUgdGhlIGNvbnRlbnQgb2YgcHJldiBzY29wZVxuICAgICAgICB2YXIgc3RhY2sgPSB0aGlzLmdldFN0YWNrKCk7XG4gICAgICAgIHZhciBwYXJlbnRTY29wZSA9IHN0YWNrLmxlbmd0aCA+IDAgPyBzdGFja1tzdGFjay5sZW5ndGggLSAxXS5zY29wZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIHNjb3BlID0gU2NvcGUuY2xvbmUocGFyZW50U2NvcGUpO1xuICAgICAgICB0aGlzLmdldFN0YWNrKCkucHVzaCh7XG4gICAgICAgICAgICBjbGllbnQ6IHRoaXMuZ2V0Q2xpZW50KCksXG4gICAgICAgICAgICBzY29wZTogc2NvcGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUucG9wU2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFN0YWNrKCkucG9wKCkgIT09IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS53aXRoU2NvcGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpcy5wdXNoU2NvcGUoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMucG9wU2NvcGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBIdWIucHJvdG90eXBlLmdldENsaWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2tUb3AoKS5jbGllbnQ7XG4gICAgfTtcbiAgICAvKiogUmV0dXJucyB0aGUgc2NvcGUgb2YgdGhlIHRvcCBzdGFjay4gKi9cbiAgICBIdWIucHJvdG90eXBlLmdldFNjb3BlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGFja1RvcCgpLnNjb3BlO1xuICAgIH07XG4gICAgLyoqIFJldHVybnMgdGhlIHNjb3BlIHN0YWNrIGZvciBkb21haW5zIG9yIHRoZSBwcm9jZXNzLiAqL1xuICAgIEh1Yi5wcm90b3R5cGUuZ2V0U3RhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFjaztcbiAgICB9O1xuICAgIC8qKiBSZXR1cm5zIHRoZSB0b3Btb3N0IHNjb3BlIGxheWVyIGluIHRoZSBvcmRlciBkb21haW4gPiBsb2NhbCA+IHByb2Nlc3MuICovXG4gICAgSHViLnByb3RvdHlwZS5nZXRTdGFja1RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YWNrW3RoaXMuX3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBIdWIucHJvdG90eXBlLmNhcHR1cmVFeGNlcHRpb24gPSBmdW5jdGlvbiAoZXhjZXB0aW9uLCBoaW50KSB7XG4gICAgICAgIHZhciBldmVudElkID0gKHRoaXMuX2xhc3RFdmVudElkID0gdXVpZDQoKSk7XG4gICAgICAgIHZhciBmaW5hbEhpbnQgPSBoaW50O1xuICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIGV4cGxpY2l0IGhpbnQgcHJvdmlkZWQsIG1pbWljayB0aGUgc2FtZSB0aGluZyB0aGF0IHdvdWxkIGhhcHBlblxuICAgICAgICAvLyBpbiB0aGUgbWluaW1hbCBpdHNlbGYgdG8gY3JlYXRlIGEgY29uc2lzdGVudCBiZWhhdmlvci5cbiAgICAgICAgLy8gV2UgZG9uJ3QgZG8gdGhpcyBpbiB0aGUgY2xpZW50LCBhcyBpdCdzIHRoZSBsb3dlc3QgbGV2ZWwgQVBJLCBhbmQgZG9pbmcgdGhpcyxcbiAgICAgICAgLy8gd291bGQgcHJldmVudCB1c2VyIGZyb20gaGF2aW5nIGZ1bGwgY29udHJvbCBvdmVyIGRpcmVjdCBjYWxscy5cbiAgICAgICAgaWYgKCFoaW50KSB7XG4gICAgICAgICAgICB2YXIgc3ludGhldGljRXhjZXB0aW9uID0gdm9pZCAwO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlbnRyeSBzeW50aGV0aWNFeGNlcHRpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICBzeW50aGV0aWNFeGNlcHRpb24gPSBleGNlcHRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbEhpbnQgPSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFeGNlcHRpb246IGV4Y2VwdGlvbixcbiAgICAgICAgICAgICAgICBzeW50aGV0aWNFeGNlcHRpb246IHN5bnRoZXRpY0V4Y2VwdGlvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW52b2tlQ2xpZW50KCdjYXB0dXJlRXhjZXB0aW9uJywgZXhjZXB0aW9uLCB0c2xpYl8xLl9fYXNzaWduKHt9LCBmaW5hbEhpbnQsIHsgZXZlbnRfaWQ6IGV2ZW50SWQgfSkpO1xuICAgICAgICByZXR1cm4gZXZlbnRJZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5jYXB0dXJlTWVzc2FnZSA9IGZ1bmN0aW9uIChtZXNzYWdlLCBsZXZlbCwgaGludCkge1xuICAgICAgICB2YXIgZXZlbnRJZCA9ICh0aGlzLl9sYXN0RXZlbnRJZCA9IHV1aWQ0KCkpO1xuICAgICAgICB2YXIgZmluYWxIaW50ID0gaGludDtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBubyBleHBsaWNpdCBoaW50IHByb3ZpZGVkLCBtaW1pY2sgdGhlIHNhbWUgdGhpbmcgdGhhdCB3b3VsZCBoYXBwZW5cbiAgICAgICAgLy8gaW4gdGhlIG1pbmltYWwgaXRzZWxmIHRvIGNyZWF0ZSBhIGNvbnNpc3RlbnQgYmVoYXZpb3IuXG4gICAgICAgIC8vIFdlIGRvbid0IGRvIHRoaXMgaW4gdGhlIGNsaWVudCwgYXMgaXQncyB0aGUgbG93ZXN0IGxldmVsIEFQSSwgYW5kIGRvaW5nIHRoaXMsXG4gICAgICAgIC8vIHdvdWxkIHByZXZlbnQgdXNlciBmcm9tIGhhdmluZyBmdWxsIGNvbnRyb2wgb3ZlciBkaXJlY3QgY2FsbHMuXG4gICAgICAgIGlmICghaGludCkge1xuICAgICAgICAgICAgdmFyIHN5bnRoZXRpY0V4Y2VwdGlvbiA9IHZvaWQgMDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHN5bnRoZXRpY0V4Y2VwdGlvbiA9IGV4Y2VwdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsSGludCA9IHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEV4Y2VwdGlvbjogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICBzeW50aGV0aWNFeGNlcHRpb246IHN5bnRoZXRpY0V4Y2VwdGlvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW52b2tlQ2xpZW50KCdjYXB0dXJlTWVzc2FnZScsIG1lc3NhZ2UsIGxldmVsLCB0c2xpYl8xLl9fYXNzaWduKHt9LCBmaW5hbEhpbnQsIHsgZXZlbnRfaWQ6IGV2ZW50SWQgfSkpO1xuICAgICAgICByZXR1cm4gZXZlbnRJZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5jYXB0dXJlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGhpbnQpIHtcbiAgICAgICAgdmFyIGV2ZW50SWQgPSAodGhpcy5fbGFzdEV2ZW50SWQgPSB1dWlkNCgpKTtcbiAgICAgICAgdGhpcy5faW52b2tlQ2xpZW50KCdjYXB0dXJlRXZlbnQnLCBldmVudCwgdHNsaWJfMS5fX2Fzc2lnbih7fSwgaGludCwgeyBldmVudF9pZDogZXZlbnRJZCB9KSk7XG4gICAgICAgIHJldHVybiBldmVudElkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBIdWIucHJvdG90eXBlLmxhc3RFdmVudElkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdEV2ZW50SWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuYWRkQnJlYWRjcnVtYiA9IGZ1bmN0aW9uIChicmVhZGNydW1iLCBoaW50KSB7XG4gICAgICAgIHZhciB0b3AgPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgICAgIGlmICghdG9wLnNjb3BlIHx8ICF0b3AuY2xpZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9hID0gKHRvcC5jbGllbnQuZ2V0T3B0aW9ucyAmJiB0b3AuY2xpZW50LmdldE9wdGlvbnMoKSkgfHwge30sIF9iID0gX2EuYmVmb3JlQnJlYWRjcnVtYiwgYmVmb3JlQnJlYWRjcnVtYiA9IF9iID09PSB2b2lkIDAgPyBudWxsIDogX2IsIF9jID0gX2EubWF4QnJlYWRjcnVtYnMsIG1heEJyZWFkY3J1bWJzID0gX2MgPT09IHZvaWQgMCA/IERFRkFVTFRfQlJFQURDUlVNQlMgOiBfYztcbiAgICAgICAgaWYgKG1heEJyZWFkY3J1bWJzIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGltZXN0YW1wID0gdGltZXN0YW1wV2l0aE1zKCk7XG4gICAgICAgIHZhciBtZXJnZWRCcmVhZGNydW1iID0gdHNsaWJfMS5fX2Fzc2lnbih7IHRpbWVzdGFtcDogdGltZXN0YW1wIH0sIGJyZWFkY3J1bWIpO1xuICAgICAgICB2YXIgZmluYWxCcmVhZGNydW1iID0gYmVmb3JlQnJlYWRjcnVtYlxuICAgICAgICAgICAgPyBjb25zb2xlU2FuZGJveChmdW5jdGlvbiAoKSB7IHJldHVybiBiZWZvcmVCcmVhZGNydW1iKG1lcmdlZEJyZWFkY3J1bWIsIGhpbnQpOyB9KVxuICAgICAgICAgICAgOiBtZXJnZWRCcmVhZGNydW1iO1xuICAgICAgICBpZiAoZmluYWxCcmVhZGNydW1iID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdG9wLnNjb3BlLmFkZEJyZWFkY3J1bWIoZmluYWxCcmVhZGNydW1iLCBNYXRoLm1pbihtYXhCcmVhZGNydW1icywgTUFYX0JSRUFEQ1JVTUJTKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuc2V0VXNlciA9IGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHZhciB0b3AgPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgICAgIGlmICghdG9wLnNjb3BlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdG9wLnNjb3BlLnNldFVzZXIodXNlcik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuc2V0VGFncyA9IGZ1bmN0aW9uICh0YWdzKSB7XG4gICAgICAgIHZhciB0b3AgPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgICAgIGlmICghdG9wLnNjb3BlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdG9wLnNjb3BlLnNldFRhZ3ModGFncyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuc2V0RXh0cmFzID0gZnVuY3Rpb24gKGV4dHJhcykge1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgICAgICBpZiAoIXRvcC5zY29wZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRvcC5zY29wZS5zZXRFeHRyYXMoZXh0cmFzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5zZXRUYWcgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgICAgICBpZiAoIXRvcC5zY29wZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRvcC5zY29wZS5zZXRUYWcoa2V5LCB2YWx1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuc2V0RXh0cmEgPSBmdW5jdGlvbiAoa2V5LCBleHRyYSkge1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgICAgICBpZiAoIXRvcC5zY29wZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRvcC5zY29wZS5zZXRFeHRyYShrZXksIGV4dHJhKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5zZXRDb250ZXh0ID0gZnVuY3Rpb24gKG5hbWUsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHRvcCA9IHRoaXMuZ2V0U3RhY2tUb3AoKTtcbiAgICAgICAgaWYgKCF0b3Auc2NvcGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0b3Auc2NvcGUuc2V0Q29udGV4dChuYW1lLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5jb25maWd1cmVTY29wZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgICAgICBpZiAodG9wLnNjb3BlICYmIHRvcC5jbGllbnQpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHRvcC5zY29wZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIG9sZEh1YiA9IG1ha2VNYWluKHRoaXMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2FsbGJhY2sodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBtYWtlTWFpbihvbGRIdWIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuZ2V0SW50ZWdyYXRpb24gPSBmdW5jdGlvbiAoaW50ZWdyYXRpb24pIHtcbiAgICAgICAgdmFyIGNsaWVudCA9IHRoaXMuZ2V0Q2xpZW50KCk7XG4gICAgICAgIGlmICghY2xpZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGNsaWVudC5nZXRJbnRlZ3JhdGlvbihpbnRlZ3JhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9vTykge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJDYW5ub3QgcmV0cmlldmUgaW50ZWdyYXRpb24gXCIgKyBpbnRlZ3JhdGlvbi5pZCArIFwiIGZyb20gdGhlIGN1cnJlbnQgSHViXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5zdGFydFNwYW4gPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsbEV4dGVuc2lvbk1ldGhvZCgnc3RhcnRTcGFuJywgY29udGV4dCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuc3RhcnRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsRXh0ZW5zaW9uTWV0aG9kKCdzdGFydFRyYW5zYWN0aW9uJywgY29udGV4dCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUudHJhY2VIZWFkZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsbEV4dGVuc2lvbk1ldGhvZCgndHJhY2VIZWFkZXJzJyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDYWxscyBnbG9iYWwgZXh0ZW5zaW9uIG1ldGhvZCBhbmQgYmluZGluZyBjdXJyZW50IGluc3RhbmNlIHRvIHRoZSBmdW5jdGlvbiBjYWxsXG4gICAgICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIEh1Yi5wcm90b3R5cGUuX2NhbGxFeHRlbnNpb25NZXRob2QgPSBmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjYXJyaWVyID0gZ2V0TWFpbkNhcnJpZXIoKTtcbiAgICAgICAgdmFyIHNlbnRyeSA9IGNhcnJpZXIuX19TRU5UUllfXztcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgICAgIGlmIChzZW50cnkgJiYgc2VudHJ5LmV4dGVuc2lvbnMgJiYgdHlwZW9mIHNlbnRyeS5leHRlbnNpb25zW21ldGhvZF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBzZW50cnkuZXh0ZW5zaW9uc1ttZXRob2RdLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci53YXJuKFwiRXh0ZW5zaW9uIG1ldGhvZCBcIiArIG1ldGhvZCArIFwiIGNvdWxkbid0IGJlIGZvdW5kLCBkb2luZyBub3RoaW5nLlwiKTtcbiAgICB9O1xuICAgIHJldHVybiBIdWI7XG59KCkpO1xuZXhwb3J0IHsgSHViIH07XG4vKiogUmV0dXJucyB0aGUgZ2xvYmFsIHNoaW0gcmVnaXN0cnkuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpbkNhcnJpZXIoKSB7XG4gICAgdmFyIGNhcnJpZXIgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgICBjYXJyaWVyLl9fU0VOVFJZX18gPSBjYXJyaWVyLl9fU0VOVFJZX18gfHwge1xuICAgICAgICBleHRlbnNpb25zOiB7fSxcbiAgICAgICAgaHViOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICByZXR1cm4gY2Fycmllcjtcbn1cbi8qKlxuICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgbWFpbiBodWIgd2l0aCB0aGUgcGFzc2VkIG9uZSBvbiB0aGUgZ2xvYmFsIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIFRoZSBvbGQgcmVwbGFjZWQgaHViXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTWFpbihodWIpIHtcbiAgICB2YXIgcmVnaXN0cnkgPSBnZXRNYWluQ2FycmllcigpO1xuICAgIHZhciBvbGRIdWIgPSBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSk7XG4gICAgc2V0SHViT25DYXJyaWVyKHJlZ2lzdHJ5LCBodWIpO1xuICAgIHJldHVybiBvbGRIdWI7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGRlZmF1bHQgaHViIGluc3RhbmNlLlxuICpcbiAqIElmIGEgaHViIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBpbiB0aGUgZ2xvYmFsIGNhcnJpZXIgYnV0IHRoaXMgbW9kdWxlXG4gKiBjb250YWlucyBhIG1vcmUgcmVjZW50IHZlcnNpb24sIGl0IHJlcGxhY2VzIHRoZSByZWdpc3RlcmVkIHZlcnNpb24uXG4gKiBPdGhlcndpc2UsIHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZCBodWIgd2lsbCBiZSByZXR1cm5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRIdWIoKSB7XG4gICAgLy8gR2V0IG1haW4gY2FycmllciAoZ2xvYmFsIGZvciBldmVyeSBlbnZpcm9ubWVudClcbiAgICB2YXIgcmVnaXN0cnkgPSBnZXRNYWluQ2FycmllcigpO1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gaHViLCBvciBpdHMgYW4gb2xkIEFQSSwgYXNzaWduIGEgbmV3IG9uZVxuICAgIGlmICghaGFzSHViT25DYXJyaWVyKHJlZ2lzdHJ5KSB8fCBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSkuaXNPbGRlclRoYW4oQVBJX1ZFUlNJT04pKSB7XG4gICAgICAgIHNldEh1Yk9uQ2FycmllcihyZWdpc3RyeSwgbmV3IEh1YigpKTtcbiAgICB9XG4gICAgLy8gUHJlZmVyIGRvbWFpbnMgb3ZlciBnbG9iYWwgaWYgdGhleSBhcmUgdGhlcmUgKGFwcGxpY2FibGUgb25seSB0byBOb2RlIGVudmlyb25tZW50KVxuICAgIGlmIChpc05vZGVFbnYoKSkge1xuICAgICAgICByZXR1cm4gZ2V0SHViRnJvbUFjdGl2ZURvbWFpbihyZWdpc3RyeSk7XG4gICAgfVxuICAgIC8vIFJldHVybiBodWIgdGhhdCBsaXZlcyBvbiBhIGdsb2JhbCBvYmplY3RcbiAgICByZXR1cm4gZ2V0SHViRnJvbUNhcnJpZXIocmVnaXN0cnkpO1xufVxuLyoqXG4gKiBUcnkgdG8gcmVhZCB0aGUgaHViIGZyb20gYW4gYWN0aXZlIGRvbWFpbiwgZmFsbGJhY2sgdG8gdGhlIHJlZ2lzdHJ5IGlmIG9uZSBkb2VzbnQgZXhpc3RcbiAqIEByZXR1cm5zIGRpc2NvdmVyZWQgaHViXG4gKi9cbmZ1bmN0aW9uIGdldEh1YkZyb21BY3RpdmVEb21haW4ocmVnaXN0cnkpIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgcHJvcGVydHkgPSAnZG9tYWluJztcbiAgICAgICAgdmFyIGNhcnJpZXIgPSBnZXRNYWluQ2FycmllcigpO1xuICAgICAgICB2YXIgc2VudHJ5ID0gY2Fycmllci5fX1NFTlRSWV9fO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICAgICAgaWYgKCFzZW50cnkgfHwgIXNlbnRyeS5leHRlbnNpb25zIHx8ICFzZW50cnkuZXh0ZW5zaW9uc1twcm9wZXJ0eV0pIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRvbWFpbiA9IHNlbnRyeS5leHRlbnNpb25zW3Byb3BlcnR5XTtcbiAgICAgICAgdmFyIGFjdGl2ZURvbWFpbiA9IGRvbWFpbi5hY3RpdmU7XG4gICAgICAgIC8vIElmIHRoZXJlIG5vIGFjdGl2ZSBkb21haW4sIGp1c3QgcmV0dXJuIGdsb2JhbCBodWJcbiAgICAgICAgaWYgKCFhY3RpdmVEb21haW4pIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUncyBubyBodWIgb24gY3VycmVudCBkb21haW4sIG9yIGl0cyBhbiBvbGQgQVBJLCBhc3NpZ24gYSBuZXcgb25lXG4gICAgICAgIGlmICghaGFzSHViT25DYXJyaWVyKGFjdGl2ZURvbWFpbikgfHwgZ2V0SHViRnJvbUNhcnJpZXIoYWN0aXZlRG9tYWluKS5pc09sZGVyVGhhbihBUElfVkVSU0lPTikpIHtcbiAgICAgICAgICAgIHZhciByZWdpc3RyeUh1YlRvcFN0YWNrID0gZ2V0SHViRnJvbUNhcnJpZXIocmVnaXN0cnkpLmdldFN0YWNrVG9wKCk7XG4gICAgICAgICAgICBzZXRIdWJPbkNhcnJpZXIoYWN0aXZlRG9tYWluLCBuZXcgSHViKHJlZ2lzdHJ5SHViVG9wU3RhY2suY2xpZW50LCBTY29wZS5jbG9uZShyZWdpc3RyeUh1YlRvcFN0YWNrLnNjb3BlKSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJldHVybiBodWIgdGhhdCBsaXZlcyBvbiBhIGRvbWFpblxuICAgICAgICByZXR1cm4gZ2V0SHViRnJvbUNhcnJpZXIoYWN0aXZlRG9tYWluKTtcbiAgICB9XG4gICAgY2F0Y2ggKF9Pbykge1xuICAgICAgICAvLyBSZXR1cm4gaHViIHRoYXQgbGl2ZXMgb24gYSBnbG9iYWwgb2JqZWN0XG4gICAgICAgIHJldHVybiBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSk7XG4gICAgfVxufVxuLyoqXG4gKiBUaGlzIHdpbGwgdGVsbCB3aGV0aGVyIGEgY2FycmllciBoYXMgYSBodWIgb24gaXQgb3Igbm90XG4gKiBAcGFyYW0gY2FycmllciBvYmplY3RcbiAqL1xuZnVuY3Rpb24gaGFzSHViT25DYXJyaWVyKGNhcnJpZXIpIHtcbiAgICBpZiAoY2FycmllciAmJiBjYXJyaWVyLl9fU0VOVFJZX18gJiYgY2Fycmllci5fX1NFTlRSWV9fLmh1Yikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IHtAbGluayBIdWJ9IGFuZCBhZGQgdG8gdGhlIHBhc3NlZCBvYmplY3Qgb25cbiAqIF9fU0VOVFJZX18uaHViLlxuICogQHBhcmFtIGNhcnJpZXIgb2JqZWN0XG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIdWJGcm9tQ2FycmllcihjYXJyaWVyKSB7XG4gICAgaWYgKGNhcnJpZXIgJiYgY2Fycmllci5fX1NFTlRSWV9fICYmIGNhcnJpZXIuX19TRU5UUllfXy5odWIpIHtcbiAgICAgICAgcmV0dXJuIGNhcnJpZXIuX19TRU5UUllfXy5odWI7XG4gICAgfVxuICAgIGNhcnJpZXIuX19TRU5UUllfXyA9IGNhcnJpZXIuX19TRU5UUllfXyB8fCB7fTtcbiAgICBjYXJyaWVyLl9fU0VOVFJZX18uaHViID0gbmV3IEh1YigpO1xuICAgIHJldHVybiBjYXJyaWVyLl9fU0VOVFJZX18uaHViO1xufVxuLyoqXG4gKiBUaGlzIHdpbGwgc2V0IHBhc3NlZCB7QGxpbmsgSHVifSBvbiB0aGUgcGFzc2VkIG9iamVjdCdzIF9fU0VOVFJZX18uaHViIGF0dHJpYnV0ZVxuICogQHBhcmFtIGNhcnJpZXIgb2JqZWN0XG4gKiBAcGFyYW0gaHViIEh1YlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SHViT25DYXJyaWVyKGNhcnJpZXIsIGh1Yikge1xuICAgIGlmICghY2Fycmllcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNhcnJpZXIuX19TRU5UUllfXyA9IGNhcnJpZXIuX19TRU5UUllfXyB8fCB7fTtcbiAgICBjYXJyaWVyLl9fU0VOVFJZX18uaHViID0gaHViO1xuICAgIHJldHVybiB0cnVlO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHViLmpzLm1hcCIsImV4cG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBTY29wZSB9IGZyb20gJy4vc2NvcGUnO1xuZXhwb3J0IHsgZ2V0Q3VycmVudEh1YiwgZ2V0SHViRnJvbUNhcnJpZXIsIGdldE1haW5DYXJyaWVyLCBIdWIsIG1ha2VNYWluLCBzZXRIdWJPbkNhcnJpZXIgfSBmcm9tICcuL2h1Yic7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0LCBpc1BsYWluT2JqZWN0LCBpc1RoZW5hYmxlLCBTeW5jUHJvbWlzZSwgdGltZXN0YW1wV2l0aE1zIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG4vKipcbiAqIEhvbGRzIGFkZGl0aW9uYWwgZXZlbnQgaW5mb3JtYXRpb24uIHtAbGluayBTY29wZS5hcHBseVRvRXZlbnR9IHdpbGwgYmVcbiAqIGNhbGxlZCBieSB0aGUgY2xpZW50IGJlZm9yZSBhbiBldmVudCB3aWxsIGJlIHNlbnQuXG4gKi9cbnZhciBTY29wZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTY29wZSgpIHtcbiAgICAgICAgLyoqIEZsYWcgaWYgbm90aWZpeWluZyBpcyBoYXBwZW5pbmcuICovXG4gICAgICAgIHRoaXMuX25vdGlmeWluZ0xpc3RlbmVycyA9IGZhbHNlO1xuICAgICAgICAvKiogQ2FsbGJhY2sgZm9yIGNsaWVudCB0byByZWNlaXZlIHNjb3BlIGNoYW5nZXMuICovXG4gICAgICAgIHRoaXMuX3Njb3BlTGlzdGVuZXJzID0gW107XG4gICAgICAgIC8qKiBDYWxsYmFjayBsaXN0IHRoYXQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIge0BsaW5rIGFwcGx5VG9FdmVudH0uICovXG4gICAgICAgIHRoaXMuX2V2ZW50UHJvY2Vzc29ycyA9IFtdO1xuICAgICAgICAvKiogQXJyYXkgb2YgYnJlYWRjcnVtYnMuICovXG4gICAgICAgIHRoaXMuX2JyZWFkY3J1bWJzID0gW107XG4gICAgICAgIC8qKiBVc2VyICovXG4gICAgICAgIHRoaXMuX3VzZXIgPSB7fTtcbiAgICAgICAgLyoqIFRhZ3MgKi9cbiAgICAgICAgdGhpcy5fdGFncyA9IHt9O1xuICAgICAgICAvKiogRXh0cmEgKi9cbiAgICAgICAgdGhpcy5fZXh0cmEgPSB7fTtcbiAgICAgICAgLyoqIENvbnRleHRzICovXG4gICAgICAgIHRoaXMuX2NvbnRleHRzID0ge307XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBpbnRlcm5hbCBvbiBjaGFuZ2UgbGlzdGVuZXIuIFVzZWQgZm9yIHN1YiBTREtzIHRoYXQgbmVlZCB0byBzdG9yZSB0aGUgc2NvcGUuXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5hZGRTY29wZUxpc3RlbmVyID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX3Njb3BlTGlzdGVuZXJzLnB1c2goY2FsbGJhY2spO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBTY29wZS5wcm90b3R5cGUuYWRkRXZlbnRQcm9jZXNzb3IgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fZXZlbnRQcm9jZXNzb3JzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgb24gZXZlcnkgc2V0IGNhbGwuXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLl9ub3RpZnlTY29wZUxpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLl9ub3RpZnlpbmdMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeWluZ0xpc3RlbmVycyA9IHRydWU7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5fc2NvcGVMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soX3RoaXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIF90aGlzLl9ub3RpZnlpbmdMaXN0ZW5lcnMgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHtAbGluayBhcHBseVRvRXZlbnR9IGlzIGZpbmlzaGVkLlxuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5fbm90aWZ5RXZlbnRQcm9jZXNzb3JzID0gZnVuY3Rpb24gKHByb2Nlc3NvcnMsIGV2ZW50LCBoaW50LCBpbmRleCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoaW5kZXggPT09IHZvaWQgMCkgeyBpbmRleCA9IDA7IH1cbiAgICAgICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgcHJvY2Vzc29yID0gcHJvY2Vzc29yc1tpbmRleF07XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuICAgICAgICAgICAgaWYgKGV2ZW50ID09PSBudWxsIHx8IHR5cGVvZiBwcm9jZXNzb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBwcm9jZXNzb3IodHNsaWJfMS5fX2Fzc2lnbih7fSwgZXZlbnQpLCBoaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGZpbmFsKSB7IHJldHVybiBfdGhpcy5fbm90aWZ5RXZlbnRQcm9jZXNzb3JzKHByb2Nlc3NvcnMsIGZpbmFsLCBoaW50LCBpbmRleCArIDEpLnRoZW4ocmVzb2x2ZSk7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihudWxsLCByZWplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX25vdGlmeUV2ZW50UHJvY2Vzc29ycyhwcm9jZXNzb3JzLCByZXN1bHQsIGhpbnQsIGluZGV4ICsgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc29sdmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihudWxsLCByZWplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5zZXRVc2VyID0gZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgdGhpcy5fdXNlciA9IHVzZXIgfHwge307XG4gICAgICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBTY29wZS5wcm90b3R5cGUuc2V0VGFncyA9IGZ1bmN0aW9uICh0YWdzKSB7XG4gICAgICAgIHRoaXMuX3RhZ3MgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl90YWdzLCB0YWdzKTtcbiAgICAgICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5zZXRUYWcgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuX3RhZ3MgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl90YWdzLCAoX2EgPSB7fSwgX2Fba2V5XSA9IHZhbHVlLCBfYSkpO1xuICAgICAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLnNldEV4dHJhcyA9IGZ1bmN0aW9uIChleHRyYXMpIHtcbiAgICAgICAgdGhpcy5fZXh0cmEgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl9leHRyYSwgZXh0cmFzKTtcbiAgICAgICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5zZXRFeHRyYSA9IGZ1bmN0aW9uIChrZXksIGV4dHJhKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5fZXh0cmEgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl9leHRyYSwgKF9hID0ge30sIF9hW2tleV0gPSBleHRyYSwgX2EpKTtcbiAgICAgICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5zZXRGaW5nZXJwcmludCA9IGZ1bmN0aW9uIChmaW5nZXJwcmludCkge1xuICAgICAgICB0aGlzLl9maW5nZXJwcmludCA9IGZpbmdlcnByaW50O1xuICAgICAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLnNldExldmVsID0gZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgICAgIHRoaXMuX2xldmVsID0gbGV2ZWw7XG4gICAgICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBTY29wZS5wcm90b3R5cGUuc2V0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAodHJhbnNhY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjtcbiAgICAgICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5zZXRDb250ZXh0ID0gZnVuY3Rpb24gKGtleSwgY29udGV4dCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgdGhpcy5fY29udGV4dHMsIChfYSA9IHt9LCBfYVtrZXldID0gY29udGV4dCwgX2EpKTtcbiAgICAgICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5zZXRTcGFuID0gZnVuY3Rpb24gKHNwYW4pIHtcbiAgICAgICAgdGhpcy5fc3BhbiA9IHNwYW47XG4gICAgICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgZ2V0dGVyIGZvciBTcGFuLCB1c2VkIGluIEh1Yi5cbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLmdldFNwYW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zcGFuO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5oZXJpdCB2YWx1ZXMgZnJvbSB0aGUgcGFyZW50IHNjb3BlLlxuICAgICAqIEBwYXJhbSBzY29wZSB0byBjbG9uZS5cbiAgICAgKi9cbiAgICBTY29wZS5jbG9uZSA9IGZ1bmN0aW9uIChzY29wZSkge1xuICAgICAgICB2YXIgbmV3U2NvcGUgPSBuZXcgU2NvcGUoKTtcbiAgICAgICAgaWYgKHNjb3BlKSB7XG4gICAgICAgICAgICBuZXdTY29wZS5fYnJlYWRjcnVtYnMgPSB0c2xpYl8xLl9fc3ByZWFkKHNjb3BlLl9icmVhZGNydW1icyk7XG4gICAgICAgICAgICBuZXdTY29wZS5fdGFncyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHNjb3BlLl90YWdzKTtcbiAgICAgICAgICAgIG5ld1Njb3BlLl9leHRyYSA9IHRzbGliXzEuX19hc3NpZ24oe30sIHNjb3BlLl9leHRyYSk7XG4gICAgICAgICAgICBuZXdTY29wZS5fY29udGV4dHMgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCBzY29wZS5fY29udGV4dHMpO1xuICAgICAgICAgICAgbmV3U2NvcGUuX3VzZXIgPSBzY29wZS5fdXNlcjtcbiAgICAgICAgICAgIG5ld1Njb3BlLl9sZXZlbCA9IHNjb3BlLl9sZXZlbDtcbiAgICAgICAgICAgIG5ld1Njb3BlLl9zcGFuID0gc2NvcGUuX3NwYW47XG4gICAgICAgICAgICBuZXdTY29wZS5fdHJhbnNhY3Rpb24gPSBzY29wZS5fdHJhbnNhY3Rpb247XG4gICAgICAgICAgICBuZXdTY29wZS5fZmluZ2VycHJpbnQgPSBzY29wZS5fZmluZ2VycHJpbnQ7XG4gICAgICAgICAgICBuZXdTY29wZS5fZXZlbnRQcm9jZXNzb3JzID0gdHNsaWJfMS5fX3NwcmVhZChzY29wZS5fZXZlbnRQcm9jZXNzb3JzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3U2NvcGU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoY2FwdHVyZUNvbnRleHQpIHtcbiAgICAgICAgaWYgKCFjYXB0dXJlQ29udGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjYXB0dXJlQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIHVwZGF0ZWRTY29wZSA9IGNhcHR1cmVDb250ZXh0KHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZWRTY29wZSBpbnN0YW5jZW9mIFNjb3BlID8gdXBkYXRlZFNjb3BlIDogdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FwdHVyZUNvbnRleHQgaW5zdGFuY2VvZiBTY29wZSkge1xuICAgICAgICAgICAgdGhpcy5fdGFncyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHRoaXMuX3RhZ3MsIGNhcHR1cmVDb250ZXh0Ll90YWdzKTtcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgdGhpcy5fZXh0cmEsIGNhcHR1cmVDb250ZXh0Ll9leHRyYSk7XG4gICAgICAgICAgICB0aGlzLl9jb250ZXh0cyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHRoaXMuX2NvbnRleHRzLCBjYXB0dXJlQ29udGV4dC5fY29udGV4dHMpO1xuICAgICAgICAgICAgaWYgKGNhcHR1cmVDb250ZXh0Ll91c2VyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXNlciA9IGNhcHR1cmVDb250ZXh0Ll91c2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNhcHR1cmVDb250ZXh0Ll9sZXZlbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xldmVsID0gY2FwdHVyZUNvbnRleHQuX2xldmVsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNhcHR1cmVDb250ZXh0Ll9maW5nZXJwcmludCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmdlcnByaW50ID0gY2FwdHVyZUNvbnRleHQuX2ZpbmdlcnByaW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoY2FwdHVyZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tcGFyYW1ldGVyLXJlYXNzaWdubWVudFxuICAgICAgICAgICAgY2FwdHVyZUNvbnRleHQgPSBjYXB0dXJlQ29udGV4dDtcbiAgICAgICAgICAgIHRoaXMuX3RhZ3MgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl90YWdzLCBjYXB0dXJlQ29udGV4dC50YWdzKTtcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgdGhpcy5fZXh0cmEsIGNhcHR1cmVDb250ZXh0LmV4dHJhKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRleHRzID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgdGhpcy5fY29udGV4dHMsIGNhcHR1cmVDb250ZXh0LmNvbnRleHRzKTtcbiAgICAgICAgICAgIGlmIChjYXB0dXJlQ29udGV4dC51c2VyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXNlciA9IGNhcHR1cmVDb250ZXh0LnVzZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2FwdHVyZUNvbnRleHQubGV2ZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sZXZlbCA9IGNhcHR1cmVDb250ZXh0LmxldmVsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNhcHR1cmVDb250ZXh0LmZpbmdlcnByaW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmluZ2VycHJpbnQgPSBjYXB0dXJlQ29udGV4dC5maW5nZXJwcmludDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9icmVhZGNydW1icyA9IFtdO1xuICAgICAgICB0aGlzLl90YWdzID0ge307XG4gICAgICAgIHRoaXMuX2V4dHJhID0ge307XG4gICAgICAgIHRoaXMuX3VzZXIgPSB7fTtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB7fTtcbiAgICAgICAgdGhpcy5fbGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9maW5nZXJwcmludCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc3BhbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5hZGRCcmVhZGNydW1iID0gZnVuY3Rpb24gKGJyZWFkY3J1bWIsIG1heEJyZWFkY3J1bWJzKSB7XG4gICAgICAgIHZhciBtZXJnZWRCcmVhZGNydW1iID0gdHNsaWJfMS5fX2Fzc2lnbih7IHRpbWVzdGFtcDogdGltZXN0YW1wV2l0aE1zKCkgfSwgYnJlYWRjcnVtYik7XG4gICAgICAgIHRoaXMuX2JyZWFkY3J1bWJzID1cbiAgICAgICAgICAgIG1heEJyZWFkY3J1bWJzICE9PSB1bmRlZmluZWQgJiYgbWF4QnJlYWRjcnVtYnMgPj0gMFxuICAgICAgICAgICAgICAgID8gdHNsaWJfMS5fX3NwcmVhZCh0aGlzLl9icmVhZGNydW1icywgW21lcmdlZEJyZWFkY3J1bWJdKS5zbGljZSgtbWF4QnJlYWRjcnVtYnMpXG4gICAgICAgICAgICAgICAgOiB0c2xpYl8xLl9fc3ByZWFkKHRoaXMuX2JyZWFkY3J1bWJzLCBbbWVyZ2VkQnJlYWRjcnVtYl0pO1xuICAgICAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLmNsZWFyQnJlYWRjcnVtYnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2JyZWFkY3J1bWJzID0gW107XG4gICAgICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQXBwbGllcyBmaW5nZXJwcmludCBmcm9tIHRoZSBzY29wZSB0byB0aGUgZXZlbnQgaWYgdGhlcmUncyBvbmUsXG4gICAgICogdXNlcyBtZXNzYWdlIGlmIHRoZXJlJ3Mgb25lIGluc3RlYWQgb3IgZ2V0IHJpZCBvZiBlbXB0eSBmaW5nZXJwcmludFxuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5fYXBwbHlGaW5nZXJwcmludCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBhbiBhcnJheSBmaXJzdCBhbmQgd2UgYWN0dWFsbHkgaGF2ZSBzb21ldGhpbmcgaW4gcGxhY2VcbiAgICAgICAgZXZlbnQuZmluZ2VycHJpbnQgPSBldmVudC5maW5nZXJwcmludFxuICAgICAgICAgICAgPyBBcnJheS5pc0FycmF5KGV2ZW50LmZpbmdlcnByaW50KVxuICAgICAgICAgICAgICAgID8gZXZlbnQuZmluZ2VycHJpbnRcbiAgICAgICAgICAgICAgICA6IFtldmVudC5maW5nZXJwcmludF1cbiAgICAgICAgICAgIDogW107XG4gICAgICAgIC8vIElmIHdlIGhhdmUgc29tZXRoaW5nIG9uIHRoZSBzY29wZSwgdGhlbiBtZXJnZSBpdCB3aXRoIGV2ZW50XG4gICAgICAgIGlmICh0aGlzLl9maW5nZXJwcmludCkge1xuICAgICAgICAgICAgZXZlbnQuZmluZ2VycHJpbnQgPSBldmVudC5maW5nZXJwcmludC5jb25jYXQodGhpcy5fZmluZ2VycHJpbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHdlIGhhdmUgbm8gZGF0YSBhdCBhbGwsIHJlbW92ZSBlbXB0eSBhcnJheSBkZWZhdWx0XG4gICAgICAgIGlmIChldmVudC5maW5nZXJwcmludCAmJiAhZXZlbnQuZmluZ2VycHJpbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBkZWxldGUgZXZlbnQuZmluZ2VycHJpbnQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgZmluZ2VycHJpbnQgdG8gdGhlIGV2ZW50LlxuICAgICAqIE5vdGUgdGhhdCBicmVhZGNydW1icyB3aWxsIGJlIGFkZGVkIGJ5IHRoZSBjbGllbnQuXG4gICAgICogQWxzbyBpZiB0aGUgZXZlbnQgaGFzIGFscmVhZHkgYnJlYWRjcnVtYnMgb24gaXQsIHdlIGRvIG5vdCBtZXJnZSB0aGVtLlxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudFxuICAgICAqIEBwYXJhbSBoaW50IE1heSBjb250YWluIGFkZGl0aW9uYWwgaW5mb3JtYXJ0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBleGNlcHRpb24uXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5hcHBseVRvRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGhpbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2V4dHJhICYmIE9iamVjdC5rZXlzKHRoaXMuX2V4dHJhKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGV2ZW50LmV4dHJhID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgdGhpcy5fZXh0cmEsIGV2ZW50LmV4dHJhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdGFncyAmJiBPYmplY3Qua2V5cyh0aGlzLl90YWdzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGV2ZW50LnRhZ3MgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl90YWdzLCBldmVudC50YWdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdXNlciAmJiBPYmplY3Qua2V5cyh0aGlzLl91c2VyKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGV2ZW50LnVzZXIgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl91c2VyLCBldmVudC51c2VyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY29udGV4dHMgJiYgT2JqZWN0LmtleXModGhpcy5fY29udGV4dHMpLmxlbmd0aCkge1xuICAgICAgICAgICAgZXZlbnQuY29udGV4dHMgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl9jb250ZXh0cywgZXZlbnQuY29udGV4dHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9sZXZlbCkge1xuICAgICAgICAgICAgZXZlbnQubGV2ZWwgPSB0aGlzLl9sZXZlbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgIGV2ZW50LnRyYW5zYWN0aW9uID0gdGhpcy5fdHJhbnNhY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYXBwbHlGaW5nZXJwcmludChldmVudCk7XG4gICAgICAgIGV2ZW50LmJyZWFkY3J1bWJzID0gdHNsaWJfMS5fX3NwcmVhZCgoZXZlbnQuYnJlYWRjcnVtYnMgfHwgW10pLCB0aGlzLl9icmVhZGNydW1icyk7XG4gICAgICAgIGV2ZW50LmJyZWFkY3J1bWJzID0gZXZlbnQuYnJlYWRjcnVtYnMubGVuZ3RoID4gMCA/IGV2ZW50LmJyZWFkY3J1bWJzIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcy5fbm90aWZ5RXZlbnRQcm9jZXNzb3JzKHRzbGliXzEuX19zcHJlYWQoZ2V0R2xvYmFsRXZlbnRQcm9jZXNzb3JzKCksIHRoaXMuX2V2ZW50UHJvY2Vzc29ycyksIGV2ZW50LCBoaW50KTtcbiAgICB9O1xuICAgIHJldHVybiBTY29wZTtcbn0oKSk7XG5leHBvcnQgeyBTY29wZSB9O1xuLyoqXG4gKiBSZXRydW5zIHRoZSBnbG9iYWwgZXZlbnQgcHJvY2Vzc29ycy5cbiAqL1xuZnVuY3Rpb24gZ2V0R2xvYmFsRXZlbnRQcm9jZXNzb3JzKCkge1xuICAgIHZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgICBnbG9iYWwuX19TRU5UUllfXyA9IGdsb2JhbC5fX1NFTlRSWV9fIHx8IHt9O1xuICAgIGdsb2JhbC5fX1NFTlRSWV9fLmdsb2JhbEV2ZW50UHJvY2Vzc29ycyA9IGdsb2JhbC5fX1NFTlRSWV9fLmdsb2JhbEV2ZW50UHJvY2Vzc29ycyB8fCBbXTtcbiAgICByZXR1cm4gZ2xvYmFsLl9fU0VOVFJZX18uZ2xvYmFsRXZlbnRQcm9jZXNzb3JzO1xufVxuLyoqXG4gKiBBZGQgYSBFdmVudFByb2Nlc3NvciB0byBiZSBrZXB0IGdsb2JhbGx5LlxuICogQHBhcmFtIGNhbGxiYWNrIEV2ZW50UHJvY2Vzc29yIHRvIGFkZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IoY2FsbGJhY2spIHtcbiAgICBnZXRHbG9iYWxFdmVudFByb2Nlc3NvcnMoKS5wdXNoKGNhbGxiYWNrKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNjb3BlLmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuLyoqXG4gKiBUaGlzIGNhbGxzIGEgZnVuY3Rpb24gb24gdGhlIGN1cnJlbnQgaHViLlxuICogQHBhcmFtIG1ldGhvZCBmdW5jdGlvbiB0byBjYWxsIG9uIGh1Yi5cbiAqIEBwYXJhbSBhcmdzIHRvIHBhc3MgdG8gZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNhbGxPbkh1YihtZXRob2QpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciBodWIgPSBnZXRDdXJyZW50SHViKCk7XG4gICAgaWYgKGh1YiAmJiBodWJbbWV0aG9kXSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5zYWZlLWFueVxuICAgICAgICByZXR1cm4gaHViW21ldGhvZF0uYXBwbHkoaHViLCB0c2xpYl8xLl9fc3ByZWFkKGFyZ3MpKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gaHViIGRlZmluZWQgb3IgXCIgKyBtZXRob2QgKyBcIiB3YXMgbm90IGZvdW5kIG9uIHRoZSBodWIsIHBsZWFzZSBvcGVuIGEgYnVnIHJlcG9ydC5cIik7XG59XG4vKipcbiAqIENhcHR1cmVzIGFuIGV4Y2VwdGlvbiBldmVudCBhbmQgc2VuZHMgaXQgdG8gU2VudHJ5LlxuICpcbiAqIEBwYXJhbSBleGNlcHRpb24gQW4gZXhjZXB0aW9uLWxpa2Ugb2JqZWN0LlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBldmVudElkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FwdHVyZUV4Y2VwdGlvbihleGNlcHRpb24sIGNhcHR1cmVDb250ZXh0KSB7XG4gICAgdmFyIHN5bnRoZXRpY0V4Y2VwdGlvbjtcbiAgICB0cnkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlbnRyeSBzeW50aGV0aWNFeGNlcHRpb24nKTtcbiAgICB9XG4gICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICBzeW50aGV0aWNFeGNlcHRpb24gPSBleGNlcHRpb247XG4gICAgfVxuICAgIHJldHVybiBjYWxsT25IdWIoJ2NhcHR1cmVFeGNlcHRpb24nLCBleGNlcHRpb24sIHtcbiAgICAgICAgY2FwdHVyZUNvbnRleHQ6IGNhcHR1cmVDb250ZXh0LFxuICAgICAgICBvcmlnaW5hbEV4Y2VwdGlvbjogZXhjZXB0aW9uLFxuICAgICAgICBzeW50aGV0aWNFeGNlcHRpb246IHN5bnRoZXRpY0V4Y2VwdGlvbixcbiAgICB9KTtcbn1cbi8qKlxuICogQ2FwdHVyZXMgYSBtZXNzYWdlIGV2ZW50IGFuZCBzZW5kcyBpdCB0byBTZW50cnkuXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gc2VuZCB0byBTZW50cnkuXG4gKiBAcGFyYW0gbGV2ZWwgRGVmaW5lIHRoZSBsZXZlbCBvZiB0aGUgbWVzc2FnZS5cbiAqIEByZXR1cm5zIFRoZSBnZW5lcmF0ZWQgZXZlbnRJZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhcHR1cmVNZXNzYWdlKG1lc3NhZ2UsIGNhcHR1cmVDb250ZXh0KSB7XG4gICAgdmFyIHN5bnRoZXRpY0V4Y2VwdGlvbjtcbiAgICB0cnkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgc3ludGhldGljRXhjZXB0aW9uID0gZXhjZXB0aW9uO1xuICAgIH1cbiAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBwcm92aWRlIGV4cGxpY2l0IHNjb3BlcyB1cGdyYWRlLCB3aXRob3V0IGNoYW5naW5nIHRoZSBvcmlnaW5hbFxuICAgIC8vIGFycml0eSBvZiB0aGUgYGNhcHR1cmVNZXNzYWdlKG1lc3NhZ2UsIGxldmVsKWAgbWV0aG9kLlxuICAgIHZhciBsZXZlbCA9IHR5cGVvZiBjYXB0dXJlQ29udGV4dCA9PT0gJ3N0cmluZycgPyBjYXB0dXJlQ29udGV4dCA6IHVuZGVmaW5lZDtcbiAgICB2YXIgY29udGV4dCA9IHR5cGVvZiBjYXB0dXJlQ29udGV4dCAhPT0gJ3N0cmluZycgPyB7IGNhcHR1cmVDb250ZXh0OiBjYXB0dXJlQ29udGV4dCB9IDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBjYWxsT25IdWIoJ2NhcHR1cmVNZXNzYWdlJywgbWVzc2FnZSwgbGV2ZWwsIHRzbGliXzEuX19hc3NpZ24oeyBvcmlnaW5hbEV4Y2VwdGlvbjogbWVzc2FnZSwgc3ludGhldGljRXhjZXB0aW9uOiBzeW50aGV0aWNFeGNlcHRpb24gfSwgY29udGV4dCkpO1xufVxuLyoqXG4gKiBDYXB0dXJlcyBhIG1hbnVhbGx5IGNyZWF0ZWQgZXZlbnQgYW5kIHNlbmRzIGl0IHRvIFNlbnRyeS5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHNlbmQgdG8gU2VudHJ5LlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBldmVudElkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FwdHVyZUV2ZW50KGV2ZW50KSB7XG4gICAgcmV0dXJuIGNhbGxPbkh1YignY2FwdHVyZUV2ZW50JywgZXZlbnQpO1xufVxuLyoqXG4gKiBDYWxsYmFjayB0byBzZXQgY29udGV4dCBpbmZvcm1hdGlvbiBvbnRvIHRoZSBzY29wZS5cbiAqIEBwYXJhbSBjYWxsYmFjayBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIFNjb3BlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlU2NvcGUoY2FsbGJhY2spIHtcbiAgICBjYWxsT25IdWIoJ2NvbmZpZ3VyZVNjb3BlJywgY2FsbGJhY2spO1xufVxuLyoqXG4gKiBSZWNvcmRzIGEgbmV3IGJyZWFkY3J1bWIgd2hpY2ggd2lsbCBiZSBhdHRhY2hlZCB0byBmdXR1cmUgZXZlbnRzLlxuICpcbiAqIEJyZWFkY3J1bWJzIHdpbGwgYmUgYWRkZWQgdG8gc3Vic2VxdWVudCBldmVudHMgdG8gcHJvdmlkZSBtb3JlIGNvbnRleHQgb25cbiAqIHVzZXIncyBhY3Rpb25zIHByaW9yIHRvIGFuIGVycm9yIG9yIGNyYXNoLlxuICpcbiAqIEBwYXJhbSBicmVhZGNydW1iIFRoZSBicmVhZGNydW1iIHRvIHJlY29yZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEJyZWFkY3J1bWIoYnJlYWRjcnVtYikge1xuICAgIGNhbGxPbkh1YignYWRkQnJlYWRjcnVtYicsIGJyZWFkY3J1bWIpO1xufVxuLyoqXG4gKiBTZXRzIGNvbnRleHQgZGF0YSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICogQHBhcmFtIG5hbWUgb2YgdGhlIGNvbnRleHRcbiAqIEBwYXJhbSBjb250ZXh0IEFueSBraW5kIG9mIGRhdGEuIFRoaXMgZGF0YSB3aWxsIGJlIG5vcm1hbGl6ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb250ZXh0KG5hbWUsIGNvbnRleHQpIHtcbiAgICBjYWxsT25IdWIoJ3NldENvbnRleHQnLCBuYW1lLCBjb250ZXh0KTtcbn1cbi8qKlxuICogU2V0IGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgbWVyZ2VkIHNlbnQgYXMgZXh0cmEgZGF0YSB3aXRoIHRoZSBldmVudC5cbiAqIEBwYXJhbSBleHRyYXMgRXh0cmFzIG9iamVjdCB0byBtZXJnZSBpbnRvIGN1cnJlbnQgY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEV4dHJhcyhleHRyYXMpIHtcbiAgICBjYWxsT25IdWIoJ3NldEV4dHJhcycsIGV4dHJhcyk7XG59XG4vKipcbiAqIFNldCBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIG1lcmdlZCBzZW50IGFzIHRhZ3MgZGF0YSB3aXRoIHRoZSBldmVudC5cbiAqIEBwYXJhbSB0YWdzIFRhZ3MgY29udGV4dCBvYmplY3QgdG8gbWVyZ2UgaW50byBjdXJyZW50IGNvbnRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRUYWdzKHRhZ3MpIHtcbiAgICBjYWxsT25IdWIoJ3NldFRhZ3MnLCB0YWdzKTtcbn1cbi8qKlxuICogU2V0IGtleTp2YWx1ZSB0aGF0IHdpbGwgYmUgc2VudCBhcyBleHRyYSBkYXRhIHdpdGggdGhlIGV2ZW50LlxuICogQHBhcmFtIGtleSBTdHJpbmcgb2YgZXh0cmFcbiAqIEBwYXJhbSBleHRyYSBBbnkga2luZCBvZiBkYXRhLiBUaGlzIGRhdGEgd2lsbCBiZSBub3JtYWxpemVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RXh0cmEoa2V5LCBleHRyYSkge1xuICAgIGNhbGxPbkh1Yignc2V0RXh0cmEnLCBrZXksIGV4dHJhKTtcbn1cbi8qKlxuICogU2V0IGtleTp2YWx1ZSB0aGF0IHdpbGwgYmUgc2VudCBhcyB0YWdzIGRhdGEgd2l0aCB0aGUgZXZlbnQuXG4gKiBAcGFyYW0ga2V5IFN0cmluZyBrZXkgb2YgdGFnXG4gKiBAcGFyYW0gdmFsdWUgU3RyaW5nIHZhbHVlIG9mIHRhZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VGFnKGtleSwgdmFsdWUpIHtcbiAgICBjYWxsT25IdWIoJ3NldFRhZycsIGtleSwgdmFsdWUpO1xufVxuLyoqXG4gKiBVcGRhdGVzIHVzZXIgY29udGV4dCBpbmZvcm1hdGlvbiBmb3IgZnV0dXJlIGV2ZW50cy5cbiAqXG4gKiBAcGFyYW0gdXNlciBVc2VyIGNvbnRleHQgb2JqZWN0IHRvIGJlIHNldCBpbiB0aGUgY3VycmVudCBjb250ZXh0LiBQYXNzIGBudWxsYCB0byB1bnNldCB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFVzZXIodXNlcikge1xuICAgIGNhbGxPbkh1Yignc2V0VXNlcicsIHVzZXIpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHNjb3BlIHdpdGggYW5kIGV4ZWN1dGVzIHRoZSBnaXZlbiBvcGVyYXRpb24gd2l0aGluLlxuICogVGhlIHNjb3BlIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBvbmNlIHRoZSBvcGVyYXRpb25cbiAqIGZpbmlzaGVzIG9yIHRocm93cy5cbiAqXG4gKiBUaGlzIGlzIGVzc2VudGlhbGx5IGEgY29udmVuaWVuY2UgZnVuY3Rpb24gZm9yOlxuICpcbiAqICAgICBwdXNoU2NvcGUoKTtcbiAqICAgICBjYWxsYmFjaygpO1xuICogICAgIHBvcFNjb3BlKCk7XG4gKlxuICogQHBhcmFtIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBlbmNsb3NlZCBpbnRvIHB1c2gvcG9wU2NvcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU2NvcGUoY2FsbGJhY2spIHtcbiAgICBjYWxsT25IdWIoJ3dpdGhTY29wZScsIGNhbGxiYWNrKTtcbn1cbi8qKlxuICogQ2FsbHMgYSBmdW5jdGlvbiBvbiB0aGUgbGF0ZXN0IGNsaWVudC4gVXNlIHRoaXMgd2l0aCBjYXV0aW9uLCBpdCdzIG1lYW50IGFzXG4gKiBpbiBcImludGVybmFsXCIgaGVscGVyIHNvIHdlIGRvbid0IG5lZWQgdG8gZXhwb3NlIGV2ZXJ5IHBvc3NpYmxlIGZ1bmN0aW9uIGluXG4gKiB0aGUgc2hpbS4gSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdCB0aGUgY2xpZW50IGFjdHVhbGx5IGltcGxlbWVudHMgdGhlXG4gKiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kIFRoZSBtZXRob2QgdG8gY2FsbCBvbiB0aGUgY2xpZW50L2NsaWVudC5cbiAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjbGllbnQvZm9udGVuZC5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9jYWxsT25DbGllbnQobWV0aG9kKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICBjYWxsT25IdWIuYXBwbHkodm9pZCAwLCB0c2xpYl8xLl9fc3ByZWFkKFsnX2ludm9rZUNsaWVudCcsIG1ldGhvZF0sIGFyZ3MpKTtcbn1cbi8qKlxuICogU3RhcnRzIGEgVHJhbnNhY3Rpb24uIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IHRvIGRvIG1hbnVhbCB0cmFjaW5nLiBZb3UgY2FuXG4gKiBhZGQgY2hpbGQgc3BhbnMgdG8gdHJhbnNhY3Rpb25zLiBTcGFucyB0aGVtc2VsdmVzIGNhbiBoYXZlIGNoaWxkcmVuLCBidWlsZGluZ1xuICogYSB0cmVlIHN0cnVjdHVyZS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgVHJhbnNhY3Rpb24gYW5kIHlvdSBuZWVkIHRvIGtlZXBcbiAqIHRyYWNrIG9mIHRoZSBpbnN0YW5jZSB5b3Vyc2VsZi4gV2hlbiB5b3UgY2FsbCBgLmZpbmlzaCgpYCBvbiB0aGUgdHJhbnNhY3Rpb25cbiAqIGl0IHdpbGwgYmUgc2VudCB0byBTZW50cnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydFRyYW5zYWN0aW9uKGNvbnRleHQpIHtcbiAgICByZXR1cm4gY2FsbE9uSHViKCdzdGFydFRyYW5zYWN0aW9uJywgdHNsaWJfMS5fX2Fzc2lnbih7fSwgY29udGV4dCkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiZXhwb3J0IHsgTG9nTGV2ZWwgfSBmcm9tICcuL2xvZ2xldmVsJztcbmV4cG9ydCB7IFNldmVyaXR5IH0gZnJvbSAnLi9zZXZlcml0eSc7XG5leHBvcnQgeyBTdGF0dXMgfSBmcm9tICcuL3N0YXR1cyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvKiogQ29uc29sZSBsb2dnaW5nIHZlcmJvc2l0eSBmb3IgdGhlIFNESy4gKi9cbmV4cG9ydCB2YXIgTG9nTGV2ZWw7XG4oZnVuY3Rpb24gKExvZ0xldmVsKSB7XG4gICAgLyoqIE5vIGxvZ3Mgd2lsbCBiZSBnZW5lcmF0ZWQuICovXG4gICAgTG9nTGV2ZWxbTG9nTGV2ZWxbXCJOb25lXCJdID0gMF0gPSBcIk5vbmVcIjtcbiAgICAvKiogT25seSBTREsgaW50ZXJuYWwgZXJyb3JzIHdpbGwgYmUgbG9nZ2VkLiAqL1xuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiRXJyb3JcIl0gPSAxXSA9IFwiRXJyb3JcIjtcbiAgICAvKiogSW5mb3JtYXRpb24gdXNlZnVsIGZvciBkZWJ1Z2dpbmcgdGhlIFNESyB3aWxsIGJlIGxvZ2dlZC4gKi9cbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIkRlYnVnXCJdID0gMl0gPSBcIkRlYnVnXCI7XG4gICAgLyoqIEFsbCBTREsgYWN0aW9ucyB3aWxsIGJlIGxvZ2dlZC4gKi9cbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIlZlcmJvc2VcIl0gPSAzXSA9IFwiVmVyYm9zZVwiO1xufSkoTG9nTGV2ZWwgfHwgKExvZ0xldmVsID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZ2xldmVsLmpzLm1hcCIsIi8qKiBKU0RvYyAqL1xuZXhwb3J0IHZhciBTZXZlcml0eTtcbihmdW5jdGlvbiAoU2V2ZXJpdHkpIHtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBTZXZlcml0eVtcIkZhdGFsXCJdID0gXCJmYXRhbFwiO1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIFNldmVyaXR5W1wiRXJyb3JcIl0gPSBcImVycm9yXCI7XG4gICAgLyoqIEpTRG9jICovXG4gICAgU2V2ZXJpdHlbXCJXYXJuaW5nXCJdID0gXCJ3YXJuaW5nXCI7XG4gICAgLyoqIEpTRG9jICovXG4gICAgU2V2ZXJpdHlbXCJMb2dcIl0gPSBcImxvZ1wiO1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIFNldmVyaXR5W1wiSW5mb1wiXSA9IFwiaW5mb1wiO1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIFNldmVyaXR5W1wiRGVidWdcIl0gPSBcImRlYnVnXCI7XG4gICAgLyoqIEpTRG9jICovXG4gICAgU2V2ZXJpdHlbXCJDcml0aWNhbFwiXSA9IFwiY3JpdGljYWxcIjtcbn0pKFNldmVyaXR5IHx8IChTZXZlcml0eSA9IHt9KSk7XG4vLyB0c2xpbnQ6ZGlzYWJsZTpjb21wbGV0ZWQtZG9jc1xuLy8gdHNsaW50OmRpc2FibGU6bm8tdW5uZWNlc3NhcnktcXVhbGlmaWVyIG5vLW5hbWVzcGFjZVxuKGZ1bmN0aW9uIChTZXZlcml0eSkge1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgc3RyaW5nLWJhc2VkIGxldmVsIGludG8gYSB7QGxpbmsgU2V2ZXJpdHl9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGxldmVsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBTZXZlcml0eVxuICAgICAqIEByZXR1cm5zIFNldmVyaXR5XG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVN0cmluZyhsZXZlbCkge1xuICAgICAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICAgICAgICBjYXNlICdkZWJ1Zyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNldmVyaXR5LkRlYnVnO1xuICAgICAgICAgICAgY2FzZSAnaW5mbyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNldmVyaXR5LkluZm87XG4gICAgICAgICAgICBjYXNlICd3YXJuJzpcbiAgICAgICAgICAgIGNhc2UgJ3dhcm5pbmcnOlxuICAgICAgICAgICAgICAgIHJldHVybiBTZXZlcml0eS5XYXJuaW5nO1xuICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICAgIHJldHVybiBTZXZlcml0eS5FcnJvcjtcbiAgICAgICAgICAgIGNhc2UgJ2ZhdGFsJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU2V2ZXJpdHkuRmF0YWw7XG4gICAgICAgICAgICBjYXNlICdjcml0aWNhbCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNldmVyaXR5LkNyaXRpY2FsO1xuICAgICAgICAgICAgY2FzZSAnbG9nJzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNldmVyaXR5LkxvZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBTZXZlcml0eS5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFNldmVyaXR5IHx8IChTZXZlcml0eSA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXZlcml0eS5qcy5tYXAiLCIvKiogVGhlIHN0YXR1cyBvZiBhbiBldmVudC4gKi9cbmV4cG9ydCB2YXIgU3RhdHVzO1xuKGZ1bmN0aW9uIChTdGF0dXMpIHtcbiAgICAvKiogVGhlIHN0YXR1cyBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4gKi9cbiAgICBTdGF0dXNbXCJVbmtub3duXCJdID0gXCJ1bmtub3duXCI7XG4gICAgLyoqIFRoZSBldmVudCB3YXMgc2tpcHBlZCBkdWUgdG8gY29uZmlndXJhdGlvbiBvciBjYWxsYmFja3MuICovXG4gICAgU3RhdHVzW1wiU2tpcHBlZFwiXSA9IFwic2tpcHBlZFwiO1xuICAgIC8qKiBUaGUgZXZlbnQgd2FzIHNlbnQgdG8gU2VudHJ5IHN1Y2Nlc3NmdWxseS4gKi9cbiAgICBTdGF0dXNbXCJTdWNjZXNzXCJdID0gXCJzdWNjZXNzXCI7XG4gICAgLyoqIFRoZSBjbGllbnQgaXMgY3VycmVudGx5IHJhdGUgbGltaXRlZCBhbmQgd2lsbCB0cnkgYWdhaW4gbGF0ZXIuICovXG4gICAgU3RhdHVzW1wiUmF0ZUxpbWl0XCJdID0gXCJyYXRlX2xpbWl0XCI7XG4gICAgLyoqIFRoZSBldmVudCBjb3VsZCBub3QgYmUgcHJvY2Vzc2VkLiAqL1xuICAgIFN0YXR1c1tcIkludmFsaWRcIl0gPSBcImludmFsaWRcIjtcbiAgICAvKiogQSBzZXJ2ZXItc2lkZSBlcnJvciBvY3VycmVkIGR1cmluZyBzdWJtaXNzaW9uLiAqL1xuICAgIFN0YXR1c1tcIkZhaWxlZFwiXSA9IFwiZmFpbGVkXCI7XG59KShTdGF0dXMgfHwgKFN0YXR1cyA9IHt9KSk7XG4vLyB0c2xpbnQ6ZGlzYWJsZTpjb21wbGV0ZWQtZG9jc1xuLy8gdHNsaW50OmRpc2FibGU6bm8tdW5uZWNlc3NhcnktcXVhbGlmaWVyIG5vLW5hbWVzcGFjZVxuKGZ1bmN0aW9uIChTdGF0dXMpIHtcbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIEhUVFAgc3RhdHVzIGNvZGUgaW50byBhIHtAbGluayBTdGF0dXN9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvZGUgVGhlIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUuXG4gICAgICogQHJldHVybnMgVGhlIHNlbmQgc3RhdHVzIG9yIHtAbGluayBTdGF0dXMuVW5rbm93bn0uXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbUh0dHBDb2RlKGNvZGUpIHtcbiAgICAgICAgaWYgKGNvZGUgPj0gMjAwICYmIGNvZGUgPCAzMDApIHtcbiAgICAgICAgICAgIHJldHVybiBTdGF0dXMuU3VjY2VzcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29kZSA9PT0gNDI5KSB7XG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLlJhdGVMaW1pdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29kZSA+PSA0MDAgJiYgY29kZSA8IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5JbnZhbGlkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2RlID49IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5GYWlsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN0YXR1cy5Vbmtub3duO1xuICAgIH1cbiAgICBTdGF0dXMuZnJvbUh0dHBDb2RlID0gZnJvbUh0dHBDb2RlO1xufSkoU3RhdHVzIHx8IChTdGF0dXMgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RhdHVzLmpzLm1hcCIsIi8qKlxuICogQ29uc3VtZXMgdGhlIHByb21pc2UgYW5kIGxvZ3MgdGhlIGVycm9yIHdoZW4gaXQgcmVqZWN0cy5cbiAqIEBwYXJhbSBwcm9taXNlIEEgcHJvbWlzZSB0byBmb3JnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JnZXQocHJvbWlzZSkge1xuICAgIHByb21pc2UudGhlbihudWxsLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAvLyBUT0RPOiBVc2UgYSBiZXR0ZXIgbG9nZ2luZyBtZWNoYW5pc21cbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzeW5jLmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBTZW50cnlFcnJvciB9IGZyb20gJy4vZXJyb3InO1xuLyoqIFJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIHBhcnNlIGEgRHNuLiAqL1xudmFyIERTTl9SRUdFWCA9IC9eKD86KFxcdyspOilcXC9cXC8oPzooXFx3KykoPzo6KFxcdyspKT9AKShbXFx3XFwuLV0rKSg/OjooXFxkKykpP1xcLyguKykvO1xuLyoqIEVycm9yIG1lc3NhZ2UgKi9cbnZhciBFUlJPUl9NRVNTQUdFID0gJ0ludmFsaWQgRHNuJztcbi8qKiBUaGUgU2VudHJ5IERzbiwgaWRlbnRpZnlpbmcgYSBTZW50cnkgaW5zdGFuY2UgYW5kIHByb2plY3QuICovXG52YXIgRHNuID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKiBDcmVhdGVzIGEgbmV3IERzbiBjb21wb25lbnQgKi9cbiAgICBmdW5jdGlvbiBEc24oZnJvbSkge1xuICAgICAgICBpZiAodHlwZW9mIGZyb20gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLl9mcm9tU3RyaW5nKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZnJvbUNvbXBvbmVudHMoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmFsaWRhdGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHNuLlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgdGhpcyB3aWxsIHJlbmRlciB0aGUgcHVibGljIHJlcHJlc2VudGF0aW9uIHdpdGhvdXQgdGhlIHBhc3N3b3JkXG4gICAgICogY29tcG9uZW50LiBUbyBnZXQgdGhlIGRlcHJlY2F0ZWQgcHJpdmF0ZSByZXByZXNlbnRhdGlvbiwgc2V0IGB3aXRoUGFzc3dvcmRgXG4gICAgICogdG8gdHJ1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aXRoUGFzc3dvcmQgV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIHBhc3N3b3JkIHdpbGwgYmUgaW5jbHVkZWQuXG4gICAgICovXG4gICAgRHNuLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICh3aXRoUGFzc3dvcmQpIHtcbiAgICAgICAgaWYgKHdpdGhQYXNzd29yZCA9PT0gdm9pZCAwKSB7IHdpdGhQYXNzd29yZCA9IGZhbHNlOyB9XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby10aGlzLWFzc2lnbm1lbnRcbiAgICAgICAgdmFyIF9hID0gdGhpcywgaG9zdCA9IF9hLmhvc3QsIHBhdGggPSBfYS5wYXRoLCBwYXNzID0gX2EucGFzcywgcG9ydCA9IF9hLnBvcnQsIHByb2plY3RJZCA9IF9hLnByb2plY3RJZCwgcHJvdG9jb2wgPSBfYS5wcm90b2NvbCwgdXNlciA9IF9hLnVzZXI7XG4gICAgICAgIHJldHVybiAocHJvdG9jb2wgKyBcIjovL1wiICsgdXNlciArICh3aXRoUGFzc3dvcmQgJiYgcGFzcyA/IFwiOlwiICsgcGFzcyA6ICcnKSArXG4gICAgICAgICAgICAoXCJAXCIgKyBob3N0ICsgKHBvcnQgPyBcIjpcIiArIHBvcnQgOiAnJykgKyBcIi9cIiArIChwYXRoID8gcGF0aCArIFwiL1wiIDogcGF0aCkgKyBwcm9qZWN0SWQpKTtcbiAgICB9O1xuICAgIC8qKiBQYXJzZXMgYSBzdHJpbmcgaW50byB0aGlzIERzbi4gKi9cbiAgICBEc24ucHJvdG90eXBlLl9mcm9tU3RyaW5nID0gZnVuY3Rpb24gKHN0cikge1xuICAgICAgICB2YXIgbWF0Y2ggPSBEU05fUkVHRVguZXhlYyhzdHIpO1xuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoRVJST1JfTUVTU0FHRSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9hID0gdHNsaWJfMS5fX3JlYWQobWF0Y2guc2xpY2UoMSksIDYpLCBwcm90b2NvbCA9IF9hWzBdLCB1c2VyID0gX2FbMV0sIF9iID0gX2FbMl0sIHBhc3MgPSBfYiA9PT0gdm9pZCAwID8gJycgOiBfYiwgaG9zdCA9IF9hWzNdLCBfYyA9IF9hWzRdLCBwb3J0ID0gX2MgPT09IHZvaWQgMCA/ICcnIDogX2MsIGxhc3RQYXRoID0gX2FbNV07XG4gICAgICAgIHZhciBwYXRoID0gJyc7XG4gICAgICAgIHZhciBwcm9qZWN0SWQgPSBsYXN0UGF0aDtcbiAgICAgICAgdmFyIHNwbGl0ID0gcHJvamVjdElkLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChzcGxpdC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBwYXRoID0gc3BsaXQuc2xpY2UoMCwgLTEpLmpvaW4oJy8nKTtcbiAgICAgICAgICAgIHByb2plY3RJZCA9IHNwbGl0LnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Zyb21Db21wb25lbnRzKHsgaG9zdDogaG9zdCwgcGFzczogcGFzcywgcGF0aDogcGF0aCwgcHJvamVjdElkOiBwcm9qZWN0SWQsIHBvcnQ6IHBvcnQsIHByb3RvY29sOiBwcm90b2NvbCwgdXNlcjogdXNlciB9KTtcbiAgICB9O1xuICAgIC8qKiBNYXBzIERzbiBjb21wb25lbnRzIGludG8gdGhpcyBpbnN0YW5jZS4gKi9cbiAgICBEc24ucHJvdG90eXBlLl9mcm9tQ29tcG9uZW50cyA9IGZ1bmN0aW9uIChjb21wb25lbnRzKSB7XG4gICAgICAgIHRoaXMucHJvdG9jb2wgPSBjb21wb25lbnRzLnByb3RvY29sO1xuICAgICAgICB0aGlzLnVzZXIgPSBjb21wb25lbnRzLnVzZXI7XG4gICAgICAgIHRoaXMucGFzcyA9IGNvbXBvbmVudHMucGFzcyB8fCAnJztcbiAgICAgICAgdGhpcy5ob3N0ID0gY29tcG9uZW50cy5ob3N0O1xuICAgICAgICB0aGlzLnBvcnQgPSBjb21wb25lbnRzLnBvcnQgfHwgJyc7XG4gICAgICAgIHRoaXMucGF0aCA9IGNvbXBvbmVudHMucGF0aCB8fCAnJztcbiAgICAgICAgdGhpcy5wcm9qZWN0SWQgPSBjb21wb25lbnRzLnByb2plY3RJZDtcbiAgICB9O1xuICAgIC8qKiBWYWxpZGF0ZXMgdGhpcyBEc24gYW5kIHRocm93cyBvbiBlcnJvci4gKi9cbiAgICBEc24ucHJvdG90eXBlLl92YWxpZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgWydwcm90b2NvbCcsICd1c2VyJywgJ2hvc3QnLCAncHJvamVjdElkJ10uZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzW2NvbXBvbmVudF0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoRVJST1JfTUVTU0FHRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5wcm90b2NvbCAhPT0gJ2h0dHAnICYmIHRoaXMucHJvdG9jb2wgIT09ICdodHRwcycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcihFUlJPUl9NRVNTQUdFKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wb3J0ICYmIGlzTmFOKHBhcnNlSW50KHRoaXMucG9ydCwgMTApKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKEVSUk9SX01FU1NBR0UpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRHNuO1xufSgpKTtcbmV4cG9ydCB7IERzbiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZHNuLmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBzZXRQcm90b3R5cGVPZiB9IGZyb20gJy4vcG9seWZpbGwnO1xuLyoqIEFuIGVycm9yIGVtaXR0ZWQgYnkgU2VudHJ5IFNES3MgYW5kIHJlbGF0ZWQgdXRpbGl0aWVzLiAqL1xudmFyIFNlbnRyeUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliXzEuX19leHRlbmRzKFNlbnRyeUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFNlbnRyeUVycm9yKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIF9uZXdUYXJnZXQgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtZXNzYWdlKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGU6bm8tdW5zYWZlLWFueVxuICAgICAgICBfdGhpcy5uYW1lID0gX25ld1RhcmdldC5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgc2V0UHJvdG90eXBlT2YoX3RoaXMsIF9uZXdUYXJnZXQucHJvdG90eXBlKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gU2VudHJ5RXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBTZW50cnlFcnJvciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3IuanMubWFwIiwiZXhwb3J0ICogZnJvbSAnLi9hc3luYyc7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9yJztcbmV4cG9ydCAqIGZyb20gJy4vaXMnO1xuZXhwb3J0ICogZnJvbSAnLi9sb2dnZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZW1vJztcbmV4cG9ydCAqIGZyb20gJy4vbWlzYyc7XG5leHBvcnQgKiBmcm9tICcuL29iamVjdCc7XG5leHBvcnQgKiBmcm9tICcuL3BhdGgnO1xuZXhwb3J0ICogZnJvbSAnLi9wcm9taXNlYnVmZmVyJztcbmV4cG9ydCAqIGZyb20gJy4vc3RyaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vc3VwcG9ydHMnO1xuZXhwb3J0ICogZnJvbSAnLi9zeW5jcHJvbWlzZSc7XG5leHBvcnQgKiBmcm9tICcuL2luc3RydW1lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9kc24nO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLyogdHNsaW50OmRpc2FibGU6b25seS1hcnJvdy1mdW5jdGlvbnMgbm8tdW5zYWZlLWFueSAqL1xuaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGlzSW5zdGFuY2VPZiwgaXNTdHJpbmcgfSBmcm9tICcuL2lzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IGdldEZ1bmN0aW9uTmFtZSwgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSAnLi9taXNjJztcbmltcG9ydCB7IGZpbGwgfSBmcm9tICcuL29iamVjdCc7XG5pbXBvcnQgeyBzdXBwb3J0c0hpc3RvcnksIHN1cHBvcnRzTmF0aXZlRmV0Y2ggfSBmcm9tICcuL3N1cHBvcnRzJztcbnZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbi8qKlxuICogSW5zdHJ1bWVudCBuYXRpdmUgQVBJcyB0byBjYWxsIGhhbmRsZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGJyZWFkY3J1bWJzLCBBUE0gc3BhbnMgZXRjLlxuICogIC0gQ29uc29sZSBBUElcbiAqICAtIEZldGNoIEFQSVxuICogIC0gWEhSIEFQSVxuICogIC0gSGlzdG9yeSBBUElcbiAqICAtIERPTSBBUEkgKGNsaWNrL3R5cGluZylcbiAqICAtIEVycm9yIEFQSVxuICogIC0gVW5oYW5kbGVkUmVqZWN0aW9uIEFQSVxuICovXG52YXIgaGFuZGxlcnMgPSB7fTtcbnZhciBpbnN0cnVtZW50ZWQgPSB7fTtcbi8qKiBJbnN0cnVtZW50cyBnaXZlbiBBUEkgKi9cbmZ1bmN0aW9uIGluc3RydW1lbnQodHlwZSkge1xuICAgIGlmIChpbnN0cnVtZW50ZWRbdHlwZV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbnN0cnVtZW50ZWRbdHlwZV0gPSB0cnVlO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdjb25zb2xlJzpcbiAgICAgICAgICAgIGluc3RydW1lbnRDb25zb2xlKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZG9tJzpcbiAgICAgICAgICAgIGluc3RydW1lbnRET00oKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd4aHInOlxuICAgICAgICAgICAgaW5zdHJ1bWVudFhIUigpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2ZldGNoJzpcbiAgICAgICAgICAgIGluc3RydW1lbnRGZXRjaCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2hpc3RvcnknOlxuICAgICAgICAgICAgaW5zdHJ1bWVudEhpc3RvcnkoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICBpbnN0cnVtZW50RXJyb3IoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd1bmhhbmRsZWRyZWplY3Rpb24nOlxuICAgICAgICAgICAgaW5zdHJ1bWVudFVuaGFuZGxlZFJlamVjdGlvbigpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBsb2dnZXIud2FybigndW5rbm93biBpbnN0cnVtZW50YXRpb24gdHlwZTonLCB0eXBlKTtcbiAgICB9XG59XG4vKipcbiAqIEFkZCBoYW5kbGVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBnaXZlbiB0eXBlIG9mIGluc3RydW1lbnRhdGlvbiB0cmlnZ2Vycy5cbiAqIFVzZSBhdCB5b3VyIG93biByaXNrLCB0aGlzIG1pZ2h0IGJyZWFrIHdpdGhvdXQgY2hhbmdlbG9nIG5vdGljZSwgb25seSB1c2VkIGludGVybmFsbHkuXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyKGhhbmRsZXIpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuICAgIGlmICghaGFuZGxlciB8fCB0eXBlb2YgaGFuZGxlci50eXBlICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgaGFuZGxlci5jYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGhhbmRsZXJzW2hhbmRsZXIudHlwZV0gPSBoYW5kbGVyc1toYW5kbGVyLnR5cGVdIHx8IFtdO1xuICAgIGhhbmRsZXJzW2hhbmRsZXIudHlwZV0ucHVzaChoYW5kbGVyLmNhbGxiYWNrKTtcbiAgICBpbnN0cnVtZW50KGhhbmRsZXIudHlwZSk7XG59XG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIHRyaWdnZXJIYW5kbGVycyh0eXBlLCBkYXRhKSB7XG4gICAgdmFyIGVfMSwgX2E7XG4gICAgaWYgKCF0eXBlIHx8ICFoYW5kbGVyc1t0eXBlXSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIF9iID0gdHNsaWJfMS5fX3ZhbHVlcyhoYW5kbGVyc1t0eXBlXSB8fCBbXSksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGVyID0gX2MudmFsdWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIHdoaWxlIHRyaWdnZXJpbmcgaW5zdHJ1bWVudGF0aW9uIGhhbmRsZXIuXFxuVHlwZTogXCIgKyB0eXBlICsgXCJcXG5OYW1lOiBcIiArIGdldEZ1bmN0aW9uTmFtZShoYW5kbGVyKSArIFwiXFxuRXJyb3I6IFwiICsgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgfVxufVxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBpbnN0cnVtZW50Q29uc29sZSgpIHtcbiAgICBpZiAoISgnY29uc29sZScgaW4gZ2xvYmFsKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIFsnZGVidWcnLCAnaW5mbycsICd3YXJuJywgJ2Vycm9yJywgJ2xvZycsICdhc3NlcnQnXS5mb3JFYWNoKGZ1bmN0aW9uIChsZXZlbCkge1xuICAgICAgICBpZiAoIShsZXZlbCBpbiBnbG9iYWwuY29uc29sZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmaWxsKGdsb2JhbC5jb25zb2xlLCBsZXZlbCwgZnVuY3Rpb24gKG9yaWdpbmFsQ29uc29sZUxldmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ2NvbnNvbGUnLCB7IGFyZ3M6IGFyZ3MsIGxldmVsOiBsZXZlbCB9KTtcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGZhaWxzIGZvciBzb21lIGJyb3dzZXJzLiA6KFxuICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbENvbnNvbGVMZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChvcmlnaW5hbENvbnNvbGVMZXZlbCwgZ2xvYmFsLmNvbnNvbGUsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBpbnN0cnVtZW50RmV0Y2goKSB7XG4gICAgaWYgKCFzdXBwb3J0c05hdGl2ZUZldGNoKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmaWxsKGdsb2JhbCwgJ2ZldGNoJywgZnVuY3Rpb24gKG9yaWdpbmFsRmV0Y2gpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjb21tb25IYW5kbGVyRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBhcmdzOiBhcmdzLFxuICAgICAgICAgICAgICAgIGZldGNoRGF0YToge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IGdldEZldGNoTWV0aG9kKGFyZ3MpLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGdldEZldGNoVXJsKGFyZ3MpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3RhcnRUaW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJpZ2dlckhhbmRsZXJzKCdmZXRjaCcsIHRzbGliXzEuX19hc3NpZ24oe30sIGNvbW1vbkhhbmRsZXJEYXRhKSk7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGZXRjaC5hcHBseShnbG9iYWwsIGFyZ3MpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlckhhbmRsZXJzKCdmZXRjaCcsIHRzbGliXzEuX19hc3NpZ24oe30sIGNvbW1vbkhhbmRsZXJEYXRhLCB7IGVuZFRpbWVzdGFtcDogRGF0ZS5ub3coKSwgcmVzcG9uc2U6IHJlc3BvbnNlIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ2ZldGNoJywgdHNsaWJfMS5fX2Fzc2lnbih7fSwgY29tbW9uSGFuZGxlckRhdGEsIHsgZW5kVGltZXN0YW1wOiBEYXRlLm5vdygpLCBlcnJvcjogZXJyb3IgfSkpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfSk7XG59XG4vKiogRXh0cmFjdCBgbWV0aG9kYCBmcm9tIGZldGNoIGNhbGwgYXJndW1lbnRzICovXG5mdW5jdGlvbiBnZXRGZXRjaE1ldGhvZChmZXRjaEFyZ3MpIHtcbiAgICBpZiAoZmV0Y2hBcmdzID09PSB2b2lkIDApIHsgZmV0Y2hBcmdzID0gW107IH1cbiAgICBpZiAoJ1JlcXVlc3QnIGluIGdsb2JhbCAmJiBpc0luc3RhbmNlT2YoZmV0Y2hBcmdzWzBdLCBSZXF1ZXN0KSAmJiBmZXRjaEFyZ3NbMF0ubWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoZmV0Y2hBcmdzWzBdLm1ldGhvZCkudG9VcHBlckNhc2UoKTtcbiAgICB9XG4gICAgaWYgKGZldGNoQXJnc1sxXSAmJiBmZXRjaEFyZ3NbMV0ubWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoZmV0Y2hBcmdzWzFdLm1ldGhvZCkudG9VcHBlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuICdHRVQnO1xufVxuLyoqIEV4dHJhY3QgYHVybGAgZnJvbSBmZXRjaCBjYWxsIGFyZ3VtZW50cyAqL1xuZnVuY3Rpb24gZ2V0RmV0Y2hVcmwoZmV0Y2hBcmdzKSB7XG4gICAgaWYgKGZldGNoQXJncyA9PT0gdm9pZCAwKSB7IGZldGNoQXJncyA9IFtdOyB9XG4gICAgaWYgKHR5cGVvZiBmZXRjaEFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBmZXRjaEFyZ3NbMF07XG4gICAgfVxuICAgIGlmICgnUmVxdWVzdCcgaW4gZ2xvYmFsICYmIGlzSW5zdGFuY2VPZihmZXRjaEFyZ3NbMF0sIFJlcXVlc3QpKSB7XG4gICAgICAgIHJldHVybiBmZXRjaEFyZ3NbMF0udXJsO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKGZldGNoQXJnc1swXSk7XG59XG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIGluc3RydW1lbnRYSFIoKSB7XG4gICAgaWYgKCEoJ1hNTEh0dHBSZXF1ZXN0JyBpbiBnbG9iYWwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHhocnByb3RvID0gWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlO1xuICAgIGZpbGwoeGhycHJvdG8sICdvcGVuJywgZnVuY3Rpb24gKG9yaWdpbmFsT3Blbikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHVybCA9IGFyZ3NbMV07XG4gICAgICAgICAgICB0aGlzLl9fc2VudHJ5X3hocl9fID0ge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogaXNTdHJpbmcoYXJnc1swXSkgPyBhcmdzWzBdLnRvVXBwZXJDYXNlKCkgOiBhcmdzWzBdLFxuICAgICAgICAgICAgICAgIHVybDogYXJnc1sxXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBpZiBTZW50cnkga2V5IGFwcGVhcnMgaW4gVVJMLCBkb24ndCBjYXB0dXJlIGl0IGFzIGEgcmVxdWVzdFxuICAgICAgICAgICAgaWYgKGlzU3RyaW5nKHVybCkgJiYgdGhpcy5fX3NlbnRyeV94aHJfXy5tZXRob2QgPT09ICdQT1NUJyAmJiB1cmwubWF0Y2goL3NlbnRyeV9rZXkvKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX19zZW50cnlfb3duX3JlcXVlc3RfXyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxPcGVuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgIH0pO1xuICAgIGZpbGwoeGhycHJvdG8sICdzZW5kJywgZnVuY3Rpb24gKG9yaWdpbmFsU2VuZCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHhociA9IHRoaXM7IC8vIHRzbGludDpkaXNhYmxlLWxpbmU6bm8tdGhpcy1hc3NpZ25tZW50XG4gICAgICAgICAgICB2YXIgY29tbW9uSGFuZGxlckRhdGEgPSB7XG4gICAgICAgICAgICAgICAgYXJnczogYXJncyxcbiAgICAgICAgICAgICAgICBzdGFydFRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICB4aHI6IHhocixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ3hocicsIHRzbGliXzEuX19hc3NpZ24oe30sIGNvbW1vbkhhbmRsZXJEYXRhKSk7XG4gICAgICAgICAgICB4aHIuYWRkRXZlbnRMaXN0ZW5lcigncmVhZHlzdGF0ZWNoYW5nZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvdWNoaW5nIHN0YXR1c0NvZGUgaW4gc29tZSBwbGF0Zm9ybXMgdGhyb3dzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBleGNlcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4aHIuX19zZW50cnlfeGhyX18pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuX19zZW50cnlfeGhyX18uc3RhdHVzX2NvZGUgPSB4aHIuc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBub3RoaW5nICovXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckhhbmRsZXJzKCd4aHInLCB0c2xpYl8xLl9fYXNzaWduKHt9LCBjb21tb25IYW5kbGVyRGF0YSwgeyBlbmRUaW1lc3RhbXA6IERhdGUubm93KCkgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsU2VuZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbnZhciBsYXN0SHJlZjtcbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudEhpc3RvcnkoKSB7XG4gICAgaWYgKCFzdXBwb3J0c0hpc3RvcnkoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBvbGRPblBvcFN0YXRlID0gZ2xvYmFsLm9ucG9wc3RhdGU7XG4gICAgZ2xvYmFsLm9ucG9wc3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRvID0gZ2xvYmFsLmxvY2F0aW9uLmhyZWY7XG4gICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgVVJMIHN0YXRlLCBhcyB3ZSBhbHdheXMgcmVjZWl2ZSBvbmx5IHRoZSB1cGRhdGVkIHN0YXRlXG4gICAgICAgIHZhciBmcm9tID0gbGFzdEhyZWY7XG4gICAgICAgIGxhc3RIcmVmID0gdG87XG4gICAgICAgIHRyaWdnZXJIYW5kbGVycygnaGlzdG9yeScsIHtcbiAgICAgICAgICAgIGZyb206IGZyb20sXG4gICAgICAgICAgICB0bzogdG8sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob2xkT25Qb3BTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9sZE9uUG9wU3RhdGUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZnVuY3Rpb24gaGlzdG9yeVJlcGxhY2VtZW50RnVuY3Rpb24ob3JpZ2luYWxIaXN0b3J5RnVuY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB1cmwgPSBhcmdzLmxlbmd0aCA+IDIgPyBhcmdzWzJdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgICAgIC8vIGNvZXJjZSB0byBzdHJpbmcgKHRoaXMgaXMgd2hhdCBwdXNoU3RhdGUgZG9lcylcbiAgICAgICAgICAgICAgICB2YXIgZnJvbSA9IGxhc3RIcmVmO1xuICAgICAgICAgICAgICAgIHZhciB0byA9IFN0cmluZyh1cmwpO1xuICAgICAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgVVJMIHN0YXRlLCBhcyB3ZSBhbHdheXMgcmVjZWl2ZSBvbmx5IHRoZSB1cGRhdGVkIHN0YXRlXG4gICAgICAgICAgICAgICAgbGFzdEhyZWYgPSB0bztcbiAgICAgICAgICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ2hpc3RvcnknLCB7XG4gICAgICAgICAgICAgICAgICAgIGZyb206IGZyb20sXG4gICAgICAgICAgICAgICAgICAgIHRvOiB0byxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEhpc3RvcnlGdW5jdGlvbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZmlsbChnbG9iYWwuaGlzdG9yeSwgJ3B1c2hTdGF0ZScsIGhpc3RvcnlSZXBsYWNlbWVudEZ1bmN0aW9uKTtcbiAgICBmaWxsKGdsb2JhbC5oaXN0b3J5LCAncmVwbGFjZVN0YXRlJywgaGlzdG9yeVJlcGxhY2VtZW50RnVuY3Rpb24pO1xufVxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBpbnN0cnVtZW50RE9NKCkge1xuICAgIGlmICghKCdkb2N1bWVudCcgaW4gZ2xvYmFsKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENhcHR1cmUgYnJlYWRjcnVtYnMgZnJvbSBhbnkgY2xpY2sgdGhhdCBpcyB1bmhhbmRsZWQgLyBidWJibGVkIHVwIGFsbCB0aGUgd2F5XG4gICAgLy8gdG8gdGhlIGRvY3VtZW50LiBEbyB0aGlzIGJlZm9yZSB3ZSBpbnN0cnVtZW50IGFkZEV2ZW50TGlzdGVuZXIuXG4gICAgZ2xvYmFsLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZG9tRXZlbnRIYW5kbGVyKCdjbGljaycsIHRyaWdnZXJIYW5kbGVycy5iaW5kKG51bGwsICdkb20nKSksIGZhbHNlKTtcbiAgICBnbG9iYWwuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCBrZXlwcmVzc0V2ZW50SGFuZGxlcih0cmlnZ2VySGFuZGxlcnMuYmluZChudWxsLCAnZG9tJykpLCBmYWxzZSk7XG4gICAgLy8gQWZ0ZXIgaG9va2luZyBpbnRvIGRvY3VtZW50IGJ1YmJsZWQgdXAgY2xpY2sgYW5kIGtleXByZXNzZXMgZXZlbnRzLCB3ZSBhbHNvIGhvb2sgaW50byB1c2VyIGhhbmRsZWQgY2xpY2sgJiBrZXlwcmVzc2VzLlxuICAgIFsnRXZlbnRUYXJnZXQnLCAnTm9kZSddLmZvckVhY2goZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICB2YXIgcHJvdG8gPSBnbG9iYWxbdGFyZ2V0XSAmJiBnbG9iYWxbdGFyZ2V0XS5wcm90b3R5cGU7XG4gICAgICAgIGlmICghcHJvdG8gfHwgIXByb3RvLmhhc093blByb3BlcnR5IHx8ICFwcm90by5oYXNPd25Qcm9wZXJ0eSgnYWRkRXZlbnRMaXN0ZW5lcicpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZmlsbChwcm90bywgJ2FkZEV2ZW50TGlzdGVuZXInLCBmdW5jdGlvbiAob3JpZ2luYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnROYW1lLCBmbiwgb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmIChmbiAmJiBmbi5oYW5kbGVFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnROYW1lID09PSAnY2xpY2snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsKGZuLCAnaGFuZGxlRXZlbnQnLCBmdW5jdGlvbiAoaW5uZXJPcmlnaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tRXZlbnRIYW5kbGVyKCdjbGljaycsIHRyaWdnZXJIYW5kbGVycy5iaW5kKG51bGwsICdkb20nKSkoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5uZXJPcmlnaW5hbC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbChmbiwgJ2hhbmRsZUV2ZW50JywgZnVuY3Rpb24gKGlubmVyT3JpZ2luYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXByZXNzRXZlbnRIYW5kbGVyKHRyaWdnZXJIYW5kbGVycy5iaW5kKG51bGwsICdkb20nKSkoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5uZXJPcmlnaW5hbC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudE5hbWUgPT09ICdjbGljaycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbUV2ZW50SGFuZGxlcignY2xpY2snLCB0cmlnZ2VySGFuZGxlcnMuYmluZChudWxsLCAnZG9tJyksIHRydWUpKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudE5hbWUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXByZXNzRXZlbnRIYW5kbGVyKHRyaWdnZXJIYW5kbGVycy5iaW5kKG51bGwsICdkb20nKSkodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmNhbGwodGhpcywgZXZlbnROYW1lLCBmbiwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgZmlsbChwcm90bywgJ3JlbW92ZUV2ZW50TGlzdGVuZXInLCBmdW5jdGlvbiAob3JpZ2luYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnROYW1lLCBmbiwgb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGZuO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgJiYgKGNhbGxiYWNrLl9fc2VudHJ5X3dyYXBwZWRfXyB8fCBjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgYWNjZXNzaW5nIF9fc2VudHJ5X3dyYXBwZWRfXyB3aWxsIHRocm93IGluIHNvbWUgU2VsZW5pdW0gZW52aXJvbm1lbnRzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5jYWxsKHRoaXMsIGV2ZW50TmFtZSwgY2FsbGJhY2ssIG9wdGlvbnMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG52YXIgZGVib3VuY2VEdXJhdGlvbiA9IDEwMDA7XG52YXIgZGVib3VuY2VUaW1lciA9IDA7XG52YXIga2V5cHJlc3NUaW1lb3V0O1xudmFyIGxhc3RDYXB0dXJlZEV2ZW50O1xuLyoqXG4gKiBXcmFwcyBhZGRFdmVudExpc3RlbmVyIHRvIGNhcHR1cmUgVUkgYnJlYWRjcnVtYnNcbiAqIEBwYXJhbSBuYW1lIHRoZSBldmVudCBuYW1lIChlLmcuIFwiY2xpY2tcIilcbiAqIEBwYXJhbSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWRcbiAqIEBwYXJhbSBkZWJvdW5jZSBkZWNpZGVzIHdoZXRoZXIgaXQgc2hvdWxkIHdhaXQgdGlsbCBhbm90aGVyIGV2ZW50IGxvb3BcbiAqIEByZXR1cm5zIHdyYXBwZWQgYnJlYWRjcnVtYiBldmVudHMgaGFuZGxlclxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBkb21FdmVudEhhbmRsZXIobmFtZSwgaGFuZGxlciwgZGVib3VuY2UpIHtcbiAgICBpZiAoZGVib3VuY2UgPT09IHZvaWQgMCkgeyBkZWJvdW5jZSA9IGZhbHNlOyB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAvLyByZXNldCBrZXlwcmVzcyB0aW1lb3V0OyBlLmcuIHRyaWdnZXJpbmcgYSAnY2xpY2snIGFmdGVyXG4gICAgICAgIC8vIGEgJ2tleXByZXNzJyB3aWxsIHJlc2V0IHRoZSBrZXlwcmVzcyBkZWJvdW5jZSBzbyB0aGF0IGEgbmV3XG4gICAgICAgIC8vIHNldCBvZiBrZXlwcmVzc2VzIGNhbiBiZSByZWNvcmRlZFxuICAgICAgICBrZXlwcmVzc1RpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhpcyBoYW5kbGVyIG1pZ2h0IHRyaWdnZXIgbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGV2ZW50IChlLmcuIGV2ZW50IHByb3BhZ2F0aW9uIHRocm91Z2ggbm9kZSBhbmNlc3RvcnMpLiBJZ25vcmUgaWYgd2UndmVcbiAgICAgICAgLy8gYWxyZWFkeSBjYXB0dXJlZCB0aGUgZXZlbnQuXG4gICAgICAgIGlmICghZXZlbnQgfHwgbGFzdENhcHR1cmVkRXZlbnQgPT09IGV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGFzdENhcHR1cmVkRXZlbnQgPSBldmVudDtcbiAgICAgICAgaWYgKGRlYm91bmNlVGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWJvdW5jZVRpbWVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVib3VuY2UpIHtcbiAgICAgICAgICAgIGRlYm91bmNlVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKHsgZXZlbnQ6IGV2ZW50LCBuYW1lOiBuYW1lIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVyKHsgZXZlbnQ6IGV2ZW50LCBuYW1lOiBuYW1lIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuICogV3JhcHMgYWRkRXZlbnRMaXN0ZW5lciB0byBjYXB0dXJlIGtleXByZXNzIFVJIGV2ZW50c1xuICogQHBhcmFtIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHRyaWdnZXJlZFxuICogQHJldHVybnMgd3JhcHBlZCBrZXlwcmVzcyBldmVudHMgaGFuZGxlclxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBrZXlwcmVzc0V2ZW50SGFuZGxlcihoYW5kbGVyKSB7XG4gICAgLy8gVE9ETzogaWYgc29tZWhvdyB1c2VyIHN3aXRjaGVzIGtleXByZXNzIHRhcmdldCBiZWZvcmVcbiAgICAvLyAgICAgICBkZWJvdW5jZSB0aW1lb3V0IGlzIHRyaWdnZXJlZCwgd2Ugd2lsbCBvbmx5IGNhcHR1cmVcbiAgICAvLyAgICAgICBhIHNpbmdsZSBicmVhZGNydW1iIGZyb20gdGhlIEZJUlNUIHRhcmdldCAoYWNjZXB0YWJsZT8pXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgdGFyZ2V0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBqdXN0IGFjY2Vzc2luZyBldmVudCBwcm9wZXJ0aWVzIGNhbiB0aHJvdyBhbiBleGNlcHRpb24gaW4gc29tZSByYXJlIGNpcmN1bXN0YW5jZXNcbiAgICAgICAgICAgIC8vIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9yYXZlbi1qcy9pc3N1ZXMvODM4XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRhZ05hbWUgPSB0YXJnZXQgJiYgdGFyZ2V0LnRhZ05hbWU7XG4gICAgICAgIC8vIG9ubHkgY29uc2lkZXIga2V5cHJlc3MgZXZlbnRzIG9uIGFjdHVhbCBpbnB1dCBlbGVtZW50c1xuICAgICAgICAvLyB0aGlzIHdpbGwgZGlzcmVnYXJkIGtleXByZXNzZXMgdGFyZ2V0aW5nIGJvZHkgKGUuZy4gdGFiYmluZ1xuICAgICAgICAvLyB0aHJvdWdoIGVsZW1lbnRzLCBob3RrZXlzLCBldGMpXG4gICAgICAgIGlmICghdGFnTmFtZSB8fCAodGFnTmFtZSAhPT0gJ0lOUFVUJyAmJiB0YWdOYW1lICE9PSAnVEVYVEFSRUEnICYmICF0YXJnZXQuaXNDb250ZW50RWRpdGFibGUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVjb3JkIGZpcnN0IGtleXByZXNzIGluIGEgc2VyaWVzLCBidXQgaWdub3JlIHN1YnNlcXVlbnRcbiAgICAgICAgLy8ga2V5cHJlc3NlcyB1bnRpbCBkZWJvdW5jZSBjbGVhcnNcbiAgICAgICAgaWYgKCFrZXlwcmVzc1RpbWVvdXQpIHtcbiAgICAgICAgICAgIGRvbUV2ZW50SGFuZGxlcignaW5wdXQnLCBoYW5kbGVyKShldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY2xlYXJUaW1lb3V0KGtleXByZXNzVGltZW91dCk7XG4gICAgICAgIGtleXByZXNzVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAga2V5cHJlc3NUaW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9LCBkZWJvdW5jZUR1cmF0aW9uKTtcbiAgICB9O1xufVxudmFyIF9vbGRPbkVycm9ySGFuZGxlciA9IG51bGw7XG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIGluc3RydW1lbnRFcnJvcigpIHtcbiAgICBfb2xkT25FcnJvckhhbmRsZXIgPSBnbG9iYWwub25lcnJvcjtcbiAgICBnbG9iYWwub25lcnJvciA9IGZ1bmN0aW9uIChtc2csIHVybCwgbGluZSwgY29sdW1uLCBlcnJvcikge1xuICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ2Vycm9yJywge1xuICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICBsaW5lOiBsaW5lLFxuICAgICAgICAgICAgbXNnOiBtc2csXG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChfb2xkT25FcnJvckhhbmRsZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBfb2xkT25FcnJvckhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbn1cbnZhciBfb2xkT25VbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyID0gbnVsbDtcbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudFVuaGFuZGxlZFJlamVjdGlvbigpIHtcbiAgICBfb2xkT25VbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyID0gZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uO1xuICAgIGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbiA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRyaWdnZXJIYW5kbGVycygndW5oYW5kbGVkcmVqZWN0aW9uJywgZSk7XG4gICAgICAgIGlmIChfb2xkT25VbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gX29sZE9uVW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnN0cnVtZW50LmpzLm1hcCIsIi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIG9uZSBvZiBhIGZldyBFcnJvciBvciBFcnJvci1saWtlXG4gKiB7QGxpbmsgaXNFcnJvcn0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Vycm9yKHdhdCkge1xuICAgIHN3aXRjaCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdhdCkpIHtcbiAgICAgICAgY2FzZSAnW29iamVjdCBFcnJvcl0nOlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ1tvYmplY3QgRXhjZXB0aW9uXSc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnW29iamVjdCBET01FeGNlcHRpb25dJzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGlzSW5zdGFuY2VPZih3YXQsIEVycm9yKTtcbiAgICB9XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBFcnJvckV2ZW50XG4gKiB7QGxpbmsgaXNFcnJvckV2ZW50fS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3JFdmVudCh3YXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdhdCkgPT09ICdbb2JqZWN0IEVycm9yRXZlbnRdJztcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIERPTUVycm9yXG4gKiB7QGxpbmsgaXNET01FcnJvcn0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RPTUVycm9yKHdhdCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSA9PT0gJ1tvYmplY3QgRE9NRXJyb3JdJztcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIERPTUV4Y2VwdGlvblxuICoge0BsaW5rIGlzRE9NRXhjZXB0aW9ufS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRE9NRXhjZXB0aW9uKHdhdCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSA9PT0gJ1tvYmplY3QgRE9NRXhjZXB0aW9uXSc7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBhIHN0cmluZ1xuICoge0BsaW5rIGlzU3RyaW5nfS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHdhdCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgaXMgYSBwcmltaXRpdmUgKHVuZGVmaW5lZCwgbnVsbCwgbnVtYmVyLCBib29sZWFuLCBzdHJpbmcpXG4gKiB7QGxpbmsgaXNQcmltaXRpdmV9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQcmltaXRpdmUod2F0KSB7XG4gICAgcmV0dXJuIHdhdCA9PT0gbnVsbCB8fCAodHlwZW9mIHdhdCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHdhdCAhPT0gJ2Z1bmN0aW9uJyk7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBhbiBvYmplY3QgbGl0ZXJhbFxuICoge0BsaW5rIGlzUGxhaW5PYmplY3R9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh3YXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdhdCkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgYW4gRXZlbnQgaW5zdGFuY2VcbiAqIHtAbGluayBpc0V2ZW50fS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXZlbnQod2F0KSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICByZXR1cm4gdHlwZW9mIEV2ZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpc0luc3RhbmNlT2Yod2F0LCBFdmVudCk7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBhbiBFbGVtZW50IGluc3RhbmNlXG4gKiB7QGxpbmsgaXNFbGVtZW50fS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRWxlbWVudCh3YXQpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuICAgIHJldHVybiB0eXBlb2YgRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNJbnN0YW5jZU9mKHdhdCwgRWxlbWVudCk7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBhbiByZWdleHBcbiAqIHtAbGluayBpc1JlZ0V4cH0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlZ0V4cCh3YXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdhdCkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSBoYXMgYSB0aGVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RoZW5hYmxlKHdhdCkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLXVuc2FmZS1hbnlcbiAgICByZXR1cm4gQm9vbGVhbih3YXQgJiYgd2F0LnRoZW4gJiYgdHlwZW9mIHdhdC50aGVuID09PSAnZnVuY3Rpb24nKTtcbiAgICAvLyB0c2xpbnQ6ZW5hYmxlOm5vLXVuc2FmZS1hbnlcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIGEgU3ludGhldGljRXZlbnRcbiAqIHtAbGluayBpc1N5bnRoZXRpY0V2ZW50fS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3ludGhldGljRXZlbnQod2F0KSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVuc2FmZS1hbnlcbiAgICByZXR1cm4gaXNQbGFpbk9iamVjdCh3YXQpICYmICduYXRpdmVFdmVudCcgaW4gd2F0ICYmICdwcmV2ZW50RGVmYXVsdCcgaW4gd2F0ICYmICdzdG9wUHJvcGFnYXRpb24nIGluIHdhdDtcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIGFuIGluc3RhbmNlIG9mIHByb3ZpZGVkIGNvbnN0cnVjdG9yLlxuICoge0BsaW5rIGlzSW5zdGFuY2VPZn0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcGFyYW0gYmFzZSBBIGNvbnN0cnVjdG9yIHRvIGJlIHVzZWQgaW4gYSBjaGVjay5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5zdGFuY2VPZih3YXQsIGJhc2UpIHtcbiAgICB0cnkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5zYWZlLWFueVxuICAgICAgICByZXR1cm4gd2F0IGluc3RhbmNlb2YgYmFzZTtcbiAgICB9XG4gICAgY2F0Y2ggKF9lKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcy5qcy5tYXAiLCJpbXBvcnQgeyBjb25zb2xlU2FuZGJveCwgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSAnLi9taXNjJztcbi8vIFRPRE86IEltcGxlbWVudCBkaWZmZXJlbnQgbG9nZ2VycyBmb3IgZGlmZmVyZW50IGVudmlyb25tZW50c1xudmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuLyoqIFByZWZpeCBmb3IgbG9nZ2luZyBzdHJpbmdzICovXG52YXIgUFJFRklYID0gJ1NlbnRyeSBMb2dnZXIgJztcbi8qKiBKU0RvYyAqL1xudmFyIExvZ2dlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBmdW5jdGlvbiBMb2dnZXIoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqIEpTRG9jICovXG4gICAgTG9nZ2VyLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBMb2dnZXIucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBMb2dnZXIucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlU2FuZGJveChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBnbG9iYWwuY29uc29sZS5sb2coUFJFRklYICsgXCJbTG9nXTogXCIgKyBhcmdzLmpvaW4oJyAnKSk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmU6bm8tY29uc29sZVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIExvZ2dlci5wcm90b3R5cGUud2FybiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlU2FuZGJveChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBnbG9iYWwuY29uc29sZS53YXJuKFBSRUZJWCArIFwiW1dhcm5dOiBcIiArIGFyZ3Muam9pbignICcpKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1jb25zb2xlXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgTG9nZ2VyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlU2FuZGJveChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBnbG9iYWwuY29uc29sZS5lcnJvcihQUkVGSVggKyBcIltFcnJvcl06IFwiICsgYXJncy5qb2luKCcgJykpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLWNvbnNvbGVcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gTG9nZ2VyO1xufSgpKTtcbi8vIEVuc3VyZSB3ZSBvbmx5IGhhdmUgYSBzaW5nbGUgbG9nZ2VyIGluc3RhbmNlLCBldmVuIGlmIG11bHRpcGxlIHZlcnNpb25zIG9mIEBzZW50cnkvdXRpbHMgYXJlIGJlaW5nIHVzZWRcbmdsb2JhbC5fX1NFTlRSWV9fID0gZ2xvYmFsLl9fU0VOVFJZX18gfHwge307XG52YXIgbG9nZ2VyID0gZ2xvYmFsLl9fU0VOVFJZX18ubG9nZ2VyIHx8IChnbG9iYWwuX19TRU5UUllfXy5sb2dnZXIgPSBuZXcgTG9nZ2VyKCkpO1xuZXhwb3J0IHsgbG9nZ2VyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dnZXIuanMubWFwIiwiLy8gdHNsaW50OmRpc2FibGU6bm8tdW5zYWZlLWFueVxuLyoqXG4gKiBNZW1vIGNsYXNzIHVzZWQgZm9yIGRlY3ljbGUganNvbiBvYmplY3RzLiBVc2VzIFdlYWtTZXQgaWYgYXZhaWxhYmxlIG90aGVyd2lzZSBhcnJheS5cbiAqL1xudmFyIE1lbW8gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTWVtbygpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIHRoaXMuX2hhc1dlYWtTZXQgPSB0eXBlb2YgV2Vha1NldCA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgdGhpcy5faW5uZXIgPSB0aGlzLl9oYXNXZWFrU2V0ID8gbmV3IFdlYWtTZXQoKSA6IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIG9iaiB0byByZW1lbWJlci5cbiAgICAgKiBAcGFyYW0gb2JqIE9iamVjdCB0byByZW1lbWJlclxuICAgICAqL1xuICAgIE1lbW8ucHJvdG90eXBlLm1lbW9pemUgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIGlmICh0aGlzLl9oYXNXZWFrU2V0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faW5uZXIuaGFzKG9iaikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2lubmVyLmFkZChvYmopO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpwcmVmZXItZm9yLW9mXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5faW5uZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX2lubmVyW2ldO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBvYmopIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pbm5lci5wdXNoKG9iaik7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgb2JqZWN0IGZyb20gaW50ZXJuYWwgc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gb2JqIE9iamVjdCB0byBmb3JnZXRcbiAgICAgKi9cbiAgICBNZW1vLnByb3RvdHlwZS51bm1lbW9pemUgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIGlmICh0aGlzLl9oYXNXZWFrU2V0KSB7XG4gICAgICAgICAgICB0aGlzLl9pbm5lci5kZWxldGUob2JqKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5faW5uZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5uZXJbaV0gPT09IG9iaikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbm5lci5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE1lbW87XG59KCkpO1xuZXhwb3J0IHsgTWVtbyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtby5qcy5tYXAiLCJpbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJy4vaXMnO1xuaW1wb3J0IHsgc25pcExpbmUgfSBmcm9tICcuL3N0cmluZyc7XG4vKipcbiAqIFJlcXVpcmVzIGEgbW9kdWxlIHdoaWNoIGlzIHByb3RlY3RlZCBhZ2FpbnN0IGJ1bmRsZXIgbWluaWZpY2F0aW9uLlxuICpcbiAqIEBwYXJhbSByZXF1ZXN0IFRoZSBtb2R1bGUgcGF0aCB0byByZXNvbHZlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkeW5hbWljUmVxdWlyZShtb2QsIHJlcXVlc3QpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVuc2FmZS1hbnlcbiAgICByZXR1cm4gbW9kLnJlcXVpcmUocmVxdWVzdCk7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHdlJ3JlIGluIHRoZSBOb2RlLmpzIG9yIEJyb3dzZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBAcmV0dXJucyBBbnN3ZXIgdG8gZ2l2ZW4gcXVlc3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm9kZUVudigpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgPyBwcm9jZXNzIDogMCkgPT09ICdbb2JqZWN0IHByb2Nlc3NdJztcbn1cbnZhciBmYWxsYmFja0dsb2JhbE9iamVjdCA9IHt9O1xuLyoqXG4gKiBTYWZlbHkgZ2V0IGdsb2JhbCBzY29wZSBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyBHbG9iYWwgc2NvcGUgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxPYmplY3QoKSB7XG4gICAgcmV0dXJuIChpc05vZGVFbnYoKVxuICAgICAgICA/IGdsb2JhbFxuICAgICAgICA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IHdpbmRvd1xuICAgICAgICAgICAgOiB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/IHNlbGZcbiAgICAgICAgICAgICAgICA6IGZhbGxiYWNrR2xvYmFsT2JqZWN0KTtcbn1cbi8qKlxuICogVVVJRDQgZ2VuZXJhdG9yXG4gKlxuICogQHJldHVybnMgc3RyaW5nIEdlbmVyYXRlZCBVVUlENC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV1aWQ0KCkge1xuICAgIHZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgICB2YXIgY3J5cHRvID0gZ2xvYmFsLmNyeXB0byB8fCBnbG9iYWwubXNDcnlwdG87XG4gICAgaWYgKCEoY3J5cHRvID09PSB2b2lkIDApICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgICAgLy8gVXNlIHdpbmRvdy5jcnlwdG8gQVBJIGlmIGF2YWlsYWJsZVxuICAgICAgICB2YXIgYXJyID0gbmV3IFVpbnQxNkFycmF5KDgpO1xuICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycik7XG4gICAgICAgIC8vIHNldCA0IGluIGJ5dGUgN1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuICAgICAgICBhcnJbM10gPSAoYXJyWzNdICYgMHhmZmYpIHwgMHg0MDAwO1xuICAgICAgICAvLyBzZXQgMiBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgYnl0ZSA5IHRvICcxMCdcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgICAgYXJyWzRdID0gKGFycls0XSAmIDB4M2ZmZikgfCAweDgwMDA7XG4gICAgICAgIHZhciBwYWQgPSBmdW5jdGlvbiAobnVtKSB7XG4gICAgICAgICAgICB2YXIgdiA9IG51bS50b1N0cmluZygxNik7XG4gICAgICAgICAgICB3aGlsZSAodi5sZW5ndGggPCA0KSB7XG4gICAgICAgICAgICAgICAgdiA9IFwiMFwiICsgdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gKHBhZChhcnJbMF0pICsgcGFkKGFyclsxXSkgKyBwYWQoYXJyWzJdKSArIHBhZChhcnJbM10pICsgcGFkKGFycls0XSkgKyBwYWQoYXJyWzVdKSArIHBhZChhcnJbNl0pICsgcGFkKGFycls3XSkpO1xuICAgIH1cbiAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwNTAzNC9ob3ctdG8tY3JlYXRlLWEtZ3VpZC11dWlkLWluLWphdmFzY3JpcHQvMjExNzUyMyMyMTE3NTIzXG4gICAgcmV0dXJuICd4eHh4eHh4eHh4eHg0eHh4eXh4eHh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuICAgICAgICB2YXIgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgICAgdmFyIHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4O1xuICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gICAgfSk7XG59XG4vKipcbiAqIFBhcnNlcyBzdHJpbmcgZm9ybSBvZiBVUkwgaW50byBhbiBvYmplY3RcbiAqIC8vIGJvcnJvd2VkIGZyb20gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjYXBwZW5kaXgtQlxuICogLy8gaW50ZW50aW9uYWxseSB1c2luZyByZWdleCBhbmQgbm90IDxhLz4gaHJlZiBwYXJzaW5nIHRyaWNrIGJlY2F1c2UgUmVhY3QgTmF0aXZlIGFuZCBvdGhlclxuICogLy8gZW52aXJvbm1lbnRzIHdoZXJlIERPTSBtaWdodCBub3QgYmUgYXZhaWxhYmxlXG4gKiBAcmV0dXJucyBwYXJzZWQgVVJMIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcmwodXJsKSB7XG4gICAgaWYgKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICB2YXIgbWF0Y2ggPSB1cmwubWF0Y2goL14oKFteOlxcLz8jXSspOik/KFxcL1xcLyhbXlxcLz8jXSopKT8oW14/I10qKShcXD8oW14jXSopKT8oIyguKikpPyQvKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgLy8gY29lcmNlIHRvIHVuZGVmaW5lZCB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5nIHNvIHdlIGRvbid0IGdldCAndW5kZWZpbmVkJ1xuICAgIHZhciBxdWVyeSA9IG1hdGNoWzZdIHx8ICcnO1xuICAgIHZhciBmcmFnbWVudCA9IG1hdGNoWzhdIHx8ICcnO1xuICAgIHJldHVybiB7XG4gICAgICAgIGhvc3Q6IG1hdGNoWzRdLFxuICAgICAgICBwYXRoOiBtYXRjaFs1XSxcbiAgICAgICAgcHJvdG9jb2w6IG1hdGNoWzJdLFxuICAgICAgICByZWxhdGl2ZTogbWF0Y2hbNV0gKyBxdWVyeSArIGZyYWdtZW50LFxuICAgIH07XG59XG4vKipcbiAqIEV4dHJhY3RzIGVpdGhlciBtZXNzYWdlIG9yIHR5cGUrdmFsdWUgZnJvbSBhbiBldmVudCB0aGF0IGNhbiBiZSB1c2VkIGZvciB1c2VyLWZhY2luZyBsb2dzXG4gKiBAcmV0dXJucyBldmVudCdzIGRlc2NyaXB0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFdmVudERlc2NyaXB0aW9uKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50Lm1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIGV2ZW50Lm1lc3NhZ2U7XG4gICAgfVxuICAgIGlmIChldmVudC5leGNlcHRpb24gJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyAmJiBldmVudC5leGNlcHRpb24udmFsdWVzWzBdKSB7XG4gICAgICAgIHZhciBleGNlcHRpb24gPSBldmVudC5leGNlcHRpb24udmFsdWVzWzBdO1xuICAgICAgICBpZiAoZXhjZXB0aW9uLnR5cGUgJiYgZXhjZXB0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uLnR5cGUgKyBcIjogXCIgKyBleGNlcHRpb24udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbi50eXBlIHx8IGV4Y2VwdGlvbi52YWx1ZSB8fCBldmVudC5ldmVudF9pZCB8fCAnPHVua25vd24+JztcbiAgICB9XG4gICAgcmV0dXJuIGV2ZW50LmV2ZW50X2lkIHx8ICc8dW5rbm93bj4nO1xufVxuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gY29uc29sZVNhbmRib3goY2FsbGJhY2spIHtcbiAgICB2YXIgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG4gICAgdmFyIGxldmVscyA9IFsnZGVidWcnLCAnaW5mbycsICd3YXJuJywgJ2Vycm9yJywgJ2xvZycsICdhc3NlcnQnXTtcbiAgICBpZiAoISgnY29uc29sZScgaW4gZ2xvYmFsKSkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gICAgdmFyIG9yaWdpbmFsQ29uc29sZSA9IGdsb2JhbC5jb25zb2xlO1xuICAgIHZhciB3cmFwcGVkTGV2ZWxzID0ge307XG4gICAgLy8gUmVzdG9yZSBhbGwgd3JhcHBlZCBjb25zb2xlIG1ldGhvZHNcbiAgICBsZXZlbHMuZm9yRWFjaChmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICAgICAgaWYgKGxldmVsIGluIGdsb2JhbC5jb25zb2xlICYmIG9yaWdpbmFsQ29uc29sZVtsZXZlbF0uX19zZW50cnlfb3JpZ2luYWxfXykge1xuICAgICAgICAgICAgd3JhcHBlZExldmVsc1tsZXZlbF0gPSBvcmlnaW5hbENvbnNvbGVbbGV2ZWxdO1xuICAgICAgICAgICAgb3JpZ2luYWxDb25zb2xlW2xldmVsXSA9IG9yaWdpbmFsQ29uc29sZVtsZXZlbF0uX19zZW50cnlfb3JpZ2luYWxfXztcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFBlcmZvcm0gY2FsbGJhY2sgbWFuaXB1bGF0aW9uc1xuICAgIHZhciByZXN1bHQgPSBjYWxsYmFjaygpO1xuICAgIC8vIFJldmVydCByZXN0b3JhdGlvbiB0byB3cmFwcGVkIHN0YXRlXG4gICAgT2JqZWN0LmtleXMod3JhcHBlZExldmVscykuZm9yRWFjaChmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICAgICAgb3JpZ2luYWxDb25zb2xlW2xldmVsXSA9IHdyYXBwZWRMZXZlbHNbbGV2ZWxdO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIEFkZHMgZXhjZXB0aW9uIHZhbHVlcywgdHlwZSBhbmQgdmFsdWUgdG8gYW4gc3ludGhldGljIEV4Y2VwdGlvbi5cbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHZhbHVlIFZhbHVlIG9mIHRoZSBleGNlcHRpb24uXG4gKiBAcGFyYW0gdHlwZSBUeXBlIG9mIHRoZSBleGNlcHRpb24uXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRFeGNlcHRpb25UeXBlVmFsdWUoZXZlbnQsIHZhbHVlLCB0eXBlKSB7XG4gICAgZXZlbnQuZXhjZXB0aW9uID0gZXZlbnQuZXhjZXB0aW9uIHx8IHt9O1xuICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgPSBldmVudC5leGNlcHRpb24udmFsdWVzIHx8IFtdO1xuICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0gPSBldmVudC5leGNlcHRpb24udmFsdWVzWzBdIHx8IHt9O1xuICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0udmFsdWUgPSBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnZhbHVlIHx8IHZhbHVlIHx8ICcnO1xuICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0udHlwZSA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0udHlwZSB8fCB0eXBlIHx8ICdFcnJvcic7XG59XG4vKipcbiAqIEFkZHMgZXhjZXB0aW9uIG1lY2hhbmlzbSB0byBhIGdpdmVuIGV2ZW50LlxuICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBtb2RpZnkuXG4gKiBAcGFyYW0gbWVjaGFuaXNtIE1lY2hhbmlzbSBvZiB0aGUgbWVjaGFuaXNtLlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRXhjZXB0aW9uTWVjaGFuaXNtKGV2ZW50LCBtZWNoYW5pc20pIHtcbiAgICBpZiAobWVjaGFuaXNtID09PSB2b2lkIDApIHsgbWVjaGFuaXNtID0ge307IH1cbiAgICAvLyBUT0RPOiBVc2UgcmVhbCB0eXBlIHdpdGggYGtleW9mIE1lY2hhbmlzbWAgdGhpbmd5IGFuZCBtYXliZSBtYWtlIGl0IGJldHRlcj9cbiAgICB0cnkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLm1lY2hhbmlzbSA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0ubWVjaGFuaXNtIHx8IHt9O1xuICAgICAgICBPYmplY3Qua2V5cyhtZWNoYW5pc20pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5tZWNoYW5pc21ba2V5XSA9IG1lY2hhbmlzbVtrZXldO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2F0Y2ggKF9vTykge1xuICAgICAgICAvLyBuby1lbXB0eVxuICAgIH1cbn1cbi8qKlxuICogQSBzYWZlIGZvcm0gb2YgbG9jYXRpb24uaHJlZlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYXRpb25IcmVmKCkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgICBjYXRjaCAob08pIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBjaGlsZCBET00gZWxlbWVudCwgcmV0dXJucyBhIHF1ZXJ5LXNlbGVjdG9yIHN0YXRlbWVudCBkZXNjcmliaW5nIHRoYXRcbiAqIGFuZCBpdHMgYW5jZXN0b3JzXG4gKiBlLmcuIFtIVE1MRWxlbWVudF0gPT4gYm9keSA+IGRpdiA+IGlucHV0I2Zvby5idG5bbmFtZT1iYXpdXG4gKiBAcmV0dXJucyBnZW5lcmF0ZWQgRE9NIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh0bWxUcmVlQXNTdHJpbmcoZWxlbSkge1xuICAgIC8vIHRyeS9jYXRjaCBib3RoOlxuICAgIC8vIC0gYWNjZXNzaW5nIGV2ZW50LnRhcmdldCAoc2VlIGdldHNlbnRyeS9yYXZlbi1qcyM4MzgsICM3NjgpXG4gICAgLy8gLSBgaHRtbFRyZWVBc1N0cmluZ2AgYmVjYXVzZSBpdCdzIGNvbXBsZXgsIGFuZCBqdXN0IGFjY2Vzc2luZyB0aGUgRE9NIGluY29ycmVjdGx5XG4gICAgLy8gLSBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uIGluIHNvbWUgY2lyY3Vtc3RhbmNlcy5cbiAgICB0cnkge1xuICAgICAgICB2YXIgY3VycmVudEVsZW0gPSBlbGVtO1xuICAgICAgICB2YXIgTUFYX1RSQVZFUlNFX0hFSUdIVCA9IDU7XG4gICAgICAgIHZhciBNQVhfT1VUUFVUX0xFTiA9IDgwO1xuICAgICAgICB2YXIgb3V0ID0gW107XG4gICAgICAgIHZhciBoZWlnaHQgPSAwO1xuICAgICAgICB2YXIgbGVuID0gMDtcbiAgICAgICAgdmFyIHNlcGFyYXRvciA9ICcgPiAnO1xuICAgICAgICB2YXIgc2VwTGVuZ3RoID0gc2VwYXJhdG9yLmxlbmd0aDtcbiAgICAgICAgdmFyIG5leHRTdHIgPSB2b2lkIDA7XG4gICAgICAgIHdoaWxlIChjdXJyZW50RWxlbSAmJiBoZWlnaHQrKyA8IE1BWF9UUkFWRVJTRV9IRUlHSFQpIHtcbiAgICAgICAgICAgIG5leHRTdHIgPSBfaHRtbEVsZW1lbnRBc1N0cmluZyhjdXJyZW50RWxlbSk7XG4gICAgICAgICAgICAvLyBiYWlsIG91dCBpZlxuICAgICAgICAgICAgLy8gLSBuZXh0U3RyIGlzIHRoZSAnaHRtbCcgZWxlbWVudFxuICAgICAgICAgICAgLy8gLSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdGhhdCB3b3VsZCBiZSBjcmVhdGVkIGV4Y2VlZHMgTUFYX09VVFBVVF9MRU5cbiAgICAgICAgICAgIC8vICAgKGlnbm9yZSB0aGlzIGxpbWl0IGlmIHdlIGFyZSBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uKVxuICAgICAgICAgICAgaWYgKG5leHRTdHIgPT09ICdodG1sJyB8fCAoaGVpZ2h0ID4gMSAmJiBsZW4gKyBvdXQubGVuZ3RoICogc2VwTGVuZ3RoICsgbmV4dFN0ci5sZW5ndGggPj0gTUFYX09VVFBVVF9MRU4pKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQucHVzaChuZXh0U3RyKTtcbiAgICAgICAgICAgIGxlbiArPSBuZXh0U3RyLmxlbmd0aDtcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtID0gY3VycmVudEVsZW0ucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0LnJldmVyc2UoKS5qb2luKHNlcGFyYXRvcik7XG4gICAgfVxuICAgIGNhdGNoIChfb08pIHtcbiAgICAgICAgcmV0dXJuICc8dW5rbm93bj4nO1xuICAgIH1cbn1cbi8qKlxuICogUmV0dXJucyBhIHNpbXBsZSwgcXVlcnktc2VsZWN0b3IgcmVwcmVzZW50YXRpb24gb2YgYSBET00gZWxlbWVudFxuICogZS5nLiBbSFRNTEVsZW1lbnRdID0+IGlucHV0I2Zvby5idG5bbmFtZT1iYXpdXG4gKiBAcmV0dXJucyBnZW5lcmF0ZWQgRE9NIHBhdGhcbiAqL1xuZnVuY3Rpb24gX2h0bWxFbGVtZW50QXNTdHJpbmcoZWwpIHtcbiAgICB2YXIgZWxlbSA9IGVsO1xuICAgIHZhciBvdXQgPSBbXTtcbiAgICB2YXIgY2xhc3NOYW1lO1xuICAgIHZhciBjbGFzc2VzO1xuICAgIHZhciBrZXk7XG4gICAgdmFyIGF0dHI7XG4gICAgdmFyIGk7XG4gICAgaWYgKCFlbGVtIHx8ICFlbGVtLnRhZ05hbWUpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBvdXQucHVzaChlbGVtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgaWYgKGVsZW0uaWQpIHtcbiAgICAgICAgb3V0LnB1c2goXCIjXCIgKyBlbGVtLmlkKTtcbiAgICB9XG4gICAgY2xhc3NOYW1lID0gZWxlbS5jbGFzc05hbWU7XG4gICAgaWYgKGNsYXNzTmFtZSAmJiBpc1N0cmluZyhjbGFzc05hbWUpKSB7XG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc05hbWUuc3BsaXQoL1xccysvKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG91dC5wdXNoKFwiLlwiICsgY2xhc3Nlc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIGF0dHJXaGl0ZWxpc3QgPSBbJ3R5cGUnLCAnbmFtZScsICd0aXRsZScsICdhbHQnXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYXR0cldoaXRlbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBrZXkgPSBhdHRyV2hpdGVsaXN0W2ldO1xuICAgICAgICBhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgaWYgKGF0dHIpIHtcbiAgICAgICAgICAgIG91dC5wdXNoKFwiW1wiICsga2V5ICsgXCI9XFxcIlwiICsgYXR0ciArIFwiXFxcIl1cIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dC5qb2luKCcnKTtcbn1cbnZhciBJTklUSUFMX1RJTUUgPSBEYXRlLm5vdygpO1xudmFyIHByZXZOb3cgPSAwO1xudmFyIHBlcmZvcm1hbmNlRmFsbGJhY2sgPSB7XG4gICAgbm93OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpIC0gSU5JVElBTF9USU1FO1xuICAgICAgICBpZiAobm93IDwgcHJldk5vdykge1xuICAgICAgICAgICAgbm93ID0gcHJldk5vdztcbiAgICAgICAgfVxuICAgICAgICBwcmV2Tm93ID0gbm93O1xuICAgICAgICByZXR1cm4gbm93O1xuICAgIH0sXG4gICAgdGltZU9yaWdpbjogSU5JVElBTF9USU1FLFxufTtcbmV4cG9ydCB2YXIgY3Jvc3NQbGF0Zm9ybVBlcmZvcm1hbmNlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaXNOb2RlRW52KCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBwZXJmSG9va3MgPSBkeW5hbWljUmVxdWlyZShtb2R1bGUsICdwZXJmX2hvb2tzJyk7XG4gICAgICAgICAgICByZXR1cm4gcGVyZkhvb2tzLnBlcmZvcm1hbmNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICByZXR1cm4gcGVyZm9ybWFuY2VGYWxsYmFjaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZ2V0R2xvYmFsT2JqZWN0KCkucGVyZm9ybWFuY2UpIHtcbiAgICAgICAgLy8gUG9seWZpbGwgZm9yIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdoaWxlIHBlcmZvcm1hbmNlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBwZXJmb3JtYW5jZS50aW1lT3JpZ2luLCBwZXJmb3JtYW5jZS50aW1lT3JpZ2luXG4gICAgICAgIC8vIGlzIG5vdCBhcyB3aWRlbHkgc3VwcG9ydGVkLiBOYW1lbHksIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gaXMgdW5kZWZpbmVkIGluIFNhZmFyaSBhcyBvZiB3cml0aW5nLlxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuICAgICAgICBpZiAocGVyZm9ybWFuY2UudGltZU9yaWdpbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBBcyBvZiB3cml0aW5nLCBwZXJmb3JtYW5jZS50aW1pbmcgaXMgbm90IGF2YWlsYWJsZSBpbiBXZWIgV29ya2VycyBpbiBtYWluc3RyZWFtIGJyb3dzZXJzLCBzbyBpdCBpcyBub3QgYWx3YXlzIGFcbiAgICAgICAgICAgIC8vIHZhbGlkIGZhbGxiYWNrLiBJbiB0aGUgYWJzZW5jZSBvZiBhIGluaXRpYWwgdGltZSBwcm92aWRlZCBieSB0aGUgYnJvd3NlciwgZmFsbGJhY2sgdG8gSU5JVElBTF9USU1FLlxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRlcHJlY2F0aW9uXG4gICAgICAgICAgICBwZXJmb3JtYW5jZS50aW1lT3JpZ2luID0gKHBlcmZvcm1hbmNlLnRpbWluZyAmJiBwZXJmb3JtYW5jZS50aW1pbmcubmF2aWdhdGlvblN0YXJ0KSB8fCBJTklUSUFMX1RJTUU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldEdsb2JhbE9iamVjdCgpLnBlcmZvcm1hbmNlIHx8IHBlcmZvcm1hbmNlRmFsbGJhY2s7XG59KSgpO1xuLyoqXG4gKiBSZXR1cm5zIGEgdGltZXN0YW1wIGluIHNlY29uZHMgd2l0aCBtaWxsaXNlY29uZHMgcHJlY2lzaW9uIHNpbmNlIHRoZSBVTklYIGVwb2NoIGNhbGN1bGF0ZWQgd2l0aCB0aGUgbW9ub3RvbmljIGNsb2NrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGltZXN0YW1wV2l0aE1zKCkge1xuICAgIHJldHVybiAoY3Jvc3NQbGF0Zm9ybVBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKyBjcm9zc1BsYXRmb3JtUGVyZm9ybWFuY2Uubm93KCkpIC8gMTAwMDtcbn1cbi8vIGh0dHBzOi8vc2VtdmVyLm9yZy8jaXMtdGhlcmUtYS1zdWdnZXN0ZWQtcmVndWxhci1leHByZXNzaW9uLXJlZ2V4LXRvLWNoZWNrLWEtc2VtdmVyLXN0cmluZ1xudmFyIFNFTVZFUl9SRUdFWFAgPSAvXigwfFsxLTldXFxkKilcXC4oMHxbMS05XVxcZCopXFwuKDB8WzEtOV1cXGQqKSg/Oi0oKD86MHxbMS05XVxcZCp8XFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKD86XFwuKD86MHxbMS05XVxcZCp8XFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKSopKT8oPzpcXCsoWzAtOWEtekEtWi1dKyg/OlxcLlswLTlhLXpBLVotXSspKikpPyQvO1xuLyoqXG4gKiBQYXJzZXMgaW5wdXQgaW50byBhIFNlbVZlciBpbnRlcmZhY2VcbiAqIEBwYXJhbSBpbnB1dCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzZW12ZXIgdmVyc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTZW12ZXIoaW5wdXQpIHtcbiAgICB2YXIgbWF0Y2ggPSBpbnB1dC5tYXRjaChTRU1WRVJfUkVHRVhQKSB8fCBbXTtcbiAgICB2YXIgbWFqb3IgPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICAgIHZhciBtaW5vciA9IHBhcnNlSW50KG1hdGNoWzJdLCAxMCk7XG4gICAgdmFyIHBhdGNoID0gcGFyc2VJbnQobWF0Y2hbM10sIDEwKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBidWlsZG1ldGFkYXRhOiBtYXRjaFs1XSxcbiAgICAgICAgbWFqb3I6IGlzTmFOKG1ham9yKSA/IHVuZGVmaW5lZCA6IG1ham9yLFxuICAgICAgICBtaW5vcjogaXNOYU4obWlub3IpID8gdW5kZWZpbmVkIDogbWlub3IsXG4gICAgICAgIHBhdGNoOiBpc05hTihwYXRjaCkgPyB1bmRlZmluZWQgOiBwYXRjaCxcbiAgICAgICAgcHJlcmVsZWFzZTogbWF0Y2hbNF0sXG4gICAgfTtcbn1cbnZhciBkZWZhdWx0UmV0cnlBZnRlciA9IDYwICogMTAwMDsgLy8gNjAgc2Vjb25kc1xuLyoqXG4gKiBFeHRyYWN0cyBSZXRyeS1BZnRlciB2YWx1ZSBmcm9tIHRoZSByZXF1ZXN0IGhlYWRlciBvciByZXR1cm5zIGRlZmF1bHQgdmFsdWVcbiAqIEBwYXJhbSBub3cgY3VycmVudCB1bml4IHRpbWVzdGFtcFxuICogQHBhcmFtIGhlYWRlciBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgJ1JldHJ5LUFmdGVyJyBoZWFkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmV0cnlBZnRlckhlYWRlcihub3csIGhlYWRlcikge1xuICAgIGlmICghaGVhZGVyKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0UmV0cnlBZnRlcjtcbiAgICB9XG4gICAgdmFyIGhlYWRlckRlbGF5ID0gcGFyc2VJbnQoXCJcIiArIGhlYWRlciwgMTApO1xuICAgIGlmICghaXNOYU4oaGVhZGVyRGVsYXkpKSB7XG4gICAgICAgIHJldHVybiBoZWFkZXJEZWxheSAqIDEwMDA7XG4gICAgfVxuICAgIHZhciBoZWFkZXJEYXRlID0gRGF0ZS5wYXJzZShcIlwiICsgaGVhZGVyKTtcbiAgICBpZiAoIWlzTmFOKGhlYWRlckRhdGUpKSB7XG4gICAgICAgIHJldHVybiBoZWFkZXJEYXRlIC0gbm93O1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFJldHJ5QWZ0ZXI7XG59XG52YXIgZGVmYXVsdEZ1bmN0aW9uTmFtZSA9ICc8YW5vbnltb3VzPic7XG4vKipcbiAqIFNhZmVseSBleHRyYWN0IGZ1bmN0aW9uIG5hbWUgZnJvbSBpdHNlbGZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1bmN0aW9uTmFtZShmbikge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICghZm4gfHwgdHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdEZ1bmN0aW9uTmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4ubmFtZSB8fCBkZWZhdWx0RnVuY3Rpb25OYW1lO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICAvLyBKdXN0IGFjY2Vzc2luZyBjdXN0b20gcHJvcHMgaW4gc29tZSBTZWxlbml1bSBlbnZpcm9ubWVudHNcbiAgICAgICAgLy8gY2FuIGNhdXNlIGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGV4Y2VwdGlvbiAoc2VlIHJhdmVuLWpzIzQ5NSkuXG4gICAgICAgIHJldHVybiBkZWZhdWx0RnVuY3Rpb25OYW1lO1xuICAgIH1cbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBhZGRzIGNvbnRleHQgKHByZS9wb3N0L2xpbmUpIGxpbmVzIHRvIHRoZSBwcm92aWRlZCBmcmFtZVxuICpcbiAqIEBwYXJhbSBsaW5lcyBzdHJpbmdbXSBjb250YWluaW5nIGFsbCBsaW5lc1xuICogQHBhcmFtIGZyYW1lIFN0YWNrRnJhbWUgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAqIEBwYXJhbSBsaW5lc09mQ29udGV4dCBudW1iZXIgb2YgY29udGV4dCBsaW5lcyB3ZSB3YW50IHRvIGFkZCBwcmUvcG9zdFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQ29udGV4dFRvRnJhbWUobGluZXMsIGZyYW1lLCBsaW5lc09mQ29udGV4dCkge1xuICAgIGlmIChsaW5lc09mQ29udGV4dCA9PT0gdm9pZCAwKSB7IGxpbmVzT2ZDb250ZXh0ID0gNTsgfVxuICAgIHZhciBsaW5lbm8gPSBmcmFtZS5saW5lbm8gfHwgMDtcbiAgICB2YXIgbWF4TGluZXMgPSBsaW5lcy5sZW5ndGg7XG4gICAgdmFyIHNvdXJjZUxpbmUgPSBNYXRoLm1heChNYXRoLm1pbihtYXhMaW5lcywgbGluZW5vIC0gMSksIDApO1xuICAgIGZyYW1lLnByZV9jb250ZXh0ID0gbGluZXNcbiAgICAgICAgLnNsaWNlKE1hdGgubWF4KDAsIHNvdXJjZUxpbmUgLSBsaW5lc09mQ29udGV4dCksIHNvdXJjZUxpbmUpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKGxpbmUpIHsgcmV0dXJuIHNuaXBMaW5lKGxpbmUsIDApOyB9KTtcbiAgICBmcmFtZS5jb250ZXh0X2xpbmUgPSBzbmlwTGluZShsaW5lc1tNYXRoLm1pbihtYXhMaW5lcyAtIDEsIHNvdXJjZUxpbmUpXSwgZnJhbWUuY29sbm8gfHwgMCk7XG4gICAgZnJhbWUucG9zdF9jb250ZXh0ID0gbGluZXNcbiAgICAgICAgLnNsaWNlKE1hdGgubWluKHNvdXJjZUxpbmUgKyAxLCBtYXhMaW5lcyksIHNvdXJjZUxpbmUgKyAxICsgbGluZXNPZkNvbnRleHQpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKGxpbmUpIHsgcmV0dXJuIHNuaXBMaW5lKGxpbmUsIDApOyB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pc2MuanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGlzRWxlbWVudCwgaXNFcnJvciwgaXNFdmVudCwgaXNJbnN0YW5jZU9mLCBpc1BsYWluT2JqZWN0LCBpc1ByaW1pdGl2ZSwgaXNTeW50aGV0aWNFdmVudCB9IGZyb20gJy4vaXMnO1xuaW1wb3J0IHsgTWVtbyB9IGZyb20gJy4vbWVtbyc7XG5pbXBvcnQgeyBnZXRGdW5jdGlvbk5hbWUsIGh0bWxUcmVlQXNTdHJpbmcgfSBmcm9tICcuL21pc2MnO1xuaW1wb3J0IHsgdHJ1bmNhdGUgfSBmcm9tICcuL3N0cmluZyc7XG4vKipcbiAqIFdyYXAgYSBnaXZlbiBvYmplY3QgbWV0aG9kIHdpdGggYSBoaWdoZXItb3JkZXIgZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0gc291cmNlIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbWV0aG9kIHRvIGJlIHdyYXBwZWQuXG4gKiBAcGFyYW0gbmFtZSBBIG5hbWUgb2YgbWV0aG9kIHRvIGJlIHdyYXBwZWQuXG4gKiBAcGFyYW0gcmVwbGFjZW1lbnQgQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHdyYXAgYSBnaXZlbiBtZXRob2QuXG4gKiBAcmV0dXJucyB2b2lkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsKHNvdXJjZSwgbmFtZSwgcmVwbGFjZW1lbnQpIHtcbiAgICBpZiAoIShuYW1lIGluIHNvdXJjZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgb3JpZ2luYWwgPSBzb3VyY2VbbmFtZV07XG4gICAgdmFyIHdyYXBwZWQgPSByZXBsYWNlbWVudChvcmlnaW5hbCk7XG4gICAgLy8gTWFrZSBzdXJlIGl0J3MgYSBmdW5jdGlvbiBmaXJzdCwgYXMgd2UgbmVlZCB0byBhdHRhY2ggYW4gZW1wdHkgcHJvdG90eXBlIGZvciBgZGVmaW5lUHJvcGVydGllc2AgdG8gd29ya1xuICAgIC8vIG90aGVyd2lzZSBpdCdsbCB0aHJvdyBcIlR5cGVFcnJvcjogT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgY2FsbGVkIG9uIG5vbi1vYmplY3RcIlxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgaWYgKHR5cGVvZiB3cmFwcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3cmFwcGVkLnByb3RvdHlwZSA9IHdyYXBwZWQucHJvdG90eXBlIHx8IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod3JhcHBlZCwge1xuICAgICAgICAgICAgICAgIF9fc2VudHJ5X29yaWdpbmFsX186IHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcmlnaW5hbCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9Pbykge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gdGhyb3cgaWYgbXVsdGlwbGUgZmlsbCBoYXBwZW5zIG9uIGEgZ2xvYmFsIG9iamVjdCBsaWtlIFhNTEh0dHBSZXF1ZXN0XG4gICAgICAgICAgICAvLyBGaXhlcyBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L2lzc3Vlcy8yMDQzXG4gICAgICAgIH1cbiAgICB9XG4gICAgc291cmNlW25hbWVdID0gd3JhcHBlZDtcbn1cbi8qKlxuICogRW5jb2RlcyBnaXZlbiBvYmplY3QgaW50byB1cmwtZnJpZW5kbHkgZm9ybWF0XG4gKlxuICogQHBhcmFtIG9iamVjdCBBbiBvYmplY3QgdGhhdCBjb250YWlucyBzZXJpYWxpemFibGUgdmFsdWVzXG4gKiBAcmV0dXJucyBzdHJpbmcgRW5jb2RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXJsRW5jb2RlKG9iamVjdCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpXG4gICAgICAgIC5tYXAoXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVuc2FmZS1hbnlcbiAgICBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG9iamVjdFtrZXldKTsgfSlcbiAgICAgICAgLmpvaW4oJyYnKTtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyBhbnkgb2JqZWN0IGludG8gYW4gb2JqZWN0IGxpdGVyYWwgd2l0aCBhbGwgaXQncyBhdHRyaWJ1dGVzXG4gKiBhdHRhY2hlZCB0byBpdC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgSW5pdGlhbCBzb3VyY2UgdGhhdCB3ZSBoYXZlIHRvIHRyYW5zZm9ybSBpbiBvcmRlciB0byBiZSB1c2FibGUgYnkgdGhlIHNlcmlhbGl6ZXJcbiAqL1xuZnVuY3Rpb24gZ2V0V2Fsa1NvdXJjZSh2YWx1ZSkge1xuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgICB2YXIgZXJyb3IgPSB2YWx1ZTtcbiAgICAgICAgdmFyIGVyciA9IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICBuYW1lOiBlcnJvci5uYW1lLFxuICAgICAgICAgICAgc3RhY2s6IGVycm9yLnN0YWNrLFxuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciBpIGluIGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVycm9yLCBpKSkge1xuICAgICAgICAgICAgICAgIGVycltpXSA9IGVycm9yW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIGlmIChpc0V2ZW50KHZhbHVlKSkge1xuICAgICAgICB2YXIgZXZlbnRfMSA9IHZhbHVlO1xuICAgICAgICB2YXIgc291cmNlID0ge307XG4gICAgICAgIHNvdXJjZS50eXBlID0gZXZlbnRfMS50eXBlO1xuICAgICAgICAvLyBBY2Nlc3NpbmcgZXZlbnQudGFyZ2V0IGNhbiB0aHJvdyAoc2VlIGdldHNlbnRyeS9yYXZlbi1qcyM4MzgsICM3NjgpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzb3VyY2UudGFyZ2V0ID0gaXNFbGVtZW50KGV2ZW50XzEudGFyZ2V0KVxuICAgICAgICAgICAgICAgID8gaHRtbFRyZWVBc1N0cmluZyhldmVudF8xLnRhcmdldClcbiAgICAgICAgICAgICAgICA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChldmVudF8xLnRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9vTykge1xuICAgICAgICAgICAgc291cmNlLnRhcmdldCA9ICc8dW5rbm93bj4nO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzb3VyY2UuY3VycmVudFRhcmdldCA9IGlzRWxlbWVudChldmVudF8xLmN1cnJlbnRUYXJnZXQpXG4gICAgICAgICAgICAgICAgPyBodG1sVHJlZUFzU3RyaW5nKGV2ZW50XzEuY3VycmVudFRhcmdldClcbiAgICAgICAgICAgICAgICA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChldmVudF8xLmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfb08pIHtcbiAgICAgICAgICAgIHNvdXJjZS5jdXJyZW50VGFyZ2V0ID0gJzx1bmtub3duPic7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICAgICAgaWYgKHR5cGVvZiBDdXN0b21FdmVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNJbnN0YW5jZU9mKHZhbHVlLCBDdXN0b21FdmVudCkpIHtcbiAgICAgICAgICAgIHNvdXJjZS5kZXRhaWwgPSBldmVudF8xLmRldGFpbDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpIGluIGV2ZW50XzEpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXZlbnRfMSwgaSkpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VbaV0gPSBldmVudF8xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbi8qKiBDYWxjdWxhdGVzIGJ5dGVzIHNpemUgb2YgaW5wdXQgc3RyaW5nICovXG5mdW5jdGlvbiB1dGY4TGVuZ3RoKHZhbHVlKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICByZXR1cm4gfi1lbmNvZGVVUkkodmFsdWUpLnNwbGl0KC8lLi58Li8pLmxlbmd0aDtcbn1cbi8qKiBDYWxjdWxhdGVzIGJ5dGVzIHNpemUgb2YgaW5wdXQgb2JqZWN0ICovXG5mdW5jdGlvbiBqc29uU2l6ZSh2YWx1ZSkge1xuICAgIHJldHVybiB1dGY4TGVuZ3RoKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG59XG4vKiogSlNEb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVUb1NpemUob2JqZWN0LCBcbi8vIERlZmF1bHQgTm9kZS5qcyBSRVBMIGRlcHRoXG5kZXB0aCwgXG4vLyAxMDBrQiwgYXMgMjAwa0IgaXMgbWF4IHBheWxvYWQgc2l6ZSwgc28gaGFsZiBzb3VuZHMgcmVhc29uYWJsZVxubWF4U2l6ZSkge1xuICAgIGlmIChkZXB0aCA9PT0gdm9pZCAwKSB7IGRlcHRoID0gMzsgfVxuICAgIGlmIChtYXhTaXplID09PSB2b2lkIDApIHsgbWF4U2l6ZSA9IDEwMCAqIDEwMjQ7IH1cbiAgICB2YXIgc2VyaWFsaXplZCA9IG5vcm1hbGl6ZShvYmplY3QsIGRlcHRoKTtcbiAgICBpZiAoanNvblNpemUoc2VyaWFsaXplZCkgPiBtYXhTaXplKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVUb1NpemUob2JqZWN0LCBkZXB0aCAtIDEsIG1heFNpemUpO1xuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplZDtcbn1cbi8qKiBUcmFuc2Zvcm1zIGFueSBpbnB1dCB2YWx1ZSBpbnRvIGEgc3RyaW5nIGZvcm0sIGVpdGhlciBwcmltaXRpdmUgdmFsdWUgb3IgYSB0eXBlIG9mIHRoZSBpbnB1dCAqL1xuZnVuY3Rpb24gc2VyaWFsaXplVmFsdWUodmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgLy8gTm9kZS5qcyBSRVBMIG5vdGF0aW9uXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgcmV0dXJuICdbT2JqZWN0XSc7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnW29iamVjdCBBcnJheV0nKSB7XG4gICAgICAgIHJldHVybiAnW0FycmF5XSc7XG4gICAgfVxuICAgIHZhciBub3JtYWxpemVkID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuICAgIHJldHVybiBpc1ByaW1pdGl2ZShub3JtYWxpemVkKSA/IG5vcm1hbGl6ZWQgOiB0eXBlO1xufVxuLyoqXG4gKiBub3JtYWxpemVWYWx1ZSgpXG4gKlxuICogVGFrZXMgdW5zZXJpYWxpemFibGUgaW5wdXQgYW5kIG1ha2UgaXQgc2VyaWFsaXphYmxlIGZyaWVuZGx5XG4gKlxuICogLSB0cmFuc2xhdGVzIHVuZGVmaW5lZC9OYU4gdmFsdWVzIHRvIFwiW3VuZGVmaW5lZF1cIi9cIltOYU5dXCIgcmVzcGVjdGl2ZWx5LFxuICogLSBzZXJpYWxpemVzIEVycm9yIG9iamVjdHNcbiAqIC0gZmlsdGVyIGdsb2JhbCBvYmplY3RzXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjeWNsb21hdGljLWNvbXBsZXhpdHlcbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlLCBrZXkpIHtcbiAgICBpZiAoa2V5ID09PSAnZG9tYWluJyAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLl9ldmVudHMpIHtcbiAgICAgICAgcmV0dXJuICdbRG9tYWluXSc7XG4gICAgfVxuICAgIGlmIChrZXkgPT09ICdkb21haW5FbWl0dGVyJykge1xuICAgICAgICByZXR1cm4gJ1tEb21haW5FbWl0dGVyXSc7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSA9PT0gZ2xvYmFsKSB7XG4gICAgICAgIHJldHVybiAnW0dsb2JhbF0nO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgPT09IHdpbmRvdykge1xuICAgICAgICByZXR1cm4gJ1tXaW5kb3ddJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgPT09IGRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybiAnW0RvY3VtZW50XSc7XG4gICAgfVxuICAgIC8vIFJlYWN0J3MgU3ludGhldGljRXZlbnQgdGhpbmd5XG4gICAgaWYgKGlzU3ludGhldGljRXZlbnQodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAnW1N5bnRoZXRpY0V2ZW50XSc7XG4gICAgfVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby10YXV0b2xvZ3ktZXhwcmVzc2lvblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gJ1tOYU5dJztcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSB2b2lkIDApIHtcbiAgICAgICAgcmV0dXJuICdbdW5kZWZpbmVkXSc7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIFwiW0Z1bmN0aW9uOiBcIiArIGdldEZ1bmN0aW9uTmFtZSh2YWx1ZSkgKyBcIl1cIjtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuLyoqXG4gKiBXYWxrcyBhbiBvYmplY3QgdG8gcGVyZm9ybSBhIG5vcm1hbGl6YXRpb24gb24gaXRcbiAqXG4gKiBAcGFyYW0ga2V5IG9mIG9iamVjdCB0aGF0J3Mgd2Fsa2VkIGluIGN1cnJlbnQgaXRlcmF0aW9uXG4gKiBAcGFyYW0gdmFsdWUgb2JqZWN0IHRvIGJlIHdhbGtlZFxuICogQHBhcmFtIGRlcHRoIE9wdGlvbmFsIG51bWJlciBpbmRpY2F0aW5nIGhvdyBkZWVwIHNob3VsZCB3YWxraW5nIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIG1lbW8gT3B0aW9uYWwgTWVtbyBjbGFzcyBoYW5kbGluZyBkZWN5Y2xpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhbGsoa2V5LCB2YWx1ZSwgZGVwdGgsIG1lbW8pIHtcbiAgICBpZiAoZGVwdGggPT09IHZvaWQgMCkgeyBkZXB0aCA9ICtJbmZpbml0eTsgfVxuICAgIGlmIChtZW1vID09PSB2b2lkIDApIHsgbWVtbyA9IG5ldyBNZW1vKCk7IH1cbiAgICAvLyBJZiB3ZSByZWFjaCB0aGUgbWF4aW11bSBkZXB0aCwgc2VyaWFsaXplIHdoYXRldmVyIGhhcyBsZWZ0XG4gICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICAgIC8vIElmIHZhbHVlIGltcGxlbWVudHMgYHRvSlNPTmAgbWV0aG9kLCBjYWxsIGl0IGFuZCByZXR1cm4gZWFybHlcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnNhZmUtYW55XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9KU09OKCk7XG4gICAgfVxuICAgIC8vIHRzbGludDplbmFibGU6bm8tdW5zYWZlLWFueVxuICAgIC8vIElmIG5vcm1hbGl6ZWQgdmFsdWUgaXMgYSBwcmltaXRpdmUsIHRoZXJlIGFyZSBubyBicmFuY2hlcyBsZWZ0IHRvIHdhbGssIHNvIHdlIGNhbiBqdXN0IGJhaWwgb3V0LCBhcyB0aGVyZXMgbm8gcG9pbnQgaW4gZ29pbmcgZG93biB0aGF0IGJyYW5jaCBhbnkgZnVydGhlclxuICAgIHZhciBub3JtYWxpemVkID0gbm9ybWFsaXplVmFsdWUodmFsdWUsIGtleSk7XG4gICAgaWYgKGlzUHJpbWl0aXZlKG5vcm1hbGl6ZWQpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgc291cmNlIHRoYXQgd2Ugd2lsbCB1c2UgZm9yIG5leHQgaXR0ZXJhdGlvbnMsIGVpdGhlciBvYmplY3RpZmllZCBlcnJvciBvYmplY3QgKEVycm9yIHR5cGUgd2l0aCBleHRyYWN0ZWQga2V5czp2YWx1ZSBwYWlycykgb3IgdGhlIGlucHV0IGl0c2VsZlxuICAgIHZhciBzb3VyY2UgPSBnZXRXYWxrU291cmNlKHZhbHVlKTtcbiAgICAvLyBDcmVhdGUgYW4gYWNjdW11bGF0b3IgdGhhdCB3aWxsIGFjdCBhcyBhIHBhcmVudCBmb3IgYWxsIGZ1dHVyZSBpdHRlcmF0aW9ucyBvZiB0aGF0IGJyYW5jaFxuICAgIHZhciBhY2MgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFtdIDoge307XG4gICAgLy8gSWYgd2UgYWxyZWFkeSB3YWxrZWQgdGhhdCBicmFuY2gsIGJhaWwgb3V0LCBhcyBpdCdzIGNpcmN1bGFyIHJlZmVyZW5jZVxuICAgIGlmIChtZW1vLm1lbW9pemUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAnW0NpcmN1bGFyIH5dJztcbiAgICB9XG4gICAgLy8gV2FsayBhbGwga2V5cyBvZiB0aGUgc291cmNlXG4gICAgZm9yICh2YXIgaW5uZXJLZXkgaW4gc291cmNlKSB7XG4gICAgICAgIC8vIEF2b2lkIGl0ZXJhdGluZyBvdmVyIGZpZWxkcyBpbiB0aGUgcHJvdG90eXBlIGlmIHRoZXkndmUgc29tZWhvdyBiZWVuIGV4cG9zZWQgdG8gZW51bWVyYXRpb24uXG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwgaW5uZXJLZXkpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWN1cnNpdmVseSB3YWxrIHRocm91Z2ggYWxsIHRoZSBjaGlsZCBub2Rlc1xuICAgICAgICBhY2NbaW5uZXJLZXldID0gd2Fsayhpbm5lcktleSwgc291cmNlW2lubmVyS2V5XSwgZGVwdGggLSAxLCBtZW1vKTtcbiAgICB9XG4gICAgLy8gT25jZSB3YWxrZWQgdGhyb3VnaCBhbGwgdGhlIGJyYW5jaGVzLCByZW1vdmUgdGhlIHBhcmVudCBmcm9tIG1lbW8gc3RvcmFnZVxuICAgIG1lbW8udW5tZW1vaXplKHZhbHVlKTtcbiAgICAvLyBSZXR1cm4gYWNjdW11bGF0ZWQgdmFsdWVzXG4gICAgcmV0dXJuIGFjYztcbn1cbi8qKlxuICogbm9ybWFsaXplKClcbiAqXG4gKiAtIENyZWF0ZXMgYSBjb3B5IHRvIHByZXZlbnQgb3JpZ2luYWwgaW5wdXQgbXV0YXRpb25cbiAqIC0gU2tpcCBub24tZW51bWVyYWJsZXJzXG4gKiAtIENhbGxzIGB0b0pTT05gIGlmIGltcGxlbWVudGVkXG4gKiAtIFJlbW92ZXMgY2lyY3VsYXIgcmVmZXJlbmNlc1xuICogLSBUcmFuc2xhdGVzIG5vbi1zZXJpYWxpemVhYmxlIHZhbHVlcyAodW5kZWZpbmVkL05hTi9GdW5jdGlvbnMpIHRvIHNlcmlhbGl6YWJsZSBmb3JtYXRcbiAqIC0gVHJhbnNsYXRlcyBrbm93biBnbG9iYWwgb2JqZWN0cy9DbGFzc2VzIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uc1xuICogLSBUYWtlcyBjYXJlIG9mIEVycm9yIG9iamVjdHMgc2VyaWFsaXphdGlvblxuICogLSBPcHRpb25hbGx5IGxpbWl0IGRlcHRoIG9mIGZpbmFsIG91dHB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKGlucHV0LCBkZXB0aCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnNhZmUtYW55XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGlucHV0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgeyByZXR1cm4gd2FsayhrZXksIHZhbHVlLCBkZXB0aCk7IH0pKTtcbiAgICB9XG4gICAgY2F0Y2ggKF9vTykge1xuICAgICAgICByZXR1cm4gJyoqbm9uLXNlcmlhbGl6YWJsZSoqJztcbiAgICB9XG59XG4vKipcbiAqIEdpdmVuIGFueSBjYXB0dXJlZCBleGNlcHRpb24sIGV4dHJhY3QgaXRzIGtleXMgYW5kIGNyZWF0ZSBhIHNvcnRlZFxuICogYW5kIHRydW5jYXRlZCBsaXN0IHRoYXQgd2lsbCBiZSB1c2VkIGluc2lkZSB0aGUgZXZlbnQgbWVzc2FnZS5cbiAqIGVnLiBgTm9uLWVycm9yIGV4Y2VwdGlvbiBjYXB0dXJlZCB3aXRoIGtleXM6IGZvbywgYmFyLCBiYXpgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RXhjZXB0aW9uS2V5c0Zvck1lc3NhZ2UoZXhjZXB0aW9uLCBtYXhMZW5ndGgpIHtcbiAgICBpZiAobWF4TGVuZ3RoID09PSB2b2lkIDApIHsgbWF4TGVuZ3RoID0gNDA7IH1cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhnZXRXYWxrU291cmNlKGV4Y2VwdGlvbikpO1xuICAgIGtleXMuc29ydCgpO1xuICAgIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuICdbb2JqZWN0IGhhcyBubyBrZXlzXSc7XG4gICAgfVxuICAgIGlmIChrZXlzWzBdLmxlbmd0aCA+PSBtYXhMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRydW5jYXRlKGtleXNbMF0sIG1heExlbmd0aCk7XG4gICAgfVxuICAgIGZvciAodmFyIGluY2x1ZGVkS2V5cyA9IGtleXMubGVuZ3RoOyBpbmNsdWRlZEtleXMgPiAwOyBpbmNsdWRlZEtleXMtLSkge1xuICAgICAgICB2YXIgc2VyaWFsaXplZCA9IGtleXMuc2xpY2UoMCwgaW5jbHVkZWRLZXlzKS5qb2luKCcsICcpO1xuICAgICAgICBpZiAoc2VyaWFsaXplZC5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdWRlZEtleXMgPT09IGtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1bmNhdGUoc2VyaWFsaXplZCwgbWF4TGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBHaXZlbiBhbnkgb2JqZWN0LCByZXR1cm4gdGhlIG5ldyBvYmplY3Qgd2l0aCByZW1vdmVkIGtleXMgdGhhdCB2YWx1ZSB3YXMgYHVuZGVmaW5lZGAuXG4gKiBXb3JrcyByZWN1cnNpdmVseSBvbiBvYmplY3RzIGFuZCBhcnJheXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcm9wVW5kZWZpbmVkS2V5cyh2YWwpIHtcbiAgICB2YXIgZV8xLCBfYTtcbiAgICBpZiAoaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgICAgIHZhciBvYmogPSB2YWw7XG4gICAgICAgIHZhciBydiA9IHt9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSB0c2xpYl8xLl9fdmFsdWVzKE9iamVjdC5rZXlzKG9iaikpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ2W2tleV0gPSBkcm9wVW5kZWZpbmVkS2V5cyhvYmpba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJ2O1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiB2YWwubWFwKGRyb3BVbmRlZmluZWRLZXlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9iamVjdC5qcy5tYXAiLCIvLyBTbGlnaHRseSBtb2RpZmllZCAobm8gSUU4IHN1cHBvcnQsIEVTNikgYW5kIHRyYW5zY3JpYmVkIHRvIFR5cGVTY3JpcHRcbi8vIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9jYWx2aW5tZXRjYWxmL3JvbGx1cC1wbHVnaW4tbm9kZS1idWlsdGlucy9tYXN0ZXIvc3JjL2VzNi9wYXRoLmpzXG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KHBhcnRzLCBhbGxvd0Fib3ZlUm9vdCkge1xuICAgIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gICAgdmFyIHVwID0gMDtcbiAgICBmb3IgKHZhciBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGxhc3QgPSBwYXJ0c1tpXTtcbiAgICAgICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgICAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIHVwKys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodXApIHtcbiAgICAgICAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIHVwLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICAgIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xuICAgICAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgICAgICAgIHBhcnRzLnVuc2hpZnQoJy4uJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzO1xufVxuLy8gU3BsaXQgYSBmaWxlbmFtZSBpbnRvIFtyb290LCBkaXIsIGJhc2VuYW1lLCBleHRdLCB1bml4IHZlcnNpb25cbi8vICdyb290JyBpcyBqdXN0IGEgc2xhc2gsIG9yIG5vdGhpbmcuXG52YXIgc3BsaXRQYXRoUmUgPSAvXihcXC8/fCkoW1xcc1xcU10qPykoKD86XFwuezEsMn18W15cXC9dKz98KShcXC5bXi5cXC9dKnwpKSg/OltcXC9dKikkLztcbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gc3BsaXRQYXRoKGZpbGVuYW1lKSB7XG4gICAgdmFyIHBhcnRzID0gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSk7XG4gICAgcmV0dXJuIHBhcnRzID8gcGFydHMuc2xpY2UoMSkgOiBbXTtcbn1cbi8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciByZXNvbHZlZFBhdGggPSAnJztcbiAgICB2YXIgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSBhcmdzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkge1xuICAgICAgICB2YXIgcGF0aCA9IGkgPj0gMCA/IGFyZ3NbaV0gOiAnLyc7XG4gICAgICAgIC8vIFNraXAgZW1wdHkgZW50cmllc1xuICAgICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyBcIi9cIiArIHJlc29sdmVkUGF0aDtcbiAgICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckF0KDApID09PSAnLyc7XG4gICAgfVxuICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXRcbiAgICAvLyBoYW5kbGUgcmVsYXRpdmUgcGF0aHMgdG8gYmUgc2FmZSAobWlnaHQgaGFwcGVuIHdoZW4gcHJvY2Vzcy5jd2QoKSBmYWlscylcbiAgICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgICByZXNvbHZlZFBhdGggPSBub3JtYWxpemVBcnJheShyZXNvbHZlZFBhdGguc3BsaXQoJy8nKS5maWx0ZXIoZnVuY3Rpb24gKHApIHsgcmV0dXJuICEhcDsgfSksICFyZXNvbHZlZEFic29sdXRlKS5qb2luKCcvJyk7XG4gICAgcmV0dXJuIChyZXNvbHZlZEFic29sdXRlID8gJy8nIDogJycpICsgcmVzb2x2ZWRQYXRoIHx8ICcuJztcbn1cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gdHJpbShhcnIpIHtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGZvciAoOyBzdGFydCA8IGFyci5sZW5ndGg7IHN0YXJ0KyspIHtcbiAgICAgICAgaWYgKGFycltzdGFydF0gIT09ICcnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgZW5kID0gYXJyLmxlbmd0aCAtIDE7XG4gICAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xuICAgICAgICBpZiAoYXJyW2VuZF0gIT09ICcnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhcnQgPiBlbmQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gYXJyLnNsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpO1xufVxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlKGZyb20sIHRvKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGU6bm8tcGFyYW1ldGVyLXJlYXNzaWdubWVudFxuICAgIGZyb20gPSByZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgICB0byA9IHJlc29sdmUodG8pLnN1YnN0cigxKTtcbiAgICB2YXIgZnJvbVBhcnRzID0gdHJpbShmcm9tLnNwbGl0KCcvJykpO1xuICAgIHZhciB0b1BhcnRzID0gdHJpbSh0by5zcGxpdCgnLycpKTtcbiAgICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xuICAgIHZhciBzYW1lUGFydHNMZW5ndGggPSBsZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZnJvbVBhcnRzW2ldICE9PSB0b1BhcnRzW2ldKSB7XG4gICAgICAgICAgICBzYW1lUGFydHNMZW5ndGggPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIG91dHB1dFBhcnRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGZyb21QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBvdXRwdXRQYXJ0cy5wdXNoKCcuLicpO1xuICAgIH1cbiAgICBvdXRwdXRQYXJ0cyA9IG91dHB1dFBhcnRzLmNvbmNhdCh0b1BhcnRzLnNsaWNlKHNhbWVQYXJ0c0xlbmd0aCkpO1xuICAgIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCcvJyk7XG59XG4vLyBwYXRoLm5vcm1hbGl6ZShwYXRoKVxuLy8gcG9zaXggdmVyc2lvblxuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdmFyIGlzUGF0aEFic29sdXRlID0gaXNBYnNvbHV0ZShwYXRoKTtcbiAgICB2YXIgdHJhaWxpbmdTbGFzaCA9IHBhdGguc3Vic3RyKC0xKSA9PT0gJy8nO1xuICAgIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICAgIHZhciBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KHBhdGguc3BsaXQoJy8nKS5maWx0ZXIoZnVuY3Rpb24gKHApIHsgcmV0dXJuICEhcDsgfSksICFpc1BhdGhBYnNvbHV0ZSkuam9pbignLycpO1xuICAgIGlmICghbm9ybWFsaXplZFBhdGggJiYgIWlzUGF0aEFic29sdXRlKSB7XG4gICAgICAgIG5vcm1hbGl6ZWRQYXRoID0gJy4nO1xuICAgIH1cbiAgICBpZiAobm9ybWFsaXplZFBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xuICAgICAgICBub3JtYWxpemVkUGF0aCArPSAnLyc7XG4gICAgfVxuICAgIHJldHVybiAoaXNQYXRoQWJzb2x1dGUgPyAnLycgOiAnJykgKyBub3JtYWxpemVkUGF0aDtcbn1cbi8vIHBvc2l4IHZlcnNpb25cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWJzb2x1dGUocGF0aCkge1xuICAgIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xufVxuLy8gcG9zaXggdmVyc2lvblxuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gam9pbigpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVBhdGgoYXJncy5qb2luKCcvJykpO1xufVxuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gZGlybmFtZShwYXRoKSB7XG4gICAgdmFyIHJlc3VsdCA9IHNwbGl0UGF0aChwYXRoKTtcbiAgICB2YXIgcm9vdCA9IHJlc3VsdFswXTtcbiAgICB2YXIgZGlyID0gcmVzdWx0WzFdO1xuICAgIGlmICghcm9vdCAmJiAhZGlyKSB7XG4gICAgICAgIC8vIE5vIGRpcm5hbWUgd2hhdHNvZXZlclxuICAgICAgICByZXR1cm4gJy4nO1xuICAgIH1cbiAgICBpZiAoZGlyKSB7XG4gICAgICAgIC8vIEl0IGhhcyBhIGRpcm5hbWUsIHN0cmlwIHRyYWlsaW5nIHNsYXNoXG4gICAgICAgIGRpciA9IGRpci5zdWJzdHIoMCwgZGlyLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gcm9vdCArIGRpcjtcbn1cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2VuYW1lKHBhdGgsIGV4dCkge1xuICAgIHZhciBmID0gc3BsaXRQYXRoKHBhdGgpWzJdO1xuICAgIGlmIChleHQgJiYgZi5zdWJzdHIoZXh0Lmxlbmd0aCAqIC0xKSA9PT0gZXh0KSB7XG4gICAgICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gZjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhdGguanMubWFwIiwiZXhwb3J0IHZhciBzZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSA/IHNldFByb3RvT2YgOiBtaXhpblByb3BlcnRpZXMpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLXVuYm91bmQtbWV0aG9kXG4vKipcbiAqIHNldFByb3RvdHlwZU9mIHBvbHlmaWxsIHVzaW5nIF9fcHJvdG9fX1xuICovXG5mdW5jdGlvbiBzZXRQcm90b09mKG9iaiwgcHJvdG8pIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb2JqLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgIHJldHVybiBvYmo7XG59XG4vKipcbiAqIHNldFByb3RvdHlwZU9mIHBvbHlmaWxsIHVzaW5nIG1peGluXG4gKi9cbmZ1bmN0aW9uIG1peGluUHJvcGVydGllcyhvYmosIHByb3RvKSB7XG4gICAgZm9yICh2YXIgcHJvcCBpbiBwcm90bykge1xuICAgICAgICBpZiAoIW9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgb2JqW3Byb3BdID0gcHJvdG9bcHJvcF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvbHlmaWxsLmpzLm1hcCIsImltcG9ydCB7IFNlbnRyeUVycm9yIH0gZnJvbSAnLi9lcnJvcic7XG5pbXBvcnQgeyBTeW5jUHJvbWlzZSB9IGZyb20gJy4vc3luY3Byb21pc2UnO1xuLyoqIEEgc2ltcGxlIHF1ZXVlIHRoYXQgaG9sZHMgcHJvbWlzZXMuICovXG52YXIgUHJvbWlzZUJ1ZmZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQcm9taXNlQnVmZmVyKF9saW1pdCkge1xuICAgICAgICB0aGlzLl9saW1pdCA9IF9saW1pdDtcbiAgICAgICAgLyoqIEludGVybmFsIHNldCBvZiBxdWV1ZWQgUHJvbWlzZXMgKi9cbiAgICAgICAgdGhpcy5fYnVmZmVyID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNheXMgaWYgdGhlIGJ1ZmZlciBpcyByZWFkeSB0byB0YWtlIG1vcmUgcmVxdWVzdHNcbiAgICAgKi9cbiAgICBQcm9taXNlQnVmZmVyLnByb3RvdHlwZS5pc1JlYWR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGltaXQgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmxlbmd0aCgpIDwgdGhpcy5fbGltaXQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgYSBwcm9taXNlIHRvIHRoZSBxdWV1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YXNrIENhbiBiZSBhbnkgUHJvbWlzZUxpa2U8VD5cbiAgICAgKiBAcmV0dXJucyBUaGUgb3JpZ2luYWwgcHJvbWlzZS5cbiAgICAgKi9cbiAgICBQcm9taXNlQnVmZmVyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoIXRoaXMuaXNSZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gU3luY1Byb21pc2UucmVqZWN0KG5ldyBTZW50cnlFcnJvcignTm90IGFkZGluZyBQcm9taXNlIGR1ZSB0byBidWZmZXIgbGltaXQgcmVhY2hlZC4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2J1ZmZlci5pbmRleE9mKHRhc2spID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5fYnVmZmVyLnB1c2godGFzayk7XG4gICAgICAgIH1cbiAgICAgICAgdGFza1xuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMucmVtb3ZlKHRhc2spOyB9KVxuICAgICAgICAgICAgLnRoZW4obnVsbCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLnJlbW92ZSh0YXNrKS50aGVuKG51bGwsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGFkZCB0aGlzIGNhdGNoIGhlcmUgb3RoZXJ3aXNlIHdlIGhhdmUgYW4gdW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvblxuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgaXQncyBhIG5ldyBQcm9taXNlIGNoYWluLlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGFzaztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHByb21pc2UgdG8gdGhlIHF1ZXVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhc2sgQ2FuIGJlIGFueSBQcm9taXNlTGlrZTxUPlxuICAgICAqIEByZXR1cm5zIFJlbW92ZWQgcHJvbWlzZS5cbiAgICAgKi9cbiAgICBQcm9taXNlQnVmZmVyLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICB2YXIgcmVtb3ZlZFRhc2sgPSB0aGlzLl9idWZmZXIuc3BsaWNlKHRoaXMuX2J1ZmZlci5pbmRleE9mKHRhc2spLCAxKVswXTtcbiAgICAgICAgcmV0dXJuIHJlbW92ZWRUYXNrO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5yZXNvbHZlZCBwcm9taXNlcyBpbiB0aGUgcXVldWUuXG4gICAgICovXG4gICAgUHJvbWlzZUJ1ZmZlci5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnVmZmVyLmxlbmd0aDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRoaXMgd2lsbCBkcmFpbiB0aGUgd2hvbGUgcXVldWUsIHJldHVybnMgdHJ1ZSBpZiBxdWV1ZSBpcyBlbXB0eSBvciBkcmFpbmVkLlxuICAgICAqIElmIHRpbWVvdXQgaXMgcHJvdmlkZWQgYW5kIHRoZSBxdWV1ZSB0YWtlcyBsb25nZXIgdG8gZHJhaW4sIHRoZSBwcm9taXNlIHN0aWxsIHJlc29sdmVzIGJ1dCB3aXRoIGZhbHNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRpbWVvdXQgTnVtYmVyIGluIG1zIHRvIHdhaXQgdW50aWwgaXQgcmVzb2x2ZXMgd2l0aCBmYWxzZS5cbiAgICAgKi9cbiAgICBQcm9taXNlQnVmZmVyLnByb3RvdHlwZS5kcmFpbiA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgU3luY1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIHZhciBjYXB0dXJlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGltZW91dCAmJiB0aW1lb3V0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgICAgIFN5bmNQcm9taXNlLmFsbChfdGhpcy5fYnVmZmVyKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoY2FwdHVyZWRTZXRUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbihudWxsLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBQcm9taXNlQnVmZmVyO1xufSgpKTtcbmV4cG9ydCB7IFByb21pc2VCdWZmZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb21pc2VidWZmZXIuanMubWFwIiwiaW1wb3J0IHsgaXNSZWdFeHAsIGlzU3RyaW5nIH0gZnJvbSAnLi9pcyc7XG4vKipcbiAqIFRydW5jYXRlcyBnaXZlbiBzdHJpbmcgdG8gdGhlIG1heGltdW0gY2hhcmFjdGVycyBjb3VudFxuICpcbiAqIEBwYXJhbSBzdHIgQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgc2VyaWFsaXphYmxlIHZhbHVlc1xuICogQHBhcmFtIG1heCBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRydW5jYXRlZCBzdHJpbmdcbiAqIEByZXR1cm5zIHN0cmluZyBFbmNvZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnVuY2F0ZShzdHIsIG1heCkge1xuICAgIGlmIChtYXggPT09IHZvaWQgMCkgeyBtYXggPSAwOyB9XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycgfHwgbWF4ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIHJldHVybiBzdHIubGVuZ3RoIDw9IG1heCA/IHN0ciA6IHN0ci5zdWJzdHIoMCwgbWF4KSArIFwiLi4uXCI7XG59XG4vKipcbiAqIFRoaXMgaXMgYmFzaWNhbGx5IGp1c3QgYHRyaW1fbGluZWAgZnJvbVxuICogaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnkvYmxvYi9tYXN0ZXIvc3JjL3NlbnRyeS9sYW5nL2phdmFzY3JpcHQvcHJvY2Vzc29yLnB5I0w2N1xuICpcbiAqIEBwYXJhbSBzdHIgQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgc2VyaWFsaXphYmxlIHZhbHVlc1xuICogQHBhcmFtIG1heCBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRydW5jYXRlZCBzdHJpbmdcbiAqIEByZXR1cm5zIHN0cmluZyBFbmNvZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbmlwTGluZShsaW5lLCBjb2xubykge1xuICAgIHZhciBuZXdMaW5lID0gbGluZTtcbiAgICB2YXIgbGwgPSBuZXdMaW5lLmxlbmd0aDtcbiAgICBpZiAobGwgPD0gMTUwKSB7XG4gICAgICAgIHJldHVybiBuZXdMaW5lO1xuICAgIH1cbiAgICBpZiAoY29sbm8gPiBsbCkge1xuICAgICAgICBjb2xubyA9IGxsOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLXBhcmFtZXRlci1yZWFzc2lnbm1lbnRcbiAgICB9XG4gICAgdmFyIHN0YXJ0ID0gTWF0aC5tYXgoY29sbm8gLSA2MCwgMCk7XG4gICAgaWYgKHN0YXJ0IDwgNSkge1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgfVxuICAgIHZhciBlbmQgPSBNYXRoLm1pbihzdGFydCArIDE0MCwgbGwpO1xuICAgIGlmIChlbmQgPiBsbCAtIDUpIHtcbiAgICAgICAgZW5kID0gbGw7XG4gICAgfVxuICAgIGlmIChlbmQgPT09IGxsKSB7XG4gICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoZW5kIC0gMTQwLCAwKTtcbiAgICB9XG4gICAgbmV3TGluZSA9IG5ld0xpbmUuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgaWYgKHN0YXJ0ID4gMCkge1xuICAgICAgICBuZXdMaW5lID0gXCIne3NuaXB9IFwiICsgbmV3TGluZTtcbiAgICB9XG4gICAgaWYgKGVuZCA8IGxsKSB7XG4gICAgICAgIG5ld0xpbmUgKz0gJyB7c25pcH0nO1xuICAgIH1cbiAgICByZXR1cm4gbmV3TGluZTtcbn1cbi8qKlxuICogSm9pbiB2YWx1ZXMgaW4gYXJyYXlcbiAqIEBwYXJhbSBpbnB1dCBhcnJheSBvZiB2YWx1ZXMgdG8gYmUgam9pbmVkIHRvZ2V0aGVyXG4gKiBAcGFyYW0gZGVsaW1pdGVyIHN0cmluZyB0byBiZSBwbGFjZWQgaW4tYmV0d2VlbiB2YWx1ZXNcbiAqIEByZXR1cm5zIEpvaW5lZCB2YWx1ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVKb2luKGlucHV0LCBkZWxpbWl0ZXIpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgdmFyIG91dHB1dCA9IFtdO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpwcmVmZXItZm9yLW9mXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdmFsdWUgPSBpbnB1dFtpXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBvdXRwdXQucHVzaCgnW3ZhbHVlIGNhbm5vdCBiZSBzZXJpYWxpemVkXScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQuam9pbihkZWxpbWl0ZXIpO1xufVxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIHZhbHVlIG1hdGNoZXMgYSByZWdleCBvciBpbmNsdWRlcyB0aGUgc3RyaW5nXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyB2YWx1ZSB0byBiZSBjaGVja2VkIGFnYWluc3RcbiAqIEBwYXJhbSBwYXR0ZXJuIEVpdGhlciBhIHJlZ2V4IG9yIGEgc3RyaW5nIHRoYXQgbXVzdCBiZSBjb250YWluZWQgaW4gdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWF0Y2hpbmdQYXR0ZXJuKHZhbHVlLCBwYXR0ZXJuKSB7XG4gICAgaWYgKCFpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAocGF0dGVybikpIHtcbiAgICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdCh2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmluZGV4T2YocGF0dGVybikgIT09IC0xO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmcuanMubWFwIiwiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSAnLi9taXNjJztcbi8qKlxuICogVGVsbHMgd2hldGhlciBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzIEVycm9yRXZlbnQgb2JqZWN0c1xuICoge0BsaW5rIHN1cHBvcnRzRXJyb3JFdmVudH0uXG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIHRoZSBnaXZlbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzRXJyb3JFdmVudCgpIHtcbiAgICB0cnkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtZXhwcmVzc2lvblxuICAgICAgICBuZXcgRXJyb3JFdmVudCgnJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgRE9NRXJyb3Igb2JqZWN0c1xuICoge0BsaW5rIHN1cHBvcnRzRE9NRXJyb3J9LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0RPTUVycm9yKCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEl0IHJlYWxseSBuZWVkcyAxIGFyZ3VtZW50LCBub3QgMC5cbiAgICAgICAgLy8gQ2hyb21lOiBWTTg5OjEgVW5jYXVnaHQgVHlwZUVycm9yOiBGYWlsZWQgdG8gY29uc3RydWN0ICdET01FcnJvcic6XG4gICAgICAgIC8vIDEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtZXhwcmVzc2lvblxuICAgICAgICBuZXcgRE9NRXJyb3IoJycpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbi8qKlxuICogVGVsbHMgd2hldGhlciBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzIERPTUV4Y2VwdGlvbiBvYmplY3RzXG4gKiB7QGxpbmsgc3VwcG9ydHNET01FeGNlcHRpb259LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0RPTUV4Y2VwdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtZXhwcmVzc2lvblxuICAgICAgICBuZXcgRE9NRXhjZXB0aW9uKCcnKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBGZXRjaCBBUElcbiAqIHtAbGluayBzdXBwb3J0c0ZldGNofS5cbiAqXG4gKiBAcmV0dXJucyBBbnN3ZXIgdG8gdGhlIGdpdmVuIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNGZXRjaCgpIHtcbiAgICBpZiAoISgnZmV0Y2gnIGluIGdldEdsb2JhbE9iamVjdCgpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxuICAgICAgICBuZXcgSGVhZGVycygpO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICAgICAgbmV3IFJlcXVlc3QoJycpO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICAgICAgbmV3IFJlc3BvbnNlKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLyoqXG4gKiBpc05hdGl2ZUZldGNoIGNoZWNrcyBpZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gaXMgYSBuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgZmV0Y2goKVxuICovXG5mdW5jdGlvbiBpc05hdGl2ZUZldGNoKGZ1bmMpIHtcbiAgICByZXR1cm4gZnVuYyAmJiAvXmZ1bmN0aW9uIGZldGNoXFwoXFwpXFxzK1xce1xccytcXFtuYXRpdmUgY29kZVxcXVxccytcXH0kLy50ZXN0KGZ1bmMudG9TdHJpbmcoKSk7XG59XG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBGZXRjaCBBUEkgbmF0aXZlbHlcbiAqIHtAbGluayBzdXBwb3J0c05hdGl2ZUZldGNofS5cbiAqXG4gKiBAcmV0dXJucyB0cnVlIGlmIGB3aW5kb3cuZmV0Y2hgIGlzIG5hdGl2ZWx5IGltcGxlbWVudGVkLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzTmF0aXZlRmV0Y2goKSB7XG4gICAgaWYgKCFzdXBwb3J0c0ZldGNoKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG4gICAgLy8gRmFzdCBwYXRoIHRvIGF2b2lkIERPTSBJL09cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5ib3VuZC1tZXRob2RcbiAgICBpZiAoaXNOYXRpdmVGZXRjaChnbG9iYWwuZmV0Y2gpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyB3aW5kb3cuZmV0Y2ggaXMgaW1wbGVtZW50ZWQsIGJ1dCBpcyBwb2x5ZmlsbGVkIG9yIGFscmVhZHkgd3JhcHBlZCAoZS5nOiBieSBhIGNocm9tZSBleHRlbnNpb24pXG4gICAgLy8gc28gY3JlYXRlIGEgXCJwdXJlXCIgaWZyYW1lIHRvIHNlZSBpZiB0aGF0IGhhcyBuYXRpdmUgZmV0Y2hcbiAgICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gICAgdmFyIGRvYyA9IGdsb2JhbC5kb2N1bWVudDtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5ib3VuZC1tZXRob2QgZGVwcmVjYXRpb25cbiAgICBpZiAoZG9jICYmIHR5cGVvZiBkb2MuY3JlYXRlRWxlbWVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgc2FuZGJveCA9IGRvYy5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgICAgICAgIHNhbmRib3guaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKHNhbmRib3gpO1xuICAgICAgICAgICAgaWYgKHNhbmRib3guY29udGVudFdpbmRvdyAmJiBzYW5kYm94LmNvbnRlbnRXaW5kb3cuZmV0Y2gpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5ib3VuZC1tZXRob2RcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpc05hdGl2ZUZldGNoKHNhbmRib3guY29udGVudFdpbmRvdy5mZXRjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb2MuaGVhZC5yZW1vdmVDaGlsZChzYW5kYm94KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignQ291bGQgbm90IGNyZWF0ZSBzYW5kYm94IGlmcmFtZSBmb3IgcHVyZSBmZXRjaCBjaGVjaywgYmFpbGluZyB0byB3aW5kb3cuZmV0Y2g6ICcsIGVycik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogVGVsbHMgd2hldGhlciBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzIFJlcG9ydGluZ09ic2VydmVyIEFQSVxuICoge0BsaW5rIHN1cHBvcnRzUmVwb3J0aW5nT2JzZXJ2ZXJ9LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c1JlcG9ydGluZ09ic2VydmVyKCkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5zYWZlLWFueVxuICAgIHJldHVybiAnUmVwb3J0aW5nT2JzZXJ2ZXInIGluIGdldEdsb2JhbE9iamVjdCgpO1xufVxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgUmVmZXJyZXIgUG9saWN5IEFQSVxuICoge0BsaW5rIHN1cHBvcnRzUmVmZXJyZXJQb2xpY3l9LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c1JlZmVycmVyUG9saWN5KCkge1xuICAgIC8vIERlc3BpdGUgYWxsIHN0YXJzIGluIHRoZSBza3kgc2F5aW5nIHRoYXQgRWRnZSBzdXBwb3J0cyBvbGQgZHJhZnQgc3ludGF4LCBha2EgJ25ldmVyJywgJ2Fsd2F5cycsICdvcmlnaW4nIGFuZCAnZGVmYXVsdFxuICAgIC8vIGh0dHBzOi8vY2FuaXVzZS5jb20vI2ZlYXQ9cmVmZXJyZXItcG9saWN5XG4gICAgLy8gSXQgZG9lc24ndC4gQW5kIGl0IHRocm93IGV4Y2VwdGlvbiBpbnN0ZWFkIG9mIGlnbm9yaW5nIHRoaXMgcGFyYW1ldGVyLi4uXG4gICAgLy8gUkVGOiBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3JhdmVuLWpzL2lzc3Vlcy8xMjMzXG4gICAgaWYgKCFzdXBwb3J0c0ZldGNoKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtZXhwcmVzc2lvblxuICAgICAgICBuZXcgUmVxdWVzdCgnXycsIHtcbiAgICAgICAgICAgIHJlZmVycmVyUG9saWN5OiAnb3JpZ2luJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgSGlzdG9yeSBBUElcbiAqIHtAbGluayBzdXBwb3J0c0hpc3Rvcnl9LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0hpc3RvcnkoKSB7XG4gICAgLy8gTk9URTogaW4gQ2hyb21lIEFwcCBlbnZpcm9ubWVudCwgdG91Y2hpbmcgaGlzdG9yeS5wdXNoU3RhdGUsICpldmVuIGluc2lkZVxuICAgIC8vICAgICAgIGEgdHJ5L2NhdGNoIGJsb2NrKiwgd2lsbCBjYXVzZSBDaHJvbWUgdG8gb3V0cHV0IGFuIGVycm9yIHRvIGNvbnNvbGUuZXJyb3JcbiAgICAvLyBib3Jyb3dlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL3B1bGwvMTM5NDUvZmlsZXNcbiAgICB2YXIgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG4gICAgdmFyIGNocm9tZSA9IGdsb2JhbC5jaHJvbWU7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVuc2FmZS1hbnlcbiAgICB2YXIgaXNDaHJvbWVQYWNrYWdlZEFwcCA9IGNocm9tZSAmJiBjaHJvbWUuYXBwICYmIGNocm9tZS5hcHAucnVudGltZTtcbiAgICB2YXIgaGFzSGlzdG9yeUFwaSA9ICdoaXN0b3J5JyBpbiBnbG9iYWwgJiYgISFnbG9iYWwuaGlzdG9yeS5wdXNoU3RhdGUgJiYgISFnbG9iYWwuaGlzdG9yeS5yZXBsYWNlU3RhdGU7XG4gICAgcmV0dXJuICFpc0Nocm9tZVBhY2thZ2VkQXBwICYmIGhhc0hpc3RvcnlBcGk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdXBwb3J0cy5qcy5tYXAiLCJpbXBvcnQgeyBpc1RoZW5hYmxlIH0gZnJvbSAnLi9pcyc7XG4vKiogU3luY1Byb21pc2UgaW50ZXJuYWwgc3RhdGVzICovXG52YXIgU3RhdGVzO1xuKGZ1bmN0aW9uIChTdGF0ZXMpIHtcbiAgICAvKiogUGVuZGluZyAqL1xuICAgIFN0YXRlc1tcIlBFTkRJTkdcIl0gPSBcIlBFTkRJTkdcIjtcbiAgICAvKiogUmVzb2x2ZWQgLyBPSyAqL1xuICAgIFN0YXRlc1tcIlJFU09MVkVEXCJdID0gXCJSRVNPTFZFRFwiO1xuICAgIC8qKiBSZWplY3RlZCAvIEVycm9yICovXG4gICAgU3RhdGVzW1wiUkVKRUNURURcIl0gPSBcIlJFSkVDVEVEXCI7XG59KShTdGF0ZXMgfHwgKFN0YXRlcyA9IHt9KSk7XG4vKipcbiAqIFRoZW5hYmxlIGNsYXNzIHRoYXQgYmVoYXZlcyBsaWtlIGEgUHJvbWlzZSBhbmQgZm9sbG93cyBpdCdzIGludGVyZmFjZVxuICogYnV0IGlzIG5vdCBhc3luYyBpbnRlcm5hbGx5XG4gKi9cbnZhciBTeW5jUHJvbWlzZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTeW5jUHJvbWlzZShleGVjdXRvcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IFN0YXRlcy5QRU5ESU5HO1xuICAgICAgICB0aGlzLl9oYW5kbGVycyA9IFtdO1xuICAgICAgICAvKiogSlNEb2MgKi9cbiAgICAgICAgdGhpcy5fcmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgX3RoaXMuX3NldFJlc3VsdChTdGF0ZXMuUkVTT0xWRUQsIHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqIEpTRG9jICovXG4gICAgICAgIHRoaXMuX3JlamVjdCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgIF90aGlzLl9zZXRSZXN1bHQoU3RhdGVzLlJFSkVDVEVELCByZWFzb24pO1xuICAgICAgICB9O1xuICAgICAgICAvKiogSlNEb2MgKi9cbiAgICAgICAgdGhpcy5fc2V0UmVzdWx0ID0gZnVuY3Rpb24gKHN0YXRlLCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKF90aGlzLl9zdGF0ZSAhPT0gU3RhdGVzLlBFTkRJTkcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNUaGVuYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZS50aGVuKF90aGlzLl9yZXNvbHZlLCBfdGhpcy5fcmVqZWN0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5fc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgICAgIF90aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgX3RoaXMuX2V4ZWN1dGVIYW5kbGVycygpO1xuICAgICAgICB9O1xuICAgICAgICAvLyBUT0RPOiBGSVhNRVxuICAgICAgICAvKiogSlNEb2MgKi9cbiAgICAgICAgdGhpcy5fYXR0YWNoSGFuZGxlciA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBfdGhpcy5faGFuZGxlcnMgPSBfdGhpcy5faGFuZGxlcnMuY29uY2F0KGhhbmRsZXIpO1xuICAgICAgICAgICAgX3RoaXMuX2V4ZWN1dGVIYW5kbGVycygpO1xuICAgICAgICB9O1xuICAgICAgICAvKiogSlNEb2MgKi9cbiAgICAgICAgdGhpcy5fZXhlY3V0ZUhhbmRsZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKF90aGlzLl9zdGF0ZSA9PT0gU3RhdGVzLlBFTkRJTkcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY2FjaGVkSGFuZGxlcnMgPSBfdGhpcy5faGFuZGxlcnMuc2xpY2UoKTtcbiAgICAgICAgICAgIF90aGlzLl9oYW5kbGVycyA9IFtdO1xuICAgICAgICAgICAgY2FjaGVkSGFuZGxlcnMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyLmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX3N0YXRlID09PSBTdGF0ZXMuUkVTT0xWRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIub25mdWxmaWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIub25mdWxmaWxsZWQoX3RoaXMuX3ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX3N0YXRlID09PSBTdGF0ZXMuUkVKRUNURUQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIub25yZWplY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5vbnJlamVjdGVkKF90aGlzLl92YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlci5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXhlY3V0b3IodGhpcy5fcmVzb2x2ZSwgdGhpcy5fcmVqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5fcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBKU0RvYyAqL1xuICAgIFN5bmNQcm9taXNlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICdbb2JqZWN0IFN5bmNQcm9taXNlXSc7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBTeW5jUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3luY1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIFN5bmNQcm9taXNlLnJlamVjdCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZShmdW5jdGlvbiAoXywgcmVqZWN0KSB7XG4gICAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBTeW5jUHJvbWlzZS5hbGwgPSBmdW5jdGlvbiAoY29sbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKFwiUHJvbWlzZS5hbGwgcmVxdWlyZXMgYW4gYXJyYXkgYXMgaW5wdXQuXCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29sbGVjdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY291bnRlciA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIHJlc29sdmVkQ29sbGVjdGlvbiA9IFtdO1xuICAgICAgICAgICAgY29sbGVjdGlvbi5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgICAgICAgICAgICAgIFN5bmNQcm9taXNlLnJlc29sdmUoaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkQ29sbGVjdGlvbltpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlciAtPSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRlciAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzb2x2ZWRDb2xsZWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbihudWxsLCByZWplY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgU3luY1Byb21pc2UucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbiAob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBfdGhpcy5fYXR0YWNoSGFuZGxlcih7XG4gICAgICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgb25mdWxmaWxsZWQ6IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvbmZ1bGZpbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogwq9cXF8o44OEKV8vwq9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEZJWE1FXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob25mdWxmaWxsZWQocmVzdWx0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25yZWplY3RlZDogZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9ucmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG9ucmVqZWN0ZWQocmVhc29uKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBTeW5jUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2ggPSBmdW5jdGlvbiAob25yZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIHZhbDsgfSwgb25yZWplY3RlZCk7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBTeW5jUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseSA9IGZ1bmN0aW9uIChvbmZpbmFsbHkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgdmFsO1xuICAgICAgICAgICAgdmFyIGlzUmVqZWN0ZWQ7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpc1JlamVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdmFsID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKG9uZmluYWxseSkge1xuICAgICAgICAgICAgICAgICAgICBvbmZpbmFsbHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgaXNSZWplY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFsID0gcmVhc29uO1xuICAgICAgICAgICAgICAgIGlmIChvbmZpbmFsbHkpIHtcbiAgICAgICAgICAgICAgICAgICAgb25maW5hbGx5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFN5bmNQcm9taXNlO1xufSgpKTtcbmV4cG9ydCB7IFN5bmNQcm9taXNlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zeW5jcHJvbWlzZS5qcy5tYXAiLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUocmVzdWx0LnZhbHVlKTsgfSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgZXhwb3J0cykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAoIWV4cG9ydHMuaGFzT3duUHJvcGVydHkocCkpIGV4cG9ydHNbcF0gPSBtW3BdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcclxuICAgIHJlc3VsdC5kZWZhdWx0ID0gbW9kO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcmlnaW5hbE1vZHVsZSkge1xuXHRpZiAoIW9yaWdpbmFsTW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuXHRcdHZhciBtb2R1bGUgPSBPYmplY3QuY3JlYXRlKG9yaWdpbmFsTW9kdWxlKTtcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcblx0XHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJleHBvcnRzXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWVcblx0XHR9KTtcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcblx0fVxuXHRyZXR1cm4gbW9kdWxlO1xufTtcbiIsIi8qKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogIERlcGVuZGVuY2llc1xuICogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG4vLyBXZSBmaXJzdCBpbXBvcnQgU2VudHJ5IGFuZCB0cmlnZ2VyIGl0IGlmIHRoZSBzZW50cnkgZHNuIGlzIGRlZmluZWRcbi8vIEJlY2F1c2UgdGhlbiBhbGwgZXJyb3JzIGFyZSBsb2dnZWRcbmltcG9ydCAqIGFzIFNlbnRyeSBmcm9tICdAc2VudHJ5L2Jyb3dzZXInO1xuaWYod2luZG93LnNlbnRyeV9kc24gIT09IHVuZGVmaW5lZCkgU2VudHJ5LmluaXQoeyBkc246IHdpbmRvdy5zZW50cnlfZHNuIH0pO1xuXG4vKipcbiAqIEV4dGVybmFsXG4gKi9cbnJlcXVpcmUoJ2hhbW1lcmpzJyk7XG5yZXF1aXJlKCdvYmplY3RGaXRQb2x5ZmlsbCcpO1xuXG4vKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqICBHbG9iYWwgZnVuY3Rpb25hbGl0aWVzXG4gKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbnJlcXVpcmUoJy4vZ2xvYmFsL2hlbHBlcnMnKTsgLy8gU2hvdWxkIGJlIGZpcnN0XG5yZXF1aXJlKCcuL2dsb2JhbC9icm93c2VySGFuZGxlcicpO1xucmVxdWlyZSgnLi9nbG9iYWwvc2Nyb2xsSGFuZGxlcicpO1xuXG5cbi8qKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogIENvbXBvbmVudCBmdW5jdGlvbmFsaXRpZXNcbiAqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxucmVxdWlyZSgnLi9jb21wb25lbnRzL2Nob2NvbGF0ZUZhY3RvcnknKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jb29raWVIYW5kbGVyJyk7XG4vLyByZXF1aXJlKCcuL2NvbXBvbmVudHMvSW5wdXRIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvbWFwc0hhbmRsZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9vdmVybGF5TWVudUhhbmRsZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9zY3JvbGxUb0hhbmRsZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9zbGlkZXJIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdGFic0hhbmRsZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy95b3V0dWJlSGFuZGxlcicpOyIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gfCBQcmV2ZW50IEJvdHMgaGFuZGxlclxuIHxcbiB8IFdlIG5hbWVkIHRoaXMgY2hvY29sYXRlIGZhY3RvcnkgYW5kIGJlbG9uZ2luZyBjb25mdXNpbmcganMgaG9va3NcbiB8IHRvIHByZXZlbnQgc21hcnQgYm90cyBmcm9tIGJsb2NraW5nIHRoZXNlIHZhcmlhYmxlIG9yIGZ1bmN0aW9ucy5cbiB8XG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuY29uc3QgQ2hvY29sYXRlRmFjdG9yeSA9IHtcblxuICAgIGJhbm5lZFZpc2l0b3I6IFtdLFxuXG4gICAgLyoqIEdldCBhbGwgdGhlIGNob2NvbGF0ZSBmYWN0b3J5IGFuZCBzdGFydFxuICAgICAqICBMb29waW5nIHRocm91Z2ggdGhvc2Ugc3RhcnQgZmxhc2hpbmcgdGlja2V0c1xuICAgICAqL1xuICAgIGVudGVyOiBmdW5jdGlvbigpXG4gICAge1xuXG4gICAgICAgIGNvbnN0IGNob2NvbGF0ZUZhY3RvcmllcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1jaG9jb2xhdGUtZmFjdG9yeScpO1xuXG4gICAgICAgIGlmKGlzc2V0KGNob2NvbGF0ZUZhY3Rvcmllcykpe1xuXG4gICAgICAgICAgICBjb25zdCBhbW91bnRPZkNob2NvbGF0ZUZhY3RvcmllcyA9IGNob2NvbGF0ZUZhY3Rvcmllcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgYW1vdW50T2ZDaG9jb2xhdGVGYWN0b3JpZXM7IGkrKyl7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBDaG9jb2xhdGVCYXIgPSBjaG9jb2xhdGVGYWN0b3JpZXNbaV07XG4gICAgICAgICAgICAgICAgQ2hvY29sYXRlRmFjdG9yeS5fZmxhc2hUaWNrZXQoQ2hvY29sYXRlQmFyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJZiBmYWN0b3J5IGhhcyBhIGdvbGRlbiB0aWNrZXRcbiAgICAgKiBUaGVuIHdlIGNhbiBtYWtlIHRoZW0gZ28gb24gdGhlIHRvdXIgaWYgdGhlcmUgaGFzIGJlZW4gY2xpY2sgb24gdGhlIHRpY2tldFxuICAgICAqXG4gICAgICogQHBhcmFtIGNob2NvbGF0ZUJhclxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2ZsYXNoVGlja2V0OiBmdW5jdGlvbiAoY2hvY29sYXRlQmFyKSB7XG5cbiAgICAgICAgLy8gVHJ5IGdldCB0aGUgdGlja2V0IGZyb20gdGhlIGNob2NvbGF0ZUJhclxuICAgICAgICBjb25zdCBnb2xkZW5UaWNrZXQgPSBjaG9jb2xhdGVCYXIucXVlcnlTZWxlY3RvcignLmpzLWdvbGRlbi10aWNrZXQnKTtcblxuICAgICAgICAvLyBPbmx5IGNvbnRpbnVlIGlmIGNob2NvbGF0ZSBiYXIgaGFzIGEgZ29sZGVuIHRpY2tldFxuICAgICAgICBpZihpc3NldChnb2xkZW5UaWNrZXQpKXtcblxuICAgICAgICAgICAgZ29sZGVuVGlja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIENob2NvbGF0ZUZhY3RvcnkuZW5qb3lUaGVUb3VyKGNob2NvbGF0ZUJhcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1RvIGJhZCwgbm8gZ29sZGVuIHRpY2tldHMgaGFzIGJlZW4gZm91bmQuJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgdGhlIHRvdXIgdGhyb3VnaCB0aGUgZmFjdG9yeVxuICAgICAqIEFuZCBnZXQgdGhlIG5hbWVzIGFuZCBwcm9wZXJ0aWVzIG9mIHRoZSBtZW1iZXJzIG9mIHRoZSBncm91cFxuICAgICAqIElmIHRoZXJlIGFyZSBtZW1iZXJzIGluIHRoZSBncm91cCBvZiBjb3Vyc2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaG9jb2xhdGVGYWN0b3J5XG4gICAgICovXG4gICAgZW5qb3lUaGVUb3VyKGNob2NvbGF0ZUZhY3Rvcnkpe1xuXG4gICAgICAgIC8vIEFzayBmb3IgdGhlIHRvdXIgZ3JvdXBcbiAgICAgICAgY29uc3QgdG91ckdyb3VwID0gY2hvY29sYXRlRmFjdG9yeS5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgdGV4dGFyZWEnKTtcblxuICAgICAgICBpZihpc3NldCh0b3VyR3JvdXApKXtcblxuICAgICAgICAgICAgLy8gRm9yIGVhY2ggdmlzaXRvciB3ZSB3YW50IGEgYmVsb25naW5nIE9vbXBhIExvb21wYVxuICAgICAgICAgICAgbGV0IG9vbXBhTG9vbXBhcyA9IHt9O1xuICAgICAgICAgICAgbGV0IGFtb3VudE9mT29tcGFMb29tcGFzID0gMDtcblxuICAgICAgICAgICAgY29uc3QgdG91ckdyb3VwU2l6ZSA9IHRvdXJHcm91cC5sZW5ndGg7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdG91ckdyb3VwU2l6ZTsgaSsrKXtcblxuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdmlzaXRvciBmcm9tIHRoZSBncm91cFxuICAgICAgICAgICAgICAgIGNvbnN0IHZpc2l0b3IgPSB0b3VyR3JvdXBbaV07XG5cbiAgICAgICAgICAgICAgICAvLyBBc2sgZm9yIGl0cyBuYW1lXG4gICAgICAgICAgICAgICAgY29uc3QgdmlzaXRvck5hbWUgPSB2aXNpdG9yLmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZpc2l0b3IgaXMgYmFubmVkXG4gICAgICAgICAgICAgICAgaWYoIENob2NvbGF0ZUZhY3RvcnkuX2lzVmlzaXRvckJhbm5lZCh2aXNpdG9yTmFtZSkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgb29tcGFMb29tcGFzWyB2aXNpdG9yTmFtZSBdID0gQ2hvY29sYXRlRmFjdG9yeS5fZ2V0QXJyYW5nZW1lbnQodmlzaXRvcik7XG4gICAgICAgICAgICAgICAgYW1vdW50T2ZPb21wYUxvb21wYXMrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGluc3VyYW5jZSB0aGF0IHRoZXJlIGFyZSBvb21wYSBsb29tcGFzXG4gICAgICAgICAgICBpZihhbW91bnRPZk9vbXBhTG9vbXBhcyA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHN1Ym1pdCByZXF1ZXN0XG4gICAgICAgICAgICBDaG9jb2xhdGVGYWN0b3J5Ll9maW5pc2hUb3VyKG9vbXBhTG9vbXBhcywgY2hvY29sYXRlRmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdUbyBiYWQsIG5vIG1lbWJlcnMgdG8gdmlzaXQgdGhpcyBmYWN0b3J5JylcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgdmlzaXRvciBuYW1lIGlzbid0IGFsbG93XG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmlzaXRvck5hbWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9pc1Zpc2l0b3JCYW5uZWQ6IGZ1bmN0aW9uKHZpc2l0b3JOYW1lKXtcbiAgICAgICAgaWYoQ2hvY29sYXRlRmFjdG9yeS5iYW5uZWRWaXNpdG9yLmluZGV4T2YodmlzaXRvck5hbWUpICE9PSAtMSl7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE1vc3QgZ2V0IHZpc2l0b3IgaGF2ZSBhIG5vcm1hbCBhcnJhbmdlbWVudFxuICAgICAqIEJ1dCBzb21ldGltZXMgdGhlcmUgYXJlIHNwZWNpYWwgY2FzZXNcbiAgICAgKiBMaWtlIGEgU2VsZWN0b3Igb3IgY2hlY2tib3hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2aXNpdG9yXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZ2V0QXJyYW5nZW1lbnQ6IGZ1bmN0aW9uKHZpc2l0b3IpXG4gICAge1xuXG4gICAgICAgIGNvbnN0IHZpc2l0b3JUeXBlID0gdmlzaXRvci5ub2RlTmFtZTtcblxuICAgICAgICBzd2l0Y2ggKHZpc2l0b3JUeXBlKSB7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZhbHVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmlzaCB0aGUgdG91clxuICAgICAqIElmIHN1Y2Nlc3NmdWwgc2hvdyB0aGFua3MgbWVzc2FnZVxuICAgICAqIE9yIHNob3cgZGVmaW5lZCBlcnJvciBtZXNzYWdlIG9yIGZhbGxiYWNrXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXBcbiAgICAgKiBAcGFyYW0gY2hvY29sYXRlRmFjdG9yeVxuICAgICAqIEByZXR1cm5zIHsqfHZvaWR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZmluaXNoVG91cjogZnVuY3Rpb24oZ3JvdXAsIGNob2NvbGF0ZUZhY3RvcnkpXG4gICAge1xuICAgICAgICAvLyBBZGQgd2lsbGllIHRvIHRoZSBncm91cFxuICAgICAgICBncm91cCA9IENob2NvbGF0ZUZhY3RvcnkuX2FkZFdpbGxpZVdvbmthKGdyb3VwKTtcblxuICAgICAgICAvLyBHZXQgdGhlIGdhdGUgZm9yIGZpbmlzaCB0aGUgdG91clxuICAgICAgICBjb25zdCBnYXRlID0gJy9jb250YWN0L3Byb2Nlc3MnO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBBamF4LnBvc3QoZ2F0ZSwgZ3JvdXAsIGZ1bmN0aW9uIChIdHRwUmVxdWVzdCkge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKEh0dHBSZXF1ZXN0LnJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAoSHR0cFJlcXVlc3Quc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENob2NvbGF0ZUZhY3RvcnkuX3RoYW5rc0ZvclZpc2l0aW5nKHJlc3BvbnNlLnJlZGlyZWN0VXJsKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2hvY29sYXRlRmFjdG9yeS5fZ2l2ZUZlZWRiYWNrVG9NZW1iZXJzKHJlc3BvbnNlLmVycm9ycywgY2hvY29sYXRlRmFjdG9yeSk7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gQ2hvY29sYXRlRmFjdG9yeS5fdW5rbm93bkdhcEluRmFjdG9yeShjaG9jb2xhdGVGYWN0b3J5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gQ2hvY29sYXRlRmFjdG9yeS5fdW5rbm93bkdhcEluRmFjdG9yeShjaG9jb2xhdGVGYWN0b3J5KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgd2lsbGllIHdvbmthIHRvIHRoZSBncm91cFxuICAgICAqIFBzLi4uIGl0IGFjdHVhbGx5IHRoZSBzZWNyZXQgY29kZSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBncm91cFxuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2FkZFdpbGxpZVdvbmthOiBmdW5jdGlvbihncm91cCl7XG4gICAgICAgIGdyb3VwLl93aWxsaWUgPSAnd29ua2EnO1xuICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCB0aGUgZmVlZGJhY2sgdG8gdGhlIGRlc2lyZWQgYXJlYS5cbiAgICAgKiBNb3N0IGxpa2VseSB0byB0aGUgdmlzaXRvciBkaXJlY3RseSwgYnV0IHNvbWV0aW1lIHRvIHRoZSBmYWN0b3J5IGRlc2lyZWQgZmVlZGJhY2sgYXJlYVxuICAgICAqXG4gICAgICogQHBhcmFtIGVycm9yc1xuICAgICAqIEBwYXJhbSBjaG9jb2xhdGVGYWN0b3J5XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZ2l2ZUZlZWRiYWNrVG9NZW1iZXJzOiBmdW5jdGlvbihlcnJvcnMsIGNob2NvbGF0ZUZhY3Rvcnkpe1xuXG4gICAgICAgIC8vIEdyYWIgdGhlIGZhY3RvcnkgZmVlZGJhY2sgYXJlYVxuICAgICAgICBjb25zdCBmZWVkYmFja0FyZWEgPSBjaG9jb2xhdGVGYWN0b3J5LnF1ZXJ5U2VsZWN0b3IoJy5qcy1lcnJvci1hcmVhJyk7XG5cbiAgICAgICAgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgaHRtbFxuICAgICAgICBpZihpc3NldChmZWVkYmFja0FyZWEpKSBmZWVkYmFja0FyZWEuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgLy8gQ2xlYXIgdGhlIHByZXZpb3VzIG1hcmtlZCBqYWNrZXRzXG4gICAgICAgIENob2NvbGF0ZUZhY3RvcnkuX2NsZWFyUHJldmlvdXNNYXJrZWRKYWNrZXRzKGNob2NvbGF0ZUZhY3RvcnkpO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGVycm9ycykuZm9yRWFjaChmdW5jdGlvbih2aXNpdG9yKSB7XG5cbiAgICAgICAgICAgIGxldCBqYWNrZXQgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHZpc2l0b3JGZWVkYmFja0FyZWEgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBIb25leSBlbGVtZW50cyBkb2Vzbid0IGhhcyBhIGFjY2Vzc2libGUgZWxlbWVudFxuICAgICAgICAgICAgaWYodmlzaXRvciAhPT0gJ19ob25leScgJiYgdmlzaXRvciAhPT0gJ19zZWNyZXRDb2RlJykge1xuXG4gICAgICAgICAgICAgICAgLy8gR3JhYiB0aGUgdmlzaXRvclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpc2l0b3JOb2RlID0gY2hvY29sYXRlRmFjdG9yeS5xdWVyeVNlbGVjdG9yKCcjJyArIHZpc2l0b3IpO1xuXG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgamFja2V0IG9mIGEgdmlzaXRvclxuICAgICAgICAgICAgICAgIGphY2tldCA9IENob2NvbGF0ZUZhY3RvcnkuX2dyYWJWaXNpdG9ySmFja2V0KHZpc2l0b3JOb2RlKTtcblxuICAgICAgICAgICAgICAgIC8vIElmIGZvdW5kIGdldCB0aGUgZGVzaXJlZCBhcmVhXG4gICAgICAgICAgICAgICAgaWYoaXNzZXQoamFja2V0KSkgdmlzaXRvckZlZWRiYWNrQXJlYSA9IGphY2tldC5xdWVyeVNlbGVjdG9yKCcuanMtZm9ybS1ncm91cC1lcnJvcicpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgaHRtbFxuICAgICAgICAgICAgICAgIGlmKGlzc2V0KHZpc2l0b3JGZWVkYmFja0FyZWEpKSB2aXNpdG9yRmVlZGJhY2tBcmVhLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgZmVlZGJhY2sgZm9yIHRoaXMgdmlzaXRvclxuICAgICAgICAgICAgY29uc3QgdmlzaXRvckZlZWRiYWNrID0gZXJyb3JzW3Zpc2l0b3JdO1xuXG4gICAgICAgICAgICAvLyBTcGl0IG91dCBlYWNoIGxpbmVcbiAgICAgICAgICAgIGNvbnN0IHZpc2l0b3JGZWVkYmFja0Ftb3VudCA9IHZpc2l0b3JGZWVkYmFjay5sZW5ndGg7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdmlzaXRvckZlZWRiYWNrQW1vdW50OyBpKyspe1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpc2l0b3JGZWVkYmFja0xpbmUgPSB2aXNpdG9yRmVlZGJhY2tbaV07XG5cbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh2aXNpdG9yLCB2aXNpdG9yRmVlZGJhY2tMaW5lKTtcblxuICAgICAgICAgICAgICAgIC8vIEhvbmV5IGVsZW1lbnRzIGRvZXNuJ3QgaGFzIGEgYWNjZXNzaWJsZSBlbGVtZW50IGFyZWFcbiAgICAgICAgICAgICAgICBpZih2aXNpdG9yICE9PSAnX2hvbmV5JyAmJiB2aXNpdG9yICE9PSAnX3NlY3JldENvZGUnKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTWFyayB0aGUgamFja2V0XG4gICAgICAgICAgICAgICAgICAgIGlmKGlzc2V0KGphY2tldCkpIGphY2tldC5jbGFzc0xpc3QuYWRkKCdoYXMtZXJyb3InKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgZmVlZGJhY2sgdG8gdmlzaXRvciBmZWVkYmFjayBhcmVhIGlmIGRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgaWYoaXNzZXQodmlzaXRvckZlZWRiYWNrQXJlYSkgJiYgdmlzaXRvckZlZWRiYWNrTGluZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudEZlZWRiYWNrQXJlYSA9IHZpc2l0b3JGZWVkYmFja0FyZWEuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZlZWRiYWNrQXJlYSArPSAnPHNwYW4+JyArIGNhcGl0YWxpemVGaXJzdExldHRlcih2aXNpdG9yRmVlZGJhY2tMaW5lKSArICc8L3NwYW4+JztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3JGZWVkYmFja0FyZWEuaW5uZXJIVE1MID0gY3VycmVudEZlZWRiYWNrQXJlYTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBmZWVkYmFjayB0byBmYWN0b3J5IGZlZWRiYWNrIGFyZWEgaWYgZGVmaW5lZFxuICAgICAgICAgICAgICAgIGlmKGlzc2V0KGZlZWRiYWNrQXJlYSkgJiYgdmlzaXRvckZlZWRiYWNrTGluZS5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRGZWVkYmFja0FyZWEgPSBmZWVkYmFja0FyZWEuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmVlZGJhY2tBcmVhICs9ICc8bGk+JyArIGNhcGl0YWxpemVGaXJzdExldHRlcih2aXNpdG9yRmVlZGJhY2tMaW5lKSArICc8L2xpPic7XG4gICAgICAgICAgICAgICAgICAgIGZlZWRiYWNrQXJlYS5pbm5lckhUTUwgPSBjdXJyZW50RmVlZGJhY2tBcmVhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENsZWFyIHRoZSBwcmV2aW91cyBtYXJrZWQgamFja2V0c1xuICAgICAqXG4gICAgICogQHBhcmFtIGNob2NvbGF0ZUZhY3RvcnlcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9jbGVhclByZXZpb3VzTWFya2VkSmFja2V0cyhjaG9jb2xhdGVGYWN0b3J5KSB7XG5cbiAgICAgICAgY29uc3QgbWFya2VkSmFja2V0cyA9IGNob2NvbGF0ZUZhY3RvcnkucXVlcnlTZWxlY3RvckFsbCgnLmhhcy1lcnJvcicpO1xuICAgICAgICBjb25zdCBtYXJrZWRKYWNrZXRzQW1vdW50ID0gbWFya2VkSmFja2V0cy5sZW5ndGg7XG5cbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IG1hcmtlZEphY2tldHNBbW91bnQ7IGkrKyl7XG4gICAgICAgICAgICBtYXJrZWRKYWNrZXRzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2hhcy1lcnJvcicpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdyYWIgdGhlIGphY2tldCBvZiB0aGUgdmlzaXRvclxuICAgICAqXG4gICAgICogQHBhcmFtIHZpc2l0b3JcbiAgICAgKiBAcmV0dXJucyB7bnVsbHwqfCgoKSA9PiAoTm9kZSB8IG51bGwpKXxBY3RpdmVYLklYTUxET01Ob2RlfChOb2RlICYgUGFyZW50Tm9kZSl9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZ3JhYlZpc2l0b3JKYWNrZXQ6IGZ1bmN0aW9uKHZpc2l0b3Ipe1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHZpc2l0b3IgaXMgZGVmaW5lZFxuICAgICAgICBpZiAoIWlzc2V0KHZpc2l0b3IpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBEbyBsb29wIHNldHRpbmdzXG4gICAgICAgIGN1cnJlbnRMYXllciA9IHZpc2l0b3I7XG4gICAgICAgIHNhZmV0eUJyZWFrID0gMDtcblxuICAgICAgICAvLyBHcmFiIHRoZSBuZXh0IGxheWVyIHRpbGwgaXQgaXMgdGhlIGphY2tldCAob3Igc2FmZXR5QnJlYWsgaGFzIGJlZW4gcmVhY2hlZFxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBzYWZldHlCcmVhaysrO1xuICAgICAgICAgICAgY3VycmVudExheWVyID0gY3VycmVudExheWVyLnBhcmVudE5vZGU7XG4gICAgICAgICAgICBpZihjdXJyZW50TGF5ZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdqcy1mb3JtLWdyb3VwJykpIHJldHVybiBjdXJyZW50TGF5ZXI7XG4gICAgICAgIH0gd2hpbGUgKGN1cnJlbnRMYXllci50YWdOYW1lICE9PSAnQk9EWScgJiYgc2FmZXR5QnJlYWsgPD0gMTApO1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZWRpcmVjdCB0aGUgdmlzaXRvciB0byB0aGUgdGhhbmtzIHBhZ2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZXh0U3RvcFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3RoYW5rc0ZvclZpc2l0aW5nOiBmdW5jdGlvbiAobmV4dFN0b3ApIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gbmV4dFN0b3A7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVua25vd24gZXJyb3Igb2NjdXJyZWQsIGxvZyB0aGUgZXJyb3JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaG9jb2xhdGVGYWN0b3J5XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdW5rbm93bkdhcEluRmFjdG9yeTogZnVuY3Rpb24gKGNob2NvbGF0ZUZhY3RvcnkpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hvY29sYXRlRmFjdG9yeSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaG9jb2xhdGVGYWN0b3J5OiBVbmtvd24gRXJyb3InKTtcbiAgICB9LFxufTtcblxuQ2hvY29sYXRlRmFjdG9yeS5lbnRlcigpOyIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBDb29raWUgaGFuZGxlclxuICAgLSBQcmltYXJ5IHVzYWdlIGZvciB0b2dnbGluZyB0aGUgY29va2llIG1lc3NhZ2UgYW5kL29yIHN3aXRjaFxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IENvb2tpZUhhbmRsZXIgPSB7XG4gICAgY29va2llQmFyIDogbnVsbCxcbiAgICBjb29raWVNZXNzYWdlIDogbnVsbCxcbiAgICBjb29raWVGYWRlT3V0QW5pbWF0aW9uRHVyYXRpb24gOiA0MDAsXG4gICAgYWNjZXB0VHJhY2tpbmcgOiBmYWxzZSxcblxuICAgIC8vIEluaXRpYWxpemUgY29va2llIGhhbmRsZXJcbiAgICBpbml0IDogZnVuY3Rpb24oKVxuICAgIHtcbiAgICAgICAgLy8gQmluZCBjb29raWUgYmFyIHRvIGNvb2tpZU1lc3NhZ2VcbiAgICAgICAgQ29va2llSGFuZGxlci5jb29raWVNZXNzYWdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWNvb2tpZS1iYXInKTtcblxuICAgICAgICAvLyBCaW5kIGNvb2tpZSBiYXIgdG8gY29va2llQmFyXG4gICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llQmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWNvb2tpZS1iYXInKTtcblxuICAgICAgICAvLyBJZiBpc3NldCBpbml0IHRoZSBmdW5jdGlvbnMgZm9yIGNvb2tpZSBiYXJcbiAgICAgICAgaWYoaXNzZXQoQ29va2llSGFuZGxlci5jb29raWVCYXIpKXtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuaW5pdENvb2tpZUJhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgZWl0aGVyIHR5cGUgb2YgY29va2llIGhhcyBiZWVuIGZvdW5kIGNoZWNrIGlmIHNldHRpbmdzIGFyZSBkZWZpbmVkXG4gICAgICAgIGlmKGlzc2V0KENvb2tpZUhhbmRsZXIuY29va2llTWVzc2FnZSkpe1xuICAgICAgICAgICAgQ29va2llSGFuZGxlci5jaGVja0ZvckNvb2tpZVNldHRpbmdzKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gSW5pdCB0aGUgY29va2llIGJhciBhY3Rpb25zXG4gICAgaW5pdENvb2tpZUJhcjogZnVuY3Rpb24oKXtcbiAgICAgICAgY29uc3QgY2xvc2VCdXR0b24gPSBDb29raWVIYW5kbGVyLmNvb2tpZUJhci5xdWVyeVNlbGVjdG9yKCcuanMtZGlzYWJsZS1jb29raWUtYmFyJyk7XG4gICAgICAgIGlmKGlzc2V0KGNsb3NlQnV0dG9uKSl7XG4gICAgICAgICAgICBjbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIENvb2tpZUhhbmRsZXIuY2xvc2VDb29raWVNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGVja0ZvckNvb2tpZVNldHRpbmdzOiBmdW5jdGlvbigpe1xuICAgICAgICBpZiAoQ29va2llLmdldCgnY29va2llTWVzc2FnZScpKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2lzLWNvb2tpZXMtYWNjZXB0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnaXMtY29va2llcy1hY2NlcHRlZCcpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNsb3NlQ29va2llTWVzc2FnZTogZnVuY3Rpb24gKCl7XG4gICAgICAgIENvb2tpZS5zZXQoJ2Nvb2tpZU1lc3NhZ2UnLCB0cnVlLCA5MCk7XG4gICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llTWVzc2FnZS5jbGFzc0xpc3QuYWRkKCdpcy10cmFuc2l0aW9uaW5nLW91dCcpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2lzLWNvb2tpZXMtYWNjZXB0ZWQnKTtcbiAgICB9LFxufTtcblxuQ29va2llSGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBHb29nbGUgTWFwcyBoYW5kbGVyXG4gICAgLSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vamF2YXNjcmlwdC9hZGRpbmctYS1nb29nbGUtbWFwXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuY29uc3QgTWFwc0hhbmRsZXIgPSB7XG5cbiAgICBtYXA6ICcnLFxuICAgIGtleTogJ0FJemFTeUNWR1BVbVJtUVJ4WHZ6eld1M1h5dTc3WGViUXhRLWY0WScsXG4gICAgbG9jYXRpb246IHtsYXQ6IDUxLjI2MTA4OSwgbG5nOiA1LjU5ODE3Mn0sXG4gICAgc3R5bGluZzogJycsXG5cbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEdldCBtYXAgYnkgaWRcbiAgICAgICAgTWFwc0hhbmRsZXIubWFwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWdvb2dsZS1tYXAnKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBhIG1hcCBpcyBkZWZpbmVkXG4gICAgICAgIGlmIChpc3NldChNYXBzSGFuZGxlci5tYXApKSB7XG5cbiAgICAgICAgICAgIGlmKE1hcHNIYW5kbGVyLm1hcC5oYXNBdHRyaWJ1dGUoJ2RhdGEtZ29vZ2xlLWxhdCcpKSBNYXBzSGFuZGxlci5sb2NhdGlvbi5sYXQgPSBwYXJzZUZsb2F0KE1hcHNIYW5kbGVyLm1hcC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZ29vZ2xlLWxhdCcpKTtcbiAgICAgICAgICAgIGlmKE1hcHNIYW5kbGVyLm1hcC5oYXNBdHRyaWJ1dGUoJ2RhdGEtZ29vZ2xlLWxuZycpKSBNYXBzSGFuZGxlci5sb2NhdGlvbi5sbmcgPSBwYXJzZUZsb2F0KE1hcHNIYW5kbGVyLm1hcC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZ29vZ2xlLWxuZycpKTtcblxuICAgICAgICAgICAgTWFwc0hhbmRsZXIuc2V0Q3VzdG9tU3R5bGluZygpO1xuXG4gICAgICAgICAgICAvLyBTZWUgaWYgZ29vZ2xlIHZhcmlhYmxlIGV4aXN0c1xuICAgICAgICAgICAgaWYgKHR5cGVvZihnb29nbGUpID09ICd1bmRlZmluZWQnIHx8IHR5cGVvZihnb29nbGUubWFwcykgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBMb2FkIGV4dGVybmFsIHNjcmlwdFxuICAgICAgICAgICAgICAgIGdldFNjcmlwdCgnaHR0cHM6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2pzP2tleT0nICsgTWFwc0hhbmRsZXIua2V5LCBNYXBzSGFuZGxlci5kcmF3TWFwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgTWFwc0hhbmRsZXIuZHJhd01hcCgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBkcmF3TWFwOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG1hcFxuICAgICAgICBsZXQgbWFwID0gbmV3IGdvb2dsZS5tYXBzLk1hcChNYXBzSGFuZGxlci5tYXAsIHtcbiAgICAgICAgICAgIHpvb206IDE0LFxuICAgICAgICAgICAgY2VudGVyOiBNYXBzSGFuZGxlci5sb2NhdGlvbixcbiAgICAgICAgICAgIGRpc2FibGVEZWZhdWx0VUk6IHRydWUsXG4gICAgICAgICAgICBzdHlsZXM6IE1hcHNIYW5kbGVyLnN0eWxpbmdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIGNvbnRlbnRTdHJpbmcgPSAnPGRpdj48cD5QbGFuIGVlbiByb3V0ZSBvcCAnK1xuICAgICAgICAgICAgJzxhIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCJodHRwczovL3d3dy5nb29nbGUuY29tL21hcHMvZGlyLz9hcGk9MSZkZXN0aW5hdGlvbj0nICsgTWFwc0hhbmRsZXIubG9jYXRpb24ubGF0ICsgJywnICsgTWFwc0hhbmRsZXIubG9jYXRpb24ubG5nICsnXCIgY2xhc3M9XCJsaW5rXCI+JytcbiAgICAgICAgICAgICdnb29nbGUgbWFwczwvYT4gJytcbiAgICAgICAgICAgICc8L3A+PC9kaXY+JztcblxuICAgICAgICB2YXIgaW5mb3dpbmRvdyA9IG5ldyBnb29nbGUubWFwcy5JbmZvV2luZG93KHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnRTdHJpbmdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQWRkIGEgbWFya2VyXG4gICAgICAgIGxldCBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBNYXBzSGFuZGxlci5sb2NhdGlvbixcbiAgICAgICAgICAgIG1hcDogbWFwLFxuICAgICAgICAgICAgLy8gbGFiZWw6ICdBJ1xuICAgICAgICB9KTtcblxuICAgICAgICBtYXJrZXIuYWRkTGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpbmZvd2luZG93Lm9wZW4obWFwLCBtYXJrZXIpO1xuICAgICAgICB9KTtcblxuICAgIH0sXG5cbiAgICBzZXRDdXN0b21TdHlsaW5nOiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgTWFwc0hhbmRsZXIuc3R5bGluZyA9XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwid2F0ZXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNlOWU5ZTlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiAxN1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJsYW5kc2NhcGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmNWY1ZjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiAyMFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmhpZ2h3YXlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2ZmZmZmZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IDE3XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInJvYWQuaGlnaHdheVwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuc3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmZmZmZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiAyOVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIndlaWdodFwiOiAwLjJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZC5hcnRlcmlhbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2ZmZmZmZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IDE4XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInJvYWQubG9jYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmZmZmZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiAxNlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJwb2lcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmNWY1ZjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiAyMVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJwb2kucGFya1wiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2RlZGVkZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IDIxXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImxhYmVscy50ZXh0LnN0cm9rZVwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidmlzaWJpbGl0eVwiOiBcIm9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmZmZmZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiAxNlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJsYWJlbHMudGV4dC5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzYXR1cmF0aW9uXCI6IDM2XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjMzMzMzMzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogNDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwibGFiZWxzLmljb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZpc2liaWxpdHlcIjogXCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJ0cmFuc2l0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeVwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjZjJmMmYyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogMTlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwiYWRtaW5pc3RyYXRpdmVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2ZlZmVmZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IDIwXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcImFkbWluaXN0cmF0aXZlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5zdHJva2VcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2ZlZmVmZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IDE3XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwid2VpZ2h0XCI6IDEuMlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXTtcblxuICAgIH1cbn07XG5cbk1hcHNIYW5kbGVyLmluaXQoKTsiLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgTmF2aWdhdGlvbiBoYW5kbGVyXG4gICAtIEhhbmRsZXMgdGhlIHNob3dpbmcgYW5kIGhpZGluZyBvZiB0aGUgb3ZlcmxheS1tZW51IGNvbXBvbmVudCB3aGljaCBoYXMgdGhlIHByb3BlciBjbGFzc2VzLlxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IGJvZHlTY3JvbGxMb2NrID0gcmVxdWlyZSgnYm9keS1zY3JvbGwtbG9jaycpO1xuXG5jb25zdCBPdmVybGF5TWVudUhhbmRsZXIgPSB7XG5cbiAgICAvLyBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gICAgIGNvbnN0IG92ZXJsYXlNZW51VHJpZ2dlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1vdmVybGF5LW1lbnUtdHJpZ2dlcicpO1xuICAgIC8vICAgICBPdmVybGF5TWVudUhhbmRsZXIuaW5pdE92ZXJsYXlNZW51KG92ZXJsYXlNZW51VHJpZ2dlcik7XG4gICAgLy8gfSxcblxuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBjb25zdCBvdmVybGF5TWVudVRyaWdnZXJMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLW92ZXJsYXktbWVudS10cmlnZ2VyJyk7XG4gICAgICAgIGNvbnN0IG92ZXJsYXlNZW51VHJpZ2dlckxpc3RDb3VudCA9IG92ZXJsYXlNZW51VHJpZ2dlckxpc3QubGVuZ3RoO1xuXG4gICAgICAgIGlmKGlzc2V0KG92ZXJsYXlNZW51VHJpZ2dlckxpc3QpICYmIG92ZXJsYXlNZW51VHJpZ2dlckxpc3RDb3VudCAhPT0gMCl7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgb3ZlcmxheU1lbnVUcmlnZ2VyTGlzdENvdW50OyBpKyspe1xuICAgICAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlNZW51VHJpZ2dlciA9IG92ZXJsYXlNZW51VHJpZ2dlckxpc3RbaV07XG4gICAgICAgICAgICAgICAgT3ZlcmxheU1lbnVIYW5kbGVyLmluaXRPdmVybGF5TWVudShvdmVybGF5TWVudVRyaWdnZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGluaXRPdmVybGF5TWVudTogZnVuY3Rpb24gKG92ZXJsYXlNZW51VHJpZ2dlcikge1xuICAgICAgICBvdmVybGF5TWVudVRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBPdmVybGF5TWVudUhhbmRsZXIudG9nZ2xlT3ZlcmxheU1lbnUsIGZhbHNlKTtcbiAgICB9LFxuXG4gICAgdG9nZ2xlT3ZlcmxheU1lbnU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBjb25zdCBvdmVybGF5TWVudU5hdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1vdmVybGF5LW1lbnUnKTtcbiAgICAgICAgLy8gY29uc3Qgb3ZlcmxheU1lbnVCb2R5ID0gb3ZlcmxheU1lbnUucXVlcnlTZWxlY3RvcignLmpzLW92ZXJsYXktbWVudS1wZXJzaXN0LXNjcm9sbGluZycpO1xuXG4gICAgICAgIC8vIEJhaWwgaWYgb3ZlcmxheU1lbnUgZG9lc24ndCBleGlzdFxuICAgICAgICBpZiAoIW92ZXJsYXlNZW51TmF2KSByZXR1cm47XG5cbiAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXNseSBsb2NrZWQgc2Nyb2xsIG9uIHRoZSBib2R5XG4gICAgICAgIGJvZHlTY3JvbGxMb2NrLmVuYWJsZUJvZHlTY3JvbGwob3ZlcmxheU1lbnVOYXYpO1xuXG4gICAgICAgIC8vIElmIHRoZSBvdmVybGF5TWVudSBpcyBhbHJlYWR5IGFjdGl2ZSwgY29sbGFwc2UgaXQgYW5kIHF1aXRcbiAgICAgICAgaWYgKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1vdmVybGF5LW1lbnUtYWN0aXZlJykpIHtcbiAgICAgICAgICAgIG92ZXJsYXlNZW51TmF2LnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0YWJpbmRleD1cIjBcIl0nKS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgICAgICAgICAgICBlbGVtLnRhYkluZGV4ID0gLTE7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1vdmVybGF5LW1lbnUtYWN0aXZlJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2NrIHNjcm9sbGluZyBvbiB0aGUgYm9keVxuICAgICAgICBib2R5U2Nyb2xsTG9jay5kaXNhYmxlQm9keVNjcm9sbChvdmVybGF5TWVudU5hdik7XG5cbiAgICAgICAgb3ZlcmxheU1lbnVOYXYucXVlcnlTZWxlY3RvckFsbCgnW3RhYmluZGV4PVwiLTFcIl0nKS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgICAgICAgIGVsZW0udGFiSW5kZXggPSAwO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUb2dnbGUgYWN0aXZlIG92ZXJsYXlNZW51IGJ5IHNldHRpbmcgYSBjbGFzcyBvbiB0aGUgYm9keVxuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ2lzLW92ZXJsYXktbWVudS1hY3RpdmUnKTtcbiAgICAgICAgb3ZlcmxheU1lbnVOYXYuaGlkZGVuID0gZmFsc2U7XG4gICAgfVxufTtcblxuT3ZlcmxheU1lbnVIYW5kbGVyLmluaXQoKTsiLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIFNjcm9sbCBUbyBDbGljayBoYW5kbGVyXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuY29uc3QgU2Nyb2xsVG9IYW5kbGVyID0ge1xuXG4gICAgLy8gQW5pbWF0aW9uIHNldHRpbmdzXG4gICAgb2Zmc2V0IDogNjAsIC8vcGl4ZWxcbiAgICBkdXJhdGlvbiA6IDE0MDAsIC8vbXNcblxuICAgIC8vIEFuaW1hdGlvbiB2YXJpYWJsZXNcbiAgICBib2R5IDogbnVsbCxcbiAgICBzdGFydCA6IDAsXG4gICAgY2hhbmdlIDogMCxcbiAgICBjdXJyZW50VGltZSA6IDAsXG4gICAgYWxsb3dBbmltYXRpb24gOiBmYWxzZSxcbiAgICBzY3JvbGxUb0FuaW1hdGlvbiA6IG51bGwsXG5cbiAgICAvLyBXYXRjaCB0aGUgRWFzaW5nRnVuY3Rpb24gaGVscGVyIGZvciB0aGUgYXZhaWxhYmxlIG1ldGhvZHNcbiAgICBlYXNpbmc6ICdlYXNlSW5PdXRRdWFkJyxcblxuICAgIGluaXQgOiBmdW5jdGlvbigpe1xuXG4gICAgICAgIGNvbnN0IGFuY2hvckxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLXNjcm9sbC10by10YXJnZXQnKTtcbiAgICAgICAgY29uc3QgYW5jaG9yTGlua3NBbW91bnQgPSBhbmNob3JMaW5rcy5sZW5ndGg7XG5cbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGFuY2hvckxpbmtzQW1vdW50OyBpKyspIHtcblxuICAgICAgICAgICAgY29uc3QgYW5jaG9yTGluayA9IGFuY2hvckxpbmtzW2ldO1xuXG4gICAgICAgICAgICBhbmNob3JMaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgU2Nyb2xsVG9IYW5kbGVyLnByZXBhcmVTY3JvbGxUbyh0aGlzLmdldEF0dHJpYnV0ZSgnaHJlZicpKTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZSB0aGUgSGFuZGxlciBmb3IgdGhlIGFuaW1hdGlvblxuICAgICAqL1xuICAgIHByZXBhcmVTY3JvbGxUbyA6IGZ1bmN0aW9uKGVsZW1lbnRJZCl7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBzY3JvbGwgdG8gZWxlbWVudFxuICAgICAgICBlbGVtZW50SWQgPSBlbGVtZW50SWQuc3Vic3RyKGVsZW1lbnRJZC5pbmRleE9mKCcjJykrMSk7XG4gICAgICAgIGNvbnN0IHNjcm9sbFRvRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCk7XG4gICAgICAgIGlmKHNjcm9sbFRvRWxlbWVudCA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNjcm9sbFRvRWxlbWVudFBvc2l0aW9uID0gc2Nyb2xsVG9FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIC8vIFJlc2V0IG9yIGRlZmluZSB0aGUgSGFuZGxlciB2YXJpYWJsZXNcbiAgICAgICAgU2Nyb2xsVG9IYW5kbGVyLmJvZHkgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIFNjcm9sbFRvSGFuZGxlci5zdGFydCA9IE1hdGgubWF4KFNjcm9sbFRvSGFuZGxlci5ib2R5LnNjcm9sbFRvcCwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AsIHdpbmRvdy5wYWdlWU9mZnNldCk7IC8vVXNlIE1hdGgubWF4IGJlY2F1c2Ugc2FmYXJpIGRvZXNuJ3Qgc3VwcG9ydCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wXG4gICAgICAgIFNjcm9sbFRvSGFuZGxlci5jaGFuZ2UgPSAoKHNjcm9sbFRvRWxlbWVudFBvc2l0aW9uLnRvcCArIFNjcm9sbFRvSGFuZGxlci5zdGFydCkgLSBTY3JvbGxUb0hhbmRsZXIuc3RhcnQpIC0gU2Nyb2xsVG9IYW5kbGVyLm9mZnNldDtcbiAgICAgICAgU2Nyb2xsVG9IYW5kbGVyLnN0YXJ0VGltZSA9ICdub3cnIGluIHdpbmRvdy5wZXJmb3JtYW5jZSA/IHBlcmZvcm1hbmNlLm5vdygpIDogbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIFNjcm9sbFRvSGFuZGxlci5hbGxvd0FuaW1hdGlvbiA9IHRydWU7XG5cbiAgICAgICAgLy8gVHJpZ2dlciBhbmltYXRpb25cbiAgICAgICAgc2Nyb2xsVG9BbmltYXRpb24gPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoU2Nyb2xsVG9IYW5kbGVyLmFuaW1hdGVTY3JvbGwpO1xuXG4gICAgICAgIC8vIFN0b3Agb24gc2Nyb2xsXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBTY3JvbGxUb0hhbmRsZXIuYWJvcnRTY3JvbGxBbmltYXRpb24pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBTY3JvbGxUb0hhbmRsZXIuYWJvcnRTY3JvbGxBbmltYXRpb24pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NTW91c2VTY3JvbGwnLCBTY3JvbGxUb0hhbmRsZXIuYWJvcnRTY3JvbGxBbmltYXRpb24pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V3aGVlbCcsIFNjcm9sbFRvSGFuZGxlci5hYm9ydFNjcm9sbEFuaW1hdGlvbik7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIFNjcm9sbFRvSGFuZGxlci5hYm9ydFNjcm9sbEFuaW1hdGlvbik7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBTY3JvbGxUb0hhbmRsZXIuYWJvcnRTY3JvbGxBbmltYXRpb24pO1xuXG4gICAgfSxcblxuICAgIC8qXG4gICAgICogQW5pbWF0ZSB0aGUgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICovXG4gICAgYW5pbWF0ZVNjcm9sbCA6IGZ1bmN0aW9uICh0aW1lc3RhbXApIHtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgcHJvZ3Jlc3MgZnJvbSAwIC0gMVxuICAgICAgICBsZXQgcHJvZ3Jlc3MgPSBNYXRoLm1pbigxLCAodGltZXN0YW1wIC0gIFNjcm9sbFRvSGFuZGxlci5zdGFydFRpbWUpIC8gU2Nyb2xsVG9IYW5kbGVyLmR1cmF0aW9uKTtcbiAgICAgICAgaWYocHJvZ3Jlc3MgPCAwKSBwcm9ncmVzcyA9IDA7XG5cbiAgICAgICAgLy8gQ29udmVydCBwcm9ncmVzcyB3aXRoIGVhc2luZyBmdW5jdGlvblxuICAgICAgICBwcm9ncmVzcyA9IEVhc2luZ0Z1bmN0aW9uc1tTY3JvbGxUb0hhbmRsZXIuZWFzaW5nXShwcm9ncmVzcyk7XG5cbiAgICAgICAgY29uc3QgbmV3U2Nyb2xsVG9wID0gU2Nyb2xsVG9IYW5kbGVyLnN0YXJ0ICsgKCBTY3JvbGxUb0hhbmRsZXIuY2hhbmdlICogcHJvZ3Jlc3MgKTtcblxuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuYm9keS5zY3JvbGxUb3AgPSBuZXdTY3JvbGxUb3A7XG4gICAgICAgIGlmKCBTY3JvbGxUb0hhbmRsZXIuYm9keS5zY3JvbGxUb3AgPT09IDAgKSBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCA9IG5ld1Njcm9sbFRvcDsgLy8gU2FmYXJpIGRvZXNuJ3Qgc3VwcG9ydCBzbyBpZiBTY3JvbGxUb0hhbmRsZXIuYm9keS5zY3JvbGxUb3AgaXMgMCBmb3JjZSB0aGUgc2Nyb2xsIHBvc2l0aW9uIHRocm91Z2ggZG9jdW1lbnQuYm9keS5zY3JvbGxUb3BcblxuICAgICAgICBpZihwcm9ncmVzcyA8IDEgJiYgU2Nyb2xsVG9IYW5kbGVyLmFsbG93QW5pbWF0aW9uKXtcbiAgICAgICAgICAgIHNjcm9sbFRvQW5pbWF0aW9uID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKFNjcm9sbFRvSGFuZGxlci5hbmltYXRlU2Nyb2xsKTtcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8qXG4gICAgICogQWJvcnQgdGhlIHNjcm9sbCBhbmltYXRpb25cbiAgICAgKi9cbiAgICBhYm9ydFNjcm9sbEFuaW1hdGlvbiA6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuYWxsb3dBbmltYXRpb24gPSBmYWxzZTtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoU2Nyb2xsVG9IYW5kbGVyLnNjcm9sbFRvQW5pbWF0aW9uKTtcbiAgICB9XG5cbn07XG5cblNjcm9sbFRvSGFuZGxlci5pbml0KCk7IiwiXG4vKiBFeGFtcGxlXG5cbmNvbnN0IGhlYWRlckltYWdlU2xpZGVyU2V0dGluZyA9IG5ldyBTbGlkZXJQcm9qZWN0b3JTZXR0aW5nKHtcbiAgICBzbGlkZXJQcm9qZWN0b3JJZDogJ2hlYWRlci1pbWFnZS1zbGlkZXInLFxuICAgIHNsaWRlUXVlcnk6ICcjaGVhZGVyLWltYWdlLXNsaWRlciAucGxhY2Vob2xkZXIgZmlndXJlJyxcbiAgICBkb3RzOiAnI2hlYWRlci1pbWFnZS1zbGlkZXIgLnNsaWRlci1uYXZpZ2F0aW9uLWxhYmVscyAubmF2aWdhdGlvbiBzcGFuJyxcbiAgICBhdXRvU2xpZGVyOiB0cnVlLFxuICAgIHNsaWRlckludGVydmFsOiA0MDAwXG59KTtcbmhlYWRlckltYWdlU2xpZGVyU2V0dGluZyA9IGhlYWRlckltYWdlU2xpZGVyU2V0dGluZy5wcmVwYXJlUGFyYW1ldGVycygpO1xuXG5jb25zdCBoZWFkZXJJbWFnZVNsaWRlciA9IG5ldyBTbGlkZXJQcm9qZWN0b3IoaGVhZGVySW1hZ2VTbGlkZXJTZXR0aW5nKS5pbml0KCk7XG5cbiAqL1xuXG5sZXQgU2xpZGVycyA9IFtdO1xuXG5jb25zdCBzbGlkZXJDb250YWluZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLXNsaWRlcicpO1xuY29uc3Qgc2xpZGVyQ29udGFpbmVyc0xlbmd0aCA9IHNsaWRlckNvbnRhaW5lcnMubGVuZ3RoO1xuXG5mb3IobGV0IGkgPTA7IGkgPCBzbGlkZXJDb250YWluZXJzTGVuZ3RoOyBpKyspe1xuXG4gICAgY29uc3Qgc2xpZGVyID0gc2xpZGVyQ29udGFpbmVyc1tpXTtcbiAgICBjb25zdCBzbGlkZXJJZCA9IHNsaWRlci5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG5cbiAgICBpZihzbGlkZXJJZCAhPT0gbnVsbCl7XG5cbiAgICAgICAgY29uc3QgU2xpZGVyc2V0dGluZyA9IG5ldyBTbGlkZXJTZXR0aW5nKHtcbiAgICAgICAgICAgIHNsaWRlcklkOiBzbGlkZXJJZCxcbiAgICAgICAgICAgIGF1dG9TbGlkZXI6IHNsaWRlci5nZXRBdHRyaWJ1dGUoJ2RhdGEtYXV0by1zbGlkZScpLFxuICAgICAgICAgICAgc2xpZGVRdWVyeTogJyMnICsgc2xpZGVySWQgKycgLmpzLXNsaWRlci1zbGlkZScsXG4gICAgICAgICAgICBuYXZpZ2F0aW9uQnV0dG9uczogJyMnICsgc2xpZGVySWQgKycgLmpzLXNsaWRlci1idXR0b24nLFxuICAgICAgICAgICAgZG90czogJyMnICsgc2xpZGVySWQgKycgLmpzLXNsaWRlci1pbmRpY2F0b3InLFxuICAgICAgICB9KTtcblxuICAgICAgICBTbGlkZXJzLnB1c2goIG5ldyBTbGlkZXIoU2xpZGVyc2V0dGluZy5wcmVwYXJlUGFyYW1ldGVycygpKS5pbml0KCkgKTtcbiAgICB9XG4gICAgZWxzZSBjb25zb2xlLmxvZygnQW4gaW1hZ2Ugc2xpZGVyIGhhcyBubyBpZC4uLicpO1xufVxuXG5cbmZ1bmN0aW9uIFNsaWRlclNldHRpbmcoc2V0dGluZ3NPYmplY3QpIHtcblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgdGhpcy5zbGlkZXJJZCA9ICcnO1xuICAgIHRoaXMuYXV0b1NsaWRlciA9IGZhbHNlO1xuICAgIHRoaXMuc2xpZGVySW50ZXJ2YWwgPSA0MDAwO1xuICAgIHRoaXMubmF2aWdhdGlvbkJ1dHRvbnMgPSAnJztcbiAgICB0aGlzLmRvdHMgPSAnJztcbiAgICB0aGlzLnNsaWRlUXVlcnkgPSAnJztcblxuICAgIHRoaXMuc2V0U2xpZGVySWQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2xpZGVySWQgPSBzdHJpbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXRBdXRvU2xpZGVyID0gZnVuY3Rpb24gKGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5hdXRvU2xpZGVyID0gYm9vbGVhbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICB0aGlzLnNldFNsaWRlckludGVydmFsID0gZnVuY3Rpb24gKGludGVnZXIpIHtcbiAgICAgICAgdGhpcy5zbGlkZXJJbnRlcnZhbCA9IGludGVnZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXRTbGlkZVF1ZXJ5ID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICB0aGlzLnNsaWRlUXVlcnkgPSBzdHJpbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXROYXZpZ2F0aW9uQnV0dG9ucyA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uQnV0dG9ucyA9IHN0cmluZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICB0aGlzLnNldERvdHMgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZG90cyA9IHN0cmluZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICB0aGlzLmdldFNsaWRlcklkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zbGlkZXJJZDtcbiAgICB9O1xuICAgIHRoaXMuZ2V0QXV0b1NsaWRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGF1dG9TbGlkZSA9IHRoaXMuYXV0b1NsaWRlcjtcbiAgICAgICAgaWYoIU51bWJlci5pc0ludGVnZXIoYXV0b1NsaWRlKSl7XG4gICAgICAgICAgICBpZihhdXRvU2xpZGUgPT0gZmFsc2UpIGF1dG9TbGlkZSA9IGZhbHNlO1xuICAgICAgICAgICAgZWxzZSBhdXRvU2xpZGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhdXRvU2xpZGU7XG4gICAgfTtcbiAgICB0aGlzLmdldFNsaWRlckludGVydmFsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zbGlkZXJJbnRlcnZhbDtcbiAgICB9O1xuICAgIHRoaXMuZ2V0U2xpZGVRdWVyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGVRdWVyeTtcbiAgICB9O1xuICAgIHRoaXMuZ2V0TmF2aWdhdGlvbkJ1dHRvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25CdXR0b25zO1xuICAgIH07XG4gICAgdGhpcy5nZXREb3RzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb3RzO1xuICAgIH07XG5cbiAgICAvLyBJbnZlcnQgc2V0dGVycyB0byBnZXR0ZXJzXG4gICAgdGhpcy5wcmVwYXJlUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2xpZGVySWQ6IHNlbGYuZ2V0U2xpZGVySWQoKSxcbiAgICAgICAgICAgIGF1dG9TbGlkZXI6IHNlbGYuZ2V0QXV0b1NsaWRlcigpLFxuICAgICAgICAgICAgc2xpZGVySW50ZXJ2YWw6IHNlbGYuZ2V0U2xpZGVySW50ZXJ2YWwoKSxcbiAgICAgICAgICAgIG5hdmlnYXRpb25CdXR0b25zOiBzZWxmLmdldE5hdmlnYXRpb25CdXR0b25zKCksXG4gICAgICAgICAgICBkb3RzOiBzZWxmLmdldERvdHMoKSxcbiAgICAgICAgICAgIHNsaWRlUXVlcnk6IHNlbGYuZ2V0U2xpZGVRdWVyeSgpXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICAvLyBNYXNzIGFzc2lnbiBzZXR0aW5nc1xuICAgIHRoaXMuZmlsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gT2JqZWN0LmtleXMoc2V0dGluZ3NPYmplY3QpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAvLyAgICAgc2VsZltrZXldID0gc2V0dGluZ3NPYmplY3Rba2V5XTtcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgY29uc3Qgc2V0dGluZ3NPYmplY3RLZXlzID0gT2JqZWN0LmtleXMoc2V0dGluZ3NPYmplY3QpO1xuICAgICAgICBjb25zdCBzZXR0aW5nc09iamVjdExlbmd0aCA9IHNldHRpbmdzT2JqZWN0S2V5cy5sZW5ndGg7XG5cbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHNldHRpbmdzT2JqZWN0TGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gc2V0dGluZ3NPYmplY3RLZXlzW2ldO1xuICAgICAgICAgICAgc2VsZltrZXldID0gc2V0dGluZ3NPYmplY3Rba2V5XTtcbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIHRoaXMuZmlsbCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2xpZGVySWQ6IHNlbGYuc2V0U2xpZGVySWQsXG4gICAgICAgIGF1dG9TbGlkZXI6IHNlbGYuc2V0QXV0b1NsaWRlcixcbiAgICAgICAgc2xpZGVySW50ZXJ2YWw6IHNlbGYuc2V0U2xpZGVySW50ZXJ2YWwsXG4gICAgICAgIG5hdmlnYXRpb25CdXR0b25zOiBzZWxmLnNldE5hdmlnYXRpb25CdXR0b25zLFxuICAgICAgICBkb3RzOiBzZWxmLnNldERvdHMsXG4gICAgICAgIHNsaWRlUXVlcnk6IHNlbGYuc2V0U2xpZGVRdWVyeSxcbiAgICAgICAgcHJlcGFyZVBhcmFtZXRlcnM6IHNlbGYucHJlcGFyZVBhcmFtZXRlcnNcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBTbGlkZXIoc2V0dGluZ3MpIHtcblxuICAgIC8vRGVmaW5lIFNsaWRlciBvYmplY3RcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICB0aGlzLnNsaWRlck9iamVjdCA9ICcnO1xuXG4gICAgLy9TbGlkZVBhcmFtZXRlcnNcbiAgICB0aGlzLmFjdGl2ZVNsaWRlSWQgPSAwO1xuICAgIHRoaXMucHJldmlvdXNTbGlkZUlkID0gMDtcbiAgICB0aGlzLm5leHRTbGlkZUlkID0gMDtcbiAgICB0aGlzLmF2YWlsYWJsZVNsaWRlcyA9IDE7XG4gICAgdGhpcy5zbGlkZXMgPSBbXTtcbiAgICB0aGlzLmF1dG9TbGlkZXJJbnRlcnZhbCA9IG51bGw7XG5cbiAgICB0aGlzLnNldHRpbmdzID0ge307XG5cbiAgICB0aGlzLmluaXQgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy9BcHBlbmQgc2V0dGluZ3MgdG8gc2VsZlxuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG5cbiAgICAgICAgLy9Bc3NpZ24gbmVlZGVkIGVsZW1lbnRzIGFuZCBjYWxjdWxhdGlvbnNcbiAgICAgICAgdGhpcy5zbGlkZXJPYmplY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnNldHRpbmdzLnNsaWRlcklkKTtcbiAgICAgICAgdGhpcy5zbGlkZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuc2V0dGluZ3Muc2xpZGVRdWVyeSk7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlU2xpZGVzID0gdGhpcy5zbGlkZXMubGVuZ3RoO1xuICAgICAgICB0aGlzLmFjdGl2ZVNsaWRlSWQgPSAwO1xuXG4gICAgICAgIC8vIFNldCBhY3RpdmUgc2xpZGUgKGFuZCBwb3NzaWJsZSBwcmV2aW91cyBhbmQgbmV4dCBjbGFzc2VzKVxuICAgICAgICB0aGlzLnNldFNsaWRlKCk7XG5cbiAgICAgICAgLy8gU3dpcGUgaW50ZXJhY3Rpb25cbiAgICAgICAgY29uc3Qgc3dpcGVHZXN0dXJlcyA9IG5ldyBIYW1tZXIodGhpcy5zbGlkZXJPYmplY3QpO1xuICAgICAgICBzd2lwZUdlc3R1cmVzLm9uKCdzd2lwZWxlZnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnJlc2V0QXV0b1NsaWRlcigpO1xuICAgICAgICAgICAgc2VsZi5uZXh0U2xpZGUoKTtcbiAgICAgICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN3aXBlR2VzdHVyZXMub24oJ3N3aXBlcmlnaHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnJlc2V0QXV0b1NsaWRlcigpO1xuICAgICAgICAgICAgc2VsZi5wcmV2aW91c1NsaWRlKCk7XG4gICAgICAgICAgICBzZWxmLnNldFNsaWRlKCk7XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MubmF2aWdhdGlvbkJ1dHRvbnMgIT09ICcnKSB7XG5cbiAgICAgICAgICAgIC8vIENsaWNrIGludGVyYWN0aW9uXG4gICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5zZXR0aW5ncy5uYXZpZ2F0aW9uQnV0dG9ucyk7XG4gICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQnV0dG9uc0xlbmd0aCA9IG5hdmlnYXRpb25CdXR0b25zLmxlbmd0aDtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uQnV0dG9uc0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQnV0dG9uID0gbmF2aWdhdGlvbkJ1dHRvbnNbaV07XG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGlja05hdmlnYXRpb25CdXR0b24odGhpcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5kb3RzICE9PSAnJykge1xuICAgICAgICAgICAgLy8gQ2xpY2sgaW50ZXJhY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IGRvdHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuc2V0dGluZ3MuZG90cyk7XG4gICAgICAgICAgICBjb25zdCBkb3RzTGVuZ3RoID0gZG90cy5sZW5ndGg7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnNldHRpbmdzLmRvdHMpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZG90cyk7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgZG90c0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICBjb25zdCBkb3QgPSBkb3RzW2ldO1xuICAgICAgICAgICAgICAgIGRvdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGlja0RvdCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5hdXRvU2xpZGVyKCk7XG4gICAgfTtcblxuXG4gICAgdGhpcy5hdXRvU2xpZGVyID0gZnVuY3Rpb24gKCl7XG5cbiAgICAgICAgLy8gUmVzZXQgdGhlIGludGVydmFsIGlmIGRlZmluZWRcbiAgICAgICAgaWYodGhpcy5hdXRvU2xpZGVySW50ZXJ2YWwgIT09IG51bGwpIGNsZWFySW50ZXJ2YWwodGhpcy5hdXRvU2xpZGVySW50ZXJ2YWwpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHNob3VsZCBhdXRvIHNsaWRlIGJlZm9yZSBjcmVhdGluZyB0aGUgaW50ZXJ2YWxcbiAgICAgICAgLy8gV2UgZG8gdGhpcyBpbmhlcmUsIGJlY2F1c2UgdGhlIGF1dG9zbGlkZSBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCBieSBvdGhlciBmdW5jdGlvbmFsaXR5XG4gICAgICAgIGlmKHRoaXMuc2V0dGluZ3MuYXV0b1NsaWRlciAhPT0gZmFsc2UgJiYgTnVtYmVyLmlzSW50ZWdlcih0aGlzLnNldHRpbmdzLnNsaWRlckludGVydmFsKSAgKXtcblxuICAgICAgICAgICAgdGhpcy5hdXRvU2xpZGVySW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXh0U2xpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRTbGlkZSgpO1xuICAgICAgICAgICAgICAgIH0sIHRoaXMuc2V0dGluZ3Muc2xpZGVySW50ZXJ2YWxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5yZXNldEF1dG9TbGlkZXIgPSBzZWxmLmF1dG9TbGlkZXI7XG5cbiAgICB0aGlzLm5leHRTbGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVTbGlkZUlkKys7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVNsaWRlSWQgPj0gdGhpcy5hdmFpbGFibGVTbGlkZXMpIHRoaXMuYWN0aXZlU2xpZGVJZCA9IDA7XG4gICAgfTtcblxuICAgIHRoaXMucHJldmlvdXNTbGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVTbGlkZUlkLS07XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVNsaWRlSWQgPCAwKSB0aGlzLmFjdGl2ZVNsaWRlSWQgPSB0aGlzLmF2YWlsYWJsZVNsaWRlcyAtIDE7XG4gICAgfTtcblxuXG4gICAgdGhpcy5zZXRTbGlkZSA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIGZvcm0gZWxlbWVudHNcbiAgICAgICAgY29uc3Qgc2xpZGVzTGVuZ3RoID0gc2VsZi5zbGlkZXMubGVuZ3RoO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgc2xpZGVzTGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgY29uc3Qgc2xpZGUgPSBzZWxmLnNsaWRlc1tpXTtcblxuICAgICAgICAgICAgc2xpZGUuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiOyAvLyBOZWVkZWQgZm9yIHN3aXBlIGZ1bmN0aW9uYWxpdHlcblxuICAgICAgICAgICAgLy8gQ29udmVydCBkYXRhIHNldCBhdHRyaWJ1dGUgdG8gZGVzaXJlZCB0eXBlXG4gICAgICAgICAgICBjb25zdCBzbGlkZU9yZGVyID0gcGFyc2VJbnQoc2xpZGUuZ2V0QXR0cmlidXRlKCdkYXRhLW9yZGVyJykpO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgYW5kIHNldCBhY3RpdmUgZm9yIGFsbCBzbGlkZXNcbiAgICAgICAgICAgIGlmIChzbGlkZU9yZGVyICE9PSBzZWxmLmFjdGl2ZVNsaWRlSWQpIHNsaWRlLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgZWxzZSBzbGlkZS5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxmLnNldHRpbmdzLmRvdHMgIT09ICcnKSB7IHNlbGYuc2V0QWN0aXZlRG90KCk7IH1cbiAgICB9O1xuXG4gICAgdGhpcy5jbGlja05hdmlnYXRpb25CdXR0b24gPSBmdW5jdGlvbiAobmF2QnV0dG9uKSB7XG5cbiAgICAgICAgY29uc3QgbmF2QnV0dG9uRGlyZWN0aW9uID0gbmF2QnV0dG9uLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpO1xuXG4gICAgICAgIGlmKG5hdkJ1dHRvbkRpcmVjdGlvbiA9PT0gJ25leHQnKSB0aGlzLm5leHRTbGlkZSgpO1xuICAgICAgICBlbHNlIGlmKG5hdkJ1dHRvbkRpcmVjdGlvbiA9PT0gJ3ByZXZpb3VzJykgdGhpcy5wcmV2aW91c1NsaWRlKCk7XG5cbiAgICAgICAgc2VsZi5zZXRTbGlkZSgpO1xuICAgICAgICBzZWxmLnJlc2V0QXV0b1NsaWRlcigpO1xuICAgIH07XG5cbiAgICB0aGlzLmNsaWNrRG90ID0gZnVuY3Rpb24gKGNsaWNrZWREb3QpIHtcbiAgICAgICAgc2VsZi5hY3RpdmVTbGlkZUlkID0gcGFyc2VJbnQoY2xpY2tlZERvdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JkZXInKSk7XG4gICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcbiAgICAgICAgc2VsZi5yZXNldEF1dG9TbGlkZXIoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5zZXRBY3RpdmVEb3QgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgY29uc3QgZG90cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5zZXR0aW5ncy5kb3RzKTtcbiAgICAgICAgY29uc3QgZG90c0xlbmd0aCA9IGRvdHMubGVuZ3RoO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgZG90c0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IGRvdCA9IGRvdHNbaV07XG4gICAgICAgICAgICBkb3RPcmRlciA9IHBhcnNlSW50KGRvdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JkZXInKSk7XG5cbiAgICAgICAgICAgIGlmKGRvdE9yZGVyICE9PSBzZWxmLmFjdGl2ZVNsaWRlSWQpIHtcbiAgICAgICAgICAgICAgICBkb3QuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgZG90LnRhYkluZGV4ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvdC5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICBkb3QudGFiSW5kZXggPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIFRhYnMgaGFuZGxlclxuICAgLSBIYW5kbGVzIHRoZSB0YWJzIGNvbXBvbmVudCB3aGljaCBoYXMgdGhlIHByb3BlciBjbGFzc2VzLlxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IFRhYnNIYW5kbGVyID0ge1xuICAgIHRhYnNMaXN0IDogbnVsbCxcbiAgICB0YWJzIDogbnVsbCxcblxuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgVGFic0hhbmRsZXIudGFic0xpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtdGFicycpO1xuICAgICAgICBjb25zdCB0YWJzTGlzdENvdW50ID0gVGFic0hhbmRsZXIudGFic0xpc3QubGVuZ3RoO1xuXG4gICAgICAgIGlmKGlzc2V0KFRhYnNIYW5kbGVyLnRhYnNMaXN0KSAmJiB0YWJzTGlzdENvdW50ICE9PSAwKXtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0YWJzTGlzdENvdW50OyBpKyspe1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYnMgPSBUYWJzSGFuZGxlci50YWJzTGlzdFtpXTtcbiAgICAgICAgICAgICAgICBUYWJzSGFuZGxlci5pbml0VGFicyh0YWJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBpbml0VGFiczogZnVuY3Rpb24gKHRhYnMpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGFicy5xdWVyeVNlbGVjdG9yKCcuanMtdGFicy1jb250YWluZXInKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBjb250YWluZXIgZWxlbWVudCBleGlzdHNcbiAgICAgICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBUaGVyZSBpcyBubyBjb250YWluZXIgZm9yIHRoZSBjb250ZW50IHRhYnMgZGVmaW5lZC5gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyaWdnZXJzID0gdGFicy5xdWVyeVNlbGVjdG9yQWxsKCcuanMtdGFicy10cmlnZ2VyJyk7XG4gICAgICAgIGNvbnN0IHRhYnNDb250ZW50ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy10YWJzLWNvbnRlbnQnKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBudW1iZXIgb2YgdHJpZ2dlcnMgYW5kIHRhYnMgbWF0Y2hcbiAgICAgICAgaWYodHJpZ2dlcnMubGVuZ3RoICE9PSB0YWJzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgVGhlcmUgYXJlICR7dHJpZ2dlcnMubGVuZ3RofSB0cmlnZ2VyIGJ1dHRvbnMgYW5kICR7dGFicy5sZW5ndGh9IHRhYnMuIFRoZXNlIG11c3QgbWF0Y2guYClcbiAgICAgICAgfVxuXG4gICAgICAgIHRhYnMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgY2xpY2tlZCBvbiBhIHN0ZXAgYnV0dG9uIChwcmV2IG9yIG5leHQpXG4gICAgICAgICAgICBpZihldmVudC50YXJnZXQuY2xvc2VzdCgnLmpzLXRhYnMtc3RlcCcpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlyID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5qcy10YWJzLXN0ZXAnKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3RlcCcpO1xuICAgICAgICAgICAgICAgIFRhYnNIYW5kbGVyLnN0ZXBUYWJzKGRpciwgdHJpZ2dlcnMsIHRhYnNDb250ZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQmFpbCBpZiB3ZSBkaWRuJ3QgY2xpY2sgb24gdGhlIHRyaWdnZXIgZWxlbWVudFxuICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqcy10YWJzLXRyaWdnZXInKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBCYWlsIGlmIGFscmVhZHkgYWN0aXZlXG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnaXMtYWN0aXZlJykpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgIFRhYnNIYW5kbGVyLnRvZ2dsZVRhYnMoZXZlbnQudGFyZ2V0LmRhdGFzZXQudGFiSWQsIHRyaWdnZXJzLCB0YWJzQ29udGVudCk7XG5cbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHRvZ2dsZVRhYnM6IGZ1bmN0aW9uICh0YWJJZCwgdHJpZ2dlcnMsIHRhYnNDb250ZW50KSB7XG5cbiAgICAgICAgaWYoaXNzZXQodHJpZ2dlcnMpICYmIHRyaWdnZXJzLmxlbmd0aCA+IDApe1xuXG4gICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRhYnNcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0cmlnZ2Vycy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFic1RhYiA9IHRhYnNDb250ZW50W2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYnNUcmlnZ2VyID0gdHJpZ2dlcnNbaV07XG5cbiAgICAgICAgICAgICAgICB0YWJzVHJpZ2dlci5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB0YWJzVHJpZ2dlci50YWJJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgdGFic1RhYi5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcblxuICAgICAgICAgICAgICAgIGlmICh0YWJzVGFiLmRhdGFzZXQudGFiSWQgPT09IHRhYklkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhYnNUcmlnZ2VyLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB0YWJzVHJpZ2dlci50YWJJbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICB0YWJzVGFiLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzdGVwVGFiczogZnVuY3Rpb24gKGRpciwgdHJpZ2dlcnMsIHRhYnNDb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHRyaWdnZXJDb3VudCA9IHRyaWdnZXJzLmxlbmd0aDtcbiAgICAgICAgbGV0IGFjdGl2ZUlkID0gMTtcbiAgICAgICAgbGV0IG5ld0lkID0gMDtcblxuICAgICAgICBpZihpc3NldCh0cmlnZ2VycykgJiYgdHJpZ2dlckNvdW50ID4gMCl7XG5cbiAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGFic1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRyaWdnZXJDb3VudDsgaSsrKXtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJzVGFiID0gdGFic0NvbnRlbnRbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgdGFic1RyaWdnZXIgPSB0cmlnZ2Vyc1tpXTtcblxuICAgICAgICAgICAgICAgIC8vIFNldCBhY3RpdmVJZFxuICAgICAgICAgICAgICAgIGlmKHRhYnNUYWIuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1hY3RpdmUnKSl7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUlkID0gTnVtYmVyKHRhYnNUYWIuZ2V0QXR0cmlidXRlKCdkYXRhLXRhYi1pZCcpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayB3aGF0IG5leHQgSWQgd2lsbCBiZVxuICAgICAgICAgICAgICAgIGlmKGRpciA9PT0gJ25leHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVJZCA9PT0gdHJpZ2dlckNvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdJZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdJZCA9IGFjdGl2ZUlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaXIgPT09ICdwcmV2Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlSWQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lkID0gdHJpZ2dlckNvdW50IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lkID0gYWN0aXZlSWQgLSAyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGFjdGl2ZSBjbGFzc1xuICAgICAgICAgICAgICAgIHRhYnNUcmlnZ2VyLnRhYkluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB0YWJzVGFiLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgIHRhYnNUcmlnZ2VyLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cmlnZ2Vyc1tuZXdJZF0udGFiSW5kZXggPSAtMTtcbiAgICAgICAgICAgIHRyaWdnZXJzW25ld0lkXS5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgIHRhYnNbbmV3SWRdLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuXG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5UYWJzSGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBZb3V0dWJlIGhhbmRsZXJcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5jb25zdCBZb3V0dWJlSGFuZGxlciA9IHtcblxuICAgIHlvdXR1YmVDbGFzcyA6ICcuanMteW91dHViZS1wbGF5ZXInLFxuICAgIHBsYXllcnM6IFtdLFxuXG4gICAgaW5pdCA6IGZ1bmN0aW9uKClcbiAgICB7XG4gICAgICAgIC8vIEdldCB0aGUgeW91dHViZSBwbGF5ZXJzIGNvbnRhaW5lcnNcbiAgICAgICAgY29uc3QgeW91dHViZVBsYXllcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFlvdXR1YmVIYW5kbGVyLnlvdXR1YmVDbGFzcyk7XG4gICAgICAgIGNvbnN0IHlvdXR1YmVQbGF5ZXJzQW1vdW50ID0geW91dHViZVBsYXllcnMubGVuZ3RoO1xuXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB5b3V0dWJlUGxheWVyc0Ftb3VudDsgaSsrKXtcblxuICAgICAgICAgICAgY29uc3QgeW91dHViZVBsYXllciA9IHlvdXR1YmVQbGF5ZXJzW2ldO1xuXG5cbiAgICAgICAgICAgIGNvbnN0IHlvdXR1YmVQbGF5ZXJJZCA9IHlvdXR1YmVQbGF5ZXIuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICAgICAgaWYoeW91dHViZVBsYXllcklkICE9PSBudWxsIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBTdHJpcCB0aGUgbmVjZXNzYXJ5IGRhdGEgZnJvbSB0aGUgaHRtbCBhbmQgY3JlYXRlIG9iamVjdHMgZnJvbSBpdFxuICAgICAgICAgICAgICAgIGNvbnN0IHlvdXR1YmVFbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogeW91dHViZVBsYXllci5nZXRBdHRyaWJ1dGUoJ2lkJyksXG4gICAgICAgICAgICAgICAgICAgIGxpbms6IHlvdXR1YmVQbGF5ZXIuZ2V0QXR0cmlidXRlKCdkYXRhLXlvdXR1YmUtbGluaycpLFxuICAgICAgICAgICAgICAgICAgICBhdXRvUGxheTogcGFyc2VJbnQoeW91dHViZVBsYXllci5nZXRBdHRyaWJ1dGUoJ2RhdGEtYXV0by1wbGF5JykpLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzLnB1c2goeW91dHViZUVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVsZW1lbnQgbm90IGluY2x1ZGUgYmVjYXVzZSB0aGVyZSBpc24ndCBhIGlkIG9uIHRoZSBwbGF5ZXJcIik7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coeW91dHViZVBsYXllcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZih5b3V0dWJlUGxheWVyc0Ftb3VudCA+PSAxKSBZb3V0dWJlSGFuZGxlci5pbml0WW91dHViZSgpO1xuXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGV4dGVybmFsIHNjcmlwdCBpcyBsb2FkZWRcbiAgICAgKlxuICAgICAqL1xuICAgIGluaXRZb3V0dWJlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gU2VlIGlmIFlUIHZhcmlhYmxlIGV4aXN0c1xuICAgICAgICBpZiAodHlwZW9mKFlUKSA9PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YoWVQuUGxheWVyKSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gU2V0dXAgQVBJIHJlYWR5IGZ1bmN0aW9uXG4gICAgICAgICAgICB3aW5kb3cub25Zb3VUdWJlUGxheWVyQVBJUmVhZHkgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBZb3V0dWJlSGFuZGxlci5sb2FkUGxheWVycygpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIExvYWQgZXh0ZXJuYWwgc2NyaXB0XG4gICAgICAgICAgICBnZXRTY3JpcHQoJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2lmcmFtZV9hcGknKTtcbiAgICAgICAgICAgIC8vIElmIFlUIGFscmVhZHkgZXhpc3RzIGxvYWQgcGxheWVyXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBZb3V0dWJlSGFuZGxlci5sb2FkUGxheWVycygpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSB0aGUgWW91dHViZSBwbGF5ZXIocykgd2l0aCBwYXJhbWV0ZXJzXG4gICAgICogQW5kIHJld3JpdGUgdGhlIHBsYXllcnMgdG8ga2V5IHRoZW0gYnkgdGhlIGVsZW1lbnQgaWRcbiAgICAgKlxuICAgICAqL1xuICAgIGxvYWRQbGF5ZXJzOiBmdW5jdGlvbigpIHtcblxuICAgICAgICBsZXQgcGxheWVycyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHlvdXR1YmVQbGF5ZXJzQW1vdW50ID0gWW91dHViZUhhbmRsZXIucGxheWVycy5sZW5ndGg7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB5b3V0dWJlUGxheWVyc0Ftb3VudDsgaSsrKXtcblxuICAgICAgICAgICAgbGV0IHlvdXR1YmVQbGF5ZXIgPSBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzW2ldO1xuXG4gICAgICAgICAgICAvLyBMb2FkIHBsYXllclxuICAgICAgICAgICAgeW91dHViZVBsYXllci5wbGF5ZXIgPSBuZXcgWVQuUGxheWVyKHlvdXR1YmVQbGF5ZXIuaWQse1xuICAgICAgICAgICAgICAgIGhlaWdodDogMjAwLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgdmlkZW9JZDogeW91dHViZVBsYXllci5saW5rLFxuICAgICAgICAgICAgICAgIGhvc3Q6ICdodHRwczovL3d3dy55b3V0dWJlLW5vY29va2llLmNvbScsXG4gICAgICAgICAgICAgICAgcGxheWVyVmFyczoge1xuICAgICAgICAgICAgICAgICAgICBtb2Rlc3RicmFuZGluZzogMCxcbiAgICAgICAgICAgICAgICAgICAgcmVsOiAwLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxla2I6IDEsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9wbGF5OiB5b3V0dWJlUGxheWVyLmF1dG9QbGF5XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gJ29uUmVhZHknOiBZb3V0dWJlSGFuZGxlci5vblJlYWR5LFxuICAgICAgICAgICAgICAgICAgICAnb25TdGF0ZUNoYW5nZSc6IFlvdXR1YmVIYW5kbGVyLm9uU3RhdGVDaGFuZ2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcGxheWVyc1t5b3V0dWJlUGxheWVyLmlkXSA9IHlvdXR1YmVQbGF5ZXI7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIFlvdXR1YmVIYW5kbGVyLnBsYXllcnMgPSBwbGF5ZXJzO1xuXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFdoZW4gcGxheWVyIGlzIHJlYWR5IHRvIHBsYXlcbiAgICAgKi9cbiAgICBvblJlYWR5IDogZnVuY3Rpb24oZXZlbnQpIHtcblxuICAgICAgICBjb25zdCBwbGF5ZXJDb250YWluZXJJZCA9IGV2ZW50LnRhcmdldC5nZXRJZnJhbWUoKS5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IFlvdXR1YmVIYW5kbGVyLnBsYXllcnNbcGxheWVyQ29udGFpbmVySWRdLnBsYXllcjtcblxuICAgICAgICAvLyBTaG93IHZpZGVvXG4gICAgICAgIC8vIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsgJCgnIycgKyBwbGF5ZXJDb250YWluZXJJZCkuc3RvcCgpLmFuaW1hdGUoeyBvcGFjaXR5OiAxIH0sMTAwMCkgfSw4MDApO1xuXG4gICAgICAgIC8vIElmIG5vdCBvbiB0YWJsZXQgb3IgbW9iaWxlLCBwbGF5IG9uIGhpZ2ggcXVhbGl0eVxuICAgICAgICAvLyBwbGF5ZXIubXV0ZSgpO1xuICAgICAgICAvLyBwbGF5ZXIucGxheVZpZGVvKCk7XG4gICAgICAgIC8vIHBsYXllci5zZXRQbGF5YmFja1F1YWxpdHkoJ2hkMTA4MCcpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW5lciBmb3IgWW91dHViZSBzdGF0ZSBjaGFuZ2VcbiAgICAgKi9cbiAgICBvblN0YXRlQ2hhbmdlIDogZnVuY3Rpb24oZXZlbnQpIHtcblxuICAgICAgICBjb25zdCBwbGF5ZXJDb250YWluZXJJZCA9IGV2ZW50LnRhcmdldC5nZXRJZnJhbWUoKS5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IFlvdXR1YmVIYW5kbGVyLnBsYXllcnNbcGxheWVyQ29udGFpbmVySWRdLnBsYXllcjtcblxuICAgICAgICBjb25zdCB2aWRlb1N0YXRlID0gZXZlbnQuZGF0YTtcblxuICAgICAgICAvLyBMb29wIHZpZGVvXG4gICAgICAgIGlmIChldmVudC5kYXRhID09PSBZVC5QbGF5ZXJTdGF0ZS5FTkRFRCApIHtcbiAgICAgICAgICAgIHBsYXllci5wbGF5VmlkZW8oKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbllvdXR1YmVIYW5kbGVyLmluaXQoKTsiLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgQnJvd3NlciBIYW5kbGVyXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuY29uc3QgQnJvd3NlckhhbmRsZXIgPSB7XG5cbiAgICB1c2VyQWdlbnQ6ICcnLFxuICAgIGJyb3dzZXJJbmZvOiAnJyxcblxuXG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICBCcm93c2VySGFuZGxlci51c2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgICAgICAgQnJvd3NlckhhbmRsZXIuYnJvd3NlckluZm8gPSBCcm93c2VySGFuZGxlci5nZXRCcm93c2VySW5mbygpO1xuICAgICAgICBCcm93c2VySGFuZGxlci5oYW5kbGVJRSgpO1xuICAgICAgICBCcm93c2VySGFuZGxlci5oYW5kbGVTYWZhcmkoKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlSUU6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAvLyBEZXRlY3QgdmVyc2lvbnMgYmVsb3cgaWUxMVxuICAgICAgICBsZXQgbXNpZSA9IEJyb3dzZXJIYW5kbGVyLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFICcpO1xuICAgICAgICBjb25zdCBpZWx0MTEgPSBtc2llID4gMDtcblxuICAgICAgICAvLyBEZXRlY3QgaWUxMVxuICAgICAgICBjb25zdCBpZTExID0gISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9UcmlkZW50LipydlxcOjExXFwuLyk7XG5cbiAgICAgICAgLy8gSWYgSW50ZXJuZXQgRXhwbG9yZXJcbiAgICAgICAgaWYgKGllbHQxMSB8fCBpZTExKSB7XG4gICAgICAgICAgICAvLyBEZWZhdWx0IHZlcnNpb25cbiAgICAgICAgICAgIGxldCB2ZXJzaW9uID0gJzExJztcblxuICAgICAgICAgICAgLy8gV2F5IHRvIGRldGVjdCB2ZXJzaW9uIDwgMTFcbiAgICAgICAgICAgIGlmIChpZWx0MTEpIHZlcnNpb24gPSBwYXJzZUludChCcm93c2VySGFuZGxlci51c2VyQWdlbnQuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgIG1zaWUgKyA1LFxuICAgICAgICAgICAgICAgIEJyb3dzZXJIYW5kbGVyLnVzZXJBZ2VudC5pbmRleE9mKFwiLlwiLCBtc2llKVxuICAgICAgICAgICAgKSk7XG5cbiAgICAgICAgICAgIC8vIEFwcGVuZCBjbGFzc2VzIHRvIEhUTUwgKHdlIGhhdmUgdG8gZG8gdGhpcyBzZXBhcmF0ZWx5IGJlY2F1c2UgZWxzZSBpZSB3aWxsIGZhaWwpXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2llJyk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3YnK3ZlcnNpb24pO1xuICAgICAgICB9XG5cbiAgICB9LFxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIG9sZGVyIHNhZmFyaSB2ZXJzaW9uXG4gICAgaGFuZGxlU2FmYXJpOiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaWYoQnJvd3NlckhhbmRsZXIuYnJvd3NlckluZm8ubmFtZSA9PT0gJ1NhZmFyaScgJiYgQnJvd3NlckhhbmRsZXIuYnJvd3NlckluZm8udmVyc2lvbiA8PSAxMCl7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpWzBdLmNsYXNzTGlzdC5hZGQoJ2llJyk7XG4gICAgICAgIH1cblxuICAgIH0sXG5cbiAgICBnZXRCcm93c2VySW5mbzogZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgdWE9bmF2aWdhdG9yLnVzZXJBZ2VudCx0ZW0sTT11YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cXC8pKVxcLz9cXHMqKFxcZCspL2kpIHx8IFtdO1xuICAgICAgICBpZigvdHJpZGVudC9pLnRlc3QoTVsxXSkpe1xuICAgICAgICAgICAgdGVtPS9cXGJydlsgOl0rKFxcZCspL2cuZXhlYyh1YSkgfHwgW107XG4gICAgICAgICAgICByZXR1cm4ge25hbWU6J0lFICcsdmVyc2lvbjoodGVtWzFdfHwnJyl9O1xuICAgICAgICB9XG4gICAgICAgIGlmKE1bMV09PT0nQ2hyb21lJyl7XG4gICAgICAgICAgICB0ZW09dWEubWF0Y2goL1xcYk9QUlxcLyhcXGQrKS8pXG4gICAgICAgICAgICBpZih0ZW0hPW51bGwpICAge3JldHVybiB7bmFtZTonT3BlcmEnLCB2ZXJzaW9uOnRlbVsxXX07fVxuICAgICAgICB9XG4gICAgICAgIE09TVsyXT8gW01bMV0sIE1bMl1dOiBbbmF2aWdhdG9yLmFwcE5hbWUsIG5hdmlnYXRvci5hcHBWZXJzaW9uLCAnLT8nXTtcbiAgICAgICAgaWYoKHRlbT11YS5tYXRjaCgvdmVyc2lvblxcLyhcXGQrKS9pKSkhPW51bGwpIHtNLnNwbGljZSgxLDEsdGVtWzFdKTt9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBNWzBdLFxuICAgICAgICAgICAgdmVyc2lvbjogTVsxXVxuICAgICAgICB9O1xuICAgIH1cbn07XG5cbkJyb3dzZXJIYW5kbGVyLmluaXQoKTsiLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIEhlbHBlciBmdW5jdGlvbnNcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKlxuICogU2ltcGxlIGlzc2V0IG1ldGhvZCBmb3IgdGhpcyBkb2VzIG5vdCBleGlzdCBpbiBqYXZhc2NyaXB0XG4gKi9cbndpbmRvdy5pc3NldCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqICE9PSBudWxsO1xufTtcblxuLypcbiAqIEVhc2luZyBGdW5jdGlvbnMgLSBpbnNwaXJlZCBmcm9tIGh0dHA6Ly9naXptYS5jb20vZWFzaW5nL1xuICogb25seSBjb25zaWRlcmluZyB0aGUgdCB2YWx1ZSBmb3IgdGhlIHJhbmdlIFswLCAxXSA9PiBbMCwgMV1cbiAqL1xud2luZG93LkVhc2luZ0Z1bmN0aW9ucyA9IHtcbiAgICAvLyBubyBlYXNpbmcsIG5vIGFjY2VsZXJhdGlvblxuICAgIGxpbmVhcjogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRcbiAgICB9LFxuICAgIC8vIGFjY2VsZXJhdGluZyBmcm9tIHplcm8gdmVsb2NpdHlcbiAgICBlYXNlSW5RdWFkOiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCAqIHRcbiAgICB9LFxuICAgIC8vIGRlY2VsZXJhdGluZyB0byB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZU91dFF1YWQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0ICogKDIgLSB0KVxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW9uIHVudGlsIGhhbGZ3YXksIHRoZW4gZGVjZWxlcmF0aW9uXG4gICAgZWFzZUluT3V0UXVhZDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPCAuNSA/IDIgKiB0ICogdCA6IC0xICsgKDQgLSAyICogdCkgKiB0XG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpbmcgZnJvbSB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZUluQ3ViaWM6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0ICogdCAqIHRcbiAgICB9LFxuICAgIC8vIGRlY2VsZXJhdGluZyB0byB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZU91dEN1YmljOiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gKC0tdCkgKiB0ICogdCArIDFcbiAgICB9LFxuICAgIC8vIGFjY2VsZXJhdGlvbiB1bnRpbCBoYWxmd2F5LCB0aGVuIGRlY2VsZXJhdGlvblxuICAgIGVhc2VJbk91dEN1YmljOiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCA8IC41ID8gNCAqIHQgKiB0ICogdCA6ICh0IC0gMSkgKiAoMiAqIHQgLSAyKSAqICgyICogdCAtIDIpICsgMVxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW5nIGZyb20gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VJblF1YXJ0OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCAqIHQgKiB0ICogdFxuICAgIH0sXG4gICAgLy8gZGVjZWxlcmF0aW5nIHRvIHplcm8gdmVsb2NpdHlcbiAgICBlYXNlT3V0UXVhcnQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiAxIC0gKC0tdCkgKiB0ICogdCAqIHRcbiAgICB9LFxuICAgIC8vIGFjY2VsZXJhdGlvbiB1bnRpbCBoYWxmd2F5LCB0aGVuIGRlY2VsZXJhdGlvblxuICAgIGVhc2VJbk91dFF1YXJ0OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCA8IC41ID8gOCAqIHQgKiB0ICogdCAqIHQgOiAxIC0gOCAqICgtLXQpICogdCAqIHQgKiB0XG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpbmcgZnJvbSB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZUluUXVpbnQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0ICogdCAqIHQgKiB0ICogdFxuICAgIH0sXG4gICAgLy8gZGVjZWxlcmF0aW5nIHRvIHplcm8gdmVsb2NpdHlcbiAgICBlYXNlT3V0UXVpbnQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiAxICsgKC0tdCkgKiB0ICogdCAqIHQgKiB0XG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpb24gdW50aWwgaGFsZndheSwgdGhlbiBkZWNlbGVyYXRpb25cbiAgICBlYXNlSW5PdXRRdWludDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPCAuNSA/IDE2ICogdCAqIHQgKiB0ICogdCAqIHQgOiAxICsgMTYgKiAoLS10KSAqIHQgKiB0ICogdCAqIHRcbiAgICB9XG59O1xuXG4vKlxuICogVmFuaWxsYSB2ZXJzaW9uIG9mIHRoZSAkLmdldFNjcmlwdFxuICovXG53aW5kb3cuZ2V0U2NyaXB0ID0gZnVuY3Rpb24gKHNvdXJjZSwgY2FsbGJhY2spIHtcbiAgICBsZXQgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgc2NyaXB0LmFzeW5jID0gMTtcblxuICAgIHdpbmRvdy5zY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpO1xuICAgIGxldCBwcmlvciA9IHNjcmlwdHNbc2NyaXB0cy5sZW5ndGggLSAxXTtcblxuICAgIHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKF8sIGlzQWJvcnQpIHtcbiAgICAgICAgaWYgKGlzQWJvcnQgfHwgIXNjcmlwdC5yZWFkeVN0YXRlIHx8IC9sb2FkZWR8Y29tcGxldGUvLnRlc3Qoc2NyaXB0LnJlYWR5U3RhdGUpKSB7XG4gICAgICAgICAgICBzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICBzY3JpcHQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGlmICghaXNBYm9ydCkge1xuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBzY3JpcHQuc3JjID0gc291cmNlO1xuICAgIHByaW9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNjcmlwdCwgcHJpb3IpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIGFzIGxvbmcgYXMgaXQgY29udGludWVzIHRvIGJlIGludm9rZWQsIHdpbGwgbm90XG4gKiBiZSB0cmlnZ2VyZWQuIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZnRlciBpdCBzdG9wcyBiZWluZyBjYWxsZWQgZm9yXG4gKiBOIG1pbGxpc2Vjb25kcy4gSWYgYGltbWVkaWF0ZWAgaXMgcGFzc2VkLCB0cmlnZ2VyIHRoZSBmdW5jdGlvbiBvbiB0aGVcbiAqIGxlYWRpbmcgZWRnZSwgaW5zdGVhZCBvZiB0aGUgdHJhaWxpbmcuXG4gKiBAcGFyYW0gZnVuY1xuICogQHBhcmFtIHdhaXRcbiAqIEBwYXJhbSBpbW1lZGlhdGVcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xud2luZG93LmRlYm91bmNlID0gZnVuY3Rpb24oZnVuYywgd2FpdCwgaW1tZWRpYXRlKSB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBsZXQgbGF0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmICghaW1tZWRpYXRlKSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG4gICAgICAgIGlmIChjYWxsTm93KSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIH07XG59O1xuXG4vKlxuICogQ29va2llIGhlbHBlciBjbGFzc1xuICovXG53aW5kb3cuQ29va2llID0ge1xuICAgIHNldDogZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBkYXlzKSB7XG4gICAgICAgIGxldCBkb21haW4sIGRvbWFpblBhcnRzLCBkYXRlLCBleHBpcmVzLCBob3N0O1xuXG4gICAgICAgIGlmIChkYXlzKSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIChkYXlzICogMjQgKiA2MCAqIDYwICogMTAwMCkpO1xuICAgICAgICAgICAgZXhwaXJlcyA9IFwiOyBleHBpcmVzPVwiICsgZGF0ZS50b0dNVFN0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXhwaXJlcyA9IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBob3N0ID0gbG9jYXRpb24uaG9zdDtcbiAgICAgICAgaWYgKGlzSVBPckxvY2FsSG9zdChsb2NhdGlvbi5ob3N0bmFtZSkpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyBcIj1cIiArIHZhbHVlICsgZXhwaXJlcyArIFwiOyBwYXRoPS9cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSBjb29raWUgb24gYWxsIHN1YiBkb21haW5zLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFN0YXJ0IHdpdGggdHJ5aW5nIHRvIHNldCBjb29raWUgdG8gdGhlIHRvcCBkb21haW4uXG4gICAgICAgICAgICAvLyAoZXhhbXBsZTogaWYgdXNlciBpcyBvbiBmb28uY29tLCB0cnkgdG8gc2V0XG4gICAgICAgICAgICAvLyAgY29va2llIHRvIGRvbWFpbiBcIi5jb21cIilcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBJZiB0aGUgY29va2llIHdpbGwgbm90IGJlIHNldCwgaXQgbWVhbnMgXCIuY29tXCJcbiAgICAgICAgICAgIC8vIGlzIGEgdG9wIGxldmVsIGRvbWFpbiBhbmQgd2UgbmVlZCB0b1xuICAgICAgICAgICAgLy8gc2V0IHRoZSBjb29raWUgdG8gXCIuZm9vLmNvbVwiXG4gICAgICAgICAgICBkb21haW5QYXJ0cyA9IGhvc3Quc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIGRvbWFpblBhcnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICBkb21haW4gPSAnLicgKyBkb21haW5QYXJ0cy5qb2luKCcuJyk7XG5cbiAgICAgICAgICAgIC8vIEZvciBkZXZlbG9wbWVudCBwdXJwb3NlLCByZW1vdmUgdGhpcyB3aGVuIG1vdmluZyB0byBwcm9kdWN0aW9uXG4gICAgICAgICAgICAvLyBkb21haW4gPSAnLmtvbW1hLnBybyc7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyBcIj1cIiArIHZhbHVlICsgZXhwaXJlcyArIFwiOyBwYXRoPS87IGRvbWFpbj1cIiArIGRvbWFpbjtcblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgY29va2llIHdhcyBzdWNjZXNzZnVseSBzZXQgdG8gdGhlIGdpdmVuIGRvbWFpblxuICAgICAgICAgICAgLy8gKG90aGVyd2lzZSBpdCB3YXMgYSBUb3AtTGV2ZWwgRG9tYWluKVxuICAgICAgICAgICAgaWYgKENvb2tpZS5nZXQobmFtZSkgPT0gbnVsbCB8fCBDb29raWUuZ2V0KG5hbWUpICE9IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gYXBwZW5kIFwiLlwiIHRvIGN1cnJlbnQgZG9tYWluXG4gICAgICAgICAgICAgICAgZG9tYWluID0gJy4nICsgaG9zdDtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBuYW1lICsgXCI9XCIgKyB2YWx1ZSArIGV4cGlyZXMgKyBcIjsgcGF0aD0vOyBkb21haW49XCIgKyBkb21haW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB3aW5kb3cubmFtZUVRID0gbmFtZSArIFwiPVwiO1xuICAgICAgICB3aW5kb3cuY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGMgPSBjYVtpXTtcbiAgICAgICAgICAgIHdoaWxlIChjLmNoYXJBdCgwKSA9PT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgYyA9IGMuc3Vic3RyaW5nKDEsIGMubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGMuaW5kZXhPZihuYW1lRVEpID09PSAwKSByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxlbmd0aCwgYy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cbiAgICBlcmFzZTogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgQ29va2llLnNldChuYW1lLCAnJywgLTEpO1xuICAgIH0sXG5cblxufTtcblxud2luZG93LmlzSVBPckxvY2FsSG9zdCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgaXNJcEFkZHJlc3ModmFsdWUpIHx8XG4gICAgICAgICh2YWx1ZSA9PT0gJ2xvY2FsaG9zdCcpXG4gICAgKVxufTtcblxud2luZG93LmlzSXBBZGRyZXNzID0gZnVuY3Rpb24gKGlwYWRkcmVzcykge1xuICAgIHJldHVybiAoL14oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KSQvLnRlc3QoaXBhZGRyZXNzKSlcbn07XG5cbi8qXG4gKiBKYXZhc2NyaXB0IHZlcnNpb24gb2YgdGhlIG51bWJlcl9mb3JtYXQgbWV0aG9kIG9mIFBIUFxuICovXG53aW5kb3cubnVtYmVyX2Zvcm1hdCA9IGZ1bmN0aW9uIChudW1iZXIsIGRlY2ltYWxzLCBkZWNfcG9pbnQsIHRob3VzYW5kc19zZXApIHtcbiAgICAvLyBTdHJpcCBhbGwgY2hhcmFjdGVycyBidXQgbnVtZXJpY2FsIG9uZXMuXG4gICAgbnVtYmVyID0gKG51bWJlciArICcnKS5yZXBsYWNlKC9bXjAtOStcXC1FZS5dL2csICcnKTtcbiAgICBsZXQgbiA9ICFpc0Zpbml0ZSgrbnVtYmVyKSA/IDAgOiArbnVtYmVyLFxuICAgICAgICBwcmVjID0gIWlzRmluaXRlKCtkZWNpbWFscykgPyAwIDogTWF0aC5hYnMoZGVjaW1hbHMpLFxuICAgICAgICBzZXAgPSAodHlwZW9mIHRob3VzYW5kc19zZXAgPT09ICd1bmRlZmluZWQnKSA/ICcsJyA6IHRob3VzYW5kc19zZXAsXG4gICAgICAgIGRlYyA9ICh0eXBlb2YgZGVjX3BvaW50ID09PSAndW5kZWZpbmVkJykgPyAnLicgOiBkZWNfcG9pbnQsXG4gICAgICAgIHMgPSAnJyxcbiAgICAgICAgdG9GaXhlZEZpeCA9IGZ1bmN0aW9uIChuLCBwcmVjKSB7XG4gICAgICAgICAgICB2YXIgayA9IE1hdGgucG93KDEwLCBwcmVjKTtcbiAgICAgICAgICAgIHJldHVybiAnJyArIE1hdGgucm91bmQobiAqIGspIC8gaztcbiAgICAgICAgfTtcbiAgICAvLyBGaXggZm9yIElFIHBhcnNlRmxvYXQoMC41NSkudG9GaXhlZCgwKSA9IDA7XG4gICAgcyA9IChwcmVjID8gdG9GaXhlZEZpeChuLCBwcmVjKSA6ICcnICsgTWF0aC5yb3VuZChuKSkuc3BsaXQoJy4nKTtcbiAgICBpZiAoc1swXS5sZW5ndGggPiAzKSB7XG4gICAgICAgIHNbMF0gPSBzWzBdLnJlcGxhY2UoL1xcQig/PSg/OlxcZHszfSkrKD8hXFxkKSkvZywgc2VwKTtcbiAgICB9XG4gICAgaWYgKChzWzFdIHx8ICcnKS5sZW5ndGggPCBwcmVjKSB7XG4gICAgICAgIHNbMV0gPSBzWzFdIHx8ICcnO1xuICAgICAgICBzWzFdICs9IG5ldyBBcnJheShwcmVjIC0gc1sxXS5sZW5ndGggKyAxKS5qb2luKCcwJyk7XG4gICAgfVxuICAgIHJldHVybiBzLmpvaW4oZGVjKTtcbn07XG5cblxuLyoqXG4gKiBFbGVtZW50LmNsb3Nlc3QoKSBwb2x5ZmlsbFxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvY2xvc2VzdCNQb2x5ZmlsbFxuICovXG5pZiAoIUVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3QpIHtcbiAgICBpZiAoIUVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMpIHtcbiAgICAgICAgRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcyA9IEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yIHx8IEVsZW1lbnQucHJvdG90eXBlLndlYmtpdE1hdGNoZXNTZWxlY3RvcjtcbiAgICB9XG4gICAgRWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdCA9IGZ1bmN0aW9uIChzKSB7XG4gICAgICAgIHZhciBlbCA9IHRoaXM7XG4gICAgICAgIHZhciBhbmNlc3RvciA9IHRoaXM7XG4gICAgICAgIGlmICghZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKGVsKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmIChhbmNlc3Rvci5tYXRjaGVzKHMpKSByZXR1cm4gYW5jZXN0b3I7XG4gICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIH0gd2hpbGUgKGFuY2VzdG9yICE9PSBudWxsKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbn1cblxud2luZG93LkFqYXggPSB7XG5cbiAgICAvL1RPRE86IENhbiB3ZSBjcmVhdGUgYSBwcmVwYXJlIHJlcXVlc3QgZnVuY3Rpb24gPz9cblxuICAgIGdldDogZnVuY3Rpb24odXJsLCBjYWxsYmFjaykge1xuICAgICAgICBsZXQgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIGxldCB0b2tlbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKS5jb250ZW50O1xuXG4gICAgICAgIHhoci5vcGVuKCdnZXQnLCB1cmwsIHRydWUpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ1gtQ1NSRi1UT0tFTicsIHRva2VuKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ1gtUmVxdWVzdGVkLVdpdGgnLCAnWE1MSHR0cFJlcXVlc3QnKTtcbiAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soeGhyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9LFxuXG4gICAgcG9zdDogZnVuY3Rpb24odXJsLCBkYXRhLCBjYWxsYmFjaykge1xuICAgICAgICBsZXQgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIGxldCB0b2tlbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKS5jb250ZW50O1xuXG4gICAgICAgIHhoci5vcGVuKCdwb3N0JywgdXJsLCB0cnVlKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLUNTUkYtVE9LRU4nLCB0b2tlbik7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLVJlcXVlc3RlZC1XaXRoJywgJ1hNTEh0dHBSZXF1ZXN0Jyk7XG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHhocik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHhoci5zZW5kKCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBDYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIHN0cmluZ1xuICogQHBhcmFtIHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xud2luZG93LmNhcGl0YWxpemVGaXJzdExldHRlciA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyaW5nLnNsaWNlKDEpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IHNuYWtlIGNhc2UgaW50byBjYW1lbGNhc2VcbiAqXG4gKiBAcGFyYW0gc3RyaW5nXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZnVuY3Rpb24gc25ha2VUb0NhbWVsKHN0cmluZyl7XG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8oXFwtXFx3KS9nLCBmdW5jdGlvbihtKXtyZXR1cm4gbVsxXS50b1VwcGVyQ2FzZSgpO30pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgaW5kZXggb2YgYW4gZWxlbWVudCBpbnNpZGUgaXRzIHBhcmVudFxuICovXG5mdW5jdGlvbiBpbmRleEluUGFyZW50KG5vZGUpIHtcbiAgICB3aW5kb3cuY2hpbGRyZW4gPSBub2RlLnBhcmVudE5vZGUuY2hpbGROb2RlcztcbiAgICBsZXQgbnVtID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChjaGlsZHJlbltpXSA9PSBub2RlKSByZXR1cm4gbnVtO1xuICAgICAgICBpZiAoY2hpbGRyZW5baV0ubm9kZVR5cGUgPT0gMSkgbnVtKys7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBGb3Igc2VjdXJpdHkgcmVhc29ucyBpT1MgU2FmYXJpIG9ubHkgYWxsb3dzIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5JykgZm9yIHRleHQgd2l0aGluIGEgY29udGVudEVkaXRhYmxlIGNvbnRhaW5lci5cbiAqIFRoZSB3b3JrYXJvdW5kIGlzIHRvIGRldGVjdCBpT1MgU2FmYXJpIGFuZCBxdWlja2x5IHRvZ2dsZSBjb250ZW50RWRpdGFibGUgYmVmb3JlIGV4ZWN1dGluZyBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpLlxuICogV2hlYiBpbnB1dCBvciB0ZXh0YXJlYSBpcyBSRUFET05MWSB5b3UgY2FuIHByZXZlbnQgdGhlIHVud2FudGVkIHBvcHVwIHdpdGggY29weS9wYXN0ZSBmdW5jdGlvbnMgYW5kIHRoZSBpbnB1dCBrZXlib2FyZFxuICogQ29kZSBmcm9tOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDY5ODE4NDdcbiAqL1xuZnVuY3Rpb24gY29weVRvQ2xpcGJvYXJkKGVsKSB7XG5cbiAgICAvLyByZXNvbHZlIHRoZSBlbGVtZW50XG4gICAgZWwgPSAodHlwZW9mIGVsID09PSAnc3RyaW5nJykgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsKSA6IGVsO1xuXG4gICAgLy8gaGFuZGxlIGlPUyBhcyBhIHNwZWNpYWwgY2FzZVxuICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pcGFkfGlwb2R8aXBob25lL2kpKSB7XG5cbiAgICAgICAgLy8gc2F2ZSBjdXJyZW50IGNvbnRlbnRFZGl0YWJsZS9yZWFkT25seSBzdGF0dXNcbiAgICAgICAgd2luZG93LmVkaXRhYmxlID0gZWwuY29udGVudEVkaXRhYmxlO1xuICAgICAgICB3aW5kb3cucmVhZE9ubHkgPSBlbC5yZWFkT25seTtcblxuICAgICAgICAvLyBjb252ZXJ0IHRvIGVkaXRhYmxlIHdpdGggcmVhZG9ubHkgdG8gc3RvcCBpT1Mga2V5Ym9hcmQgb3BlbmluZ1xuICAgICAgICBlbC5jb250ZW50RWRpdGFibGUgPSB0cnVlO1xuICAgICAgICBlbC5yZWFkT25seSA9IHRydWU7XG5cbiAgICAgICAgLy8gY3JlYXRlIGEgc2VsZWN0YWJsZSByYW5nZVxuICAgICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWwpO1xuXG4gICAgICAgIC8vIHNlbGVjdCB0aGUgcmFuZ2VcbiAgICAgICAgd2luZG93LnNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZSgwLCA5OTk5OTkpO1xuXG4gICAgICAgIC8vIHJlc3RvcmUgY29udGVudEVkaXRhYmxlL3JlYWRPbmx5IHRvIG9yaWdpbmFsIHN0YXRlXG4gICAgICAgIGVsLmNvbnRlbnRFZGl0YWJsZSA9IGVkaXRhYmxlO1xuICAgICAgICBlbC5yZWFkT25seSA9IHJlYWRPbmx5O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZWwuc2VsZWN0KCk7XG4gICAgfVxuXG4gICAgLy8gZXhlY3V0ZSBjb3B5IGNvbW1hbmRcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xufSIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBTY3JvbGwgaGFuZGxlclxuICAgLSBIYW5kbGVyIHRoZSBvYmplY3RzIHdoaWNoIGFyZSBiaW5kIG9uIHNjcm9sbCBldmVudHMgb3IgdmlzaWJsZSBpbiB2aWV3cG9ydFxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IFNjcm9sbEhhbmRsZXIgPSB7XG5cbiAgICAvLyBWYXJpYWJsZXMgZm9yIGRlYm91bmNlIGFuZCB0aHJvdHRsZSBlZmZlY3RzXG4gICAgdGltZTogRGF0ZS5ub3coKSxcbiAgICB0aW1lb3V0OiBudWxsLFxuICAgIHdhaXRUaHJvdHRsZTogMTAwMCxcbiAgICB3YWl0RGVib3VuY2U6IDMwMCxcblxuICAgIC8vIFZhcmlhYmxlcyBmb3Igc2Nyb2xsIGRpcmVjdGlvblxuICAgIGxhc3RTY3JvbGxUb3BQb3NpdGlvbjogMCxcbiAgICBzY3JvbGxEaXJlY3Rpb25Eb3duOiB0cnVlLFxuICAgIHNjcm9sbERpcmVjdGlvblVwOiBmYWxzZSxcblxuICAgIC8vSW5pdGlhbGlzYXRpb25cbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy8gVHJpZ2dlciBzdGFydCBvbiBzdGFydCB1cFxuICAgICAgICBTY3JvbGxIYW5kbGVyLnRyaWdnZXJPbkluaXQoKTtcblxuICAgICAgICAvLyBUaHJvdHRsZSBzY3JvbGxcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICgoU2Nyb2xsSGFuZGxlci50aW1lICsgU2Nyb2xsSGFuZGxlci53YWl0VGhyb3R0bGUgLSBEYXRlLm5vdygpKSA8IDApIHtcbiAgICAgICAgICAgICAgICBTY3JvbGxIYW5kbGVyLnRyaWdnZXJUaHJvdHRsZSgpO1xuICAgICAgICAgICAgICAgIFNjcm9sbEhhbmRsZXIudGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNtb290aCBzY3JvbGxcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFNjcm9sbEhhbmRsZXIudHJpZ2dlclNtb290aCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBEZWJvdW5jZSBzY3JvbGxcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmKGlzc2V0KFNjcm9sbEhhbmRsZXIudGltZW91dCkpIGNsZWFyVGltZW91dChTY3JvbGxIYW5kbGVyLnRpbWVvdXQpO1xuICAgICAgICAgICAgU2Nyb2xsSGFuZGxlci50aW1lb3V0ID0gc2V0VGltZW91dChTY3JvbGxIYW5kbGVyLnRyaWdnZXJEZWJvdW5jZSwgU2Nyb2xsSGFuZGxlci53YWl0RGVib3VuY2UpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gVHJpZ2dlciBvbiBzdGFydCB1cFxuICAgIHRyaWdnZXJPbkluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgU2Nyb2xsSGFuZGxlci50cmlnZ2VyRWxlbWVudEluVmlld3BvcnRBbmltYXRpb24oKTtcbiAgICB9LFxuXG4gICAgLy8gVHJpZ2dlciBzY3JvbGwgZnVuY3Rpb25zIHdpdGggdGhyb3R0bGUgKHByZWZlcnJlZClcbiAgICB0cmlnZ2VyVGhyb3R0bGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1Rocm90dGxlZCBzY3JvbGwnKTtcbiAgICAgICAgU2Nyb2xsSGFuZGxlci50cmlnZ2VyRWxlbWVudEluVmlld3BvcnRBbmltYXRpb24oKTtcbiAgICB9LFxuXG4gICAgLy8gVHJpZ2dlciBzY3JvbGwgb24gZGVib3VuY2VcbiAgICB0cmlnZ2VyRGVib3VuY2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ0RlYm91bmNlIHNjcm9sbCcpO1xuICAgIH0sXG5cbiAgICAvLyBUcmlnZ2VyIHNjcm9sbCBvbiB0aGUgZmxpZ2h0XG4gICAgdHJpZ2dlclNtb290aDogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnU21vb3RoIHNjcm9sbCcpO1xuICAgICAgICBTY3JvbGxIYW5kbGVyLmRldGVjdFNjcm9sbERpcmVjdGlvbigpO1xuICAgICAgICBTY3JvbGxIYW5kbGVyLnRvZ2dsZVN0aWNreUhlYWRlcigpO1xuICAgIH0sXG5cbiAgICAvLyBEZXRlY3QgaWYgcGFydCBvZiBhIGdpdmVuIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcbiAgICAvLyBFbCBtdXN0IGJlIGEgbm9kZSBlbGVtZW50XG4gICAgZGV0ZWN0SWZFbGVtZW50SXNQYXJ0bHlJblZpZXdwb3J0OiBmdW5jdGlvbihlbClcbiAgICB7XG4gICAgICAgIGlmKGlzc2V0KGVsKSl7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIC8vIERPTVJlY3QgeyB4OiA4LCB5OiA4LCB3aWR0aDogMTAwLCBoZWlnaHQ6IDEwMCwgdG9wOiA4LCByaWdodDogMTA4LCBib3R0b206IDEwOCwgbGVmdDogOCB9XG4gICAgICAgICAgICBjb25zdCB3aW5kb3dIZWlnaHQgPSAod2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpO1xuICAgICAgICAgICAgY29uc3Qgd2luZG93V2lkdGggPSAod2luZG93LmlubmVyV2lkdGggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTtcblxuICAgICAgICAgICAgY29uc3QgdmVydGljYWxJblZpZXcgPSAocmVjdC50b3AgPD0gKHdpbmRvd0hlaWdodCkpICYmICgocmVjdC50b3AgKyByZWN0LmhlaWdodCkgPj0gMCk7XG4gICAgICAgICAgICBjb25zdCBob3Jpem9udGFsSW5WaWV3ID0gKHJlY3QubGVmdCA8PSB3aW5kb3dXaWR0aCkgJiYgKChyZWN0LmxlZnQgKyByZWN0LndpZHRoKSA+PSAwKTtcblxuICAgICAgICAgICAgcmV0dXJuICh2ZXJ0aWNhbEluVmlldyAmJiBob3Jpem9udGFsSW5WaWV3KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBEZXRlY3QgaWYgYSBnaXZlbiBlbGVtZW50IGlzIGZ1bGx5IHZpc2libGUgaW4gdGhlIHZpZXdwb3J0XG4gICAgLy8gRWwgbXVzdCBiZSBhIG5vZGUgZWxlbWVudFxuICAgIGRldGVjdElmRWxlbWVudElzRnVsbHlJblZpZXdwb3J0OiBmdW5jdGlvbihlbClcbiAgICB7XG4gICAgICAgIGlmKGlzc2V0KGVsKSl7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgcmVjdC50b3AgPj0gMCAmJlxuICAgICAgICAgICAgICAgIHJlY3QuYm90dG9tIDw9IHdpbmRvdy5pbm5lckhlaWdodFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBkZXRlY3RTY3JvbGxEaXJlY3Rpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsVG9wUG9zaXRpb24gPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsgLy8gQ3JlZGl0czogXCJodHRwczovL2dpdGh1Yi5jb20vcWVyZW15L3NvL2Jsb2IvbWFzdGVyL3NvLmRvbS5qcyNMNDI2XCJcbiAgICAgICAgaWYgKHNjcm9sbFRvcFBvc2l0aW9uID49IFNjcm9sbEhhbmRsZXIubGFzdFNjcm9sbFRvcFBvc2l0aW9uKXtcbiAgICAgICAgICAgIFNjcm9sbEhhbmRsZXIuc2Nyb2xsRGlyZWN0aW9uRG93biA9IHRydWU7XG4gICAgICAgICAgICBTY3JvbGxIYW5kbGVyLnNjcm9sbERpcmVjdGlvblVwID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTY3JvbGxIYW5kbGVyLnNjcm9sbERpcmVjdGlvbkRvd24gPSBmYWxzZTtcbiAgICAgICAgICAgIFNjcm9sbEhhbmRsZXIuc2Nyb2xsRGlyZWN0aW9uVXAgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIFNjcm9sbEhhbmRsZXIubGFzdFNjcm9sbFRvcFBvc2l0aW9uID0gc2Nyb2xsVG9wUG9zaXRpb247XG4gICAgfSxcblxuICAgIC8vIFRyaWdnZXIgYW5pbWF0aW9uIG9uIGVsZW1lbnRzIHRoYXQgaGF2ZSAnZWxlbWVudC1pbi12aWV3cG9ydCcgYW5kIHRoYXQgYXJlIGluIHRoZSB2aWV3cG9ydFxuICAgIC8vIFRoZXNlIGFuaW1hdGlvbiBjYW4gb25seSBiZSB0cmlnZ2VyZWQgb25jZSwgaWYgeW91IHdhbnQgbW9yZSB0aGVuIHRoYXQgeW91IHNob3VsZCB3cml0ZSBhbiBzcGVjaWZpYyBmdW5jdGlvbiBmb3IgdGhpc1xuICAgIHRyaWdnZXJFbGVtZW50SW5WaWV3cG9ydEFuaW1hdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5lbGVtZW50LWluLXZpZXdwb3J0Jyk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzTGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoO1xuXG4gICAgICAgIGZvcihsZXQgZSA9IDA7IGUgPCBlbGVtZW50c0xlbmd0aDsgZSsrKXtcblxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW2VdO1xuICAgICAgICAgICAgaWYoU2Nyb2xsSGFuZGxlci5kZXRlY3RJZkVsZW1lbnRJc1BhcnRseUluVmlld3BvcnQoZWxlbWVudCkpe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZWxlbWVudC1pbi12aWV3cG9ydCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9LFxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENVU1RPTSBTQ1JPTEwgSEFORExFUlMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvLyBIaWRlIG9yIHNob3cgc3RpY2t5IG5hdmlnYXRpb24gd2hlbiBoZWFkZXIgaXNuJ3QgdmlzaWJsZVxuICAgIHRvZ2dsZVN0aWNreUhlYWRlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzdGlja3lIZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtc3RpY2t5LWhlYWRlcicpO1xuICAgICAgICBjb25zdCB2aXNpYmxlU3RpY2t5SGVhZGVyQ2xhc3MgPSAnaXMtc3RpY2t5LWhlYWRlci12aXNpYmxlJztcbiAgICAgICAgY29uc3Qgc3VibmF2TGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1zdWJuYXYnKTtcbiAgICAgICAgdmFyIHN1Yk5hdklzVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICBpZihzdGlja3lIZWFkZXIpIHN0aWNreUhlYWRlci5oaWRkZW4gPSBmYWxzZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1Ym5hdkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzdWJuYXZMaXN0W2ldLCBudWxsKS52aXNpYmlsaXR5ID09IFwidmlzaWJsZVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1Yk5hdklzVmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZihpc3NldChzdGlja3lIZWFkZXIpICYmICFzdWJOYXZJc1Zpc2libGUpe1xuICAgICAgICAgICAgLy8gSGlkZSB3aGVuIHNjcm9sbGluZyBET1dOIChPUiB3aXRoaW4gb2Zmc2V0KVxuICAgICAgICAgICAgaWYoU2Nyb2xsSGFuZGxlci5zY3JvbGxEaXJlY3Rpb25Eb3duIHx8IFNjcm9sbEhhbmRsZXIubGFzdFNjcm9sbFRvcFBvc2l0aW9uIDwgMTEwKXtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUodmlzaWJsZVN0aWNreUhlYWRlckNsYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNob3cgd2hlbiBzY3JvbGxpbmcgVVAgYW5kIG91dHNpZGUgb2Ygb2Zmc2V0XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQodmlzaWJsZVN0aWNreUhlYWRlckNsYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbn07XG5cblNjcm9sbEhhbmRsZXIuaW5pdCgpOyIsIi8vIHJlbW92ZWQgYnkgZXh0cmFjdC10ZXh0LXdlYnBhY2stcGx1Z2luIl0sInNvdXJjZVJvb3QiOiIifQ==