File: D:/HostingSpaces/SBogers10/demo.komma.pro/wwwroot/js/site/app.js
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["/js/site/app"],{
/***/ "./node_modules/@babel/runtime/regenerator/index.js":
/*!**********************************************************!*\
!*** ./node_modules/@babel/runtime/regenerator/index.js ***!
\**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
module.exports = __webpack_require__(/*! regenerator-runtime */ "./node_modules/regenerator-runtime/runtime.js");
/***/ }),
/***/ "./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/regenerator-runtime/runtime.js":
/*!*****************************************************!*\
!*** ./node_modules/regenerator-runtime/runtime.js ***!
\*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/**
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var runtime = (function (exports) {
"use strict";
var Op = Object.prototype;
var hasOwn = Op.hasOwnProperty;
var undefined; // More compressible than void 0.
var $Symbol = typeof Symbol === "function" ? Symbol : {};
var iteratorSymbol = $Symbol.iterator || "@@iterator";
var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
function wrap(innerFn, outerFn, self, tryLocsList) {
// If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
var generator = Object.create(protoGenerator.prototype);
var context = new Context(tryLocsList || []);
// The ._invoke method unifies the implementations of the .next,
// .throw, and .return methods.
generator._invoke = makeInvokeMethod(innerFn, self, context);
return generator;
}
exports.wrap = wrap;
// Try/catch helper to minimize deoptimizations. Returns a completion
// record like context.tryEntries[i].completion. This interface could
// have been (and was previously) designed to take a closure to be
// invoked without arguments, but in all the cases we care about we
// already have an existing method we want to call, so there's no need
// to create a new function object. We can even get away with assuming
// the method takes exactly one argument, since that happens to be true
// in every case, so we don't have to touch the arguments object. The
// only additional allocation required is the completion record, which
// has a stable shape and so hopefully should be cheap to allocate.
function tryCatch(fn, obj, arg) {
try {
return { type: "normal", arg: fn.call(obj, arg) };
} catch (err) {
return { type: "throw", arg: err };
}
}
var GenStateSuspendedStart = "suspendedStart";
var GenStateSuspendedYield = "suspendedYield";
var GenStateExecuting = "executing";
var GenStateCompleted = "completed";
// Returning this object from the innerFn has the same effect as
// breaking out of the dispatch switch statement.
var ContinueSentinel = {};
// Dummy constructor functions that we use as the .constructor and
// .constructor.prototype properties for functions that return Generator
// objects. For full spec compliance, you may wish to configure your
// minifier not to mangle the names of these two functions.
function Generator() {}
function GeneratorFunction() {}
function GeneratorFunctionPrototype() {}
// This is a polyfill for %IteratorPrototype% for environments that
// don't natively support it.
var IteratorPrototype = {};
IteratorPrototype[iteratorSymbol] = function () {
return this;
};
var getProto = Object.getPrototypeOf;
var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
if (NativeIteratorPrototype &&
NativeIteratorPrototype !== Op &&
hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
// This environment has a native %IteratorPrototype%; use it instead
// of the polyfill.
IteratorPrototype = NativeIteratorPrototype;
}
var Gp = GeneratorFunctionPrototype.prototype =
Generator.prototype = Object.create(IteratorPrototype);
GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
GeneratorFunctionPrototype.constructor = GeneratorFunction;
GeneratorFunctionPrototype[toStringTagSymbol] =
GeneratorFunction.displayName = "GeneratorFunction";
// Helper for defining the .next, .throw, and .return methods of the
// Iterator interface in terms of a single ._invoke method.
function defineIteratorMethods(prototype) {
["next", "throw", "return"].forEach(function(method) {
prototype[method] = function(arg) {
return this._invoke(method, arg);
};
});
}
exports.isGeneratorFunction = function(genFun) {
var ctor = typeof genFun === "function" && genFun.constructor;
return ctor
? ctor === GeneratorFunction ||
// For the native GeneratorFunction constructor, the best we can
// do is to check its .name property.
(ctor.displayName || ctor.name) === "GeneratorFunction"
: false;
};
exports.mark = function(genFun) {
if (Object.setPrototypeOf) {
Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
} else {
genFun.__proto__ = GeneratorFunctionPrototype;
if (!(toStringTagSymbol in genFun)) {
genFun[toStringTagSymbol] = "GeneratorFunction";
}
}
genFun.prototype = Object.create(Gp);
return genFun;
};
// Within the body of any async function, `await x` is transformed to
// `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
// `hasOwn.call(value, "__await")` to determine if the yielded value is
// meant to be awaited.
exports.awrap = function(arg) {
return { __await: arg };
};
function AsyncIterator(generator) {
function invoke(method, arg, resolve, reject) {
var record = tryCatch(generator[method], generator, arg);
if (record.type === "throw") {
reject(record.arg);
} else {
var result = record.arg;
var value = result.value;
if (value &&
typeof value === "object" &&
hasOwn.call(value, "__await")) {
return Promise.resolve(value.__await).then(function(value) {
invoke("next", value, resolve, reject);
}, function(err) {
invoke("throw", err, resolve, reject);
});
}
return Promise.resolve(value).then(function(unwrapped) {
// When a yielded Promise is resolved, its final value becomes
// the .value of the Promise<{value,done}> result for the
// current iteration.
result.value = unwrapped;
resolve(result);
}, function(error) {
// If a rejected Promise was yielded, throw the rejection back
// into the async generator function so it can be handled there.
return invoke("throw", error, resolve, reject);
});
}
}
var previousPromise;
function enqueue(method, arg) {
function callInvokeWithMethodAndArg() {
return new Promise(function(resolve, reject) {
invoke(method, arg, resolve, reject);
});
}
return previousPromise =
// If enqueue has been called before, then we want to wait until
// all previous Promises have been resolved before calling invoke,
// so that results are always delivered in the correct order. If
// enqueue has not been called before, then it is important to
// call invoke immediately, without waiting on a callback to fire,
// so that the async generator function has the opportunity to do
// any necessary setup in a predictable way. This predictability
// is why the Promise constructor synchronously invokes its
// executor callback, and why async functions synchronously
// execute code before the first await. Since we implement simple
// async functions in terms of async generators, it is especially
// important to get this right, even though it requires care.
previousPromise ? previousPromise.then(
callInvokeWithMethodAndArg,
// Avoid propagating failures to Promises returned by later
// invocations of the iterator.
callInvokeWithMethodAndArg
) : callInvokeWithMethodAndArg();
}
// Define the unified helper method that is used to implement .next,
// .throw, and .return (see defineIteratorMethods).
this._invoke = enqueue;
}
defineIteratorMethods(AsyncIterator.prototype);
AsyncIterator.prototype[asyncIteratorSymbol] = function () {
return this;
};
exports.AsyncIterator = AsyncIterator;
// Note that simple async functions are implemented on top of
// AsyncIterator objects; they just return a Promise for the value of
// the final result produced by the iterator.
exports.async = function(innerFn, outerFn, self, tryLocsList) {
var iter = new AsyncIterator(
wrap(innerFn, outerFn, self, tryLocsList)
);
return exports.isGeneratorFunction(outerFn)
? iter // If outerFn is a generator, return the full iterator.
: iter.next().then(function(result) {
return result.done ? result.value : iter.next();
});
};
function makeInvokeMethod(innerFn, self, context) {
var state = GenStateSuspendedStart;
return function invoke(method, arg) {
if (state === GenStateExecuting) {
throw new Error("Generator is already running");
}
if (state === GenStateCompleted) {
if (method === "throw") {
throw arg;
}
// Be forgiving, per 25.3.3.3.3 of the spec:
// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
return doneResult();
}
context.method = method;
context.arg = arg;
while (true) {
var delegate = context.delegate;
if (delegate) {
var delegateResult = maybeInvokeDelegate(delegate, context);
if (delegateResult) {
if (delegateResult === ContinueSentinel) continue;
return delegateResult;
}
}
if (context.method === "next") {
// Setting context._sent for legacy support of Babel's
// function.sent implementation.
context.sent = context._sent = context.arg;
} else if (context.method === "throw") {
if (state === GenStateSuspendedStart) {
state = GenStateCompleted;
throw context.arg;
}
context.dispatchException(context.arg);
} else if (context.method === "return") {
context.abrupt("return", context.arg);
}
state = GenStateExecuting;
var record = tryCatch(innerFn, self, context);
if (record.type === "normal") {
// If an exception is thrown from innerFn, we leave state ===
// GenStateExecuting and loop back for another invocation.
state = context.done
? GenStateCompleted
: GenStateSuspendedYield;
if (record.arg === ContinueSentinel) {
continue;
}
return {
value: record.arg,
done: context.done
};
} else if (record.type === "throw") {
state = GenStateCompleted;
// Dispatch the exception by looping back around to the
// context.dispatchException(context.arg) call above.
context.method = "throw";
context.arg = record.arg;
}
}
};
}
// Call delegate.iterator[context.method](context.arg) and handle the
// result, either by returning a { value, done } result from the
// delegate iterator, or by modifying context.method and context.arg,
// setting context.delegate to null, and returning the ContinueSentinel.
function maybeInvokeDelegate(delegate, context) {
var method = delegate.iterator[context.method];
if (method === undefined) {
// A .throw or .return when the delegate iterator has no .throw
// method always terminates the yield* loop.
context.delegate = null;
if (context.method === "throw") {
// Note: ["return"] must be used for ES3 parsing compatibility.
if (delegate.iterator["return"]) {
// If the delegate iterator has a return method, give it a
// chance to clean up.
context.method = "return";
context.arg = undefined;
maybeInvokeDelegate(delegate, context);
if (context.method === "throw") {
// If maybeInvokeDelegate(context) changed context.method from
// "return" to "throw", let that override the TypeError below.
return ContinueSentinel;
}
}
context.method = "throw";
context.arg = new TypeError(
"The iterator does not provide a 'throw' method");
}
return ContinueSentinel;
}
var record = tryCatch(method, delegate.iterator, context.arg);
if (record.type === "throw") {
context.method = "throw";
context.arg = record.arg;
context.delegate = null;
return ContinueSentinel;
}
var info = record.arg;
if (! info) {
context.method = "throw";
context.arg = new TypeError("iterator result is not an object");
context.delegate = null;
return ContinueSentinel;
}
if (info.done) {
// Assign the result of the finished delegate to the temporary
// variable specified by delegate.resultName (see delegateYield).
context[delegate.resultName] = info.value;
// Resume execution at the desired location (see delegateYield).
context.next = delegate.nextLoc;
// If context.method was "throw" but the delegate handled the
// exception, let the outer generator proceed normally. If
// context.method was "next", forget context.arg since it has been
// "consumed" by the delegate iterator. If context.method was
// "return", allow the original .return call to continue in the
// outer generator.
if (context.method !== "return") {
context.method = "next";
context.arg = undefined;
}
} else {
// Re-yield the result returned by the delegate method.
return info;
}
// The delegate iterator is finished, so forget it and continue with
// the outer generator.
context.delegate = null;
return ContinueSentinel;
}
// Define Generator.prototype.{next,throw,return} in terms of the
// unified ._invoke helper method.
defineIteratorMethods(Gp);
Gp[toStringTagSymbol] = "Generator";
// A Generator should always return itself as the iterator object when the
// @@iterator function is called on it. Some browsers' implementations of the
// iterator prototype chain incorrectly implement this, causing the Generator
// object to not be returned from this call. This ensures that doesn't happen.
// See https://github.com/facebook/regenerator/issues/274 for more details.
Gp[iteratorSymbol] = function() {
return this;
};
Gp.toString = function() {
return "[object Generator]";
};
function pushTryEntry(locs) {
var entry = { tryLoc: locs[0] };
if (1 in locs) {
entry.catchLoc = locs[1];
}
if (2 in locs) {
entry.finallyLoc = locs[2];
entry.afterLoc = locs[3];
}
this.tryEntries.push(entry);
}
function resetTryEntry(entry) {
var record = entry.completion || {};
record.type = "normal";
delete record.arg;
entry.completion = record;
}
function Context(tryLocsList) {
// The root entry object (effectively a try statement without a catch
// or a finally block) gives us a place to store values thrown from
// locations where there is no enclosing try statement.
this.tryEntries = [{ tryLoc: "root" }];
tryLocsList.forEach(pushTryEntry, this);
this.reset(true);
}
exports.keys = function(object) {
var keys = [];
for (var key in object) {
keys.push(key);
}
keys.reverse();
// Rather than returning an object with a next method, we keep
// things simple and return the next function itself.
return function next() {
while (keys.length) {
var key = keys.pop();
if (key in object) {
next.value = key;
next.done = false;
return next;
}
}
// To avoid creating an additional object, we just hang the .value
// and .done properties off the next function object itself. This
// also ensures that the minifier will not anonymize the function.
next.done = true;
return next;
};
};
function values(iterable) {
if (iterable) {
var iteratorMethod = iterable[iteratorSymbol];
if (iteratorMethod) {
return iteratorMethod.call(iterable);
}
if (typeof iterable.next === "function") {
return iterable;
}
if (!isNaN(iterable.length)) {
var i = -1, next = function next() {
while (++i < iterable.length) {
if (hasOwn.call(iterable, i)) {
next.value = iterable[i];
next.done = false;
return next;
}
}
next.value = undefined;
next.done = true;
return next;
};
return next.next = next;
}
}
// Return an iterator with no values.
return { next: doneResult };
}
exports.values = values;
function doneResult() {
return { value: undefined, done: true };
}
Context.prototype = {
constructor: Context,
reset: function(skipTempReset) {
this.prev = 0;
this.next = 0;
// Resetting context._sent for legacy support of Babel's
// function.sent implementation.
this.sent = this._sent = undefined;
this.done = false;
this.delegate = null;
this.method = "next";
this.arg = undefined;
this.tryEntries.forEach(resetTryEntry);
if (!skipTempReset) {
for (var name in this) {
// Not sure about the optimal order of these conditions:
if (name.charAt(0) === "t" &&
hasOwn.call(this, name) &&
!isNaN(+name.slice(1))) {
this[name] = undefined;
}
}
}
},
stop: function() {
this.done = true;
var rootEntry = this.tryEntries[0];
var rootRecord = rootEntry.completion;
if (rootRecord.type === "throw") {
throw rootRecord.arg;
}
return this.rval;
},
dispatchException: function(exception) {
if (this.done) {
throw exception;
}
var context = this;
function handle(loc, caught) {
record.type = "throw";
record.arg = exception;
context.next = loc;
if (caught) {
// If the dispatched exception was caught by a catch block,
// then let that catch block handle the exception normally.
context.method = "next";
context.arg = undefined;
}
return !! caught;
}
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
var record = entry.completion;
if (entry.tryLoc === "root") {
// Exception thrown outside of any try block that could handle
// it, so set the completion value of the entire function to
// throw the exception.
return handle("end");
}
if (entry.tryLoc <= this.prev) {
var hasCatch = hasOwn.call(entry, "catchLoc");
var hasFinally = hasOwn.call(entry, "finallyLoc");
if (hasCatch && hasFinally) {
if (this.prev < entry.catchLoc) {
return handle(entry.catchLoc, true);
} else if (this.prev < entry.finallyLoc) {
return handle(entry.finallyLoc);
}
} else if (hasCatch) {
if (this.prev < entry.catchLoc) {
return handle(entry.catchLoc, true);
}
} else if (hasFinally) {
if (this.prev < entry.finallyLoc) {
return handle(entry.finallyLoc);
}
} else {
throw new Error("try statement without catch or finally");
}
}
}
},
abrupt: function(type, arg) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.tryLoc <= this.prev &&
hasOwn.call(entry, "finallyLoc") &&
this.prev < entry.finallyLoc) {
var finallyEntry = entry;
break;
}
}
if (finallyEntry &&
(type === "break" ||
type === "continue") &&
finallyEntry.tryLoc <= arg &&
arg <= finallyEntry.finallyLoc) {
// Ignore the finally entry if control is not jumping to a
// location outside the try/catch block.
finallyEntry = null;
}
var record = finallyEntry ? finallyEntry.completion : {};
record.type = type;
record.arg = arg;
if (finallyEntry) {
this.method = "next";
this.next = finallyEntry.finallyLoc;
return ContinueSentinel;
}
return this.complete(record);
},
complete: function(record, afterLoc) {
if (record.type === "throw") {
throw record.arg;
}
if (record.type === "break" ||
record.type === "continue") {
this.next = record.arg;
} else if (record.type === "return") {
this.rval = this.arg = record.arg;
this.method = "return";
this.next = "end";
} else if (record.type === "normal" && afterLoc) {
this.next = afterLoc;
}
return ContinueSentinel;
},
finish: function(finallyLoc) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.finallyLoc === finallyLoc) {
this.complete(entry.completion, entry.afterLoc);
resetTryEntry(entry);
return ContinueSentinel;
}
}
},
"catch": function(tryLoc) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.tryLoc === tryLoc) {
var record = entry.completion;
if (record.type === "throw") {
var thrown = record.arg;
resetTryEntry(entry);
}
return thrown;
}
}
// The context.catch method must only be called with a location
// argument that corresponds to a known catch block.
throw new Error("illegal catch attempt");
},
delegateYield: function(iterable, resultName, nextLoc) {
this.delegate = {
iterator: values(iterable),
resultName: resultName,
nextLoc: nextLoc
};
if (this.method === "next") {
// Deliberately forget the last sent value so that we don't
// accidentally pass it on to the delegate.
this.arg = undefined;
}
return ContinueSentinel;
}
};
// Regardless of whether this script is executing as a CommonJS module
// or not, return the runtime object so that we can declare the variable
// regeneratorRuntime in the outer scope, which allows this module to be
// injected easily by `bin/regenerator --include-runtime script.js`.
return exports;
}(
// If this script is executing as a CommonJS module, use module.exports
// as the regeneratorRuntime namespace. Otherwise create a new empty
// object. Either way, the resulting object will be used to initialize
// the regeneratorRuntime variable at the top of this file.
true ? module.exports : undefined
));
try {
regeneratorRuntime = runtime;
} catch (accidentalStrictMode) {
// This module should not be running in strict mode, so the above
// assignment should always work unless something is misconfigured. Just
// in case runtime.js accidentally runs in strict mode, we can escape
// strict mode using a global Function call. This could conceivably fail
// if a Content Security Policy forbids using Function, but in that case
// the proper solution is to fix the accidental strict mode problem. If
// you've misconfigured your bundler to force strict mode and applied a
// CSP to forbid Function, and you're not willing to fix either of those
// problems, please detail your unique predicament in a GitHub issue.
Function("r", "regeneratorRuntime = r")(runtime);
}
/***/ }),
/***/ "./node_modules/setimmediate/setImmediate.js":
/*!***************************************************!*\
!*** ./node_modules/setimmediate/setImmediate.js ***!
\***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {
"use strict";
if (global.setImmediate) {
return;
}
var nextHandle = 1; // Spec says greater than zero
var tasksByHandle = {};
var currentlyRunningATask = false;
var doc = global.document;
var registerImmediate;
function setImmediate(callback) {
// Callback can either be a function or a string
if (typeof callback !== "function") {
callback = new Function("" + callback);
}
// Copy function arguments
var args = new Array(arguments.length - 1);
for (var i = 0; i < args.length; i++) {
args[i] = arguments[i + 1];
}
// Store and register the task
var task = { callback: callback, args: args };
tasksByHandle[nextHandle] = task;
registerImmediate(nextHandle);
return nextHandle++;
}
function clearImmediate(handle) {
delete tasksByHandle[handle];
}
function run(task) {
var callback = task.callback;
var args = task.args;
switch (args.length) {
case 0:
callback();
break;
case 1:
callback(args[0]);
break;
case 2:
callback(args[0], args[1]);
break;
case 3:
callback(args[0], args[1], args[2]);
break;
default:
callback.apply(undefined, args);
break;
}
}
function runIfPresent(handle) {
// From the spec: "Wait until any invocations of this algorithm started before this one have completed."
// So if we're currently running a task, we'll need to delay this invocation.
if (currentlyRunningATask) {
// Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
// "too much recursion" error.
setTimeout(runIfPresent, 0, handle);
} else {
var task = tasksByHandle[handle];
if (task) {
currentlyRunningATask = true;
try {
run(task);
} finally {
clearImmediate(handle);
currentlyRunningATask = false;
}
}
}
}
function installNextTickImplementation() {
registerImmediate = function(handle) {
process.nextTick(function () { runIfPresent(handle); });
};
}
function canUsePostMessage() {
// The test against `importScripts` prevents this implementation from being installed inside a web worker,
// where `global.postMessage` means something completely different and can't be used for this purpose.
if (global.postMessage && !global.importScripts) {
var postMessageIsAsynchronous = true;
var oldOnMessage = global.onmessage;
global.onmessage = function() {
postMessageIsAsynchronous = false;
};
global.postMessage("", "*");
global.onmessage = oldOnMessage;
return postMessageIsAsynchronous;
}
}
function installPostMessageImplementation() {
// Installs an event handler on `global` for the `message` event: see
// * https://developer.mozilla.org/en/DOM/window.postMessage
// * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
var messagePrefix = "setImmediate$" + Math.random() + "$";
var onGlobalMessage = function(event) {
if (event.source === global &&
typeof event.data === "string" &&
event.data.indexOf(messagePrefix) === 0) {
runIfPresent(+event.data.slice(messagePrefix.length));
}
};
if (global.addEventListener) {
global.addEventListener("message", onGlobalMessage, false);
} else {
global.attachEvent("onmessage", onGlobalMessage);
}
registerImmediate = function(handle) {
global.postMessage(messagePrefix + handle, "*");
};
}
function installMessageChannelImplementation() {
var channel = new MessageChannel();
channel.port1.onmessage = function(event) {
var handle = event.data;
runIfPresent(handle);
};
registerImmediate = function(handle) {
channel.port2.postMessage(handle);
};
}
function installReadyStateChangeImplementation() {
var html = doc.documentElement;
registerImmediate = function(handle) {
// Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
// into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
var script = doc.createElement("script");
script.onreadystatechange = function () {
runIfPresent(handle);
script.onreadystatechange = null;
html.removeChild(script);
script = null;
};
html.appendChild(script);
};
}
function installSetTimeoutImplementation() {
registerImmediate = function(handle) {
setTimeout(runIfPresent, 0, handle);
};
}
// If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
attachTo = attachTo && attachTo.setTimeout ? attachTo : global;
// Don't get fooled by e.g. browserify environments.
if ({}.toString.call(global.process) === "[object process]") {
// For Node.js before 0.9
installNextTickImplementation();
} else if (canUsePostMessage()) {
// For non-IE10 modern browsers
installPostMessageImplementation();
} else if (global.MessageChannel) {
// For web workers, where supported
installMessageChannelImplementation();
} else if (doc && "onreadystatechange" in doc.createElement("script")) {
// For IE 6–8
installReadyStateChangeImplementation();
} else {
// For older browsers
installSetTimeoutImplementation();
}
attachTo.setImmediate = setImmediate;
attachTo.clearImmediate = clearImmediate;
}(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self));
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../process/browser.js */ "./node_modules/process/browser.js")))
/***/ }),
/***/ "./node_modules/timers-browserify/main.js":
/*!************************************************!*\
!*** ./node_modules/timers-browserify/main.js ***!
\************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(global) {var scope = (typeof global !== "undefined" && global) ||
(typeof self !== "undefined" && self) ||
window;
var apply = Function.prototype.apply;
// DOM APIs, for completeness
exports.setTimeout = function() {
return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);
};
exports.setInterval = function() {
return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);
};
exports.clearTimeout =
exports.clearInterval = function(timeout) {
if (timeout) {
timeout.close();
}
};
function Timeout(id, clearFn) {
this._id = id;
this._clearFn = clearFn;
}
Timeout.prototype.unref = Timeout.prototype.ref = function() {};
Timeout.prototype.close = function() {
this._clearFn.call(scope, this._id);
};
// Does not start the time, just sets up the members needed.
exports.enroll = function(item, msecs) {
clearTimeout(item._idleTimeoutId);
item._idleTimeout = msecs;
};
exports.unenroll = function(item) {
clearTimeout(item._idleTimeoutId);
item._idleTimeout = -1;
};
exports._unrefActive = exports.active = function(item) {
clearTimeout(item._idleTimeoutId);
var msecs = item._idleTimeout;
if (msecs >= 0) {
item._idleTimeoutId = setTimeout(function onTimeout() {
if (item._onTimeout)
item._onTimeout();
}, msecs);
}
};
// setimmediate attaches itself to the global object
__webpack_require__(/*! setimmediate */ "./node_modules/setimmediate/setImmediate.js");
// On some exotic environments, it's not clear which object `setimmediate` was
// able to install onto. Search each possibility in the same order as the
// `setimmediate` library.
exports.setImmediate = (typeof self !== "undefined" && self.setImmediate) ||
(typeof global !== "undefined" && global.setImmediate) ||
(this && this.setImmediate);
exports.clearImmediate = (typeof self !== "undefined" && self.clearImmediate) ||
(typeof global !== "undefined" && global.clearImmediate) ||
(this && this.clearImmediate);
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
/***/ }),
/***/ "./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;
/***/ }),
/***/ "./resources/js/global/models/address.js":
/*!***********************************************!*\
!*** ./resources/js/global/models/address.js ***!
\***********************************************/
/*! exports provided: Address */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Address", function() { return Address; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* Address model.
* To carry around address data
*/
var Address =
/*#__PURE__*/
function () {
function Address() {
_classCallCheck(this, Address);
this._street = '';
this._house_number = '';
this._postal_code = '';
this._city = '';
this._phone = '';
this._countryIso3 = '';
this.toJSON = this._toJson.bind(this);
}
_createClass(Address, [{
key: "_toJson",
value: function _toJson() {
return {
'street': this._street,
'house_number': this._house_number,
'postal_code': this._postal_code,
'city': this._city,
'phone': this._phone,
'countryIso3': this._countryIso3
};
}
}, {
key: "street",
get: function get() {
return this._street;
},
set: function set(value) {
this._street = value;
}
}, {
key: "house_number",
get: function get() {
return this._house_number;
},
set: function set(value) {
this._house_number = value;
}
}, {
key: "postal_code",
get: function get() {
return this._postal_code;
},
set: function set(value) {
this._postal_code = value;
}
}, {
key: "city",
get: function get() {
return this._city;
},
set: function set(value) {
this._city = value;
}
}, {
key: "phone",
get: function get() {
return this._phone;
},
set: function set(value) {
this._phone = value;
}
}, {
key: "countryIso3",
get: function get() {
return this._countryIso3;
},
set: function set(value) {
this._countryIso3 = value;
}
}]);
return Address;
}();
/***/ }),
/***/ "./resources/js/global/models/checkoutInformationResponse.js":
/*!*******************************************************************!*\
!*** ./resources/js/global/models/checkoutInformationResponse.js ***!
\*******************************************************************/
/*! exports provided: CheckoutInformationResponse */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CheckoutInformationResponse", function() { return CheckoutInformationResponse; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
var CheckoutInformationResponse =
/*#__PURE__*/
function () {
function CheckoutInformationResponse() {
_classCallCheck(this, CheckoutInformationResponse);
this._totalExVatAndDiscounts = 0;
this._totalExVatAndDiscountsFormatted = '';
this._totalExVat = 0;
this._totalExVatFormatted = '';
this._vatTotal = 0;
this._vatTotalFormatted = '';
this._shippingCosts = 0;
this._shippingCostsFormatted = '';
this._total = 0;
this._totalFormatted = '';
this._vatPercentage = 0;
this._couponCodes = [];
}
/**
* @param {string} json
* @return {CheckoutInformationResponse|null}
*/
_createClass(CheckoutInformationResponse, [{
key: "totalExVatAndDiscounts",
get: function get() {
return this._totalExVatAndDiscounts;
}
}, {
key: "totalExVatAndDiscountsFormatted",
get: function get() {
return this._totalExVatAndDiscountsFormatted;
}
}, {
key: "totalExVat",
get: function get() {
return this._totalExVat;
}
}, {
key: "totalExVatFormatted",
get: function get() {
return this._totalExVatFormatted;
}
}, {
key: "vatTotal",
get: function get() {
return this._vatTotal;
}
}, {
key: "vatTotalFormatted",
get: function get() {
return this._vatTotalFormatted;
}
}, {
key: "shippingCosts",
get: function get() {
return this._shippingCosts;
}
}, {
key: "shippingCostsFormatted",
get: function get() {
return this._shippingCostsFormatted;
}
}, {
key: "total",
get: function get() {
return this._total;
}
}, {
key: "totalFormatted",
get: function get() {
return this._totalFormatted;
}
}, {
key: "vatPercentage",
get: function get() {
return this._vatPercentage;
}
}, {
key: "couponCodes",
get: function get() {
return this._couponCodes;
}
}], [{
key: "fromJsonString",
value: function fromJsonString(json) {
if (!this.is(json)) {
return null;
}
var jsonObject = JSON.parse(json);
var instance = new this();
instance._totalExVatAndDiscounts = jsonObject.totalExVatAndDiscounts;
instance._totalExVatAndDiscountsFormatted = jsonObject.totalExVatAndDiscountsFormatted;
instance._totalExVat = jsonObject.totalExVat;
instance._totalExVatFormatted = jsonObject.totalExVatFormatted;
instance._vatTotal = jsonObject.vatTotal;
instance._vatTotalFormatted = jsonObject.vatTotalFormatted;
instance._shippingCosts = jsonObject.shippingCosts;
instance._shippingCostsFormatted = jsonObject.shippingCostsFormatted;
instance._total = jsonObject.total;
instance._totalFormatted = jsonObject.totalFormatted;
instance._vatPercentage = jsonObject.vatPercentage;
instance._couponCodes = jsonObject.couponCodes;
return instance;
}
/**
* Checks that the given json string represents a CheckoutInformationResponse
*
* @param {string} json
* @param {boolean} logErrors
* @return {boolean}
*/
}, {
key: "is",
value: function is(json) {
var logErrors = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var jsonObject = null;
try {
jsonObject = JSON.parse(json);
if (!jsonObject) return false;
} catch (e) {
if (logErrors) console.error('CheckoutInformationResponse: The given json does not represent a valid CheckoutInformationResponse since the json string was not a valid json');
return false;
}
if (!jsonObject.hasOwnProperty('totalExVatFormatted') || typeof jsonObject.totalExVatFormatted !== 'string') {
if (logErrors) console.error('CheckoutInformationResponse: The response object must have a totalExVatFormatted property that is a string. Object: ', jsonObject);
return false;
}
if (!jsonObject.hasOwnProperty('totalExVatAndDiscountsFormatted') || typeof jsonObject.totalExVatAndDiscountsFormatted !== 'string') {
if (logErrors) console.error('CheckoutInformationResponse: The response object must have a totalExVatAndDiscountsFormatted property that is a string. Object: ', jsonObject);
return false;
}
if (!jsonObject.hasOwnProperty('vatTotalFormatted') || typeof jsonObject.vatTotalFormatted !== 'string') {
if (logErrors) console.error('CheckoutInformationResponse: The response object must have a vatTotalFormatted property that is a string. Object: ', jsonObject);
return false;
}
if (!jsonObject.hasOwnProperty('shippingCostsFormatted') || typeof jsonObject.shippingCostsFormatted !== 'string') {
if (logErrors) console.error('CheckoutInformationResponse: The response object must have a shippingCostsFormatted property that is a string. Object: ', jsonObject);
return false;
}
if (!jsonObject.hasOwnProperty('totalFormatted') || typeof jsonObject.totalFormatted !== 'string') {
if (logErrors) console.error('CheckoutInformationResponse: The response object must have a totalFormatted property that is a string. Object: ', jsonObject);
return false;
}
if (!jsonObject.hasOwnProperty('totalExVatAndDiscounts') || typeof jsonObject.totalExVatAndDiscounts !== 'number') {
if (logErrors) console.error('CheckoutInformationResponse: The response object must have a totalExVatAndDiscounts property that is a number. Object: ', jsonObject);
return false;
}
if (!jsonObject.hasOwnProperty('totalExVat') || typeof jsonObject.totalExVat !== 'number') {
if (logErrors) console.error('CheckoutInformationResponse: The response object must have a totalExVat property that is a number. Object: ', jsonObject);
return false;
}
if (!jsonObject.hasOwnProperty('vatTotal') || typeof jsonObject.vatTotal !== 'number') {
if (logErrors) console.error('CheckoutInformationResponse: The response object must have a vatTotal property that is a number. Object: ', jsonObject);
return false;
}
if (!jsonObject.hasOwnProperty('shippingCosts') || typeof jsonObject.shippingCosts !== 'number') {
if (logErrors) console.error('CheckoutInformationResponse: The response object must have a shippingCosts property that is a number. Object: ', jsonObject);
return false;
}
if (!jsonObject.hasOwnProperty('total') || typeof jsonObject.total !== 'number') {
if (logErrors) console.error('CheckoutInformationResponse: The response object must have a total property that is a number. Object: ', jsonObject);
return false;
}
if (!jsonObject.hasOwnProperty('vatPercentage') || typeof jsonObject.vatPercentage !== 'number') {
if (logErrors) console.error('CheckoutInformationResponse: The response object must have a vatPercentage property that is a number. Object: ', jsonObject);
return false;
}
if (!jsonObject.hasOwnProperty('couponCodes') || !Array.isArray(jsonObject.couponCodes)) {
if (logErrors) console.error('CheckoutInformationResponse: The response object must have a couponCodes property that is an array. Object: ', jsonObject);
return false;
}
return true;
}
}]);
return CheckoutInformationResponse;
}();
/***/ }),
/***/ "./resources/js/global/models/countryLanguagesResponse.js":
/*!****************************************************************!*\
!*** ./resources/js/global/models/countryLanguagesResponse.js ***!
\****************************************************************/
/*! exports provided: CountryLanguagesResponse */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CountryLanguagesResponse", function() { return CountryLanguagesResponse; });
/* harmony import */ var _language__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./language */ "./resources/js/global/models/language.js");
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* CountryLanguagesResponse.
*
* Represents a response that originates from
*/
var CountryLanguagesResponse =
/*#__PURE__*/
function () {
function CountryLanguagesResponse() {
_classCallCheck(this, CountryLanguagesResponse);
this._languages = [];
}
/**
* @param {string} json
* @return {CountryLanguagesResponse|null}
*/
_createClass(CountryLanguagesResponse, [{
key: "_toJson",
/**
* @return {{valid: boolean, errors: Array}}
* @private
*/
value: function _toJson() {
return {
'languages': this._languages
};
}
/**
* @return {Language[]}
*/
}, {
key: "languages",
get: function get() {
return this._languages;
}
}], [{
key: "fromJsonString",
value: function fromJsonString(json) {
if (!this.is(json)) {
return null;
}
var jsonObject = JSON.parse(json);
var instance = new this();
var languageCount = jsonObject.languages.length;
for (var index = 0; index < languageCount; index++) {
var languageObject = jsonObject.languages[index];
var language = new _language__WEBPACK_IMPORTED_MODULE_0__["Language"]();
language.name = languageObject.name;
language.displayName = languageObject.displayName;
language.nativeName = languageObject.nativeName;
language.twoLetterIsoLanguageName = languageObject.twoLetterIsoLanguageName;
language.threeLetterIsoLanguageName = languageObject.threeLetterIsoLanguageName;
instance._languages.push(language);
}
return instance;
}
/**
* Checks that the given json string represents a ErrorResponse
*
* @param {string} json
* @param {boolean} logErrors
* @return {boolean}
*/
}, {
key: "is",
value: function is(json) {
var logErrors = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var jsonObject = null;
if (typeof json === 'string') {
try {
jsonObject = JSON.parse(json);
if (!jsonObject) return false;
} catch (e) {
console.error('CountryLanguagesResponse: The given json does not represent a CountryLanguagesResponse since the json string was not a valid json. Object: ', jsonObject);
return false;
}
} else {
jsonObject = json;
}
if (!jsonObject.hasOwnProperty('languages') || !Array.isArray(jsonObject.languages)) {
console.log('CountryLanguagesResponse: The given json must have a property called languages that is an Array, But did not have. Object: ', jsonObject);
return false;
}
var languageCount = jsonObject.languages.length;
for (var index = 0; index < languageCount; index++) {
var languageObject = jsonObject.languages[index];
if (_typeof(languageObject) !== 'object' || typeof languageObject === 'function' || !_language__WEBPACK_IMPORTED_MODULE_0__["Language"].is(languageObject)) {
return false;
}
}
return true;
}
}]);
return CountryLanguagesResponse;
}();
/***/ }),
/***/ "./resources/js/global/models/errorResponse.js":
/*!*****************************************************!*\
!*** ./resources/js/global/models/errorResponse.js ***!
\*****************************************************/
/*! exports provided: ErrorResponse */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ErrorResponse", function() { return ErrorResponse; });
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* A laravel error response
*/
var ErrorResponse =
/*#__PURE__*/
function () {
function ErrorResponse() {
_classCallCheck(this, ErrorResponse);
this._message = '';
this._errors = {};
}
/**
* @param {string} json
* @return {ErrorResponse|null}
*/
_createClass(ErrorResponse, [{
key: "message",
/**
* Retrurns a comprehensive error message for all the fields.
*
* @return {string}
*/
get: function get() {
return this._message;
}
/**
* @return {Object} returns an object where the property are field names. and the values are arrays containing errors for those field names.
*/
}, {
key: "errors",
get: function get() {
return this._errors;
}
}], [{
key: "fromJsonString",
value: function fromJsonString(json) {
if (!this.is(json)) {
return null;
}
var jsonObject = JSON.parse(json);
var instance = new this();
instance._message = jsonObject.message;
instance._errors = jsonObject.errors;
return instance;
}
/**
* Checks that the given json string represents a ErrorResponse
*
* @param {string} json
* @param {boolean} logErrors
* @return {boolean}
*/
}, {
key: "is",
value: function is(json) {
var logErrors = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var jsonObject = null;
try {
jsonObject = JSON.parse(json);
if (!jsonObject) return false;
} catch (e) {
if (logErrors) console.error('ErrorResponse: The given json does not represent a valid ErrorResponse since the json string was not a valid json');
return false;
}
if (!jsonObject.hasOwnProperty('message') || typeof jsonObject.message !== 'string') {
if (logErrors) console.error('ErrorResponse: The response object must have an message property that is a string. Object:', jsonObject);
return false;
}
if (!jsonObject.hasOwnProperty('errors') || _typeof(jsonObject.errors) !== 'object') {
if (logErrors) console.error('ErrorResponse: The response object must have an errors object that represents valid laravel field errors. Object:', jsonObject);
return false;
}
for (var fieldName in jsonObject.errors) {
if (jsonObject.errors.hasOwnProperty(fieldName) && !Array.isArray(jsonObject.errors[fieldName])) {
if (logErrors) console.error('ErrorResponse: The property "' + fieldName + '" in the errors array must have have array as value containing errors strings. Object:', jsonObject);
return false;
}
}
return true;
}
}]);
return ErrorResponse;
}();
/***/ }),
/***/ "./resources/js/global/models/language.js":
/*!************************************************!*\
!*** ./resources/js/global/models/language.js ***!
\************************************************/
/*! exports provided: Language */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Language", function() { return Language; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* Language.
*
* Represents a Language
*/
var Language =
/*#__PURE__*/
function () {
function Language() {
_classCallCheck(this, Language);
this._name = '';
this._displayName = '';
this._nativeName = '';
this._twoLetterIsoLanguageName = '';
this._threeLetterIsoLanguageName = '';
}
/**
* @param {string} json
* @return {Language|null}
*/
_createClass(Language, [{
key: "_toJson",
/**
* @return {{valid: boolean, errors: Array}}
* @private
*/
value: function _toJson() {
return {
'name': this._name,
'displayName': this._displayName,
'nativeName': this._nativeName,
'twoLetterIsoLanguageName': this._twoLetterIsoLanguageName,
'threeLetterIsoLanguageName': this._threeLetterIsoLanguageName
};
}
}, {
key: "name",
get: function get() {
return this._name;
},
set: function set(value) {
this._name = value;
}
}, {
key: "displayName",
get: function get() {
return this._displayName;
},
set: function set(value) {
this._displayName = value;
}
}, {
key: "nativeName",
get: function get() {
return this._nativeName;
},
set: function set(value) {
this._nativeName = value;
}
}, {
key: "twoLetterIsoLanguageName",
get: function get() {
return this._twoLetterIsoLanguageName;
},
set: function set(value) {
this._twoLetterIsoLanguageName = value;
}
}, {
key: "threeLetterIsoLanguageName",
get: function get() {
return this._threeLetterIsoLanguageName;
},
set: function set(value) {
this._threeLetterIsoLanguageName = value;
}
}], [{
key: "fromJsonString",
value: function fromJsonString(json) {
if (!this.is(json)) {
return null;
}
var jsonObject = JSON.parse(json);
var instance = new this();
instance._name = jsonObject.name;
instance._displayName = jsonObject.displayName;
instance._nativeName = jsonObject.nativeName;
instance._twoLetterIsoLanguageName = jsonObject.twoLetterIsoLanguageName;
instance._threeLetterIsoLanguageName = jsonObject.threeLetterIsoLanguageName;
return instance;
}
/**
* Checks that the given json string represents a ErrorResponse
*
* @param {string|object} json
* @param {boolean} logErrors
* @return {boolean}
*/
}, {
key: "is",
value: function is(json) {
var logErrors = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var jsonObject = null;
if (typeof json === 'string') {
try {
jsonObject = JSON.parse(json);
if (!jsonObject) return false;
} catch (e) {
console.error('Language: The given json does not represent a Language since the json string was not a valid json. Object: ', jsonObject, json);
return false;
}
} else {
jsonObject = json;
}
if (!jsonObject.hasOwnProperty('name') || typeof jsonObject.displayName !== 'string') {
if (logErrors) console.error('Language: The language object must have a property called name that is a string. Object: ', jsonObject);
return false;
}
if (!jsonObject.hasOwnProperty('displayName') || typeof jsonObject.displayName !== 'string') {
if (logErrors) console.error('Language: The language object must have a property called displayName that is a string. Object: ', jsonObject);
return false;
}
if (!jsonObject.hasOwnProperty('nativeName') || typeof jsonObject.nativeName !== 'string') {
if (logErrors) console.error('Language: The language object must have a property called nativeName that is a string. Object: ', jsonObject);
return false;
}
if (!jsonObject.hasOwnProperty('twoLetterIsoLanguageName') || typeof jsonObject.twoLetterIsoLanguageName !== 'string') {
if (logErrors) console.error('Language: The language object must have a property called twoLetterIsoLanguageName that is a string. Object: ', jsonObject.twoLetterIsoLanguageName);
return false;
}
if (!jsonObject.hasOwnProperty('threeLetterIsoLanguageName') || typeof jsonObject.threeLetterIsoLanguageName !== 'string') {
if (logErrors) console.error('Language: The language object must have a property called threeLetterIsoLanguageName that is a string. Object: ', jsonObject);
return false;
}
return true;
}
}]);
return Language;
}();
/***/ }),
/***/ "./resources/js/global/models/validationResponse.js":
/*!**********************************************************!*\
!*** ./resources/js/global/models/validationResponse.js ***!
\**********************************************************/
/*! exports provided: ValidationResponse */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ValidationResponse", function() { return ValidationResponse; });
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* ValidationResponse.
*
* Represents a response that originates from
*/
var ValidationResponse =
/*#__PURE__*/
function () {
function ValidationResponse() {
_classCallCheck(this, ValidationResponse);
this._valid = false;
this._errors = [];
this.toJSON = this._toJson.bind(this);
}
/**
* @param {string} json
* @return {ValidationResponse|null}
*/
_createClass(ValidationResponse, [{
key: "_toJson",
/**
* @return {{valid: boolean, errors: Array}}
* @private
*/
value: function _toJson() {
return {
'valid': this._valid,
'errors': this._errors
};
}
/**
* @return {boolean}
*/
}, {
key: "valid",
get: function get() {
return this._valid;
}
/**
* @return {Array}
*/
}, {
key: "errors",
get: function get() {
return this._errors;
}
}], [{
key: "fromJsonString",
value: function fromJsonString(json) {
if (!this.is(json)) {
return null;
}
var jsonObject = JSON.parse(json);
var instance = new this();
instance._valid = jsonObject.valid;
instance._errors = jsonObject.errors;
return instance;
}
/**
* Checks that the given json string represents a ErrorResponse
*
* @param {string} json
* @param {boolean} logErrors
* @return {boolean}
*/
}, {
key: "is",
value: function is(json) {
var logErrors = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var jsonObject = null;
try {
jsonObject = JSON.parse(json);
if (!jsonObject) return false;
} catch (e) {
console.error('ValidationResponse: The given json does not represent a ValidationResponse since the json string was not a valid json. Object: ', jsonObject);
return false;
}
if (!jsonObject.hasOwnProperty('valid')) {
console.error('ValidationResponse: The given json object must have an "valid" property that is a string. But did not have one. Object: ', jsonObject);
return false;
}
if (!jsonObject.hasOwnProperty('errors') || _typeof(!jsonObject.errors) == 'object') {
console.error('ValidationResponse: The given json object must have an errors object. But did not have one. Object: ', jsonObject);
return false;
}
return true;
}
}]);
return ValidationResponse;
}();
/***/ }),
/***/ "./resources/js/global/polyfills/eventPolyFill.js":
/*!********************************************************!*\
!*** ./resources/js/global/polyfills/eventPolyFill.js ***!
\********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/**
* Event semi polyfill. IE does not support new event. But does support document.createEvent.
* Same thing for dispatching events. But then with createEvent and fireEvent.
*/
function createNewEvent(eventName) {
var event;
if (typeof Event === 'function') {
//On ie it is typeOf object.
event = new Event(eventName); //Non-ie
} else {
event = document.createEvent('Event'); //ie
event.initEvent(eventName, true, true);
}
return event;
}
function dispatchEventForElement(element, event) {
if (document.createEvent) {
element.dispatchEvent(event);
} else {
element.fireEvent("on" + event.eventType, event);
}
}
/***/ }),
/***/ "./resources/js/global/polyfills/isInteger.js":
/*!****************************************************!*\
!*** ./resources/js/global/polyfills/isInteger.js ***!
\****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
Number.isInteger = Number.isInteger || function (value) {
return typeof value === "number" && isFinite(value) && Math.floor(value) === value;
};
/***/ }),
/***/ "./resources/js/global/polyfills/promise.js":
/*!**************************************************!*\
!*** ./resources/js/global/polyfills/promise.js ***!
\**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(setImmediate, global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
(function (global, factory) {
( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? factory() : true ? !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :
__WEBPACK_AMD_DEFINE_FACTORY__),
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : undefined;
})(this, function () {
'use strict';
/**
* @this {Promise}
*/
function finallyConstructor(callback) {
var constructor = this.constructor;
return this.then(function (value) {
return constructor.resolve(callback()).then(function () {
return value;
});
}, function (reason) {
return constructor.resolve(callback()).then(function () {
return constructor.reject(reason);
});
});
} // Store setTimeout reference so promise-polyfill will be unaffected by
// other code modifying setTimeout (like sinon.useFakeTimers())
var setTimeoutFunc = setTimeout;
function noop() {} // Polyfill for Function.prototype.bind
function bind(fn, thisArg) {
return function () {
fn.apply(thisArg, arguments);
};
}
/**
* @constructor
* @param {Function} fn
*/
function Promise(fn) {
if (!(this instanceof Promise)) throw new TypeError('Promises must be constructed via new');
if (typeof fn !== 'function') throw new TypeError('not a function');
/** @type {!number} */
this._state = 0;
/** @type {!boolean} */
this._handled = false;
/** @type {Promise|undefined} */
this._value = undefined;
/** @type {!Array<!Function>} */
this._deferreds = [];
doResolve(fn, this);
}
function handle(self, deferred) {
while (self._state === 3) {
self = self._value;
}
if (self._state === 0) {
self._deferreds.push(deferred);
return;
}
self._handled = true;
Promise._immediateFn(function () {
var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
if (cb === null) {
(self._state === 1 ? resolve : reject)(deferred.promise, self._value);
return;
}
var ret;
try {
ret = cb(self._value);
} catch (e) {
reject(deferred.promise, e);
return;
}
resolve(deferred.promise, ret);
});
}
function resolve(self, newValue) {
try {
// Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.');
if (newValue && (_typeof(newValue) === 'object' || typeof newValue === 'function')) {
var then = newValue.then;
if (newValue instanceof Promise) {
self._state = 3;
self._value = newValue;
finale(self);
return;
} else if (typeof then === 'function') {
doResolve(bind(then, newValue), self);
return;
}
}
self._state = 1;
self._value = newValue;
finale(self);
} catch (e) {
reject(self, e);
}
}
function reject(self, newValue) {
self._state = 2;
self._value = newValue;
finale(self);
}
function finale(self) {
if (self._state === 2 && self._deferreds.length === 0) {
Promise._immediateFn(function () {
if (!self._handled) {
Promise._unhandledRejectionFn(self._value);
}
});
}
for (var i = 0, len = self._deferreds.length; i < len; i++) {
handle(self, self._deferreds[i]);
}
self._deferreds = null;
}
/**
* @constructor
*/
function Handler(onFulfilled, onRejected, promise) {
this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
this.onRejected = typeof onRejected === 'function' ? onRejected : null;
this.promise = promise;
}
/**
* Take a potentially misbehaving resolver function and make sure
* onFulfilled and onRejected are only called once.
*
* Makes no guarantees about asynchrony.
*/
function doResolve(fn, self) {
var done = false;
try {
fn(function (value) {
if (done) return;
done = true;
resolve(self, value);
}, function (reason) {
if (done) return;
done = true;
reject(self, reason);
});
} catch (ex) {
if (done) return;
done = true;
reject(self, ex);
}
}
Promise.prototype['catch'] = function (onRejected) {
return this.then(null, onRejected);
};
Promise.prototype.then = function (onFulfilled, onRejected) {
// @ts-ignore
var prom = new this.constructor(noop);
handle(this, new Handler(onFulfilled, onRejected, prom));
return prom;
};
Promise.prototype['finally'] = finallyConstructor;
Promise.all = function (arr) {
return new Promise(function (resolve, reject) {
if (!arr || typeof arr.length === 'undefined') throw new TypeError('Promise.all accepts an array');
var args = Array.prototype.slice.call(arr);
if (args.length === 0) return resolve([]);
var remaining = args.length;
function res(i, val) {
try {
if (val && (_typeof(val) === 'object' || typeof val === 'function')) {
var then = val.then;
if (typeof then === 'function') {
then.call(val, function (val) {
res(i, val);
}, reject);
return;
}
}
args[i] = val;
if (--remaining === 0) {
resolve(args);
}
} catch (ex) {
reject(ex);
}
}
for (var i = 0; i < args.length; i++) {
res(i, args[i]);
}
});
};
Promise.resolve = function (value) {
if (value && _typeof(value) === 'object' && value.constructor === Promise) {
return value;
}
return new Promise(function (resolve) {
resolve(value);
});
};
Promise.reject = function (value) {
return new Promise(function (resolve, reject) {
reject(value);
});
};
Promise.race = function (values) {
return new Promise(function (resolve, reject) {
for (var i = 0, len = values.length; i < len; i++) {
values[i].then(resolve, reject);
}
});
}; // Use polyfill for setImmediate for performance gains
Promise._immediateFn = typeof setImmediate === 'function' && function (fn) {
setImmediate(fn);
} || function (fn) {
setTimeoutFunc(fn, 0);
};
Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {
if (typeof console !== 'undefined' && console) {
console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console
}
};
/** @suppress {undefinedVars} */
var globalNS = function () {
// the only reliable means to get the global object is
// `Function('return this')()`
// However, this causes CSP violations in Chrome apps.
if (typeof self !== 'undefined') {
return self;
}
if (typeof window !== 'undefined') {
return window;
}
if (typeof global !== 'undefined') {
return global;
}
throw new Error('unable to locate global object');
}();
if (!('Promise' in globalNS)) {
globalNS['Promise'] = Promise;
} else if (!globalNS.Promise.prototype['finally']) {
globalNS.Promise.prototype['finally'] = finallyConstructor;
}
});
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/timers-browserify/main.js */ "./node_modules/timers-browserify/main.js").setImmediate, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
/***/ }),
/***/ "./resources/js/shop/components/checkoutController.js":
/*!************************************************************!*\
!*** ./resources/js/shop/components/checkoutController.js ***!
\************************************************************/
/*! exports provided: CheckoutController */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CheckoutController", function() { return CheckoutController; });
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js");
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _global_models_address__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../global/models/address */ "./resources/js/global/models/address.js");
/* harmony import */ var _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../global/models/errorResponse */ "./resources/js/global/models/errorResponse.js");
/* harmony import */ var _shoppingcartService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./shoppingcartService */ "./resources/js/shop/components/shoppingcartService.js");
/* harmony import */ var _checkoutService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./checkoutService */ "./resources/js/shop/components/checkoutService.js");
/* harmony import */ var _validationService__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./validationService */ "./resources/js/shop/components/validationService.js");
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* Controls the checkout form
*/
var CheckoutController =
/*#__PURE__*/
function () {
/**
* @param {HTMLDivElement} checkoutFormDivElement
* @param {ShoppingcartService} shoppingcartService
* @param {CheckoutService} checkoutService
* @param {ValidationService} validationService
* @param {GlobalisationService|null} globalisationService
* @param {ErrorController|null} errorFormController
*/
function CheckoutController(checkoutFormDivElement, shoppingcartService, checkoutService, validationService, globalisationService, errorFormController) {
_classCallCheck(this, CheckoutController);
var self = this; //Select some elements
if (!checkoutFormDivElement || checkoutFormDivElement.tagName !== "FORM") {
console.error('CheckoutController: Expecting a form element upon construction that holds all checkout form elements. CheckoutController stopped working');
return;
}
this._checkoutForm = checkoutFormDivElement; //Select elements.
if (!this.selectAndValidateElement('.js-add-coupon', 'BUTTON', function (element) {
self._addCouponButton = element;
})) return;
if (!this.selectAndValidateElement('.js-coupon input', 'INPUT', function (element) {
self._couponInput = element;
})) return;
if (!this.selectAndValidateElement('.js-coupon-codes', 'UL', function (element) {
self._couponCodesList = element;
})) return;
if (!this.selectAndValidateElement('.js-submit', 'INPUT', function (element) {
self._submitButton = element;
})) return;
if (!this.selectAndValidateElement('.js-total-ex-vat-and-discounts', 'TD', function (element) {
self._totalExVatAndDiscountsContainer = element;
})) return;
if (!this.selectAndValidateElement('.js-total-ex-vat', 'TD', function (element) {
self._totalExVatContainer = element;
})) return;
if (!this.selectAndValidateElement('.js-vat-total', 'SPAN', function (element) {
self._vatContainer = element;
})) return;
if (!this.selectAndValidateElement('.js-vat-percentage', 'SPAN', function (element) {
self._vatPercentageContainer = element;
})) return;
if (!this.selectAndValidateElement('.js-shipping-costs', 'TD', function (element) {
self._shippingCostsContainer = element;
})) return;
if (!this.selectAndValidateElement('.js-total', 'TD', function (element) {
self._totalContainer = element;
})) return; //Select optional elements
this._guestLanguageSelectWrapper = this._checkoutForm.querySelector('.js-language-select-wrapper'); //Check that we have the shopping cart service
this._checkoutService = checkoutService;
if (!checkoutService || !(checkoutService instanceof _checkoutService__WEBPACK_IMPORTED_MODULE_4__["CheckoutService"])) {
console.error('CheckoutController: The CheckoutController was expected to get an instance of CheckoutService, but did not get one.');
return;
}
this._globalisationService = globalisationService;
if (!globalisationService) {
console.error('RegisterController: The Register form was expected to get an instance of RegisterService, but did not get one.');
return;
} //Check that we have the shopping cart service
this._shoppingcartService = shoppingcartService;
if (!shoppingcartService || !(shoppingcartService instanceof _shoppingcartService__WEBPACK_IMPORTED_MODULE_3__["ShoppingcartService"])) {
console.error('CheckoutController: The CheckoutController was expected to get an instance of ShoppingcartService, but did not get one.');
return;
} //Check that we have the shopping cart service
this._validationService = validationService;
if (!validationService || !(validationService instanceof _validationService__WEBPACK_IMPORTED_MODULE_5__["ValidationService"])) {
console.error('CheckoutController: The CheckoutController was expected to get an instance of validationService, but did not get one.');
return;
} //Bind the error list controller if we have any.
this._errorFormController = errorFormController;
if (!this._errorFormController && !(errorFormController instanceof ErrorFormController)) {
console.error('CheckoutController: If you specify an errorFormController, it must be an instance of errorFormController');
return;
}
this._domParser = new DOMParser();
this._hiddenClass = 'u-hidden'; //The name of a class that can be applied to things to hide them.
//Bind event listeners to this class.
this._formSubmit = this._formSubmit.bind(this);
this._formChanged = this._formChanged.bind(this);
this._removeCouponCodeClicked = this._removeCouponCodeClicked.bind(this);
this._handleErrorResponse = this._handleErrorResponse.bind(this); //Bind other function to this class
this._createHtmlElementFromString = this._createHtmlElementFromString.bind(this); //Enable the listeners.
this.controlListeners(true);
this._guestCountryChanged();
}
/**
* @param {string} selector
* @param {string} tagName
* @param {function} validCallBack. Called with the found valid element.
* @return {boolean}
*/
_createClass(CheckoutController, [{
key: "selectAndValidateElement",
value: function selectAndValidateElement(selector, tagName, validCallBack) {
var element = this._checkoutForm.querySelector(selector);
if (!element || element.tagName !== tagName) {
console.error('CheckoutController: Expecting the CheckoutFormDivElement to have an ' + tagName + ' with selector ' + selector + '. But could not find that element. CheckoutController stopped working');
return false;
}
validCallBack.call(this, element);
return true;
}
/**
* @param {boolean} enabled
*/
}, {
key: "controlListeners",
value: function controlListeners(enabled) {
var self = this;
this._submitButton.removeEventListener('click', this._formSubmit);
this._addCouponButton.removeEventListener('click', this._formSubmit);
this._checkoutForm.removeEventListener('change', this._formChanged);
this._couponCodesList.querySelectorAll('.delete').forEach(function (deleteButtonElement) {
deleteButtonElement.removeEventListener('click', self._removeCouponCodeClicked);
});
if (enabled) {
this._submitButton.addEventListener('click', this._formSubmit);
this._addCouponButton.addEventListener('click', this._formSubmit);
this._checkoutForm.addEventListener('change', this._formChanged);
this._couponCodesList.querySelectorAll('.delete').forEach(function (deleteButtonElement) {
deleteButtonElement.addEventListener('click', self._removeCouponCodeClicked);
});
}
}
/**
* Triggered on form submit. When this returns false, the form won't be submitted.
* We mainly use it for validation
*
* @private
* @param {Event} event
* @return {boolean}
*/
}, {
key: "_formSubmit",
value: function () {
var _formSubmit2 = _asyncToGenerator(
/*#__PURE__*/
_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(event) {
var self;
return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
//Cancel the event. We need to check if the country is valid first
event.preventDefault();
self = this;
if (event.currentTarget.classList.contains('js-submit')) {
this._validateForm().then(function () {
self._checkoutForm.submit();
})["catch"](function () {});
} else if (event.currentTarget.classList.contains('js-add-coupon')) {
this._addCouponCode().then(function (coupon) {
console.log('adding coupon to list for user');
})["catch"](function () {});
}
return _context.abrupt("return", false);
case 4:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function _formSubmit(_x) {
return _formSubmit2.apply(this, arguments);
}
return _formSubmit;
}()
/**
* @param {Event} event
* @return {boolean}
* @private
*/
}, {
key: "_formChanged",
value: function _formChanged(event) {
// this._validateForm().catch(function() {});
if (event.target.name) {
if (event.target.name.includes('shipping')) {
//One of the shipping inputs has been changed
this._updateShippingCosts();
} else if (event.target.name === 'country') {
this._guestCountryChanged();
}
}
}
/**
* Update the shipping costs.
*/
}, {
key: "_updateShippingCosts",
value: function _updateShippingCosts() {
var self = this;
var formData = new FormData(this._checkoutForm);
var address = new _global_models_address__WEBPACK_IMPORTED_MODULE_1__["Address"]();
address.street = formData.get('shipping_street');
address.house_number = formData.get('shipping_house_number');
address.postal_code = formData.get('shipping_postal_code');
address.city = formData.get('shipping_city');
address.phone = formData.get('shipping_phone');
address.countryIso3 = formData.get('shipping_country');
console.log('updating shipping costs for address: ', address);
this._checkoutService.setShippingAddress(address).then(function () {})["catch"](function (response) {
/** @param {ErrorResponse} response **/
self._handleErrorResponse(response);
})["finally"](function () {
self._checkoutService.getCheckoutInformation().then(
/** @param {CheckoutInformationResponse} checkoutInformationResponse **/
function (checkoutInformationResponse) {
self._updateFormUsingCheckoutInformationResponse(checkoutInformationResponse);
});
});
}
/**
* @param {CheckoutInformationResponse} checkoutInformationResponse
* @private
*/
}, {
key: "_updateFormUsingCheckoutInformationResponse",
value: function _updateFormUsingCheckoutInformationResponse(checkoutInformationResponse) {
console.log('update form');
var self = this;
this._totalExVatAndDiscountsContainer.innerHTML = checkoutInformationResponse.totalExVatAndDiscountsFormatted;
this._totalExVatContainer.innerHTML = checkoutInformationResponse.totalExVatFormatted;
this._vatContainer.innerHTML = checkoutInformationResponse.vatTotalFormatted;
this._vatPercentageContainer.innerHTML = checkoutInformationResponse.vatPercentage;
this._shippingCostsContainer.innerHTML = checkoutInformationResponse.shippingCostsFormatted;
this._totalContainer.innerHTML = checkoutInformationResponse.totalFormatted; //Delete all coupon codes
while (this._couponCodesList.children.length > 0) {
this._couponCodesList.removeChild(self._couponCodesList.firstChild);
} //Add the coupon codes
checkoutInformationResponse.couponCodes.forEach(function (couponCode) {
var couponCodeListItem = self._createHtmlElementFromString('<li data-code="' + couponCode + '" dusk="' + couponCode + '">' + couponCode + '<span class="delete">×</span></li>');
self._couponCodesList.appendChild(couponCodeListItem);
couponCodeListItem.querySelector('.delete').addEventListener('click', self._removeCouponCodeClicked);
});
}
/**
* @return {Promise<> | Promise}
* @private
*/
}, {
key: "_validateForm",
value: function _validateForm() {
var self = this;
return new Promise(function (resolve, reject) {
var formData = new FormData(self._checkoutForm);
self._validationService.validateCheckoutForm(formData).then(function () {
if (self._errorFormController) self._errorFormController.clearAllErrors();
resolve();
})["catch"](
/** @param {ErrorResponse} errorResponse **/
function (errorResponse) {
//Logging is handled in the validationService
if (self._errorFormController) self._errorFormController.clearAllErrors();
self._handleErrorResponse(errorResponse);
reject();
});
});
}
/**
* Tries to add a coupon code.
*
* @return {Promise<> | Promise}
* @private
*/
}, {
key: "_addCouponCode",
value: function _addCouponCode() {
var self = this;
return new Promise(function (resolve, reject) {
var enteredCoupon = self._couponInput.value;
self._checkoutService.addCoupon(enteredCoupon).then(
/** @param {CheckoutInformationResponse} checkoutInformationResponse **/
function (checkoutInformationResponse) {
if (self._errorFormController) self._errorFormController.clearAllErrors();
self._updateFormUsingCheckoutInformationResponse(checkoutInformationResponse);
self._couponInput.value = '';
resolve(enteredCoupon);
})["catch"](
/** @param {ErrorResponse} errorResponse **/
function (errorResponse) {
//Logging is handled in the validationService
if (self._errorFormController) self._errorFormController.clearAllErrors();
self._handleErrorResponse(errorResponse);
reject();
});
});
}
/**
* @private
* @param {string} couponCode
*/
}, {
key: "_removeCouponCode",
value: function _removeCouponCode(couponCode) {
var self = this;
return new Promise(function (resolve, reject) {
self._checkoutService.removeCoupon(couponCode).then(
/** @param {CheckoutInformationResponse} checkoutInformationResponse **/
function (checkoutInformationResponse) {
if (self._errorFormController) self._errorFormController.clearAllErrors();
self._updateFormUsingCheckoutInformationResponse(checkoutInformationResponse);
resolve(couponCode);
})["catch"](
/** @param {ErrorResponse} errorResponse **/
function (errorResponse) {
//Logging is handled in the validationService
if (self._errorFormController) self._errorFormController.clearAllErrors();
self._handleErrorResponse(errorResponse);
reject();
});
});
}
/**
* @param {Event} event
* @private
*/
}, {
key: "_removeCouponCodeClicked",
value: function _removeCouponCodeClicked(event) {
var code = event.currentTarget.parentElement.dataset.code;
this._removeCouponCode(code).then(function () {})["catch"](function () {});
}
/**
* Updates the guest language select
*
* @private
*/
}, {
key: "_guestCountryChanged",
value: function _guestCountryChanged() {
var formData = new FormData(this._checkoutForm);
var select = this._guestLanguageSelectWrapper.querySelector('select[name="language"]');
if (!formData.has('country') || !this._guestLanguageSelectWrapper || !select) return; //Do nothing if the user is authenticated (not a guest).
var countryIso3 = formData.get('country');
var self = this;
this._globalisationService.getLanguagesForCountryWithIso3(countryIso3).then(
/** @param { CountryLanguagesResponse } countryLanguagesResponse **/
function (countryLanguagesResponse) {
self._clearLanguageSelect();
var languageCount = countryLanguagesResponse.languages.length;
for (var index = 0; index < languageCount; index++) {
var language = countryLanguagesResponse.languages[index];
var optionElement = self._createHtmlElementFromString('<option value="' + language.threeLetterIsoLanguageName + '">' + language.nativeName + '</option>');
select.appendChild(optionElement);
}
if (languageCount <= 1) {
self._guestLanguageSelectWrapper.classList.add(self._hiddenClass);
} else {
self._guestLanguageSelectWrapper.classList.remove(self._hiddenClass);
}
})["catch"](
/** @param { ErrorResponse } errorResponse **/
function (errorResponse) {
console.error(errorResponse);
});
}
/**
* Clears the customer details language select
*
* @private
*/
}, {
key: "_clearLanguageSelect",
value: function _clearLanguageSelect() {
var select = this._guestLanguageSelectWrapper.querySelector('select[name="language"]');
if (!select) return;
while (select.children.length) {
select.removeChild(select.firstChild);
}
}
/**
* Loops over an error object that contains field names, and for each field name it will
* collect the errorResponse from the fields value (that is an array) and pass them to the error
* list controller which displays them
*
* @param {ErrorResponse} errorResponse an object where the properties are the names of the fields that cause the error. Their values must be arrays containing error strings.
* @private
*/
}, {
key: "_handleErrorResponse",
value: function _handleErrorResponse(errorResponse) {
if (!this._errorFormController) return;
for (var field in errorResponse.errors) {
if (!errorResponse.errors.hasOwnProperty(field)) continue;
var errors = errorResponse.errors[field].join('<br>');
this._errorFormController.setFieldError(field, errors);
}
}
/**
* @private
* @param {string} from
* @return {HTMLElement}
*/
}, {
key: "_createHtmlElementFromString",
value: function _createHtmlElementFromString(from) {
var document = this._domParser.parseFromString(from, 'text/html');
return document.body.firstChild;
}
}]);
return CheckoutController;
}();
/***/ }),
/***/ "./resources/js/shop/components/checkoutService.js":
/*!*********************************************************!*\
!*** ./resources/js/shop/components/checkoutService.js ***!
\*********************************************************/
/*! exports provided: CheckoutService */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CheckoutService", function() { return CheckoutService; });
/* harmony import */ var _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../global/models/errorResponse */ "./resources/js/global/models/errorResponse.js");
/* harmony import */ var _global_models_checkoutInformationResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../global/models/checkoutInformationResponse */ "./resources/js/global/models/checkoutInformationResponse.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* The checkout service knows how to do api calls and handle the responses from the api.
* All related to the checkout process. It does not do anything with the DOM.
*/
var CheckoutService =
/*#__PURE__*/
function () {
function CheckoutService() {
_classCallCheck(this, CheckoutService);
this._baseRoute = '/';
}
/**
* Sets the shipping address so that the shipping costs for example
* can be calculated on advance
*
* @param {Address} address
* @return {Promise<boolean>} Resolves when the shipping address is set. Rejects with an ErrorResponse when it is not.
*/
_createClass(CheckoutService, [{
key: "setShippingAddress",
value: function setShippingAddress(address) {
var self = this;
return new Promise(function (resolve, reject) {
Ajax.post(self._baseRoute + 'setShippingAddress', address, function (xhr) {
// let response = JSON.parse(xhr.response);
if (_global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].is(xhr.response, false) === false) {
resolve();
} else {
var response = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].fromJsonString(xhr.response);
reject(response);
}
});
});
}
/**
* Returns most recent information about the checkout process
*/
}, {
key: "getCheckoutInformation",
value: function getCheckoutInformation() {
var self = this;
return new Promise(function (resolve, reject) {
Ajax.get(self._baseRoute + 'getCheckoutInformation', function (xhr) {
// let response = JSON.parse(xhr.response);
var isErrorResponse = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].is(xhr.response, false);
var isCheckoutInformationResponse = _global_models_checkoutInformationResponse__WEBPACK_IMPORTED_MODULE_1__["CheckoutInformationResponse"].is(xhr.response, false);
if (!isErrorResponse) {
if (isCheckoutInformationResponse) {
var checkoutInformationResponse = _global_models_checkoutInformationResponse__WEBPACK_IMPORTED_MODULE_1__["CheckoutInformationResponse"].fromJsonString(xhr.response);
resolve(checkoutInformationResponse);
} else {
console.error('CheckoutService:getCheckoutInformation The response was not a valid CheckoutInformationResponse: ' + xhr.response);
reject();
}
} else {
var response = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].fromJsonString(xhr.response);
reject(response);
}
});
});
}
/**
* @param {string} coupon
* @return {Promise}
*/
}, {
key: "addCoupon",
value: function addCoupon(coupon) {
var self = this;
if (typeof coupon !== 'string') {
console.error('CheckoutService:addCoupon could not add coupon. It must be a string but was not.');
return Promise.reject('CheckoutService:addCoupon could not add coupon. It must be a string but was not.');
}
return new Promise(function (resolve, reject) {
Ajax.post(self._baseRoute + 'addCouponCode', {
'coupon': coupon
}, function (xhr) {
// let response = JSON.parse(xhr.response);
var isErrorResponse = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].is(xhr.response, false);
var isCheckoutInformationResponse = _global_models_checkoutInformationResponse__WEBPACK_IMPORTED_MODULE_1__["CheckoutInformationResponse"].is(xhr.response, false);
if (!isErrorResponse) {
if (isCheckoutInformationResponse) {
var checkoutInformationResponse = _global_models_checkoutInformationResponse__WEBPACK_IMPORTED_MODULE_1__["CheckoutInformationResponse"].fromJsonString(xhr.response);
resolve(checkoutInformationResponse);
} else {
console.error('CheckoutService:addCoupon The response was not a valid CheckoutInformationResponse: ' + xhr.response);
reject();
}
} else {
var response = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].fromJsonString(xhr.response);
reject(response);
}
});
});
}
/**
* @param {string} coupon
* @return {Promise}
*/
}, {
key: "removeCoupon",
value: function removeCoupon(coupon) {
var self = this;
if (typeof coupon !== 'string') {
console.error('CheckoutService:removeCoupon could not remove coupon. It must be a string but was not.', coupon);
return Promise.reject('CheckoutService:removeCoupon could not remove coupon. It must be a string but was not.');
}
return new Promise(function (resolve, reject) {
Ajax.post(self._baseRoute + 'removeCouponCode', {
'coupon': coupon
}, function (xhr) {
// let response = JSON.parse(xhr.response);
var isErrorResponse = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].is(xhr.response, false);
var isCheckoutInformationResponse = _global_models_checkoutInformationResponse__WEBPACK_IMPORTED_MODULE_1__["CheckoutInformationResponse"].is(xhr.response, false);
if (!isErrorResponse) {
if (isCheckoutInformationResponse) {
var checkoutInformationResponse = _global_models_checkoutInformationResponse__WEBPACK_IMPORTED_MODULE_1__["CheckoutInformationResponse"].fromJsonString(xhr.response);
resolve(checkoutInformationResponse);
} else {
console.error('CheckoutService:removeCoupon The response was not a valid CheckoutInformationResponse: ' + xhr.response);
reject();
}
} else {
var response = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].fromJsonString(xhr.response);
reject(response);
}
});
});
}
}]);
return CheckoutService;
}();
/***/ }),
/***/ "./resources/js/shop/components/errorController.js":
/*!*********************************************************!*\
!*** ./resources/js/shop/components/errorController.js ***!
\*********************************************************/
/*! exports provided: ErrorController */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ErrorController", function() { return ErrorController; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* Controls a div with an ul in it to show errors or not
*/
var ErrorController =
/*#__PURE__*/
function () {
function ErrorController() {
_classCallCheck(this, ErrorController);
this._classToHide = 'u-hidden';
this._errorElementIdSuffix = '_error';
}
/**
* @param {string} fieldSelector
* @param {string} error
*/
_createClass(ErrorController, [{
key: "setFieldError",
value: function setFieldError(fieldSelector, error) {
var selector = '#' + fieldSelector + this._errorElementIdSuffix;
var errorElement = document.querySelector(selector);
if (!errorElement) return;
errorElement.classList.remove(this._classToHide);
errorElement.innerText = error;
}
/**
* @param {string} fieldSelector
*/
}, {
key: "clearFieldError",
value: function clearFieldError(fieldSelector) {
var selector = '#' + fieldSelector + this._errorElementIdSuffix;
var errorElement = document.querySelector(selector);
if (!errorElement) return;
errorElement.classList.add(this._classToHide);
errorElement.innerText = '';
}
/**
* Clear all errors
*/
}, {
key: "clearAllErrors",
value: function clearAllErrors() {
var self = this;
document.querySelectorAll('[id$=' + this._errorElementIdSuffix + ']').forEach(function (errorElement) {
errorElement.classList.add(self._classToHide);
errorElement.innerText = '';
});
}
}]);
return ErrorController;
}();
/***/ }),
/***/ "./resources/js/shop/components/shoppingcartController.js":
/*!****************************************************************!*\
!*** ./resources/js/shop/components/shoppingcartController.js ***!
\****************************************************************/
/*! exports provided: ShoppingcartController */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ShoppingcartController", function() { return ShoppingcartController; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* Shopping cart form controller.
*/
var ShoppingcartController =
/*#__PURE__*/
function () {
/**
* @param {HTMLDivElement} wrapper
* @param {ShoppingcartService} shoppingcartService
*/
function ShoppingcartController(wrapper, shoppingcartService) {
_classCallCheck(this, ShoppingcartController);
this._wrapper = wrapper;
if (!this._wrapper || this._wrapper.tagName !== "DIV") {
console.error('ShoppingCartController: The shoppingCart form must be a div element but was not or wasn\'t even specified. ShoppingCart controller stopped working');
return;
}
this._addToShoppingcartButtons = wrapper.querySelectorAll('.js-add-product-to-shoppingcart');
if (this._addToShoppingcartButtons.length === 0) {
console.error('ShoppingCartController: The shoppingCart form was expected to have 1 or more add shopping cart buttons (class: js-add-product-to-shoppingcart) but got none. ShoppingCart controller stopped working');
return;
}
this._removeFromShoppingcartButtons = wrapper.querySelectorAll('.js-remove-item-from-shoppingcart'); // if(this.removeFromShoppingcartButtons.length === 0) {
// console.error('ShoppingCartController: The shoppingCart form was expected to have 1 or more remove shopping cart item buttons (class: js-remove-item-from-shoppingcart) but got none. ShoppingCart controller stopped working');
// return;
// }
this._changeQuantityShoppingcartItemButtons = wrapper.querySelectorAll('.js-change-quantity-of-shoppingcart-item'); // if(this.changeQuantityShoppingcartItemButtons.length === 0) {
// console.error('ShoppingCartController: The shoppingCart form was expected to have 1 or more change quantity buttons (class: js-change-quantity-of-shoppingcart-item) but got none. ShoppingCart controller stopped working');
// return;
// }
this._shoppingcartService = shoppingcartService;
if (!shoppingcartService) {
console.error('ShoppingCartController: The shoppingCartController was expected to get an instance of ShoppingcartService, but did not get one.');
return;
}
this.addProductButtonClicked = this.addProductButtonClicked.bind(this);
this.removeProductButtonClicked = this.removeProductButtonClicked.bind(this);
this.changeQuantityButtonClicked = this.changeQuantityButtonClicked.bind(this);
this.controlListeners(true);
}
/**
* Enable or disable event listeners
*
* @param enable
*/
_createClass(ShoppingcartController, [{
key: "controlListeners",
value: function controlListeners() {
var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
var addToShoppingcartButtonsLength = this._addToShoppingcartButtons.length;
var removeFromShoppingcartButtonsLength = this._removeFromShoppingcartButtons.length;
var changeQuantityShoppingcartItemButtonsLength = this._changeQuantityShoppingcartItemButtons.length;
for (var index = 0; index < addToShoppingcartButtonsLength; index++) {
this._addToShoppingcartButtons[index].removeEventListener('click', this.addProductButtonClicked);
}
for (var _index = 0; _index < removeFromShoppingcartButtonsLength; _index++) {
this._removeFromShoppingcartButtons[_index].removeEventListener('click', this.removeProductButtonClicked);
}
for (var _index2 = 0; _index2 < changeQuantityShoppingcartItemButtonsLength; _index2++) {
this._changeQuantityShoppingcartItemButtons[_index2].removeEventListener('click', this.changeQuantityButtonClicked);
}
if (enable) {
for (var _index3 = 0; _index3 < addToShoppingcartButtonsLength; _index3++) {
this._addToShoppingcartButtons[_index3].addEventListener('click', this.addProductButtonClicked);
}
for (var _index4 = 0; _index4 < removeFromShoppingcartButtonsLength; _index4++) {
this._removeFromShoppingcartButtons[_index4].addEventListener('click', this.removeProductButtonClicked);
}
for (var _index5 = 0; _index5 < changeQuantityShoppingcartItemButtonsLength; _index5++) {
this._changeQuantityShoppingcartItemButtons[_index5].addEventListener('click', this.changeQuantityButtonClicked);
}
}
}
/**
* @param {MouseEvent} event
*/
}, {
key: "addProductButtonClicked",
value: function addProductButtonClicked(event) {
if (!("productId" in event.target.dataset)) {
console.error('ShoppingCartController: Expected an add button to have the data-product-id attribute set. But did not have that. Not processing click', event.target.dataset);
return;
}
if (!("productType" in event.target.dataset)) {
console.error('ShoppingCartController: Expected an add button to have the data-type attribute set. But did not have that. Not processing click', event.target.dataset);
return;
}
this._shoppingcartService._addProductToShoppingcart(event.target.dataset.productId, event.target.dataset.productType);
}
/**
* @param {MouseEvent} event
*/
}, {
key: "removeProductButtonClicked",
value: function removeProductButtonClicked(event) {
if (!("productId" in event.target.dataset)) {
console.error('ShoppingCartController: Expected an add button to have the data-product-id attribute set. But did not have that. Not processing click', event.target.dataset);
return;
}
if (!("productType" in event.target.dataset)) {
console.error('ShoppingCartController: Expected an add button to have the data-type attribute set. But did not have that. Not processing click', event.target.dataset);
return;
}
this._shoppingcartService._removeItemFromShoppingcart(event.target.dataset.productId, event.target.dataset.productType);
}
/**
* @param {MouseEvent} event
*/
}, {
key: "changeQuantityButtonClicked",
value: function changeQuantityButtonClicked(event) {
if (!("shoppingcartItemId" in event.target.dataset)) {
console.error('ShoppingCartController: Expected an add button to have the data-shoppingcart-item-id attribute set. But did not have that. Not processing click', event.target.dataset);
return;
}
if (!("quantity" in event.target.dataset)) {
console.error('ShoppingCartController: Expected an add button to have the data-quantity attribute set. But did not have that. Not processing click', event.target.dataset);
return;
}
this._shoppingcartService._setItemQuantityInShoppingcart(event.target.dataset.shoppingcartItemId, event.target.dataset.quantity);
}
}, {
key: "updateCartButtonCounter",
value: function updateCartButtonCounter() {
var count = this._wrapper.querySelectorAll('.shoppingcartItemList ul li').length;
var counter = document.querySelector('.shoppingCartButton span.shoppingCartButtonCounter');
counter.innerText(count);
}
}]);
return ShoppingcartController;
}();
/***/ }),
/***/ "./resources/js/shop/components/shoppingcartService.js":
/*!*************************************************************!*\
!*** ./resources/js/shop/components/shoppingcartService.js ***!
\*************************************************************/
/*! exports provided: ShoppingcartService */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ShoppingcartService", function() { return ShoppingcartService; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
var ShoppingcartService =
/*#__PURE__*/
function () {
function ShoppingcartService() {
_classCallCheck(this, ShoppingcartService);
this._baseRoute = '/';
}
/**
* Adds a product to the shopping cart
*
* @param id
* @param type
*/
_createClass(ShoppingcartService, [{
key: "_addProductToShoppingcart",
value: function _addProductToShoppingcart(id, type) {
var quantity = 10;
Ajax.post(this._baseRoute + 'addProductToShoppingcart', {
productableId: id,
itemType: type,
quantity: quantity
}, function (xhr) {
console.log(xhr);
window.location = xhr.response;
});
}
}, {
key: "_removeItemFromShoppingcart",
/**
* Remove a product from the shopping cart
*
* @param id
* @param type
*/
value: function _removeItemFromShoppingcart(id, type) {
Ajax.post(this._baseRoute + 'removeItemFromShoppingcart', {
productableId: id,
itemType: type
}, function (xhr) {
window.location = xhr.response;
});
}
}, {
key: "_setItemQuantityInShoppingcart",
/**
* Set the quantity of a shopping cart item
*
* @param id
* @param quantity
*/
value: function _setItemQuantityInShoppingcart(id, quantity) {
if (quantity > 0) {
Ajax.post('/setItemQuantityInShoppingcart', {
itemId: id,
quantity: quantity
}, function (xhr) {
window.location = xhr.response;
});
} else {
this._removeItemFromShoppingcart(id);
}
}
}]);
return ShoppingcartService;
}();
/***/ }),
/***/ "./resources/js/shop/components/validationService.js":
/*!***********************************************************!*\
!*** ./resources/js/shop/components/validationService.js ***!
\***********************************************************/
/*! exports provided: ValidationService */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ValidationService", function() { return ValidationService; });
/* harmony import */ var _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../global/models/errorResponse */ "./resources/js/global/models/errorResponse.js");
/* harmony import */ var _global_models_validationResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../global/models/validationResponse */ "./resources/js/global/models/validationResponse.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
var ValidationService =
/*#__PURE__*/
function () {
function ValidationService() {
_classCallCheck(this, ValidationService);
}
_createClass(ValidationService, [{
key: "validateCheckoutForm",
/**
* @param {FormData} data
* @return {Promise}
*/
value: function validateCheckoutForm(data) {
var self = this;
if (!(data instanceof FormData)) {
console.error('ValidationService:validateCheckoutForm could not validate form since no valid FormData instance was given.');
return Promise.reject('ValidationService:validateCheckoutForm could not validate form since no valid FormData instance was given.');
}
return new Promise(function (resolve, reject) {
Ajax.postFormData('/validation/form/checkout', data, function (xhr) {
var isErrorResponse = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].is(xhr.response, false);
if (!isErrorResponse) {
resolve();
} else {
reject(_global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].fromJsonString(xhr.response));
}
});
});
}
}]);
return ValidationService;
}();
/***/ }),
/***/ "./resources/js/site/app.js":
/*!**********************************!*\
!*** ./resources/js/site/app.js ***!
\**********************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _components_GlobalisationService__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./components/GlobalisationService */ "./resources/js/site/components/GlobalisationService.js");
/* harmony import */ var _components_RegisterController__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/RegisterController */ "./resources/js/site/components/RegisterController.js");
/* harmony import */ var _shop_components_checkoutController__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../shop/components/checkoutController */ "./resources/js/shop/components/checkoutController.js");
/* harmony import */ var _shop_components_shoppingcartController__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shop/components/shoppingcartController */ "./resources/js/shop/components/shoppingcartController.js");
/* harmony import */ var _shop_components_shoppingcartService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../shop/components/shoppingcartService */ "./resources/js/shop/components/shoppingcartService.js");
/* harmony import */ var _shop_components_checkoutService__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../shop/components/checkoutService */ "./resources/js/shop/components/checkoutService.js");
/* harmony import */ var _shop_components_validationService__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../shop/components/validationService */ "./resources/js/shop/components/validationService.js");
/* harmony import */ var _shop_components_errorController__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../shop/components/errorController */ "./resources/js/shop/components/errorController.js");
/** ==========================================================================
* Import ES6 Modules (https://webpack.js.org/api/module-methods/)
* =========================================================================*/
/** ==========================================================================
* Dependencies
* =========================================================================*/
/**
* External
*/
__webpack_require__(/*! hammerjs */ "./node_modules/hammerjs/hammer.js");
__webpack_require__(/*! objectFitPolyfill */ "./node_modules/objectFitPolyfill/dist/objectFitPolyfill.min.js");
/**
* Global / Shared with KMS
*/
__webpack_require__(/*! ./../global/polyfills/eventPolyFill */ "./resources/js/global/polyfills/eventPolyFill.js");
__webpack_require__(/*! ./../global/polyfills/isInteger */ "./resources/js/global/polyfills/isInteger.js");
__webpack_require__(/*! ./../global/polyfills/promise */ "./resources/js/global/polyfills/promise.js");
/** ==========================================================================
* Global functionalities
* =========================================================================*/
__webpack_require__(/*! ./global/helpers */ "./resources/js/site/global/helpers.js"); // Should be first
__webpack_require__(/*! ./global/browserHandler */ "./resources/js/site/global/browserHandler.js"); // require('./global/pagetransitionHandler');
// require('./global/resizeHandler');
__webpack_require__(/*! ./global/scrollHandler */ "./resources/js/site/global/scrollHandler.js");
/** ==========================================================================
* Component functionalities
* =========================================================================*/
__webpack_require__(/*! ./components/chocolateFactory */ "./resources/js/site/components/chocolateFactory.js");
__webpack_require__(/*! ./components/cookieHandler */ "./resources/js/site/components/cookieHandler.js"); // require('./components/InputHandler');
__webpack_require__(/*! ./components/mapsHandler */ "./resources/js/site/components/mapsHandler.js");
__webpack_require__(/*! ./components/overlayMenuHandler */ "./resources/js/site/components/overlayMenuHandler.js");
__webpack_require__(/*! ./components/projectorHandler */ "./resources/js/site/components/projectorHandler.js");
__webpack_require__(/*! ./components/scrollToHandler */ "./resources/js/site/components/scrollToHandler.js"); // require('./components/searchHandler');
// require('./components/shareButtonsHandler');
__webpack_require__(/*! ./components/youtubeHandler */ "./resources/js/site/components/youtubeHandler.js");
/** ==========================================================================
* Shop Component functionalities
* =========================================================================*/
var checkoutFormDivElement = document.querySelector('.js-checkout-form');
if (checkoutFormDivElement) new _shop_components_checkoutController__WEBPACK_IMPORTED_MODULE_2__["CheckoutController"](checkoutFormDivElement, new _shop_components_shoppingcartService__WEBPACK_IMPORTED_MODULE_4__["ShoppingcartService"](), new _shop_components_checkoutService__WEBPACK_IMPORTED_MODULE_5__["CheckoutService"](), new _shop_components_validationService__WEBPACK_IMPORTED_MODULE_6__["ValidationService"](), new _components_GlobalisationService__WEBPACK_IMPORTED_MODULE_0__["GlobalisationService"](), new _shop_components_errorController__WEBPACK_IMPORTED_MODULE_7__["ErrorController"]());
var shoppingCartDivElement = document.querySelector('.js-cart');
if (shoppingCartDivElement) new _shop_components_shoppingcartController__WEBPACK_IMPORTED_MODULE_3__["ShoppingcartController"](shoppingCartDivElement, new _shop_components_shoppingcartService__WEBPACK_IMPORTED_MODULE_4__["ShoppingcartService"]());
var registerForm = document.getElementById('registerForm');
if (registerForm) new _components_RegisterController__WEBPACK_IMPORTED_MODULE_1__["RegisterController"](registerForm, new _components_GlobalisationService__WEBPACK_IMPORTED_MODULE_0__["GlobalisationService"]());
/***/ }),
/***/ "./resources/js/site/components/GlobalisationService.js":
/*!**************************************************************!*\
!*** ./resources/js/site/components/GlobalisationService.js ***!
\**************************************************************/
/*! exports provided: GlobalisationService */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GlobalisationService", function() { return GlobalisationService; });
/* harmony import */ var _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../global/models/errorResponse */ "./resources/js/global/models/errorResponse.js");
/* harmony import */ var _global_models_countryLanguagesResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../global/models/countryLanguagesResponse */ "./resources/js/global/models/countryLanguagesResponse.js");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
var GlobalisationService =
/*#__PURE__*/
function () {
function GlobalisationService() {
_classCallCheck(this, GlobalisationService);
this._baseRoute = '/';
}
/**
* Adds a product to the shopping cart
*
* @param {string} countryIso3
*/
_createClass(GlobalisationService, [{
key: "getLanguagesForCountryWithIso3",
value: function getLanguagesForCountryWithIso3(countryIso3) {
var self = this;
return new Promise(function (resolve, reject) {
Ajax.post(self._baseRoute + 'getLanguagesForCountryWithIso3', {
countryIso3: countryIso3
}, function (xhr) {
// let response = JSON.parse(xhr.response);
var isErrorResponse = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].is(xhr.response, false);
var isCountryLanguagesResponse = _global_models_countryLanguagesResponse__WEBPACK_IMPORTED_MODULE_1__["CountryLanguagesResponse"].is(xhr.response, false);
if (!isErrorResponse) {
if (isCountryLanguagesResponse) {
var countryLanguagesResponse = _global_models_countryLanguagesResponse__WEBPACK_IMPORTED_MODULE_1__["CountryLanguagesResponse"].fromJsonString(xhr.response);
resolve(countryLanguagesResponse);
} else {
console.error('RegisterService:getLanguagesForCountryWithIso3 The response was not a valid CountryLanguagesResponse: ' + xhr.response);
reject();
}
} else {
var response = _global_models_errorResponse__WEBPACK_IMPORTED_MODULE_0__["ErrorResponse"].fromJsonString(xhr.response);
reject(response);
}
});
});
}
}]);
return GlobalisationService;
}();
/***/ }),
/***/ "./resources/js/site/components/RegisterController.js":
/*!************************************************************!*\
!*** ./resources/js/site/components/RegisterController.js ***!
\************************************************************/
/*! exports provided: RegisterController */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RegisterController", function() { return RegisterController; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
var RegisterController =
/*#__PURE__*/
function () {
/**
* @param {HTMLDivElement} wrapper
* @param {GlobalisationService} globalisationService
*/
function RegisterController(wrapper, globalisationService) {
_classCallCheck(this, RegisterController);
this._wrapper = wrapper;
if (!this._wrapper || this._wrapper.tagName !== "FORM") {
console.error('RegisterController: The Register form must be a div element but was not or wasn\'t even specified.');
return;
}
this._countrySelect = this._wrapper.querySelector('select[name="country"]');
if (!this._countrySelect) {
console.error('RegisterController: The Register form must have a select element with name "country" but did not have it.');
return;
}
this._languageSelect = this._wrapper.querySelector('select[name="language"]');
if (!this._countrySelect) {
console.error('RegisterController: The Register form must have a select element with name "language" but did not have it.');
return;
}
this._languageSelectWrapper = this._wrapper.querySelector('.js-language-wrapper');
if (!this._languageSelectWrapper || this._languageSelectWrapper.tagName !== "DIV") {
console.error('RegisterController: The Register form must have a wrapper DIV element with class "js-language-wrapper" but did not have it.');
return;
}
this._globalisationService = globalisationService;
if (!globalisationService) {
console.error('RegisterController: The Register form was expected to get an instance of RegisterService, but did not get one.');
return;
}
this._hiddenClass = 'u-hidden'; //The name of a class that can be applied to things to hide them.
this._domParser = new DOMParser();
this._countryChanged = this._countryChanged.bind(this);
this.controlListeners(true);
this._countryChanged();
}
_createClass(RegisterController, [{
key: "controlListeners",
value: function controlListeners() {
var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
this._countrySelect.removeEventListener('change', this._countryChanged);
if (enable) {
this._countrySelect.addEventListener('change', this._countryChanged);
}
}
/**
* @private
*/
}, {
key: "_countryChanged",
value: function _countryChanged() {
var countryIso3 = this._countrySelect.value;
var self = this;
this._globalisationService.getLanguagesForCountryWithIso3(countryIso3).then(
/** @param { CountryLanguagesResponse } countryLanguagesResponse **/
function (countryLanguagesResponse) {
self._clearLanguageSelect();
var languageCount = countryLanguagesResponse.languages.length;
for (var index = 0; index < languageCount; index++) {
var language = countryLanguagesResponse.languages[index];
var optionElement = self._createHtmlElementFromString('<option value="' + language.threeLetterIsoLanguageName + '">' + language.nativeName + '</option>');
self._languageSelect.appendChild(optionElement);
}
if (languageCount <= 1) {
self._languageSelectWrapper.classList.add(self._hiddenClass);
} else {
self._languageSelectWrapper.classList.remove(self._hiddenClass);
}
})["catch"](
/** @param { ErrorResponse } errorResponse **/
function (errorResponse) {
console.error(errorResponse);
});
}
/**
* @private
*/
}, {
key: "_clearLanguageSelect",
value: function _clearLanguageSelect() {
while (this._languageSelect.children.length) {
this._languageSelect.removeChild(this._languageSelect.firstChild);
}
}
/**
* @private
* @param {string} from
* @return {HTMLElement}
*/
}, {
key: "_createHtmlElementFromString",
value: function _createHtmlElementFromString(from) {
var document = this._domParser.parseFromString(from, 'text/html');
return document.body.firstChild;
}
}]);
return RegisterController;
}();
/***/ }),
/***/ "./resources/js/site/components/chocolateFactory.js":
/*!**********************************************************!*\
!*** ./resources/js/site/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-element-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]; // 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)) {
var currentFeedbackArea = visitorFeedbackArea.innerHTML;
currentFeedbackArea += '<span>' + capitalizeFirstLetter(visitorFeedbackLine) + '</span>';
visitorFeedbackArea.innerHTML = currentFeedbackArea;
}
} // Append feedback to factory feedback area if defined
if (isset(feedbackArea)) {
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-element')) 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/site/components/cookieHandler.js":
/*!*******************************************************!*\
!*** ./resources/js/site/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,
cookieOverlay: null,
cookieMessage: null,
cookieSwitch: null,
cookieFadeOutAnimationDuration: 400,
acceptTracking: false,
// Initialize cookie handler
init: function init() {
// Bind cookie bar or overlay to cookieMessage
CookieHandler.cookieMessage = document.querySelector('.js-cookie-bar, .js-cookie-overlay'); // 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();
} else {
// Else try to connect cookie overlay with tracking to cookieOverlay
CookieHandler.cookieOverlay = document.querySelector('.js-cookie-overlay'); // If isset init the functions for cookie overlay
if (isset(CookieHandler.cookieOverlay)) {
CookieHandler.initCookieOverlay();
}
} // If either type of cookie has been found check if settings are defined
if (isset(CookieHandler.cookieMessage)) {
CookieHandler.checkForCookieSettings();
} // Bind cookie switch to Handler
CookieHandler.cookieSwitch = document.querySelector('.js-cookie-switch'); // If isset init the functions for cookie switch
if (isset(CookieHandler.cookieSwitch)) {
CookieHandler.initCookieSwitch();
}
},
// 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);
}
},
// Init the cookie overlay actions
initCookieOverlay: function initCookieOverlay() {
// Open the cookie settings event
var openCookieSettingsButton = CookieHandler.cookieMessage.querySelector('.js-change-cookies-settings');
if (isset(openCookieSettingsButton)) {
openCookieSettingsButton.addEventListener('click', CookieHandler.openCookieSettings);
} // Toggle of the tracking input
var toggleTrackingInput = CookieHandler.cookieMessage.querySelector('.c-cookie-type__input--tracking');
if (isset(toggleTrackingInput)) {
if (toggleTrackingInput.checked === true) {
CookieHandler.acceptTracking = true;
}
toggleTrackingInput.addEventListener('change', CookieHandler.toggleTrackingSetting);
} // Accept / Save cookies button event
var acceptButton = CookieHandler.cookieMessage.querySelector('.js-accept-cookies');
if (isset(acceptButton)) {
acceptButton.addEventListener('click', CookieHandler.setCookieSettings);
}
},
// Init the cookie switch actions
initCookieSwitch: function initCookieSwitch() {
// Toggle of the tracking input
var toggleTrackingInput = CookieHandler.cookieSwitch.querySelector('.c-cookie-type__input--tracking');
if (isset(toggleTrackingInput)) {
// Force the state of the cookie switch input because the pop-up is forced on checked
// while the switch checks by php if the cookie really exist or not
if (toggleTrackingInput.checked === true) {
CookieHandler.acceptTracking = true;
} else {
CookieHandler.acceptTracking = false;
}
toggleTrackingInput.addEventListener('change', CookieHandler.toggleTrackingSetting);
} // Save cookies button event
var saveButton = CookieHandler.cookieSwitch.querySelector('.js-save-cookie-settings');
if (isset(saveButton)) {
saveButton.addEventListener('click', function () {
CookieHandler.cookieFadeOutAnimationDuration = 0; // On the switch click we want no delay :)
CookieHandler.setCookieSettings();
});
}
},
checkForCookieSettings: function checkForCookieSettings() {
if (Cookie.get('cookieMessage')) {
CookieHandler.cookieMessage.classList.add('is-accepted');
} else {
CookieHandler.cookieMessage.classList.remove('is-accepted');
document.body.classList.add('is-cookie-bar-visible');
}
},
closeCookieMessage: function closeCookieMessage() {
Cookie.set('cookieMessage', true, 90);
CookieHandler.cookieMessage.classList.add('is-transitioning-out');
document.body.classList.remove('is-cookie-bar-visible');
},
openCookieSettings: function openCookieSettings() {
CookieHandler.cookieOverlay.querySelector('.js-cookie-settings').classList.remove('is-hidden');
CookieHandler.cookieOverlay.querySelector('.js-cookie-info').classList.add('is-hidden');
},
toggleTrackingSetting: function toggleTrackingSetting() {
if (CookieHandler.acceptTracking) {
CookieHandler.acceptTracking = false;
} else {
CookieHandler.acceptTracking = true;
}
},
setCookieSettings: function setCookieSettings() {
// Set tracking cookie or delete it if isset according to the desired settings
if (CookieHandler.acceptTracking) {
Cookie.set('trackingCookieAccepted', 'true', 90);
} else {
if (Cookie.get('trackingCookieAccepted')) {
Cookie.erase('trackingCookieAccepted');
}
}
CookieHandler.closeCookieMessage(); // Reload after animation to automatically trigger the tracking after accepting it
setTimeout(function () {
location.reload();
}, CookieHandler.cookieFadeOutAnimationDuration);
}
};
CookieHandler.init();
/***/ }),
/***/ "./resources/js/site/components/mapsHandler.js":
/*!*****************************************************!*\
!*** ./resources/js/site/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 = {
maps: [],
key: '',
init: function init() {
// Get map elements
var maps = document.querySelectorAll('.js-google-map'); // If there are map elements loop through them and draw the maps
if (maps.length !== 0) {
// Convert elements into object for callback when script as been loaded
for (var i = 0; i < maps.length; i++) {
// Get map from nodeList
var map = maps[i];
if (!map.hasAttribute('data-google-lat') || !map.hasAttribute('data-google-lng')) continue;
var lat = parseFloat(map.getAttribute('data-google-lat'));
var lng = parseFloat(map.getAttribute('data-google-lng'));
MapsHandler.maps.push({
node: map,
location: {
lat: lat,
lng: lng
},
styles: MapsHandler.setCustomStyling()
});
} // See if google variable exists
if (typeof google == 'undefined' || typeof google.maps == 'undefined') {
// Load external script with drawMaps callback
getScript('https://maps.googleapis.com/maps/api/js?key=' + MapsHandler.key, MapsHandler.drawMaps);
} else {
// If already loaded draw maps
MapsHandler.drawMaps();
}
}
},
/**
* Draw the google maps
*/
drawMaps: function drawMaps() {
for (var i = 0; i < MapsHandler.maps.length; i++) {
var map = MapsHandler.maps[i]; // Create a map
var googleMap = new google.maps.Map(map.node, {
zoom: 11,
center: map.location,
disableDefaultUI: true,
styles: map.styles
}); // Add a marker
var marker = new google.maps.Marker({
position: map.location,
map: googleMap
});
}
},
/**
* Set the custom styling for the Google Maps
*
* @returns {*[]}
*/
setCustomStyling: function setCustomStyling() {
return [{
"featureType": "poi",
"elementType": "labels.text.fill",
"stylers": [{
"color": "#747474"
}, {
"lightness": "23"
}]
}, {
"featureType": "poi.attraction",
"elementType": "geometry.fill",
"stylers": [{
"color": "#f38eb0"
}]
}, {
"featureType": "poi.government",
"elementType": "geometry.fill",
"stylers": [{
"color": "#ced7db"
}]
}, {
"featureType": "poi.medical",
"elementType": "geometry.fill",
"stylers": [{
"color": "#ffa5a8"
}]
}, {
"featureType": "poi.park",
"elementType": "geometry.fill",
"stylers": [{
"color": "#c7e5c8"
}]
}, {
"featureType": "poi.place_of_worship",
"elementType": "geometry.fill",
"stylers": [{
"color": "#d6cbc7"
}]
}, {
"featureType": "poi.school",
"elementType": "geometry.fill",
"stylers": [{
"color": "#c4c9e8"
}]
}, {
"featureType": "poi.sports_complex",
"elementType": "geometry.fill",
"stylers": [{
"color": "#b1eaf1"
}]
}, {
"featureType": "road",
"elementType": "geometry",
"stylers": [{
"lightness": "100"
}]
}, {
"featureType": "road",
"elementType": "labels",
"stylers": [{
"visibility": "off"
}, {
"lightness": "100"
}]
}, {
"featureType": "road.highway",
"elementType": "geometry.fill",
"stylers": [{
"color": "#ffd4a5"
}]
}, {
"featureType": "road.arterial",
"elementType": "geometry.fill",
"stylers": [{
"color": "#ffe9d2"
}]
}, {
"featureType": "road.local",
"elementType": "all",
"stylers": [{
"visibility": "simplified"
}]
}, {
"featureType": "road.local",
"elementType": "geometry.fill",
"stylers": [{
"weight": "3.00"
}]
}, {
"featureType": "road.local",
"elementType": "geometry.stroke",
"stylers": [{
"weight": "0.30"
}]
}, {
"featureType": "road.local",
"elementType": "labels.text",
"stylers": [{
"visibility": "on"
}]
}, {
"featureType": "road.local",
"elementType": "labels.text.fill",
"stylers": [{
"color": "#747474"
}, {
"lightness": "36"
}]
}, {
"featureType": "road.local",
"elementType": "labels.text.stroke",
"stylers": [{
"color": "#e9e5dc"
}, {
"lightness": "30"
}]
}, {
"featureType": "transit.line",
"elementType": "geometry",
"stylers": [{
"visibility": "on"
}, {
"lightness": "100"
}]
}, {
"featureType": "water",
"elementType": "all",
"stylers": [{
"color": "#d2e7f7"
}]
}];
}
};
MapsHandler.init();
/***/ }),
/***/ "./resources/js/site/components/overlayMenuHandler.js":
/*!************************************************************!*\
!*** ./resources/js/site/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/site/components/projectorHandler.js":
/*!**********************************************************!*\
!*** ./resources/js/site/components/projectorHandler.js ***!
\**********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/**
* Created by Pascal on 06/12/17.
* (Name changes by Rob on 18/03/18)
*/
/* Example
const headerImageSliderSetting = new ProjectorSetting({
sliderProjectorId: 'header-image-slider',
slideQuery: '#header-image-slider .placeholder figure',
dots: '#header-image-slider .slider-navigation-labels .navigation span',
captions: '#header-image-slider .slider-navigation-labels .caption p',
autoSlide: true,
sliderInterval: 4000
});
headerImageSliderSetting = headerImageSliderSetting.prepareParameters();
const headerImageSlider = new Projector(headerImageSliderSetting).init();
*/
var projectors = [];
var projectorContainers = document.querySelectorAll('.js-projector');
var projectorContainersLength = projectorContainers.length;
for (var i = 0; i < projectorContainersLength; i++) {
var projector = projectorContainers[i];
var projectorId = projector.getAttribute('id');
if (projectorId !== null) {
var projectorSetting = new ProjectorSetting({
sliderId: projectorId,
slideQuery: '#' + projectorId + ' .js-projector-slide',
navigationButtons: '#' + projectorId + ' .js-projector-button',
dots: '#' + projectorId + ' .js-projector-indicator',
autoSlide: true,
sliderInterval: 4000
});
projectors.push(new Projector(projectorSetting.prepareParameters()).init());
} else console.log('An image slider has no id...');
}
function ProjectorSetting(settingsObject) {
var self = this;
this.sliderId = '';
this.definedPreviousNext = true;
this.autoSlide = false;
this.sliderInterval = 4000;
this.navigationButtons = '';
this.dots = '';
this.captions = '';
this.slideQuery = '';
this.setProjectorId = function (string) {
this.sliderId = string;
return this;
};
this.setDefinedPreviousNext = function (_boolean) {
this.definedPreviousNext = _boolean;
return this;
};
this.setAutoSlide = function (_boolean2) {
this.autoSlide = _boolean2;
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.setCaptions = function (string) {
this.captions = string;
return this;
};
this.getProjectorId = function () {
return this.sliderId;
};
this.getDefinedPreviousNext = function () {
return this.definedPreviousNext;
};
this.getAutoSlide = function () {
return this.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;
};
this.getCaptions = function () {
return this.captions;
}; // Invert setters to getters
this.prepareParameters = function () {
return {
sliderId: self.getProjectorId(),
definedPreviousNext: self.getDefinedPreviousNext(),
autoSlide: self.getAutoSlide(),
sliderInterval: self.getSliderInterval(),
navigationButtons: self.getNavigationButtons(),
dots: self.getDots(),
captions: self.getCaptions(),
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.setProjectorId,
definedPreviousNext: self.setDefinedPreviousNext,
autoSlide: self.setAutoSlide,
sliderInterval: self.setSliderInterval,
navigationButtons: self.setNavigationButtons,
dots: self.setDots,
captions: self.setCaptions,
slideQuery: self.setSlideQuery,
prepareParameters: self.prepareParameters
};
}
function Projector(settings) {
//Define Projector object
var self = this;
this.sliderObject = ''; //SlideParameters
this.activeSlideId = 0;
this.previousSlideId = 0;
this.nextSlideId = 0;
this.availableSlides = 1;
this.slides = [];
this.autoSlideInterval = 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; //Define previous and next if we want to use those
if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide(); // Set active slide (and possible previous and next classes)
this.setSlide(); // Swipe interaction
var swipeGestures = new Hammer(this.sliderObject);
swipeGestures.on('swipeleft', function () {
self.resetAutoSlide();
self.nextSlide();
self.setSlide();
});
swipeGestures.on('swiperight', function () {
self.resetAutoSlide();
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]; // console.log('hier');
dot.addEventListener('click', function () {
self.clickDot(this);
});
}
}
self.autoSlide();
};
this.autoSlide = function () {
if (this.autoSlideInterval !== null) clearInterval(this.autoSlideInterval);
if (this.settings.autoSlide && Number.isInteger(this.settings.sliderInterval)) {
this.autoSlideInterval = setInterval(function () {
self.nextSlide();
self.setSlide();
}, this.settings.sliderInterval);
}
};
this.resetAutoSlide = self.autoSlide;
this.nextSlide = function () {
this.activeSlideId++;
if (this.activeSlideId >= this.availableSlides) this.activeSlideId = 0;
if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();
};
this.previousSlide = function () {
this.activeSlideId--;
if (this.activeSlideId < 0) this.activeSlideId = this.availableSlides - 1;
if (self.settings.definedPreviousNext) this.setPreviousAndNextSlide();
};
this.setPreviousAndNextSlide = function () {
this.nextSlideId = this.activeSlideId + 1;
if (this.nextSlideId >= this.availableSlides) this.nextSlideId = 0;
this.previousSlideId = this.activeSlideId - 1;
if (this.previousSlideId < 0) this.previousSlideId = 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]; // 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 we use the previous and next, also set those classes
if (self.settings.definedPreviousNext) {
if (slideOrder !== self.previousSlideId) slide.classList.remove('previous');else slide.classList.add('previous');
if (slideOrder !== self.nextSlideId) slide.classList.remove('next');else slide.classList.add('next');
}
}
if (self.settings.dots !== '') {
self.setActiveDot();
}
if (self.settings.captions !== '') {
self.setActiveCaption();
}
};
this.clickNavigationButton = function (navButton) {
self.activeSlideId = parseInt(navButton.getAttribute('data-order'));
if (self.settings.definedPreviousNext) self.setPreviousAndNextSlide();
self.setSlide();
var next = document.querySelector(self.settings.navigationButtons + '.next');
var previous = document.querySelector(self.settings.navigationButtons + '.previous');
next.setAttribute('data-order', self.nextSlideId);
previous.setAttribute('data-order', self.previousSlideId);
self.resetAutoSlide(); // next.querySelector('p').innerHTML = self.slides[self.nextSlideId].dataset.name;
// previous.querySelector('p').innerHTML = self.slides[self.previousSlideId].dataset.name;
};
this.clickDot = function (clickedDot) {
self.activeSlideId = parseInt(clickedDot.getAttribute('data-order'));
self.setSlide();
self.resetAutoSlide();
};
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');else dot.classList.add('is-active');
}
};
this.setActiveCaption = function () {
var captions = document.querySelectorAll(this.settings.captions);
var captionsLength = captions.length;
for (var _i6 = 0; _i6 < captionsLength; _i6++) {
var caption = captions[_i6];
captionOrder = parseInt(caption.getAttribute('data-order'));
if (captionOrder !== self.activeSlideId) caption.classList.remove('is-active');else caption.classList.add('is-active');
}
};
}
/***/ }),
/***/ "./resources/js/site/components/scrollToHandler.js":
/*!*********************************************************!*\
!*** ./resources/js/site/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);
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/site/components/youtubeHandler.js":
/*!********************************************************!*\
!*** ./resources/js/site/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/site/global/browserHandler.js":
/*!****************************************************!*\
!*** ./resources/js/site/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/site/global/helpers.js":
/*!*********************************************!*\
!*** ./resources/js/site/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;
var 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 (host.split('.').length === 1) {
// no "." in a domain - it's localhost or something similar
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) {
var nameEQ = name + "=";
var 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);
}
};
/*
* 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));
},
postFormData: function postFormData(url, data, callback) {
var xhr = new XMLHttpRequest();
var token = document.querySelector('meta[name="csrf-token"]').content;
xhr.open('post', url, true);
xhr.setRequestHeader('X-CSRF-TOKEN', token);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
callback(xhr);
}
};
xhr.send(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 {*}
*/
window.snakeToCamel = function (string) {
return string.replace(/(\-\w)/g, function (m) {
return m[1].toUpperCase();
});
};
/**
* Get the index of an element inside its parent
*/
window.indexInParent = function (node) {
var 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
*/
window.copyToClipboard = function (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
var editable = el.contentEditable;
var 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
var 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');
};
/**
* Get the position of the element related to the body
*
* @param el
* @returns {{top: number, left: number}}
*/
window.bodyOffset = function (el) {
var rect = el.getBoundingClientRect(),
scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,
scrollTop = window.pageYOffset || document.documentElement.scrollTop;
return {
top: rect.top + scrollTop,
left: rect.left + scrollLeft
};
};
/***/ }),
/***/ "./resources/js/site/global/scrollHandler.js":
/*!***************************************************!*\
!*** ./resources/js/site/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;
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/kms/styles.sass":
/*!****************************************!*\
!*** ./resources/sass/kms/styles.sass ***!
\****************************************/
/*! no static exports found */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/***/ "./resources/sass/site/style.scss":
/*!****************************************!*\
!*** ./resources/sass/site/style.scss ***!
\****************************************/
/*! no static exports found */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/***/ 0:
/*!**********************************************************************************************************!*\
!*** multi ./resources/js/site/app.js ./resources/sass/site/style.scss ./resources/sass/kms/styles.sass ***!
\**********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
__webpack_require__(/*! /Users/julesgraus/webDevelopment/KMS/resources/js/site/app.js */"./resources/js/site/app.js");
__webpack_require__(/*! /Users/julesgraus/webDevelopment/KMS/resources/sass/site/style.scss */"./resources/sass/site/style.scss");
module.exports = __webpack_require__(/*! /Users/julesgraus/webDevelopment/KMS/resources/sass/kms/styles.sass */"./resources/sass/kms/styles.sass");
/***/ })
},[[0,"/js/site/manifest","/js/site/vendor"]]]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZXRpbW1lZGlhdGUvc2V0SW1tZWRpYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2dsb2JhbC9tb2RlbHMvYWRkcmVzcy5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZ2xvYmFsL21vZGVscy9jaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2dsb2JhbC9tb2RlbHMvY291bnRyeUxhbmd1YWdlc1Jlc3BvbnNlLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9nbG9iYWwvbW9kZWxzL2Vycm9yUmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2dsb2JhbC9tb2RlbHMvbGFuZ3VhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2dsb2JhbC9tb2RlbHMvdmFsaWRhdGlvblJlc3BvbnNlLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9nbG9iYWwvcG9seWZpbGxzL2V2ZW50UG9seUZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2dsb2JhbC9wb2x5ZmlsbHMvaXNJbnRlZ2VyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9nbG9iYWwvcG9seWZpbGxzL3Byb21pc2UuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3Nob3AvY29tcG9uZW50cy9jaGVja291dENvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3Nob3AvY29tcG9uZW50cy9jaGVja291dFNlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3Nob3AvY29tcG9uZW50cy9lcnJvckNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3Nob3AvY29tcG9uZW50cy9zaG9wcGluZ2NhcnRDb250cm9sbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9zaG9wL2NvbXBvbmVudHMvc2hvcHBpbmdjYXJ0U2VydmljZS5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2hvcC9jb21wb25lbnRzL3ZhbGlkYXRpb25TZXJ2aWNlLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9zaXRlL2FwcC5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL0dsb2JhbGlzYXRpb25TZXJ2aWNlLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9zaXRlL2NvbXBvbmVudHMvUmVnaXN0ZXJDb250cm9sbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9zaXRlL2NvbXBvbmVudHMvY2hvY29sYXRlRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL2Nvb2tpZUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NpdGUvY29tcG9uZW50cy9tYXBzSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL292ZXJsYXlNZW51SGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9jb21wb25lbnRzL3Byb2plY3RvckhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NpdGUvY29tcG9uZW50cy9zY3JvbGxUb0hhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NpdGUvY29tcG9uZW50cy95b3V0dWJlSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2l0ZS9nbG9iYWwvYnJvd3NlckhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NpdGUvZ2xvYmFsL2hlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NpdGUvZ2xvYmFsL3Njcm9sbEhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL3Nhc3Mva21zL3N0eWxlcy5zYXNzPzU1N2YiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL3Nhc3Mvc2l0ZS9zdHlsZS5zY3NzP2U4NmUiXSwibmFtZXMiOlsiQWRkcmVzcyIsIl9zdHJlZXQiLCJfaG91c2VfbnVtYmVyIiwiX3Bvc3RhbF9jb2RlIiwiX2NpdHkiLCJfcGhvbmUiLCJfY291bnRyeUlzbzMiLCJ0b0pTT04iLCJfdG9Kc29uIiwiYmluZCIsInZhbHVlIiwiQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlIiwiX3RvdGFsRXhWYXRBbmREaXNjb3VudHMiLCJfdG90YWxFeFZhdEFuZERpc2NvdW50c0Zvcm1hdHRlZCIsIl90b3RhbEV4VmF0IiwiX3RvdGFsRXhWYXRGb3JtYXR0ZWQiLCJfdmF0VG90YWwiLCJfdmF0VG90YWxGb3JtYXR0ZWQiLCJfc2hpcHBpbmdDb3N0cyIsIl9zaGlwcGluZ0Nvc3RzRm9ybWF0dGVkIiwiX3RvdGFsIiwiX3RvdGFsRm9ybWF0dGVkIiwiX3ZhdFBlcmNlbnRhZ2UiLCJfY291cG9uQ29kZXMiLCJqc29uIiwiaXMiLCJqc29uT2JqZWN0IiwiSlNPTiIsInBhcnNlIiwiaW5zdGFuY2UiLCJ0b3RhbEV4VmF0QW5kRGlzY291bnRzIiwidG90YWxFeFZhdEFuZERpc2NvdW50c0Zvcm1hdHRlZCIsInRvdGFsRXhWYXQiLCJ0b3RhbEV4VmF0Rm9ybWF0dGVkIiwidmF0VG90YWwiLCJ2YXRUb3RhbEZvcm1hdHRlZCIsInNoaXBwaW5nQ29zdHMiLCJzaGlwcGluZ0Nvc3RzRm9ybWF0dGVkIiwidG90YWwiLCJ0b3RhbEZvcm1hdHRlZCIsInZhdFBlcmNlbnRhZ2UiLCJjb3Vwb25Db2RlcyIsImxvZ0Vycm9ycyIsImUiLCJjb25zb2xlIiwiZXJyb3IiLCJoYXNPd25Qcm9wZXJ0eSIsIkFycmF5IiwiaXNBcnJheSIsIkNvdW50cnlMYW5ndWFnZXNSZXNwb25zZSIsIl9sYW5ndWFnZXMiLCJsYW5ndWFnZUNvdW50IiwibGFuZ3VhZ2VzIiwibGVuZ3RoIiwiaW5kZXgiLCJsYW5ndWFnZU9iamVjdCIsImxhbmd1YWdlIiwiTGFuZ3VhZ2UiLCJuYW1lIiwiZGlzcGxheU5hbWUiLCJuYXRpdmVOYW1lIiwidHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lIiwidGhyZWVMZXR0ZXJJc29MYW5ndWFnZU5hbWUiLCJwdXNoIiwibG9nIiwiRXJyb3JSZXNwb25zZSIsIl9tZXNzYWdlIiwiX2Vycm9ycyIsIm1lc3NhZ2UiLCJlcnJvcnMiLCJmaWVsZE5hbWUiLCJfbmFtZSIsIl9kaXNwbGF5TmFtZSIsIl9uYXRpdmVOYW1lIiwiX3R3b0xldHRlcklzb0xhbmd1YWdlTmFtZSIsIl90aHJlZUxldHRlcklzb0xhbmd1YWdlTmFtZSIsIlZhbGlkYXRpb25SZXNwb25zZSIsIl92YWxpZCIsInZhbGlkIiwiY3JlYXRlTmV3RXZlbnQiLCJldmVudE5hbWUiLCJldmVudCIsIkV2ZW50IiwiZG9jdW1lbnQiLCJjcmVhdGVFdmVudCIsImluaXRFdmVudCIsImRpc3BhdGNoRXZlbnRGb3JFbGVtZW50IiwiZWxlbWVudCIsImRpc3BhdGNoRXZlbnQiLCJmaXJlRXZlbnQiLCJldmVudFR5cGUiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJpc0Zpbml0ZSIsIk1hdGgiLCJmbG9vciIsImdsb2JhbCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwiZGVmaW5lIiwiZmluYWxseUNvbnN0cnVjdG9yIiwiY2FsbGJhY2siLCJjb25zdHJ1Y3RvciIsInRoZW4iLCJyZXNvbHZlIiwicmVhc29uIiwicmVqZWN0Iiwic2V0VGltZW91dEZ1bmMiLCJzZXRUaW1lb3V0Iiwibm9vcCIsImZuIiwidGhpc0FyZyIsImFwcGx5IiwiYXJndW1lbnRzIiwiUHJvbWlzZSIsIlR5cGVFcnJvciIsIl9zdGF0ZSIsIl9oYW5kbGVkIiwiX3ZhbHVlIiwidW5kZWZpbmVkIiwiX2RlZmVycmVkcyIsImRvUmVzb2x2ZSIsImhhbmRsZSIsInNlbGYiLCJkZWZlcnJlZCIsIl9pbW1lZGlhdGVGbiIsImNiIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwicHJvbWlzZSIsInJldCIsIm5ld1ZhbHVlIiwiZmluYWxlIiwiX3VuaGFuZGxlZFJlamVjdGlvbkZuIiwiaSIsImxlbiIsIkhhbmRsZXIiLCJkb25lIiwiZXgiLCJwcm90b3R5cGUiLCJwcm9tIiwiYWxsIiwiYXJyIiwiYXJncyIsInNsaWNlIiwiY2FsbCIsInJlbWFpbmluZyIsInJlcyIsInZhbCIsInJhY2UiLCJ2YWx1ZXMiLCJzZXRJbW1lZGlhdGUiLCJlcnIiLCJ3YXJuIiwiZ2xvYmFsTlMiLCJ3aW5kb3ciLCJFcnJvciIsIkNoZWNrb3V0Q29udHJvbGxlciIsImNoZWNrb3V0Rm9ybURpdkVsZW1lbnQiLCJzaG9wcGluZ2NhcnRTZXJ2aWNlIiwiY2hlY2tvdXRTZXJ2aWNlIiwidmFsaWRhdGlvblNlcnZpY2UiLCJnbG9iYWxpc2F0aW9uU2VydmljZSIsImVycm9yRm9ybUNvbnRyb2xsZXIiLCJ0YWdOYW1lIiwiX2NoZWNrb3V0Rm9ybSIsInNlbGVjdEFuZFZhbGlkYXRlRWxlbWVudCIsIl9hZGRDb3Vwb25CdXR0b24iLCJfY291cG9uSW5wdXQiLCJfY291cG9uQ29kZXNMaXN0IiwiX3N1Ym1pdEJ1dHRvbiIsIl90b3RhbEV4VmF0QW5kRGlzY291bnRzQ29udGFpbmVyIiwiX3RvdGFsRXhWYXRDb250YWluZXIiLCJfdmF0Q29udGFpbmVyIiwiX3ZhdFBlcmNlbnRhZ2VDb250YWluZXIiLCJfc2hpcHBpbmdDb3N0c0NvbnRhaW5lciIsIl90b3RhbENvbnRhaW5lciIsIl9ndWVzdExhbmd1YWdlU2VsZWN0V3JhcHBlciIsInF1ZXJ5U2VsZWN0b3IiLCJfY2hlY2tvdXRTZXJ2aWNlIiwiQ2hlY2tvdXRTZXJ2aWNlIiwiX2dsb2JhbGlzYXRpb25TZXJ2aWNlIiwiX3Nob3BwaW5nY2FydFNlcnZpY2UiLCJTaG9wcGluZ2NhcnRTZXJ2aWNlIiwiX3ZhbGlkYXRpb25TZXJ2aWNlIiwiVmFsaWRhdGlvblNlcnZpY2UiLCJfZXJyb3JGb3JtQ29udHJvbGxlciIsIkVycm9yRm9ybUNvbnRyb2xsZXIiLCJfZG9tUGFyc2VyIiwiRE9NUGFyc2VyIiwiX2hpZGRlbkNsYXNzIiwiX2Zvcm1TdWJtaXQiLCJfZm9ybUNoYW5nZWQiLCJfcmVtb3ZlQ291cG9uQ29kZUNsaWNrZWQiLCJfaGFuZGxlRXJyb3JSZXNwb25zZSIsIl9jcmVhdGVIdG1sRWxlbWVudEZyb21TdHJpbmciLCJjb250cm9sTGlzdGVuZXJzIiwiX2d1ZXN0Q291bnRyeUNoYW5nZWQiLCJzZWxlY3RvciIsInZhbGlkQ2FsbEJhY2siLCJlbmFibGVkIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmb3JFYWNoIiwiZGVsZXRlQnV0dG9uRWxlbWVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJwcmV2ZW50RGVmYXVsdCIsImN1cnJlbnRUYXJnZXQiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsIl92YWxpZGF0ZUZvcm0iLCJzdWJtaXQiLCJfYWRkQ291cG9uQ29kZSIsImNvdXBvbiIsInRhcmdldCIsImluY2x1ZGVzIiwiX3VwZGF0ZVNoaXBwaW5nQ29zdHMiLCJmb3JtRGF0YSIsIkZvcm1EYXRhIiwiYWRkcmVzcyIsInN0cmVldCIsImdldCIsImhvdXNlX251bWJlciIsInBvc3RhbF9jb2RlIiwiY2l0eSIsInBob25lIiwiY291bnRyeUlzbzMiLCJzZXRTaGlwcGluZ0FkZHJlc3MiLCJyZXNwb25zZSIsImdldENoZWNrb3V0SW5mb3JtYXRpb24iLCJjaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UiLCJfdXBkYXRlRm9ybVVzaW5nQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlIiwiaW5uZXJIVE1MIiwiY2hpbGRyZW4iLCJyZW1vdmVDaGlsZCIsImZpcnN0Q2hpbGQiLCJjb3Vwb25Db2RlIiwiY291cG9uQ29kZUxpc3RJdGVtIiwiYXBwZW5kQ2hpbGQiLCJ2YWxpZGF0ZUNoZWNrb3V0Rm9ybSIsImNsZWFyQWxsRXJyb3JzIiwiZXJyb3JSZXNwb25zZSIsImVudGVyZWRDb3Vwb24iLCJhZGRDb3Vwb24iLCJyZW1vdmVDb3Vwb24iLCJjb2RlIiwicGFyZW50RWxlbWVudCIsImRhdGFzZXQiLCJfcmVtb3ZlQ291cG9uQ29kZSIsInNlbGVjdCIsImhhcyIsImdldExhbmd1YWdlc0ZvckNvdW50cnlXaXRoSXNvMyIsImNvdW50cnlMYW5ndWFnZXNSZXNwb25zZSIsIl9jbGVhckxhbmd1YWdlU2VsZWN0Iiwib3B0aW9uRWxlbWVudCIsImFkZCIsInJlbW92ZSIsImZpZWxkIiwiam9pbiIsInNldEZpZWxkRXJyb3IiLCJmcm9tIiwicGFyc2VGcm9tU3RyaW5nIiwiYm9keSIsIl9iYXNlUm91dGUiLCJBamF4IiwicG9zdCIsInhociIsImZyb21Kc29uU3RyaW5nIiwiaXNFcnJvclJlc3BvbnNlIiwiaXNDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UiLCJFcnJvckNvbnRyb2xsZXIiLCJfY2xhc3NUb0hpZGUiLCJfZXJyb3JFbGVtZW50SWRTdWZmaXgiLCJmaWVsZFNlbGVjdG9yIiwiZXJyb3JFbGVtZW50IiwiaW5uZXJUZXh0IiwiU2hvcHBpbmdjYXJ0Q29udHJvbGxlciIsIndyYXBwZXIiLCJfd3JhcHBlciIsIl9hZGRUb1Nob3BwaW5nY2FydEJ1dHRvbnMiLCJfcmVtb3ZlRnJvbVNob3BwaW5nY2FydEJ1dHRvbnMiLCJfY2hhbmdlUXVhbnRpdHlTaG9wcGluZ2NhcnRJdGVtQnV0dG9ucyIsImFkZFByb2R1Y3RCdXR0b25DbGlja2VkIiwicmVtb3ZlUHJvZHVjdEJ1dHRvbkNsaWNrZWQiLCJjaGFuZ2VRdWFudGl0eUJ1dHRvbkNsaWNrZWQiLCJlbmFibGUiLCJhZGRUb1Nob3BwaW5nY2FydEJ1dHRvbnNMZW5ndGgiLCJyZW1vdmVGcm9tU2hvcHBpbmdjYXJ0QnV0dG9uc0xlbmd0aCIsImNoYW5nZVF1YW50aXR5U2hvcHBpbmdjYXJ0SXRlbUJ1dHRvbnNMZW5ndGgiLCJfYWRkUHJvZHVjdFRvU2hvcHBpbmdjYXJ0IiwicHJvZHVjdElkIiwicHJvZHVjdFR5cGUiLCJfcmVtb3ZlSXRlbUZyb21TaG9wcGluZ2NhcnQiLCJfc2V0SXRlbVF1YW50aXR5SW5TaG9wcGluZ2NhcnQiLCJzaG9wcGluZ2NhcnRJdGVtSWQiLCJxdWFudGl0eSIsImNvdW50IiwiY291bnRlciIsImlkIiwidHlwZSIsInByb2R1Y3RhYmxlSWQiLCJpdGVtVHlwZSIsImxvY2F0aW9uIiwiaXRlbUlkIiwiZGF0YSIsInBvc3RGb3JtRGF0YSIsInJlcXVpcmUiLCJHbG9iYWxpc2F0aW9uU2VydmljZSIsInNob3BwaW5nQ2FydERpdkVsZW1lbnQiLCJyZWdpc3RlckZvcm0iLCJnZXRFbGVtZW50QnlJZCIsIlJlZ2lzdGVyQ29udHJvbGxlciIsImlzQ291bnRyeUxhbmd1YWdlc1Jlc3BvbnNlIiwiX2NvdW50cnlTZWxlY3QiLCJfbGFuZ3VhZ2VTZWxlY3QiLCJfbGFuZ3VhZ2VTZWxlY3RXcmFwcGVyIiwiX2NvdW50cnlDaGFuZ2VkIiwiQ2hvY29sYXRlRmFjdG9yeSIsImJhbm5lZFZpc2l0b3IiLCJlbnRlciIsImNob2NvbGF0ZUZhY3RvcmllcyIsImlzc2V0IiwiYW1vdW50T2ZDaG9jb2xhdGVGYWN0b3JpZXMiLCJDaG9jb2xhdGVCYXIiLCJfZmxhc2hUaWNrZXQiLCJjaG9jb2xhdGVCYXIiLCJnb2xkZW5UaWNrZXQiLCJlbmpveVRoZVRvdXIiLCJjaG9jb2xhdGVGYWN0b3J5IiwidG91ckdyb3VwIiwib29tcGFMb29tcGFzIiwiYW1vdW50T2ZPb21wYUxvb21wYXMiLCJ0b3VyR3JvdXBTaXplIiwidmlzaXRvciIsInZpc2l0b3JOYW1lIiwiZ2V0QXR0cmlidXRlIiwiX2lzVmlzaXRvckJhbm5lZCIsIl9nZXRBcnJhbmdlbWVudCIsIl9maW5pc2hUb3VyIiwiaW5kZXhPZiIsInZpc2l0b3JUeXBlIiwibm9kZU5hbWUiLCJncm91cCIsIl9hZGRXaWxsaWVXb25rYSIsImdhdGUiLCJIdHRwUmVxdWVzdCIsInN0YXR1cyIsIl90aGFua3NGb3JWaXNpdGluZyIsInJlZGlyZWN0VXJsIiwiX2dpdmVGZWVkYmFja1RvTWVtYmVycyIsIl91bmtub3duR2FwSW5GYWN0b3J5IiwiX3dpbGxpZSIsImZlZWRiYWNrQXJlYSIsIl9jbGVhclByZXZpb3VzTWFya2VkSmFja2V0cyIsIk9iamVjdCIsImtleXMiLCJqYWNrZXQiLCJ2aXNpdG9yRmVlZGJhY2tBcmVhIiwidmlzaXRvck5vZGUiLCJfZ3JhYlZpc2l0b3JKYWNrZXQiLCJ2aXNpdG9yRmVlZGJhY2siLCJ2aXNpdG9yRmVlZGJhY2tBbW91bnQiLCJ2aXNpdG9yRmVlZGJhY2tMaW5lIiwiY3VycmVudEZlZWRiYWNrQXJlYSIsImNhcGl0YWxpemVGaXJzdExldHRlciIsIm1hcmtlZEphY2tldHMiLCJtYXJrZWRKYWNrZXRzQW1vdW50IiwiY3VycmVudExheWVyIiwic2FmZXR5QnJlYWsiLCJwYXJlbnROb2RlIiwibmV4dFN0b3AiLCJDb29raWVIYW5kbGVyIiwiY29va2llQmFyIiwiY29va2llT3ZlcmxheSIsImNvb2tpZU1lc3NhZ2UiLCJjb29raWVTd2l0Y2giLCJjb29raWVGYWRlT3V0QW5pbWF0aW9uRHVyYXRpb24iLCJhY2NlcHRUcmFja2luZyIsImluaXQiLCJpbml0Q29va2llQmFyIiwiaW5pdENvb2tpZU92ZXJsYXkiLCJjaGVja0ZvckNvb2tpZVNldHRpbmdzIiwiaW5pdENvb2tpZVN3aXRjaCIsImNsb3NlQnV0dG9uIiwiY2xvc2VDb29raWVNZXNzYWdlIiwib3BlbkNvb2tpZVNldHRpbmdzQnV0dG9uIiwib3BlbkNvb2tpZVNldHRpbmdzIiwidG9nZ2xlVHJhY2tpbmdJbnB1dCIsImNoZWNrZWQiLCJ0b2dnbGVUcmFja2luZ1NldHRpbmciLCJhY2NlcHRCdXR0b24iLCJzZXRDb29raWVTZXR0aW5ncyIsInNhdmVCdXR0b24iLCJDb29raWUiLCJzZXQiLCJlcmFzZSIsInJlbG9hZCIsIk1hcHNIYW5kbGVyIiwibWFwcyIsImtleSIsIm1hcCIsImhhc0F0dHJpYnV0ZSIsImxhdCIsInBhcnNlRmxvYXQiLCJsbmciLCJub2RlIiwic3R5bGVzIiwic2V0Q3VzdG9tU3R5bGluZyIsImdvb2dsZSIsImdldFNjcmlwdCIsImRyYXdNYXBzIiwiZ29vZ2xlTWFwIiwiTWFwIiwiem9vbSIsImNlbnRlciIsImRpc2FibGVEZWZhdWx0VUkiLCJtYXJrZXIiLCJNYXJrZXIiLCJwb3NpdGlvbiIsImJvZHlTY3JvbGxMb2NrIiwiT3ZlcmxheU1lbnVIYW5kbGVyIiwib3ZlcmxheU1lbnVUcmlnZ2VyTGlzdCIsIm92ZXJsYXlNZW51VHJpZ2dlckxpc3RDb3VudCIsIm92ZXJsYXlNZW51VHJpZ2dlciIsImluaXRPdmVybGF5TWVudSIsInRvZ2dsZU92ZXJsYXlNZW51Iiwib3ZlcmxheU1lbnVOYXYiLCJlbmFibGVCb2R5U2Nyb2xsIiwiZWxlbSIsInRhYkluZGV4IiwiZGlzYWJsZUJvZHlTY3JvbGwiLCJ0b2dnbGUiLCJoaWRkZW4iLCJwcm9qZWN0b3JzIiwicHJvamVjdG9yQ29udGFpbmVycyIsInByb2plY3RvckNvbnRhaW5lcnNMZW5ndGgiLCJwcm9qZWN0b3IiLCJwcm9qZWN0b3JJZCIsInByb2plY3RvclNldHRpbmciLCJQcm9qZWN0b3JTZXR0aW5nIiwic2xpZGVySWQiLCJzbGlkZVF1ZXJ5IiwibmF2aWdhdGlvbkJ1dHRvbnMiLCJkb3RzIiwiYXV0b1NsaWRlIiwic2xpZGVySW50ZXJ2YWwiLCJQcm9qZWN0b3IiLCJwcmVwYXJlUGFyYW1ldGVycyIsInNldHRpbmdzT2JqZWN0IiwiZGVmaW5lZFByZXZpb3VzTmV4dCIsImNhcHRpb25zIiwic2V0UHJvamVjdG9ySWQiLCJzdHJpbmciLCJzZXREZWZpbmVkUHJldmlvdXNOZXh0IiwiYm9vbGVhbiIsInNldEF1dG9TbGlkZSIsInNldFNsaWRlckludGVydmFsIiwiaW50ZWdlciIsInNldFNsaWRlUXVlcnkiLCJzZXROYXZpZ2F0aW9uQnV0dG9ucyIsInNldERvdHMiLCJzZXRDYXB0aW9ucyIsImdldFByb2plY3RvcklkIiwiZ2V0RGVmaW5lZFByZXZpb3VzTmV4dCIsImdldEF1dG9TbGlkZSIsImdldFNsaWRlckludGVydmFsIiwiZ2V0U2xpZGVRdWVyeSIsImdldE5hdmlnYXRpb25CdXR0b25zIiwiZ2V0RG90cyIsImdldENhcHRpb25zIiwiZmlsbCIsInNldHRpbmdzT2JqZWN0S2V5cyIsInNldHRpbmdzT2JqZWN0TGVuZ3RoIiwic2V0dGluZ3MiLCJzbGlkZXJPYmplY3QiLCJhY3RpdmVTbGlkZUlkIiwicHJldmlvdXNTbGlkZUlkIiwibmV4dFNsaWRlSWQiLCJhdmFpbGFibGVTbGlkZXMiLCJzbGlkZXMiLCJhdXRvU2xpZGVJbnRlcnZhbCIsInNldFByZXZpb3VzQW5kTmV4dFNsaWRlIiwic2V0U2xpZGUiLCJzd2lwZUdlc3R1cmVzIiwiSGFtbWVyIiwib24iLCJyZXNldEF1dG9TbGlkZSIsIm5leHRTbGlkZSIsInByZXZpb3VzU2xpZGUiLCJuYXZpZ2F0aW9uQnV0dG9uc0xlbmd0aCIsIm5hdmlnYXRpb25CdXR0b24iLCJjbGlja05hdmlnYXRpb25CdXR0b24iLCJkb3RzTGVuZ3RoIiwiZG90IiwiY2xpY2tEb3QiLCJjbGVhckludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJzbGlkZXNMZW5ndGgiLCJzbGlkZSIsInNsaWRlT3JkZXIiLCJwYXJzZUludCIsInNldEFjdGl2ZURvdCIsInNldEFjdGl2ZUNhcHRpb24iLCJuYXZCdXR0b24iLCJuZXh0IiwicHJldmlvdXMiLCJzZXRBdHRyaWJ1dGUiLCJjbGlja2VkRG90IiwiZG90T3JkZXIiLCJjYXB0aW9uc0xlbmd0aCIsImNhcHRpb24iLCJjYXB0aW9uT3JkZXIiLCJTY3JvbGxUb0hhbmRsZXIiLCJvZmZzZXQiLCJkdXJhdGlvbiIsInN0YXJ0IiwiY2hhbmdlIiwiY3VycmVudFRpbWUiLCJhbGxvd0FuaW1hdGlvbiIsInNjcm9sbFRvQW5pbWF0aW9uIiwiZWFzaW5nIiwiYW5jaG9yTGlua3MiLCJhbmNob3JMaW5rc0Ftb3VudCIsImFuY2hvckxpbmsiLCJwcmVwYXJlU2Nyb2xsVG8iLCJlbGVtZW50SWQiLCJzdWJzdHIiLCJzY3JvbGxUb0VsZW1lbnQiLCJzY3JvbGxUb0VsZW1lbnRQb3NpdGlvbiIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImRvY3VtZW50RWxlbWVudCIsIm1heCIsInNjcm9sbFRvcCIsInBhZ2VZT2Zmc2V0IiwidG9wIiwic3RhcnRUaW1lIiwicGVyZm9ybWFuY2UiLCJub3ciLCJEYXRlIiwiZ2V0VGltZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImFuaW1hdGVTY3JvbGwiLCJhYm9ydFNjcm9sbEFuaW1hdGlvbiIsInRpbWVzdGFtcCIsInByb2dyZXNzIiwibWluIiwiRWFzaW5nRnVuY3Rpb25zIiwibmV3U2Nyb2xsVG9wIiwiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJZb3V0dWJlSGFuZGxlciIsInlvdXR1YmVDbGFzcyIsInBsYXllcnMiLCJ5b3V0dWJlUGxheWVycyIsInlvdXR1YmVQbGF5ZXJzQW1vdW50IiwieW91dHViZVBsYXllciIsInlvdXR1YmVQbGF5ZXJJZCIsInlvdXR1YmVFbGVtZW50IiwibGluayIsImF1dG9QbGF5IiwiaW5pdFlvdXR1YmUiLCJZVCIsIlBsYXllciIsIm9uWW91VHViZVBsYXllckFQSVJlYWR5IiwibG9hZFBsYXllcnMiLCJwbGF5ZXIiLCJoZWlnaHQiLCJ3aWR0aCIsInZpZGVvSWQiLCJob3N0IiwicGxheWVyVmFycyIsIm1vZGVzdGJyYW5kaW5nIiwicmVsIiwiZGlzYWJsZWtiIiwiYXV0b3BsYXkiLCJldmVudHMiLCJvblN0YXRlQ2hhbmdlIiwib25SZWFkeSIsInBsYXllckNvbnRhaW5lcklkIiwiZ2V0SWZyYW1lIiwidmlkZW9TdGF0ZSIsIlBsYXllclN0YXRlIiwiRU5ERUQiLCJwbGF5VmlkZW8iLCJCcm93c2VySGFuZGxlciIsInVzZXJBZ2VudCIsImJyb3dzZXJJbmZvIiwibmF2aWdhdG9yIiwiZ2V0QnJvd3NlckluZm8iLCJoYW5kbGVJRSIsImhhbmRsZVNhZmFyaSIsIm1zaWUiLCJpZWx0MTEiLCJpZTExIiwibWF0Y2giLCJ2ZXJzaW9uIiwic3Vic3RyaW5nIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJ1YSIsInRlbSIsIk0iLCJ0ZXN0IiwiZXhlYyIsImFwcE5hbWUiLCJhcHBWZXJzaW9uIiwic3BsaWNlIiwib2JqIiwibGluZWFyIiwidCIsImVhc2VJblF1YWQiLCJlYXNlT3V0UXVhZCIsImVhc2VJbk91dFF1YWQiLCJlYXNlSW5DdWJpYyIsImVhc2VPdXRDdWJpYyIsImVhc2VJbk91dEN1YmljIiwiZWFzZUluUXVhcnQiLCJlYXNlT3V0UXVhcnQiLCJlYXNlSW5PdXRRdWFydCIsImVhc2VJblF1aW50IiwiZWFzZU91dFF1aW50IiwiZWFzZUluT3V0UXVpbnQiLCJzb3VyY2UiLCJzY3JpcHQiLCJjcmVhdGVFbGVtZW50IiwiYXN5bmMiLCJzY3JpcHRzIiwicHJpb3IiLCJvbmxvYWQiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJfIiwiaXNBYm9ydCIsInJlYWR5U3RhdGUiLCJzcmMiLCJpbnNlcnRCZWZvcmUiLCJkZWJvdW5jZSIsImZ1bmMiLCJ3YWl0IiwiaW1tZWRpYXRlIiwidGltZW91dCIsImNvbnRleHQiLCJsYXRlciIsImNhbGxOb3ciLCJjbGVhclRpbWVvdXQiLCJkYXlzIiwiZG9tYWluIiwiZG9tYWluUGFydHMiLCJkYXRlIiwiZXhwaXJlcyIsInNldFRpbWUiLCJ0b0dNVFN0cmluZyIsInNwbGl0IiwiY29va2llIiwic2hpZnQiLCJuYW1lRVEiLCJjYSIsImMiLCJjaGFyQXQiLCJudW1iZXJfZm9ybWF0IiwibnVtYmVyIiwiZGVjaW1hbHMiLCJkZWNfcG9pbnQiLCJ0aG91c2FuZHNfc2VwIiwicmVwbGFjZSIsIm4iLCJwcmVjIiwiYWJzIiwic2VwIiwiZGVjIiwicyIsInRvRml4ZWRGaXgiLCJrIiwicG93Iiwicm91bmQiLCJFbGVtZW50IiwiY2xvc2VzdCIsIm1hdGNoZXMiLCJtc01hdGNoZXNTZWxlY3RvciIsIndlYmtpdE1hdGNoZXNTZWxlY3RvciIsImVsIiwiYW5jZXN0b3IiLCJ1cmwiLCJYTUxIdHRwUmVxdWVzdCIsInRva2VuIiwiY29udGVudCIsIm9wZW4iLCJzZXRSZXF1ZXN0SGVhZGVyIiwic2VuZCIsInN0cmluZ2lmeSIsInRvVXBwZXJDYXNlIiwic25ha2VUb0NhbWVsIiwibSIsImluZGV4SW5QYXJlbnQiLCJjaGlsZE5vZGVzIiwibnVtIiwibm9kZVR5cGUiLCJjb3B5VG9DbGlwYm9hcmQiLCJlZGl0YWJsZSIsImNvbnRlbnRFZGl0YWJsZSIsInJlYWRPbmx5IiwicmFuZ2UiLCJjcmVhdGVSYW5nZSIsInNlbGVjdE5vZGVDb250ZW50cyIsInNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsInJlbW92ZUFsbFJhbmdlcyIsImFkZFJhbmdlIiwic2V0U2VsZWN0aW9uUmFuZ2UiLCJleGVjQ29tbWFuZCIsImJvZHlPZmZzZXQiLCJyZWN0Iiwic2Nyb2xsTGVmdCIsInBhZ2VYT2Zmc2V0IiwibGVmdCIsIlNjcm9sbEhhbmRsZXIiLCJ0aW1lIiwid2FpdFRocm90dGxlIiwid2FpdERlYm91bmNlIiwibGFzdFNjcm9sbFRvcFBvc2l0aW9uIiwic2Nyb2xsRGlyZWN0aW9uRG93biIsInNjcm9sbERpcmVjdGlvblVwIiwidHJpZ2dlck9uSW5pdCIsInRyaWdnZXJUaHJvdHRsZSIsInRyaWdnZXJTbW9vdGgiLCJ0cmlnZ2VyRGVib3VuY2UiLCJ0cmlnZ2VyRWxlbWVudEluVmlld3BvcnRBbmltYXRpb24iLCJkZXRlY3RTY3JvbGxEaXJlY3Rpb24iLCJ0b2dnbGVTdGlja3lIZWFkZXIiLCJkZXRlY3RJZkVsZW1lbnRJc1BhcnRseUluVmlld3BvcnQiLCJ3aW5kb3dIZWlnaHQiLCJpbm5lckhlaWdodCIsImNsaWVudEhlaWdodCIsIndpbmRvd1dpZHRoIiwiaW5uZXJXaWR0aCIsImNsaWVudFdpZHRoIiwidmVydGljYWxJblZpZXciLCJob3Jpem9udGFsSW5WaWV3IiwiZGV0ZWN0SWZFbGVtZW50SXNGdWxseUluVmlld3BvcnQiLCJib3R0b20iLCJzY3JvbGxUb3BQb3NpdGlvbiIsImVsZW1lbnRzIiwiZWxlbWVudHNMZW5ndGgiLCJzdGlja3lIZWFkZXIiLCJ2aXNpYmxlU3RpY2t5SGVhZGVyQ2xhc3MiLCJzdWJuYXZMaXN0Iiwic3ViTmF2SXNWaXNpYmxlIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsInZpc2liaWxpdHkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLGlCQUFpQixtQkFBTyxDQUFDLDBFQUFxQjs7Ozs7Ozs7Ozs7O0FDQTlDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsc0JBQXNCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFVBQVU7Ozs7Ozs7Ozs7OztBQ3ZMdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkLEtBQUs7QUFDTCxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQ0FBb0MsY0FBYztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUMsa0JBQWtCO0FBQ25EO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpQkFBaUI7QUFDekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FB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QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7Ozs7Ozs7Ozs7Ozs7QUN6TEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBLG1CQUFPLENBQUMsaUVBQWM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDOURBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDOztBQUU1Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkJBOzs7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Q0o7QUFwSmlCLENBQXRCO0FBd0pBN0IsYUFBYSxDQUFDOVUsSUFBZCxHOzs7Ozs7Ozs7OztBQzdKQSx5Qzs7Ozs7Ozs7Ozs7QUNBQSx5QyIsImZpbGUiOiIvanMvc2l0ZS9hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWdlbmVyYXRvci1ydW50aW1lXCIpO1xuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxudmFyIHJ1bnRpbWUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBleHBvcnRzLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBJdGVyYXRvclByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZVt0b1N0cmluZ1RhZ1N5bWJvbF0gPVxuICAgIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIHByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIGV4cG9ydHMubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgICAgaWYgKCEodG9TdHJpbmdUYWdTeW1ib2wgaW4gZ2VuRnVuKSkge1xuICAgICAgICBnZW5GdW5bdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgIC8vIElmIGEgcmVqZWN0ZWQgUHJvbWlzZSB3YXMgeWllbGRlZCwgdGhyb3cgdGhlIHJlamVjdGlvbiBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLlxuICAgICAgICAgIHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBBc3luY0l0ZXJhdG9yLnByb3RvdHlwZVthc3luY0l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpXG4gICAgKTtcblxuICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAvLyBOb3RlOiBbXCJyZXR1cm5cIl0gbXVzdCBiZSB1c2VkIGZvciBFUzMgcGFyc2luZyBjb21wYXRpYmlsaXR5LlxuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3JbXCJyZXR1cm5cIl0pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvclwiO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBleHBvcnRzLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGVcbiAgLy8gb3Igbm90LCByZXR1cm4gdGhlIHJ1bnRpbWUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGRlY2xhcmUgdGhlIHZhcmlhYmxlXG4gIC8vIHJlZ2VuZXJhdG9yUnVudGltZSBpbiB0aGUgb3V0ZXIgc2NvcGUsIHdoaWNoIGFsbG93cyB0aGlzIG1vZHVsZSB0byBiZVxuICAvLyBpbmplY3RlZCBlYXNpbHkgYnkgYGJpbi9yZWdlbmVyYXRvciAtLWluY2x1ZGUtcnVudGltZSBzY3JpcHQuanNgLlxuICByZXR1cm4gZXhwb3J0cztcblxufShcbiAgLy8gSWYgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlLCB1c2UgbW9kdWxlLmV4cG9ydHNcbiAgLy8gYXMgdGhlIHJlZ2VuZXJhdG9yUnVudGltZSBuYW1lc3BhY2UuIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgZW1wdHlcbiAgLy8gb2JqZWN0LiBFaXRoZXIgd2F5LCB0aGUgcmVzdWx0aW5nIG9iamVjdCB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZVxuICAvLyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIHZhcmlhYmxlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLlxuICB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiID8gbW9kdWxlLmV4cG9ydHMgOiB7fVxuKSk7XG5cbnRyeSB7XG4gIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7XG59IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkge1xuICAvLyBUaGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUsIHNvIHRoZSBhYm92ZVxuICAvLyBhc3NpZ25tZW50IHNob3VsZCBhbHdheXMgd29yayB1bmxlc3Mgc29tZXRoaW5nIGlzIG1pc2NvbmZpZ3VyZWQuIEp1c3RcbiAgLy8gaW4gY2FzZSBydW50aW1lLmpzIGFjY2lkZW50YWxseSBydW5zIGluIHN0cmljdCBtb2RlLCB3ZSBjYW4gZXNjYXBlXG4gIC8vIHN0cmljdCBtb2RlIHVzaW5nIGEgZ2xvYmFsIEZ1bmN0aW9uIGNhbGwuIFRoaXMgY291bGQgY29uY2VpdmFibHkgZmFpbFxuICAvLyBpZiBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGZvcmJpZHMgdXNpbmcgRnVuY3Rpb24sIGJ1dCBpbiB0aGF0IGNhc2VcbiAgLy8gdGhlIHByb3BlciBzb2x1dGlvbiBpcyB0byBmaXggdGhlIGFjY2lkZW50YWwgc3RyaWN0IG1vZGUgcHJvYmxlbS4gSWZcbiAgLy8geW91J3ZlIG1pc2NvbmZpZ3VyZWQgeW91ciBidW5kbGVyIHRvIGZvcmNlIHN0cmljdCBtb2RlIGFuZCBhcHBsaWVkIGFcbiAgLy8gQ1NQIHRvIGZvcmJpZCBGdW5jdGlvbiwgYW5kIHlvdSdyZSBub3Qgd2lsbGluZyB0byBmaXggZWl0aGVyIG9mIHRob3NlXG4gIC8vIHByb2JsZW1zLCBwbGVhc2UgZGV0YWlsIHlvdXIgdW5pcXVlIHByZWRpY2FtZW50IGluIGEgR2l0SHViIGlzc3VlLlxuICBGdW5jdGlvbihcInJcIiwgXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKHJ1bnRpbWUpO1xufVxuIiwiKGZ1bmN0aW9uIChnbG9iYWwsIHVuZGVmaW5lZCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgaWYgKGdsb2JhbC5zZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBuZXh0SGFuZGxlID0gMTsgLy8gU3BlYyBzYXlzIGdyZWF0ZXIgdGhhbiB6ZXJvXG4gICAgdmFyIHRhc2tzQnlIYW5kbGUgPSB7fTtcbiAgICB2YXIgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgdmFyIGRvYyA9IGdsb2JhbC5kb2N1bWVudDtcbiAgICB2YXIgcmVnaXN0ZXJJbW1lZGlhdGU7XG5cbiAgICBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoY2FsbGJhY2spIHtcbiAgICAgIC8vIENhbGxiYWNrIGNhbiBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhIHN0cmluZ1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNhbGxiYWNrID0gbmV3IEZ1bmN0aW9uKFwiXCIgKyBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgICAvLyBDb3B5IGZ1bmN0aW9uIGFyZ3VtZW50c1xuICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMV07XG4gICAgICB9XG4gICAgICAvLyBTdG9yZSBhbmQgcmVnaXN0ZXIgdGhlIHRhc2tcbiAgICAgIHZhciB0YXNrID0geyBjYWxsYmFjazogY2FsbGJhY2ssIGFyZ3M6IGFyZ3MgfTtcbiAgICAgIHRhc2tzQnlIYW5kbGVbbmV4dEhhbmRsZV0gPSB0YXNrO1xuICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUobmV4dEhhbmRsZSk7XG4gICAgICByZXR1cm4gbmV4dEhhbmRsZSsrO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGhhbmRsZSkge1xuICAgICAgICBkZWxldGUgdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bih0YXNrKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHRhc2suY2FsbGJhY2s7XG4gICAgICAgIHZhciBhcmdzID0gdGFzay5hcmdzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bklmUHJlc2VudChoYW5kbGUpIHtcbiAgICAgICAgLy8gRnJvbSB0aGUgc3BlYzogXCJXYWl0IHVudGlsIGFueSBpbnZvY2F0aW9ucyBvZiB0aGlzIGFsZ29yaXRobSBzdGFydGVkIGJlZm9yZSB0aGlzIG9uZSBoYXZlIGNvbXBsZXRlZC5cIlxuICAgICAgICAvLyBTbyBpZiB3ZSdyZSBjdXJyZW50bHkgcnVubmluZyBhIHRhc2ssIHdlJ2xsIG5lZWQgdG8gZGVsYXkgdGhpcyBpbnZvY2F0aW9uLlxuICAgICAgICBpZiAoY3VycmVudGx5UnVubmluZ0FUYXNrKSB7XG4gICAgICAgICAgICAvLyBEZWxheSBieSBkb2luZyBhIHNldFRpbWVvdXQuIHNldEltbWVkaWF0ZSB3YXMgdHJpZWQgaW5zdGVhZCwgYnV0IGluIEZpcmVmb3ggNyBpdCBnZW5lcmF0ZWQgYVxuICAgICAgICAgICAgLy8gXCJ0b28gbXVjaCByZWN1cnNpb25cIiBlcnJvci5cbiAgICAgICAgICAgIHNldFRpbWVvdXQocnVuSWZQcmVzZW50LCAwLCBoYW5kbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHRhc2sgPSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgICAgICAgICBpZiAodGFzaykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IHRydWU7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcnVuKHRhc2spO1xuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW1tZWRpYXRlKGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7IHJ1bklmUHJlc2VudChoYW5kbGUpOyB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYW5Vc2VQb3N0TWVzc2FnZSgpIHtcbiAgICAgICAgLy8gVGhlIHRlc3QgYWdhaW5zdCBgaW1wb3J0U2NyaXB0c2AgcHJldmVudHMgdGhpcyBpbXBsZW1lbnRhdGlvbiBmcm9tIGJlaW5nIGluc3RhbGxlZCBpbnNpZGUgYSB3ZWIgd29ya2VyLFxuICAgICAgICAvLyB3aGVyZSBgZ2xvYmFsLnBvc3RNZXNzYWdlYCBtZWFucyBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQgYW5kIGNhbid0IGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS5cbiAgICAgICAgaWYgKGdsb2JhbC5wb3N0TWVzc2FnZSAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBvbGRPbk1lc3NhZ2UgPSBnbG9iYWwub25tZXNzYWdlO1xuICAgICAgICAgICAgZ2xvYmFsLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSBmYWxzZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoXCJcIiwgXCIqXCIpO1xuICAgICAgICAgICAgZ2xvYmFsLm9ubWVzc2FnZSA9IG9sZE9uTWVzc2FnZTtcbiAgICAgICAgICAgIHJldHVybiBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIC8vIEluc3RhbGxzIGFuIGV2ZW50IGhhbmRsZXIgb24gYGdsb2JhbGAgZm9yIHRoZSBgbWVzc2FnZWAgZXZlbnQ6IHNlZVxuICAgICAgICAvLyAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0RPTS93aW5kb3cucG9zdE1lc3NhZ2VcbiAgICAgICAgLy8gKiBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS9jb21tcy5odG1sI2Nyb3NzRG9jdW1lbnRNZXNzYWdlc1xuXG4gICAgICAgIHZhciBtZXNzYWdlUHJlZml4ID0gXCJzZXRJbW1lZGlhdGUkXCIgKyBNYXRoLnJhbmRvbSgpICsgXCIkXCI7XG4gICAgICAgIHZhciBvbkdsb2JhbE1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gZ2xvYmFsICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGV2ZW50LmRhdGEgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBldmVudC5kYXRhLmluZGV4T2YobWVzc2FnZVByZWZpeCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoK2V2ZW50LmRhdGEuc2xpY2UobWVzc2FnZVByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBvbkdsb2JhbE1lc3NhZ2UsIGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsb2JhbC5hdHRhY2hFdmVudChcIm9ubWVzc2FnZVwiLCBvbkdsb2JhbE1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShtZXNzYWdlUHJlZml4ICsgaGFuZGxlLCBcIipcIik7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBldmVudC5kYXRhO1xuICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUmVhZHlTdGF0ZUNoYW5nZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgaHRtbCA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSA8c2NyaXB0PiBlbGVtZW50OyBpdHMgcmVhZHlzdGF0ZWNoYW5nZSBldmVudCB3aWxsIGJlIGZpcmVkIGFzeW5jaHJvbm91c2x5IG9uY2UgaXQgaXMgaW5zZXJ0ZWRcbiAgICAgICAgICAgIC8vIGludG8gdGhlIGRvY3VtZW50LiBEbyBzbywgdGh1cyBxdWV1aW5nIHVwIHRoZSB0YXNrLiBSZW1lbWJlciB0byBjbGVhbiB1cCBvbmNlIGl0J3MgYmVlbiBjYWxsZWQuXG4gICAgICAgICAgICB2YXIgc2NyaXB0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICBzY3JpcHQgPSBudWxsO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSWYgc3VwcG9ydGVkLCB3ZSBzaG91bGQgYXR0YWNoIHRvIHRoZSBwcm90b3R5cGUgb2YgZ2xvYmFsLCBzaW5jZSB0aGF0IGlzIHdoZXJlIHNldFRpbWVvdXQgZXQgYWwuIGxpdmUuXG4gICAgdmFyIGF0dGFjaFRvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihnbG9iYWwpO1xuICAgIGF0dGFjaFRvID0gYXR0YWNoVG8gJiYgYXR0YWNoVG8uc2V0VGltZW91dCA/IGF0dGFjaFRvIDogZ2xvYmFsO1xuXG4gICAgLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBlLmcuIGJyb3dzZXJpZnkgZW52aXJvbm1lbnRzLlxuICAgIGlmICh7fS50b1N0cmluZy5jYWxsKGdsb2JhbC5wcm9jZXNzKSA9PT0gXCJbb2JqZWN0IHByb2Nlc3NdXCIpIHtcbiAgICAgICAgLy8gRm9yIE5vZGUuanMgYmVmb3JlIDAuOVxuICAgICAgICBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChjYW5Vc2VQb3N0TWVzc2FnZSgpKSB7XG4gICAgICAgIC8vIEZvciBub24tSUUxMCBtb2Rlcm4gYnJvd3NlcnNcbiAgICAgICAgaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZ2xvYmFsLk1lc3NhZ2VDaGFubmVsKSB7XG4gICAgICAgIC8vIEZvciB3ZWIgd29ya2Vycywgd2hlcmUgc3VwcG9ydGVkXG4gICAgICAgIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGRvYyAmJiBcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiIGluIGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpKSB7XG4gICAgICAgIC8vIEZvciBJRSA24oCTOFxuICAgICAgICBpbnN0YWxsUmVhZHlTdGF0ZUNoYW5nZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3Igb2xkZXIgYnJvd3NlcnNcbiAgICAgICAgaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpO1xuICAgIH1cblxuICAgIGF0dGFjaFRvLnNldEltbWVkaWF0ZSA9IHNldEltbWVkaWF0ZTtcbiAgICBhdHRhY2hUby5jbGVhckltbWVkaWF0ZSA9IGNsZWFySW1tZWRpYXRlO1xufSh0eXBlb2Ygc2VsZiA9PT0gXCJ1bmRlZmluZWRcIiA/IHR5cGVvZiBnbG9iYWwgPT09IFwidW5kZWZpbmVkXCIgPyB0aGlzIDogZ2xvYmFsIDogc2VsZikpO1xuIiwidmFyIHNjb3BlID0gKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsKSB8fFxuICAgICAgICAgICAgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYpIHx8XG4gICAgICAgICAgICB3aW5kb3c7XG52YXIgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7XG5cbi8vIERPTSBBUElzLCBmb3IgY29tcGxldGVuZXNzXG5cbmV4cG9ydHMuc2V0VGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRUaW1lb3V0LCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJUaW1lb3V0KTtcbn07XG5leHBvcnRzLnNldEludGVydmFsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldEludGVydmFsLCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJJbnRlcnZhbCk7XG59O1xuZXhwb3J0cy5jbGVhclRpbWVvdXQgPVxuZXhwb3J0cy5jbGVhckludGVydmFsID0gZnVuY3Rpb24odGltZW91dCkge1xuICBpZiAodGltZW91dCkge1xuICAgIHRpbWVvdXQuY2xvc2UoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gVGltZW91dChpZCwgY2xlYXJGbikge1xuICB0aGlzLl9pZCA9IGlkO1xuICB0aGlzLl9jbGVhckZuID0gY2xlYXJGbjtcbn1cblRpbWVvdXQucHJvdG90eXBlLnVucmVmID0gVGltZW91dC5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24oKSB7fTtcblRpbWVvdXQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2NsZWFyRm4uY2FsbChzY29wZSwgdGhpcy5faWQpO1xufTtcblxuLy8gRG9lcyBub3Qgc3RhcnQgdGhlIHRpbWUsIGp1c3Qgc2V0cyB1cCB0aGUgbWVtYmVycyBuZWVkZWQuXG5leHBvcnRzLmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0sIG1zZWNzKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSBtc2Vjcztcbn07XG5cbmV4cG9ydHMudW5lbnJvbGwgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSAtMTtcbn07XG5cbmV4cG9ydHMuX3VucmVmQWN0aXZlID0gZXhwb3J0cy5hY3RpdmUgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcblxuICB2YXIgbXNlY3MgPSBpdGVtLl9pZGxlVGltZW91dDtcbiAgaWYgKG1zZWNzID49IDApIHtcbiAgICBpdGVtLl9pZGxlVGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiBvblRpbWVvdXQoKSB7XG4gICAgICBpZiAoaXRlbS5fb25UaW1lb3V0KVxuICAgICAgICBpdGVtLl9vblRpbWVvdXQoKTtcbiAgICB9LCBtc2Vjcyk7XG4gIH1cbn07XG5cbi8vIHNldGltbWVkaWF0ZSBhdHRhY2hlcyBpdHNlbGYgdG8gdGhlIGdsb2JhbCBvYmplY3RcbnJlcXVpcmUoXCJzZXRpbW1lZGlhdGVcIik7XG4vLyBPbiBzb21lIGV4b3RpYyBlbnZpcm9ubWVudHMsIGl0J3Mgbm90IGNsZWFyIHdoaWNoIG9iamVjdCBgc2V0aW1tZWRpYXRlYCB3YXNcbi8vIGFibGUgdG8gaW5zdGFsbCBvbnRvLiAgU2VhcmNoIGVhY2ggcG9zc2liaWxpdHkgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlXG4vLyBgc2V0aW1tZWRpYXRlYCBsaWJyYXJ5LlxuZXhwb3J0cy5zZXRJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuc2V0SW1tZWRpYXRlKTtcbmV4cG9ydHMuY2xlYXJJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5jbGVhckltbWVkaWF0ZSk7XG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCIvKipcbiAqIEFkZHJlc3MgbW9kZWwuXG4gKiBUbyBjYXJyeSBhcm91bmQgYWRkcmVzcyBkYXRhXG4gKi9cbmNsYXNzIEFkZHJlc3Mge1xuICAgIGNvbnN0cnVjdG9yKClcbiAgICB7XG4gICAgICAgIHRoaXMuX3N0cmVldCA9ICcnO1xuICAgICAgICB0aGlzLl9ob3VzZV9udW1iZXIgPSAnJztcbiAgICAgICAgdGhpcy5fcG9zdGFsX2NvZGUgPSAnJztcbiAgICAgICAgdGhpcy5fY2l0eSA9ICcnO1xuICAgICAgICB0aGlzLl9waG9uZSA9ICcnO1xuICAgICAgICB0aGlzLl9jb3VudHJ5SXNvMyA9ICcnO1xuICAgICAgICB0aGlzLnRvSlNPTiA9IHRoaXMuX3RvSnNvbi5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIGdldCBzdHJlZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJlZXQ7XG4gICAgfVxuXG4gICAgc2V0IHN0cmVldCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9zdHJlZXQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgaG91c2VfbnVtYmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faG91c2VfbnVtYmVyO1xuICAgIH1cblxuICAgIHNldCBob3VzZV9udW1iZXIodmFsdWUpIHtcbiAgICAgICAgdGhpcy5faG91c2VfbnVtYmVyID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IHBvc3RhbF9jb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9zdGFsX2NvZGU7XG4gICAgfVxuXG4gICAgc2V0IHBvc3RhbF9jb2RlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3Bvc3RhbF9jb2RlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IGNpdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaXR5O1xuICAgIH1cblxuICAgIHNldCBjaXR5KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NpdHkgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgcGhvbmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waG9uZTtcbiAgICB9XG5cbiAgICBzZXQgcGhvbmUodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fcGhvbmUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgY291bnRyeUlzbzMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudHJ5SXNvMztcbiAgICB9XG5cbiAgICBzZXQgY291bnRyeUlzbzModmFsdWUpIHtcbiAgICAgICAgdGhpcy5fY291bnRyeUlzbzMgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBfdG9Kc29uKClcbiAgICB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnc3RyZWV0JyA6IHRoaXMuX3N0cmVldCxcbiAgICAgICAgICAgICdob3VzZV9udW1iZXInIDogdGhpcy5faG91c2VfbnVtYmVyLFxuICAgICAgICAgICAgJ3Bvc3RhbF9jb2RlJyA6IHRoaXMuX3Bvc3RhbF9jb2RlLFxuICAgICAgICAgICAgJ2NpdHknIDogdGhpcy5fY2l0eSxcbiAgICAgICAgICAgICdwaG9uZScgOiB0aGlzLl9waG9uZSxcbiAgICAgICAgICAgICdjb3VudHJ5SXNvMycgOiB0aGlzLl9jb3VudHJ5SXNvMyxcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHsgQWRkcmVzcyB9IiwiY2xhc3MgQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fdG90YWxFeFZhdEFuZERpc2NvdW50cyA9IDA7XG4gICAgICAgIHRoaXMuX3RvdGFsRXhWYXRBbmREaXNjb3VudHNGb3JtYXR0ZWQgPSAnJztcbiAgICAgICAgdGhpcy5fdG90YWxFeFZhdCA9IDA7XG4gICAgICAgIHRoaXMuX3RvdGFsRXhWYXRGb3JtYXR0ZWQgPSAnJztcbiAgICAgICAgdGhpcy5fdmF0VG90YWwgPSAwO1xuICAgICAgICB0aGlzLl92YXRUb3RhbEZvcm1hdHRlZCA9ICcnO1xuICAgICAgICB0aGlzLl9zaGlwcGluZ0Nvc3RzID0gMDtcbiAgICAgICAgdGhpcy5fc2hpcHBpbmdDb3N0c0Zvcm1hdHRlZCA9ICcnO1xuICAgICAgICB0aGlzLl90b3RhbCA9IDA7XG4gICAgICAgIHRoaXMuX3RvdGFsRm9ybWF0dGVkID0gJyc7XG4gICAgICAgIHRoaXMuX3ZhdFBlcmNlbnRhZ2UgPSAwO1xuICAgICAgICB0aGlzLl9jb3Vwb25Db2RlcyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBqc29uXG4gICAgICogQHJldHVybiB7Q2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlfG51bGx9XG4gICAgICovXG4gICAgc3RhdGljIGZyb21Kc29uU3RyaW5nKGpzb24pIHtcbiAgICAgICAgaWYoIXRoaXMuaXMoanNvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBqc29uT2JqZWN0ID0gSlNPTi5wYXJzZShqc29uKTtcblxuICAgICAgICBsZXQgaW5zdGFuY2UgPSBuZXcgdGhpcztcbiAgICAgICAgaW5zdGFuY2UuX3RvdGFsRXhWYXRBbmREaXNjb3VudHMgPSBqc29uT2JqZWN0LnRvdGFsRXhWYXRBbmREaXNjb3VudHM7XG4gICAgICAgIGluc3RhbmNlLl90b3RhbEV4VmF0QW5kRGlzY291bnRzRm9ybWF0dGVkID0ganNvbk9iamVjdC50b3RhbEV4VmF0QW5kRGlzY291bnRzRm9ybWF0dGVkO1xuICAgICAgICBpbnN0YW5jZS5fdG90YWxFeFZhdCA9IGpzb25PYmplY3QudG90YWxFeFZhdDtcbiAgICAgICAgaW5zdGFuY2UuX3RvdGFsRXhWYXRGb3JtYXR0ZWQgPSBqc29uT2JqZWN0LnRvdGFsRXhWYXRGb3JtYXR0ZWQ7XG4gICAgICAgIGluc3RhbmNlLl92YXRUb3RhbCA9IGpzb25PYmplY3QudmF0VG90YWw7XG4gICAgICAgIGluc3RhbmNlLl92YXRUb3RhbEZvcm1hdHRlZCA9IGpzb25PYmplY3QudmF0VG90YWxGb3JtYXR0ZWQ7XG4gICAgICAgIGluc3RhbmNlLl9zaGlwcGluZ0Nvc3RzID0ganNvbk9iamVjdC5zaGlwcGluZ0Nvc3RzO1xuICAgICAgICBpbnN0YW5jZS5fc2hpcHBpbmdDb3N0c0Zvcm1hdHRlZCA9IGpzb25PYmplY3Quc2hpcHBpbmdDb3N0c0Zvcm1hdHRlZDtcbiAgICAgICAgaW5zdGFuY2UuX3RvdGFsID0ganNvbk9iamVjdC50b3RhbDtcbiAgICAgICAgaW5zdGFuY2UuX3RvdGFsRm9ybWF0dGVkID0ganNvbk9iamVjdC50b3RhbEZvcm1hdHRlZDtcbiAgICAgICAgaW5zdGFuY2UuX3ZhdFBlcmNlbnRhZ2UgPSBqc29uT2JqZWN0LnZhdFBlcmNlbnRhZ2U7XG4gICAgICAgIGluc3RhbmNlLl9jb3Vwb25Db2RlcyA9IGpzb25PYmplY3QuY291cG9uQ29kZXM7XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiBqc29uIHN0cmluZyByZXByZXNlbnRzIGEgQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ganNvblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbG9nRXJyb3JzXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgaXMoanNvbiwgbG9nRXJyb3JzID0gdHJ1ZSlcbiAgICB7XG4gICAgICAgIGxldCBqc29uT2JqZWN0ID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGpzb25PYmplY3QgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgICAgICAgICAgaWYoIWpzb25PYmplY3QpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYobG9nRXJyb3JzKSBjb25zb2xlLmVycm9yKCdDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2U6IFRoZSBnaXZlbiBqc29uIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIENoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZSBzaW5jZSB0aGUganNvbiBzdHJpbmcgd2FzIG5vdCBhIHZhbGlkIGpzb24nKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCd0b3RhbEV4VmF0Rm9ybWF0dGVkJykgfHwgdHlwZW9mIGpzb25PYmplY3QudG90YWxFeFZhdEZvcm1hdHRlZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlOiBUaGUgcmVzcG9uc2Ugb2JqZWN0IG11c3QgaGF2ZSBhIHRvdGFsRXhWYXRGb3JtYXR0ZWQgcHJvcGVydHkgdGhhdCBpcyBhIHN0cmluZy4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZighanNvbk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgndG90YWxFeFZhdEFuZERpc2NvdW50c0Zvcm1hdHRlZCcpIHx8IHR5cGVvZiBqc29uT2JqZWN0LnRvdGFsRXhWYXRBbmREaXNjb3VudHNGb3JtYXR0ZWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZihsb2dFcnJvcnMpIGNvbnNvbGUuZXJyb3IoJ0NoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZTogVGhlIHJlc3BvbnNlIG9iamVjdCBtdXN0IGhhdmUgYSB0b3RhbEV4VmF0QW5kRGlzY291bnRzRm9ybWF0dGVkIHByb3BlcnR5IHRoYXQgaXMgYSBzdHJpbmcuIE9iamVjdDogJywganNvbk9iamVjdCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgfVxuICAgICAgICBpZighanNvbk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgndmF0VG90YWxGb3JtYXR0ZWQnKSB8fCB0eXBlb2YganNvbk9iamVjdC52YXRUb3RhbEZvcm1hdHRlZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlOiBUaGUgcmVzcG9uc2Ugb2JqZWN0IG11c3QgaGF2ZSBhIHZhdFRvdGFsRm9ybWF0dGVkIHByb3BlcnR5IHRoYXQgaXMgYSBzdHJpbmcuIE9iamVjdDogJywganNvbk9iamVjdCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgfVxuICAgICAgICBpZighanNvbk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnc2hpcHBpbmdDb3N0c0Zvcm1hdHRlZCcpIHx8IHR5cGVvZiBqc29uT2JqZWN0LnNoaXBwaW5nQ29zdHNGb3JtYXR0ZWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZihsb2dFcnJvcnMpIGNvbnNvbGUuZXJyb3IoJ0NoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZTogVGhlIHJlc3BvbnNlIG9iamVjdCBtdXN0IGhhdmUgYSBzaGlwcGluZ0Nvc3RzRm9ybWF0dGVkIHByb3BlcnR5IHRoYXQgaXMgYSBzdHJpbmcuIE9iamVjdDogJywganNvbk9iamVjdCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgfVxuICAgICAgICBpZighanNvbk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgndG90YWxGb3JtYXR0ZWQnKSB8fCB0eXBlb2YganNvbk9iamVjdC50b3RhbEZvcm1hdHRlZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlOiBUaGUgcmVzcG9uc2Ugb2JqZWN0IG11c3QgaGF2ZSBhIHRvdGFsRm9ybWF0dGVkIHByb3BlcnR5IHRoYXQgaXMgYSBzdHJpbmcuIE9iamVjdDogJywganNvbk9iamVjdCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCd0b3RhbEV4VmF0QW5kRGlzY291bnRzJykgfHwgdHlwZW9mIGpzb25PYmplY3QudG90YWxFeFZhdEFuZERpc2NvdW50cyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlOiBUaGUgcmVzcG9uc2Ugb2JqZWN0IG11c3QgaGF2ZSBhIHRvdGFsRXhWYXRBbmREaXNjb3VudHMgcHJvcGVydHkgdGhhdCBpcyBhIG51bWJlci4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICB9XG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCd0b3RhbEV4VmF0JykgfHwgdHlwZW9mIGpzb25PYmplY3QudG90YWxFeFZhdCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlOiBUaGUgcmVzcG9uc2Ugb2JqZWN0IG11c3QgaGF2ZSBhIHRvdGFsRXhWYXQgcHJvcGVydHkgdGhhdCBpcyBhIG51bWJlci4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICB9XG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCd2YXRUb3RhbCcpIHx8IHR5cGVvZiBqc29uT2JqZWN0LnZhdFRvdGFsICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaWYobG9nRXJyb3JzKSBjb25zb2xlLmVycm9yKCdDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2U6IFRoZSByZXNwb25zZSBvYmplY3QgbXVzdCBoYXZlIGEgdmF0VG90YWwgcHJvcGVydHkgdGhhdCBpcyBhIG51bWJlci4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICB9XG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCdzaGlwcGluZ0Nvc3RzJykgfHwgdHlwZW9mIGpzb25PYmplY3Quc2hpcHBpbmdDb3N0cyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlOiBUaGUgcmVzcG9uc2Ugb2JqZWN0IG11c3QgaGF2ZSBhIHNoaXBwaW5nQ29zdHMgcHJvcGVydHkgdGhhdCBpcyBhIG51bWJlci4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICB9XG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCd0b3RhbCcpIHx8IHR5cGVvZiBqc29uT2JqZWN0LnRvdGFsICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaWYobG9nRXJyb3JzKSBjb25zb2xlLmVycm9yKCdDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2U6IFRoZSByZXNwb25zZSBvYmplY3QgbXVzdCBoYXZlIGEgdG90YWwgcHJvcGVydHkgdGhhdCBpcyBhIG51bWJlci4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICB9XG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCd2YXRQZXJjZW50YWdlJykgfHwgdHlwZW9mIGpzb25PYmplY3QudmF0UGVyY2VudGFnZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlOiBUaGUgcmVzcG9uc2Ugb2JqZWN0IG11c3QgaGF2ZSBhIHZhdFBlcmNlbnRhZ2UgcHJvcGVydHkgdGhhdCBpcyBhIG51bWJlci4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICB9XG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCdjb3Vwb25Db2RlcycpIHx8ICFBcnJheS5pc0FycmF5KGpzb25PYmplY3QuY291cG9uQ29kZXMpKSB7XG4gICAgICAgICAgICBpZihsb2dFcnJvcnMpIGNvbnNvbGUuZXJyb3IoJ0NoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZTogVGhlIHJlc3BvbnNlIG9iamVjdCBtdXN0IGhhdmUgYSBjb3Vwb25Db2RlcyBwcm9wZXJ0eSB0aGF0IGlzIGFuIGFycmF5LiBPYmplY3Q6ICcsIGpzb25PYmplY3QpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuICAgIGdldCB0b3RhbEV4VmF0QW5kRGlzY291bnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxFeFZhdEFuZERpc2NvdW50cztcbiAgICB9XG5cbiAgICBnZXQgdG90YWxFeFZhdEFuZERpc2NvdW50c0Zvcm1hdHRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsRXhWYXRBbmREaXNjb3VudHNGb3JtYXR0ZWQ7XG4gICAgfVxuXG4gICAgZ2V0IHRvdGFsRXhWYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90b3RhbEV4VmF0O1xuICAgIH1cblxuICAgIGdldCB0b3RhbEV4VmF0Rm9ybWF0dGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxFeFZhdEZvcm1hdHRlZDtcbiAgICB9XG5cbiAgICBnZXQgdmF0VG90YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YXRUb3RhbDtcbiAgICB9XG5cbiAgICBnZXQgdmF0VG90YWxGb3JtYXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YXRUb3RhbEZvcm1hdHRlZDtcbiAgICB9XG5cbiAgICBnZXQgc2hpcHBpbmdDb3N0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NoaXBwaW5nQ29zdHM7XG4gICAgfVxuXG4gICAgZ2V0IHNoaXBwaW5nQ29zdHNGb3JtYXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaGlwcGluZ0Nvc3RzRm9ybWF0dGVkO1xuICAgIH1cblxuICAgIGdldCB0b3RhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsO1xuICAgIH1cblxuICAgIGdldCB0b3RhbEZvcm1hdHRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsRm9ybWF0dGVkO1xuICAgIH1cblxuICAgIGdldCB2YXRQZXJjZW50YWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmF0UGVyY2VudGFnZTtcbiAgICB9XG5cbiAgICBnZXQgY291cG9uQ29kZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3Vwb25Db2RlcztcbiAgICB9XG59XG5cbmV4cG9ydCB7IENoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZSB9IiwiLyoqXG4gKiBDb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UuXG4gKlxuICogUmVwcmVzZW50cyBhIHJlc3BvbnNlIHRoYXQgb3JpZ2luYXRlcyBmcm9tXG4gKi9cbmltcG9ydCB7IExhbmd1YWdlIH0gZnJvbSBcIi4vbGFuZ3VhZ2VcIjtcblxuY2xhc3MgQ291bnRyeUxhbmd1YWdlc1Jlc3BvbnNlIHtcbiAgICBjb25zdHJ1Y3RvcigpXG4gICAge1xuICAgICAgICB0aGlzLl9sYW5ndWFnZXMgPSBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ganNvblxuICAgICAqIEByZXR1cm4ge0NvdW50cnlMYW5ndWFnZXNSZXNwb25zZXxudWxsfVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tSnNvblN0cmluZyhqc29uKSB7XG4gICAgICAgIGlmKCF0aGlzLmlzKGpzb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQganNvbk9iamVjdCA9IEpTT04ucGFyc2UoanNvbik7XG5cbiAgICAgICAgbGV0IGluc3RhbmNlID0gbmV3IHRoaXM7XG4gICAgICAgIGxldCBsYW5ndWFnZUNvdW50ID0ganNvbk9iamVjdC5sYW5ndWFnZXMubGVuZ3RoO1xuICAgICAgICBmb3IobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsYW5ndWFnZUNvdW50OyBpbmRleCsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgbGFuZ3VhZ2VPYmplY3QgPSBqc29uT2JqZWN0Lmxhbmd1YWdlc1tpbmRleF07XG4gICAgICAgICAgICBsZXQgbGFuZ3VhZ2UgPSBuZXcgTGFuZ3VhZ2UoKTtcbiAgICAgICAgICAgIGxhbmd1YWdlLm5hbWUgPSBsYW5ndWFnZU9iamVjdC5uYW1lO1xuICAgICAgICAgICAgbGFuZ3VhZ2UuZGlzcGxheU5hbWUgPSBsYW5ndWFnZU9iamVjdC5kaXNwbGF5TmFtZTtcbiAgICAgICAgICAgIGxhbmd1YWdlLm5hdGl2ZU5hbWUgPSBsYW5ndWFnZU9iamVjdC5uYXRpdmVOYW1lO1xuICAgICAgICAgICAgbGFuZ3VhZ2UudHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lID0gbGFuZ3VhZ2VPYmplY3QudHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lO1xuICAgICAgICAgICAgbGFuZ3VhZ2UudGhyZWVMZXR0ZXJJc29MYW5ndWFnZU5hbWUgPSBsYW5ndWFnZU9iamVjdC50aHJlZUxldHRlcklzb0xhbmd1YWdlTmFtZTtcblxuICAgICAgICAgICAgaW5zdGFuY2UuX2xhbmd1YWdlcy5wdXNoKGxhbmd1YWdlKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiBqc29uIHN0cmluZyByZXByZXNlbnRzIGEgRXJyb3JSZXNwb25zZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGpzb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGxvZ0Vycm9yc1xuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGlzKGpzb24sIGxvZ0Vycm9ycyA9IHRydWUpXG4gICAge1xuICAgICAgICBsZXQganNvbk9iamVjdCA9IG51bGw7XG5cbiAgICAgICAgaWYodHlwZW9mIGpzb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGpzb25PYmplY3QgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgICAgICAgICAgICAgIGlmICghanNvbk9iamVjdCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdW50cnlMYW5ndWFnZXNSZXNwb25zZTogVGhlIGdpdmVuIGpzb24gZG9lcyBub3QgcmVwcmVzZW50IGEgQ291bnRyeUxhbmd1YWdlc1Jlc3BvbnNlIHNpbmNlIHRoZSBqc29uIHN0cmluZyB3YXMgbm90IGEgdmFsaWQganNvbi4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBqc29uT2JqZWN0ID0ganNvblxuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWpzb25PYmplY3QuaGFzT3duUHJvcGVydHkoJ2xhbmd1YWdlcycpIHx8ICFBcnJheS5pc0FycmF5KGpzb25PYmplY3QubGFuZ3VhZ2VzKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdW50cnlMYW5ndWFnZXNSZXNwb25zZTogVGhlIGdpdmVuIGpzb24gbXVzdCBoYXZlIGEgcHJvcGVydHkgY2FsbGVkIGxhbmd1YWdlcyB0aGF0IGlzIGFuIEFycmF5LCBCdXQgZGlkIG5vdCBoYXZlLiBPYmplY3Q6ICcsIGpzb25PYmplY3QpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxhbmd1YWdlQ291bnQgPSBqc29uT2JqZWN0Lmxhbmd1YWdlcy5sZW5ndGg7XG4gICAgICAgIGZvcihsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxhbmd1YWdlQ291bnQ7IGluZGV4KyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBsYW5ndWFnZU9iamVjdCA9IGpzb25PYmplY3QubGFuZ3VhZ2VzW2luZGV4XTtcbiAgICAgICAgICAgIGlmKHR5cGVvZiBsYW5ndWFnZU9iamVjdCAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIGxhbmd1YWdlT2JqZWN0ID09PSAnZnVuY3Rpb24nIHx8ICFMYW5ndWFnZS5pcyhsYW5ndWFnZU9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge3t2YWxpZDogYm9vbGVhbiwgZXJyb3JzOiBBcnJheX19XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdG9Kc29uKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2xhbmd1YWdlcyc6IHRoaXMuX2xhbmd1YWdlc1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TGFuZ3VhZ2VbXX1cbiAgICAgKi9cbiAgICBnZXQgbGFuZ3VhZ2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VzO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgQ291bnRyeUxhbmd1YWdlc1Jlc3BvbnNlIH0iLCIvKipcbiAqIEEgbGFyYXZlbCBlcnJvciByZXNwb25zZVxuICovXG5jbGFzcyBFcnJvclJlc3BvbnNlIHtcbiAgICBjb25zdHJ1Y3RvcigpXG4gICAge1xuICAgICAgICB0aGlzLl9tZXNzYWdlID0gJyc7XG4gICAgICAgIHRoaXMuX2Vycm9ycyA9IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBqc29uXG4gICAgICogQHJldHVybiB7RXJyb3JSZXNwb25zZXxudWxsfVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tSnNvblN0cmluZyhqc29uKSB7XG4gICAgICAgIGlmKCF0aGlzLmlzKGpzb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQganNvbk9iamVjdCA9IEpTT04ucGFyc2UoanNvbik7XG5cbiAgICAgICAgbGV0IGluc3RhbmNlID0gbmV3IHRoaXM7XG4gICAgICAgIGluc3RhbmNlLl9tZXNzYWdlID0ganNvbk9iamVjdC5tZXNzYWdlO1xuICAgICAgICBpbnN0YW5jZS5fZXJyb3JzID0ganNvbk9iamVjdC5lcnJvcnM7XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiBqc29uIHN0cmluZyByZXByZXNlbnRzIGEgRXJyb3JSZXNwb25zZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGpzb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGxvZ0Vycm9yc1xuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGlzKGpzb24sIGxvZ0Vycm9ycyA9IHRydWUpXG4gICAge1xuICAgICAgICBsZXQganNvbk9iamVjdCA9IG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBqc29uT2JqZWN0ID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgICAgICAgIGlmKCFqc29uT2JqZWN0KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignRXJyb3JSZXNwb25zZTogVGhlIGdpdmVuIGpzb24gZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQgRXJyb3JSZXNwb25zZSBzaW5jZSB0aGUganNvbiBzdHJpbmcgd2FzIG5vdCBhIHZhbGlkIGpzb24nKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCdtZXNzYWdlJykgfHwgdHlwZW9mIGpzb25PYmplY3QubWVzc2FnZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignRXJyb3JSZXNwb25zZTogVGhlIHJlc3BvbnNlIG9iamVjdCBtdXN0IGhhdmUgYW4gbWVzc2FnZSBwcm9wZXJ0eSB0aGF0IGlzIGEgc3RyaW5nLiBPYmplY3Q6JywganNvbk9iamVjdCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZighanNvbk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnZXJyb3JzJykgfHwgdHlwZW9mIGpzb25PYmplY3QuZXJyb3JzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYobG9nRXJyb3JzKSBjb25zb2xlLmVycm9yKCdFcnJvclJlc3BvbnNlOiBUaGUgcmVzcG9uc2Ugb2JqZWN0IG11c3QgaGF2ZSBhbiBlcnJvcnMgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB2YWxpZCBsYXJhdmVsIGZpZWxkIGVycm9ycy4gT2JqZWN0OicsIGpzb25PYmplY3QpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yKGxldCBmaWVsZE5hbWUgaW4ganNvbk9iamVjdC5lcnJvcnMpIHtcbiAgICAgICAgICAgIGlmKGpzb25PYmplY3QuZXJyb3JzLmhhc093blByb3BlcnR5KGZpZWxkTmFtZSkgJiYgIUFycmF5LmlzQXJyYXkoanNvbk9iamVjdC5lcnJvcnNbZmllbGROYW1lXSkpIHtcbiAgICAgICAgICAgICAgICBpZihsb2dFcnJvcnMpIGNvbnNvbGUuZXJyb3IoJ0Vycm9yUmVzcG9uc2U6IFRoZSBwcm9wZXJ0eSBcIicrZmllbGROYW1lKydcIiBpbiB0aGUgZXJyb3JzIGFycmF5IG11c3QgaGF2ZSBoYXZlIGFycmF5IGFzIHZhbHVlIGNvbnRhaW5pbmcgZXJyb3JzIHN0cmluZ3MuIE9iamVjdDonLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRydXJucyBhIGNvbXByZWhlbnNpdmUgZXJyb3IgbWVzc2FnZSBmb3IgYWxsIHRoZSBmaWVsZHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gcmV0dXJucyBhbiBvYmplY3Qgd2hlcmUgdGhlIHByb3BlcnR5IGFyZSBmaWVsZCBuYW1lcy4gYW5kIHRoZSB2YWx1ZXMgYXJlIGFycmF5cyBjb250YWluaW5nIGVycm9ycyBmb3IgdGhvc2UgZmllbGQgbmFtZXMuXG4gICAgICovXG4gICAgZ2V0IGVycm9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9ycztcbiAgICB9XG59XG5cbmV4cG9ydCB7IEVycm9yUmVzcG9uc2UgfSIsIi8qKlxuICogTGFuZ3VhZ2UuXG4gKlxuICogUmVwcmVzZW50cyBhIExhbmd1YWdlXG4gKi9cbmNsYXNzIExhbmd1YWdlIHtcbiAgICBjb25zdHJ1Y3RvcigpXG4gICAge1xuICAgICAgICB0aGlzLl9uYW1lID0gJyc7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXlOYW1lID0gJyc7XG4gICAgICAgIHRoaXMuX25hdGl2ZU5hbWUgPSAnJztcbiAgICAgICAgdGhpcy5fdHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lID0gJyc7XG4gICAgICAgIHRoaXMuX3RocmVlTGV0dGVySXNvTGFuZ3VhZ2VOYW1lID0gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGpzb25cbiAgICAgKiBAcmV0dXJuIHtMYW5ndWFnZXxudWxsfVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tSnNvblN0cmluZyhqc29uKSB7XG4gICAgICAgIGlmKCF0aGlzLmlzKGpzb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQganNvbk9iamVjdCA9IEpTT04ucGFyc2UoanNvbik7XG5cbiAgICAgICAgbGV0IGluc3RhbmNlID0gbmV3IHRoaXM7XG4gICAgICAgIGluc3RhbmNlLl9uYW1lID0ganNvbk9iamVjdC5uYW1lO1xuICAgICAgICBpbnN0YW5jZS5fZGlzcGxheU5hbWUgPSBqc29uT2JqZWN0LmRpc3BsYXlOYW1lO1xuICAgICAgICBpbnN0YW5jZS5fbmF0aXZlTmFtZSA9IGpzb25PYmplY3QubmF0aXZlTmFtZTtcbiAgICAgICAgaW5zdGFuY2UuX3R3b0xldHRlcklzb0xhbmd1YWdlTmFtZSA9IGpzb25PYmplY3QudHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lO1xuICAgICAgICBpbnN0YW5jZS5fdGhyZWVMZXR0ZXJJc29MYW5ndWFnZU5hbWUgPSBqc29uT2JqZWN0LnRocmVlTGV0dGVySXNvTGFuZ3VhZ2VOYW1lO1xuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4ganNvbiBzdHJpbmcgcmVwcmVzZW50cyBhIEVycm9yUmVzcG9uc2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0ganNvblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbG9nRXJyb3JzXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgaXMoanNvbiwgbG9nRXJyb3JzID0gdHJ1ZSlcbiAgICB7XG4gICAgICAgIGxldCBqc29uT2JqZWN0ID0gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGlmKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBqc29uT2JqZWN0ID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgICAgICAgICAgICBpZiAoIWpzb25PYmplY3QpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdMYW5ndWFnZTogVGhlIGdpdmVuIGpzb24gZG9lcyBub3QgcmVwcmVzZW50IGEgTGFuZ3VhZ2Ugc2luY2UgdGhlIGpzb24gc3RyaW5nIHdhcyBub3QgYSB2YWxpZCBqc29uLiBPYmplY3Q6ICcsIGpzb25PYmplY3QsIGpzb24pO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGpzb25PYmplY3QgPSBqc29uXG4gICAgICAgIH1cblxuICAgICAgICBpZighanNvbk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpIHx8IHR5cGVvZiBqc29uT2JqZWN0LmRpc3BsYXlOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYobG9nRXJyb3JzKSBjb25zb2xlLmVycm9yKCdMYW5ndWFnZTogVGhlIGxhbmd1YWdlIG9iamVjdCBtdXN0IGhhdmUgYSBwcm9wZXJ0eSBjYWxsZWQgbmFtZSB0aGF0IGlzIGEgc3RyaW5nLiBPYmplY3Q6ICcsIGpzb25PYmplY3QpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCdkaXNwbGF5TmFtZScpIHx8IHR5cGVvZiBqc29uT2JqZWN0LmRpc3BsYXlOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYobG9nRXJyb3JzKSBjb25zb2xlLmVycm9yKCdMYW5ndWFnZTogVGhlIGxhbmd1YWdlIG9iamVjdCBtdXN0IGhhdmUgYSBwcm9wZXJ0eSBjYWxsZWQgZGlzcGxheU5hbWUgdGhhdCBpcyBhIHN0cmluZy4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZighanNvbk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnbmF0aXZlTmFtZScpIHx8IHR5cGVvZiBqc29uT2JqZWN0Lm5hdGl2ZU5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZihsb2dFcnJvcnMpIGNvbnNvbGUuZXJyb3IoJ0xhbmd1YWdlOiBUaGUgbGFuZ3VhZ2Ugb2JqZWN0IG11c3QgaGF2ZSBhIHByb3BlcnR5IGNhbGxlZCBuYXRpdmVOYW1lIHRoYXQgaXMgYSBzdHJpbmcuIE9iamVjdDogJywganNvbk9iamVjdCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoIWpzb25PYmplY3QuaGFzT3duUHJvcGVydHkoJ3R3b0xldHRlcklzb0xhbmd1YWdlTmFtZScpIHx8IHR5cGVvZiBqc29uT2JqZWN0LnR3b0xldHRlcklzb0xhbmd1YWdlTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignTGFuZ3VhZ2U6IFRoZSBsYW5ndWFnZSBvYmplY3QgbXVzdCBoYXZlIGEgcHJvcGVydHkgY2FsbGVkIHR3b0xldHRlcklzb0xhbmd1YWdlTmFtZSB0aGF0IGlzIGEgc3RyaW5nLiBPYmplY3Q6ICcsIGpzb25PYmplY3QudHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZighanNvbk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgndGhyZWVMZXR0ZXJJc29MYW5ndWFnZU5hbWUnKSB8fCB0eXBlb2YganNvbk9iamVjdC50aHJlZUxldHRlcklzb0xhbmd1YWdlTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmKGxvZ0Vycm9ycykgY29uc29sZS5lcnJvcignTGFuZ3VhZ2U6IFRoZSBsYW5ndWFnZSBvYmplY3QgbXVzdCBoYXZlIGEgcHJvcGVydHkgY2FsbGVkIHRocmVlTGV0dGVySXNvTGFuZ3VhZ2VOYW1lIHRoYXQgaXMgYSBzdHJpbmcuIE9iamVjdDogJywganNvbk9iamVjdCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge3t2YWxpZDogYm9vbGVhbiwgZXJyb3JzOiBBcnJheX19XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdG9Kc29uKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ25hbWUnOiB0aGlzLl9uYW1lLFxuICAgICAgICAgICAgJ2Rpc3BsYXlOYW1lJzogdGhpcy5fZGlzcGxheU5hbWUsXG4gICAgICAgICAgICAnbmF0aXZlTmFtZSc6IHRoaXMuX25hdGl2ZU5hbWUsXG4gICAgICAgICAgICAndHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lJzogdGhpcy5fdHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lLFxuICAgICAgICAgICAgJ3RocmVlTGV0dGVySXNvTGFuZ3VhZ2VOYW1lJzogdGhpcy5fdGhyZWVMZXR0ZXJJc29MYW5ndWFnZU5hbWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgICB9XG5cbiAgICBzZXQgbmFtZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9uYW1lID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IGRpc3BsYXlOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzcGxheU5hbWU7XG4gICAgfVxuXG4gICAgc2V0IGRpc3BsYXlOYW1lKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXlOYW1lID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IG5hdGl2ZU5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uYXRpdmVOYW1lO1xuICAgIH1cblxuICAgIHNldCBuYXRpdmVOYW1lKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX25hdGl2ZU5hbWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgdHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lO1xuICAgIH1cblxuICAgIHNldCB0d29MZXR0ZXJJc29MYW5ndWFnZU5hbWUodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdHdvTGV0dGVySXNvTGFuZ3VhZ2VOYW1lID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IHRocmVlTGV0dGVySXNvTGFuZ3VhZ2VOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGhyZWVMZXR0ZXJJc29MYW5ndWFnZU5hbWU7XG4gICAgfVxuXG4gICAgc2V0IHRocmVlTGV0dGVySXNvTGFuZ3VhZ2VOYW1lKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3RocmVlTGV0dGVySXNvTGFuZ3VhZ2VOYW1lID0gdmFsdWU7XG4gICAgfVxufVxuXG5leHBvcnQgeyBMYW5ndWFnZSB9IiwiLyoqXG4gKiBWYWxpZGF0aW9uUmVzcG9uc2UuXG4gKlxuICogUmVwcmVzZW50cyBhIHJlc3BvbnNlIHRoYXQgb3JpZ2luYXRlcyBmcm9tXG4gKi9cbmNsYXNzIFZhbGlkYXRpb25SZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IoKVxuICAgIHtcbiAgICAgICAgdGhpcy5fdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZXJyb3JzID0gW107XG4gICAgICAgIHRoaXMudG9KU09OID0gdGhpcy5fdG9Kc29uLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGpzb25cbiAgICAgKiBAcmV0dXJuIHtWYWxpZGF0aW9uUmVzcG9uc2V8bnVsbH1cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUpzb25TdHJpbmcoanNvbikge1xuICAgICAgICBpZighdGhpcy5pcyhqc29uKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGpzb25PYmplY3QgPSBKU09OLnBhcnNlKGpzb24pO1xuXG4gICAgICAgIGxldCBpbnN0YW5jZSA9IG5ldyB0aGlzO1xuICAgICAgICBpbnN0YW5jZS5fdmFsaWQgPSBqc29uT2JqZWN0LnZhbGlkO1xuICAgICAgICBpbnN0YW5jZS5fZXJyb3JzID0ganNvbk9iamVjdC5lcnJvcnM7XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiBqc29uIHN0cmluZyByZXByZXNlbnRzIGEgRXJyb3JSZXNwb25zZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGpzb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGxvZ0Vycm9yc1xuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGlzKGpzb24sIGxvZ0Vycm9ycyA9IHRydWUpXG4gICAge1xuICAgICAgICBsZXQganNvbk9iamVjdCA9IG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBqc29uT2JqZWN0ID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgICAgICAgIGlmKCFqc29uT2JqZWN0KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1ZhbGlkYXRpb25SZXNwb25zZTogVGhlIGdpdmVuIGpzb24gZG9lcyBub3QgcmVwcmVzZW50IGEgVmFsaWRhdGlvblJlc3BvbnNlIHNpbmNlIHRoZSBqc29uIHN0cmluZyB3YXMgbm90IGEgdmFsaWQganNvbi4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFqc29uT2JqZWN0Lmhhc093blByb3BlcnR5KCd2YWxpZCcpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdWYWxpZGF0aW9uUmVzcG9uc2U6IFRoZSBnaXZlbiBqc29uIG9iamVjdCBtdXN0IGhhdmUgYW4gXCJ2YWxpZFwiIHByb3BlcnR5IHRoYXQgaXMgYSBzdHJpbmcuIEJ1dCBkaWQgbm90IGhhdmUgb25lLiBPYmplY3Q6ICcsIGpzb25PYmplY3QpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWpzb25PYmplY3QuaGFzT3duUHJvcGVydHkoJ2Vycm9ycycpIHx8IHR5cGVvZiAhanNvbk9iamVjdC5lcnJvcnMgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1ZhbGlkYXRpb25SZXNwb25zZTogVGhlIGdpdmVuIGpzb24gb2JqZWN0IG11c3QgaGF2ZSBhbiBlcnJvcnMgb2JqZWN0LiBCdXQgZGlkIG5vdCBoYXZlIG9uZS4gT2JqZWN0OiAnLCBqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7e3ZhbGlkOiBib29sZWFuLCBlcnJvcnM6IEFycmF5fX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF90b0pzb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAndmFsaWQnOiB0aGlzLl92YWxpZCxcbiAgICAgICAgICAgICdlcnJvcnMnOiB0aGlzLl9lcnJvcnNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0IHZhbGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7QXJyYXl9XG4gICAgICovXG4gICAgZ2V0IGVycm9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9ycztcbiAgICB9XG59XG5cbmV4cG9ydCB7IFZhbGlkYXRpb25SZXNwb25zZSB9IiwiLyoqXG4gKiBFdmVudCBzZW1pIHBvbHlmaWxsLiBJRSBkb2VzIG5vdCBzdXBwb3J0IG5ldyBldmVudC4gQnV0IGRvZXMgc3VwcG9ydCBkb2N1bWVudC5jcmVhdGVFdmVudC5cbiAqIFNhbWUgdGhpbmcgZm9yIGRpc3BhdGNoaW5nIGV2ZW50cy4gQnV0IHRoZW4gd2l0aCBjcmVhdGVFdmVudCBhbmQgZmlyZUV2ZW50LlxuICovXG5cblxuZnVuY3Rpb24gY3JlYXRlTmV3RXZlbnQoZXZlbnROYW1lKSB7XG4gICAgbGV0IGV2ZW50O1xuICAgIGlmICh0eXBlb2YoRXZlbnQpID09PSAnZnVuY3Rpb24nKSB7IC8vT24gaWUgaXQgaXMgdHlwZU9mIG9iamVjdC5cbiAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoZXZlbnROYW1lKTsgLy9Ob24taWVcbiAgICB9IGVsc2Uge1xuICAgICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpOyAvL2llXG4gICAgICAgIGV2ZW50LmluaXRFdmVudChldmVudE5hbWUsIHRydWUsIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnQ7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRGb3JFbGVtZW50KGVsZW1lbnQsIGV2ZW50KVxue1xuICAgIGlmIChkb2N1bWVudC5jcmVhdGVFdmVudCkge1xuICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuZmlyZUV2ZW50KFwib25cIiArIGV2ZW50LmV2ZW50VHlwZSwgZXZlbnQpO1xuICAgIH1cbn1cblxuIiwiTnVtYmVyLmlzSW50ZWdlciA9IE51bWJlci5pc0ludGVnZXIgfHwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmXG4gICAgICAgIGlzRmluaXRlKHZhbHVlKSAmJlxuICAgICAgICBNYXRoLmZsb29yKHZhbHVlKSA9PT0gdmFsdWU7XG59OyIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeSgpIDpcbiAgICAgICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgICAgICAgICAgIChmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvKipcbiAgICAgKiBAdGhpcyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5hbGx5Q29uc3RydWN0b3IoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGNvbnN0cnVjdG9yID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgICAgICAgIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLnJlc29sdmUoY2FsbGJhY2soKSkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5yZXNvbHZlKGNhbGxiYWNrKCkpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5yZWplY3QocmVhc29uKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbi8vIFN0b3JlIHNldFRpbWVvdXQgcmVmZXJlbmNlIHNvIHByb21pc2UtcG9seWZpbGwgd2lsbCBiZSB1bmFmZmVjdGVkIGJ5XG4vLyBvdGhlciBjb2RlIG1vZGlmeWluZyBzZXRUaW1lb3V0IChsaWtlIHNpbm9uLnVzZUZha2VUaW1lcnMoKSlcbiAgICB2YXIgc2V0VGltZW91dEZ1bmMgPSBzZXRUaW1lb3V0O1xuXG4gICAgZnVuY3Rpb24gbm9vcCgpIHt9XG5cbi8vIFBvbHlmaWxsIGZvciBGdW5jdGlvbi5wcm90b3R5cGUuYmluZFxuICAgIGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZm4uYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFByb21pc2UoZm4pIHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFByb21pc2UpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUHJvbWlzZXMgbXVzdCBiZSBjb25zdHJ1Y3RlZCB2aWEgbmV3Jyk7XG4gICAgICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ25vdCBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIC8qKiBAdHlwZSB7IW51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5fc3RhdGUgPSAwO1xuICAgICAgICAvKiogQHR5cGUgeyFib29sZWFufSAqL1xuICAgICAgICB0aGlzLl9oYW5kbGVkID0gZmFsc2U7XG4gICAgICAgIC8qKiBAdHlwZSB7UHJvbWlzZXx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHR5cGUgeyFBcnJheTwhRnVuY3Rpb24+fSAqL1xuICAgICAgICB0aGlzLl9kZWZlcnJlZHMgPSBbXTtcblxuICAgICAgICBkb1Jlc29sdmUoZm4sIHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZShzZWxmLCBkZWZlcnJlZCkge1xuICAgICAgICB3aGlsZSAoc2VsZi5fc3RhdGUgPT09IDMpIHtcbiAgICAgICAgICAgIHNlbGYgPSBzZWxmLl92YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZi5fc3RhdGUgPT09IDApIHtcbiAgICAgICAgICAgIHNlbGYuX2RlZmVycmVkcy5wdXNoKGRlZmVycmVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZWxmLl9oYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgUHJvbWlzZS5faW1tZWRpYXRlRm4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgY2IgPSBzZWxmLl9zdGF0ZSA9PT0gMSA/IGRlZmVycmVkLm9uRnVsZmlsbGVkIDogZGVmZXJyZWQub25SZWplY3RlZDtcbiAgICAgICAgICAgIGlmIChjYiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIChzZWxmLl9zdGF0ZSA9PT0gMSA/IHJlc29sdmUgOiByZWplY3QpKGRlZmVycmVkLnByb21pc2UsIHNlbGYuX3ZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmV0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQgPSBjYihzZWxmLl92YWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGRlZmVycmVkLnByb21pc2UsIGUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUoZGVmZXJyZWQucHJvbWlzZSwgcmV0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZShzZWxmLCBuZXdWYWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gUHJvbWlzZSBSZXNvbHV0aW9uIFByb2NlZHVyZTogaHR0cHM6Ly9naXRodWIuY29tL3Byb21pc2VzLWFwbHVzL3Byb21pc2VzLXNwZWMjdGhlLXByb21pc2UtcmVzb2x1dGlvbi1wcm9jZWR1cmVcbiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gc2VsZilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLicpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG5ld1ZhbHVlID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoZW4gPSBuZXdWYWx1ZS50aGVuO1xuICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSAzO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmaW5hbGUoc2VsZik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvUmVzb2x2ZShiaW5kKHRoZW4sIG5ld1ZhbHVlKSwgc2VsZik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IDE7XG4gICAgICAgICAgICBzZWxmLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgZmluYWxlKHNlbGYpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZWplY3Qoc2VsZiwgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWplY3Qoc2VsZiwgbmV3VmFsdWUpIHtcbiAgICAgICAgc2VsZi5fc3RhdGUgPSAyO1xuICAgICAgICBzZWxmLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICBmaW5hbGUoc2VsZik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmluYWxlKHNlbGYpIHtcbiAgICAgICAgaWYgKHNlbGYuX3N0YXRlID09PSAyICYmIHNlbGYuX2RlZmVycmVkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIFByb21pc2UuX2ltbWVkaWF0ZUZuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmICghc2VsZi5faGFuZGxlZCkge1xuICAgICAgICAgICAgICAgICAgICBQcm9taXNlLl91bmhhbmRsZWRSZWplY3Rpb25GbihzZWxmLl92YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc2VsZi5fZGVmZXJyZWRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBoYW5kbGUoc2VsZiwgc2VsZi5fZGVmZXJyZWRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBzZWxmLl9kZWZlcnJlZHMgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb21pc2UpIHtcbiAgICAgICAgdGhpcy5vbkZ1bGZpbGxlZCA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogbnVsbDtcbiAgICAgICAgdGhpcy5vblJlamVjdGVkID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT09ICdmdW5jdGlvbicgPyBvblJlamVjdGVkIDogbnVsbDtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYWtlIGEgcG90ZW50aWFsbHkgbWlzYmVoYXZpbmcgcmVzb2x2ZXIgZnVuY3Rpb24gYW5kIG1ha2Ugc3VyZVxuICAgICAqIG9uRnVsZmlsbGVkIGFuZCBvblJlamVjdGVkIGFyZSBvbmx5IGNhbGxlZCBvbmNlLlxuICAgICAqXG4gICAgICogTWFrZXMgbm8gZ3VhcmFudGVlcyBhYm91dCBhc3luY2hyb255LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRvUmVzb2x2ZShmbiwgc2VsZikge1xuICAgICAgICB2YXIgZG9uZSA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm4oXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2VsZiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZWplY3Qoc2VsZiwgcmVhc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgcmVqZWN0KHNlbGYsIGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIFByb21pc2UucHJvdG90eXBlWydjYXRjaCddID0gZnVuY3Rpb24ob25SZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0ZWQpO1xuICAgIH07XG5cbiAgICBQcm9taXNlLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB2YXIgcHJvbSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKG5vb3ApO1xuXG4gICAgICAgIGhhbmRsZSh0aGlzLCBuZXcgSGFuZGxlcihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgcHJvbSkpO1xuICAgICAgICByZXR1cm4gcHJvbTtcbiAgICB9O1xuXG4gICAgUHJvbWlzZS5wcm90b3R5cGVbJ2ZpbmFsbHknXSA9IGZpbmFsbHlDb25zdHJ1Y3RvcjtcblxuICAgIFByb21pc2UuYWxsID0gZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGlmICghYXJyIHx8IHR5cGVvZiBhcnIubGVuZ3RoID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm9taXNlLmFsbCBhY2NlcHRzIGFuIGFycmF5Jyk7XG4gICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFycik7XG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiByZXNvbHZlKFtdKTtcbiAgICAgICAgICAgIHZhciByZW1haW5pbmcgPSBhcmdzLmxlbmd0aDtcblxuICAgICAgICAgICAgZnVuY3Rpb24gcmVzKGksIHZhbCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgJiYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGhlbiA9IHZhbC50aGVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbi5jYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKGksIHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICByZXMoaSwgYXJnc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBQcm9taXNlLnJlc29sdmUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcbiAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgUHJvbWlzZS5yZWplY3QgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICByZWplY3QodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgUHJvbWlzZS5yYWNlID0gZnVuY3Rpb24odmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXNbaV0udGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4vLyBVc2UgcG9seWZpbGwgZm9yIHNldEltbWVkaWF0ZSBmb3IgcGVyZm9ybWFuY2UgZ2FpbnNcbiAgICBQcm9taXNlLl9pbW1lZGlhdGVGbiA9XG4gICAgICAgICh0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgICAgICBmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7XG4gICAgICAgICAgICB9KSB8fFxuICAgICAgICBmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgc2V0VGltZW91dEZ1bmMoZm4sIDApO1xuICAgICAgICB9O1xuXG4gICAgUHJvbWlzZS5fdW5oYW5kbGVkUmVqZWN0aW9uRm4gPSBmdW5jdGlvbiBfdW5oYW5kbGVkUmVqZWN0aW9uRm4oZXJyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdQb3NzaWJsZSBVbmhhbmRsZWQgUHJvbWlzZSBSZWplY3Rpb246JywgZXJyKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIEBzdXBwcmVzcyB7dW5kZWZpbmVkVmFyc30gKi9cbiAgICB2YXIgZ2xvYmFsTlMgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIHRoZSBvbmx5IHJlbGlhYmxlIG1lYW5zIHRvIGdldCB0aGUgZ2xvYmFsIG9iamVjdCBpc1xuICAgICAgICAvLyBgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKWBcbiAgICAgICAgLy8gSG93ZXZlciwgdGhpcyBjYXVzZXMgQ1NQIHZpb2xhdGlvbnMgaW4gQ2hyb21lIGFwcHMuXG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWw7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmFibGUgdG8gbG9jYXRlIGdsb2JhbCBvYmplY3QnKTtcbiAgICB9KSgpO1xuXG4gICAgaWYgKCEoJ1Byb21pc2UnIGluIGdsb2JhbE5TKSkge1xuICAgICAgICBnbG9iYWxOU1snUHJvbWlzZSddID0gUHJvbWlzZTtcbiAgICB9IGVsc2UgaWYgKCFnbG9iYWxOUy5Qcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddKSB7XG4gICAgICAgIGdsb2JhbE5TLlByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10gPSBmaW5hbGx5Q29uc3RydWN0b3I7XG4gICAgfVxuXG59KSkpOyIsImltcG9ydCB7IEFkZHJlc3MgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsL21vZGVscy9hZGRyZXNzXCI7XG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbC9tb2RlbHMvZXJyb3JSZXNwb25zZVwiO1xuaW1wb3J0IHsgU2hvcHBpbmdjYXJ0U2VydmljZSB9IGZyb20gXCIuL3Nob3BwaW5nY2FydFNlcnZpY2VcIjtcbmltcG9ydCB7IENoZWNrb3V0U2VydmljZSB9IGZyb20gXCIuL2NoZWNrb3V0U2VydmljZVwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi92YWxpZGF0aW9uU2VydmljZVwiO1xuXG4vKipcbiAqIENvbnRyb2xzIHRoZSBjaGVja291dCBmb3JtXG4gKi9cbmNsYXNzIENoZWNrb3V0Q29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gY2hlY2tvdXRGb3JtRGl2RWxlbWVudFxuICAgICAqIEBwYXJhbSB7U2hvcHBpbmdjYXJ0U2VydmljZX0gc2hvcHBpbmdjYXJ0U2VydmljZVxuICAgICAqIEBwYXJhbSB7Q2hlY2tvdXRTZXJ2aWNlfSBjaGVja291dFNlcnZpY2VcbiAgICAgKiBAcGFyYW0ge1ZhbGlkYXRpb25TZXJ2aWNlfSB2YWxpZGF0aW9uU2VydmljZVxuICAgICAqIEBwYXJhbSB7R2xvYmFsaXNhdGlvblNlcnZpY2V8bnVsbH0gZ2xvYmFsaXNhdGlvblNlcnZpY2VcbiAgICAgKiBAcGFyYW0ge0Vycm9yQ29udHJvbGxlcnxudWxsfSBlcnJvckZvcm1Db250cm9sbGVyXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2hlY2tvdXRGb3JtRGl2RWxlbWVudCwgc2hvcHBpbmdjYXJ0U2VydmljZSwgY2hlY2tvdXRTZXJ2aWNlLCB2YWxpZGF0aW9uU2VydmljZSwgZ2xvYmFsaXNhdGlvblNlcnZpY2UsIGVycm9yRm9ybUNvbnRyb2xsZXIpIHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIC8vU2VsZWN0IHNvbWUgZWxlbWVudHNcbiAgICAgICAgaWYoIWNoZWNrb3V0Rm9ybURpdkVsZW1lbnQgfHwgY2hlY2tvdXRGb3JtRGl2RWxlbWVudC50YWdOYW1lICE9PSBcIkZPUk1cIikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2hlY2tvdXRDb250cm9sbGVyOiBFeHBlY3RpbmcgYSBmb3JtIGVsZW1lbnQgdXBvbiBjb25zdHJ1Y3Rpb24gdGhhdCBob2xkcyBhbGwgY2hlY2tvdXQgZm9ybSBlbGVtZW50cy4gQ2hlY2tvdXRDb250cm9sbGVyIHN0b3BwZWQgd29ya2luZycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NoZWNrb3V0Rm9ybSA9IGNoZWNrb3V0Rm9ybURpdkVsZW1lbnQ7XG5cbiAgICAgICAgLy9TZWxlY3QgZWxlbWVudHMuXG4gICAgICAgIGlmKCF0aGlzLnNlbGVjdEFuZFZhbGlkYXRlRWxlbWVudCgnLmpzLWFkZC1jb3Vwb24nLCAnQlVUVE9OJywgZnVuY3Rpb24oZWxlbWVudCkgeyBzZWxmLl9hZGRDb3Vwb25CdXR0b24gPSBlbGVtZW50IH0pKSByZXR1cm47XG4gICAgICAgIGlmKCF0aGlzLnNlbGVjdEFuZFZhbGlkYXRlRWxlbWVudCgnLmpzLWNvdXBvbiBpbnB1dCcsICdJTlBVVCcsIGZ1bmN0aW9uKGVsZW1lbnQpIHsgc2VsZi5fY291cG9uSW5wdXQgPSBlbGVtZW50IH0pKSByZXR1cm47XG4gICAgICAgIGlmKCF0aGlzLnNlbGVjdEFuZFZhbGlkYXRlRWxlbWVudCgnLmpzLWNvdXBvbi1jb2RlcycsICdVTCcsIGZ1bmN0aW9uKGVsZW1lbnQpIHsgc2VsZi5fY291cG9uQ29kZXNMaXN0ID0gZWxlbWVudCB9KSkgcmV0dXJuO1xuICAgICAgICBpZighdGhpcy5zZWxlY3RBbmRWYWxpZGF0ZUVsZW1lbnQoJy5qcy1zdWJtaXQnLCAnSU5QVVQnLCBmdW5jdGlvbihlbGVtZW50KSB7IHNlbGYuX3N1Ym1pdEJ1dHRvbiA9IGVsZW1lbnQgfSkpIHJldHVybjtcbiAgICAgICAgaWYoIXRoaXMuc2VsZWN0QW5kVmFsaWRhdGVFbGVtZW50KCcuanMtdG90YWwtZXgtdmF0LWFuZC1kaXNjb3VudHMnLCAnVEQnLCBmdW5jdGlvbihlbGVtZW50KSB7IHNlbGYuX3RvdGFsRXhWYXRBbmREaXNjb3VudHNDb250YWluZXIgPSBlbGVtZW50IH0pKSByZXR1cm47XG4gICAgICAgIGlmKCF0aGlzLnNlbGVjdEFuZFZhbGlkYXRlRWxlbWVudCgnLmpzLXRvdGFsLWV4LXZhdCcsICdURCcsIGZ1bmN0aW9uKGVsZW1lbnQpIHsgc2VsZi5fdG90YWxFeFZhdENvbnRhaW5lciA9IGVsZW1lbnQgfSkpIHJldHVybjtcbiAgICAgICAgaWYoIXRoaXMuc2VsZWN0QW5kVmFsaWRhdGVFbGVtZW50KCcuanMtdmF0LXRvdGFsJywgJ1NQQU4nLCBmdW5jdGlvbihlbGVtZW50KSB7IHNlbGYuX3ZhdENvbnRhaW5lciA9IGVsZW1lbnQgfSkpIHJldHVybjtcbiAgICAgICAgaWYoIXRoaXMuc2VsZWN0QW5kVmFsaWRhdGVFbGVtZW50KCcuanMtdmF0LXBlcmNlbnRhZ2UnLCAnU1BBTicsIGZ1bmN0aW9uKGVsZW1lbnQpIHsgc2VsZi5fdmF0UGVyY2VudGFnZUNvbnRhaW5lciA9IGVsZW1lbnQgfSkpIHJldHVybjtcbiAgICAgICAgaWYoIXRoaXMuc2VsZWN0QW5kVmFsaWRhdGVFbGVtZW50KCcuanMtc2hpcHBpbmctY29zdHMnLCAnVEQnLCBmdW5jdGlvbihlbGVtZW50KSB7IHNlbGYuX3NoaXBwaW5nQ29zdHNDb250YWluZXIgPSBlbGVtZW50IH0pKSByZXR1cm47XG4gICAgICAgIGlmKCF0aGlzLnNlbGVjdEFuZFZhbGlkYXRlRWxlbWVudCgnLmpzLXRvdGFsJywgJ1REJywgZnVuY3Rpb24oZWxlbWVudCkgeyBzZWxmLl90b3RhbENvbnRhaW5lciA9IGVsZW1lbnQgfSkpIHJldHVybjtcblxuICAgICAgICAvL1NlbGVjdCBvcHRpb25hbCBlbGVtZW50c1xuICAgICAgICB0aGlzLl9ndWVzdExhbmd1YWdlU2VsZWN0V3JhcHBlciA9IHRoaXMuX2NoZWNrb3V0Rm9ybS5xdWVyeVNlbGVjdG9yKCcuanMtbGFuZ3VhZ2Utc2VsZWN0LXdyYXBwZXInKTtcblxuICAgICAgICAvL0NoZWNrIHRoYXQgd2UgaGF2ZSB0aGUgc2hvcHBpbmcgY2FydCBzZXJ2aWNlXG4gICAgICAgIHRoaXMuX2NoZWNrb3V0U2VydmljZSA9IGNoZWNrb3V0U2VydmljZTtcbiAgICAgICAgaWYoIWNoZWNrb3V0U2VydmljZSB8fCAhKGNoZWNrb3V0U2VydmljZSBpbnN0YW5jZW9mIENoZWNrb3V0U2VydmljZSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NoZWNrb3V0Q29udHJvbGxlcjogVGhlIENoZWNrb3V0Q29udHJvbGxlciB3YXMgZXhwZWN0ZWQgdG8gZ2V0IGFuIGluc3RhbmNlIG9mIENoZWNrb3V0U2VydmljZSwgYnV0IGRpZCBub3QgZ2V0IG9uZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2dsb2JhbGlzYXRpb25TZXJ2aWNlID0gZ2xvYmFsaXNhdGlvblNlcnZpY2U7XG4gICAgICAgIGlmKCFnbG9iYWxpc2F0aW9uU2VydmljZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUmVnaXN0ZXJDb250cm9sbGVyOiBUaGUgUmVnaXN0ZXIgZm9ybSB3YXMgZXhwZWN0ZWQgdG8gZ2V0IGFuIGluc3RhbmNlIG9mIFJlZ2lzdGVyU2VydmljZSwgYnV0IGRpZCBub3QgZ2V0IG9uZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vQ2hlY2sgdGhhdCB3ZSBoYXZlIHRoZSBzaG9wcGluZyBjYXJ0IHNlcnZpY2VcbiAgICAgICAgdGhpcy5fc2hvcHBpbmdjYXJ0U2VydmljZSA9IHNob3BwaW5nY2FydFNlcnZpY2U7XG4gICAgICAgIGlmKCFzaG9wcGluZ2NhcnRTZXJ2aWNlIHx8ICEoc2hvcHBpbmdjYXJ0U2VydmljZSBpbnN0YW5jZW9mIFNob3BwaW5nY2FydFNlcnZpY2UpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDaGVja291dENvbnRyb2xsZXI6IFRoZSBDaGVja291dENvbnRyb2xsZXIgd2FzIGV4cGVjdGVkIHRvIGdldCBhbiBpbnN0YW5jZSBvZiBTaG9wcGluZ2NhcnRTZXJ2aWNlLCBidXQgZGlkIG5vdCBnZXQgb25lLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9DaGVjayB0aGF0IHdlIGhhdmUgdGhlIHNob3BwaW5nIGNhcnQgc2VydmljZVxuICAgICAgICB0aGlzLl92YWxpZGF0aW9uU2VydmljZSA9IHZhbGlkYXRpb25TZXJ2aWNlO1xuICAgICAgICBpZighdmFsaWRhdGlvblNlcnZpY2UgfHwgISh2YWxpZGF0aW9uU2VydmljZSBpbnN0YW5jZW9mIFZhbGlkYXRpb25TZXJ2aWNlKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2hlY2tvdXRDb250cm9sbGVyOiBUaGUgQ2hlY2tvdXRDb250cm9sbGVyIHdhcyBleHBlY3RlZCB0byBnZXQgYW4gaW5zdGFuY2Ugb2YgdmFsaWRhdGlvblNlcnZpY2UsIGJ1dCBkaWQgbm90IGdldCBvbmUuJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvL0JpbmQgdGhlIGVycm9yIGxpc3QgY29udHJvbGxlciBpZiB3ZSBoYXZlIGFueS5cbiAgICAgICAgdGhpcy5fZXJyb3JGb3JtQ29udHJvbGxlciA9IGVycm9yRm9ybUNvbnRyb2xsZXI7XG4gICAgICAgIGlmKCF0aGlzLl9lcnJvckZvcm1Db250cm9sbGVyICYmICEoZXJyb3JGb3JtQ29udHJvbGxlciBpbnN0YW5jZW9mIEVycm9yRm9ybUNvbnRyb2xsZXIpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDaGVja291dENvbnRyb2xsZXI6IElmIHlvdSBzcGVjaWZ5IGFuIGVycm9yRm9ybUNvbnRyb2xsZXIsIGl0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgZXJyb3JGb3JtQ29udHJvbGxlcicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZG9tUGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICB0aGlzLl9oaWRkZW5DbGFzcyA9ICd1LWhpZGRlbic7IC8vVGhlIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIHRoaW5ncyB0byBoaWRlIHRoZW0uXG5cbiAgICAgICAgLy9CaW5kIGV2ZW50IGxpc3RlbmVycyB0byB0aGlzIGNsYXNzLlxuICAgICAgICB0aGlzLl9mb3JtU3VibWl0ID0gdGhpcy5fZm9ybVN1Ym1pdC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9mb3JtQ2hhbmdlZCA9IHRoaXMuX2Zvcm1DaGFuZ2VkLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuX3JlbW92ZUNvdXBvbkNvZGVDbGlja2VkID0gdGhpcy5fcmVtb3ZlQ291cG9uQ29kZUNsaWNrZWQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5faGFuZGxlRXJyb3JSZXNwb25zZSA9IHRoaXMuX2hhbmRsZUVycm9yUmVzcG9uc2UuYmluZCh0aGlzKTtcblxuICAgICAgICAvL0JpbmQgb3RoZXIgZnVuY3Rpb24gdG8gdGhpcyBjbGFzc1xuICAgICAgICB0aGlzLl9jcmVhdGVIdG1sRWxlbWVudEZyb21TdHJpbmcgPSB0aGlzLl9jcmVhdGVIdG1sRWxlbWVudEZyb21TdHJpbmcuYmluZCh0aGlzKTtcblxuICAgICAgICAvL0VuYWJsZSB0aGUgbGlzdGVuZXJzLlxuICAgICAgICB0aGlzLmNvbnRyb2xMaXN0ZW5lcnModHJ1ZSk7XG5cbiAgICAgICAgdGhpcy5fZ3Vlc3RDb3VudHJ5Q2hhbmdlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdOYW1lXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gdmFsaWRDYWxsQmFjay4gQ2FsbGVkIHdpdGggdGhlIGZvdW5kIHZhbGlkIGVsZW1lbnQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzZWxlY3RBbmRWYWxpZGF0ZUVsZW1lbnQoc2VsZWN0b3IsIHRhZ05hbWUsIHZhbGlkQ2FsbEJhY2spXG4gICAge1xuICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuX2NoZWNrb3V0Rm9ybS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgaWYoIWVsZW1lbnQgfHwgZWxlbWVudC50YWdOYW1lICE9PSB0YWdOYW1lKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDaGVja291dENvbnRyb2xsZXI6IEV4cGVjdGluZyB0aGUgQ2hlY2tvdXRGb3JtRGl2RWxlbWVudCB0byBoYXZlIGFuICcrdGFnTmFtZSsnIHdpdGggc2VsZWN0b3IgJytzZWxlY3RvcisnLiBCdXQgY291bGQgbm90IGZpbmQgdGhhdCBlbGVtZW50LiBDaGVja291dENvbnRyb2xsZXIgc3RvcHBlZCB3b3JraW5nJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRDYWxsQmFjay5jYWxsKHRoaXMsIGVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKi9cbiAgICBjb250cm9sTGlzdGVuZXJzKGVuYWJsZWQpXG4gICAge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMuX3N1Ym1pdEJ1dHRvbi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2Zvcm1TdWJtaXQpO1xuICAgICAgICB0aGlzLl9hZGRDb3Vwb25CdXR0b24ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9mb3JtU3VibWl0KTtcbiAgICAgICAgdGhpcy5fY2hlY2tvdXRGb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuX2Zvcm1DaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5fY291cG9uQ29kZXNMaXN0LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZWxldGUnKS5mb3JFYWNoKGZ1bmN0aW9uKGRlbGV0ZUJ1dHRvbkVsZW1lbnQpIHtcbiAgICAgICAgICAgIGRlbGV0ZUJ1dHRvbkVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzZWxmLl9yZW1vdmVDb3Vwb25Db2RlQ2xpY2tlZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmKGVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1Ym1pdEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2Zvcm1TdWJtaXQpO1xuICAgICAgICAgICAgdGhpcy5fYWRkQ291cG9uQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fZm9ybVN1Ym1pdCk7XG4gICAgICAgICAgICB0aGlzLl9jaGVja291dEZvcm0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5fZm9ybUNoYW5nZWQpO1xuICAgICAgICAgICAgdGhpcy5fY291cG9uQ29kZXNMaXN0LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZWxldGUnKS5mb3JFYWNoKGZ1bmN0aW9uKGRlbGV0ZUJ1dHRvbkVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGVCdXR0b25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2VsZi5fcmVtb3ZlQ291cG9uQ29kZUNsaWNrZWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgb24gZm9ybSBzdWJtaXQuIFdoZW4gdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgZm9ybSB3b24ndCBiZSBzdWJtaXR0ZWQuXG4gICAgICogV2UgbWFpbmx5IHVzZSBpdCBmb3IgdmFsaWRhdGlvblxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgYXN5bmMgX2Zvcm1TdWJtaXQoZXZlbnQpXG4gICAge1xuICAgICAgICAvL0NhbmNlbCB0aGUgZXZlbnQuIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGNvdW50cnkgaXMgdmFsaWQgZmlyc3RcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgaWYoZXZlbnQuY3VycmVudFRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2pzLXN1Ym1pdCcpKSB7XG4gICAgICAgICAgICB0aGlzLl92YWxpZGF0ZUZvcm0oKS50aGVuKFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9jaGVja291dEZvcm0uc3VibWl0KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgfSBlbHNlIGlmKGV2ZW50LmN1cnJlbnRUYXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqcy1hZGQtY291cG9uJykpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZENvdXBvbkNvZGUoKS50aGVuKGZ1bmN0aW9uKGNvdXBvbikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdhZGRpbmcgY291cG9uIHRvIGxpc3QgZm9yIHVzZXInKVxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9mb3JtQ2hhbmdlZChldmVudClcbiAgICB7XG4gICAgICAgIC8vIHRoaXMuX3ZhbGlkYXRlRm9ybSgpLmNhdGNoKGZ1bmN0aW9uKCkge30pO1xuICAgICAgICBpZihldmVudC50YXJnZXQubmFtZSkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5uYW1lLmluY2x1ZGVzKCdzaGlwcGluZycpKSB7XG4gICAgICAgICAgICAgICAgLy9PbmUgb2YgdGhlIHNoaXBwaW5nIGlucHV0cyBoYXMgYmVlbiBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlU2hpcHBpbmdDb3N0cygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmKGV2ZW50LnRhcmdldC5uYW1lID09PSAnY291bnRyeScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ndWVzdENvdW50cnlDaGFuZ2VkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgc2hpcHBpbmcgY29zdHMuXG4gICAgICovXG4gICAgX3VwZGF0ZVNoaXBwaW5nQ29zdHMoKVxuICAgIHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEodGhpcy5fY2hlY2tvdXRGb3JtKTtcblxuICAgICAgICBsZXQgYWRkcmVzcyA9IG5ldyBBZGRyZXNzKCk7XG4gICAgICAgIGFkZHJlc3Muc3RyZWV0ID0gZm9ybURhdGEuZ2V0KCdzaGlwcGluZ19zdHJlZXQnKTtcbiAgICAgICAgYWRkcmVzcy5ob3VzZV9udW1iZXIgPSBmb3JtRGF0YS5nZXQoJ3NoaXBwaW5nX2hvdXNlX251bWJlcicpO1xuICAgICAgICBhZGRyZXNzLnBvc3RhbF9jb2RlID0gZm9ybURhdGEuZ2V0KCdzaGlwcGluZ19wb3N0YWxfY29kZScpO1xuICAgICAgICBhZGRyZXNzLmNpdHkgPSBmb3JtRGF0YS5nZXQoJ3NoaXBwaW5nX2NpdHknKTtcbiAgICAgICAgYWRkcmVzcy5waG9uZSA9IGZvcm1EYXRhLmdldCgnc2hpcHBpbmdfcGhvbmUnKTtcbiAgICAgICAgYWRkcmVzcy5jb3VudHJ5SXNvMyA9IGZvcm1EYXRhLmdldCgnc2hpcHBpbmdfY291bnRyeScpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCd1cGRhdGluZyBzaGlwcGluZyBjb3N0cyBmb3IgYWRkcmVzczogJywgYWRkcmVzcyk7XG5cbiAgICAgICAgdGhpcy5fY2hlY2tvdXRTZXJ2aWNlLnNldFNoaXBwaW5nQWRkcmVzcyhhZGRyZXNzKS50aGVuKGZ1bmN0aW9uKCkge30pXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgLyoqIEBwYXJhbSB7RXJyb3JSZXNwb25zZX0gcmVzcG9uc2UgKiovXG4gICAgICAgICAgICBzZWxmLl9oYW5kbGVFcnJvclJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgICB9KS5maW5hbGx5KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5fY2hlY2tvdXRTZXJ2aWNlLmdldENoZWNrb3V0SW5mb3JtYXRpb24oKS50aGVuKFxuICAgICAgICAgICAgICAgIC8qKiBAcGFyYW0ge0NoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZX0gY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlICoqL1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGNoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl91cGRhdGVGb3JtVXNpbmdDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UoY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2V9IGNoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3VwZGF0ZUZvcm1Vc2luZ0NoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZShjaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UpXG4gICAge1xuICAgICAgICBjb25zb2xlLmxvZygndXBkYXRlIGZvcm0nKTtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuX3RvdGFsRXhWYXRBbmREaXNjb3VudHNDb250YWluZXIuaW5uZXJIVE1MID0gY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlLnRvdGFsRXhWYXRBbmREaXNjb3VudHNGb3JtYXR0ZWQ7XG4gICAgICAgIHRoaXMuX3RvdGFsRXhWYXRDb250YWluZXIuaW5uZXJIVE1MID0gY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlLnRvdGFsRXhWYXRGb3JtYXR0ZWQ7XG4gICAgICAgIHRoaXMuX3ZhdENvbnRhaW5lci5pbm5lckhUTUwgPSBjaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UudmF0VG90YWxGb3JtYXR0ZWQ7XG4gICAgICAgIHRoaXMuX3ZhdFBlcmNlbnRhZ2VDb250YWluZXIuaW5uZXJIVE1MID0gY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlLnZhdFBlcmNlbnRhZ2U7XG4gICAgICAgIHRoaXMuX3NoaXBwaW5nQ29zdHNDb250YWluZXIuaW5uZXJIVE1MID0gY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlLnNoaXBwaW5nQ29zdHNGb3JtYXR0ZWQ7XG4gICAgICAgIHRoaXMuX3RvdGFsQ29udGFpbmVyLmlubmVySFRNTCA9IGNoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZS50b3RhbEZvcm1hdHRlZDtcblxuICAgICAgICAvL0RlbGV0ZSBhbGwgY291cG9uIGNvZGVzXG4gICAgICAgIHdoaWxlKHRoaXMuX2NvdXBvbkNvZGVzTGlzdC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9jb3Vwb25Db2Rlc0xpc3QucmVtb3ZlQ2hpbGQoc2VsZi5fY291cG9uQ29kZXNMaXN0LmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIC8vQWRkIHRoZSBjb3Vwb24gY29kZXNcbiAgICAgICAgY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlLmNvdXBvbkNvZGVzLmZvckVhY2goZnVuY3Rpb24oY291cG9uQ29kZSkge1xuICAgICAgICAgICAgbGV0IGNvdXBvbkNvZGVMaXN0SXRlbSA9IHNlbGYuX2NyZWF0ZUh0bWxFbGVtZW50RnJvbVN0cmluZygnPGxpIGRhdGEtY29kZT1cIicrY291cG9uQ29kZSsnXCIgZHVzaz1cIicrY291cG9uQ29kZSsnXCI+Jytjb3Vwb25Db2RlKyc8c3BhbiBjbGFzcz1cImRlbGV0ZVwiPiZ0aW1lczs8L3NwYW4+PC9saT4nKTtcbiAgICAgICAgICAgIHNlbGYuX2NvdXBvbkNvZGVzTGlzdC5hcHBlbmRDaGlsZChjb3Vwb25Db2RlTGlzdEl0ZW0pO1xuICAgICAgICAgICAgY291cG9uQ29kZUxpc3RJdGVtLnF1ZXJ5U2VsZWN0b3IoJy5kZWxldGUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNlbGYuX3JlbW92ZUNvdXBvbkNvZGVDbGlja2VkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7UHJvbWlzZTw+IHwgUHJvbWlzZX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF92YWxpZGF0ZUZvcm0oKSB7XG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShzZWxmLl9jaGVja291dEZvcm0pO1xuICAgICAgICAgICAgc2VsZi5fdmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVDaGVja291dEZvcm0oZm9ybURhdGEpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmKHNlbGYuX2Vycm9yRm9ybUNvbnRyb2xsZXIpIHNlbGYuX2Vycm9yRm9ybUNvbnRyb2xsZXIuY2xlYXJBbGxFcnJvcnMoKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgICAgIH0pLmNhdGNoKFxuICAgICAgICAgICAgICAgIC8qKiBAcGFyYW0ge0Vycm9yUmVzcG9uc2V9IGVycm9yUmVzcG9uc2UgICoqL1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vTG9nZ2luZyBpcyBoYW5kbGVkIGluIHRoZSB2YWxpZGF0aW9uU2VydmljZVxuICAgICAgICAgICAgICAgICAgICBpZihzZWxmLl9lcnJvckZvcm1Db250cm9sbGVyKSBzZWxmLl9lcnJvckZvcm1Db250cm9sbGVyLmNsZWFyQWxsRXJyb3JzKCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZUVycm9yUmVzcG9uc2UoZXJyb3JSZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIGFkZCBhIGNvdXBvbiBjb2RlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7UHJvbWlzZTw+IHwgUHJvbWlzZX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9hZGRDb3Vwb25Db2RlKClcbiAgICB7XG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGxldCBlbnRlcmVkQ291cG9uID0gc2VsZi5fY291cG9uSW5wdXQudmFsdWU7XG5cbiAgICAgICAgICAgIHNlbGYuX2NoZWNrb3V0U2VydmljZS5hZGRDb3Vwb24oZW50ZXJlZENvdXBvbikudGhlbihcbiAgICAgICAgICAgICAgICAvKiogQHBhcmFtIHtDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2V9IGNoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZSAgKiovXG4gICAgICAgICAgICBmdW5jdGlvbiAoY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYoc2VsZi5fZXJyb3JGb3JtQ29udHJvbGxlcikgc2VsZi5fZXJyb3JGb3JtQ29udHJvbGxlci5jbGVhckFsbEVycm9ycygpO1xuICAgICAgICAgICAgICAgIHNlbGYuX3VwZGF0ZUZvcm1Vc2luZ0NoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZShjaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIHNlbGYuX2NvdXBvbklucHV0LnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShlbnRlcmVkQ291cG9uKVxuICAgICAgICAgICAgfSkuY2F0Y2goXG4gICAgICAgICAgICAgICAgLyoqIEBwYXJhbSB7RXJyb3JSZXNwb25zZX0gZXJyb3JSZXNwb25zZSAgKiovXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9Mb2dnaW5nIGlzIGhhbmRsZWQgaW4gdGhlIHZhbGlkYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIGlmKHNlbGYuX2Vycm9yRm9ybUNvbnRyb2xsZXIpIHNlbGYuX2Vycm9yRm9ybUNvbnRyb2xsZXIuY2xlYXJBbGxFcnJvcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlRXJyb3JSZXNwb25zZShlcnJvclJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY291cG9uQ29kZVxuICAgICAqL1xuICAgIF9yZW1vdmVDb3Vwb25Db2RlKGNvdXBvbkNvZGUpXG4gICAge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBzZWxmLl9jaGVja291dFNlcnZpY2UucmVtb3ZlQ291cG9uKGNvdXBvbkNvZGUpLnRoZW4oXG4gICAgICAgICAgICAgICAgLyoqIEBwYXJhbSB7Q2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlfSBjaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UgKiovXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGNoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBpZihzZWxmLl9lcnJvckZvcm1Db250cm9sbGVyKSBzZWxmLl9lcnJvckZvcm1Db250cm9sbGVyLmNsZWFyQWxsRXJyb3JzKCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3VwZGF0ZUZvcm1Vc2luZ0NoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZShjaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvdXBvbkNvZGUpXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goXG4gICAgICAgICAgICAgICAgLyoqIEBwYXJhbSB7RXJyb3JSZXNwb25zZX0gZXJyb3JSZXNwb25zZSAgKiovXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9Mb2dnaW5nIGlzIGhhbmRsZWQgaW4gdGhlIHZhbGlkYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIGlmKHNlbGYuX2Vycm9yRm9ybUNvbnRyb2xsZXIpIHNlbGYuX2Vycm9yRm9ybUNvbnRyb2xsZXIuY2xlYXJBbGxFcnJvcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlRXJyb3JSZXNwb25zZShlcnJvclJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9yZW1vdmVDb3Vwb25Db2RlQ2xpY2tlZChldmVudClcbiAgICB7XG4gICAgICAgIGxldCBjb2RlID0gZXZlbnQuY3VycmVudFRhcmdldC5wYXJlbnRFbGVtZW50LmRhdGFzZXQuY29kZTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlQ291cG9uQ29kZShjb2RlKS50aGVuKGZ1bmN0aW9uKCkge30pLmNhdGNoKGZ1bmN0aW9uKCkge30pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgZ3Vlc3QgbGFuZ3VhZ2Ugc2VsZWN0XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9ndWVzdENvdW50cnlDaGFuZ2VkKCkge1xuICAgICAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEodGhpcy5fY2hlY2tvdXRGb3JtKTtcbiAgICAgICAgbGV0IHNlbGVjdCA9IHRoaXMuX2d1ZXN0TGFuZ3VhZ2VTZWxlY3RXcmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJ3NlbGVjdFtuYW1lPVwibGFuZ3VhZ2VcIl0nKTtcbiAgICAgICAgaWYoIWZvcm1EYXRhLmhhcygnY291bnRyeScpIHx8ICF0aGlzLl9ndWVzdExhbmd1YWdlU2VsZWN0V3JhcHBlciB8fCAhc2VsZWN0KSByZXR1cm47IC8vRG8gbm90aGluZyBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIChub3QgYSBndWVzdCkuXG5cbiAgICAgICAgbGV0IGNvdW50cnlJc28zID0gZm9ybURhdGEuZ2V0KCdjb3VudHJ5Jyk7XG5cbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuX2dsb2JhbGlzYXRpb25TZXJ2aWNlLmdldExhbmd1YWdlc0ZvckNvdW50cnlXaXRoSXNvMyhjb3VudHJ5SXNvMykudGhlbihcbiAgICAgICAgICAgIC8qKiBAcGFyYW0geyBDb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UgfSBjb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UgKiovXG4gICAgICAgICAgICBmdW5jdGlvbihjb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBzZWxmLl9jbGVhckxhbmd1YWdlU2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgbGV0IGxhbmd1YWdlQ291bnQgPSBjb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UubGFuZ3VhZ2VzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsYW5ndWFnZUNvdW50OyBpbmRleCsrKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhbmd1YWdlID0gY291bnRyeUxhbmd1YWdlc1Jlc3BvbnNlLmxhbmd1YWdlc1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25FbGVtZW50ID0gc2VsZi5fY3JlYXRlSHRtbEVsZW1lbnRGcm9tU3RyaW5nKCc8b3B0aW9uIHZhbHVlPVwiJytsYW5ndWFnZS50aHJlZUxldHRlcklzb0xhbmd1YWdlTmFtZSsnXCI+JytsYW5ndWFnZS5uYXRpdmVOYW1lKyc8L29wdGlvbj4nKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKG9wdGlvbkVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmKGxhbmd1YWdlQ291bnQgPD0gMSkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9ndWVzdExhbmd1YWdlU2VsZWN0V3JhcHBlci5jbGFzc0xpc3QuYWRkKHNlbGYuX2hpZGRlbkNsYXNzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9ndWVzdExhbmd1YWdlU2VsZWN0V3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKHNlbGYuX2hpZGRlbkNsYXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICkuY2F0Y2goXG4gICAgICAgICAgICAvKiogQHBhcmFtIHsgRXJyb3JSZXNwb25zZSB9IGVycm9yUmVzcG9uc2UgKiovXG4gICAgICAgICAgICBmdW5jdGlvbihlcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvclJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgY3VzdG9tZXIgZGV0YWlscyBsYW5ndWFnZSBzZWxlY3RcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2NsZWFyTGFuZ3VhZ2VTZWxlY3QoKVxuICAgIHtcbiAgICAgICAgbGV0IHNlbGVjdCA9IHRoaXMuX2d1ZXN0TGFuZ3VhZ2VTZWxlY3RXcmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJ3NlbGVjdFtuYW1lPVwibGFuZ3VhZ2VcIl0nKTtcbiAgICAgICAgaWYoIXNlbGVjdCkgcmV0dXJuO1xuXG4gICAgICAgIHdoaWxlKHNlbGVjdC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNlbGVjdC5yZW1vdmVDaGlsZChzZWxlY3QuZmlyc3RDaGlsZCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIExvb3BzIG92ZXIgYW4gZXJyb3Igb2JqZWN0IHRoYXQgY29udGFpbnMgZmllbGQgbmFtZXMsIGFuZCBmb3IgZWFjaCBmaWVsZCBuYW1lIGl0IHdpbGxcbiAgICAgKiBjb2xsZWN0IHRoZSBlcnJvclJlc3BvbnNlIGZyb20gdGhlIGZpZWxkcyB2YWx1ZSAodGhhdCBpcyBhbiBhcnJheSkgYW5kIHBhc3MgdGhlbSB0byB0aGUgZXJyb3JcbiAgICAgKiBsaXN0IGNvbnRyb2xsZXIgd2hpY2ggZGlzcGxheXMgdGhlbVxuICAgICAqXG4gICAgICogQHBhcmFtIHtFcnJvclJlc3BvbnNlfSBlcnJvclJlc3BvbnNlIGFuIG9iamVjdCB3aGVyZSB0aGUgcHJvcGVydGllcyBhcmUgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgdGhhdCBjYXVzZSB0aGUgZXJyb3IuIFRoZWlyIHZhbHVlcyBtdXN0IGJlIGFycmF5cyBjb250YWluaW5nIGVycm9yIHN0cmluZ3MuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaGFuZGxlRXJyb3JSZXNwb25zZShlcnJvclJlc3BvbnNlKSB7XG4gICAgICAgIGlmKCF0aGlzLl9lcnJvckZvcm1Db250cm9sbGVyKSByZXR1cm47XG4gICAgICAgIGZvcihsZXQgZmllbGQgaW4gZXJyb3JSZXNwb25zZS5lcnJvcnMpIHtcbiAgICAgICAgICAgIGlmKCFlcnJvclJlc3BvbnNlLmVycm9ycy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGVycm9ycyA9IGVycm9yUmVzcG9uc2UuZXJyb3JzW2ZpZWxkXS5qb2luKCc8YnI+Jyk7XG4gICAgICAgICAgICB0aGlzLl9lcnJvckZvcm1Db250cm9sbGVyLnNldEZpZWxkRXJyb3IoZmllbGQsIGVycm9ycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tXG4gICAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAgICovXG4gICAgX2NyZWF0ZUh0bWxFbGVtZW50RnJvbVN0cmluZyhmcm9tKVxuICAgIHtcbiAgICAgICAgbGV0IGRvY3VtZW50ID0gdGhpcy5fZG9tUGFyc2VyLnBhcnNlRnJvbVN0cmluZyhmcm9tLCAndGV4dC9odG1sJyk7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5LmZpcnN0Q2hpbGQ7XG4gICAgfVxufVxuXG5leHBvcnQgeyBDaGVja291dENvbnRyb2xsZXIgfSIsImltcG9ydCB7IEVycm9yUmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsL21vZGVscy9lcnJvclJlc3BvbnNlXCI7XG5pbXBvcnQgeyBDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsL21vZGVscy9jaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2VcIjtcblxuLyoqXG4gKiBUaGUgY2hlY2tvdXQgc2VydmljZSBrbm93cyBob3cgdG8gZG8gYXBpIGNhbGxzIGFuZCBoYW5kbGUgdGhlIHJlc3BvbnNlcyBmcm9tIHRoZSBhcGkuXG4gKiBBbGwgcmVsYXRlZCB0byB0aGUgY2hlY2tvdXQgcHJvY2Vzcy4gSXQgZG9lcyBub3QgZG8gYW55dGhpbmcgd2l0aCB0aGUgRE9NLlxuICovXG5jbGFzcyBDaGVja291dFNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9iYXNlUm91dGUgPSAnLyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc2hpcHBpbmcgYWRkcmVzcyBzbyB0aGF0IHRoZSBzaGlwcGluZyBjb3N0cyBmb3IgZXhhbXBsZVxuICAgICAqIGNhbiBiZSBjYWxjdWxhdGVkIG9uIGFkdmFuY2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QWRkcmVzc30gYWRkcmVzc1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IFJlc29sdmVzIHdoZW4gdGhlIHNoaXBwaW5nIGFkZHJlc3MgaXMgc2V0LiBSZWplY3RzIHdpdGggYW4gRXJyb3JSZXNwb25zZSB3aGVuIGl0IGlzIG5vdC5cbiAgICAgKi9cbiAgICBzZXRTaGlwcGluZ0FkZHJlc3MoYWRkcmVzcylcbiAgICB7XG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgQWpheC5wb3N0KFxuICAgICAgICAgICAgICAgIHNlbGYuX2Jhc2VSb3V0ZSsnc2V0U2hpcHBpbmdBZGRyZXNzJyxcbiAgICAgICAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHhocikge1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmKEVycm9yUmVzcG9uc2UuaXMoeGhyLnJlc3BvbnNlLCBmYWxzZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZSA9IEVycm9yUmVzcG9uc2UuZnJvbUpzb25TdHJpbmcoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgbW9zdCByZWNlbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoZWNrb3V0IHByb2Nlc3NcbiAgICAgKi9cbiAgICBnZXRDaGVja291dEluZm9ybWF0aW9uKClcbiAgICB7XG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgQWpheC5nZXQoXG4gICAgICAgICAgICAgICAgc2VsZi5fYmFzZVJvdXRlKydnZXRDaGVja291dEluZm9ybWF0aW9uJyxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbih4aHIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHJlc3BvbnNlID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXNFcnJvclJlc3BvbnNlID0gRXJyb3JSZXNwb25zZS5pcyh4aHIucmVzcG9uc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlID0gQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlLmlzKHhoci5yZXNwb25zZSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmKCFpc0Vycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZSA9IENoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZS5mcm9tSnNvblN0cmluZyh4aHIucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NoZWNrb3V0U2VydmljZTpnZXRDaGVja291dEluZm9ybWF0aW9uIFRoZSByZXNwb25zZSB3YXMgbm90IGEgdmFsaWQgQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlOiAnK3hoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBFcnJvclJlc3BvbnNlLmZyb21Kc29uU3RyaW5nKHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY291cG9uXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBhZGRDb3Vwb24oY291cG9uKSB7XG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICBpZih0eXBlb2YgY291cG9uICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2hlY2tvdXRTZXJ2aWNlOmFkZENvdXBvbiBjb3VsZCBub3QgYWRkIGNvdXBvbi4gSXQgbXVzdCBiZSBhIHN0cmluZyBidXQgd2FzIG5vdC4nKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnQ2hlY2tvdXRTZXJ2aWNlOmFkZENvdXBvbiBjb3VsZCBub3QgYWRkIGNvdXBvbi4gSXQgbXVzdCBiZSBhIHN0cmluZyBidXQgd2FzIG5vdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIEFqYXgucG9zdChcbiAgICAgICAgICAgICAgICBzZWxmLl9iYXNlUm91dGUrJ2FkZENvdXBvbkNvZGUnLFxuICAgICAgICAgICAgICAgIHsnY291cG9uJzogY291cG9ufSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbih4aHIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHJlc3BvbnNlID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXNFcnJvclJlc3BvbnNlID0gRXJyb3JSZXNwb25zZS5pcyh4aHIucmVzcG9uc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlID0gQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlLmlzKHhoci5yZXNwb25zZSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmKCFpc0Vycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZSA9IENoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZS5mcm9tSnNvblN0cmluZyh4aHIucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NoZWNrb3V0U2VydmljZTphZGRDb3Vwb24gVGhlIHJlc3BvbnNlIHdhcyBub3QgYSB2YWxpZCBDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2U6ICcreGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZSA9IEVycm9yUmVzcG9uc2UuZnJvbUpzb25TdHJpbmcoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY291cG9uXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICByZW1vdmVDb3Vwb24oY291cG9uKSB7XG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICBpZih0eXBlb2YgY291cG9uICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2hlY2tvdXRTZXJ2aWNlOnJlbW92ZUNvdXBvbiBjb3VsZCBub3QgcmVtb3ZlIGNvdXBvbi4gSXQgbXVzdCBiZSBhIHN0cmluZyBidXQgd2FzIG5vdC4nLCBjb3Vwb24pO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdDaGVja291dFNlcnZpY2U6cmVtb3ZlQ291cG9uIGNvdWxkIG5vdCByZW1vdmUgY291cG9uLiBJdCBtdXN0IGJlIGEgc3RyaW5nIGJ1dCB3YXMgbm90LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgQWpheC5wb3N0KFxuICAgICAgICAgICAgICAgIHNlbGYuX2Jhc2VSb3V0ZSsncmVtb3ZlQ291cG9uQ29kZScsXG4gICAgICAgICAgICAgICAgeydjb3Vwb24nOiBjb3Vwb259LFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHhocikge1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpc0Vycm9yUmVzcG9uc2UgPSBFcnJvclJlc3BvbnNlLmlzKHhoci5yZXNwb25zZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXNDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UgPSBDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UuaXMoeGhyLnJlc3BvbnNlLCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYoIWlzRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNDaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlID0gQ2hlY2tvdXRJbmZvcm1hdGlvblJlc3BvbnNlLmZyb21Kc29uU3RyaW5nKHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjaGVja291dEluZm9ybWF0aW9uUmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2hlY2tvdXRTZXJ2aWNlOnJlbW92ZUNvdXBvbiBUaGUgcmVzcG9uc2Ugd2FzIG5vdCBhIHZhbGlkIENoZWNrb3V0SW5mb3JtYXRpb25SZXNwb25zZTogJyt4aHIucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gRXJyb3JSZXNwb25zZS5mcm9tSnNvblN0cmluZyh4aHIucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgQ2hlY2tvdXRTZXJ2aWNlIH0iLCIvKipcbiAqIENvbnRyb2xzIGEgZGl2IHdpdGggYW4gdWwgaW4gaXQgdG8gc2hvdyBlcnJvcnMgb3Igbm90XG4gKi9cbmNsYXNzIEVycm9yQ29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3IoKVxuICAgIHtcbiAgICAgICAgdGhpcy5fY2xhc3NUb0hpZGUgPSAndS1oaWRkZW4nO1xuICAgICAgICB0aGlzLl9lcnJvckVsZW1lbnRJZFN1ZmZpeCA9ICdfZXJyb3InO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZFNlbGVjdG9yXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGVycm9yXG4gICAgICovXG4gICAgc2V0RmllbGRFcnJvcihmaWVsZFNlbGVjdG9yLCBlcnJvcilcbiAgICB7XG4gICAgICAgIGxldCBzZWxlY3RvciA9ICcjJytmaWVsZFNlbGVjdG9yK3RoaXMuX2Vycm9yRWxlbWVudElkU3VmZml4O1xuICAgICAgICBsZXQgZXJyb3JFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgIGlmKCFlcnJvckVsZW1lbnQpIHJldHVybjtcblxuICAgICAgICBlcnJvckVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9jbGFzc1RvSGlkZSk7XG4gICAgICAgIGVycm9yRWxlbWVudC5pbm5lclRleHQgPSBlcnJvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRTZWxlY3RvclxuICAgICAqL1xuICAgIGNsZWFyRmllbGRFcnJvcihmaWVsZFNlbGVjdG9yKSB7XG4gICAgICAgIGxldCBzZWxlY3RvciA9ICcjJytmaWVsZFNlbGVjdG9yK3RoaXMuX2Vycm9yRWxlbWVudElkU3VmZml4O1xuICAgICAgICBsZXQgZXJyb3JFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgIGlmICghZXJyb3JFbGVtZW50KSByZXR1cm47XG5cbiAgICAgICAgZXJyb3JFbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5fY2xhc3NUb0hpZGUpO1xuICAgICAgICBlcnJvckVsZW1lbnQuaW5uZXJUZXh0ID0gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIGVycm9yc1xuICAgICAqL1xuICAgIGNsZWFyQWxsRXJyb3JzKCkge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZCQ9Jyt0aGlzLl9lcnJvckVsZW1lbnRJZFN1ZmZpeCsnXScpLmZvckVhY2goZnVuY3Rpb24oZXJyb3JFbGVtZW50KSB7XG4gICAgICAgICAgICBlcnJvckVsZW1lbnQuY2xhc3NMaXN0LmFkZChzZWxmLl9jbGFzc1RvSGlkZSk7XG4gICAgICAgICAgICBlcnJvckVsZW1lbnQuaW5uZXJUZXh0ID0gJyc7XG4gICAgICAgIH0pXG4gICAgfVxufVxuXG5leHBvcnQgeyBFcnJvckNvbnRyb2xsZXIgfSIsIi8qKlxuICogU2hvcHBpbmcgY2FydCBmb3JtIGNvbnRyb2xsZXIuXG4gKi9cbmNsYXNzIFNob3BwaW5nY2FydENvbnRyb2xsZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnR9IHdyYXBwZXJcbiAgICAgKiBAcGFyYW0ge1Nob3BwaW5nY2FydFNlcnZpY2V9IHNob3BwaW5nY2FydFNlcnZpY2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih3cmFwcGVyLCBzaG9wcGluZ2NhcnRTZXJ2aWNlKVxuICAgIHtcbiAgICAgICAgdGhpcy5fd3JhcHBlciA9IHdyYXBwZXI7XG4gICAgICAgIGlmKCF0aGlzLl93cmFwcGVyIHx8IHRoaXMuX3dyYXBwZXIudGFnTmFtZSAhPT0gXCJESVZcIilcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignU2hvcHBpbmdDYXJ0Q29udHJvbGxlcjogVGhlIHNob3BwaW5nQ2FydCBmb3JtIG11c3QgYmUgYSBkaXYgZWxlbWVudCBidXQgd2FzIG5vdCBvciB3YXNuXFwndCBldmVuIHNwZWNpZmllZC4gU2hvcHBpbmdDYXJ0IGNvbnRyb2xsZXIgc3RvcHBlZCB3b3JraW5nJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hZGRUb1Nob3BwaW5nY2FydEJ1dHRvbnMgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1hZGQtcHJvZHVjdC10by1zaG9wcGluZ2NhcnQnKTtcbiAgICAgICAgaWYodGhpcy5fYWRkVG9TaG9wcGluZ2NhcnRCdXR0b25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignU2hvcHBpbmdDYXJ0Q29udHJvbGxlcjogVGhlIHNob3BwaW5nQ2FydCBmb3JtIHdhcyBleHBlY3RlZCB0byBoYXZlIDEgb3IgbW9yZSBhZGQgc2hvcHBpbmcgY2FydCBidXR0b25zIChjbGFzczoganMtYWRkLXByb2R1Y3QtdG8tc2hvcHBpbmdjYXJ0KSBidXQgZ290IG5vbmUuIFNob3BwaW5nQ2FydCBjb250cm9sbGVyIHN0b3BwZWQgd29ya2luZycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbW92ZUZyb21TaG9wcGluZ2NhcnRCdXR0b25zID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCcuanMtcmVtb3ZlLWl0ZW0tZnJvbS1zaG9wcGluZ2NhcnQnKTtcbiAgICAgICAgLy8gaWYodGhpcy5yZW1vdmVGcm9tU2hvcHBpbmdjYXJ0QnV0dG9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUuZXJyb3IoJ1Nob3BwaW5nQ2FydENvbnRyb2xsZXI6IFRoZSBzaG9wcGluZ0NhcnQgZm9ybSB3YXMgZXhwZWN0ZWQgdG8gaGF2ZSAxIG9yIG1vcmUgcmVtb3ZlIHNob3BwaW5nIGNhcnQgaXRlbSBidXR0b25zIChjbGFzczoganMtcmVtb3ZlLWl0ZW0tZnJvbS1zaG9wcGluZ2NhcnQpIGJ1dCBnb3Qgbm9uZS4gU2hvcHBpbmdDYXJ0IGNvbnRyb2xsZXIgc3RvcHBlZCB3b3JraW5nJyk7XG4gICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgIC8vIH1cbiAgICAgICAgdGhpcy5fY2hhbmdlUXVhbnRpdHlTaG9wcGluZ2NhcnRJdGVtQnV0dG9ucyA9IHdyYXBwZXIucXVlcnlTZWxlY3RvckFsbCgnLmpzLWNoYW5nZS1xdWFudGl0eS1vZi1zaG9wcGluZ2NhcnQtaXRlbScpO1xuICAgICAgICAvLyBpZih0aGlzLmNoYW5nZVF1YW50aXR5U2hvcHBpbmdjYXJ0SXRlbUJ1dHRvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmVycm9yKCdTaG9wcGluZ0NhcnRDb250cm9sbGVyOiBUaGUgc2hvcHBpbmdDYXJ0IGZvcm0gd2FzIGV4cGVjdGVkIHRvIGhhdmUgMSBvciBtb3JlIGNoYW5nZSBxdWFudGl0eSBidXR0b25zIChjbGFzczoganMtY2hhbmdlLXF1YW50aXR5LW9mLXNob3BwaW5nY2FydC1pdGVtKSBidXQgZ290IG5vbmUuIFNob3BwaW5nQ2FydCBjb250cm9sbGVyIHN0b3BwZWQgd29ya2luZycpO1xuICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAvLyB9XG4gICAgICAgIHRoaXMuX3Nob3BwaW5nY2FydFNlcnZpY2UgPSBzaG9wcGluZ2NhcnRTZXJ2aWNlO1xuICAgICAgICBpZighc2hvcHBpbmdjYXJ0U2VydmljZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignU2hvcHBpbmdDYXJ0Q29udHJvbGxlcjogVGhlIHNob3BwaW5nQ2FydENvbnRyb2xsZXIgd2FzIGV4cGVjdGVkIHRvIGdldCBhbiBpbnN0YW5jZSBvZiBTaG9wcGluZ2NhcnRTZXJ2aWNlLCBidXQgZGlkIG5vdCBnZXQgb25lLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGRQcm9kdWN0QnV0dG9uQ2xpY2tlZCA9IHRoaXMuYWRkUHJvZHVjdEJ1dHRvbkNsaWNrZWQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZW1vdmVQcm9kdWN0QnV0dG9uQ2xpY2tlZCA9IHRoaXMucmVtb3ZlUHJvZHVjdEJ1dHRvbkNsaWNrZWQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VRdWFudGl0eUJ1dHRvbkNsaWNrZWQgPSB0aGlzLmNoYW5nZVF1YW50aXR5QnV0dG9uQ2xpY2tlZC5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuY29udHJvbExpc3RlbmVycyh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgb3IgZGlzYWJsZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbmFibGVcbiAgICAgKi9cbiAgICBjb250cm9sTGlzdGVuZXJzKGVuYWJsZSA9IHRydWUpIHtcbiAgICAgICAgbGV0IGFkZFRvU2hvcHBpbmdjYXJ0QnV0dG9uc0xlbmd0aCA9IHRoaXMuX2FkZFRvU2hvcHBpbmdjYXJ0QnV0dG9ucy5sZW5ndGg7XG4gICAgICAgIGxldCByZW1vdmVGcm9tU2hvcHBpbmdjYXJ0QnV0dG9uc0xlbmd0aCA9IHRoaXMuX3JlbW92ZUZyb21TaG9wcGluZ2NhcnRCdXR0b25zLmxlbmd0aDtcbiAgICAgICAgbGV0IGNoYW5nZVF1YW50aXR5U2hvcHBpbmdjYXJ0SXRlbUJ1dHRvbnNMZW5ndGggPSB0aGlzLl9jaGFuZ2VRdWFudGl0eVNob3BwaW5nY2FydEl0ZW1CdXR0b25zLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYWRkVG9TaG9wcGluZ2NhcnRCdXR0b25zTGVuZ3RoOyBpbmRleCsrKSB0aGlzLl9hZGRUb1Nob3BwaW5nY2FydEJ1dHRvbnNbaW5kZXhdLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5hZGRQcm9kdWN0QnV0dG9uQ2xpY2tlZCk7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCByZW1vdmVGcm9tU2hvcHBpbmdjYXJ0QnV0dG9uc0xlbmd0aDsgaW5kZXgrKykgdGhpcy5fcmVtb3ZlRnJvbVNob3BwaW5nY2FydEJ1dHRvbnNbaW5kZXhdLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5yZW1vdmVQcm9kdWN0QnV0dG9uQ2xpY2tlZCk7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjaGFuZ2VRdWFudGl0eVNob3BwaW5nY2FydEl0ZW1CdXR0b25zTGVuZ3RoOyBpbmRleCsrKSB0aGlzLl9jaGFuZ2VRdWFudGl0eVNob3BwaW5nY2FydEl0ZW1CdXR0b25zW2luZGV4XS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuY2hhbmdlUXVhbnRpdHlCdXR0b25DbGlja2VkKTtcblxuICAgICAgICBpZihlbmFibGUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhZGRUb1Nob3BwaW5nY2FydEJ1dHRvbnNMZW5ndGg7IGluZGV4KyspIHRoaXMuX2FkZFRvU2hvcHBpbmdjYXJ0QnV0dG9uc1tpbmRleF0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmFkZFByb2R1Y3RCdXR0b25DbGlja2VkKTtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCByZW1vdmVGcm9tU2hvcHBpbmdjYXJ0QnV0dG9uc0xlbmd0aDsgaW5kZXgrKykgdGhpcy5fcmVtb3ZlRnJvbVNob3BwaW5nY2FydEJ1dHRvbnNbaW5kZXhdLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5yZW1vdmVQcm9kdWN0QnV0dG9uQ2xpY2tlZCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY2hhbmdlUXVhbnRpdHlTaG9wcGluZ2NhcnRJdGVtQnV0dG9uc0xlbmd0aDsgaW5kZXgrKykgdGhpcy5fY2hhbmdlUXVhbnRpdHlTaG9wcGluZ2NhcnRJdGVtQnV0dG9uc1tpbmRleF0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNoYW5nZVF1YW50aXR5QnV0dG9uQ2xpY2tlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50XG4gICAgICovXG4gICAgYWRkUHJvZHVjdEJ1dHRvbkNsaWNrZWQoZXZlbnQpXG4gICAge1xuICAgICAgICBpZighKFwicHJvZHVjdElkXCIgaW4gZXZlbnQudGFyZ2V0LmRhdGFzZXQpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTaG9wcGluZ0NhcnRDb250cm9sbGVyOiBFeHBlY3RlZCBhbiBhZGQgYnV0dG9uIHRvIGhhdmUgdGhlIGRhdGEtcHJvZHVjdC1pZCBhdHRyaWJ1dGUgc2V0LiBCdXQgZGlkIG5vdCBoYXZlIHRoYXQuIE5vdCBwcm9jZXNzaW5nIGNsaWNrJywgZXZlbnQudGFyZ2V0LmRhdGFzZXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmKCEoXCJwcm9kdWN0VHlwZVwiIGluIGV2ZW50LnRhcmdldC5kYXRhc2V0KSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignU2hvcHBpbmdDYXJ0Q29udHJvbGxlcjogRXhwZWN0ZWQgYW4gYWRkIGJ1dHRvbiB0byBoYXZlIHRoZSBkYXRhLXR5cGUgYXR0cmlidXRlIHNldC4gQnV0IGRpZCBub3QgaGF2ZSB0aGF0LiBOb3QgcHJvY2Vzc2luZyBjbGljaycsIGV2ZW50LnRhcmdldC5kYXRhc2V0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zaG9wcGluZ2NhcnRTZXJ2aWNlLl9hZGRQcm9kdWN0VG9TaG9wcGluZ2NhcnQoZXZlbnQudGFyZ2V0LmRhdGFzZXQucHJvZHVjdElkLCBldmVudC50YXJnZXQuZGF0YXNldC5wcm9kdWN0VHlwZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudFxuICAgICAqL1xuICAgIHJlbW92ZVByb2R1Y3RCdXR0b25DbGlja2VkKGV2ZW50KVxuICAgIHtcbiAgICAgICAgaWYoIShcInByb2R1Y3RJZFwiIGluIGV2ZW50LnRhcmdldC5kYXRhc2V0KSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignU2hvcHBpbmdDYXJ0Q29udHJvbGxlcjogRXhwZWN0ZWQgYW4gYWRkIGJ1dHRvbiB0byBoYXZlIHRoZSBkYXRhLXByb2R1Y3QtaWQgYXR0cmlidXRlIHNldC4gQnV0IGRpZCBub3QgaGF2ZSB0aGF0LiBOb3QgcHJvY2Vzc2luZyBjbGljaycsIGV2ZW50LnRhcmdldC5kYXRhc2V0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZighKFwicHJvZHVjdFR5cGVcIiBpbiBldmVudC50YXJnZXQuZGF0YXNldCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Nob3BwaW5nQ2FydENvbnRyb2xsZXI6IEV4cGVjdGVkIGFuIGFkZCBidXR0b24gdG8gaGF2ZSB0aGUgZGF0YS10eXBlIGF0dHJpYnV0ZSBzZXQuIEJ1dCBkaWQgbm90IGhhdmUgdGhhdC4gTm90IHByb2Nlc3NpbmcgY2xpY2snLCBldmVudC50YXJnZXQuZGF0YXNldCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2hvcHBpbmdjYXJ0U2VydmljZS5fcmVtb3ZlSXRlbUZyb21TaG9wcGluZ2NhcnQoZXZlbnQudGFyZ2V0LmRhdGFzZXQucHJvZHVjdElkLCBldmVudC50YXJnZXQuZGF0YXNldC5wcm9kdWN0VHlwZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudFxuICAgICAqL1xuICAgIGNoYW5nZVF1YW50aXR5QnV0dG9uQ2xpY2tlZChldmVudClcbiAgICB7XG4gICAgICAgIGlmKCEoXCJzaG9wcGluZ2NhcnRJdGVtSWRcIiBpbiBldmVudC50YXJnZXQuZGF0YXNldCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Nob3BwaW5nQ2FydENvbnRyb2xsZXI6IEV4cGVjdGVkIGFuIGFkZCBidXR0b24gdG8gaGF2ZSB0aGUgZGF0YS1zaG9wcGluZ2NhcnQtaXRlbS1pZCBhdHRyaWJ1dGUgc2V0LiBCdXQgZGlkIG5vdCBoYXZlIHRoYXQuIE5vdCBwcm9jZXNzaW5nIGNsaWNrJywgZXZlbnQudGFyZ2V0LmRhdGFzZXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmKCEoXCJxdWFudGl0eVwiIGluIGV2ZW50LnRhcmdldC5kYXRhc2V0KSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignU2hvcHBpbmdDYXJ0Q29udHJvbGxlcjogRXhwZWN0ZWQgYW4gYWRkIGJ1dHRvbiB0byBoYXZlIHRoZSBkYXRhLXF1YW50aXR5IGF0dHJpYnV0ZSBzZXQuIEJ1dCBkaWQgbm90IGhhdmUgdGhhdC4gTm90IHByb2Nlc3NpbmcgY2xpY2snLCBldmVudC50YXJnZXQuZGF0YXNldCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2hvcHBpbmdjYXJ0U2VydmljZS5fc2V0SXRlbVF1YW50aXR5SW5TaG9wcGluZ2NhcnQoZXZlbnQudGFyZ2V0LmRhdGFzZXQuc2hvcHBpbmdjYXJ0SXRlbUlkLCBldmVudC50YXJnZXQuZGF0YXNldC5xdWFudGl0eSk7XG4gICAgfVxuXG4gICAgdXBkYXRlQ2FydEJ1dHRvbkNvdW50ZXIoKVxuICAgIHtcbiAgICAgICAgbGV0IGNvdW50ID0gdGhpcy5fd3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCcuc2hvcHBpbmdjYXJ0SXRlbUxpc3QgdWwgbGknKS5sZW5ndGg7XG4gICAgICAgIGxldCBjb3VudGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNob3BwaW5nQ2FydEJ1dHRvbiBzcGFuLnNob3BwaW5nQ2FydEJ1dHRvbkNvdW50ZXInKTtcbiAgICAgICAgY291bnRlci5pbm5lclRleHQoY291bnQpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgU2hvcHBpbmdjYXJ0Q29udHJvbGxlciB9IiwiY2xhc3MgU2hvcHBpbmdjYXJ0U2VydmljZVxue1xuICAgIGNvbnN0cnVjdG9yKClcbiAgICB7XG4gICAgICAgIHRoaXMuX2Jhc2VSb3V0ZSA9ICcvJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgcHJvZHVjdCB0byB0aGUgc2hvcHBpbmcgY2FydFxuICAgICAqXG4gICAgICogQHBhcmFtIGlkXG4gICAgICogQHBhcmFtIHR5cGVcbiAgICAgKi9cbiAgICBfYWRkUHJvZHVjdFRvU2hvcHBpbmdjYXJ0KGlkLCB0eXBlKSB7XG4gICAgICAgIGxldCBxdWFudGl0eSA9IDEwO1xuXG4gICAgICAgIEFqYXgucG9zdChcbiAgICAgICAgICAgIHRoaXMuX2Jhc2VSb3V0ZSsnYWRkUHJvZHVjdFRvU2hvcHBpbmdjYXJ0JyxcbiAgICAgICAgICAgIHtwcm9kdWN0YWJsZUlkOiBpZCwgaXRlbVR5cGU6IHR5cGUsIHF1YW50aXR5OiBxdWFudGl0eX0sXG4gICAgICAgICAgICBmdW5jdGlvbih4aHIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh4aHIpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHhoci5yZXNwb25zZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBwcm9kdWN0IGZyb20gdGhlIHNob3BwaW5nIGNhcnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZFxuICAgICAqIEBwYXJhbSB0eXBlXG4gICAgICovXG4gICAgX3JlbW92ZUl0ZW1Gcm9tU2hvcHBpbmdjYXJ0KGlkLCB0eXBlKSB7XG4gICAgICAgIEFqYXgucG9zdChcbiAgICAgICAgICAgIHRoaXMuX2Jhc2VSb3V0ZSsncmVtb3ZlSXRlbUZyb21TaG9wcGluZ2NhcnQnLFxuICAgICAgICAgICAge3Byb2R1Y3RhYmxlSWQ6IGlkLCBpdGVtVHlwZTogdHlwZX0sXG4gICAgICAgICAgICBmdW5jdGlvbih4aHIpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB4aHIucmVzcG9uc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgcXVhbnRpdHkgb2YgYSBzaG9wcGluZyBjYXJ0IGl0ZW1cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZFxuICAgICAqIEBwYXJhbSBxdWFudGl0eVxuICAgICAqL1xuICAgIF9zZXRJdGVtUXVhbnRpdHlJblNob3BwaW5nY2FydChpZCwgcXVhbnRpdHkpIHtcbiAgICAgICAgaWYgKHF1YW50aXR5ID4gMCkge1xuICAgICAgICAgICAgQWpheC5wb3N0KFxuICAgICAgICAgICAgICAgICcvc2V0SXRlbVF1YW50aXR5SW5TaG9wcGluZ2NhcnQnLFxuICAgICAgICAgICAgICAgIHtpdGVtSWQ6IGlkLCBxdWFudGl0eTogcXVhbnRpdHl9LFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHhocikge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB4aHIucmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUl0ZW1Gcm9tU2hvcHBpbmdjYXJ0KGlkKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmV4cG9ydCB7IFNob3BwaW5nY2FydFNlcnZpY2UgfSIsImltcG9ydCB7IEVycm9yUmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsL21vZGVscy9lcnJvclJlc3BvbnNlXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsL21vZGVscy92YWxpZGF0aW9uUmVzcG9uc2VcIjtcblxuY2xhc3MgVmFsaWRhdGlvblNlcnZpY2Uge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Rm9ybURhdGF9IGRhdGFcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICAqL1xuICAgIHZhbGlkYXRlQ2hlY2tvdXRGb3JtKGRhdGEpIHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGlmKCEoZGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignVmFsaWRhdGlvblNlcnZpY2U6dmFsaWRhdGVDaGVja291dEZvcm0gY291bGQgbm90IHZhbGlkYXRlIGZvcm0gc2luY2Ugbm8gdmFsaWQgRm9ybURhdGEgaW5zdGFuY2Ugd2FzIGdpdmVuLicpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdWYWxpZGF0aW9uU2VydmljZTp2YWxpZGF0ZUNoZWNrb3V0Rm9ybSBjb3VsZCBub3QgdmFsaWRhdGUgZm9ybSBzaW5jZSBubyB2YWxpZCBGb3JtRGF0YSBpbnN0YW5jZSB3YXMgZ2l2ZW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBBamF4LnBvc3RGb3JtRGF0YShcbiAgICAgICAgICAgICAgICAnL3ZhbGlkYXRpb24vZm9ybS9jaGVja291dCcsXG4gICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbih4aHIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzRXJyb3JSZXNwb25zZSA9IEVycm9yUmVzcG9uc2UuaXMoeGhyLnJlc3BvbnNlLCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYoIWlzRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yUmVzcG9uc2UuZnJvbUpzb25TdHJpbmcoeGhyLnJlc3BvbnNlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFZhbGlkYXRpb25TZXJ2aWNlIH0iLCIvKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqICBJbXBvcnQgRVM2IE1vZHVsZXMgKGh0dHBzOi8vd2VicGFjay5qcy5vcmcvYXBpL21vZHVsZS1tZXRob2RzLylcbiAqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbmltcG9ydCB7IEdsb2JhbGlzYXRpb25TZXJ2aWNlIH0gZnJvbSBcIi4vY29tcG9uZW50cy9HbG9iYWxpc2F0aW9uU2VydmljZVwiO1xuaW1wb3J0IHsgUmVnaXN0ZXJDb250cm9sbGVyIH0gZnJvbSBcIi4vY29tcG9uZW50cy9SZWdpc3RlckNvbnRyb2xsZXJcIjtcblxuaW1wb3J0IHsgQ2hlY2tvdXRDb250cm9sbGVyIH0gZnJvbSAnLi8uLi9zaG9wL2NvbXBvbmVudHMvY2hlY2tvdXRDb250cm9sbGVyJztcbmltcG9ydCB7IFNob3BwaW5nY2FydENvbnRyb2xsZXIgfSBmcm9tICcuLi9zaG9wL2NvbXBvbmVudHMvc2hvcHBpbmdjYXJ0Q29udHJvbGxlcic7XG5pbXBvcnQgeyBTaG9wcGluZ2NhcnRTZXJ2aWNlIH0gZnJvbSBcIi4uL3Nob3AvY29tcG9uZW50cy9zaG9wcGluZ2NhcnRTZXJ2aWNlXCI7XG5pbXBvcnQgeyBDaGVja291dFNlcnZpY2UgfSBmcm9tIFwiLi4vc2hvcC9jb21wb25lbnRzL2NoZWNrb3V0U2VydmljZVwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vc2hvcC9jb21wb25lbnRzL3ZhbGlkYXRpb25TZXJ2aWNlXCI7XG5pbXBvcnQgeyBFcnJvckNvbnRyb2xsZXIgfSBmcm9tIFwiLi4vc2hvcC9jb21wb25lbnRzL2Vycm9yQ29udHJvbGxlclwiO1xuXG4vKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqICBEZXBlbmRlbmNpZXNcbiAqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuLyoqXG4gKiBFeHRlcm5hbFxuICovXG5yZXF1aXJlKCdoYW1tZXJqcycpO1xucmVxdWlyZSgnb2JqZWN0Rml0UG9seWZpbGwnKTtcblxuLyoqXG4gKiBHbG9iYWwgLyBTaGFyZWQgd2l0aCBLTVNcbiAqL1xucmVxdWlyZSgnLi8uLi9nbG9iYWwvcG9seWZpbGxzL2V2ZW50UG9seUZpbGwnKTtcbnJlcXVpcmUoJy4vLi4vZ2xvYmFsL3BvbHlmaWxscy9pc0ludGVnZXInKTtcbnJlcXVpcmUoJy4vLi4vZ2xvYmFsL3BvbHlmaWxscy9wcm9taXNlJyk7XG5cbi8qKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogIEdsb2JhbCBmdW5jdGlvbmFsaXRpZXNcbiAqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxucmVxdWlyZSgnLi9nbG9iYWwvaGVscGVycycpOyAvLyBTaG91bGQgYmUgZmlyc3RcbnJlcXVpcmUoJy4vZ2xvYmFsL2Jyb3dzZXJIYW5kbGVyJyk7XG4vLyByZXF1aXJlKCcuL2dsb2JhbC9wYWdldHJhbnNpdGlvbkhhbmRsZXInKTtcbi8vIHJlcXVpcmUoJy4vZ2xvYmFsL3Jlc2l6ZUhhbmRsZXInKTtcbnJlcXVpcmUoJy4vZ2xvYmFsL3Njcm9sbEhhbmRsZXInKTtcblxuXG4vKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqICBDb21wb25lbnQgZnVuY3Rpb25hbGl0aWVzXG4gKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jaG9jb2xhdGVGYWN0b3J5Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY29va2llSGFuZGxlcicpO1xuLy8gcmVxdWlyZSgnLi9jb21wb25lbnRzL0lucHV0SGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL21hcHNIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvb3ZlcmxheU1lbnVIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvcHJvamVjdG9ySGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3Njcm9sbFRvSGFuZGxlcicpO1xuLy8gcmVxdWlyZSgnLi9jb21wb25lbnRzL3NlYXJjaEhhbmRsZXInKTtcbi8vIHJlcXVpcmUoJy4vY29tcG9uZW50cy9zaGFyZUJ1dHRvbnNIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMveW91dHViZUhhbmRsZXInKTtcblxuLyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiAgU2hvcCBDb21wb25lbnQgZnVuY3Rpb25hbGl0aWVzXG4gKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5sZXQgY2hlY2tvdXRGb3JtRGl2RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jaGVja291dC1mb3JtJyk7XG5pZihjaGVja291dEZvcm1EaXZFbGVtZW50KSBuZXcgQ2hlY2tvdXRDb250cm9sbGVyKFxuICAgIGNoZWNrb3V0Rm9ybURpdkVsZW1lbnQsXG4gICAgbmV3IFNob3BwaW5nY2FydFNlcnZpY2UoKSxcbiAgICBuZXcgQ2hlY2tvdXRTZXJ2aWNlKCksXG4gICAgbmV3IFZhbGlkYXRpb25TZXJ2aWNlKCksXG4gICAgbmV3IEdsb2JhbGlzYXRpb25TZXJ2aWNlKCksXG4gICAgbmV3IEVycm9yQ29udHJvbGxlcigpXG4pO1xuXG5sZXQgc2hvcHBpbmdDYXJ0RGl2RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jYXJ0Jyk7XG5pZihzaG9wcGluZ0NhcnREaXZFbGVtZW50KSBuZXcgU2hvcHBpbmdjYXJ0Q29udHJvbGxlcihzaG9wcGluZ0NhcnREaXZFbGVtZW50LCBuZXcgU2hvcHBpbmdjYXJ0U2VydmljZSgpKTtcblxubGV0IHJlZ2lzdGVyRm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWdpc3RlckZvcm0nKTtcbmlmKHJlZ2lzdGVyRm9ybSkgbmV3IFJlZ2lzdGVyQ29udHJvbGxlcihyZWdpc3RlckZvcm0sIG5ldyBHbG9iYWxpc2F0aW9uU2VydmljZSgpKTtcblxuIiwiaW1wb3J0IHsgRXJyb3JSZXNwb25zZSB9IGZyb20gXCIuLi8uLi9nbG9iYWwvbW9kZWxzL2Vycm9yUmVzcG9uc2VcIjtcbmltcG9ydCB7IENvdW50cnlMYW5ndWFnZXNSZXNwb25zZSB9IGZyb20gXCIuLi8uLi9nbG9iYWwvbW9kZWxzL2NvdW50cnlMYW5ndWFnZXNSZXNwb25zZVwiO1xuXG5jbGFzcyBHbG9iYWxpc2F0aW9uU2VydmljZVxue1xuICAgIGNvbnN0cnVjdG9yKClcbiAgICB7XG4gICAgICAgIHRoaXMuX2Jhc2VSb3V0ZSA9ICcvJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgcHJvZHVjdCB0byB0aGUgc2hvcHBpbmcgY2FydFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvdW50cnlJc28zXG4gICAgICovXG4gICAgZ2V0TGFuZ3VhZ2VzRm9yQ291bnRyeVdpdGhJc28zKGNvdW50cnlJc28zKSB7XG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBBamF4LnBvc3QoXG4gICAgICAgICAgICAgICAgc2VsZi5fYmFzZVJvdXRlKydnZXRMYW5ndWFnZXNGb3JDb3VudHJ5V2l0aElzbzMnLFxuICAgICAgICAgICAgICAgIHsgY291bnRyeUlzbzM6IGNvdW50cnlJc28zIH0sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oeGhyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxldCByZXNwb25zZSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzRXJyb3JSZXNwb25zZSA9IEVycm9yUmVzcG9uc2UuaXMoeGhyLnJlc3BvbnNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpc0NvdW50cnlMYW5ndWFnZXNSZXNwb25zZSA9IENvdW50cnlMYW5ndWFnZXNSZXNwb25zZS5pcyh4aHIucmVzcG9uc2UsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgICAgICBpZighaXNFcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihpc0NvdW50cnlMYW5ndWFnZXNSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UgPSBDb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UuZnJvbUpzb25TdHJpbmcoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvdW50cnlMYW5ndWFnZXNSZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZWdpc3RlclNlcnZpY2U6Z2V0TGFuZ3VhZ2VzRm9yQ291bnRyeVdpdGhJc28zIFRoZSByZXNwb25zZSB3YXMgbm90IGEgdmFsaWQgQ291bnRyeUxhbmd1YWdlc1Jlc3BvbnNlOiAnK3hoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBFcnJvclJlc3BvbnNlLmZyb21Kc29uU3RyaW5nKHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuZXhwb3J0IHsgR2xvYmFsaXNhdGlvblNlcnZpY2UgfSIsImNsYXNzIFJlZ2lzdGVyQ29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gd3JhcHBlclxuICAgICAqIEBwYXJhbSB7R2xvYmFsaXNhdGlvblNlcnZpY2V9IGdsb2JhbGlzYXRpb25TZXJ2aWNlXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iod3JhcHBlciwgZ2xvYmFsaXNhdGlvblNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5fd3JhcHBlciA9IHdyYXBwZXI7XG4gICAgICAgIGlmKCF0aGlzLl93cmFwcGVyIHx8IHRoaXMuX3dyYXBwZXIudGFnTmFtZSAhPT0gXCJGT1JNXCIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlZ2lzdGVyQ29udHJvbGxlcjogVGhlIFJlZ2lzdGVyIGZvcm0gbXVzdCBiZSBhIGRpdiBlbGVtZW50IGJ1dCB3YXMgbm90IG9yIHdhc25cXCd0IGV2ZW4gc3BlY2lmaWVkLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY291bnRyeVNlbGVjdCA9IHRoaXMuX3dyYXBwZXIucXVlcnlTZWxlY3Rvcignc2VsZWN0W25hbWU9XCJjb3VudHJ5XCJdJyk7XG4gICAgICAgIGlmKCF0aGlzLl9jb3VudHJ5U2VsZWN0KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZWdpc3RlckNvbnRyb2xsZXI6IFRoZSBSZWdpc3RlciBmb3JtIG11c3QgaGF2ZSBhIHNlbGVjdCBlbGVtZW50IHdpdGggbmFtZSBcImNvdW50cnlcIiBidXQgZGlkIG5vdCBoYXZlIGl0LicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VTZWxlY3QgPSB0aGlzLl93cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJ3NlbGVjdFtuYW1lPVwibGFuZ3VhZ2VcIl0nKTtcbiAgICAgICAgaWYoIXRoaXMuX2NvdW50cnlTZWxlY3QpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlZ2lzdGVyQ29udHJvbGxlcjogVGhlIFJlZ2lzdGVyIGZvcm0gbXVzdCBoYXZlIGEgc2VsZWN0IGVsZW1lbnQgd2l0aCBuYW1lIFwibGFuZ3VhZ2VcIiBidXQgZGlkIG5vdCBoYXZlIGl0LicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VTZWxlY3RXcmFwcGVyID0gdGhpcy5fd3JhcHBlci5xdWVyeVNlbGVjdG9yKCcuanMtbGFuZ3VhZ2Utd3JhcHBlcicpO1xuICAgICAgICBpZighdGhpcy5fbGFuZ3VhZ2VTZWxlY3RXcmFwcGVyIHx8IHRoaXMuX2xhbmd1YWdlU2VsZWN0V3JhcHBlci50YWdOYW1lICE9PSBcIkRJVlwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZWdpc3RlckNvbnRyb2xsZXI6IFRoZSBSZWdpc3RlciBmb3JtIG11c3QgaGF2ZSBhIHdyYXBwZXIgRElWIGVsZW1lbnQgd2l0aCBjbGFzcyBcImpzLWxhbmd1YWdlLXdyYXBwZXJcIiBidXQgZGlkIG5vdCBoYXZlIGl0LicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cblxuICAgICAgICB0aGlzLl9nbG9iYWxpc2F0aW9uU2VydmljZSA9IGdsb2JhbGlzYXRpb25TZXJ2aWNlO1xuICAgICAgICBpZighZ2xvYmFsaXNhdGlvblNlcnZpY2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlZ2lzdGVyQ29udHJvbGxlcjogVGhlIFJlZ2lzdGVyIGZvcm0gd2FzIGV4cGVjdGVkIHRvIGdldCBhbiBpbnN0YW5jZSBvZiBSZWdpc3RlclNlcnZpY2UsIGJ1dCBkaWQgbm90IGdldCBvbmUuJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9oaWRkZW5DbGFzcyA9ICd1LWhpZGRlbic7IC8vVGhlIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIHRoaW5ncyB0byBoaWRlIHRoZW0uXG5cbiAgICAgICAgdGhpcy5fZG9tUGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuXG4gICAgICAgIHRoaXMuX2NvdW50cnlDaGFuZ2VkID0gdGhpcy5fY291bnRyeUNoYW5nZWQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5jb250cm9sTGlzdGVuZXJzKHRydWUpO1xuXG4gICAgICAgIHRoaXMuX2NvdW50cnlDaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgY29udHJvbExpc3RlbmVycyhlbmFibGUgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX2NvdW50cnlTZWxlY3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5fY291bnRyeUNoYW5nZWQpO1xuXG4gICAgICAgIGlmKGVuYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5fY291bnRyeVNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLl9jb3VudHJ5Q2hhbmdlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9jb3VudHJ5Q2hhbmdlZCgpIHtcbiAgICAgICAgbGV0IGNvdW50cnlJc28zID0gdGhpcy5fY291bnRyeVNlbGVjdC52YWx1ZTtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuX2dsb2JhbGlzYXRpb25TZXJ2aWNlLmdldExhbmd1YWdlc0ZvckNvdW50cnlXaXRoSXNvMyhjb3VudHJ5SXNvMykudGhlbihcbiAgICAgICAgICAgIC8qKiBAcGFyYW0geyBDb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UgfSBjb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UgKiovXG4gICAgICAgICAgICBmdW5jdGlvbihjb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBzZWxmLl9jbGVhckxhbmd1YWdlU2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgbGV0IGxhbmd1YWdlQ291bnQgPSBjb3VudHJ5TGFuZ3VhZ2VzUmVzcG9uc2UubGFuZ3VhZ2VzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsYW5ndWFnZUNvdW50OyBpbmRleCsrKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhbmd1YWdlID0gY291bnRyeUxhbmd1YWdlc1Jlc3BvbnNlLmxhbmd1YWdlc1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25FbGVtZW50ID0gc2VsZi5fY3JlYXRlSHRtbEVsZW1lbnRGcm9tU3RyaW5nKCc8b3B0aW9uIHZhbHVlPVwiJytsYW5ndWFnZS50aHJlZUxldHRlcklzb0xhbmd1YWdlTmFtZSsnXCI+JytsYW5ndWFnZS5uYXRpdmVOYW1lKyc8L29wdGlvbj4nKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGFuZ3VhZ2VTZWxlY3QuYXBwZW5kQ2hpbGQob3B0aW9uRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYobGFuZ3VhZ2VDb3VudCA8PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2xhbmd1YWdlU2VsZWN0V3JhcHBlci5jbGFzc0xpc3QuYWRkKHNlbGYuX2hpZGRlbkNsYXNzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYW5ndWFnZVNlbGVjdFdyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZShzZWxmLl9oaWRkZW5DbGFzcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApLmNhdGNoKFxuICAgICAgICAgICAgLyoqIEBwYXJhbSB7IEVycm9yUmVzcG9uc2UgfSBlcnJvclJlc3BvbnNlICoqL1xuICAgICAgICAgICAgZnVuY3Rpb24oZXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3JSZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9jbGVhckxhbmd1YWdlU2VsZWN0KClcbiAgICB7XG4gICAgICAgIHdoaWxlKHRoaXMuX2xhbmd1YWdlU2VsZWN0LmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5fbGFuZ3VhZ2VTZWxlY3QucmVtb3ZlQ2hpbGQodGhpcy5fbGFuZ3VhZ2VTZWxlY3QuZmlyc3RDaGlsZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tXG4gICAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAgICovXG4gICAgX2NyZWF0ZUh0bWxFbGVtZW50RnJvbVN0cmluZyhmcm9tKVxuICAgIHtcbiAgICAgICAgbGV0IGRvY3VtZW50ID0gdGhpcy5fZG9tUGFyc2VyLnBhcnNlRnJvbVN0cmluZyhmcm9tLCAndGV4dC9odG1sJyk7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5LmZpcnN0Q2hpbGQ7XG4gICAgfVxufVxuXG5leHBvcnQgeyBSZWdpc3RlckNvbnRyb2xsZXIgfSIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gfCBQcmV2ZW50IEJvdHMgaGFuZGxlclxuIHxcbiB8IFdlIG5hbWVkIHRoaXMgY2hvY29sYXRlIGZhY3RvcnkgYW5kIGJlbG9uZ2luZyBjb25mdXNpbmcganMgaG9va3NcbiB8IHRvIHByZXZlbnQgc21hcnQgYm90cyBmcm9tIGJsb2NraW5nIHRoZXNlIHZhcmlhYmxlIG9yIGZ1bmN0aW9ucy5cbiB8XG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuY29uc3QgQ2hvY29sYXRlRmFjdG9yeSA9IHtcblxuICAgIGJhbm5lZFZpc2l0b3I6IFtdLFxuXG4gICAgLyoqIEdldCBhbGwgdGhlIGNob2NvbGF0ZSBmYWN0b3J5IGFuZCBzdGFydFxuICAgICAqICBMb29waW5nIHRocm91Z2ggdGhvc2Ugc3RhcnQgZmxhc2hpbmcgdGlja2V0c1xuICAgICAqL1xuICAgIGVudGVyOiBmdW5jdGlvbigpXG4gICAge1xuXG4gICAgICAgIGNvbnN0IGNob2NvbGF0ZUZhY3RvcmllcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1jaG9jb2xhdGUtZmFjdG9yeScpO1xuXG4gICAgICAgIGlmKGlzc2V0KGNob2NvbGF0ZUZhY3Rvcmllcykpe1xuXG4gICAgICAgICAgICBjb25zdCBhbW91bnRPZkNob2NvbGF0ZUZhY3RvcmllcyA9IGNob2NvbGF0ZUZhY3Rvcmllcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgYW1vdW50T2ZDaG9jb2xhdGVGYWN0b3JpZXM7IGkrKyl7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBDaG9jb2xhdGVCYXIgPSBjaG9jb2xhdGVGYWN0b3JpZXNbaV07XG4gICAgICAgICAgICAgICAgQ2hvY29sYXRlRmFjdG9yeS5fZmxhc2hUaWNrZXQoQ2hvY29sYXRlQmFyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJZiBmYWN0b3J5IGhhcyBhIGdvbGRlbiB0aWNrZXRcbiAgICAgKiBUaGVuIHdlIGNhbiBtYWtlIHRoZW0gZ28gb24gdGhlIHRvdXIgaWYgdGhlcmUgaGFzIGJlZW4gY2xpY2sgb24gdGhlIHRpY2tldFxuICAgICAqXG4gICAgICogQHBhcmFtIGNob2NvbGF0ZUJhclxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2ZsYXNoVGlja2V0OiBmdW5jdGlvbiAoY2hvY29sYXRlQmFyKSB7XG5cbiAgICAgICAgLy8gVHJ5IGdldCB0aGUgdGlja2V0IGZyb20gdGhlIGNob2NvbGF0ZUJhclxuICAgICAgICBjb25zdCBnb2xkZW5UaWNrZXQgPSBjaG9jb2xhdGVCYXIucXVlcnlTZWxlY3RvcignLmpzLWdvbGRlbi10aWNrZXQnKTtcblxuICAgICAgICAvLyBPbmx5IGNvbnRpbnVlIGlmIGNob2NvbGF0ZSBiYXIgaGFzIGEgZ29sZGVuIHRpY2tldFxuICAgICAgICBpZihpc3NldChnb2xkZW5UaWNrZXQpKXtcblxuICAgICAgICAgICAgZ29sZGVuVGlja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIENob2NvbGF0ZUZhY3RvcnkuZW5qb3lUaGVUb3VyKGNob2NvbGF0ZUJhcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1RvIGJhZCwgbm8gZ29sZGVuIHRpY2tldHMgaGFzIGJlZW4gZm91bmQuJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgdGhlIHRvdXIgdGhyb3VnaCB0aGUgZmFjdG9yeVxuICAgICAqIEFuZCBnZXQgdGhlIG5hbWVzIGFuZCBwcm9wZXJ0aWVzIG9mIHRoZSBtZW1iZXJzIG9mIHRoZSBncm91cFxuICAgICAqIElmIHRoZXJlIGFyZSBtZW1iZXJzIGluIHRoZSBncm91cCBvZiBjb3Vyc2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaG9jb2xhdGVGYWN0b3J5XG4gICAgICovXG4gICAgZW5qb3lUaGVUb3VyKGNob2NvbGF0ZUZhY3Rvcnkpe1xuXG4gICAgICAgIC8vIEFzayBmb3IgdGhlIHRvdXIgZ3JvdXBcbiAgICAgICAgY29uc3QgdG91ckdyb3VwID0gY2hvY29sYXRlRmFjdG9yeS5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgdGV4dGFyZWEnKTtcblxuICAgICAgICBpZihpc3NldCh0b3VyR3JvdXApKXtcblxuICAgICAgICAgICAgLy8gRm9yIGVhY2ggdmlzaXRvciB3ZSB3YW50IGEgYmVsb25naW5nIE9vbXBhIExvb21wYVxuICAgICAgICAgICAgbGV0IG9vbXBhTG9vbXBhcyA9IHt9O1xuICAgICAgICAgICAgbGV0IGFtb3VudE9mT29tcGFMb29tcGFzID0gMDtcblxuICAgICAgICAgICAgY29uc3QgdG91ckdyb3VwU2l6ZSA9IHRvdXJHcm91cC5sZW5ndGg7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdG91ckdyb3VwU2l6ZTsgaSsrKXtcblxuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdmlzaXRvciBmcm9tIHRoZSBncm91cFxuICAgICAgICAgICAgICAgIGNvbnN0IHZpc2l0b3IgPSB0b3VyR3JvdXBbaV07XG5cbiAgICAgICAgICAgICAgICAvLyBBc2sgZm9yIGl0cyBuYW1lXG4gICAgICAgICAgICAgICAgY29uc3QgdmlzaXRvck5hbWUgPSB2aXNpdG9yLmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZpc2l0b3IgaXMgYmFubmVkXG4gICAgICAgICAgICAgICAgaWYoIENob2NvbGF0ZUZhY3RvcnkuX2lzVmlzaXRvckJhbm5lZCh2aXNpdG9yTmFtZSkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgb29tcGFMb29tcGFzWyB2aXNpdG9yTmFtZSBdID0gQ2hvY29sYXRlRmFjdG9yeS5fZ2V0QXJyYW5nZW1lbnQodmlzaXRvcik7XG4gICAgICAgICAgICAgICAgYW1vdW50T2ZPb21wYUxvb21wYXMrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGluc3VyYW5jZSB0aGF0IHRoZXJlIGFyZSBvb21wYSBsb29tcGFzXG4gICAgICAgICAgICBpZihhbW91bnRPZk9vbXBhTG9vbXBhcyA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHN1Ym1pdCByZXF1ZXN0XG4gICAgICAgICAgICBDaG9jb2xhdGVGYWN0b3J5Ll9maW5pc2hUb3VyKG9vbXBhTG9vbXBhcywgY2hvY29sYXRlRmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdUbyBiYWQsIG5vIG1lbWJlcnMgdG8gdmlzaXQgdGhpcyBmYWN0b3J5JylcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgdmlzaXRvciBuYW1lIGlzbid0IGFsbG93XG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmlzaXRvck5hbWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9pc1Zpc2l0b3JCYW5uZWQ6IGZ1bmN0aW9uKHZpc2l0b3JOYW1lKXtcbiAgICAgICAgaWYoQ2hvY29sYXRlRmFjdG9yeS5iYW5uZWRWaXNpdG9yLmluZGV4T2YodmlzaXRvck5hbWUpICE9PSAtMSl7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE1vc3QgZ2V0IHZpc2l0b3IgaGF2ZSBhIG5vcm1hbCBhcnJhbmdlbWVudFxuICAgICAqIEJ1dCBzb21ldGltZXMgdGhlcmUgYXJlIHNwZWNpYWwgY2FzZXNcbiAgICAgKiBMaWtlIGEgU2VsZWN0b3Igb3IgY2hlY2tib3hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2aXNpdG9yXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZ2V0QXJyYW5nZW1lbnQ6IGZ1bmN0aW9uKHZpc2l0b3IpXG4gICAge1xuXG4gICAgICAgIGNvbnN0IHZpc2l0b3JUeXBlID0gdmlzaXRvci5ub2RlTmFtZTtcblxuICAgICAgICBzd2l0Y2ggKHZpc2l0b3JUeXBlKSB7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZhbHVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmlzaCB0aGUgdG91clxuICAgICAqIElmIHN1Y2Nlc3NmdWwgc2hvdyB0aGFua3MgbWVzc2FnZVxuICAgICAqIE9yIHNob3cgZGVmaW5lZCBlcnJvciBtZXNzYWdlIG9yIGZhbGxiYWNrXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXBcbiAgICAgKiBAcGFyYW0gY2hvY29sYXRlRmFjdG9yeVxuICAgICAqIEByZXR1cm5zIHsqfHZvaWR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZmluaXNoVG91cjogZnVuY3Rpb24oZ3JvdXAsIGNob2NvbGF0ZUZhY3RvcnkpXG4gICAge1xuICAgICAgICAvLyBBZGQgd2lsbGllIHRvIHRoZSBncm91cFxuICAgICAgICBncm91cCA9IENob2NvbGF0ZUZhY3RvcnkuX2FkZFdpbGxpZVdvbmthKGdyb3VwKTtcblxuICAgICAgICAvLyBHZXQgdGhlIGdhdGUgZm9yIGZpbmlzaCB0aGUgdG91clxuICAgICAgICBjb25zdCBnYXRlID0gJy9jb250YWN0L3Byb2Nlc3MnO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBBamF4LnBvc3QoZ2F0ZSwgZ3JvdXAsIGZ1bmN0aW9uIChIdHRwUmVxdWVzdCkge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKEh0dHBSZXF1ZXN0LnJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAoSHR0cFJlcXVlc3Quc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENob2NvbGF0ZUZhY3RvcnkuX3RoYW5rc0ZvclZpc2l0aW5nKHJlc3BvbnNlLnJlZGlyZWN0VXJsKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2hvY29sYXRlRmFjdG9yeS5fZ2l2ZUZlZWRiYWNrVG9NZW1iZXJzKHJlc3BvbnNlLmVycm9ycywgY2hvY29sYXRlRmFjdG9yeSk7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gQ2hvY29sYXRlRmFjdG9yeS5fdW5rbm93bkdhcEluRmFjdG9yeShjaG9jb2xhdGVGYWN0b3J5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gQ2hvY29sYXRlRmFjdG9yeS5fdW5rbm93bkdhcEluRmFjdG9yeShjaG9jb2xhdGVGYWN0b3J5KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgd2lsbGllIHdvbmthIHRvIHRoZSBncm91cFxuICAgICAqIFBzLi4uIGl0IGFjdHVhbGx5IHRoZSBzZWNyZXQgY29kZSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBncm91cFxuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2FkZFdpbGxpZVdvbmthOiBmdW5jdGlvbihncm91cCl7XG4gICAgICAgIGdyb3VwLl93aWxsaWUgPSAnd29ua2EnO1xuICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCB0aGUgZmVlZGJhY2sgdG8gdGhlIGRlc2lyZWQgYXJlYS5cbiAgICAgKiBNb3N0IGxpa2VseSB0byB0aGUgdmlzaXRvciBkaXJlY3RseSwgYnV0IHNvbWV0aW1lIHRvIHRoZSBmYWN0b3J5IGRlc2lyZWQgZmVlZGJhY2sgYXJlYVxuICAgICAqXG4gICAgICogQHBhcmFtIGVycm9yc1xuICAgICAqIEBwYXJhbSBjaG9jb2xhdGVGYWN0b3J5XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZ2l2ZUZlZWRiYWNrVG9NZW1iZXJzOiBmdW5jdGlvbihlcnJvcnMsIGNob2NvbGF0ZUZhY3Rvcnkpe1xuXG4gICAgICAgIC8vIEdyYWIgdGhlIGZhY3RvcnkgZmVlZGJhY2sgYXJlYVxuICAgICAgICBjb25zdCBmZWVkYmFja0FyZWEgPSBjaG9jb2xhdGVGYWN0b3J5LnF1ZXJ5U2VsZWN0b3IoJy5qcy1lcnJvci1hcmVhJyk7XG5cbiAgICAgICAgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgaHRtbFxuICAgICAgICBpZihpc3NldChmZWVkYmFja0FyZWEpKSBmZWVkYmFja0FyZWEuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgLy8gQ2xlYXIgdGhlIHByZXZpb3VzIG1hcmtlZCBqYWNrZXRzXG4gICAgICAgIENob2NvbGF0ZUZhY3RvcnkuX2NsZWFyUHJldmlvdXNNYXJrZWRKYWNrZXRzKGNob2NvbGF0ZUZhY3RvcnkpO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGVycm9ycykuZm9yRWFjaChmdW5jdGlvbih2aXNpdG9yKSB7XG5cbiAgICAgICAgICAgIGxldCBqYWNrZXQgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHZpc2l0b3JGZWVkYmFja0FyZWEgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBIb25leSBlbGVtZW50cyBkb2Vzbid0IGhhcyBhIGFjY2Vzc2libGUgZWxlbWVudFxuICAgICAgICAgICAgaWYodmlzaXRvciAhPT0gJ19ob25leScgJiYgdmlzaXRvciAhPT0gJ19zZWNyZXRDb2RlJykge1xuXG4gICAgICAgICAgICAgICAgLy8gR3JhYiB0aGUgdmlzaXRvclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpc2l0b3JOb2RlID0gY2hvY29sYXRlRmFjdG9yeS5xdWVyeVNlbGVjdG9yKCcjJyArIHZpc2l0b3IpO1xuXG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgamFja2V0IG9mIGEgdmlzaXRvclxuICAgICAgICAgICAgICAgIGphY2tldCA9IENob2NvbGF0ZUZhY3RvcnkuX2dyYWJWaXNpdG9ySmFja2V0KHZpc2l0b3JOb2RlKTtcblxuICAgICAgICAgICAgICAgIC8vIElmIGZvdW5kIGdldCB0aGUgZGVzaXJlZCBhcmVhXG4gICAgICAgICAgICAgICAgaWYoaXNzZXQoamFja2V0KSkgdmlzaXRvckZlZWRiYWNrQXJlYSA9IGphY2tldC5xdWVyeVNlbGVjdG9yKCcuanMtZm9ybS1lbGVtZW50LWVycm9yJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgY3VycmVudCBodG1sXG4gICAgICAgICAgICAgICAgaWYoaXNzZXQodmlzaXRvckZlZWRiYWNrQXJlYSkpIHZpc2l0b3JGZWVkYmFja0FyZWEuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBmZWVkYmFjayBmb3IgdGhpcyB2aXNpdG9yXG4gICAgICAgICAgICBjb25zdCB2aXNpdG9yRmVlZGJhY2sgPSBlcnJvcnNbdmlzaXRvcl07XG5cbiAgICAgICAgICAgIC8vIFNwaXQgb3V0IGVhY2ggbGluZVxuICAgICAgICAgICAgY29uc3QgdmlzaXRvckZlZWRiYWNrQW1vdW50ID0gdmlzaXRvckZlZWRiYWNrLmxlbmd0aDtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB2aXNpdG9yRmVlZGJhY2tBbW91bnQ7IGkrKyl7XG4gICAgICAgICAgICAgICAgY29uc3QgdmlzaXRvckZlZWRiYWNrTGluZSA9IHZpc2l0b3JGZWVkYmFja1tpXTtcblxuICAgICAgICAgICAgICAgIC8vIEhvbmV5IGVsZW1lbnRzIGRvZXNuJ3QgaGFzIGEgYWNjZXNzaWJsZSBlbGVtZW50IGFyZWFcbiAgICAgICAgICAgICAgICBpZih2aXNpdG9yICE9PSAnX2hvbmV5JyAmJiB2aXNpdG9yICE9PSAnX3NlY3JldENvZGUnKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTWFyayB0aGUgamFja2V0XG4gICAgICAgICAgICAgICAgICAgIGlmKGlzc2V0KGphY2tldCkpIGphY2tldC5jbGFzc0xpc3QuYWRkKCdoYXMtZXJyb3InKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgZmVlZGJhY2sgdG8gdmlzaXRvciBmZWVkYmFjayBhcmVhIGlmIGRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgaWYoaXNzZXQodmlzaXRvckZlZWRiYWNrQXJlYSkpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50RmVlZGJhY2tBcmVhID0gdmlzaXRvckZlZWRiYWNrQXJlYS5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmVlZGJhY2tBcmVhICs9ICc8c3Bhbj4nICsgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHZpc2l0b3JGZWVkYmFja0xpbmUpICsgJzwvc3Bhbj4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlzaXRvckZlZWRiYWNrQXJlYS5pbm5lckhUTUwgPSBjdXJyZW50RmVlZGJhY2tBcmVhO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQXBwZW5kIGZlZWRiYWNrIHRvIGZhY3RvcnkgZmVlZGJhY2sgYXJlYSBpZiBkZWZpbmVkXG4gICAgICAgICAgICAgICAgaWYoaXNzZXQoZmVlZGJhY2tBcmVhKSl7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50RmVlZGJhY2tBcmVhID0gZmVlZGJhY2tBcmVhLmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEZlZWRiYWNrQXJlYSArPSAnPGxpPicgKyBjYXBpdGFsaXplRmlyc3RMZXR0ZXIodmlzaXRvckZlZWRiYWNrTGluZSkgKyAnPC9saT4nO1xuICAgICAgICAgICAgICAgICAgICBmZWVkYmFja0FyZWEuaW5uZXJIVE1MID0gY3VycmVudEZlZWRiYWNrQXJlYTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGUgcHJldmlvdXMgbWFya2VkIGphY2tldHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaG9jb2xhdGVGYWN0b3J5XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfY2xlYXJQcmV2aW91c01hcmtlZEphY2tldHMoY2hvY29sYXRlRmFjdG9yeSkge1xuXG4gICAgICAgIGNvbnN0IG1hcmtlZEphY2tldHMgPSBjaG9jb2xhdGVGYWN0b3J5LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oYXMtZXJyb3InKTtcbiAgICAgICAgY29uc3QgbWFya2VkSmFja2V0c0Ftb3VudCA9IG1hcmtlZEphY2tldHMubGVuZ3RoO1xuXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBtYXJrZWRKYWNrZXRzQW1vdW50OyBpKyspe1xuICAgICAgICAgICAgbWFya2VkSmFja2V0c1tpXS5jbGFzc0xpc3QucmVtb3ZlKCdoYXMtZXJyb3InKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHcmFiIHRoZSBqYWNrZXQgb2YgdGhlIHZpc2l0b3JcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2aXNpdG9yXG4gICAgICogQHJldHVybnMge251bGx8KnwoKCkgPT4gKE5vZGUgfCBudWxsKSl8QWN0aXZlWC5JWE1MRE9NTm9kZXwoTm9kZSAmIFBhcmVudE5vZGUpfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dyYWJWaXNpdG9ySmFja2V0OiBmdW5jdGlvbih2aXNpdG9yKXtcblxuICAgICAgICAvLyBDaGVjayBpZiB2aXNpdG9yIGlzIGRlZmluZWRcbiAgICAgICAgaWYgKCFpc3NldCh2aXNpdG9yKSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gRG8gbG9vcCBzZXR0aW5nc1xuICAgICAgICBjdXJyZW50TGF5ZXIgPSB2aXNpdG9yO1xuICAgICAgICBzYWZldHlCcmVhayA9IDA7XG5cbiAgICAgICAgLy8gR3JhYiB0aGUgbmV4dCBsYXllciB0aWxsIGl0IGlzIHRoZSBqYWNrZXQgKG9yIHNhZmV0eUJyZWFrIGhhcyBiZWVuIHJlYWNoZWRcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgc2FmZXR5QnJlYWsrKztcbiAgICAgICAgICAgIGN1cnJlbnRMYXllciA9IGN1cnJlbnRMYXllci5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYoY3VycmVudExheWVyLmNsYXNzTGlzdC5jb250YWlucygnanMtZm9ybS1lbGVtZW50JykpIHJldHVybiBjdXJyZW50TGF5ZXI7XG4gICAgICAgIH0gd2hpbGUgKGN1cnJlbnRMYXllci50YWdOYW1lICE9PSAnQk9EWScgJiYgc2FmZXR5QnJlYWsgPD0gMTApO1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZWRpcmVjdCB0aGUgdmlzaXRvciB0byB0aGUgdGhhbmtzIHBhZ2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZXh0U3RvcFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3RoYW5rc0ZvclZpc2l0aW5nOiBmdW5jdGlvbiAobmV4dFN0b3ApIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gbmV4dFN0b3A7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVua25vd24gZXJyb3Igb2NjdXJyZWQsIGxvZyB0aGUgZXJyb3JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaG9jb2xhdGVGYWN0b3J5XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdW5rbm93bkdhcEluRmFjdG9yeTogZnVuY3Rpb24gKGNob2NvbGF0ZUZhY3RvcnkpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hvY29sYXRlRmFjdG9yeSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaG9jb2xhdGVGYWN0b3J5OiBVbmtvd24gRXJyb3InKTtcbiAgICB9LFxufTtcblxuQ2hvY29sYXRlRmFjdG9yeS5lbnRlcigpOyIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBDb29raWUgaGFuZGxlclxuICAgLSBQcmltYXJ5IHVzYWdlIGZvciB0b2dnbGluZyB0aGUgY29va2llIG1lc3NhZ2UgYW5kL29yIHN3aXRjaFxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IENvb2tpZUhhbmRsZXIgPSB7XG5cbiAgICBjb29raWVCYXIgOiBudWxsLFxuICAgIGNvb2tpZU92ZXJsYXkgOiBudWxsLFxuICAgIGNvb2tpZU1lc3NhZ2UgOiBudWxsLFxuXG4gICAgY29va2llU3dpdGNoIDogbnVsbCxcblxuICAgIGNvb2tpZUZhZGVPdXRBbmltYXRpb25EdXJhdGlvbiA6IDQwMCxcbiAgICBhY2NlcHRUcmFja2luZyA6IGZhbHNlLFxuXG4gICAgLy8gSW5pdGlhbGl6ZSBjb29raWUgaGFuZGxlclxuICAgIGluaXQgOiBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICAvLyBCaW5kIGNvb2tpZSBiYXIgb3Igb3ZlcmxheSB0byBjb29raWVNZXNzYWdlXG4gICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llTWVzc2FnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jb29raWUtYmFyLCAuanMtY29va2llLW92ZXJsYXknKTtcblxuICAgICAgICAvLyBCaW5kIGNvb2tpZSBiYXIgdG8gY29va2llQmFyXG4gICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llQmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWNvb2tpZS1iYXInKTtcblxuICAgICAgICAvLyBJZiBpc3NldCBpbml0IHRoZSBmdW5jdGlvbnMgZm9yIGNvb2tpZSBiYXJcbiAgICAgICAgaWYoaXNzZXQoQ29va2llSGFuZGxlci5jb29raWVCYXIpKXtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuaW5pdENvb2tpZUJhcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICAvLyBFbHNlIHRyeSB0byBjb25uZWN0IGNvb2tpZSBvdmVybGF5IHdpdGggdHJhY2tpbmcgdG8gY29va2llT3ZlcmxheVxuICAgICAgICAgICAgQ29va2llSGFuZGxlci5jb29raWVPdmVybGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWNvb2tpZS1vdmVybGF5Jyk7XG5cbiAgICAgICAgICAgIC8vIElmIGlzc2V0IGluaXQgdGhlIGZ1bmN0aW9ucyBmb3IgY29va2llIG92ZXJsYXlcbiAgICAgICAgICAgIGlmKGlzc2V0KENvb2tpZUhhbmRsZXIuY29va2llT3ZlcmxheSkpe1xuICAgICAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuaW5pdENvb2tpZU92ZXJsYXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGVpdGhlciB0eXBlIG9mIGNvb2tpZSBoYXMgYmVlbiBmb3VuZCBjaGVjayBpZiBzZXR0aW5ncyBhcmUgZGVmaW5lZFxuICAgICAgICBpZihpc3NldChDb29raWVIYW5kbGVyLmNvb2tpZU1lc3NhZ2UpKXtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuY2hlY2tGb3JDb29raWVTZXR0aW5ncygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmluZCBjb29raWUgc3dpdGNoIHRvIEhhbmRsZXJcbiAgICAgICAgQ29va2llSGFuZGxlci5jb29raWVTd2l0Y2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtY29va2llLXN3aXRjaCcpO1xuICAgICAgICAvLyBJZiBpc3NldCBpbml0IHRoZSBmdW5jdGlvbnMgZm9yIGNvb2tpZSBzd2l0Y2hcbiAgICAgICAgaWYoaXNzZXQoQ29va2llSGFuZGxlci5jb29raWVTd2l0Y2gpKXtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuaW5pdENvb2tpZVN3aXRjaCgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEluaXQgdGhlIGNvb2tpZSBiYXIgYWN0aW9uc1xuICAgIGluaXRDb29raWVCYXI6IGZ1bmN0aW9uKCl7XG4gICAgICAgIGNvbnN0IGNsb3NlQnV0dG9uID0gQ29va2llSGFuZGxlci5jb29raWVCYXIucXVlcnlTZWxlY3RvcignLmpzLWRpc2FibGUtY29va2llLWJhcicpO1xuICAgICAgICBpZihpc3NldChjbG9zZUJ1dHRvbikpe1xuICAgICAgICAgICAgY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBDb29raWVIYW5kbGVyLmNsb3NlQ29va2llTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gSW5pdCB0aGUgY29va2llIG92ZXJsYXkgYWN0aW9uc1xuICAgIGluaXRDb29raWVPdmVybGF5OiBmdW5jdGlvbigpe1xuXG4gICAgICAgIC8vIE9wZW4gdGhlIGNvb2tpZSBzZXR0aW5ncyBldmVudFxuICAgICAgICBjb25zdCBvcGVuQ29va2llU2V0dGluZ3NCdXR0b24gPSBDb29raWVIYW5kbGVyLmNvb2tpZU1lc3NhZ2UucXVlcnlTZWxlY3RvcignLmpzLWNoYW5nZS1jb29raWVzLXNldHRpbmdzJyk7XG4gICAgICAgIGlmKGlzc2V0KG9wZW5Db29raWVTZXR0aW5nc0J1dHRvbikpe1xuICAgICAgICAgICAgb3BlbkNvb2tpZVNldHRpbmdzQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgQ29va2llSGFuZGxlci5vcGVuQ29va2llU2V0dGluZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVG9nZ2xlIG9mIHRoZSB0cmFja2luZyBpbnB1dFxuICAgICAgICBjb25zdCB0b2dnbGVUcmFja2luZ0lucHV0ID0gQ29va2llSGFuZGxlci5jb29raWVNZXNzYWdlLnF1ZXJ5U2VsZWN0b3IoJy5jLWNvb2tpZS10eXBlX19pbnB1dC0tdHJhY2tpbmcnKTtcbiAgICAgICAgaWYoaXNzZXQodG9nZ2xlVHJhY2tpbmdJbnB1dCkpe1xuXG4gICAgICAgICAgICBpZih0b2dnbGVUcmFja2luZ0lucHV0LmNoZWNrZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBDb29raWVIYW5kbGVyLmFjY2VwdFRyYWNraW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdG9nZ2xlVHJhY2tpbmdJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBDb29raWVIYW5kbGVyLnRvZ2dsZVRyYWNraW5nU2V0dGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBY2NlcHQgLyBTYXZlIGNvb2tpZXMgYnV0dG9uIGV2ZW50XG4gICAgICAgIGNvbnN0IGFjY2VwdEJ1dHRvbiA9IENvb2tpZUhhbmRsZXIuY29va2llTWVzc2FnZS5xdWVyeVNlbGVjdG9yKCcuanMtYWNjZXB0LWNvb2tpZXMnKTtcbiAgICAgICAgaWYoaXNzZXQoYWNjZXB0QnV0dG9uKSl7XG4gICAgICAgICAgICBhY2NlcHRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBDb29raWVIYW5kbGVyLnNldENvb2tpZVNldHRpbmdzKTtcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8vIEluaXQgdGhlIGNvb2tpZSBzd2l0Y2ggYWN0aW9uc1xuICAgIGluaXRDb29raWVTd2l0Y2g6IGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgLy8gVG9nZ2xlIG9mIHRoZSB0cmFja2luZyBpbnB1dFxuICAgICAgICBjb25zdCB0b2dnbGVUcmFja2luZ0lucHV0ID0gQ29va2llSGFuZGxlci5jb29raWVTd2l0Y2gucXVlcnlTZWxlY3RvcignLmMtY29va2llLXR5cGVfX2lucHV0LS10cmFja2luZycpO1xuICAgICAgICBpZihpc3NldCh0b2dnbGVUcmFja2luZ0lucHV0KSl7XG5cbiAgICAgICAgICAgIC8vIEZvcmNlIHRoZSBzdGF0ZSBvZiB0aGUgY29va2llIHN3aXRjaCBpbnB1dCBiZWNhdXNlIHRoZSBwb3AtdXAgaXMgZm9yY2VkIG9uIGNoZWNrZWRcbiAgICAgICAgICAgIC8vIHdoaWxlIHRoZSBzd2l0Y2ggY2hlY2tzIGJ5IHBocCBpZiB0aGUgY29va2llIHJlYWxseSBleGlzdCBvciBub3RcbiAgICAgICAgICAgIGlmKHRvZ2dsZVRyYWNraW5nSW5wdXQuY2hlY2tlZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuYWNjZXB0VHJhY2tpbmcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBDb29raWVIYW5kbGVyLmFjY2VwdFRyYWNraW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRvZ2dsZVRyYWNraW5nSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgQ29va2llSGFuZGxlci50b2dnbGVUcmFja2luZ1NldHRpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2F2ZSBjb29raWVzIGJ1dHRvbiBldmVudFxuICAgICAgICBjb25zdCBzYXZlQnV0dG9uID0gQ29va2llSGFuZGxlci5jb29raWVTd2l0Y2gucXVlcnlTZWxlY3RvcignLmpzLXNhdmUtY29va2llLXNldHRpbmdzJyk7XG4gICAgICAgIGlmKGlzc2V0KHNhdmVCdXR0b24pKXtcbiAgICAgICAgICAgIHNhdmVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llRmFkZU91dEFuaW1hdGlvbkR1cmF0aW9uID0gMDsgLy8gT24gdGhlIHN3aXRjaCBjbGljayB3ZSB3YW50IG5vIGRlbGF5IDopXG4gICAgICAgICAgICAgICAgQ29va2llSGFuZGxlci5zZXRDb29raWVTZXR0aW5ncygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgIH0sXG5cbiAgICBjaGVja0ZvckNvb2tpZVNldHRpbmdzOiBmdW5jdGlvbigpe1xuICAgICAgICBpZiAoQ29va2llLmdldCgnY29va2llTWVzc2FnZScpKSB7XG4gICAgICAgICAgICBDb29raWVIYW5kbGVyLmNvb2tpZU1lc3NhZ2UuY2xhc3NMaXN0LmFkZCgnaXMtYWNjZXB0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llTWVzc2FnZS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY2NlcHRlZCcpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdpcy1jb29raWUtYmFyLXZpc2libGUnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjbG9zZUNvb2tpZU1lc3NhZ2U6IGZ1bmN0aW9uICgpe1xuICAgICAgICBDb29raWUuc2V0KCdjb29raWVNZXNzYWdlJywgdHJ1ZSwgOTApO1xuICAgICAgICBDb29raWVIYW5kbGVyLmNvb2tpZU1lc3NhZ2UuY2xhc3NMaXN0LmFkZCgnaXMtdHJhbnNpdGlvbmluZy1vdXQnKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1jb29raWUtYmFyLXZpc2libGUnKTtcbiAgICB9LFxuXG4gICAgb3BlbkNvb2tpZVNldHRpbmdzOiBmdW5jdGlvbiAoKXtcbiAgICAgICAgQ29va2llSGFuZGxlci5jb29raWVPdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jb29raWUtc2V0dGluZ3MnKS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1oaWRkZW4nKTtcbiAgICAgICAgQ29va2llSGFuZGxlci5jb29raWVPdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jb29raWUtaW5mbycpLmNsYXNzTGlzdC5hZGQoJ2lzLWhpZGRlbicpO1xuICAgIH0sXG5cbiAgICB0b2dnbGVUcmFja2luZ1NldHRpbmc6IGZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKENvb2tpZUhhbmRsZXIuYWNjZXB0VHJhY2tpbmcpe1xuICAgICAgICAgICAgQ29va2llSGFuZGxlci5hY2NlcHRUcmFja2luZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBDb29raWVIYW5kbGVyLmFjY2VwdFRyYWNraW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRDb29raWVTZXR0aW5nczogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIC8vIFNldCB0cmFja2luZyBjb29raWUgb3IgZGVsZXRlIGl0IGlmIGlzc2V0IGFjY29yZGluZyB0byB0aGUgZGVzaXJlZCBzZXR0aW5nc1xuICAgICAgICBpZihDb29raWVIYW5kbGVyLmFjY2VwdFRyYWNraW5nKXtcbiAgICAgICAgICAgIENvb2tpZS5zZXQoJ3RyYWNraW5nQ29va2llQWNjZXB0ZWQnLCAndHJ1ZScsIDkwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgICAgaWYoQ29va2llLmdldCgndHJhY2tpbmdDb29raWVBY2NlcHRlZCcpKXtcbiAgICAgICAgICAgICAgICBDb29raWUuZXJhc2UoJ3RyYWNraW5nQ29va2llQWNjZXB0ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIENvb2tpZUhhbmRsZXIuY2xvc2VDb29raWVNZXNzYWdlKCk7XG5cbiAgICAgICAgLy8gUmVsb2FkIGFmdGVyIGFuaW1hdGlvbiB0byBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHRyYWNraW5nIGFmdGVyIGFjY2VwdGluZyBpdFxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgICB9LCBDb29raWVIYW5kbGVyLmNvb2tpZUZhZGVPdXRBbmltYXRpb25EdXJhdGlvbik7XG4gICAgfSxcblxufTtcblxuQ29va2llSGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBHb29nbGUgTWFwcyBoYW5kbGVyXG4gICAgLSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vamF2YXNjcmlwdC9hZGRpbmctYS1nb29nbGUtbWFwXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuY29uc3QgTWFwc0hhbmRsZXIgPSB7XG5cbiAgICBtYXBzOiBbXSxcbiAgICBrZXk6ICcnLFxuXG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIC8vIEdldCBtYXAgZWxlbWVudHNcbiAgICAgICAgY29uc3QgbWFwcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1nb29nbGUtbWFwJyk7XG5cbiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG1hcCBlbGVtZW50cyBsb29wIHRocm91Z2ggdGhlbSBhbmQgZHJhdyB0aGUgbWFwc1xuICAgICAgICBpZihtYXBzLmxlbmd0aCAhPT0gMCApIHtcblxuICAgICAgICAgICAgLy8gQ29udmVydCBlbGVtZW50cyBpbnRvIG9iamVjdCBmb3IgY2FsbGJhY2sgd2hlbiBzY3JpcHQgYXMgYmVlbiBsb2FkZWRcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBtYXBzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBHZXQgbWFwIGZyb20gbm9kZUxpc3RcbiAgICAgICAgICAgICAgICBjb25zdCBtYXAgPSBtYXBzW2ldO1xuXG4gICAgICAgICAgICAgICAgaWYoIW1hcC5oYXNBdHRyaWJ1dGUoJ2RhdGEtZ29vZ2xlLWxhdCcpIHx8ICFtYXAuaGFzQXR0cmlidXRlKCdkYXRhLWdvb2dsZS1sbmcnKSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBsZXQgbGF0ID0gcGFyc2VGbG9hdChtYXAuZ2V0QXR0cmlidXRlKCdkYXRhLWdvb2dsZS1sYXQnKSk7XG4gICAgICAgICAgICAgICAgbGV0IGxuZyA9IHBhcnNlRmxvYXQobWFwLmdldEF0dHJpYnV0ZSgnZGF0YS1nb29nbGUtbG5nJykpO1xuXG4gICAgICAgICAgICAgICAgTWFwc0hhbmRsZXIubWFwcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZTogbWFwLFxuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF0OiBsYXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsbmc6IGxuZyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBNYXBzSGFuZGxlci5zZXRDdXN0b21TdHlsaW5nKClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2VlIGlmIGdvb2dsZSB2YXJpYWJsZSBleGlzdHNcbiAgICAgICAgICAgIGlmICh0eXBlb2YoZ29vZ2xlKSA9PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YoZ29vZ2xlLm1hcHMpID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9hZCBleHRlcm5hbCBzY3JpcHQgd2l0aCBkcmF3TWFwcyBjYWxsYmFja1xuICAgICAgICAgICAgICAgIGdldFNjcmlwdCgnaHR0cHM6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2pzP2tleT0nICsgTWFwc0hhbmRsZXIua2V5LCBNYXBzSGFuZGxlci5kcmF3TWFwcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIElmIGFscmVhZHkgbG9hZGVkIGRyYXcgbWFwc1xuICAgICAgICAgICAgICAgIE1hcHNIYW5kbGVyLmRyYXdNYXBzKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEcmF3IHRoZSBnb29nbGUgbWFwc1xuICAgICAqL1xuICAgIGRyYXdNYXBzOiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXBzSGFuZGxlci5tYXBzLmxlbmd0aDsgaSsrKSAge1xuXG4gICAgICAgICAgICBjb25zdCBtYXAgPSBNYXBzSGFuZGxlci5tYXBzW2ldO1xuXG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBtYXBcbiAgICAgICAgICAgIGNvbnN0IGdvb2dsZU1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAobWFwLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB6b29tOiAxMSxcbiAgICAgICAgICAgICAgICBjZW50ZXI6IG1hcC5sb2NhdGlvbixcbiAgICAgICAgICAgICAgICBkaXNhYmxlRGVmYXVsdFVJOiB0cnVlLFxuICAgICAgICAgICAgICAgIHN0eWxlczogbWFwLnN0eWxlc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIEFkZCBhIG1hcmtlclxuICAgICAgICAgICAgY29uc3QgbWFya2VyID0gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IG1hcC5sb2NhdGlvbixcbiAgICAgICAgICAgICAgICBtYXA6IGdvb2dsZU1hcFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBjdXN0b20gc3R5bGluZyBmb3IgdGhlIEdvb2dsZSBNYXBzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7KltdfVxuICAgICAqL1xuICAgIHNldEN1c3RvbVN0eWxpbmc6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInBvaVwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwibGFiZWxzLnRleHQuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjNzQ3NDc0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogXCIyM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInBvaS5hdHRyYWN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmMzhlYjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJwb2kuZ292ZXJubWVudFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjY2VkN2RiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicG9pLm1lZGljYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2ZmYTVhOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInBvaS5wYXJrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNjN2U1YzhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJwb2kucGxhY2Vfb2Zfd29yc2hpcFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjZDZjYmM3XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicG9pLnNjaG9vbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjYzRjOWU4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicG9pLnNwb3J0c19jb21wbGV4XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNiMWVhZjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeVwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IFwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwibGFiZWxzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2aXNpYmlsaXR5XCI6IFwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogXCIxMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmhpZ2h3YXlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2ZmZDRhNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInJvYWQuYXJ0ZXJpYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2ZmZTlkMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInJvYWQubG9jYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImFsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidmlzaWJpbGl0eVwiOiBcInNpbXBsaWZpZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmxvY2FsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ3ZWlnaHRcIjogXCIzLjAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZC5sb2NhbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuc3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ3ZWlnaHRcIjogXCIwLjMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZC5sb2NhbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwibGFiZWxzLnRleHRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZpc2liaWxpdHlcIjogXCJvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInJvYWQubG9jYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImxhYmVscy50ZXh0LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiIzc0NzQ3NFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IFwiMzZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmxvY2FsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJsYWJlbHMudGV4dC5zdHJva2VcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2U5ZTVkY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IFwiMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJ0cmFuc2l0LmxpbmVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2aXNpYmlsaXR5XCI6IFwib25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiBcIjEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcIndhdGVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJhbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2QyZTdmN1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdO1xuICAgIH1cbn07XG5cbk1hcHNIYW5kbGVyLmluaXQoKTsiLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgTmF2aWdhdGlvbiBoYW5kbGVyXG4gICAtIEhhbmRsZXMgdGhlIHNob3dpbmcgYW5kIGhpZGluZyBvZiB0aGUgb3ZlcmxheS1tZW51IGNvbXBvbmVudCB3aGljaCBoYXMgdGhlIHByb3BlciBjbGFzc2VzLlxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IGJvZHlTY3JvbGxMb2NrID0gcmVxdWlyZSgnYm9keS1zY3JvbGwtbG9jaycpO1xuXG5jb25zdCBPdmVybGF5TWVudUhhbmRsZXIgPSB7XG5cbiAgICAvLyBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gICAgIGNvbnN0IG92ZXJsYXlNZW51VHJpZ2dlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1vdmVybGF5LW1lbnUtdHJpZ2dlcicpO1xuICAgIC8vICAgICBPdmVybGF5TWVudUhhbmRsZXIuaW5pdE92ZXJsYXlNZW51KG92ZXJsYXlNZW51VHJpZ2dlcik7XG4gICAgLy8gfSxcblxuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBjb25zdCBvdmVybGF5TWVudVRyaWdnZXJMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLW92ZXJsYXktbWVudS10cmlnZ2VyJyk7XG4gICAgICAgIGNvbnN0IG92ZXJsYXlNZW51VHJpZ2dlckxpc3RDb3VudCA9IG92ZXJsYXlNZW51VHJpZ2dlckxpc3QubGVuZ3RoO1xuXG4gICAgICAgIGlmKGlzc2V0KG92ZXJsYXlNZW51VHJpZ2dlckxpc3QpICYmIG92ZXJsYXlNZW51VHJpZ2dlckxpc3RDb3VudCAhPT0gMCl7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgb3ZlcmxheU1lbnVUcmlnZ2VyTGlzdENvdW50OyBpKyspe1xuICAgICAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlNZW51VHJpZ2dlciA9IG92ZXJsYXlNZW51VHJpZ2dlckxpc3RbaV07XG4gICAgICAgICAgICAgICAgT3ZlcmxheU1lbnVIYW5kbGVyLmluaXRPdmVybGF5TWVudShvdmVybGF5TWVudVRyaWdnZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGluaXRPdmVybGF5TWVudTogZnVuY3Rpb24gKG92ZXJsYXlNZW51VHJpZ2dlcikge1xuICAgICAgICBvdmVybGF5TWVudVRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBPdmVybGF5TWVudUhhbmRsZXIudG9nZ2xlT3ZlcmxheU1lbnUsIGZhbHNlKTtcbiAgICB9LFxuXG4gICAgdG9nZ2xlT3ZlcmxheU1lbnU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBjb25zdCBvdmVybGF5TWVudU5hdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1vdmVybGF5LW1lbnUnKTtcbiAgICAgICAgLy8gY29uc3Qgb3ZlcmxheU1lbnVCb2R5ID0gb3ZlcmxheU1lbnUucXVlcnlTZWxlY3RvcignLmpzLW92ZXJsYXktbWVudS1wZXJzaXN0LXNjcm9sbGluZycpO1xuXG4gICAgICAgIC8vIEJhaWwgaWYgb3ZlcmxheU1lbnUgZG9lc24ndCBleGlzdFxuICAgICAgICBpZiAoIW92ZXJsYXlNZW51TmF2KSByZXR1cm47XG5cbiAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXNseSBsb2NrZWQgc2Nyb2xsIG9uIHRoZSBib2R5XG4gICAgICAgIGJvZHlTY3JvbGxMb2NrLmVuYWJsZUJvZHlTY3JvbGwob3ZlcmxheU1lbnVOYXYpO1xuXG4gICAgICAgIC8vIElmIHRoZSBvdmVybGF5TWVudSBpcyBhbHJlYWR5IGFjdGl2ZSwgY29sbGFwc2UgaXQgYW5kIHF1aXRcbiAgICAgICAgaWYgKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1vdmVybGF5LW1lbnUtYWN0aXZlJykpIHtcbiAgICAgICAgICAgIG92ZXJsYXlNZW51TmF2LnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0YWJpbmRleD1cIjBcIl0nKS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgICAgICAgICAgICBlbGVtLnRhYkluZGV4ID0gLTE7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1vdmVybGF5LW1lbnUtYWN0aXZlJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2NrIHNjcm9sbGluZyBvbiB0aGUgYm9keVxuICAgICAgICBib2R5U2Nyb2xsTG9jay5kaXNhYmxlQm9keVNjcm9sbChvdmVybGF5TWVudU5hdik7XG5cbiAgICAgICAgb3ZlcmxheU1lbnVOYXYucXVlcnlTZWxlY3RvckFsbCgnW3RhYmluZGV4PVwiLTFcIl0nKS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgICAgICAgIGVsZW0udGFiSW5kZXggPSAwO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUb2dnbGUgYWN0aXZlIG92ZXJsYXlNZW51IGJ5IHNldHRpbmcgYSBjbGFzcyBvbiB0aGUgYm9keVxuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ2lzLW92ZXJsYXktbWVudS1hY3RpdmUnKTtcbiAgICAgICAgb3ZlcmxheU1lbnVOYXYuaGlkZGVuID0gZmFsc2U7XG4gICAgfVxufTtcblxuT3ZlcmxheU1lbnVIYW5kbGVyLmluaXQoKTsiLCIvKipcbiAqIENyZWF0ZWQgYnkgUGFzY2FsIG9uIDA2LzEyLzE3LlxuICogKE5hbWUgY2hhbmdlcyBieSBSb2Igb24gMTgvMDMvMTgpXG4gKi9cblxuLyogRXhhbXBsZVxuXG5jb25zdCBoZWFkZXJJbWFnZVNsaWRlclNldHRpbmcgPSBuZXcgUHJvamVjdG9yU2V0dGluZyh7XG4gICAgc2xpZGVyUHJvamVjdG9ySWQ6ICdoZWFkZXItaW1hZ2Utc2xpZGVyJyxcbiAgICBzbGlkZVF1ZXJ5OiAnI2hlYWRlci1pbWFnZS1zbGlkZXIgLnBsYWNlaG9sZGVyIGZpZ3VyZScsXG4gICAgZG90czogJyNoZWFkZXItaW1hZ2Utc2xpZGVyIC5zbGlkZXItbmF2aWdhdGlvbi1sYWJlbHMgLm5hdmlnYXRpb24gc3BhbicsXG4gICAgY2FwdGlvbnM6ICcjaGVhZGVyLWltYWdlLXNsaWRlciAuc2xpZGVyLW5hdmlnYXRpb24tbGFiZWxzIC5jYXB0aW9uIHAnLFxuICAgIGF1dG9TbGlkZTogdHJ1ZSxcbiAgICBzbGlkZXJJbnRlcnZhbDogNDAwMFxufSk7XG5oZWFkZXJJbWFnZVNsaWRlclNldHRpbmcgPSBoZWFkZXJJbWFnZVNsaWRlclNldHRpbmcucHJlcGFyZVBhcmFtZXRlcnMoKTtcblxuY29uc3QgaGVhZGVySW1hZ2VTbGlkZXIgPSBuZXcgUHJvamVjdG9yKGhlYWRlckltYWdlU2xpZGVyU2V0dGluZykuaW5pdCgpO1xuXG4gKi9cblxubGV0IHByb2plY3RvcnMgPSBbXTtcblxuY29uc3QgcHJvamVjdG9yQ29udGFpbmVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1wcm9qZWN0b3InKTtcbmNvbnN0IHByb2plY3RvckNvbnRhaW5lcnNMZW5ndGggPSBwcm9qZWN0b3JDb250YWluZXJzLmxlbmd0aDtcblxuZm9yKGxldCBpID0wOyBpIDwgcHJvamVjdG9yQ29udGFpbmVyc0xlbmd0aDsgaSsrKXtcblxuICAgIGNvbnN0IHByb2plY3RvciA9IHByb2plY3RvckNvbnRhaW5lcnNbaV07XG4gICAgY29uc3QgcHJvamVjdG9ySWQgPSBwcm9qZWN0b3IuZ2V0QXR0cmlidXRlKCdpZCcpO1xuXG4gICAgaWYocHJvamVjdG9ySWQgIT09IG51bGwpe1xuXG4gICAgICAgIGNvbnN0IHByb2plY3RvclNldHRpbmcgPSBuZXcgUHJvamVjdG9yU2V0dGluZyh7XG4gICAgICAgICAgICBzbGlkZXJJZDogcHJvamVjdG9ySWQsXG4gICAgICAgICAgICBzbGlkZVF1ZXJ5OiAnIycgKyBwcm9qZWN0b3JJZCArJyAuanMtcHJvamVjdG9yLXNsaWRlJyxcbiAgICAgICAgICAgIG5hdmlnYXRpb25CdXR0b25zOiAnIycgKyBwcm9qZWN0b3JJZCArJyAuanMtcHJvamVjdG9yLWJ1dHRvbicgLFxuICAgICAgICAgICAgZG90czogJyMnICsgcHJvamVjdG9ySWQgKycgLmpzLXByb2plY3Rvci1pbmRpY2F0b3InICxcbiAgICAgICAgICAgIGF1dG9TbGlkZTogdHJ1ZSxcbiAgICAgICAgICAgIHNsaWRlckludGVydmFsOiA0MDAwXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHByb2plY3RvcnMucHVzaCggbmV3IFByb2plY3Rvcihwcm9qZWN0b3JTZXR0aW5nLnByZXBhcmVQYXJhbWV0ZXJzKCkpLmluaXQoKSApO1xuICAgIH1cbiAgICBlbHNlIGNvbnNvbGUubG9nKCdBbiBpbWFnZSBzbGlkZXIgaGFzIG5vIGlkLi4uJyk7XG59XG5cblxuZnVuY3Rpb24gUHJvamVjdG9yU2V0dGluZyhzZXR0aW5nc09iamVjdCkge1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICB0aGlzLnNsaWRlcklkID0gJyc7XG4gICAgdGhpcy5kZWZpbmVkUHJldmlvdXNOZXh0ID0gdHJ1ZTtcbiAgICB0aGlzLmF1dG9TbGlkZSA9IGZhbHNlO1xuICAgIHRoaXMuc2xpZGVySW50ZXJ2YWwgPSA0MDAwO1xuICAgIHRoaXMubmF2aWdhdGlvbkJ1dHRvbnMgPSAnJztcbiAgICB0aGlzLmRvdHMgPSAnJztcbiAgICB0aGlzLmNhcHRpb25zID0gJyc7XG4gICAgdGhpcy5zbGlkZVF1ZXJ5ID0gJyc7XG5cbiAgICB0aGlzLnNldFByb2plY3RvcklkID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICB0aGlzLnNsaWRlcklkID0gc3RyaW5nO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIHRoaXMuc2V0RGVmaW5lZFByZXZpb3VzTmV4dCA9IGZ1bmN0aW9uIChib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lZFByZXZpb3VzTmV4dCA9IGJvb2xlYW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXRBdXRvU2xpZGUgPSBmdW5jdGlvbiAoYm9vbGVhbikge1xuICAgICAgICB0aGlzLmF1dG9TbGlkZSA9IGJvb2xlYW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXRTbGlkZXJJbnRlcnZhbCA9IGZ1bmN0aW9uIChpbnRlZ2VyKSB7XG4gICAgICAgIHRoaXMuc2xpZGVySW50ZXJ2YWwgPSBpbnRlZ2VyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIHRoaXMuc2V0U2xpZGVRdWVyeSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zbGlkZVF1ZXJ5ID0gc3RyaW5nO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIHRoaXMuc2V0TmF2aWdhdGlvbkJ1dHRvbnMgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkJ1dHRvbnMgPSBzdHJpbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXREb3RzID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICB0aGlzLmRvdHMgPSBzdHJpbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXRDYXB0aW9ucyA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jYXB0aW9ucyA9IHN0cmluZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICB0aGlzLmdldFByb2plY3RvcklkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zbGlkZXJJZDtcbiAgICB9O1xuICAgIHRoaXMuZ2V0RGVmaW5lZFByZXZpb3VzTmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmaW5lZFByZXZpb3VzTmV4dDtcbiAgICB9O1xuICAgIHRoaXMuZ2V0QXV0b1NsaWRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdXRvU2xpZGU7XG4gICAgfTtcbiAgICB0aGlzLmdldFNsaWRlckludGVydmFsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zbGlkZXJJbnRlcnZhbDtcbiAgICB9O1xuICAgIHRoaXMuZ2V0U2xpZGVRdWVyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGVRdWVyeTtcbiAgICB9O1xuICAgIHRoaXMuZ2V0TmF2aWdhdGlvbkJ1dHRvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25CdXR0b25zO1xuICAgIH07XG4gICAgdGhpcy5nZXREb3RzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb3RzO1xuICAgIH07XG4gICAgdGhpcy5nZXRDYXB0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FwdGlvbnM7XG4gICAgfTtcblxuXG4gICAgLy8gSW52ZXJ0IHNldHRlcnMgdG8gZ2V0dGVyc1xuICAgIHRoaXMucHJlcGFyZVBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNsaWRlcklkOiBzZWxmLmdldFByb2plY3RvcklkKCksXG4gICAgICAgICAgICBkZWZpbmVkUHJldmlvdXNOZXh0OiBzZWxmLmdldERlZmluZWRQcmV2aW91c05leHQoKSxcbiAgICAgICAgICAgIGF1dG9TbGlkZTogc2VsZi5nZXRBdXRvU2xpZGUoKSxcbiAgICAgICAgICAgIHNsaWRlckludGVydmFsOiBzZWxmLmdldFNsaWRlckludGVydmFsKCksXG4gICAgICAgICAgICBuYXZpZ2F0aW9uQnV0dG9uczogc2VsZi5nZXROYXZpZ2F0aW9uQnV0dG9ucygpLFxuICAgICAgICAgICAgZG90czogc2VsZi5nZXREb3RzKCksXG4gICAgICAgICAgICBjYXB0aW9uczogc2VsZi5nZXRDYXB0aW9ucygpLFxuICAgICAgICAgICAgc2xpZGVRdWVyeTogc2VsZi5nZXRTbGlkZVF1ZXJ5KClcbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIC8vIE1hc3MgYXNzaWduIHNldHRpbmdzXG4gICAgdGhpcy5maWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBPYmplY3Qua2V5cyhzZXR0aW5nc09iamVjdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIC8vICAgICBzZWxmW2tleV0gPSBzZXR0aW5nc09iamVjdFtrZXldO1xuICAgICAgICAvLyB9KTtcblxuICAgICAgICBjb25zdCBzZXR0aW5nc09iamVjdEtleXMgPSBPYmplY3Qua2V5cyhzZXR0aW5nc09iamVjdCk7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzT2JqZWN0TGVuZ3RoID0gc2V0dGluZ3NPYmplY3RLZXlzLmxlbmd0aDtcblxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgc2V0dGluZ3NPYmplY3RMZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBzZXR0aW5nc09iamVjdEtleXNbaV07XG4gICAgICAgICAgICBzZWxmW2tleV0gPSBzZXR0aW5nc09iamVjdFtrZXldO1xuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgdGhpcy5maWxsKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzbGlkZXJJZDogc2VsZi5zZXRQcm9qZWN0b3JJZCxcbiAgICAgICAgZGVmaW5lZFByZXZpb3VzTmV4dDogc2VsZi5zZXREZWZpbmVkUHJldmlvdXNOZXh0LFxuICAgICAgICBhdXRvU2xpZGU6IHNlbGYuc2V0QXV0b1NsaWRlLFxuICAgICAgICBzbGlkZXJJbnRlcnZhbDogc2VsZi5zZXRTbGlkZXJJbnRlcnZhbCxcbiAgICAgICAgbmF2aWdhdGlvbkJ1dHRvbnM6IHNlbGYuc2V0TmF2aWdhdGlvbkJ1dHRvbnMsXG4gICAgICAgIGRvdHM6IHNlbGYuc2V0RG90cyxcbiAgICAgICAgY2FwdGlvbnM6IHNlbGYuc2V0Q2FwdGlvbnMsXG4gICAgICAgIHNsaWRlUXVlcnk6IHNlbGYuc2V0U2xpZGVRdWVyeSxcbiAgICAgICAgcHJlcGFyZVBhcmFtZXRlcnM6IHNlbGYucHJlcGFyZVBhcmFtZXRlcnNcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBQcm9qZWN0b3Ioc2V0dGluZ3MpIHtcblxuICAgIC8vRGVmaW5lIFByb2plY3RvciBvYmplY3RcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICB0aGlzLnNsaWRlck9iamVjdCA9ICcnO1xuXG4gICAgLy9TbGlkZVBhcmFtZXRlcnNcbiAgICB0aGlzLmFjdGl2ZVNsaWRlSWQgPSAwO1xuICAgIHRoaXMucHJldmlvdXNTbGlkZUlkID0gMDtcbiAgICB0aGlzLm5leHRTbGlkZUlkID0gMDtcbiAgICB0aGlzLmF2YWlsYWJsZVNsaWRlcyA9IDE7XG4gICAgdGhpcy5zbGlkZXMgPSBbXTtcbiAgICB0aGlzLmF1dG9TbGlkZUludGVydmFsID0gbnVsbDtcblxuICAgIHRoaXMuc2V0dGluZ3MgPSB7fTtcblxuICAgIHRoaXMuaW5pdCA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAvL0FwcGVuZCBzZXR0aW5ncyB0byBzZWxmXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcblxuICAgICAgICAvL0Fzc2lnbiBuZWVkZWQgZWxlbWVudHMgYW5kIGNhbGN1bGF0aW9uc1xuICAgICAgICB0aGlzLnNsaWRlck9iamVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2V0dGluZ3Muc2xpZGVySWQpO1xuICAgICAgICB0aGlzLnNsaWRlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5zZXR0aW5ncy5zbGlkZVF1ZXJ5KTtcbiAgICAgICAgdGhpcy5hdmFpbGFibGVTbGlkZXMgPSB0aGlzLnNsaWRlcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuYWN0aXZlU2xpZGVJZCA9IDA7XG5cbiAgICAgICAgLy9EZWZpbmUgcHJldmlvdXMgYW5kIG5leHQgaWYgd2Ugd2FudCB0byB1c2UgdGhvc2VcbiAgICAgICAgaWYgKHNlbGYuc2V0dGluZ3MuZGVmaW5lZFByZXZpb3VzTmV4dCkgdGhpcy5zZXRQcmV2aW91c0FuZE5leHRTbGlkZSgpO1xuXG4gICAgICAgIC8vIFNldCBhY3RpdmUgc2xpZGUgKGFuZCBwb3NzaWJsZSBwcmV2aW91cyBhbmQgbmV4dCBjbGFzc2VzKVxuICAgICAgICB0aGlzLnNldFNsaWRlKCk7XG5cbiAgICAgICAgLy8gU3dpcGUgaW50ZXJhY3Rpb25cbiAgICAgICAgY29uc3Qgc3dpcGVHZXN0dXJlcyA9IG5ldyBIYW1tZXIodGhpcy5zbGlkZXJPYmplY3QpO1xuICAgICAgICBzd2lwZUdlc3R1cmVzLm9uKCdzd2lwZWxlZnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnJlc2V0QXV0b1NsaWRlKCk7XG4gICAgICAgICAgICBzZWxmLm5leHRTbGlkZSgpO1xuICAgICAgICAgICAgc2VsZi5zZXRTbGlkZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgc3dpcGVHZXN0dXJlcy5vbignc3dpcGVyaWdodCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYucmVzZXRBdXRvU2xpZGUoKTtcbiAgICAgICAgICAgIHNlbGYucHJldmlvdXNTbGlkZSgpO1xuICAgICAgICAgICAgc2VsZi5zZXRTbGlkZSgpO1xuICAgICAgICB9KTtcblxuXG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MubmF2aWdhdGlvbkJ1dHRvbnMgIT09ICcnKSB7XG5cbiAgICAgICAgICAgIC8vIENsaWNrIGludGVyYWN0aW9uXG4gICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5zZXR0aW5ncy5uYXZpZ2F0aW9uQnV0dG9ucyk7XG4gICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQnV0dG9uc0xlbmd0aCA9IG5hdmlnYXRpb25CdXR0b25zLmxlbmd0aDtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uQnV0dG9uc0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQnV0dG9uID0gbmF2aWdhdGlvbkJ1dHRvbnNbaV07XG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGlja05hdmlnYXRpb25CdXR0b24odGhpcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmRvdHMgIT09ICcnKSB7XG4gICAgICAgICAgICAvLyBDbGljayBpbnRlcmFjdGlvblxuICAgICAgICAgICAgY29uc3QgZG90cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5zZXR0aW5ncy5kb3RzKTtcbiAgICAgICAgICAgIGNvbnN0IGRvdHNMZW5ndGggPSBkb3RzLmxlbmd0aDtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc2V0dGluZ3MuZG90cyk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhkb3RzKTtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBkb3RzTGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvdCA9IGRvdHNbaV07XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2hpZXInKTtcbiAgICAgICAgICAgICAgICBkb3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2xpY2tEb3QodGhpcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuYXV0b1NsaWRlKCk7XG4gICAgfTtcblxuXG4gICAgdGhpcy5hdXRvU2xpZGUgPSBmdW5jdGlvbiAoKXtcblxuICAgICAgICBpZih0aGlzLmF1dG9TbGlkZUludGVydmFsICE9PSBudWxsKSBjbGVhckludGVydmFsKHRoaXMuYXV0b1NsaWRlSW50ZXJ2YWwpO1xuXG4gICAgICAgIGlmKHRoaXMuc2V0dGluZ3MuYXV0b1NsaWRlICYmIE51bWJlci5pc0ludGVnZXIodGhpcy5zZXR0aW5ncy5zbGlkZXJJbnRlcnZhbCkgKXtcblxuICAgICAgICAgICAgdGhpcy5hdXRvU2xpZGVJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm5leHRTbGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFNsaWRlKCk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcy5zZXR0aW5ncy5zbGlkZXJJbnRlcnZhbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLnJlc2V0QXV0b1NsaWRlID0gc2VsZi5hdXRvU2xpZGU7XG5cblxuICAgIHRoaXMubmV4dFNsaWRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVNsaWRlSWQrKztcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlU2xpZGVJZCA+PSB0aGlzLmF2YWlsYWJsZVNsaWRlcykgdGhpcy5hY3RpdmVTbGlkZUlkID0gMDtcblxuICAgICAgICBpZiAoc2VsZi5zZXR0aW5ncy5kZWZpbmVkUHJldmlvdXNOZXh0KSB0aGlzLnNldFByZXZpb3VzQW5kTmV4dFNsaWRlKCk7XG4gICAgfTtcblxuICAgIHRoaXMucHJldmlvdXNTbGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVTbGlkZUlkLS07XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVNsaWRlSWQgPCAwKSB0aGlzLmFjdGl2ZVNsaWRlSWQgPSB0aGlzLmF2YWlsYWJsZVNsaWRlcyAtIDE7XG5cbiAgICAgICAgaWYgKHNlbGYuc2V0dGluZ3MuZGVmaW5lZFByZXZpb3VzTmV4dCkgdGhpcy5zZXRQcmV2aW91c0FuZE5leHRTbGlkZSgpO1xuICAgIH07XG5cbiAgICB0aGlzLnNldFByZXZpb3VzQW5kTmV4dFNsaWRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm5leHRTbGlkZUlkID0gdGhpcy5hY3RpdmVTbGlkZUlkICsgMTtcbiAgICAgICAgaWYgKHRoaXMubmV4dFNsaWRlSWQgPj0gdGhpcy5hdmFpbGFibGVTbGlkZXMpIHRoaXMubmV4dFNsaWRlSWQgPSAwO1xuXG4gICAgICAgIHRoaXMucHJldmlvdXNTbGlkZUlkID0gdGhpcy5hY3RpdmVTbGlkZUlkIC0gMTtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXNTbGlkZUlkIDwgMCkgdGhpcy5wcmV2aW91c1NsaWRlSWQgPSB0aGlzLmF2YWlsYWJsZVNsaWRlcyAtIDE7XG4gICAgfTtcblxuICAgIHRoaXMuc2V0U2xpZGUgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBmb3JtIGVsZW1lbnRzXG4gICAgICAgIGNvbnN0IHNsaWRlc0xlbmd0aCA9IHNlbGYuc2xpZGVzLmxlbmd0aDtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHNsaWRlc0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IHNsaWRlID0gc2VsZi5zbGlkZXNbaV07XG5cbiAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0YSBzZXQgYXR0cmlidXRlIHRvIGRlc2lyZWQgdHlwZVxuICAgICAgICAgICAgY29uc3Qgc2xpZGVPcmRlciA9IHBhcnNlSW50KHNsaWRlLmdldEF0dHJpYnV0ZSgnZGF0YS1vcmRlcicpKTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGFuZCBzZXQgYWN0aXZlIGZvciBhbGwgc2xpZGVzXG4gICAgICAgICAgICBpZiAoc2xpZGVPcmRlciAhPT0gc2VsZi5hY3RpdmVTbGlkZUlkKSBzbGlkZS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgIGVsc2Ugc2xpZGUuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIHVzZSB0aGUgcHJldmlvdXMgYW5kIG5leHQsIGFsc28gc2V0IHRob3NlIGNsYXNzZXNcbiAgICAgICAgICAgIGlmIChzZWxmLnNldHRpbmdzLmRlZmluZWRQcmV2aW91c05leHQpIHtcblxuICAgICAgICAgICAgICAgIGlmIChzbGlkZU9yZGVyICE9PSBzZWxmLnByZXZpb3VzU2xpZGVJZCkgc2xpZGUuY2xhc3NMaXN0LnJlbW92ZSgncHJldmlvdXMnKTtcbiAgICAgICAgICAgICAgICBlbHNlIHNsaWRlLmNsYXNzTGlzdC5hZGQoJ3ByZXZpb3VzJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2xpZGVPcmRlciAhPT0gc2VsZi5uZXh0U2xpZGVJZCkgc2xpZGUuY2xhc3NMaXN0LnJlbW92ZSgnbmV4dCcpO1xuICAgICAgICAgICAgICAgIGVsc2Ugc2xpZGUuY2xhc3NMaXN0LmFkZCgnbmV4dCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGYuc2V0dGluZ3MuZG90cyAhPT0gJycpIHsgc2VsZi5zZXRBY3RpdmVEb3QoKTsgfVxuICAgICAgICBpZiAoc2VsZi5zZXR0aW5ncy5jYXB0aW9ucyAhPT0gJycpIHsgc2VsZi5zZXRBY3RpdmVDYXB0aW9uKCk7IH1cbiAgICB9O1xuXG4gICAgdGhpcy5jbGlja05hdmlnYXRpb25CdXR0b24gPSBmdW5jdGlvbiAobmF2QnV0dG9uKSB7XG4gICAgICAgIHNlbGYuYWN0aXZlU2xpZGVJZCA9IHBhcnNlSW50KG5hdkJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JkZXInKSk7XG4gICAgICAgIGlmIChzZWxmLnNldHRpbmdzLmRlZmluZWRQcmV2aW91c05leHQpIHNlbGYuc2V0UHJldmlvdXNBbmROZXh0U2xpZGUoKTtcbiAgICAgICAgc2VsZi5zZXRTbGlkZSgpO1xuXG4gICAgICAgIGNvbnN0IG5leHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGYuc2V0dGluZ3MubmF2aWdhdGlvbkJ1dHRvbnMgKyAnLm5leHQnKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGYuc2V0dGluZ3MubmF2aWdhdGlvbkJ1dHRvbnMgKyAnLnByZXZpb3VzJyk7XG5cbiAgICAgICAgbmV4dC5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3JkZXInLCBzZWxmLm5leHRTbGlkZUlkKTtcbiAgICAgICAgcHJldmlvdXMuc2V0QXR0cmlidXRlKCdkYXRhLW9yZGVyJywgc2VsZi5wcmV2aW91c1NsaWRlSWQpO1xuXG4gICAgICAgIHNlbGYucmVzZXRBdXRvU2xpZGUoKTtcblxuICAgICAgICAvLyBuZXh0LnF1ZXJ5U2VsZWN0b3IoJ3AnKS5pbm5lckhUTUwgPSBzZWxmLnNsaWRlc1tzZWxmLm5leHRTbGlkZUlkXS5kYXRhc2V0Lm5hbWU7XG4gICAgICAgIC8vIHByZXZpb3VzLnF1ZXJ5U2VsZWN0b3IoJ3AnKS5pbm5lckhUTUwgPSBzZWxmLnNsaWRlc1tzZWxmLnByZXZpb3VzU2xpZGVJZF0uZGF0YXNldC5uYW1lO1xuICAgIH07XG5cbiAgICB0aGlzLmNsaWNrRG90ID0gZnVuY3Rpb24gKGNsaWNrZWREb3QpIHtcbiAgICAgICAgc2VsZi5hY3RpdmVTbGlkZUlkID0gcGFyc2VJbnQoY2xpY2tlZERvdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JkZXInKSk7XG4gICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcbiAgICAgICAgc2VsZi5yZXNldEF1dG9TbGlkZSgpO1xuICAgIH07XG5cbiAgICB0aGlzLnNldEFjdGl2ZURvdCA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBjb25zdCBkb3RzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLmRvdHMpO1xuICAgICAgICBjb25zdCBkb3RzTGVuZ3RoID0gZG90cy5sZW5ndGg7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBkb3RzTGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgY29uc3QgZG90ID0gZG90c1tpXTtcbiAgICAgICAgICAgIGRvdE9yZGVyID0gcGFyc2VJbnQoZG90LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmRlcicpKTtcblxuICAgICAgICAgICAgaWYoZG90T3JkZXIgIT09IHNlbGYuYWN0aXZlU2xpZGVJZCkgZG90LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgZWxzZSBkb3QuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5zZXRBY3RpdmVDYXB0aW9uID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGNvbnN0IGNhcHRpb25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLmNhcHRpb25zKTtcbiAgICAgICAgY29uc3QgY2FwdGlvbnNMZW5ndGggPSBjYXB0aW9ucy5sZW5ndGg7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBjYXB0aW9uc0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IGNhcHRpb24gPSBjYXB0aW9uc1tpXTtcbiAgICAgICAgICAgIGNhcHRpb25PcmRlciA9IHBhcnNlSW50KGNhcHRpb24uZ2V0QXR0cmlidXRlKCdkYXRhLW9yZGVyJykpO1xuXG4gICAgICAgICAgICBpZihjYXB0aW9uT3JkZXIgIT09IHNlbGYuYWN0aXZlU2xpZGVJZCkgY2FwdGlvbi5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgIGVsc2UgY2FwdGlvbi5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgfVxuICAgIH07XG59IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBTY3JvbGwgVG8gQ2xpY2sgaGFuZGxlclxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IFNjcm9sbFRvSGFuZGxlciA9IHtcblxuICAgIC8vIEFuaW1hdGlvbiBzZXR0aW5nc1xuICAgIG9mZnNldCA6IDYwLCAvL3BpeGVsXG4gICAgZHVyYXRpb24gOiAxNDAwLCAvL21zXG5cbiAgICAvLyBBbmltYXRpb24gdmFyaWFibGVzXG4gICAgYm9keSA6IG51bGwsXG4gICAgc3RhcnQgOiAwLFxuICAgIGNoYW5nZSA6IDAsXG4gICAgY3VycmVudFRpbWUgOiAwLFxuICAgIGFsbG93QW5pbWF0aW9uIDogZmFsc2UsXG4gICAgc2Nyb2xsVG9BbmltYXRpb24gOiBudWxsLFxuXG4gICAgLy8gV2F0Y2ggdGhlIEVhc2luZ0Z1bmN0aW9uIGhlbHBlciBmb3IgdGhlIGF2YWlsYWJsZSBtZXRob2RzXG4gICAgZWFzaW5nOiAnZWFzZUluT3V0UXVhZCcsXG5cbiAgICBpbml0IDogZnVuY3Rpb24oKXtcblxuICAgICAgICBjb25zdCBhbmNob3JMaW5rcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1zY3JvbGwtdG8tdGFyZ2V0Jyk7XG4gICAgICAgIGNvbnN0IGFuY2hvckxpbmtzQW1vdW50ID0gYW5jaG9yTGlua3MubGVuZ3RoO1xuXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBhbmNob3JMaW5rc0Ftb3VudDsgaSsrKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGFuY2hvckxpbmsgPSBhbmNob3JMaW5rc1tpXTtcblxuICAgICAgICAgICAgYW5jaG9yTGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIFNjcm9sbFRvSGFuZGxlci5wcmVwYXJlU2Nyb2xsVG8odGhpcy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmUgdGhlIEhhbmRsZXIgZm9yIHRoZSBhbmltYXRpb25cbiAgICAgKi9cbiAgICBwcmVwYXJlU2Nyb2xsVG8gOiBmdW5jdGlvbihlbGVtZW50SWQpe1xuXG4gICAgICAgIC8vIEdldCB0aGUgc2Nyb2xsIHRvIGVsZW1lbnRcbiAgICAgICAgZWxlbWVudElkID0gZWxlbWVudElkLnN1YnN0cihlbGVtZW50SWQuaW5kZXhPZignIycpKzEpO1xuICAgICAgICBjb25zdCBzY3JvbGxUb0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICAgICAgICBjb25zdCBzY3JvbGxUb0VsZW1lbnRQb3NpdGlvbiA9IHNjcm9sbFRvRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAvLyBSZXNldCBvciBkZWZpbmUgdGhlIEhhbmRsZXIgdmFyaWFibGVzXG4gICAgICAgIFNjcm9sbFRvSGFuZGxlci5ib2R5ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuc3RhcnQgPSBNYXRoLm1heChTY3JvbGxUb0hhbmRsZXIuYm9keS5zY3JvbGxUb3AsIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wLCB3aW5kb3cucGFnZVlPZmZzZXQpOyAvL1VzZSBNYXRoLm1heCBiZWNhdXNlIHNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcFxuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuY2hhbmdlID0gKChzY3JvbGxUb0VsZW1lbnRQb3NpdGlvbi50b3AgKyBTY3JvbGxUb0hhbmRsZXIuc3RhcnQpIC0gU2Nyb2xsVG9IYW5kbGVyLnN0YXJ0KSAtIFNjcm9sbFRvSGFuZGxlci5vZmZzZXQ7XG4gICAgICAgIFNjcm9sbFRvSGFuZGxlci5zdGFydFRpbWUgPSAnbm93JyBpbiB3aW5kb3cucGVyZm9ybWFuY2UgPyBwZXJmb3JtYW5jZS5ub3coKSA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuYWxsb3dBbmltYXRpb24gPSB0cnVlO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgYW5pbWF0aW9uXG4gICAgICAgIHNjcm9sbFRvQW5pbWF0aW9uID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKFNjcm9sbFRvSGFuZGxlci5hbmltYXRlU2Nyb2xsKTtcblxuICAgICAgICAvLyBTdG9wIG9uIHNjcm9sbFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU1vdXNlU2Nyb2xsJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLCBTY3JvbGxUb0hhbmRsZXIuYWJvcnRTY3JvbGxBbmltYXRpb24pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBTY3JvbGxUb0hhbmRsZXIuYWJvcnRTY3JvbGxBbmltYXRpb24pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcblxuICAgIH0sXG5cbiAgICAvKlxuICAgICAqIEFuaW1hdGUgdGhlIHNjcm9sbCBwb3NpdGlvblxuICAgICAqL1xuICAgIGFuaW1hdGVTY3JvbGwgOiBmdW5jdGlvbiAodGltZXN0YW1wKSB7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHByb2dyZXNzIGZyb20gMCAtIDFcbiAgICAgICAgbGV0IHByb2dyZXNzID0gTWF0aC5taW4oMSwgKHRpbWVzdGFtcCAtICBTY3JvbGxUb0hhbmRsZXIuc3RhcnRUaW1lKSAvIFNjcm9sbFRvSGFuZGxlci5kdXJhdGlvbik7XG4gICAgICAgIGlmKHByb2dyZXNzIDwgMCkgcHJvZ3Jlc3MgPSAwO1xuXG4gICAgICAgIC8vIENvbnZlcnQgcHJvZ3Jlc3Mgd2l0aCBlYXNpbmcgZnVuY3Rpb25cbiAgICAgICAgcHJvZ3Jlc3MgPSBFYXNpbmdGdW5jdGlvbnNbU2Nyb2xsVG9IYW5kbGVyLmVhc2luZ10ocHJvZ3Jlc3MpO1xuXG4gICAgICAgIGNvbnN0IG5ld1Njcm9sbFRvcCA9IFNjcm9sbFRvSGFuZGxlci5zdGFydCArICggU2Nyb2xsVG9IYW5kbGVyLmNoYW5nZSAqIHByb2dyZXNzICk7XG5cbiAgICAgICAgU2Nyb2xsVG9IYW5kbGVyLmJvZHkuc2Nyb2xsVG9wID0gbmV3U2Nyb2xsVG9wO1xuICAgICAgICBpZiggU2Nyb2xsVG9IYW5kbGVyLmJvZHkuc2Nyb2xsVG9wID09PSAwICkgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSBuZXdTY3JvbGxUb3A7IC8vIFNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgc28gaWYgU2Nyb2xsVG9IYW5kbGVyLmJvZHkuc2Nyb2xsVG9wIGlzIDAgZm9yY2UgdGhlIHNjcm9sbCBwb3NpdGlvbiB0aHJvdWdoIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wXG5cbiAgICAgICAgaWYocHJvZ3Jlc3MgPCAxICYmIFNjcm9sbFRvSGFuZGxlci5hbGxvd0FuaW1hdGlvbil7XG4gICAgICAgICAgICBzY3JvbGxUb0FuaW1hdGlvbiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShTY3JvbGxUb0hhbmRsZXIuYW5pbWF0ZVNjcm9sbCk7XG4gICAgICAgIH1cblxuICAgIH0sXG5cbiAgICAvKlxuICAgICAqIEFib3J0IHRoZSBzY3JvbGwgYW5pbWF0aW9uXG4gICAgICovXG4gICAgYWJvcnRTY3JvbGxBbmltYXRpb24gOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgU2Nyb2xsVG9IYW5kbGVyLmFsbG93QW5pbWF0aW9uID0gZmFsc2U7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKFNjcm9sbFRvSGFuZGxlci5zY3JvbGxUb0FuaW1hdGlvbik7XG4gICAgfVxuXG59O1xuXG5TY3JvbGxUb0hhbmRsZXIuaW5pdCgpOyIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgWW91dHViZSBoYW5kbGVyXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuY29uc3QgWW91dHViZUhhbmRsZXIgPSB7XG5cbiAgICB5b3V0dWJlQ2xhc3MgOiAnLmpzLXlvdXR1YmUtcGxheWVyJyxcbiAgICBwbGF5ZXJzOiBbXSxcblxuICAgIGluaXQgOiBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICAvLyBHZXQgdGhlIHlvdXR1YmUgcGxheWVycyBjb250YWluZXJzXG4gICAgICAgIGNvbnN0IHlvdXR1YmVQbGF5ZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChZb3V0dWJlSGFuZGxlci55b3V0dWJlQ2xhc3MpO1xuICAgICAgICBjb25zdCB5b3V0dWJlUGxheWVyc0Ftb3VudCA9IHlvdXR1YmVQbGF5ZXJzLmxlbmd0aDtcblxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgeW91dHViZVBsYXllcnNBbW91bnQ7IGkrKyl7XG5cbiAgICAgICAgICAgIGNvbnN0IHlvdXR1YmVQbGF5ZXIgPSB5b3V0dWJlUGxheWVyc1tpXTtcblxuXG4gICAgICAgICAgICBjb25zdCB5b3V0dWJlUGxheWVySWQgPSB5b3V0dWJlUGxheWVyLmdldEF0dHJpYnV0ZSgnaWQnKTtcbiAgICAgICAgICAgIGlmKHlvdXR1YmVQbGF5ZXJJZCAhPT0gbnVsbCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gU3RyaXAgdGhlIG5lY2Vzc2FyeSBkYXRhIGZyb20gdGhlIGh0bWwgYW5kIGNyZWF0ZSBvYmplY3RzIGZyb20gaXRcbiAgICAgICAgICAgICAgICBjb25zdCB5b3V0dWJlRWxlbWVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHlvdXR1YmVQbGF5ZXIuZ2V0QXR0cmlidXRlKCdpZCcpLFxuICAgICAgICAgICAgICAgICAgICBsaW5rOiB5b3V0dWJlUGxheWVyLmdldEF0dHJpYnV0ZSgnZGF0YS15b3V0dWJlLWxpbmsnKSxcbiAgICAgICAgICAgICAgICAgICAgYXV0b1BsYXk6IHBhcnNlSW50KHlvdXR1YmVQbGF5ZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWF1dG8tcGxheScpKSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgWW91dHViZUhhbmRsZXIucGxheWVycy5wdXNoKHlvdXR1YmVFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFbGVtZW50IG5vdCBpbmNsdWRlIGJlY2F1c2UgdGhlcmUgaXNuJ3QgYSBpZCBvbiB0aGUgcGxheWVyXCIpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHlvdXR1YmVQbGF5ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoeW91dHViZVBsYXllcnNBbW91bnQgPj0gMSkgWW91dHViZUhhbmRsZXIuaW5pdFlvdXR1YmUoKTtcblxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBleHRlcm5hbCBzY3JpcHQgaXMgbG9hZGVkXG4gICAgICpcbiAgICAgKi9cbiAgICBpbml0WW91dHViZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFNlZSBpZiBZVCB2YXJpYWJsZSBleGlzdHNcbiAgICAgICAgaWYgKHR5cGVvZihZVCkgPT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mKFlULlBsYXllcikgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIFNldHVwIEFQSSByZWFkeSBmdW5jdGlvblxuICAgICAgICAgICAgd2luZG93Lm9uWW91VHViZVBsYXllckFQSVJlYWR5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgWW91dHViZUhhbmRsZXIubG9hZFBsYXllcnMoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBMb2FkIGV4dGVybmFsIHNjcmlwdFxuICAgICAgICAgICAgZ2V0U2NyaXB0KCdodHRwczovL3d3dy55b3V0dWJlLmNvbS9pZnJhbWVfYXBpJyk7XG4gICAgICAgICAgICAvLyBJZiBZVCBhbHJlYWR5IGV4aXN0cyBsb2FkIHBsYXllclxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgWW91dHViZUhhbmRsZXIubG9hZFBsYXllcnMoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgdGhlIFlvdXR1YmUgcGxheWVyKHMpIHdpdGggcGFyYW1ldGVyc1xuICAgICAqIEFuZCByZXdyaXRlIHRoZSBwbGF5ZXJzIHRvIGtleSB0aGVtIGJ5IHRoZSBlbGVtZW50IGlkXG4gICAgICpcbiAgICAgKi9cbiAgICBsb2FkUGxheWVyczogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgbGV0IHBsYXllcnMgPSBbXTtcblxuICAgICAgICBjb25zdCB5b3V0dWJlUGxheWVyc0Ftb3VudCA9IFlvdXR1YmVIYW5kbGVyLnBsYXllcnMubGVuZ3RoO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgeW91dHViZVBsYXllcnNBbW91bnQ7IGkrKyl7XG5cbiAgICAgICAgICAgIGxldCB5b3V0dWJlUGxheWVyID0gWW91dHViZUhhbmRsZXIucGxheWVyc1tpXTtcblxuICAgICAgICAgICAgLy8gTG9hZCBwbGF5ZXJcbiAgICAgICAgICAgIHlvdXR1YmVQbGF5ZXIucGxheWVyID0gbmV3IFlULlBsYXllcih5b3V0dWJlUGxheWVyLmlkLHtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDIwMCxcbiAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgICAgIHZpZGVvSWQ6IHlvdXR1YmVQbGF5ZXIubGluayxcbiAgICAgICAgICAgICAgICBob3N0OiAnaHR0cHM6Ly93d3cueW91dHViZS1ub2Nvb2tpZS5jb20nLFxuICAgICAgICAgICAgICAgIHBsYXllclZhcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZXN0YnJhbmRpbmc6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJlbDogMCxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWtiOiAxLFxuICAgICAgICAgICAgICAgICAgICBhdXRvcGxheTogeW91dHViZVBsYXllci5hdXRvUGxheVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICdvblJlYWR5JzogWW91dHViZUhhbmRsZXIub25SZWFkeSxcbiAgICAgICAgICAgICAgICAgICAgJ29uU3RhdGVDaGFuZ2UnOiBZb3V0dWJlSGFuZGxlci5vblN0YXRlQ2hhbmdlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHBsYXllcnNbeW91dHViZVBsYXllci5pZF0gPSB5b3V0dWJlUGxheWVyO1xuXG4gICAgICAgIH1cblxuICAgICAgICBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzID0gcGxheWVycztcblxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBXaGVuIHBsYXllciBpcyByZWFkeSB0byBwbGF5XG4gICAgICovXG4gICAgb25SZWFkeSA6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cbiAgICAgICAgY29uc3QgcGxheWVyQ29udGFpbmVySWQgPSBldmVudC50YXJnZXQuZ2V0SWZyYW1lKCkuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzW3BsYXllckNvbnRhaW5lcklkXS5wbGF5ZXI7XG5cbiAgICAgICAgLy8gU2hvdyB2aWRlb1xuICAgICAgICAvLyBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ICQoJyMnICsgcGxheWVyQ29udGFpbmVySWQpLnN0b3AoKS5hbmltYXRlKHsgb3BhY2l0eTogMSB9LDEwMDApIH0sODAwKTtcblxuICAgICAgICAvLyBJZiBub3Qgb24gdGFibGV0IG9yIG1vYmlsZSwgcGxheSBvbiBoaWdoIHF1YWxpdHlcbiAgICAgICAgLy8gcGxheWVyLm11dGUoKTtcbiAgICAgICAgLy8gcGxheWVyLnBsYXlWaWRlbygpO1xuICAgICAgICAvLyBwbGF5ZXIuc2V0UGxheWJhY2tRdWFsaXR5KCdoZDEwODAnKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuZXIgZm9yIFlvdXR1YmUgc3RhdGUgY2hhbmdlXG4gICAgICovXG4gICAgb25TdGF0ZUNoYW5nZSA6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cbiAgICAgICAgY29uc3QgcGxheWVyQ29udGFpbmVySWQgPSBldmVudC50YXJnZXQuZ2V0SWZyYW1lKCkuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzW3BsYXllckNvbnRhaW5lcklkXS5wbGF5ZXI7XG5cbiAgICAgICAgY29uc3QgdmlkZW9TdGF0ZSA9IGV2ZW50LmRhdGE7XG5cbiAgICAgICAgLy8gTG9vcCB2aWRlb1xuICAgICAgICBpZiAoZXZlbnQuZGF0YSA9PT0gWVQuUGxheWVyU3RhdGUuRU5ERUQgKSB7XG4gICAgICAgICAgICBwbGF5ZXIucGxheVZpZGVvKCk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5Zb3V0dWJlSGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIEJyb3dzZXIgSGFuZGxlclxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IEJyb3dzZXJIYW5kbGVyID0ge1xuXG4gICAgdXNlckFnZW50OiAnJyxcbiAgICBicm93c2VySW5mbzogJycsXG5cblxuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQnJvd3NlckhhbmRsZXIudXNlckFnZW50ID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgICAgIEJyb3dzZXJIYW5kbGVyLmJyb3dzZXJJbmZvID0gQnJvd3NlckhhbmRsZXIuZ2V0QnJvd3NlckluZm8oKTtcbiAgICAgICAgQnJvd3NlckhhbmRsZXIuaGFuZGxlSUUoKTtcbiAgICAgICAgQnJvd3NlckhhbmRsZXIuaGFuZGxlU2FmYXJpKCk7XG4gICAgfSxcblxuICAgIGhhbmRsZUlFOiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy8gRGV0ZWN0IHZlcnNpb25zIGJlbG93IGllMTFcbiAgICAgICAgbGV0IG1zaWUgPSBCcm93c2VySGFuZGxlci51c2VyQWdlbnQuaW5kZXhPZignTVNJRSAnKTtcbiAgICAgICAgY29uc3QgaWVsdDExID0gbXNpZSA+IDA7XG5cbiAgICAgICAgLy8gRGV0ZWN0IGllMTFcbiAgICAgICAgY29uc3QgaWUxMSA9ICEhbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvVHJpZGVudC4qcnZcXDoxMVxcLi8pO1xuXG4gICAgICAgIC8vIElmIEludGVybmV0IEV4cGxvcmVyXG4gICAgICAgIGlmIChpZWx0MTEgfHwgaWUxMSkge1xuICAgICAgICAgICAgLy8gRGVmYXVsdCB2ZXJzaW9uXG4gICAgICAgICAgICBsZXQgdmVyc2lvbiA9ICcxMSc7XG5cbiAgICAgICAgICAgIC8vIFdheSB0byBkZXRlY3QgdmVyc2lvbiA8IDExXG4gICAgICAgICAgICBpZiAoaWVsdDExKSB2ZXJzaW9uID0gcGFyc2VJbnQoQnJvd3NlckhhbmRsZXIudXNlckFnZW50LnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICBtc2llICsgNSxcbiAgICAgICAgICAgICAgICBCcm93c2VySGFuZGxlci51c2VyQWdlbnQuaW5kZXhPZihcIi5cIiwgbXNpZSlcbiAgICAgICAgICAgICkpO1xuXG4gICAgICAgICAgICAvLyBBcHBlbmQgY2xhc3NlcyB0byBIVE1MICh3ZSBoYXZlIHRvIGRvIHRoaXMgc2VwYXJhdGVseSBiZWNhdXNlIGVsc2UgaWUgd2lsbCBmYWlsKVxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdpZScpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCd2Jyt2ZXJzaW9uKTtcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8vIEZhbGxiYWNrIGZvciBvbGRlciBzYWZhcmkgdmVyc2lvblxuICAgIGhhbmRsZVNhZmFyaTogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGlmKEJyb3dzZXJIYW5kbGVyLmJyb3dzZXJJbmZvLm5hbWUgPT09ICdTYWZhcmknICYmIEJyb3dzZXJIYW5kbGVyLmJyb3dzZXJJbmZvLnZlcnNpb24gPD0gMTApe1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXS5jbGFzc0xpc3QuYWRkKCdpZScpO1xuICAgICAgICB9XG5cbiAgICB9LFxuXG4gICAgZ2V0QnJvd3NlckluZm86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHVhPW5hdmlnYXRvci51c2VyQWdlbnQsdGVtLE09dWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XFwvKSlcXC8/XFxzKihcXGQrKS9pKSB8fCBbXTtcbiAgICAgICAgaWYoL3RyaWRlbnQvaS50ZXN0KE1bMV0pKXtcbiAgICAgICAgICAgIHRlbT0vXFxicnZbIDpdKyhcXGQrKS9nLmV4ZWModWEpIHx8IFtdO1xuICAgICAgICAgICAgcmV0dXJuIHtuYW1lOidJRSAnLHZlcnNpb246KHRlbVsxXXx8JycpfTtcbiAgICAgICAgfVxuICAgICAgICBpZihNWzFdPT09J0Nocm9tZScpe1xuICAgICAgICAgICAgdGVtPXVhLm1hdGNoKC9cXGJPUFJcXC8oXFxkKykvKVxuICAgICAgICAgICAgaWYodGVtIT1udWxsKSAgIHtyZXR1cm4ge25hbWU6J09wZXJhJywgdmVyc2lvbjp0ZW1bMV19O31cbiAgICAgICAgfVxuICAgICAgICBNPU1bMl0/IFtNWzFdLCBNWzJdXTogW25hdmlnYXRvci5hcHBOYW1lLCBuYXZpZ2F0b3IuYXBwVmVyc2lvbiwgJy0/J107XG4gICAgICAgIGlmKCh0ZW09dWEubWF0Y2goL3ZlcnNpb25cXC8oXFxkKykvaSkpIT1udWxsKSB7TS5zcGxpY2UoMSwxLHRlbVsxXSk7fVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogTVswXSxcbiAgICAgICAgICAgIHZlcnNpb246IE1bMV1cbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5Ccm93c2VySGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBIZWxwZXIgZnVuY3Rpb25zXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLypcbiAqIFNpbXBsZSBpc3NldCBtZXRob2QgZm9yIHRoaXMgZG9lcyBub3QgZXhpc3QgaW4gamF2YXNjcmlwdFxuICovXG53aW5kb3cuaXNzZXQgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogIT09ICd1bmRlZmluZWQnICYmIG9iaiAhPT0gbnVsbDtcbn07XG5cbi8qXG4gKiBFYXNpbmcgRnVuY3Rpb25zIC0gaW5zcGlyZWQgZnJvbSBodHRwOi8vZ2l6bWEuY29tL2Vhc2luZy9cbiAqIG9ubHkgY29uc2lkZXJpbmcgdGhlIHQgdmFsdWUgZm9yIHRoZSByYW5nZSBbMCwgMV0gPT4gWzAsIDFdXG4gKi9cbndpbmRvdy5FYXNpbmdGdW5jdGlvbnMgPSB7XG4gICAgLy8gbm8gZWFzaW5nLCBubyBhY2NlbGVyYXRpb25cbiAgICBsaW5lYXI6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0XG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpbmcgZnJvbSB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZUluUXVhZDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgKiB0XG4gICAgfSxcbiAgICAvLyBkZWNlbGVyYXRpbmcgdG8gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VPdXRRdWFkOiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCAqICgyIC0gdClcbiAgICB9LFxuICAgIC8vIGFjY2VsZXJhdGlvbiB1bnRpbCBoYWxmd2F5LCB0aGVuIGRlY2VsZXJhdGlvblxuICAgIGVhc2VJbk91dFF1YWQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0IDwgLjUgPyAyICogdCAqIHQgOiAtMSArICg0IC0gMiAqIHQpICogdFxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW5nIGZyb20gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VJbkN1YmljOiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCAqIHQgKiB0XG4gICAgfSxcbiAgICAvLyBkZWNlbGVyYXRpbmcgdG8gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VPdXRDdWJpYzogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuICgtLXQpICogdCAqIHQgKyAxXG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpb24gdW50aWwgaGFsZndheSwgdGhlbiBkZWNlbGVyYXRpb25cbiAgICBlYXNlSW5PdXRDdWJpYzogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPCAuNSA/IDQgKiB0ICogdCAqIHQgOiAodCAtIDEpICogKDIgKiB0IC0gMikgKiAoMiAqIHQgLSAyKSArIDFcbiAgICB9LFxuICAgIC8vIGFjY2VsZXJhdGluZyBmcm9tIHplcm8gdmVsb2NpdHlcbiAgICBlYXNlSW5RdWFydDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgKiB0ICogdCAqIHRcbiAgICB9LFxuICAgIC8vIGRlY2VsZXJhdGluZyB0byB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZU91dFF1YXJ0OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gMSAtICgtLXQpICogdCAqIHQgKiB0XG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpb24gdW50aWwgaGFsZndheSwgdGhlbiBkZWNlbGVyYXRpb25cbiAgICBlYXNlSW5PdXRRdWFydDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPCAuNSA/IDggKiB0ICogdCAqIHQgKiB0IDogMSAtIDggKiAoLS10KSAqIHQgKiB0ICogdFxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW5nIGZyb20gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VJblF1aW50OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCAqIHQgKiB0ICogdCAqIHRcbiAgICB9LFxuICAgIC8vIGRlY2VsZXJhdGluZyB0byB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZU91dFF1aW50OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gMSArICgtLXQpICogdCAqIHQgKiB0ICogdFxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW9uIHVudGlsIGhhbGZ3YXksIHRoZW4gZGVjZWxlcmF0aW9uXG4gICAgZWFzZUluT3V0UXVpbnQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0IDwgLjUgPyAxNiAqIHQgKiB0ICogdCAqIHQgKiB0IDogMSArIDE2ICogKC0tdCkgKiB0ICogdCAqIHQgKiB0XG4gICAgfVxufTtcblxuLypcbiAqIFZhbmlsbGEgdmVyc2lvbiBvZiB0aGUgJC5nZXRTY3JpcHRcbiAqL1xud2luZG93LmdldFNjcmlwdCA9IGZ1bmN0aW9uIChzb3VyY2UsIGNhbGxiYWNrKSB7XG4gICAgbGV0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHNjcmlwdC5hc3luYyA9IDE7XG5cbiAgICBjb25zdCBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpO1xuICAgIGxldCBwcmlvciA9IHNjcmlwdHNbc2NyaXB0cy5sZW5ndGggLSAxXTtcblxuICAgIHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKF8sIGlzQWJvcnQpIHtcbiAgICAgICAgaWYgKGlzQWJvcnQgfHwgIXNjcmlwdC5yZWFkeVN0YXRlIHx8IC9sb2FkZWR8Y29tcGxldGUvLnRlc3Qoc2NyaXB0LnJlYWR5U3RhdGUpKSB7XG4gICAgICAgICAgICBzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICBzY3JpcHQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGlmICghaXNBYm9ydCkge1xuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBzY3JpcHQuc3JjID0gc291cmNlO1xuICAgIHByaW9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNjcmlwdCwgcHJpb3IpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIGFzIGxvbmcgYXMgaXQgY29udGludWVzIHRvIGJlIGludm9rZWQsIHdpbGwgbm90XG4gKiBiZSB0cmlnZ2VyZWQuIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZnRlciBpdCBzdG9wcyBiZWluZyBjYWxsZWQgZm9yXG4gKiBOIG1pbGxpc2Vjb25kcy4gSWYgYGltbWVkaWF0ZWAgaXMgcGFzc2VkLCB0cmlnZ2VyIHRoZSBmdW5jdGlvbiBvbiB0aGVcbiAqIGxlYWRpbmcgZWRnZSwgaW5zdGVhZCBvZiB0aGUgdHJhaWxpbmcuXG4gKiBAcGFyYW0gZnVuY1xuICogQHBhcmFtIHdhaXRcbiAqIEBwYXJhbSBpbW1lZGlhdGVcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xud2luZG93LmRlYm91bmNlID0gZnVuY3Rpb24oZnVuYywgd2FpdCwgaW1tZWRpYXRlKSB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBsZXQgbGF0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmICghaW1tZWRpYXRlKSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG4gICAgICAgIGlmIChjYWxsTm93KSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIH07XG59O1xuXG4vKlxuICogQ29va2llIGhlbHBlciBjbGFzc1xuICovXG53aW5kb3cuQ29va2llID0ge1xuICAgIHNldDogZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBkYXlzKSB7XG4gICAgICAgIGxldCBkb21haW4sIGRvbWFpblBhcnRzLCBkYXRlLCBleHBpcmVzLCBob3N0O1xuXG4gICAgICAgIGlmIChkYXlzKSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIChkYXlzICogMjQgKiA2MCAqIDYwICogMTAwMCkpO1xuICAgICAgICAgICAgZXhwaXJlcyA9IFwiOyBleHBpcmVzPVwiICsgZGF0ZS50b0dNVFN0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXhwaXJlcyA9IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBob3N0ID0gbG9jYXRpb24uaG9zdDtcbiAgICAgICAgaWYgKGhvc3Quc3BsaXQoJy4nKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIC8vIG5vIFwiLlwiIGluIGEgZG9tYWluIC0gaXQncyBsb2NhbGhvc3Qgb3Igc29tZXRoaW5nIHNpbWlsYXJcbiAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyBcIj1cIiArIHZhbHVlICsgZXhwaXJlcyArIFwiOyBwYXRoPS9cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSBjb29raWUgb24gYWxsIHN1YiBkb21haW5zLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFN0YXJ0IHdpdGggdHJ5aW5nIHRvIHNldCBjb29raWUgdG8gdGhlIHRvcCBkb21haW4uXG4gICAgICAgICAgICAvLyAoZXhhbXBsZTogaWYgdXNlciBpcyBvbiBmb28uY29tLCB0cnkgdG8gc2V0XG4gICAgICAgICAgICAvLyAgY29va2llIHRvIGRvbWFpbiBcIi5jb21cIilcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBJZiB0aGUgY29va2llIHdpbGwgbm90IGJlIHNldCwgaXQgbWVhbnMgXCIuY29tXCJcbiAgICAgICAgICAgIC8vIGlzIGEgdG9wIGxldmVsIGRvbWFpbiBhbmQgd2UgbmVlZCB0b1xuICAgICAgICAgICAgLy8gc2V0IHRoZSBjb29raWUgdG8gXCIuZm9vLmNvbVwiXG4gICAgICAgICAgICBkb21haW5QYXJ0cyA9IGhvc3Quc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIGRvbWFpblBhcnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICBkb21haW4gPSAnLicgKyBkb21haW5QYXJ0cy5qb2luKCcuJyk7XG5cbiAgICAgICAgICAgIC8vIEZvciBkZXZlbG9wbWVudCBwdXJwb3NlLCByZW1vdmUgdGhpcyB3aGVuIG1vdmluZyB0byBwcm9kdWN0aW9uXG4gICAgICAgICAgICAvLyBkb21haW4gPSAnLmtvbW1hLnBybyc7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyBcIj1cIiArIHZhbHVlICsgZXhwaXJlcyArIFwiOyBwYXRoPS87IGRvbWFpbj1cIiArIGRvbWFpbjtcblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgY29va2llIHdhcyBzdWNjZXNzZnVseSBzZXQgdG8gdGhlIGdpdmVuIGRvbWFpblxuICAgICAgICAgICAgLy8gKG90aGVyd2lzZSBpdCB3YXMgYSBUb3AtTGV2ZWwgRG9tYWluKVxuICAgICAgICAgICAgaWYgKENvb2tpZS5nZXQobmFtZSkgPT0gbnVsbCB8fCBDb29raWUuZ2V0KG5hbWUpICE9IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gYXBwZW5kIFwiLlwiIHRvIGN1cnJlbnQgZG9tYWluXG4gICAgICAgICAgICAgICAgZG9tYWluID0gJy4nICsgaG9zdDtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBuYW1lICsgXCI9XCIgKyB2YWx1ZSArIGV4cGlyZXMgKyBcIjsgcGF0aD0vOyBkb21haW49XCIgKyBkb21haW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBjb25zdCBuYW1lRVEgPSBuYW1lICsgXCI9XCI7XG4gICAgICAgIGNvbnN0IGNhID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2EubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjID0gY2FbaV07XG4gICAgICAgICAgICB3aGlsZSAoYy5jaGFyQXQoMCkgPT09ICcgJykge1xuICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxLCBjLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjLmluZGV4T2YobmFtZUVRKSA9PT0gMCkgcmV0dXJuIGMuc3Vic3RyaW5nKG5hbWVFUS5sZW5ndGgsIGMubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgZXJhc2U6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIENvb2tpZS5zZXQobmFtZSwgJycsIC0xKTtcbiAgICB9XG59O1xuXG4vKlxuICogSmF2YXNjcmlwdCB2ZXJzaW9uIG9mIHRoZSBudW1iZXJfZm9ybWF0IG1ldGhvZCBvZiBQSFBcbiAqL1xud2luZG93Lm51bWJlcl9mb3JtYXQgPSBmdW5jdGlvbiAobnVtYmVyLCBkZWNpbWFscywgZGVjX3BvaW50LCB0aG91c2FuZHNfc2VwKSB7XG4gICAgLy8gU3RyaXAgYWxsIGNoYXJhY3RlcnMgYnV0IG51bWVyaWNhbCBvbmVzLlxuICAgIG51bWJlciA9IChudW1iZXIgKyAnJykucmVwbGFjZSgvW14wLTkrXFwtRWUuXS9nLCAnJyk7XG4gICAgbGV0IG4gPSAhaXNGaW5pdGUoK251bWJlcikgPyAwIDogK251bWJlcixcbiAgICAgICAgcHJlYyA9ICFpc0Zpbml0ZSgrZGVjaW1hbHMpID8gMCA6IE1hdGguYWJzKGRlY2ltYWxzKSxcbiAgICAgICAgc2VwID0gKHR5cGVvZiB0aG91c2FuZHNfc2VwID09PSAndW5kZWZpbmVkJykgPyAnLCcgOiB0aG91c2FuZHNfc2VwLFxuICAgICAgICBkZWMgPSAodHlwZW9mIGRlY19wb2ludCA9PT0gJ3VuZGVmaW5lZCcpID8gJy4nIDogZGVjX3BvaW50LFxuICAgICAgICBzID0gJycsXG4gICAgICAgIHRvRml4ZWRGaXggPSBmdW5jdGlvbiAobiwgcHJlYykge1xuICAgICAgICAgICAgdmFyIGsgPSBNYXRoLnBvdygxMCwgcHJlYyk7XG4gICAgICAgICAgICByZXR1cm4gJycgKyBNYXRoLnJvdW5kKG4gKiBrKSAvIGs7XG4gICAgICAgIH07XG4gICAgLy8gRml4IGZvciBJRSBwYXJzZUZsb2F0KDAuNTUpLnRvRml4ZWQoMCkgPSAwO1xuICAgIHMgPSAocHJlYyA/IHRvRml4ZWRGaXgobiwgcHJlYykgOiAnJyArIE1hdGgucm91bmQobikpLnNwbGl0KCcuJyk7XG4gICAgaWYgKHNbMF0ubGVuZ3RoID4gMykge1xuICAgICAgICBzWzBdID0gc1swXS5yZXBsYWNlKC9cXEIoPz0oPzpcXGR7M30pKyg/IVxcZCkpL2csIHNlcCk7XG4gICAgfVxuICAgIGlmICgoc1sxXSB8fCAnJykubGVuZ3RoIDwgcHJlYykge1xuICAgICAgICBzWzFdID0gc1sxXSB8fCAnJztcbiAgICAgICAgc1sxXSArPSBuZXcgQXJyYXkocHJlYyAtIHNbMV0ubGVuZ3RoICsgMSkuam9pbignMCcpO1xuICAgIH1cbiAgICByZXR1cm4gcy5qb2luKGRlYyk7XG59O1xuXG5cbi8qKlxuICogRWxlbWVudC5jbG9zZXN0KCkgcG9seWZpbGxcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L2Nsb3Nlc3QjUG9seWZpbGxcbiAqL1xuaWYgKCFFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0KSB7XG4gICAgaWYgKCFFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzKSB7XG4gICAgICAgIEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMgPSBFbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3RvciB8fCBFbGVtZW50LnByb3RvdHlwZS53ZWJraXRNYXRjaGVzU2VsZWN0b3I7XG4gICAgfVxuICAgIEVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3QgPSBmdW5jdGlvbiAocykge1xuICAgICAgICB2YXIgZWwgPSB0aGlzO1xuICAgICAgICB2YXIgYW5jZXN0b3IgPSB0aGlzO1xuICAgICAgICBpZiAoIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyhlbCkpIHJldHVybiBudWxsO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoYW5jZXN0b3IubWF0Y2hlcyhzKSkgcmV0dXJuIGFuY2VzdG9yO1xuICAgICAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9IHdoaWxlIChhbmNlc3RvciAhPT0gbnVsbCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG59XG5cbndpbmRvdy5BamF4ID0ge1xuXG4gICAgLy9UT0RPOiBDYW4gd2UgY3JlYXRlIGEgcHJlcGFyZSByZXF1ZXN0IGZ1bmN0aW9uID8/XG5cbiAgICBnZXQ6IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBsZXQgdG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuY29udGVudDtcblxuICAgICAgICB4aHIub3BlbignZ2V0JywgdXJsLCB0cnVlKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLUNTUkYtVE9LRU4nLCB0b2tlbik7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLVJlcXVlc3RlZC1XaXRoJywgJ1hNTEh0dHBSZXF1ZXN0Jyk7XG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHhocik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSxcblxuICAgIHBvc3Q6IGZ1bmN0aW9uKHVybCwgZGF0YSwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBsZXQgdG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuY29udGVudDtcblxuICAgICAgICB4aHIub3BlbigncG9zdCcsIHVybCwgdHJ1ZSk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignWC1DU1JGLVRPS0VOJywgdG9rZW4pO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignWC1SZXF1ZXN0ZWQtV2l0aCcsICdYTUxIdHRwUmVxdWVzdCcpO1xuICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh4aHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB4aHIuc2VuZCggSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgIH0sXG5cbiAgICBwb3N0Rm9ybURhdGE6IGZ1bmN0aW9uKHVybCwgZGF0YSwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBsZXQgdG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuY29udGVudDtcblxuICAgICAgICB4aHIub3BlbigncG9zdCcsIHVybCwgdHJ1ZSk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLUNTUkYtVE9LRU4nLCB0b2tlbik7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLVJlcXVlc3RlZC1XaXRoJywgJ1hNTEh0dHBSZXF1ZXN0Jyk7XG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHhocik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHhoci5zZW5kKGRhdGEpO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBzdHJpbmdcbiAqIEBwYXJhbSBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbndpbmRvdy5jYXBpdGFsaXplRmlyc3RMZXR0ZXIgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbn07XG5cbi8qKlxuICogQ29udmVydCBzbmFrZSBjYXNlIGludG8gY2FtZWxjYXNlXG4gKlxuICogQHBhcmFtIHN0cmluZ1xuICogQHJldHVybnMgeyp9XG4gKi9cbndpbmRvdy5zbmFrZVRvQ2FtZWwgPSBmdW5jdGlvbiAoc3RyaW5nKXtcbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyhcXC1cXHcpL2csIGZ1bmN0aW9uKG0pe3JldHVybiBtWzFdLnRvVXBwZXJDYXNlKCk7fSk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgaW5kZXggb2YgYW4gZWxlbWVudCBpbnNpZGUgaXRzIHBhcmVudFxuICovXG53aW5kb3cuaW5kZXhJblBhcmVudD0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzO1xuICAgIGxldCBudW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldID09IG5vZGUpIHJldHVybiBudW07XG4gICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PSAxKSBudW0rKztcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufTtcblxuLyoqXG4gKiBGb3Igc2VjdXJpdHkgcmVhc29ucyBpT1MgU2FmYXJpIG9ubHkgYWxsb3dzIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5JykgZm9yIHRleHQgd2l0aGluIGEgY29udGVudEVkaXRhYmxlIGNvbnRhaW5lci5cbiAqIFRoZSB3b3JrYXJvdW5kIGlzIHRvIGRldGVjdCBpT1MgU2FmYXJpIGFuZCBxdWlja2x5IHRvZ2dsZSBjb250ZW50RWRpdGFibGUgYmVmb3JlIGV4ZWN1dGluZyBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpLlxuICogV2hlYiBpbnB1dCBvciB0ZXh0YXJlYSBpcyBSRUFET05MWSB5b3UgY2FuIHByZXZlbnQgdGhlIHVud2FudGVkIHBvcHVwIHdpdGggY29weS9wYXN0ZSBmdW5jdGlvbnMgYW5kIHRoZSBpbnB1dCBrZXlib2FyZFxuICogQ29kZSBmcm9tOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDY5ODE4NDdcbiAqL1xud2luZG93LmNvcHlUb0NsaXBib2FyZCA9IGZ1bmN0aW9uIChlbCkge1xuXG4gICAgLy8gcmVzb2x2ZSB0aGUgZWxlbWVudFxuICAgIGVsID0gKHR5cGVvZiBlbCA9PT0gJ3N0cmluZycpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCkgOiBlbDtcblxuICAgIC8vIGhhbmRsZSBpT1MgYXMgYSBzcGVjaWFsIGNhc2VcbiAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaXBhZHxpcG9kfGlwaG9uZS9pKSkge1xuXG4gICAgICAgIC8vIHNhdmUgY3VycmVudCBjb250ZW50RWRpdGFibGUvcmVhZE9ubHkgc3RhdHVzXG4gICAgICAgIGNvbnN0IGVkaXRhYmxlID0gZWwuY29udGVudEVkaXRhYmxlO1xuICAgICAgICBjb25zdCByZWFkT25seSA9IGVsLnJlYWRPbmx5O1xuXG4gICAgICAgIC8vIGNvbnZlcnQgdG8gZWRpdGFibGUgd2l0aCByZWFkb25seSB0byBzdG9wIGlPUyBrZXlib2FyZCBvcGVuaW5nXG4gICAgICAgIGVsLmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7XG4gICAgICAgIGVsLnJlYWRPbmx5ID0gdHJ1ZTtcblxuICAgICAgICAvLyBjcmVhdGUgYSBzZWxlY3RhYmxlIHJhbmdlXG4gICAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbCk7XG5cbiAgICAgICAgLy8gc2VsZWN0IHRoZSByYW5nZVxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgZWwuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgOTk5OTk5KTtcblxuICAgICAgICAvLyByZXN0b3JlIGNvbnRlbnRFZGl0YWJsZS9yZWFkT25seSB0byBvcmlnaW5hbCBzdGF0ZVxuICAgICAgICBlbC5jb250ZW50RWRpdGFibGUgPSBlZGl0YWJsZTtcbiAgICAgICAgZWwucmVhZE9ubHkgPSByZWFkT25seTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVsLnNlbGVjdCgpO1xuICAgIH1cblxuICAgIC8vIGV4ZWN1dGUgY29weSBjb21tYW5kXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCByZWxhdGVkIHRvIHRoZSBib2R5XG4gKlxuICogQHBhcmFtIGVsXG4gKiBAcmV0dXJucyB7e3RvcDogbnVtYmVyLCBsZWZ0OiBudW1iZXJ9fVxuICovXG53aW5kb3cuYm9keU9mZnNldCA9IGZ1bmN0aW9uIChlbCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgc2Nyb2xsTGVmdCA9IHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICAgICAgc2Nyb2xsVG9wID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XG4gICAgcmV0dXJuIHsgdG9wOiByZWN0LnRvcCArIHNjcm9sbFRvcCwgbGVmdDogcmVjdC5sZWZ0ICsgc2Nyb2xsTGVmdCB9XG59OyIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBTY3JvbGwgaGFuZGxlclxuICAgLSBIYW5kbGVyIHRoZSBvYmplY3RzIHdoaWNoIGFyZSBiaW5kIG9uIHNjcm9sbCBldmVudHMgb3IgdmlzaWJsZSBpbiB2aWV3cG9ydFxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IFNjcm9sbEhhbmRsZXIgPSB7XG5cbiAgICAvLyBWYXJpYWJsZXMgZm9yIGRlYm91bmNlIGFuZCB0aHJvdHRsZSBlZmZlY3RzXG4gICAgdGltZTogRGF0ZS5ub3coKSxcbiAgICB0aW1lb3V0OiBudWxsLFxuICAgIHdhaXRUaHJvdHRsZTogMTAwMCxcbiAgICB3YWl0RGVib3VuY2U6IDMwMCxcblxuICAgIC8vIFZhcmlhYmxlcyBmb3Igc2Nyb2xsIGRpcmVjdGlvblxuICAgIGxhc3RTY3JvbGxUb3BQb3NpdGlvbjogMCxcbiAgICBzY3JvbGxEaXJlY3Rpb25Eb3duOiB0cnVlLFxuICAgIHNjcm9sbERpcmVjdGlvblVwOiBmYWxzZSxcblxuICAgIC8vSW5pdGlhbGlzYXRpb25cbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy8gVHJpZ2dlciBzdGFydCBvbiBzdGFydCB1cFxuICAgICAgICBTY3JvbGxIYW5kbGVyLnRyaWdnZXJPbkluaXQoKTtcblxuICAgICAgICAvLyBUaHJvdHRsZSBzY3JvbGxcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICgoU2Nyb2xsSGFuZGxlci50aW1lICsgU2Nyb2xsSGFuZGxlci53YWl0VGhyb3R0bGUgLSBEYXRlLm5vdygpKSA8IDApIHtcbiAgICAgICAgICAgICAgICBTY3JvbGxIYW5kbGVyLnRyaWdnZXJUaHJvdHRsZSgpO1xuICAgICAgICAgICAgICAgIFNjcm9sbEhhbmRsZXIudGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNtb290aCBzY3JvbGxcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFNjcm9sbEhhbmRsZXIudHJpZ2dlclNtb290aCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBEZWJvdW5jZSBzY3JvbGxcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmKGlzc2V0KFNjcm9sbEhhbmRsZXIudGltZW91dCkpIGNsZWFyVGltZW91dChTY3JvbGxIYW5kbGVyLnRpbWVvdXQpO1xuICAgICAgICAgICAgU2Nyb2xsSGFuZGxlci50aW1lb3V0ID0gc2V0VGltZW91dChTY3JvbGxIYW5kbGVyLnRyaWdnZXJEZWJvdW5jZSwgU2Nyb2xsSGFuZGxlci53YWl0RGVib3VuY2UpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gVHJpZ2dlciBvbiBzdGFydCB1cFxuICAgIHRyaWdnZXJPbkluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgU2Nyb2xsSGFuZGxlci50cmlnZ2VyRWxlbWVudEluVmlld3BvcnRBbmltYXRpb24oKTtcbiAgICB9LFxuXG4gICAgLy8gVHJpZ2dlciBzY3JvbGwgZnVuY3Rpb25zIHdpdGggdGhyb3R0bGUgKHByZWZlcnJlZClcbiAgICB0cmlnZ2VyVGhyb3R0bGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1Rocm90dGxlZCBzY3JvbGwnKTtcbiAgICAgICAgU2Nyb2xsSGFuZGxlci50cmlnZ2VyRWxlbWVudEluVmlld3BvcnRBbmltYXRpb24oKTtcbiAgICB9LFxuXG4gICAgLy8gVHJpZ2dlciBzY3JvbGwgb24gZGVib3VuY2VcbiAgICB0cmlnZ2VyRGVib3VuY2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ0RlYm91bmNlIHNjcm9sbCcpO1xuICAgIH0sXG5cbiAgICAvLyBUcmlnZ2VyIHNjcm9sbCBvbiB0aGUgZmxpZ2h0XG4gICAgdHJpZ2dlclNtb290aDogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnU21vb3RoIHNjcm9sbCcpO1xuICAgICAgICBTY3JvbGxIYW5kbGVyLmRldGVjdFNjcm9sbERpcmVjdGlvbigpO1xuICAgICAgICBTY3JvbGxIYW5kbGVyLnRvZ2dsZVN0aWNreUhlYWRlcigpO1xuICAgIH0sXG5cbiAgICAvLyBEZXRlY3QgaWYgcGFydCBvZiBhIGdpdmVuIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcbiAgICAvLyBFbCBtdXN0IGJlIGEgbm9kZSBlbGVtZW50XG4gICAgZGV0ZWN0SWZFbGVtZW50SXNQYXJ0bHlJblZpZXdwb3J0OiBmdW5jdGlvbihlbClcbiAgICB7XG4gICAgICAgIGlmKGlzc2V0KGVsKSl7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIC8vIERPTVJlY3QgeyB4OiA4LCB5OiA4LCB3aWR0aDogMTAwLCBoZWlnaHQ6IDEwMCwgdG9wOiA4LCByaWdodDogMTA4LCBib3R0b206IDEwOCwgbGVmdDogOCB9XG4gICAgICAgICAgICBjb25zdCB3aW5kb3dIZWlnaHQgPSAod2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpO1xuICAgICAgICAgICAgY29uc3Qgd2luZG93V2lkdGggPSAod2luZG93LmlubmVyV2lkdGggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTtcblxuICAgICAgICAgICAgY29uc3QgdmVydGljYWxJblZpZXcgPSAocmVjdC50b3AgPD0gKHdpbmRvd0hlaWdodCkpICYmICgocmVjdC50b3AgKyByZWN0LmhlaWdodCkgPj0gMCk7XG4gICAgICAgICAgICBjb25zdCBob3Jpem9udGFsSW5WaWV3ID0gKHJlY3QubGVmdCA8PSB3aW5kb3dXaWR0aCkgJiYgKChyZWN0LmxlZnQgKyByZWN0LndpZHRoKSA+PSAwKTtcblxuICAgICAgICAgICAgcmV0dXJuICh2ZXJ0aWNhbEluVmlldyAmJiBob3Jpem9udGFsSW5WaWV3KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBEZXRlY3QgaWYgYSBnaXZlbiBlbGVtZW50IGlzIGZ1bGx5IHZpc2libGUgaW4gdGhlIHZpZXdwb3J0XG4gICAgLy8gRWwgbXVzdCBiZSBhIG5vZGUgZWxlbWVudFxuICAgIGRldGVjdElmRWxlbWVudElzRnVsbHlJblZpZXdwb3J0OiBmdW5jdGlvbihlbClcbiAgICB7XG4gICAgICAgIGlmKGlzc2V0KGVsKSl7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgcmVjdC50b3AgPj0gMCAmJlxuICAgICAgICAgICAgICAgIHJlY3QuYm90dG9tIDw9IHdpbmRvdy5pbm5lckhlaWdodFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBkZXRlY3RTY3JvbGxEaXJlY3Rpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsVG9wUG9zaXRpb24gPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsgLy8gQ3JlZGl0czogXCJodHRwczovL2dpdGh1Yi5jb20vcWVyZW15L3NvL2Jsb2IvbWFzdGVyL3NvLmRvbS5qcyNMNDI2XCJcbiAgICAgICAgaWYgKHNjcm9sbFRvcFBvc2l0aW9uID49IFNjcm9sbEhhbmRsZXIubGFzdFNjcm9sbFRvcFBvc2l0aW9uKXtcbiAgICAgICAgICAgIFNjcm9sbEhhbmRsZXIuc2Nyb2xsRGlyZWN0aW9uRG93biA9IHRydWU7XG4gICAgICAgICAgICBTY3JvbGxIYW5kbGVyLnNjcm9sbERpcmVjdGlvblVwID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTY3JvbGxIYW5kbGVyLnNjcm9sbERpcmVjdGlvbkRvd24gPSBmYWxzZTtcbiAgICAgICAgICAgIFNjcm9sbEhhbmRsZXIuc2Nyb2xsRGlyZWN0aW9uVXAgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIFNjcm9sbEhhbmRsZXIubGFzdFNjcm9sbFRvcFBvc2l0aW9uID0gc2Nyb2xsVG9wUG9zaXRpb247XG4gICAgfSxcblxuICAgIC8vIFRyaWdnZXIgYW5pbWF0aW9uIG9uIGVsZW1lbnRzIHRoYXQgaGF2ZSAnZWxlbWVudC1pbi12aWV3cG9ydCcgYW5kIHRoYXQgYXJlIGluIHRoZSB2aWV3cG9ydFxuICAgIC8vIFRoZXNlIGFuaW1hdGlvbiBjYW4gb25seSBiZSB0cmlnZ2VyZWQgb25jZSwgaWYgeW91IHdhbnQgbW9yZSB0aGVuIHRoYXQgeW91IHNob3VsZCB3cml0ZSBhbiBzcGVjaWZpYyBmdW5jdGlvbiBmb3IgdGhpc1xuICAgIHRyaWdnZXJFbGVtZW50SW5WaWV3cG9ydEFuaW1hdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5lbGVtZW50LWluLXZpZXdwb3J0Jyk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzTGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoO1xuXG4gICAgICAgIGZvcihsZXQgZSA9IDA7IGUgPCBlbGVtZW50c0xlbmd0aDsgZSsrKXtcblxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW2VdO1xuICAgICAgICAgICAgaWYoU2Nyb2xsSGFuZGxlci5kZXRlY3RJZkVsZW1lbnRJc1BhcnRseUluVmlld3BvcnQoZWxlbWVudCkpe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZWxlbWVudC1pbi12aWV3cG9ydCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9LFxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENVU1RPTSBTQ1JPTEwgSEFORExFUlMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvLyBIaWRlIG9yIHNob3cgc3RpY2t5IG5hdmlnYXRpb24gd2hlbiBoZWFkZXIgaXNuJ3QgdmlzaWJsZVxuICAgIHRvZ2dsZVN0aWNreUhlYWRlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzdGlja3lIZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtc3RpY2t5LWhlYWRlcicpO1xuICAgICAgICBjb25zdCB2aXNpYmxlU3RpY2t5SGVhZGVyQ2xhc3MgPSAnaXMtc3RpY2t5LWhlYWRlci12aXNpYmxlJztcbiAgICAgICAgY29uc3Qgc3VibmF2TGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1zdWJuYXYnKTtcbiAgICAgICAgdmFyIHN1Yk5hdklzVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICBzdGlja3lIZWFkZXIuaGlkZGVuID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJuYXZMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUoc3VibmF2TGlzdFtpXSwgbnVsbCkudmlzaWJpbGl0eSA9PSBcInZpc2libGVcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWJOYXZJc1Zpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoaXNzZXQoc3RpY2t5SGVhZGVyKSAmJiAhc3ViTmF2SXNWaXNpYmxlKXtcbiAgICAgICAgICAgIC8vIEhpZGUgd2hlbiBzY3JvbGxpbmcgRE9XTiAoT1Igd2l0aGluIG9mZnNldClcbiAgICAgICAgICAgIGlmKFNjcm9sbEhhbmRsZXIuc2Nyb2xsRGlyZWN0aW9uRG93biB8fCBTY3JvbGxIYW5kbGVyLmxhc3RTY3JvbGxUb3BQb3NpdGlvbiA8IDExMCl7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKHZpc2libGVTdGlja3lIZWFkZXJDbGFzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTaG93IHdoZW4gc2Nyb2xsaW5nIFVQIGFuZCBvdXRzaWRlIG9mIG9mZnNldFxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKHZpc2libGVTdGlja3lIZWFkZXJDbGFzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG59O1xuXG5TY3JvbGxIYW5kbGVyLmluaXQoKTsiLCIvLyByZW1vdmVkIGJ5IGV4dHJhY3QtdGV4dC13ZWJwYWNrLXBsdWdpbiIsIi8vIHJlbW92ZWQgYnkgZXh0cmFjdC10ZXh0LXdlYnBhY2stcGx1Z2luIl0sInNvdXJjZVJvb3QiOiIifQ==