Files
speckle-server/scratch/edge-debug-selection/Default/Cache/Cache_Data/f_000062
T

1498 lines
143 KiB
Plaintext

import { shallowRef, watchEffect, readonly, ref, watch, customRef, getCurrentScope, onScopeDispose, effectScope, getCurrentInstance, provide, inject, isVue3, version, isRef, unref, computed, reactive, toRefs as toRefs$1, toRef as toRef$1, isVue2, set as set$1, onBeforeMount, nextTick, onBeforeUnmount, onMounted, onUnmounted, isReactive } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29";
function computedEager(fn, options) {
var _a;
const result = shallowRef();
watchEffect(() => {
result.value = fn();
}, {
...options,
flush: (_a = options == null ? void 0 : options.flush) != null ? _a : "sync"
});
return readonly(result);
}
function computedWithControl(source, fn) {
let v = void 0;
let track;
let trigger;
const dirty = ref(true);
const update = () => {
dirty.value = true;
trigger();
};
watch(source, update, { flush: "sync" });
const get2 = typeof fn === "function" ? fn : fn.get;
const set2 = typeof fn === "function" ? void 0 : fn.set;
const result = customRef((_track, _trigger) => {
track = _track;
trigger = _trigger;
return {
get() {
if (dirty.value) {
v = get2();
dirty.value = false;
}
track();
return v;
},
set(v2) {
set2 == null ? void 0 : set2(v2);
}
};
});
if (Object.isExtensible(result))
result.trigger = update;
return result;
}
function tryOnScopeDispose(fn) {
if (getCurrentScope()) {
onScopeDispose(fn);
return true;
}
return false;
}
function createEventHook() {
const fns = /* @__PURE__ */ new Set();
const off = (fn) => {
fns.delete(fn);
};
const on = (fn) => {
fns.add(fn);
const offFn = () => off(fn);
tryOnScopeDispose(offFn);
return {
off: offFn
};
};
const trigger = (...args) => {
return Promise.all(Array.from(fns).map((fn) => fn(...args)));
};
return {
on,
off,
trigger
};
}
function createGlobalState(stateFactory) {
let initialized = false;
let state;
const scope = effectScope(true);
return (...args) => {
if (!initialized) {
state = scope.run(() => stateFactory(...args));
initialized = true;
}
return state;
};
}
const localProvidedStateMap = /* @__PURE__ */ new WeakMap();
const provideLocal = (key, value) => {
var _a;
const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;
if (instance == null)
throw new Error("provideLocal must be called in setup");
if (!localProvidedStateMap.has(instance))
localProvidedStateMap.set(instance, /* @__PURE__ */ Object.create(null));
const localProvidedState = localProvidedStateMap.get(instance);
localProvidedState[key] = value;
provide(key, value);
};
const injectLocal = (...args) => {
var _a;
const key = args[0];
const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;
if (instance == null)
throw new Error("injectLocal must be called in setup");
if (localProvidedStateMap.has(instance) && key in localProvidedStateMap.get(instance))
return localProvidedStateMap.get(instance)[key];
return inject(...args);
};
function createInjectionState(composable, options) {
const key = (options == null ? void 0 : options.injectionKey) || Symbol(composable.name || "InjectionState");
const useProvidingState = (...args) => {
const state = composable(...args);
provideLocal(key, state);
return state;
};
const useInjectedState = () => injectLocal(key);
return [useProvidingState, useInjectedState];
}
function createSharedComposable(composable) {
let subscribers = 0;
let state;
let scope;
const dispose = () => {
subscribers -= 1;
if (scope && subscribers <= 0) {
scope.stop();
state = void 0;
scope = void 0;
}
};
return (...args) => {
subscribers += 1;
if (!state) {
scope = effectScope(true);
state = scope.run(() => composable(...args));
}
tryOnScopeDispose(dispose);
return state;
};
}
function extendRef(ref2, extend, { enumerable = false, unwrap = true } = {}) {
if (!isVue3 && !version.startsWith("2.7.")) {
if (true)
throw new Error("[VueUse] extendRef only works in Vue 2.7 or above.");
return;
}
for (const [key, value] of Object.entries(extend)) {
if (key === "value")
continue;
if (isRef(value) && unwrap) {
Object.defineProperty(ref2, key, {
get() {
return value.value;
},
set(v) {
value.value = v;
},
enumerable
});
} else {
Object.defineProperty(ref2, key, { value, enumerable });
}
}
return ref2;
}
function get(obj, key) {
if (key == null)
return unref(obj);
return unref(obj)[key];
}
function isDefined(v) {
return unref(v) != null;
}
function makeDestructurable(obj, arr) {
if (typeof Symbol !== "undefined") {
const clone = { ...obj };
Object.defineProperty(clone, Symbol.iterator, {
enumerable: false,
value() {
let index = 0;
return {
next: () => ({
value: arr[index++],
done: index > arr.length
})
};
}
});
return clone;
} else {
return Object.assign([...arr], obj);
}
}
function toValue(r) {
return typeof r === "function" ? r() : unref(r);
}
const resolveUnref = toValue;
function reactify(fn, options) {
const unrefFn = (options == null ? void 0 : options.computedGetter) === false ? unref : toValue;
return function(...args) {
return computed(() => fn.apply(this, args.map((i) => unrefFn(i))));
};
}
function reactifyObject(obj, optionsOrKeys = {}) {
let keys = [];
let options;
if (Array.isArray(optionsOrKeys)) {
keys = optionsOrKeys;
} else {
options = optionsOrKeys;
const { includeOwnProperties = true } = optionsOrKeys;
keys.push(...Object.keys(obj));
if (includeOwnProperties)
keys.push(...Object.getOwnPropertyNames(obj));
}
return Object.fromEntries(
keys.map((key) => {
const value = obj[key];
return [
key,
typeof value === "function" ? reactify(value.bind(obj), options) : value
];
})
);
}
function toReactive(objectRef) {
if (!isRef(objectRef))
return reactive(objectRef);
const proxy = new Proxy({}, {
get(_, p, receiver) {
return unref(Reflect.get(objectRef.value, p, receiver));
},
set(_, p, value) {
if (isRef(objectRef.value[p]) && !isRef(value))
objectRef.value[p].value = value;
else
objectRef.value[p] = value;
return true;
},
deleteProperty(_, p) {
return Reflect.deleteProperty(objectRef.value, p);
},
has(_, p) {
return Reflect.has(objectRef.value, p);
},
ownKeys() {
return Object.keys(objectRef.value);
},
getOwnPropertyDescriptor() {
return {
enumerable: true,
configurable: true
};
}
});
return reactive(proxy);
}
function reactiveComputed(fn) {
return toReactive(computed(fn));
}
function reactiveOmit(obj, ...keys) {
const flatKeys = keys.flat();
const predicate = flatKeys[0];
return reactiveComputed(() => typeof predicate === "function" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => !predicate(toValue(v), k))) : Object.fromEntries(Object.entries(toRefs$1(obj)).filter((e) => !flatKeys.includes(e[0]))));
}
const isClient = typeof window !== "undefined" && typeof document !== "undefined";
const isWorker = typeof WorkerGlobalScope !== "undefined" && globalThis instanceof WorkerGlobalScope;
const isDef = (val) => typeof val !== "undefined";
const notNullish = (val) => val != null;
const assert = (condition, ...infos) => {
if (!condition)
console.warn(...infos);
};
const toString = Object.prototype.toString;
const isObject = (val) => toString.call(val) === "[object Object]";
const now = () => Date.now();
const timestamp = () => +Date.now();
const clamp = (n, min, max) => Math.min(max, Math.max(min, n));
const noop = () => {
};
const rand = (min, max) => {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
};
const hasOwn = (val, key) => Object.prototype.hasOwnProperty.call(val, key);
const isIOS = /* @__PURE__ */ getIsIOS();
function getIsIOS() {
var _a, _b;
return isClient && ((_a = window == null ? void 0 : window.navigator) == null ? void 0 : _a.userAgent) && (/iP(ad|hone|od)/.test(window.navigator.userAgent) || ((_b = window == null ? void 0 : window.navigator) == null ? void 0 : _b.maxTouchPoints) > 2 && /iPad|Macintosh/.test(window == null ? void 0 : window.navigator.userAgent));
}
function createFilterWrapper(filter, fn) {
function wrapper(...args) {
return new Promise((resolve, reject) => {
Promise.resolve(filter(() => fn.apply(this, args), { fn, thisArg: this, args })).then(resolve).catch(reject);
});
}
return wrapper;
}
const bypassFilter = (invoke2) => {
return invoke2();
};
function debounceFilter(ms, options = {}) {
let timer;
let maxTimer;
let lastRejector = noop;
const _clearTimeout = (timer2) => {
clearTimeout(timer2);
lastRejector();
lastRejector = noop;
};
const filter = (invoke2) => {
const duration = toValue(ms);
const maxDuration = toValue(options.maxWait);
if (timer)
_clearTimeout(timer);
if (duration <= 0 || maxDuration !== void 0 && maxDuration <= 0) {
if (maxTimer) {
_clearTimeout(maxTimer);
maxTimer = null;
}
return Promise.resolve(invoke2());
}
return new Promise((resolve, reject) => {
lastRejector = options.rejectOnCancel ? reject : resolve;
if (maxDuration && !maxTimer) {
maxTimer = setTimeout(() => {
if (timer)
_clearTimeout(timer);
maxTimer = null;
resolve(invoke2());
}, maxDuration);
}
timer = setTimeout(() => {
if (maxTimer)
_clearTimeout(maxTimer);
maxTimer = null;
resolve(invoke2());
}, duration);
});
};
return filter;
}
function throttleFilter(...args) {
let lastExec = 0;
let timer;
let isLeading = true;
let lastRejector = noop;
let lastValue;
let ms;
let trailing;
let leading;
let rejectOnCancel;
if (!isRef(args[0]) && typeof args[0] === "object")
({ delay: ms, trailing = true, leading = true, rejectOnCancel = false } = args[0]);
else
[ms, trailing = true, leading = true, rejectOnCancel = false] = args;
const clear = () => {
if (timer) {
clearTimeout(timer);
timer = void 0;
lastRejector();
lastRejector = noop;
}
};
const filter = (_invoke) => {
const duration = toValue(ms);
const elapsed = Date.now() - lastExec;
const invoke2 = () => {
return lastValue = _invoke();
};
clear();
if (duration <= 0) {
lastExec = Date.now();
return invoke2();
}
if (elapsed > duration && (leading || !isLeading)) {
lastExec = Date.now();
invoke2();
} else if (trailing) {
lastValue = new Promise((resolve, reject) => {
lastRejector = rejectOnCancel ? reject : resolve;
timer = setTimeout(() => {
lastExec = Date.now();
isLeading = true;
resolve(invoke2());
clear();
}, Math.max(0, duration - elapsed));
});
}
if (!leading && !timer)
timer = setTimeout(() => isLeading = true, duration);
isLeading = false;
return lastValue;
};
return filter;
}
function pausableFilter(extendFilter = bypassFilter) {
const isActive = ref(true);
function pause() {
isActive.value = false;
}
function resume() {
isActive.value = true;
}
const eventFilter = (...args) => {
if (isActive.value)
extendFilter(...args);
};
return { isActive: readonly(isActive), pause, resume, eventFilter };
}
const directiveHooks = {
mounted: isVue3 ? "mounted" : "inserted",
updated: isVue3 ? "updated" : "componentUpdated",
unmounted: isVue3 ? "unmounted" : "unbind"
};
function cacheStringFunction(fn) {
const cache = /* @__PURE__ */ Object.create(null);
return (str) => {
const hit = cache[str];
return hit || (cache[str] = fn(str));
};
}
const hyphenateRE = /\B([A-Z])/g;
const hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, "-$1").toLowerCase());
const camelizeRE = /-(\w)/g;
const camelize = cacheStringFunction((str) => {
return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : "");
});
function promiseTimeout(ms, throwOnTimeout = false, reason = "Timeout") {
return new Promise((resolve, reject) => {
if (throwOnTimeout)
setTimeout(() => reject(reason), ms);
else
setTimeout(resolve, ms);
});
}
function identity(arg) {
return arg;
}
function createSingletonPromise(fn) {
let _promise;
function wrapper() {
if (!_promise)
_promise = fn();
return _promise;
}
wrapper.reset = async () => {
const _prev = _promise;
_promise = void 0;
if (_prev)
await _prev;
};
return wrapper;
}
function invoke(fn) {
return fn();
}
function containsProp(obj, ...props) {
return props.some((k) => k in obj);
}
function increaseWithUnit(target, delta) {
var _a;
if (typeof target === "number")
return target + delta;
const value = ((_a = target.match(/^-?[0-9]+\.?[0-9]*/)) == null ? void 0 : _a[0]) || "";
const unit = target.slice(value.length);
const result = Number.parseFloat(value) + delta;
if (Number.isNaN(result))
return target;
return result + unit;
}
function objectPick(obj, keys, omitUndefined = false) {
return keys.reduce((n, k) => {
if (k in obj) {
if (!omitUndefined || obj[k] !== void 0)
n[k] = obj[k];
}
return n;
}, {});
}
function objectOmit(obj, keys, omitUndefined = false) {
return Object.fromEntries(Object.entries(obj).filter(([key, value]) => {
return (!omitUndefined || value !== void 0) && !keys.includes(key);
}));
}
function objectEntries(obj) {
return Object.entries(obj);
}
function getLifeCycleTarget(target) {
return target || getCurrentInstance();
}
function toRef(...args) {
if (args.length !== 1)
return toRef$1(...args);
const r = args[0];
return typeof r === "function" ? readonly(customRef(() => ({ get: r, set: noop }))) : ref(r);
}
const resolveRef = toRef;
function reactivePick(obj, ...keys) {
const flatKeys = keys.flat();
const predicate = flatKeys[0];
return reactiveComputed(() => typeof predicate === "function" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => predicate(toValue(v), k))) : Object.fromEntries(flatKeys.map((k) => [k, toRef(obj, k)])));
}
function refAutoReset(defaultValue, afterMs = 1e4) {
return customRef((track, trigger) => {
let value = toValue(defaultValue);
let timer;
const resetAfter = () => setTimeout(() => {
value = toValue(defaultValue);
trigger();
}, toValue(afterMs));
tryOnScopeDispose(() => {
clearTimeout(timer);
});
return {
get() {
track();
return value;
},
set(newValue) {
value = newValue;
trigger();
clearTimeout(timer);
timer = resetAfter();
}
};
});
}
function useDebounceFn(fn, ms = 200, options = {}) {
return createFilterWrapper(
debounceFilter(ms, options),
fn
);
}
function refDebounced(value, ms = 200, options = {}) {
const debounced = ref(value.value);
const updater = useDebounceFn(() => {
debounced.value = value.value;
}, ms, options);
watch(value, () => updater());
return debounced;
}
function refDefault(source, defaultValue) {
return computed({
get() {
var _a;
return (_a = source.value) != null ? _a : defaultValue;
},
set(value) {
source.value = value;
}
});
}
function useThrottleFn(fn, ms = 200, trailing = false, leading = true, rejectOnCancel = false) {
return createFilterWrapper(
throttleFilter(ms, trailing, leading, rejectOnCancel),
fn
);
}
function refThrottled(value, delay = 200, trailing = true, leading = true) {
if (delay <= 0)
return value;
const throttled = ref(value.value);
const updater = useThrottleFn(() => {
throttled.value = value.value;
}, delay, trailing, leading);
watch(value, () => updater());
return throttled;
}
function refWithControl(initial, options = {}) {
let source = initial;
let track;
let trigger;
const ref2 = customRef((_track, _trigger) => {
track = _track;
trigger = _trigger;
return {
get() {
return get2();
},
set(v) {
set2(v);
}
};
});
function get2(tracking = true) {
if (tracking)
track();
return source;
}
function set2(value, triggering = true) {
var _a, _b;
if (value === source)
return;
const old = source;
if (((_a = options.onBeforeChange) == null ? void 0 : _a.call(options, value, old)) === false)
return;
source = value;
(_b = options.onChanged) == null ? void 0 : _b.call(options, value, old);
if (triggering)
trigger();
}
const untrackedGet = () => get2(false);
const silentSet = (v) => set2(v, false);
const peek = () => get2(false);
const lay = (v) => set2(v, false);
return extendRef(
ref2,
{
get: get2,
set: set2,
untrackedGet,
silentSet,
peek,
lay
},
{ enumerable: true }
);
}
const controlledRef = refWithControl;
function set(...args) {
if (args.length === 2) {
const [ref2, value] = args;
ref2.value = value;
}
if (args.length === 3) {
if (isVue2) {
set$1(...args);
} else {
const [target, key, value] = args;
target[key] = value;
}
}
}
function watchWithFilter(source, cb, options = {}) {
const {
eventFilter = bypassFilter,
...watchOptions
} = options;
return watch(
source,
createFilterWrapper(
eventFilter,
cb
),
watchOptions
);
}
function watchPausable(source, cb, options = {}) {
const {
eventFilter: filter,
...watchOptions
} = options;
const { eventFilter, pause, resume, isActive } = pausableFilter(filter);
const stop = watchWithFilter(
source,
cb,
{
...watchOptions,
eventFilter
}
);
return { stop, pause, resume, isActive };
}
function syncRef(left, right, ...[options]) {
const {
flush = "sync",
deep = false,
immediate = true,
direction = "both",
transform = {}
} = options || {};
const watchers = [];
const transformLTR = "ltr" in transform && transform.ltr || ((v) => v);
const transformRTL = "rtl" in transform && transform.rtl || ((v) => v);
if (direction === "both" || direction === "ltr") {
watchers.push(watchPausable(
left,
(newValue) => {
watchers.forEach((w) => w.pause());
right.value = transformLTR(newValue);
watchers.forEach((w) => w.resume());
},
{ flush, deep, immediate }
));
}
if (direction === "both" || direction === "rtl") {
watchers.push(watchPausable(
right,
(newValue) => {
watchers.forEach((w) => w.pause());
left.value = transformRTL(newValue);
watchers.forEach((w) => w.resume());
},
{ flush, deep, immediate }
));
}
const stop = () => {
watchers.forEach((w) => w.stop());
};
return stop;
}
function syncRefs(source, targets, options = {}) {
const {
flush = "sync",
deep = false,
immediate = true
} = options;
if (!Array.isArray(targets))
targets = [targets];
return watch(
source,
(newValue) => targets.forEach((target) => target.value = newValue),
{ flush, deep, immediate }
);
}
function toRefs(objectRef, options = {}) {
if (!isRef(objectRef))
return toRefs$1(objectRef);
const result = Array.isArray(objectRef.value) ? Array.from({ length: objectRef.value.length }) : {};
for (const key in objectRef.value) {
result[key] = customRef(() => ({
get() {
return objectRef.value[key];
},
set(v) {
var _a;
const replaceRef = (_a = toValue(options.replaceRef)) != null ? _a : true;
if (replaceRef) {
if (Array.isArray(objectRef.value)) {
const copy = [...objectRef.value];
copy[key] = v;
objectRef.value = copy;
} else {
const newObject = { ...objectRef.value, [key]: v };
Object.setPrototypeOf(newObject, Object.getPrototypeOf(objectRef.value));
objectRef.value = newObject;
}
} else {
objectRef.value[key] = v;
}
}
}));
}
return result;
}
function tryOnBeforeMount(fn, sync = true, target) {
const instance = getLifeCycleTarget(target);
if (instance)
onBeforeMount(fn, target);
else if (sync)
fn();
else
nextTick(fn);
}
function tryOnBeforeUnmount(fn, target) {
const instance = getLifeCycleTarget(target);
if (instance)
onBeforeUnmount(fn, target);
}
function tryOnMounted(fn, sync = true, target) {
const instance = getLifeCycleTarget();
if (instance)
onMounted(fn, target);
else if (sync)
fn();
else
nextTick(fn);
}
function tryOnUnmounted(fn, target) {
const instance = getLifeCycleTarget(target);
if (instance)
onUnmounted(fn, target);
}
function createUntil(r, isNot = false) {
function toMatch(condition, { flush = "sync", deep = false, timeout, throwOnTimeout } = {}) {
let stop = null;
const watcher = new Promise((resolve) => {
stop = watch(
r,
(v) => {
if (condition(v) !== isNot) {
stop == null ? void 0 : stop();
resolve(v);
}
},
{
flush,
deep,
immediate: true
}
);
});
const promises = [watcher];
if (timeout != null) {
promises.push(
promiseTimeout(timeout, throwOnTimeout).then(() => toValue(r)).finally(() => stop == null ? void 0 : stop())
);
}
return Promise.race(promises);
}
function toBe(value, options) {
if (!isRef(value))
return toMatch((v) => v === value, options);
const { flush = "sync", deep = false, timeout, throwOnTimeout } = options != null ? options : {};
let stop = null;
const watcher = new Promise((resolve) => {
stop = watch(
[r, value],
([v1, v2]) => {
if (isNot !== (v1 === v2)) {
stop == null ? void 0 : stop();
resolve(v1);
}
},
{
flush,
deep,
immediate: true
}
);
});
const promises = [watcher];
if (timeout != null) {
promises.push(
promiseTimeout(timeout, throwOnTimeout).then(() => toValue(r)).finally(() => {
stop == null ? void 0 : stop();
return toValue(r);
})
);
}
return Promise.race(promises);
}
function toBeTruthy(options) {
return toMatch((v) => Boolean(v), options);
}
function toBeNull(options) {
return toBe(null, options);
}
function toBeUndefined(options) {
return toBe(void 0, options);
}
function toBeNaN(options) {
return toMatch(Number.isNaN, options);
}
function toContains(value, options) {
return toMatch((v) => {
const array = Array.from(v);
return array.includes(value) || array.includes(toValue(value));
}, options);
}
function changed(options) {
return changedTimes(1, options);
}
function changedTimes(n = 1, options) {
let count = -1;
return toMatch(() => {
count += 1;
return count >= n;
}, options);
}
if (Array.isArray(toValue(r))) {
const instance = {
toMatch,
toContains,
changed,
changedTimes,
get not() {
return createUntil(r, !isNot);
}
};
return instance;
} else {
const instance = {
toMatch,
toBe,
toBeTruthy,
toBeNull,
toBeNaN,
toBeUndefined,
changed,
changedTimes,
get not() {
return createUntil(r, !isNot);
}
};
return instance;
}
}
function until(r) {
return createUntil(r);
}
function defaultComparator(value, othVal) {
return value === othVal;
}
function useArrayDifference(...args) {
var _a;
const list = args[0];
const values = args[1];
let compareFn = (_a = args[2]) != null ? _a : defaultComparator;
if (typeof compareFn === "string") {
const key = compareFn;
compareFn = (value, othVal) => value[key] === othVal[key];
}
return computed(() => toValue(list).filter((x) => toValue(values).findIndex((y) => compareFn(x, y)) === -1));
}
function useArrayEvery(list, fn) {
return computed(() => toValue(list).every((element, index, array) => fn(toValue(element), index, array)));
}
function useArrayFilter(list, fn) {
return computed(() => toValue(list).map((i) => toValue(i)).filter(fn));
}
function useArrayFind(list, fn) {
return computed(() => toValue(
toValue(list).find((element, index, array) => fn(toValue(element), index, array))
));
}
function useArrayFindIndex(list, fn) {
return computed(() => toValue(list).findIndex((element, index, array) => fn(toValue(element), index, array)));
}
function findLast(arr, cb) {
let index = arr.length;
while (index-- > 0) {
if (cb(arr[index], index, arr))
return arr[index];
}
return void 0;
}
function useArrayFindLast(list, fn) {
return computed(() => toValue(
!Array.prototype.findLast ? findLast(toValue(list), (element, index, array) => fn(toValue(element), index, array)) : toValue(list).findLast((element, index, array) => fn(toValue(element), index, array))
));
}
function isArrayIncludesOptions(obj) {
return isObject(obj) && containsProp(obj, "formIndex", "comparator");
}
function useArrayIncludes(...args) {
var _a;
const list = args[0];
const value = args[1];
let comparator = args[2];
let formIndex = 0;
if (isArrayIncludesOptions(comparator)) {
formIndex = (_a = comparator.fromIndex) != null ? _a : 0;
comparator = comparator.comparator;
}
if (typeof comparator === "string") {
const key = comparator;
comparator = (element, value2) => element[key] === toValue(value2);
}
comparator = comparator != null ? comparator : (element, value2) => element === toValue(value2);
return computed(() => toValue(list).slice(formIndex).some((element, index, array) => comparator(
toValue(element),
toValue(value),
index,
toValue(array)
)));
}
function useArrayJoin(list, separator) {
return computed(() => toValue(list).map((i) => toValue(i)).join(toValue(separator)));
}
function useArrayMap(list, fn) {
return computed(() => toValue(list).map((i) => toValue(i)).map(fn));
}
function useArrayReduce(list, reducer, ...args) {
const reduceCallback = (sum, value, index) => reducer(toValue(sum), toValue(value), index);
return computed(() => {
const resolved = toValue(list);
return args.length ? resolved.reduce(reduceCallback, toValue(args[0])) : resolved.reduce(reduceCallback);
});
}
function useArraySome(list, fn) {
return computed(() => toValue(list).some((element, index, array) => fn(toValue(element), index, array)));
}
function uniq(array) {
return Array.from(new Set(array));
}
function uniqueElementsBy(array, fn) {
return array.reduce((acc, v) => {
if (!acc.some((x) => fn(v, x, array)))
acc.push(v);
return acc;
}, []);
}
function useArrayUnique(list, compareFn) {
return computed(() => {
const resolvedList = toValue(list).map((element) => toValue(element));
return compareFn ? uniqueElementsBy(resolvedList, compareFn) : uniq(resolvedList);
});
}
function useCounter(initialValue = 0, options = {}) {
let _initialValue = unref(initialValue);
const count = ref(initialValue);
const {
max = Number.POSITIVE_INFINITY,
min = Number.NEGATIVE_INFINITY
} = options;
const inc = (delta = 1) => count.value = Math.max(Math.min(max, count.value + delta), min);
const dec = (delta = 1) => count.value = Math.min(Math.max(min, count.value - delta), max);
const get2 = () => count.value;
const set2 = (val) => count.value = Math.max(min, Math.min(max, val));
const reset = (val = _initialValue) => {
_initialValue = val;
return set2(val);
};
return { count, inc, dec, get: get2, set: set2, reset };
}
const REGEX_PARSE = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/;
const REGEX_FORMAT = /[YMDHhms]o|\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a{1,2}|A{1,2}|m{1,2}|s{1,2}|Z{1,2}|SSS/g;
function defaultMeridiem(hours, minutes, isLowercase, hasPeriod) {
let m = hours < 12 ? "AM" : "PM";
if (hasPeriod)
m = m.split("").reduce((acc, curr) => acc += `${curr}.`, "");
return isLowercase ? m.toLowerCase() : m;
}
function formatOrdinal(num) {
const suffixes = ["th", "st", "nd", "rd"];
const v = num % 100;
return num + (suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0]);
}
function formatDate(date, formatStr, options = {}) {
var _a;
const years = date.getFullYear();
const month = date.getMonth();
const days = date.getDate();
const hours = date.getHours();
const minutes = date.getMinutes();
const seconds = date.getSeconds();
const milliseconds = date.getMilliseconds();
const day = date.getDay();
const meridiem = (_a = options.customMeridiem) != null ? _a : defaultMeridiem;
const matches = {
Yo: () => formatOrdinal(years),
YY: () => String(years).slice(-2),
YYYY: () => years,
M: () => month + 1,
Mo: () => formatOrdinal(month + 1),
MM: () => `${month + 1}`.padStart(2, "0"),
MMM: () => date.toLocaleDateString(options.locales, { month: "short" }),
MMMM: () => date.toLocaleDateString(options.locales, { month: "long" }),
D: () => String(days),
Do: () => formatOrdinal(days),
DD: () => `${days}`.padStart(2, "0"),
H: () => String(hours),
Ho: () => formatOrdinal(hours),
HH: () => `${hours}`.padStart(2, "0"),
h: () => `${hours % 12 || 12}`.padStart(1, "0"),
ho: () => formatOrdinal(hours % 12 || 12),
hh: () => `${hours % 12 || 12}`.padStart(2, "0"),
m: () => String(minutes),
mo: () => formatOrdinal(minutes),
mm: () => `${minutes}`.padStart(2, "0"),
s: () => String(seconds),
so: () => formatOrdinal(seconds),
ss: () => `${seconds}`.padStart(2, "0"),
SSS: () => `${milliseconds}`.padStart(3, "0"),
d: () => day,
dd: () => date.toLocaleDateString(options.locales, { weekday: "narrow" }),
ddd: () => date.toLocaleDateString(options.locales, { weekday: "short" }),
dddd: () => date.toLocaleDateString(options.locales, { weekday: "long" }),
A: () => meridiem(hours, minutes),
AA: () => meridiem(hours, minutes, false, true),
a: () => meridiem(hours, minutes, true),
aa: () => meridiem(hours, minutes, true, true)
};
return formatStr.replace(REGEX_FORMAT, (match, $1) => {
var _a2, _b;
return (_b = $1 != null ? $1 : (_a2 = matches[match]) == null ? void 0 : _a2.call(matches)) != null ? _b : match;
});
}
function normalizeDate(date) {
if (date === null)
return new Date(Number.NaN);
if (date === void 0)
return /* @__PURE__ */ new Date();
if (date instanceof Date)
return new Date(date);
if (typeof date === "string" && !/Z$/i.test(date)) {
const d = date.match(REGEX_PARSE);
if (d) {
const m = d[2] - 1 || 0;
const ms = (d[7] || "0").substring(0, 3);
return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);
}
}
return new Date(date);
}
function useDateFormat(date, formatStr = "HH:mm:ss", options = {}) {
return computed(() => formatDate(normalizeDate(toValue(date)), toValue(formatStr), options));
}
function useIntervalFn(cb, interval = 1e3, options = {}) {
const {
immediate = true,
immediateCallback = false
} = options;
let timer = null;
const isActive = ref(false);
function clean() {
if (timer) {
clearInterval(timer);
timer = null;
}
}
function pause() {
isActive.value = false;
clean();
}
function resume() {
const intervalValue = toValue(interval);
if (intervalValue <= 0)
return;
isActive.value = true;
if (immediateCallback)
cb();
clean();
timer = setInterval(cb, intervalValue);
}
if (immediate && isClient)
resume();
if (isRef(interval) || typeof interval === "function") {
const stopWatch = watch(interval, () => {
if (isActive.value && isClient)
resume();
});
tryOnScopeDispose(stopWatch);
}
tryOnScopeDispose(pause);
return {
isActive,
pause,
resume
};
}
function useInterval(interval = 1e3, options = {}) {
const {
controls: exposeControls = false,
immediate = true,
callback
} = options;
const counter = ref(0);
const update = () => counter.value += 1;
const reset = () => {
counter.value = 0;
};
const controls = useIntervalFn(
callback ? () => {
update();
callback(counter.value);
} : update,
interval,
{ immediate }
);
if (exposeControls) {
return {
counter,
reset,
...controls
};
} else {
return counter;
}
}
function useLastChanged(source, options = {}) {
var _a;
const ms = ref((_a = options.initialValue) != null ? _a : null);
watch(
source,
() => ms.value = timestamp(),
options
);
return ms;
}
function useTimeoutFn(cb, interval, options = {}) {
const {
immediate = true
} = options;
const isPending = ref(false);
let timer = null;
function clear() {
if (timer) {
clearTimeout(timer);
timer = null;
}
}
function stop() {
isPending.value = false;
clear();
}
function start(...args) {
clear();
isPending.value = true;
timer = setTimeout(() => {
isPending.value = false;
timer = null;
cb(...args);
}, toValue(interval));
}
if (immediate) {
isPending.value = true;
if (isClient)
start();
}
tryOnScopeDispose(stop);
return {
isPending: readonly(isPending),
start,
stop
};
}
function useTimeout(interval = 1e3, options = {}) {
const {
controls: exposeControls = false,
callback
} = options;
const controls = useTimeoutFn(
callback != null ? callback : noop,
interval,
options
);
const ready = computed(() => !controls.isPending.value);
if (exposeControls) {
return {
ready,
...controls
};
} else {
return ready;
}
}
function useToNumber(value, options = {}) {
const {
method = "parseFloat",
radix,
nanToZero
} = options;
return computed(() => {
let resolved = toValue(value);
if (typeof resolved === "string")
resolved = Number[method](resolved, radix);
if (nanToZero && Number.isNaN(resolved))
resolved = 0;
return resolved;
});
}
function useToString(value) {
return computed(() => `${toValue(value)}`);
}
function useToggle(initialValue = false, options = {}) {
const {
truthyValue = true,
falsyValue = false
} = options;
const valueIsRef = isRef(initialValue);
const _value = ref(initialValue);
function toggle(value) {
if (arguments.length) {
_value.value = value;
return _value.value;
} else {
const truthy = toValue(truthyValue);
_value.value = _value.value === truthy ? toValue(falsyValue) : truthy;
return _value.value;
}
}
if (valueIsRef)
return toggle;
else
return [_value, toggle];
}
function watchArray(source, cb, options) {
let oldList = (options == null ? void 0 : options.immediate) ? [] : [...source instanceof Function ? source() : Array.isArray(source) ? source : toValue(source)];
return watch(source, (newList, _, onCleanup) => {
const oldListRemains = Array.from({ length: oldList.length });
const added = [];
for (const obj of newList) {
let found = false;
for (let i = 0; i < oldList.length; i++) {
if (!oldListRemains[i] && obj === oldList[i]) {
oldListRemains[i] = true;
found = true;
break;
}
}
if (!found)
added.push(obj);
}
const removed = oldList.filter((_2, i) => !oldListRemains[i]);
cb(newList, oldList, added, removed, onCleanup);
oldList = [...newList];
}, options);
}
function watchAtMost(source, cb, options) {
const {
count,
...watchOptions
} = options;
const current = ref(0);
const stop = watchWithFilter(
source,
(...args) => {
current.value += 1;
if (current.value >= toValue(count))
nextTick(() => stop());
cb(...args);
},
watchOptions
);
return { count: current, stop };
}
function watchDebounced(source, cb, options = {}) {
const {
debounce = 0,
maxWait = void 0,
...watchOptions
} = options;
return watchWithFilter(
source,
cb,
{
...watchOptions,
eventFilter: debounceFilter(debounce, { maxWait })
}
);
}
function watchDeep(source, cb, options) {
return watch(
source,
cb,
{
...options,
deep: true
}
);
}
function watchIgnorable(source, cb, options = {}) {
const {
eventFilter = bypassFilter,
...watchOptions
} = options;
const filteredCb = createFilterWrapper(
eventFilter,
cb
);
let ignoreUpdates;
let ignorePrevAsyncUpdates;
let stop;
if (watchOptions.flush === "sync") {
const ignore = ref(false);
ignorePrevAsyncUpdates = () => {
};
ignoreUpdates = (updater) => {
ignore.value = true;
updater();
ignore.value = false;
};
stop = watch(
source,
(...args) => {
if (!ignore.value)
filteredCb(...args);
},
watchOptions
);
} else {
const disposables = [];
const ignoreCounter = ref(0);
const syncCounter = ref(0);
ignorePrevAsyncUpdates = () => {
ignoreCounter.value = syncCounter.value;
};
disposables.push(
watch(
source,
() => {
syncCounter.value++;
},
{ ...watchOptions, flush: "sync" }
)
);
ignoreUpdates = (updater) => {
const syncCounterPrev = syncCounter.value;
updater();
ignoreCounter.value += syncCounter.value - syncCounterPrev;
};
disposables.push(
watch(
source,
(...args) => {
const ignore = ignoreCounter.value > 0 && ignoreCounter.value === syncCounter.value;
ignoreCounter.value = 0;
syncCounter.value = 0;
if (ignore)
return;
filteredCb(...args);
},
watchOptions
)
);
stop = () => {
disposables.forEach((fn) => fn());
};
}
return { stop, ignoreUpdates, ignorePrevAsyncUpdates };
}
function watchImmediate(source, cb, options) {
return watch(
source,
cb,
{
...options,
immediate: true
}
);
}
function watchOnce(source, cb, options) {
const stop = watch(source, (...args) => {
nextTick(() => stop());
return cb(...args);
}, options);
return stop;
}
function watchThrottled(source, cb, options = {}) {
const {
throttle = 0,
trailing = true,
leading = true,
...watchOptions
} = options;
return watchWithFilter(
source,
cb,
{
...watchOptions,
eventFilter: throttleFilter(throttle, trailing, leading)
}
);
}
function watchTriggerable(source, cb, options = {}) {
let cleanupFn;
function onEffect() {
if (!cleanupFn)
return;
const fn = cleanupFn;
cleanupFn = void 0;
fn();
}
function onCleanup(callback) {
cleanupFn = callback;
}
const _cb = (value, oldValue) => {
onEffect();
return cb(value, oldValue, onCleanup);
};
const res = watchIgnorable(source, _cb, options);
const { ignoreUpdates } = res;
const trigger = () => {
let res2;
ignoreUpdates(() => {
res2 = _cb(getWatchSources(source), getOldValue(source));
});
return res2;
};
return {
...res,
trigger
};
}
function getWatchSources(sources) {
if (isReactive(sources))
return sources;
if (Array.isArray(sources))
return sources.map((item) => toValue(item));
return toValue(sources);
}
function getOldValue(source) {
return Array.isArray(source) ? source.map(() => void 0) : void 0;
}
function whenever(source, cb, options) {
const stop = watch(
source,
(v, ov, onInvalidate) => {
if (v) {
if (options == null ? void 0 : options.once)
nextTick(() => stop());
cb(v, ov, onInvalidate);
}
},
{
...options,
once: false
}
);
return stop;
}
export { assert, refAutoReset as autoResetRef, bypassFilter, camelize, clamp, computedEager, computedWithControl, containsProp, computedWithControl as controlledComputed, controlledRef, createEventHook, createFilterWrapper, createGlobalState, createInjectionState, reactify as createReactiveFn, createSharedComposable, createSingletonPromise, debounceFilter, refDebounced as debouncedRef, watchDebounced as debouncedWatch, directiveHooks, computedEager as eagerComputed, extendRef, formatDate, get, getLifeCycleTarget, hasOwn, hyphenate, identity, watchIgnorable as ignorableWatch, increaseWithUnit, injectLocal, invoke, isClient, isDef, isDefined, isIOS, isObject, isWorker, makeDestructurable, noop, normalizeDate, notNullish, now, objectEntries, objectOmit, objectPick, pausableFilter, watchPausable as pausableWatch, promiseTimeout, provideLocal, rand, reactify, reactifyObject, reactiveComputed, reactiveOmit, reactivePick, refAutoReset, refDebounced, refDefault, refThrottled, refWithControl, resolveRef, resolveUnref, set, syncRef, syncRefs, throttleFilter, refThrottled as throttledRef, watchThrottled as throttledWatch, timestamp, toReactive, toRef, toRefs, toValue, tryOnBeforeMount, tryOnBeforeUnmount, tryOnMounted, tryOnScopeDispose, tryOnUnmounted, until, useArrayDifference, useArrayEvery, useArrayFilter, useArrayFind, useArrayFindIndex, useArrayFindLast, useArrayIncludes, useArrayJoin, useArrayMap, useArrayReduce, useArraySome, useArrayUnique, useCounter, useDateFormat, refDebounced as useDebounce, useDebounceFn, useInterval, useIntervalFn, useLastChanged, refThrottled as useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useToNumber, useToString, useToggle, watchArray, watchAtMost, watchDebounced, watchDeep, watchIgnorable, watchImmediate, watchOnce, watchPausable, watchThrottled, watchTriggerable, watchWithFilter, whenever };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4Lm1qcz92PWU0ZjE4YzI5Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNoYWxsb3dSZWYsIHdhdGNoRWZmZWN0LCByZWFkb25seSwgcmVmLCB3YXRjaCwgY3VzdG9tUmVmLCBnZXRDdXJyZW50U2NvcGUsIG9uU2NvcGVEaXNwb3NlLCBlZmZlY3RTY29wZSwgZ2V0Q3VycmVudEluc3RhbmNlLCBwcm92aWRlLCBpbmplY3QsIGlzVnVlMywgdmVyc2lvbiwgaXNSZWYsIHVucmVmLCBjb21wdXRlZCwgcmVhY3RpdmUsIHRvUmVmcyBhcyB0b1JlZnMkMSwgdG9SZWYgYXMgdG9SZWYkMSwgaXNWdWUyLCBzZXQgYXMgc2V0JDEsIG9uQmVmb3JlTW91bnQsIG5leHRUaWNrLCBvbkJlZm9yZVVubW91bnQsIG9uTW91bnRlZCwgb25Vbm1vdW50ZWQsIGlzUmVhY3RpdmUgfSBmcm9tICd2dWUtZGVtaSc7XG5cbmZ1bmN0aW9uIGNvbXB1dGVkRWFnZXIoZm4sIG9wdGlvbnMpIHtcbiAgdmFyIF9hO1xuICBjb25zdCByZXN1bHQgPSBzaGFsbG93UmVmKCk7XG4gIHdhdGNoRWZmZWN0KCgpID0+IHtcbiAgICByZXN1bHQudmFsdWUgPSBmbigpO1xuICB9LCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBmbHVzaDogKF9hID0gb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5mbHVzaCkgIT0gbnVsbCA/IF9hIDogXCJzeW5jXCJcbiAgfSk7XG4gIHJldHVybiByZWFkb25seShyZXN1bHQpO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlZFdpdGhDb250cm9sKHNvdXJjZSwgZm4pIHtcbiAgbGV0IHYgPSB2b2lkIDA7XG4gIGxldCB0cmFjaztcbiAgbGV0IHRyaWdnZXI7XG4gIGNvbnN0IGRpcnR5ID0gcmVmKHRydWUpO1xuICBjb25zdCB1cGRhdGUgPSAoKSA9PiB7XG4gICAgZGlydHkudmFsdWUgPSB0cnVlO1xuICAgIHRyaWdnZXIoKTtcbiAgfTtcbiAgd2F0Y2goc291cmNlLCB1cGRhdGUsIHsgZmx1c2g6IFwic3luY1wiIH0pO1xuICBjb25zdCBnZXQgPSB0eXBlb2YgZm4gPT09IFwiZnVuY3Rpb25cIiA/IGZuIDogZm4uZ2V0O1xuICBjb25zdCBzZXQgPSB0eXBlb2YgZm4gPT09IFwiZnVuY3Rpb25cIiA/IHZvaWQgMCA6IGZuLnNldDtcbiAgY29uc3QgcmVzdWx0ID0gY3VzdG9tUmVmKChfdHJhY2ssIF90cmlnZ2VyKSA9PiB7XG4gICAgdHJhY2sgPSBfdHJhY2s7XG4gICAgdHJpZ2dlciA9IF90cmlnZ2VyO1xuICAgIHJldHVybiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGlmIChkaXJ0eS52YWx1ZSkge1xuICAgICAgICAgIHYgPSBnZXQoKTtcbiAgICAgICAgICBkaXJ0eS52YWx1ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRyYWNrKCk7XG4gICAgICAgIHJldHVybiB2O1xuICAgICAgfSxcbiAgICAgIHNldCh2Mikge1xuICAgICAgICBzZXQgPT0gbnVsbCA/IHZvaWQgMCA6IHNldCh2Mik7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIGlmIChPYmplY3QuaXNFeHRlbnNpYmxlKHJlc3VsdCkpXG4gICAgcmVzdWx0LnRyaWdnZXIgPSB1cGRhdGU7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHRyeU9uU2NvcGVEaXNwb3NlKGZuKSB7XG4gIGlmIChnZXRDdXJyZW50U2NvcGUoKSkge1xuICAgIG9uU2NvcGVEaXNwb3NlKGZuKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50SG9vaygpIHtcbiAgY29uc3QgZm5zID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgY29uc3Qgb2ZmID0gKGZuKSA9PiB7XG4gICAgZm5zLmRlbGV0ZShmbik7XG4gIH07XG4gIGNvbnN0IG9uID0gKGZuKSA9PiB7XG4gICAgZm5zLmFkZChmbik7XG4gICAgY29uc3Qgb2ZmRm4gPSAoKSA9PiBvZmYoZm4pO1xuICAgIHRyeU9uU2NvcGVEaXNwb3NlKG9mZkZuKTtcbiAgICByZXR1cm4ge1xuICAgICAgb2ZmOiBvZmZGblxuICAgIH07XG4gIH07XG4gIGNvbnN0IHRyaWdnZXIgPSAoLi4uYXJncykgPT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChBcnJheS5mcm9tKGZucykubWFwKChmbikgPT4gZm4oLi4uYXJncykpKTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBvbixcbiAgICBvZmYsXG4gICAgdHJpZ2dlclxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVHbG9iYWxTdGF0ZShzdGF0ZUZhY3RvcnkpIHtcbiAgbGV0IGluaXRpYWxpemVkID0gZmFsc2U7XG4gIGxldCBzdGF0ZTtcbiAgY29uc3Qgc2NvcGUgPSBlZmZlY3RTY29wZSh0cnVlKTtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgaWYgKCFpbml0aWFsaXplZCkge1xuICAgICAgc3RhdGUgPSBzY29wZS5ydW4oKCkgPT4gc3RhdGVGYWN0b3J5KC4uLmFyZ3MpKTtcbiAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9O1xufVxuXG5jb25zdCBsb2NhbFByb3ZpZGVkU3RhdGVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcblxuY29uc3QgcHJvdmlkZUxvY2FsID0gKGtleSwgdmFsdWUpID0+IHtcbiAgdmFyIF9hO1xuICBjb25zdCBpbnN0YW5jZSA9IChfYSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpKSA9PSBudWxsID8gdm9pZCAwIDogX2EucHJveHk7XG4gIGlmIChpbnN0YW5jZSA9PSBudWxsKVxuICAgIHRocm93IG5ldyBFcnJvcihcInByb3ZpZGVMb2NhbCBtdXN0IGJlIGNhbGxlZCBpbiBzZXR1cFwiKTtcbiAgaWYgKCFsb2NhbFByb3ZpZGVkU3RhdGVNYXAuaGFzKGluc3RhbmNlKSlcbiAgICBsb2NhbFByb3ZpZGVkU3RhdGVNYXAuc2V0KGluc3RhbmNlLCAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gIGNvbnN0IGxvY2FsUHJvdmlkZWRTdGF0ZSA9IGxvY2FsUHJvdmlkZWRTdGF0ZU1hcC5nZXQoaW5zdGFuY2UpO1xuICBsb2NhbFByb3ZpZGVkU3RhdGVba2V5XSA9IHZhbHVlO1xuICBwcm92aWRlKGtleSwgdmFsdWUpO1xufTtcblxuY29uc3QgaW5qZWN0TG9jYWwgPSAoLi4uYXJncykgPT4ge1xuICB2YXIgX2E7XG4gIGNvbnN0IGtleSA9IGFyZ3NbMF07XG4gIGNvbnN0IGluc3RhbmNlID0gKF9hID0gZ2V0Q3VycmVudEluc3RhbmNlKCkpID09IG51bGwgPyB2b2lkIDAgOiBfYS5wcm94eTtcbiAgaWYgKGluc3RhbmNlID09IG51bGwpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW5qZWN0TG9jYWwgbXVzdCBiZSBjYWxsZWQgaW4gc2V0dXBcIik7XG4gIGlmIChsb2NhbFByb3ZpZGVkU3RhdGVNYXAuaGFzKGluc3RhbmNlKSAmJiBrZXkgaW4gbG9jYWxQcm92aWRlZFN0YXRlTWFwLmdldChpbnN0YW5jZSkpXG4gICAgcmV0dXJuIGxvY2FsUHJvdmlkZWRTdGF0ZU1hcC5nZXQoaW5zdGFuY2UpW2tleV07XG4gIHJldHVybiBpbmplY3QoLi4uYXJncyk7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVJbmplY3Rpb25TdGF0ZShjb21wb3NhYmxlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGtleSA9IChvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmluamVjdGlvbktleSkgfHwgU3ltYm9sKGNvbXBvc2FibGUubmFtZSB8fCBcIkluamVjdGlvblN0YXRlXCIpO1xuICBjb25zdCB1c2VQcm92aWRpbmdTdGF0ZSA9ICguLi5hcmdzKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSBjb21wb3NhYmxlKC4uLmFyZ3MpO1xuICAgIHByb3ZpZGVMb2NhbChrZXksIHN0YXRlKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH07XG4gIGNvbnN0IHVzZUluamVjdGVkU3RhdGUgPSAoKSA9PiBpbmplY3RMb2NhbChrZXkpO1xuICByZXR1cm4gW3VzZVByb3ZpZGluZ1N0YXRlLCB1c2VJbmplY3RlZFN0YXRlXTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2hhcmVkQ29tcG9zYWJsZShjb21wb3NhYmxlKSB7XG4gIGxldCBzdWJzY3JpYmVycyA9IDA7XG4gIGxldCBzdGF0ZTtcbiAgbGV0IHNjb3BlO1xuICBjb25zdCBkaXNwb3NlID0gKCkgPT4ge1xuICAgIHN1YnNjcmliZXJzIC09IDE7XG4gICAgaWYgKHNjb3BlICYmIHN1YnNjcmliZXJzIDw9IDApIHtcbiAgICAgIHNjb3BlLnN0b3AoKTtcbiAgICAgIHN0YXRlID0gdm9pZCAwO1xuICAgICAgc2NvcGUgPSB2b2lkIDA7XG4gICAgfVxuICB9O1xuICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICBzdWJzY3JpYmVycyArPSAxO1xuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHNjb3BlID0gZWZmZWN0U2NvcGUodHJ1ZSk7XG4gICAgICBzdGF0ZSA9IHNjb3BlLnJ1bigoKSA9PiBjb21wb3NhYmxlKC4uLmFyZ3MpKTtcbiAgICB9XG4gICAgdHJ5T25TY29wZURpc3Bvc2UoZGlzcG9zZSk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBleHRlbmRSZWYocmVmLCBleHRlbmQsIHsgZW51bWVyYWJsZSA9IGZhbHNlLCB1bndyYXAgPSB0cnVlIH0gPSB7fSkge1xuICBpZiAoIWlzVnVlMyAmJiAhdmVyc2lvbi5zdGFydHNXaXRoKFwiMi43LlwiKSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbVnVlVXNlXSBleHRlbmRSZWYgb25seSB3b3JrcyBpbiBWdWUgMi43IG9yIGFib3ZlLlwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXh0ZW5kKSkge1xuICAgIGlmIChrZXkgPT09IFwidmFsdWVcIilcbiAgICAgIGNvbnRpbnVlO1xuICAgIGlmIChpc1JlZih2YWx1ZSkgJiYgdW53cmFwKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVmLCBrZXksIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZS52YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHYpIHtcbiAgICAgICAgICB2YWx1ZS52YWx1ZSA9IHY7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVmLCBrZXksIHsgdmFsdWUsIGVudW1lcmFibGUgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZWY7XG59XG5cbmZ1bmN0aW9uIGdldChvYmosIGtleSkge1xuICBpZiAoa2V5ID09IG51bGwpXG4gICAgcmV0dXJuIHVucmVmKG9iaik7XG4gIHJldHVybiB1bnJlZihvYmopW2tleV07XG59XG5cbmZ1bmN0aW9uIGlzRGVmaW5lZCh2KSB7XG4gIHJldHVybiB1bnJlZih2KSAhPSBudWxsO1xufVxuXG5mdW5jdGlvbiBtYWtlRGVzdHJ1Y3R1cmFibGUob2JqLCBhcnIpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjb25zdCBjbG9uZSA9IHsgLi4ub2JqIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsb25lLCBTeW1ib2wuaXRlcmF0b3IsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWUoKSB7XG4gICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmV4dDogKCkgPT4gKHtcbiAgICAgICAgICAgIHZhbHVlOiBhcnJbaW5kZXgrK10sXG4gICAgICAgICAgICBkb25lOiBpbmRleCA+IGFyci5sZW5ndGhcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihbLi4uYXJyXSwgb2JqKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b1ZhbHVlKHIpIHtcbiAgcmV0dXJuIHR5cGVvZiByID09PSBcImZ1bmN0aW9uXCIgPyByKCkgOiB1bnJlZihyKTtcbn1cbmNvbnN0IHJlc29sdmVVbnJlZiA9IHRvVmFsdWU7XG5cbmZ1bmN0aW9uIHJlYWN0aWZ5KGZuLCBvcHRpb25zKSB7XG4gIGNvbnN0IHVucmVmRm4gPSAob3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5jb21wdXRlZEdldHRlcikgPT09IGZhbHNlID8gdW5yZWYgOiB0b1ZhbHVlO1xuICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiBmbi5hcHBseSh0aGlzLCBhcmdzLm1hcCgoaSkgPT4gdW5yZWZGbihpKSkpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVhY3RpZnlPYmplY3Qob2JqLCBvcHRpb25zT3JLZXlzID0ge30pIHtcbiAgbGV0IGtleXMgPSBbXTtcbiAgbGV0IG9wdGlvbnM7XG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnNPcktleXMpKSB7XG4gICAga2V5cyA9IG9wdGlvbnNPcktleXM7XG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnNPcktleXM7XG4gICAgY29uc3QgeyBpbmNsdWRlT3duUHJvcGVydGllcyA9IHRydWUgfSA9IG9wdGlvbnNPcktleXM7XG4gICAga2V5cy5wdXNoKC4uLk9iamVjdC5rZXlzKG9iaikpO1xuICAgIGlmIChpbmNsdWRlT3duUHJvcGVydGllcylcbiAgICAgIGtleXMucHVzaCguLi5PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopKTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIGtleXMubWFwKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgICByZXR1cm4gW1xuICAgICAgICBrZXksXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVhY3RpZnkodmFsdWUuYmluZChvYmopLCBvcHRpb25zKSA6IHZhbHVlXG4gICAgICBdO1xuICAgIH0pXG4gICk7XG59XG5cbmZ1bmN0aW9uIHRvUmVhY3RpdmUob2JqZWN0UmVmKSB7XG4gIGlmICghaXNSZWYob2JqZWN0UmVmKSlcbiAgICByZXR1cm4gcmVhY3RpdmUob2JqZWN0UmVmKTtcbiAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkoe30sIHtcbiAgICBnZXQoXywgcCwgcmVjZWl2ZXIpIHtcbiAgICAgIHJldHVybiB1bnJlZihSZWZsZWN0LmdldChvYmplY3RSZWYudmFsdWUsIHAsIHJlY2VpdmVyKSk7XG4gICAgfSxcbiAgICBzZXQoXywgcCwgdmFsdWUpIHtcbiAgICAgIGlmIChpc1JlZihvYmplY3RSZWYudmFsdWVbcF0pICYmICFpc1JlZih2YWx1ZSkpXG4gICAgICAgIG9iamVjdFJlZi52YWx1ZVtwXS52YWx1ZSA9IHZhbHVlO1xuICAgICAgZWxzZVxuICAgICAgICBvYmplY3RSZWYudmFsdWVbcF0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgZGVsZXRlUHJvcGVydHkoXywgcCkge1xuICAgICAgcmV0dXJuIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkob2JqZWN0UmVmLnZhbHVlLCBwKTtcbiAgICB9LFxuICAgIGhhcyhfLCBwKSB7XG4gICAgICByZXR1cm4gUmVmbGVjdC5oYXMob2JqZWN0UmVmLnZhbHVlLCBwKTtcbiAgICB9LFxuICAgIG93bktleXMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0UmVmLnZhbHVlKTtcbiAgICB9LFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVhY3RpdmUocHJveHkpO1xufVxuXG5mdW5jdGlvbiByZWFjdGl2ZUNvbXB1dGVkKGZuKSB7XG4gIHJldHVybiB0b1JlYWN0aXZlKGNvbXB1dGVkKGZuKSk7XG59XG5cbmZ1bmN0aW9uIHJlYWN0aXZlT21pdChvYmosIC4uLmtleXMpIHtcbiAgY29uc3QgZmxhdEtleXMgPSBrZXlzLmZsYXQoKTtcbiAgY29uc3QgcHJlZGljYXRlID0gZmxhdEtleXNbMF07XG4gIHJldHVybiByZWFjdGl2ZUNvbXB1dGVkKCgpID0+IHR5cGVvZiBwcmVkaWNhdGUgPT09IFwiZnVuY3Rpb25cIiA/IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0b1JlZnMkMShvYmopKS5maWx0ZXIoKFtrLCB2XSkgPT4gIXByZWRpY2F0ZSh0b1ZhbHVlKHYpLCBrKSkpIDogT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHRvUmVmcyQxKG9iaikpLmZpbHRlcigoZSkgPT4gIWZsYXRLZXlzLmluY2x1ZGVzKGVbMF0pKSkpO1xufVxuXG5jb25zdCBpc0NsaWVudCA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiO1xuY29uc3QgaXNXb3JrZXIgPSB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsVGhpcyBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlO1xuY29uc3QgaXNEZWYgPSAodmFsKSA9PiB0eXBlb2YgdmFsICE9PSBcInVuZGVmaW5lZFwiO1xuY29uc3Qgbm90TnVsbGlzaCA9ICh2YWwpID0+IHZhbCAhPSBudWxsO1xuY29uc3QgYXNzZXJ0ID0gKGNvbmRpdGlvbiwgLi4uaW5mb3MpID0+IHtcbiAgaWYgKCFjb25kaXRpb24pXG4gICAgY29uc29sZS53YXJuKC4uLmluZm9zKTtcbn07XG5jb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5jb25zdCBpc09iamVjdCA9ICh2YWwpID0+IHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIjtcbmNvbnN0IG5vdyA9ICgpID0+IERhdGUubm93KCk7XG5jb25zdCB0aW1lc3RhbXAgPSAoKSA9PiArRGF0ZS5ub3coKTtcbmNvbnN0IGNsYW1wID0gKG4sIG1pbiwgbWF4KSA9PiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgbikpO1xuY29uc3Qgbm9vcCA9ICgpID0+IHtcbn07XG5jb25zdCByYW5kID0gKG1pbiwgbWF4KSA9PiB7XG4gIG1pbiA9IE1hdGguY2VpbChtaW4pO1xuICBtYXggPSBNYXRoLmZsb29yKG1heCk7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluO1xufTtcbmNvbnN0IGhhc093biA9ICh2YWwsIGtleSkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbCwga2V5KTtcbmNvbnN0IGlzSU9TID0gLyogQF9fUFVSRV9fICovIGdldElzSU9TKCk7XG5mdW5jdGlvbiBnZXRJc0lPUygpIHtcbiAgdmFyIF9hLCBfYjtcbiAgcmV0dXJuIGlzQ2xpZW50ICYmICgoX2EgPSB3aW5kb3cgPT0gbnVsbCA/IHZvaWQgMCA6IHdpbmRvdy5uYXZpZ2F0b3IpID09IG51bGwgPyB2b2lkIDAgOiBfYS51c2VyQWdlbnQpICYmICgvaVAoYWR8aG9uZXxvZCkvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpIHx8ICgoX2IgPSB3aW5kb3cgPT0gbnVsbCA/IHZvaWQgMCA6IHdpbmRvdy5uYXZpZ2F0b3IpID09IG51bGwgPyB2b2lkIDAgOiBfYi5tYXhUb3VjaFBvaW50cykgPiAyICYmIC9pUGFkfE1hY2ludG9zaC8udGVzdCh3aW5kb3cgPT0gbnVsbCA/IHZvaWQgMCA6IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpbHRlcldyYXBwZXIoZmlsdGVyLCBmbikge1xuICBmdW5jdGlvbiB3cmFwcGVyKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKGZpbHRlcigoKSA9PiBmbi5hcHBseSh0aGlzLCBhcmdzKSwgeyBmbiwgdGhpc0FyZzogdGhpcywgYXJncyB9KSkudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuY29uc3QgYnlwYXNzRmlsdGVyID0gKGludm9rZSkgPT4ge1xuICByZXR1cm4gaW52b2tlKCk7XG59O1xuZnVuY3Rpb24gZGVib3VuY2VGaWx0ZXIobXMsIG9wdGlvbnMgPSB7fSkge1xuICBsZXQgdGltZXI7XG4gIGxldCBtYXhUaW1lcjtcbiAgbGV0IGxhc3RSZWplY3RvciA9IG5vb3A7XG4gIGNvbnN0IF9jbGVhclRpbWVvdXQgPSAodGltZXIyKSA9PiB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyMik7XG4gICAgbGFzdFJlamVjdG9yKCk7XG4gICAgbGFzdFJlamVjdG9yID0gbm9vcDtcbiAgfTtcbiAgY29uc3QgZmlsdGVyID0gKGludm9rZSkgPT4ge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gdG9WYWx1ZShtcyk7XG4gICAgY29uc3QgbWF4RHVyYXRpb24gPSB0b1ZhbHVlKG9wdGlvbnMubWF4V2FpdCk7XG4gICAgaWYgKHRpbWVyKVxuICAgICAgX2NsZWFyVGltZW91dCh0aW1lcik7XG4gICAgaWYgKGR1cmF0aW9uIDw9IDAgfHwgbWF4RHVyYXRpb24gIT09IHZvaWQgMCAmJiBtYXhEdXJhdGlvbiA8PSAwKSB7XG4gICAgICBpZiAobWF4VGltZXIpIHtcbiAgICAgICAgX2NsZWFyVGltZW91dChtYXhUaW1lcik7XG4gICAgICAgIG1heFRpbWVyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaW52b2tlKCkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGFzdFJlamVjdG9yID0gb3B0aW9ucy5yZWplY3RPbkNhbmNlbCA/IHJlamVjdCA6IHJlc29sdmU7XG4gICAgICBpZiAobWF4RHVyYXRpb24gJiYgIW1heFRpbWVyKSB7XG4gICAgICAgIG1heFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRpbWVyKVxuICAgICAgICAgICAgX2NsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgbWF4VGltZXIgPSBudWxsO1xuICAgICAgICAgIHJlc29sdmUoaW52b2tlKCkpO1xuICAgICAgICB9LCBtYXhEdXJhdGlvbik7XG4gICAgICB9XG4gICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAobWF4VGltZXIpXG4gICAgICAgICAgX2NsZWFyVGltZW91dChtYXhUaW1lcik7XG4gICAgICAgIG1heFRpbWVyID0gbnVsbDtcbiAgICAgICAgcmVzb2x2ZShpbnZva2UoKSk7XG4gICAgICB9LCBkdXJhdGlvbik7XG4gICAgfSk7XG4gIH07XG4gIHJldHVybiBmaWx0ZXI7XG59XG5mdW5jdGlvbiB0aHJvdHRsZUZpbHRlciguLi5hcmdzKSB7XG4gIGxldCBsYXN0RXhlYyA9IDA7XG4gIGxldCB0aW1lcjtcbiAgbGV0IGlzTGVhZGluZyA9IHRydWU7XG4gIGxldCBsYXN0UmVqZWN0b3IgPSBub29wO1xuICBsZXQgbGFzdFZhbHVlO1xuICBsZXQgbXM7XG4gIGxldCB0cmFpbGluZztcbiAgbGV0IGxlYWRpbmc7XG4gIGxldCByZWplY3RPbkNhbmNlbDtcbiAgaWYgKCFpc1JlZihhcmdzWzBdKSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gXCJvYmplY3RcIilcbiAgICAoeyBkZWxheTogbXMsIHRyYWlsaW5nID0gdHJ1ZSwgbGVhZGluZyA9IHRydWUsIHJlamVjdE9uQ2FuY2VsID0gZmFsc2UgfSA9IGFyZ3NbMF0pO1xuICBlbHNlXG4gICAgW21zLCB0cmFpbGluZyA9IHRydWUsIGxlYWRpbmcgPSB0cnVlLCByZWplY3RPbkNhbmNlbCA9IGZhbHNlXSA9IGFyZ3M7XG4gIGNvbnN0IGNsZWFyID0gKCkgPT4ge1xuICAgIGlmICh0aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRpbWVyID0gdm9pZCAwO1xuICAgICAgbGFzdFJlamVjdG9yKCk7XG4gICAgICBsYXN0UmVqZWN0b3IgPSBub29wO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZmlsdGVyID0gKF9pbnZva2UpID0+IHtcbiAgICBjb25zdCBkdXJhdGlvbiA9IHRvVmFsdWUobXMpO1xuICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gbGFzdEV4ZWM7XG4gICAgY29uc3QgaW52b2tlID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIGxhc3RWYWx1ZSA9IF9pbnZva2UoKTtcbiAgICB9O1xuICAgIGNsZWFyKCk7XG4gICAgaWYgKGR1cmF0aW9uIDw9IDApIHtcbiAgICAgIGxhc3RFeGVjID0gRGF0ZS5ub3coKTtcbiAgICAgIHJldHVybiBpbnZva2UoKTtcbiAgICB9XG4gICAgaWYgKGVsYXBzZWQgPiBkdXJhdGlvbiAmJiAobGVhZGluZyB8fCAhaXNMZWFkaW5nKSkge1xuICAgICAgbGFzdEV4ZWMgPSBEYXRlLm5vdygpO1xuICAgICAgaW52b2tlKCk7XG4gICAgfSBlbHNlIGlmICh0cmFpbGluZykge1xuICAgICAgbGFzdFZhbHVlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsYXN0UmVqZWN0b3IgPSByZWplY3RPbkNhbmNlbCA/IHJlamVjdCA6IHJlc29sdmU7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgbGFzdEV4ZWMgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGlzTGVhZGluZyA9IHRydWU7XG4gICAgICAgICAgcmVzb2x2ZShpbnZva2UoKSk7XG4gICAgICAgICAgY2xlYXIoKTtcbiAgICAgICAgfSwgTWF0aC5tYXgoMCwgZHVyYXRpb24gLSBlbGFwc2VkKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFsZWFkaW5nICYmICF0aW1lcilcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBpc0xlYWRpbmcgPSB0cnVlLCBkdXJhdGlvbik7XG4gICAgaXNMZWFkaW5nID0gZmFsc2U7XG4gICAgcmV0dXJuIGxhc3RWYWx1ZTtcbiAgfTtcbiAgcmV0dXJuIGZpbHRlcjtcbn1cbmZ1bmN0aW9uIHBhdXNhYmxlRmlsdGVyKGV4dGVuZEZpbHRlciA9IGJ5cGFzc0ZpbHRlcikge1xuICBjb25zdCBpc0FjdGl2ZSA9IHJlZih0cnVlKTtcbiAgZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgaXNBY3RpdmUudmFsdWUgPSBmYWxzZTtcbiAgfVxuICBmdW5jdGlvbiByZXN1bWUoKSB7XG4gICAgaXNBY3RpdmUudmFsdWUgPSB0cnVlO1xuICB9XG4gIGNvbnN0IGV2ZW50RmlsdGVyID0gKC4uLmFyZ3MpID0+IHtcbiAgICBpZiAoaXNBY3RpdmUudmFsdWUpXG4gICAgICBleHRlbmRGaWx0ZXIoLi4uYXJncyk7XG4gIH07XG4gIHJldHVybiB7IGlzQWN0aXZlOiByZWFkb25seShpc0FjdGl2ZSksIHBhdXNlLCByZXN1bWUsIGV2ZW50RmlsdGVyIH07XG59XG5cbmNvbnN0IGRpcmVjdGl2ZUhvb2tzID0ge1xuICBtb3VudGVkOiBpc1Z1ZTMgPyBcIm1vdW50ZWRcIiA6IFwiaW5zZXJ0ZWRcIixcbiAgdXBkYXRlZDogaXNWdWUzID8gXCJ1cGRhdGVkXCIgOiBcImNvbXBvbmVudFVwZGF0ZWRcIixcbiAgdW5tb3VudGVkOiBpc1Z1ZTMgPyBcInVubW91bnRlZFwiIDogXCJ1bmJpbmRcIlxufTtcblxuZnVuY3Rpb24gY2FjaGVTdHJpbmdGdW5jdGlvbihmbikge1xuICBjb25zdCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gKHN0cikgPT4ge1xuICAgIGNvbnN0IGhpdCA9IGNhY2hlW3N0cl07XG4gICAgcmV0dXJuIGhpdCB8fCAoY2FjaGVbc3RyXSA9IGZuKHN0cikpO1xuICB9O1xufVxuY29uc3QgaHlwaGVuYXRlUkUgPSAvXFxCKFtBLVpdKS9nO1xuY29uc3QgaHlwaGVuYXRlID0gY2FjaGVTdHJpbmdGdW5jdGlvbigoc3RyKSA9PiBzdHIucmVwbGFjZShoeXBoZW5hdGVSRSwgXCItJDFcIikudG9Mb3dlckNhc2UoKSk7XG5jb25zdCBjYW1lbGl6ZVJFID0gLy0oXFx3KS9nO1xuY29uc3QgY2FtZWxpemUgPSBjYWNoZVN0cmluZ0Z1bmN0aW9uKChzdHIpID0+IHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKGNhbWVsaXplUkUsIChfLCBjKSA9PiBjID8gYy50b1VwcGVyQ2FzZSgpIDogXCJcIik7XG59KTtcblxuZnVuY3Rpb24gcHJvbWlzZVRpbWVvdXQobXMsIHRocm93T25UaW1lb3V0ID0gZmFsc2UsIHJlYXNvbiA9IFwiVGltZW91dFwiKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgaWYgKHRocm93T25UaW1lb3V0KVxuICAgICAgc2V0VGltZW91dCgoKSA9PiByZWplY3QocmVhc29uKSwgbXMpO1xuICAgIGVsc2VcbiAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGlkZW50aXR5KGFyZykge1xuICByZXR1cm4gYXJnO1xufVxuZnVuY3Rpb24gY3JlYXRlU2luZ2xldG9uUHJvbWlzZShmbikge1xuICBsZXQgX3Byb21pc2U7XG4gIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgaWYgKCFfcHJvbWlzZSlcbiAgICAgIF9wcm9taXNlID0gZm4oKTtcbiAgICByZXR1cm4gX3Byb21pc2U7XG4gIH1cbiAgd3JhcHBlci5yZXNldCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBfcHJldiA9IF9wcm9taXNlO1xuICAgIF9wcm9taXNlID0gdm9pZCAwO1xuICAgIGlmIChfcHJldilcbiAgICAgIGF3YWl0IF9wcmV2O1xuICB9O1xuICByZXR1cm4gd3JhcHBlcjtcbn1cbmZ1bmN0aW9uIGludm9rZShmbikge1xuICByZXR1cm4gZm4oKTtcbn1cbmZ1bmN0aW9uIGNvbnRhaW5zUHJvcChvYmosIC4uLnByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5zb21lKChrKSA9PiBrIGluIG9iaik7XG59XG5mdW5jdGlvbiBpbmNyZWFzZVdpdGhVbml0KHRhcmdldCwgZGVsdGEpIHtcbiAgdmFyIF9hO1xuICBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJudW1iZXJcIilcbiAgICByZXR1cm4gdGFyZ2V0ICsgZGVsdGE7XG4gIGNvbnN0IHZhbHVlID0gKChfYSA9IHRhcmdldC5tYXRjaCgvXi0/WzAtOV0rXFwuP1swLTldKi8pKSA9PSBudWxsID8gdm9pZCAwIDogX2FbMF0pIHx8IFwiXCI7XG4gIGNvbnN0IHVuaXQgPSB0YXJnZXQuc2xpY2UodmFsdWUubGVuZ3RoKTtcbiAgY29uc3QgcmVzdWx0ID0gTnVtYmVyLnBhcnNlRmxvYXQodmFsdWUpICsgZGVsdGE7XG4gIGlmIChOdW1iZXIuaXNOYU4ocmVzdWx0KSlcbiAgICByZXR1cm4gdGFyZ2V0O1xuICByZXR1cm4gcmVzdWx0ICsgdW5pdDtcbn1cbmZ1bmN0aW9uIG9iamVjdFBpY2sob2JqLCBrZXlzLCBvbWl0VW5kZWZpbmVkID0gZmFsc2UpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKChuLCBrKSA9PiB7XG4gICAgaWYgKGsgaW4gb2JqKSB7XG4gICAgICBpZiAoIW9taXRVbmRlZmluZWQgfHwgb2JqW2tdICE9PSB2b2lkIDApXG4gICAgICAgIG5ba10gPSBvYmpba107XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9LCB7fSk7XG59XG5mdW5jdGlvbiBvYmplY3RPbWl0KG9iaiwga2V5cywgb21pdFVuZGVmaW5lZCA9IGZhbHNlKSB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMob2JqKS5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIHJldHVybiAoIW9taXRVbmRlZmluZWQgfHwgdmFsdWUgIT09IHZvaWQgMCkgJiYgIWtleXMuaW5jbHVkZXMoa2V5KTtcbiAgfSkpO1xufVxuZnVuY3Rpb24gb2JqZWN0RW50cmllcyhvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9iaik7XG59XG5mdW5jdGlvbiBnZXRMaWZlQ3ljbGVUYXJnZXQodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQgfHwgZ2V0Q3VycmVudEluc3RhbmNlKCk7XG59XG5cbmZ1bmN0aW9uIHRvUmVmKC4uLmFyZ3MpIHtcbiAgaWYgKGFyZ3MubGVuZ3RoICE9PSAxKVxuICAgIHJldHVybiB0b1JlZiQxKC4uLmFyZ3MpO1xuICBjb25zdCByID0gYXJnc1swXTtcbiAgcmV0dXJuIHR5cGVvZiByID09PSBcImZ1bmN0aW9uXCIgPyByZWFkb25seShjdXN0b21SZWYoKCkgPT4gKHsgZ2V0OiByLCBzZXQ6IG5vb3AgfSkpKSA6IHJlZihyKTtcbn1cbmNvbnN0IHJlc29sdmVSZWYgPSB0b1JlZjtcblxuZnVuY3Rpb24gcmVhY3RpdmVQaWNrKG9iaiwgLi4ua2V5cykge1xuICBjb25zdCBmbGF0S2V5cyA9IGtleXMuZmxhdCgpO1xuICBjb25zdCBwcmVkaWNhdGUgPSBmbGF0S2V5c1swXTtcbiAgcmV0dXJuIHJlYWN0aXZlQ29tcHV0ZWQoKCkgPT4gdHlwZW9mIHByZWRpY2F0ZSA9PT0gXCJmdW5jdGlvblwiID8gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHRvUmVmcyQxKG9iaikpLmZpbHRlcigoW2ssIHZdKSA9PiBwcmVkaWNhdGUodG9WYWx1ZSh2KSwgaykpKSA6IE9iamVjdC5mcm9tRW50cmllcyhmbGF0S2V5cy5tYXAoKGspID0+IFtrLCB0b1JlZihvYmosIGspXSkpKTtcbn1cblxuZnVuY3Rpb24gcmVmQXV0b1Jlc2V0KGRlZmF1bHRWYWx1ZSwgYWZ0ZXJNcyA9IDFlNCkge1xuICByZXR1cm4gY3VzdG9tUmVmKCh0cmFjaywgdHJpZ2dlcikgPT4ge1xuICAgIGxldCB2YWx1ZSA9IHRvVmFsdWUoZGVmYXVsdFZhbHVlKTtcbiAgICBsZXQgdGltZXI7XG4gICAgY29uc3QgcmVzZXRBZnRlciA9ICgpID0+IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdmFsdWUgPSB0b1ZhbHVlKGRlZmF1bHRWYWx1ZSk7XG4gICAgICB0cmlnZ2VyKCk7XG4gICAgfSwgdG9WYWx1ZShhZnRlck1zKSk7XG4gICAgdHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0KCkge1xuICAgICAgICB0cmFjaygpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9LFxuICAgICAgc2V0KG5ld1ZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIHRyaWdnZXIoKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgdGltZXIgPSByZXNldEFmdGVyKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVzZURlYm91bmNlRm4oZm4sIG1zID0gMjAwLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIGNyZWF0ZUZpbHRlcldyYXBwZXIoXG4gICAgZGVib3VuY2VGaWx0ZXIobXMsIG9wdGlvbnMpLFxuICAgIGZuXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlZkRlYm91bmNlZCh2YWx1ZSwgbXMgPSAyMDAsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBkZWJvdW5jZWQgPSByZWYodmFsdWUudmFsdWUpO1xuICBjb25zdCB1cGRhdGVyID0gdXNlRGVib3VuY2VGbigoKSA9PiB7XG4gICAgZGVib3VuY2VkLnZhbHVlID0gdmFsdWUudmFsdWU7XG4gIH0sIG1zLCBvcHRpb25zKTtcbiAgd2F0Y2godmFsdWUsICgpID0+IHVwZGF0ZXIoKSk7XG4gIHJldHVybiBkZWJvdW5jZWQ7XG59XG5cbmZ1bmN0aW9uIHJlZkRlZmF1bHQoc291cmNlLCBkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIGNvbXB1dGVkKHtcbiAgICBnZXQoKSB7XG4gICAgICB2YXIgX2E7XG4gICAgICByZXR1cm4gKF9hID0gc291cmNlLnZhbHVlKSAhPSBudWxsID8gX2EgOiBkZWZhdWx0VmFsdWU7XG4gICAgfSxcbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIHNvdXJjZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVzZVRocm90dGxlRm4oZm4sIG1zID0gMjAwLCB0cmFpbGluZyA9IGZhbHNlLCBsZWFkaW5nID0gdHJ1ZSwgcmVqZWN0T25DYW5jZWwgPSBmYWxzZSkge1xuICByZXR1cm4gY3JlYXRlRmlsdGVyV3JhcHBlcihcbiAgICB0aHJvdHRsZUZpbHRlcihtcywgdHJhaWxpbmcsIGxlYWRpbmcsIHJlamVjdE9uQ2FuY2VsKSxcbiAgICBmblxuICApO1xufVxuXG5mdW5jdGlvbiByZWZUaHJvdHRsZWQodmFsdWUsIGRlbGF5ID0gMjAwLCB0cmFpbGluZyA9IHRydWUsIGxlYWRpbmcgPSB0cnVlKSB7XG4gIGlmIChkZWxheSA8PSAwKVxuICAgIHJldHVybiB2YWx1ZTtcbiAgY29uc3QgdGhyb3R0bGVkID0gcmVmKHZhbHVlLnZhbHVlKTtcbiAgY29uc3QgdXBkYXRlciA9IHVzZVRocm90dGxlRm4oKCkgPT4ge1xuICAgIHRocm90dGxlZC52YWx1ZSA9IHZhbHVlLnZhbHVlO1xuICB9LCBkZWxheSwgdHJhaWxpbmcsIGxlYWRpbmcpO1xuICB3YXRjaCh2YWx1ZSwgKCkgPT4gdXBkYXRlcigpKTtcbiAgcmV0dXJuIHRocm90dGxlZDtcbn1cblxuZnVuY3Rpb24gcmVmV2l0aENvbnRyb2woaW5pdGlhbCwgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBzb3VyY2UgPSBpbml0aWFsO1xuICBsZXQgdHJhY2s7XG4gIGxldCB0cmlnZ2VyO1xuICBjb25zdCByZWYgPSBjdXN0b21SZWYoKF90cmFjaywgX3RyaWdnZXIpID0+IHtcbiAgICB0cmFjayA9IF90cmFjaztcbiAgICB0cmlnZ2VyID0gX3RyaWdnZXI7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGdldCgpO1xuICAgICAgfSxcbiAgICAgIHNldCh2KSB7XG4gICAgICAgIHNldCh2KTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbiAgZnVuY3Rpb24gZ2V0KHRyYWNraW5nID0gdHJ1ZSkge1xuICAgIGlmICh0cmFja2luZylcbiAgICAgIHRyYWNrKCk7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuICBmdW5jdGlvbiBzZXQodmFsdWUsIHRyaWdnZXJpbmcgPSB0cnVlKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBpZiAodmFsdWUgPT09IHNvdXJjZSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBvbGQgPSBzb3VyY2U7XG4gICAgaWYgKCgoX2EgPSBvcHRpb25zLm9uQmVmb3JlQ2hhbmdlKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChvcHRpb25zLCB2YWx1ZSwgb2xkKSkgPT09IGZhbHNlKVxuICAgICAgcmV0dXJuO1xuICAgIHNvdXJjZSA9IHZhbHVlO1xuICAgIChfYiA9IG9wdGlvbnMub25DaGFuZ2VkKSA9PSBudWxsID8gdm9pZCAwIDogX2IuY2FsbChvcHRpb25zLCB2YWx1ZSwgb2xkKTtcbiAgICBpZiAodHJpZ2dlcmluZylcbiAgICAgIHRyaWdnZXIoKTtcbiAgfVxuICBjb25zdCB1bnRyYWNrZWRHZXQgPSAoKSA9PiBnZXQoZmFsc2UpO1xuICBjb25zdCBzaWxlbnRTZXQgPSAodikgPT4gc2V0KHYsIGZhbHNlKTtcbiAgY29uc3QgcGVlayA9ICgpID0+IGdldChmYWxzZSk7XG4gIGNvbnN0IGxheSA9ICh2KSA9PiBzZXQodiwgZmFsc2UpO1xuICByZXR1cm4gZXh0ZW5kUmVmKFxuICAgIHJlZixcbiAgICB7XG4gICAgICBnZXQsXG4gICAgICBzZXQsXG4gICAgICB1bnRyYWNrZWRHZXQsXG4gICAgICBzaWxlbnRTZXQsXG4gICAgICBwZWVrLFxuICAgICAgbGF5XG4gICAgfSxcbiAgICB7IGVudW1lcmFibGU6IHRydWUgfVxuICApO1xufVxuY29uc3QgY29udHJvbGxlZFJlZiA9IHJlZldpdGhDb250cm9sO1xuXG5mdW5jdGlvbiBzZXQoLi4uYXJncykge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICBjb25zdCBbcmVmLCB2YWx1ZV0gPSBhcmdzO1xuICAgIHJlZi52YWx1ZSA9IHZhbHVlO1xuICB9XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMykge1xuICAgIGlmIChpc1Z1ZTIpIHtcbiAgICAgIHNldCQxKC4uLmFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbdGFyZ2V0LCBrZXksIHZhbHVlXSA9IGFyZ3M7XG4gICAgICB0YXJnZXRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXRjaFdpdGhGaWx0ZXIoc291cmNlLCBjYiwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBldmVudEZpbHRlciA9IGJ5cGFzc0ZpbHRlcixcbiAgICAuLi53YXRjaE9wdGlvbnNcbiAgfSA9IG9wdGlvbnM7XG4gIHJldHVybiB3YXRjaChcbiAgICBzb3VyY2UsXG4gICAgY3JlYXRlRmlsdGVyV3JhcHBlcihcbiAgICAgIGV2ZW50RmlsdGVyLFxuICAgICAgY2JcbiAgICApLFxuICAgIHdhdGNoT3B0aW9uc1xuICApO1xufVxuXG5mdW5jdGlvbiB3YXRjaFBhdXNhYmxlKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZXZlbnRGaWx0ZXI6IGZpbHRlcixcbiAgICAuLi53YXRjaE9wdGlvbnNcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHsgZXZlbnRGaWx0ZXIsIHBhdXNlLCByZXN1bWUsIGlzQWN0aXZlIH0gPSBwYXVzYWJsZUZpbHRlcihmaWx0ZXIpO1xuICBjb25zdCBzdG9wID0gd2F0Y2hXaXRoRmlsdGVyKFxuICAgIHNvdXJjZSxcbiAgICBjYixcbiAgICB7XG4gICAgICAuLi53YXRjaE9wdGlvbnMsXG4gICAgICBldmVudEZpbHRlclxuICAgIH1cbiAgKTtcbiAgcmV0dXJuIHsgc3RvcCwgcGF1c2UsIHJlc3VtZSwgaXNBY3RpdmUgfTtcbn1cblxuZnVuY3Rpb24gc3luY1JlZihsZWZ0LCByaWdodCwgLi4uW29wdGlvbnNdKSB7XG4gIGNvbnN0IHtcbiAgICBmbHVzaCA9IFwic3luY1wiLFxuICAgIGRlZXAgPSBmYWxzZSxcbiAgICBpbW1lZGlhdGUgPSB0cnVlLFxuICAgIGRpcmVjdGlvbiA9IFwiYm90aFwiLFxuICAgIHRyYW5zZm9ybSA9IHt9XG4gIH0gPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCB3YXRjaGVycyA9IFtdO1xuICBjb25zdCB0cmFuc2Zvcm1MVFIgPSBcImx0clwiIGluIHRyYW5zZm9ybSAmJiB0cmFuc2Zvcm0ubHRyIHx8ICgodikgPT4gdik7XG4gIGNvbnN0IHRyYW5zZm9ybVJUTCA9IFwicnRsXCIgaW4gdHJhbnNmb3JtICYmIHRyYW5zZm9ybS5ydGwgfHwgKCh2KSA9PiB2KTtcbiAgaWYgKGRpcmVjdGlvbiA9PT0gXCJib3RoXCIgfHwgZGlyZWN0aW9uID09PSBcImx0clwiKSB7XG4gICAgd2F0Y2hlcnMucHVzaCh3YXRjaFBhdXNhYmxlKFxuICAgICAgbGVmdCxcbiAgICAgIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICB3YXRjaGVycy5mb3JFYWNoKCh3KSA9PiB3LnBhdXNlKCkpO1xuICAgICAgICByaWdodC52YWx1ZSA9IHRyYW5zZm9ybUxUUihuZXdWYWx1ZSk7XG4gICAgICAgIHdhdGNoZXJzLmZvckVhY2goKHcpID0+IHcucmVzdW1lKCkpO1xuICAgICAgfSxcbiAgICAgIHsgZmx1c2gsIGRlZXAsIGltbWVkaWF0ZSB9XG4gICAgKSk7XG4gIH1cbiAgaWYgKGRpcmVjdGlvbiA9PT0gXCJib3RoXCIgfHwgZGlyZWN0aW9uID09PSBcInJ0bFwiKSB7XG4gICAgd2F0Y2hlcnMucHVzaCh3YXRjaFBhdXNhYmxlKFxuICAgICAgcmlnaHQsXG4gICAgICAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgd2F0Y2hlcnMuZm9yRWFjaCgodykgPT4gdy5wYXVzZSgpKTtcbiAgICAgICAgbGVmdC52YWx1ZSA9IHRyYW5zZm9ybVJUTChuZXdWYWx1ZSk7XG4gICAgICAgIHdhdGNoZXJzLmZvckVhY2goKHcpID0+IHcucmVzdW1lKCkpO1xuICAgICAgfSxcbiAgICAgIHsgZmx1c2gsIGRlZXAsIGltbWVkaWF0ZSB9XG4gICAgKSk7XG4gIH1cbiAgY29uc3Qgc3RvcCA9ICgpID0+IHtcbiAgICB3YXRjaGVycy5mb3JFYWNoKCh3KSA9PiB3LnN0b3AoKSk7XG4gIH07XG4gIHJldHVybiBzdG9wO1xufVxuXG5mdW5jdGlvbiBzeW5jUmVmcyhzb3VyY2UsIHRhcmdldHMsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZmx1c2ggPSBcInN5bmNcIixcbiAgICBkZWVwID0gZmFsc2UsXG4gICAgaW1tZWRpYXRlID0gdHJ1ZVxuICB9ID0gb3B0aW9ucztcbiAgaWYgKCFBcnJheS5pc0FycmF5KHRhcmdldHMpKVxuICAgIHRhcmdldHMgPSBbdGFyZ2V0c107XG4gIHJldHVybiB3YXRjaChcbiAgICBzb3VyY2UsXG4gICAgKG5ld1ZhbHVlKSA9PiB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT4gdGFyZ2V0LnZhbHVlID0gbmV3VmFsdWUpLFxuICAgIHsgZmx1c2gsIGRlZXAsIGltbWVkaWF0ZSB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIHRvUmVmcyhvYmplY3RSZWYsIG9wdGlvbnMgPSB7fSkge1xuICBpZiAoIWlzUmVmKG9iamVjdFJlZikpXG4gICAgcmV0dXJuIHRvUmVmcyQxKG9iamVjdFJlZik7XG4gIGNvbnN0IHJlc3VsdCA9IEFycmF5LmlzQXJyYXkob2JqZWN0UmVmLnZhbHVlKSA/IEFycmF5LmZyb20oeyBsZW5ndGg6IG9iamVjdFJlZi52YWx1ZS5sZW5ndGggfSkgOiB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0UmVmLnZhbHVlKSB7XG4gICAgcmVzdWx0W2tleV0gPSBjdXN0b21SZWYoKCkgPT4gKHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdFJlZi52YWx1ZVtrZXldO1xuICAgICAgfSxcbiAgICAgIHNldCh2KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgcmVwbGFjZVJlZiA9IChfYSA9IHRvVmFsdWUob3B0aW9ucy5yZXBsYWNlUmVmKSkgIT0gbnVsbCA/IF9hIDogdHJ1ZTtcbiAgICAgICAgaWYgKHJlcGxhY2VSZWYpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3RSZWYudmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCBjb3B5ID0gWy4uLm9iamVjdFJlZi52YWx1ZV07XG4gICAgICAgICAgICBjb3B5W2tleV0gPSB2O1xuICAgICAgICAgICAgb2JqZWN0UmVmLnZhbHVlID0gY29weTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV3T2JqZWN0ID0geyAuLi5vYmplY3RSZWYudmFsdWUsIFtrZXldOiB2IH07XG4gICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YobmV3T2JqZWN0LCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0UmVmLnZhbHVlKSk7XG4gICAgICAgICAgICBvYmplY3RSZWYudmFsdWUgPSBuZXdPYmplY3Q7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9iamVjdFJlZi52YWx1ZVtrZXldID0gdjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiB0cnlPbkJlZm9yZU1vdW50KGZuLCBzeW5jID0gdHJ1ZSwgdGFyZ2V0KSB7XG4gIGNvbnN0IGluc3RhbmNlID0gZ2V0TGlmZUN5Y2xlVGFyZ2V0KHRhcmdldCk7XG4gIGlmIChpbnN0YW5jZSlcbiAgICBvbkJlZm9yZU1vdW50KGZuLCB0YXJnZXQpO1xuICBlbHNlIGlmIChzeW5jKVxuICAgIGZuKCk7XG4gIGVsc2VcbiAgICBuZXh0VGljayhmbik7XG59XG5cbmZ1bmN0aW9uIHRyeU9uQmVmb3JlVW5tb3VudChmbiwgdGFyZ2V0KSB7XG4gIGNvbnN0IGluc3RhbmNlID0gZ2V0TGlmZUN5Y2xlVGFyZ2V0KHRhcmdldCk7XG4gIGlmIChpbnN0YW5jZSlcbiAgICBvbkJlZm9yZVVubW91bnQoZm4sIHRhcmdldCk7XG59XG5cbmZ1bmN0aW9uIHRyeU9uTW91bnRlZChmbiwgc3luYyA9IHRydWUsIHRhcmdldCkge1xuICBjb25zdCBpbnN0YW5jZSA9IGdldExpZmVDeWNsZVRhcmdldCgpO1xuICBpZiAoaW5zdGFuY2UpXG4gICAgb25Nb3VudGVkKGZuLCB0YXJnZXQpO1xuICBlbHNlIGlmIChzeW5jKVxuICAgIGZuKCk7XG4gIGVsc2VcbiAgICBuZXh0VGljayhmbik7XG59XG5cbmZ1bmN0aW9uIHRyeU9uVW5tb3VudGVkKGZuLCB0YXJnZXQpIHtcbiAgY29uc3QgaW5zdGFuY2UgPSBnZXRMaWZlQ3ljbGVUYXJnZXQodGFyZ2V0KTtcbiAgaWYgKGluc3RhbmNlKVxuICAgIG9uVW5tb3VudGVkKGZuLCB0YXJnZXQpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVVbnRpbChyLCBpc05vdCA9IGZhbHNlKSB7XG4gIGZ1bmN0aW9uIHRvTWF0Y2goY29uZGl0aW9uLCB7IGZsdXNoID0gXCJzeW5jXCIsIGRlZXAgPSBmYWxzZSwgdGltZW91dCwgdGhyb3dPblRpbWVvdXQgfSA9IHt9KSB7XG4gICAgbGV0IHN0b3AgPSBudWxsO1xuICAgIGNvbnN0IHdhdGNoZXIgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgc3RvcCA9IHdhdGNoKFxuICAgICAgICByLFxuICAgICAgICAodikgPT4ge1xuICAgICAgICAgIGlmIChjb25kaXRpb24odikgIT09IGlzTm90KSB7XG4gICAgICAgICAgICBzdG9wID09IG51bGwgPyB2b2lkIDAgOiBzdG9wKCk7XG4gICAgICAgICAgICByZXNvbHZlKHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZsdXNoLFxuICAgICAgICAgIGRlZXAsXG4gICAgICAgICAgaW1tZWRpYXRlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbd2F0Y2hlcl07XG4gICAgaWYgKHRpbWVvdXQgIT0gbnVsbCkge1xuICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgcHJvbWlzZVRpbWVvdXQodGltZW91dCwgdGhyb3dPblRpbWVvdXQpLnRoZW4oKCkgPT4gdG9WYWx1ZShyKSkuZmluYWxseSgoKSA9PiBzdG9wID09IG51bGwgPyB2b2lkIDAgOiBzdG9wKCkpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yYWNlKHByb21pc2VzKTtcbiAgfVxuICBmdW5jdGlvbiB0b0JlKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFpc1JlZih2YWx1ZSkpXG4gICAgICByZXR1cm4gdG9NYXRjaCgodikgPT4gdiA9PT0gdmFsdWUsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHsgZmx1c2ggPSBcInN5bmNcIiwgZGVlcCA9IGZhbHNlLCB0aW1lb3V0LCB0aHJvd09uVGltZW91dCB9ID0gb3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucyA6IHt9O1xuICAgIGxldCBzdG9wID0gbnVsbDtcbiAgICBjb25zdCB3YXRjaGVyID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHN0b3AgPSB3YXRjaChcbiAgICAgICAgW3IsIHZhbHVlXSxcbiAgICAgICAgKFt2MSwgdjJdKSA9PiB7XG4gICAgICAgICAgaWYgKGlzTm90ICE9PSAodjEgPT09IHYyKSkge1xuICAgICAgICAgICAgc3RvcCA9PSBudWxsID8gdm9pZCAwIDogc3RvcCgpO1xuICAgICAgICAgICAgcmVzb2x2ZSh2MSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZmx1c2gsXG4gICAgICAgICAgZGVlcCxcbiAgICAgICAgICBpbW1lZGlhdGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBjb25zdCBwcm9taXNlcyA9IFt3YXRjaGVyXTtcbiAgICBpZiAodGltZW91dCAhPSBudWxsKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICBwcm9taXNlVGltZW91dCh0aW1lb3V0LCB0aHJvd09uVGltZW91dCkudGhlbigoKSA9PiB0b1ZhbHVlKHIpKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICBzdG9wID09IG51bGwgPyB2b2lkIDAgOiBzdG9wKCk7XG4gICAgICAgICAgcmV0dXJuIHRvVmFsdWUocik7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yYWNlKHByb21pc2VzKTtcbiAgfVxuICBmdW5jdGlvbiB0b0JlVHJ1dGh5KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdG9NYXRjaCgodikgPT4gQm9vbGVhbih2KSwgb3B0aW9ucyk7XG4gIH1cbiAgZnVuY3Rpb24gdG9CZU51bGwob3B0aW9ucykge1xuICAgIHJldHVybiB0b0JlKG51bGwsIG9wdGlvbnMpO1xuICB9XG4gIGZ1bmN0aW9uIHRvQmVVbmRlZmluZWQob3B0aW9ucykge1xuICAgIHJldHVybiB0b0JlKHZvaWQgMCwgb3B0aW9ucyk7XG4gIH1cbiAgZnVuY3Rpb24gdG9CZU5hTihvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRvTWF0Y2goTnVtYmVyLmlzTmFOLCBvcHRpb25zKTtcbiAgfVxuICBmdW5jdGlvbiB0b0NvbnRhaW5zKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRvTWF0Y2goKHYpID0+IHtcbiAgICAgIGNvbnN0IGFycmF5ID0gQXJyYXkuZnJvbSh2KTtcbiAgICAgIHJldHVybiBhcnJheS5pbmNsdWRlcyh2YWx1ZSkgfHwgYXJyYXkuaW5jbHVkZXModG9WYWx1ZSh2YWx1ZSkpO1xuICAgIH0sIG9wdGlvbnMpO1xuICB9XG4gIGZ1bmN0aW9uIGNoYW5nZWQob3B0aW9ucykge1xuICAgIHJldHVybiBjaGFuZ2VkVGltZXMoMSwgb3B0aW9ucyk7XG4gIH1cbiAgZnVuY3Rpb24gY2hhbmdlZFRpbWVzKG4gPSAxLCBvcHRpb25zKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgcmV0dXJuIHRvTWF0Y2goKCkgPT4ge1xuICAgICAgY291bnQgKz0gMTtcbiAgICAgIHJldHVybiBjb3VudCA+PSBuO1xuICAgIH0sIG9wdGlvbnMpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHRvVmFsdWUocikpKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB7XG4gICAgICB0b01hdGNoLFxuICAgICAgdG9Db250YWlucyxcbiAgICAgIGNoYW5nZWQsXG4gICAgICBjaGFuZ2VkVGltZXMsXG4gICAgICBnZXQgbm90KCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlVW50aWwociwgIWlzTm90KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IHtcbiAgICAgIHRvTWF0Y2gsXG4gICAgICB0b0JlLFxuICAgICAgdG9CZVRydXRoeSxcbiAgICAgIHRvQmVOdWxsLFxuICAgICAgdG9CZU5hTixcbiAgICAgIHRvQmVVbmRlZmluZWQsXG4gICAgICBjaGFuZ2VkLFxuICAgICAgY2hhbmdlZFRpbWVzLFxuICAgICAgZ2V0IG5vdCgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVVudGlsKHIsICFpc05vdCk7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHVudGlsKHIpIHtcbiAgcmV0dXJuIGNyZWF0ZVVudGlsKHIpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcih2YWx1ZSwgb3RoVmFsKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoVmFsO1xufVxuZnVuY3Rpb24gdXNlQXJyYXlEaWZmZXJlbmNlKC4uLmFyZ3MpIHtcbiAgdmFyIF9hO1xuICBjb25zdCBsaXN0ID0gYXJnc1swXTtcbiAgY29uc3QgdmFsdWVzID0gYXJnc1sxXTtcbiAgbGV0IGNvbXBhcmVGbiA9IChfYSA9IGFyZ3NbMl0pICE9IG51bGwgPyBfYSA6IGRlZmF1bHRDb21wYXJhdG9yO1xuICBpZiAodHlwZW9mIGNvbXBhcmVGbiA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGtleSA9IGNvbXBhcmVGbjtcbiAgICBjb21wYXJlRm4gPSAodmFsdWUsIG90aFZhbCkgPT4gdmFsdWVba2V5XSA9PT0gb3RoVmFsW2tleV07XG4gIH1cbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHRvVmFsdWUobGlzdCkuZmlsdGVyKCh4KSA9PiB0b1ZhbHVlKHZhbHVlcykuZmluZEluZGV4KCh5KSA9PiBjb21wYXJlRm4oeCwgeSkpID09PSAtMSkpO1xufVxuXG5mdW5jdGlvbiB1c2VBcnJheUV2ZXJ5KGxpc3QsIGZuKSB7XG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLmV2ZXJ5KChlbGVtZW50LCBpbmRleCwgYXJyYXkpID0+IGZuKHRvVmFsdWUoZWxlbWVudCksIGluZGV4LCBhcnJheSkpKTtcbn1cblxuZnVuY3Rpb24gdXNlQXJyYXlGaWx0ZXIobGlzdCwgZm4pIHtcbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHRvVmFsdWUobGlzdCkubWFwKChpKSA9PiB0b1ZhbHVlKGkpKS5maWx0ZXIoZm4pKTtcbn1cblxuZnVuY3Rpb24gdXNlQXJyYXlGaW5kKGxpc3QsIGZuKSB7XG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKFxuICAgIHRvVmFsdWUobGlzdCkuZmluZCgoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBmbih0b1ZhbHVlKGVsZW1lbnQpLCBpbmRleCwgYXJyYXkpKVxuICApKTtcbn1cblxuZnVuY3Rpb24gdXNlQXJyYXlGaW5kSW5kZXgobGlzdCwgZm4pIHtcbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHRvVmFsdWUobGlzdCkuZmluZEluZGV4KChlbGVtZW50LCBpbmRleCwgYXJyYXkpID0+IGZuKHRvVmFsdWUoZWxlbWVudCksIGluZGV4LCBhcnJheSkpKTtcbn1cblxuZnVuY3Rpb24gZmluZExhc3QoYXJyLCBjYikge1xuICBsZXQgaW5kZXggPSBhcnIubGVuZ3RoO1xuICB3aGlsZSAoaW5kZXgtLSA+IDApIHtcbiAgICBpZiAoY2IoYXJyW2luZGV4XSwgaW5kZXgsIGFycikpXG4gICAgICByZXR1cm4gYXJyW2luZGV4XTtcbiAgfVxuICByZXR1cm4gdm9pZCAwO1xufVxuZnVuY3Rpb24gdXNlQXJyYXlGaW5kTGFzdChsaXN0LCBmbikge1xuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZShcbiAgICAhQXJyYXkucHJvdG90eXBlLmZpbmRMYXN0ID8gZmluZExhc3QodG9WYWx1ZShsaXN0KSwgKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgPT4gZm4odG9WYWx1ZShlbGVtZW50KSwgaW5kZXgsIGFycmF5KSkgOiB0b1ZhbHVlKGxpc3QpLmZpbmRMYXN0KChlbGVtZW50LCBpbmRleCwgYXJyYXkpID0+IGZuKHRvVmFsdWUoZWxlbWVudCksIGluZGV4LCBhcnJheSkpXG4gICkpO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5SW5jbHVkZXNPcHRpb25zKG9iaikge1xuICByZXR1cm4gaXNPYmplY3Qob2JqKSAmJiBjb250YWluc1Byb3Aob2JqLCBcImZvcm1JbmRleFwiLCBcImNvbXBhcmF0b3JcIik7XG59XG5mdW5jdGlvbiB1c2VBcnJheUluY2x1ZGVzKC4uLmFyZ3MpIHtcbiAgdmFyIF9hO1xuICBjb25zdCBsaXN0ID0gYXJnc1swXTtcbiAgY29uc3QgdmFsdWUgPSBhcmdzWzFdO1xuICBsZXQgY29tcGFyYXRvciA9IGFyZ3NbMl07XG4gIGxldCBmb3JtSW5kZXggPSAwO1xuICBpZiAoaXNBcnJheUluY2x1ZGVzT3B0aW9ucyhjb21wYXJhdG9yKSkge1xuICAgIGZvcm1JbmRleCA9IChfYSA9IGNvbXBhcmF0b3IuZnJvbUluZGV4KSAhPSBudWxsID8gX2EgOiAwO1xuICAgIGNvbXBhcmF0b3IgPSBjb21wYXJhdG9yLmNvbXBhcmF0b3I7XG4gIH1cbiAgaWYgKHR5cGVvZiBjb21wYXJhdG9yID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3Qga2V5ID0gY29tcGFyYXRvcjtcbiAgICBjb21wYXJhdG9yID0gKGVsZW1lbnQsIHZhbHVlMikgPT4gZWxlbWVudFtrZXldID09PSB0b1ZhbHVlKHZhbHVlMik7XG4gIH1cbiAgY29tcGFyYXRvciA9IGNvbXBhcmF0b3IgIT0gbnVsbCA/IGNvbXBhcmF0b3IgOiAoZWxlbWVudCwgdmFsdWUyKSA9PiBlbGVtZW50ID09PSB0b1ZhbHVlKHZhbHVlMik7XG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLnNsaWNlKGZvcm1JbmRleCkuc29tZSgoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBjb21wYXJhdG9yKFxuICAgIHRvVmFsdWUoZWxlbWVudCksXG4gICAgdG9WYWx1ZSh2YWx1ZSksXG4gICAgaW5kZXgsXG4gICAgdG9WYWx1ZShhcnJheSlcbiAgKSkpO1xufVxuXG5mdW5jdGlvbiB1c2VBcnJheUpvaW4obGlzdCwgc2VwYXJhdG9yKSB7XG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLm1hcCgoaSkgPT4gdG9WYWx1ZShpKSkuam9pbih0b1ZhbHVlKHNlcGFyYXRvcikpKTtcbn1cblxuZnVuY3Rpb24gdXNlQXJyYXlNYXAobGlzdCwgZm4pIHtcbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHRvVmFsdWUobGlzdCkubWFwKChpKSA9PiB0b1ZhbHVlKGkpKS5tYXAoZm4pKTtcbn1cblxuZnVuY3Rpb24gdXNlQXJyYXlSZWR1Y2UobGlzdCwgcmVkdWNlciwgLi4uYXJncykge1xuICBjb25zdCByZWR1Y2VDYWxsYmFjayA9IChzdW0sIHZhbHVlLCBpbmRleCkgPT4gcmVkdWNlcih0b1ZhbHVlKHN1bSksIHRvVmFsdWUodmFsdWUpLCBpbmRleCk7XG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSB0b1ZhbHVlKGxpc3QpO1xuICAgIHJldHVybiBhcmdzLmxlbmd0aCA/IHJlc29sdmVkLnJlZHVjZShyZWR1Y2VDYWxsYmFjaywgdG9WYWx1ZShhcmdzWzBdKSkgOiByZXNvbHZlZC5yZWR1Y2UocmVkdWNlQ2FsbGJhY2spO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdXNlQXJyYXlTb21lKGxpc3QsIGZuKSB7XG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLnNvbWUoKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgPT4gZm4odG9WYWx1ZShlbGVtZW50KSwgaW5kZXgsIGFycmF5KSkpO1xufVxuXG5mdW5jdGlvbiB1bmlxKGFycmF5KSB7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYXJyYXkpKTtcbn1cbmZ1bmN0aW9uIHVuaXF1ZUVsZW1lbnRzQnkoYXJyYXksIGZuKSB7XG4gIHJldHVybiBhcnJheS5yZWR1Y2UoKGFjYywgdikgPT4ge1xuICAgIGlmICghYWNjLnNvbWUoKHgpID0+IGZuKHYsIHgsIGFycmF5KSkpXG4gICAgICBhY2MucHVzaCh2KTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSk7XG59XG5mdW5jdGlvbiB1c2VBcnJheVVuaXF1ZShsaXN0LCBjb21wYXJlRm4pIHtcbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCByZXNvbHZlZExpc3QgPSB0b1ZhbHVlKGxpc3QpLm1hcCgoZWxlbWVudCkgPT4gdG9WYWx1ZShlbGVtZW50KSk7XG4gICAgcmV0dXJuIGNvbXBhcmVGbiA/IHVuaXF1ZUVsZW1lbnRzQnkocmVzb2x2ZWRMaXN0LCBjb21wYXJlRm4pIDogdW5pcShyZXNvbHZlZExpc3QpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdXNlQ291bnRlcihpbml0aWFsVmFsdWUgPSAwLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IF9pbml0aWFsVmFsdWUgPSB1bnJlZihpbml0aWFsVmFsdWUpO1xuICBjb25zdCBjb3VudCA9IHJlZihpbml0aWFsVmFsdWUpO1xuICBjb25zdCB7XG4gICAgbWF4ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgIG1pbiA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgaW5jID0gKGRlbHRhID0gMSkgPT4gY291bnQudmFsdWUgPSBNYXRoLm1heChNYXRoLm1pbihtYXgsIGNvdW50LnZhbHVlICsgZGVsdGEpLCBtaW4pO1xuICBjb25zdCBkZWMgPSAoZGVsdGEgPSAxKSA9PiBjb3VudC52YWx1ZSA9IE1hdGgubWluKE1hdGgubWF4KG1pbiwgY291bnQudmFsdWUgLSBkZWx0YSksIG1heCk7XG4gIGNvbnN0IGdldCA9ICgpID0+IGNvdW50LnZhbHVlO1xuICBjb25zdCBzZXQgPSAodmFsKSA9PiBjb3VudC52YWx1ZSA9IE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWwpKTtcbiAgY29uc3QgcmVzZXQgPSAodmFsID0gX2luaXRpYWxWYWx1ZSkgPT4ge1xuICAgIF9pbml0aWFsVmFsdWUgPSB2YWw7XG4gICAgcmV0dXJuIHNldCh2YWwpO1xuICB9O1xuICByZXR1cm4geyBjb3VudCwgaW5jLCBkZWMsIGdldCwgc2V0LCByZXNldCB9O1xufVxuXG5jb25zdCBSRUdFWF9QQVJTRSA9IC9eKFxcZHs0fSlbLS9dPyhcXGR7MSwyfSk/Wy0vXT8oXFxkezAsMn0pW1R0XFxzXSooXFxkezEsMn0pPzo/KFxcZHsxLDJ9KT86PyhcXGR7MSwyfSk/Wy46XT8oXFxkKyk/JC87XG5jb25zdCBSRUdFWF9GT1JNQVQgPSAvW1lNREhobXNdb3xcXFsoW15cXF1dKyldfFl7MSw0fXxNezEsNH18RHsxLDJ9fGR7MSw0fXxIezEsMn18aHsxLDJ9fGF7MSwyfXxBezEsMn18bXsxLDJ9fHN7MSwyfXxaezEsMn18U1NTL2c7XG5mdW5jdGlvbiBkZWZhdWx0TWVyaWRpZW0oaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXJjYXNlLCBoYXNQZXJpb2QpIHtcbiAgbGV0IG0gPSBob3VycyA8IDEyID8gXCJBTVwiIDogXCJQTVwiO1xuICBpZiAoaGFzUGVyaW9kKVxuICAgIG0gPSBtLnNwbGl0KFwiXCIpLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiBhY2MgKz0gYCR7Y3Vycn0uYCwgXCJcIik7XG4gIHJldHVybiBpc0xvd2VyY2FzZSA/IG0udG9Mb3dlckNhc2UoKSA6IG07XG59XG5mdW5jdGlvbiBmb3JtYXRPcmRpbmFsKG51bSkge1xuICBjb25zdCBzdWZmaXhlcyA9IFtcInRoXCIsIFwic3RcIiwgXCJuZFwiLCBcInJkXCJdO1xuICBjb25zdCB2ID0gbnVtICUgMTAwO1xuICByZXR1cm4gbnVtICsgKHN1ZmZpeGVzWyh2IC0gMjApICUgMTBdIHx8IHN1ZmZpeGVzW3ZdIHx8IHN1ZmZpeGVzWzBdKTtcbn1cbmZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZSwgZm9ybWF0U3RyLCBvcHRpb25zID0ge30pIHtcbiAgdmFyIF9hO1xuICBjb25zdCB5ZWFycyA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gIGNvbnN0IGRheXMgPSBkYXRlLmdldERhdGUoKTtcbiAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKTtcbiAgY29uc3Qgc2Vjb25kcyA9IGRhdGUuZ2V0U2Vjb25kcygpO1xuICBjb25zdCBtaWxsaXNlY29uZHMgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xuICBjb25zdCBkYXkgPSBkYXRlLmdldERheSgpO1xuICBjb25zdCBtZXJpZGllbSA9IChfYSA9IG9wdGlvbnMuY3VzdG9tTWVyaWRpZW0pICE9IG51bGwgPyBfYSA6IGRlZmF1bHRNZXJpZGllbTtcbiAgY29uc3QgbWF0Y2hlcyA9IHtcbiAgICBZbzogKCkgPT4gZm9ybWF0T3JkaW5hbCh5ZWFycyksXG4gICAgWVk6ICgpID0+IFN0cmluZyh5ZWFycykuc2xpY2UoLTIpLFxuICAgIFlZWVk6ICgpID0+IHllYXJzLFxuICAgIE06ICgpID0+IG1vbnRoICsgMSxcbiAgICBNbzogKCkgPT4gZm9ybWF0T3JkaW5hbChtb250aCArIDEpLFxuICAgIE1NOiAoKSA9PiBgJHttb250aCArIDF9YC5wYWRTdGFydCgyLCBcIjBcIiksXG4gICAgTU1NOiAoKSA9PiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyhvcHRpb25zLmxvY2FsZXMsIHsgbW9udGg6IFwic2hvcnRcIiB9KSxcbiAgICBNTU1NOiAoKSA9PiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyhvcHRpb25zLmxvY2FsZXMsIHsgbW9udGg6IFwibG9uZ1wiIH0pLFxuICAgIEQ6ICgpID0+IFN0cmluZyhkYXlzKSxcbiAgICBEbzogKCkgPT4gZm9ybWF0T3JkaW5hbChkYXlzKSxcbiAgICBERDogKCkgPT4gYCR7ZGF5c31gLnBhZFN0YXJ0KDIsIFwiMFwiKSxcbiAgICBIOiAoKSA9PiBTdHJpbmcoaG91cnMpLFxuICAgIEhvOiAoKSA9PiBmb3JtYXRPcmRpbmFsKGhvdXJzKSxcbiAgICBISDogKCkgPT4gYCR7aG91cnN9YC5wYWRTdGFydCgyLCBcIjBcIiksXG4gICAgaDogKCkgPT4gYCR7aG91cnMgJSAxMiB8fCAxMn1gLnBhZFN0YXJ0KDEsIFwiMFwiKSxcbiAgICBobzogKCkgPT4gZm9ybWF0T3JkaW5hbChob3VycyAlIDEyIHx8IDEyKSxcbiAgICBoaDogKCkgPT4gYCR7aG91cnMgJSAxMiB8fCAxMn1gLnBhZFN0YXJ0KDIsIFwiMFwiKSxcbiAgICBtOiAoKSA9PiBTdHJpbmcobWludXRlcyksXG4gICAgbW86ICgpID0+IGZvcm1hdE9yZGluYWwobWludXRlcyksXG4gICAgbW06ICgpID0+IGAke21pbnV0ZXN9YC5wYWRTdGFydCgyLCBcIjBcIiksXG4gICAgczogKCkgPT4gU3RyaW5nKHNlY29uZHMpLFxuICAgIHNvOiAoKSA9PiBmb3JtYXRPcmRpbmFsKHNlY29uZHMpLFxuICAgIHNzOiAoKSA9PiBgJHtzZWNvbmRzfWAucGFkU3RhcnQoMiwgXCIwXCIpLFxuICAgIFNTUzogKCkgPT4gYCR7bWlsbGlzZWNvbmRzfWAucGFkU3RhcnQoMywgXCIwXCIpLFxuICAgIGQ6ICgpID0+IGRheSxcbiAgICBkZDogKCkgPT4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcob3B0aW9ucy5sb2NhbGVzLCB7IHdlZWtkYXk6IFwibmFycm93XCIgfSksXG4gICAgZGRkOiAoKSA9PiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyhvcHRpb25zLmxvY2FsZXMsIHsgd2Vla2RheTogXCJzaG9ydFwiIH0pLFxuICAgIGRkZGQ6ICgpID0+IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKG9wdGlvbnMubG9jYWxlcywgeyB3ZWVrZGF5OiBcImxvbmdcIiB9KSxcbiAgICBBOiAoKSA9PiBtZXJpZGllbShob3VycywgbWludXRlcyksXG4gICAgQUE6ICgpID0+IG1lcmlkaWVtKGhvdXJzLCBtaW51dGVzLCBmYWxzZSwgdHJ1ZSksXG4gICAgYTogKCkgPT4gbWVyaWRpZW0oaG91cnMsIG1pbnV0ZXMsIHRydWUpLFxuICAgIGFhOiAoKSA9PiBtZXJpZGllbShob3VycywgbWludXRlcywgdHJ1ZSwgdHJ1ZSlcbiAgfTtcbiAgcmV0dXJuIGZvcm1hdFN0ci5yZXBsYWNlKFJFR0VYX0ZPUk1BVCwgKG1hdGNoLCAkMSkgPT4ge1xuICAgIHZhciBfYTIsIF9iO1xuICAgIHJldHVybiAoX2IgPSAkMSAhPSBudWxsID8gJDEgOiAoX2EyID0gbWF0Y2hlc1ttYXRjaF0pID09IG51bGwgPyB2b2lkIDAgOiBfYTIuY2FsbChtYXRjaGVzKSkgIT0gbnVsbCA/IF9iIDogbWF0Y2g7XG4gIH0pO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplRGF0ZShkYXRlKSB7XG4gIGlmIChkYXRlID09PSBudWxsKVxuICAgIHJldHVybiBuZXcgRGF0ZShOdW1iZXIuTmFOKTtcbiAgaWYgKGRhdGUgPT09IHZvaWQgMClcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7XG4gIGlmIChkYXRlIGluc3RhbmNlb2YgRGF0ZSlcbiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZSk7XG4gIGlmICh0eXBlb2YgZGF0ZSA9PT0gXCJzdHJpbmdcIiAmJiAhL1okL2kudGVzdChkYXRlKSkge1xuICAgIGNvbnN0IGQgPSBkYXRlLm1hdGNoKFJFR0VYX1BBUlNFKTtcbiAgICBpZiAoZCkge1xuICAgICAgY29uc3QgbSA9IGRbMl0gLSAxIHx8IDA7XG4gICAgICBjb25zdCBtcyA9IChkWzddIHx8IFwiMFwiKS5zdWJzdHJpbmcoMCwgMyk7XG4gICAgICByZXR1cm4gbmV3IERhdGUoZFsxXSwgbSwgZFszXSB8fCAxLCBkWzRdIHx8IDAsIGRbNV0gfHwgMCwgZFs2XSB8fCAwLCBtcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgRGF0ZShkYXRlKTtcbn1cbmZ1bmN0aW9uIHVzZURhdGVGb3JtYXQoZGF0ZSwgZm9ybWF0U3RyID0gXCJISDptbTpzc1wiLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IGZvcm1hdERhdGUobm9ybWFsaXplRGF0ZSh0b1ZhbHVlKGRhdGUpKSwgdG9WYWx1ZShmb3JtYXRTdHIpLCBvcHRpb25zKSk7XG59XG5cbmZ1bmN0aW9uIHVzZUludGVydmFsRm4oY2IsIGludGVydmFsID0gMWUzLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGltbWVkaWF0ZSA9IHRydWUsXG4gICAgaW1tZWRpYXRlQ2FsbGJhY2sgPSBmYWxzZVxuICB9ID0gb3B0aW9ucztcbiAgbGV0IHRpbWVyID0gbnVsbDtcbiAgY29uc3QgaXNBY3RpdmUgPSByZWYoZmFsc2UpO1xuICBmdW5jdGlvbiBjbGVhbigpIHtcbiAgICBpZiAodGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpO1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICBpc0FjdGl2ZS52YWx1ZSA9IGZhbHNlO1xuICAgIGNsZWFuKCk7XG4gIH1cbiAgZnVuY3Rpb24gcmVzdW1lKCkge1xuICAgIGNvbnN0IGludGVydmFsVmFsdWUgPSB0b1ZhbHVlKGludGVydmFsKTtcbiAgICBpZiAoaW50ZXJ2YWxWYWx1ZSA8PSAwKVxuICAgICAgcmV0dXJuO1xuICAgIGlzQWN0aXZlLnZhbHVlID0gdHJ1ZTtcbiAgICBpZiAoaW1tZWRpYXRlQ2FsbGJhY2spXG4gICAgICBjYigpO1xuICAgIGNsZWFuKCk7XG4gICAgdGltZXIgPSBzZXRJbnRlcnZhbChjYiwgaW50ZXJ2YWxWYWx1ZSk7XG4gIH1cbiAgaWYgKGltbWVkaWF0ZSAmJiBpc0NsaWVudClcbiAgICByZXN1bWUoKTtcbiAgaWYgKGlzUmVmKGludGVydmFsKSB8fCB0eXBlb2YgaW50ZXJ2YWwgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IHN0b3BXYXRjaCA9IHdhdGNoKGludGVydmFsLCAoKSA9PiB7XG4gICAgICBpZiAoaXNBY3RpdmUudmFsdWUgJiYgaXNDbGllbnQpXG4gICAgICAgIHJlc3VtZSgpO1xuICAgIH0pO1xuICAgIHRyeU9uU2NvcGVEaXNwb3NlKHN0b3BXYXRjaCk7XG4gIH1cbiAgdHJ5T25TY29wZURpc3Bvc2UocGF1c2UpO1xuICByZXR1cm4ge1xuICAgIGlzQWN0aXZlLFxuICAgIHBhdXNlLFxuICAgIHJlc3VtZVxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VJbnRlcnZhbChpbnRlcnZhbCA9IDFlMywgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBjb250cm9sczogZXhwb3NlQ29udHJvbHMgPSBmYWxzZSxcbiAgICBpbW1lZGlhdGUgPSB0cnVlLFxuICAgIGNhbGxiYWNrXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBjb3VudGVyID0gcmVmKDApO1xuICBjb25zdCB1cGRhdGUgPSAoKSA9PiBjb3VudGVyLnZhbHVlICs9IDE7XG4gIGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuICAgIGNvdW50ZXIudmFsdWUgPSAwO1xuICB9O1xuICBjb25zdCBjb250cm9scyA9IHVzZUludGVydmFsRm4oXG4gICAgY2FsbGJhY2sgPyAoKSA9PiB7XG4gICAgICB1cGRhdGUoKTtcbiAgICAgIGNhbGxiYWNrKGNvdW50ZXIudmFsdWUpO1xuICAgIH0gOiB1cGRhdGUsXG4gICAgaW50ZXJ2YWwsXG4gICAgeyBpbW1lZGlhdGUgfVxuICApO1xuICBpZiAoZXhwb3NlQ29udHJvbHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY291bnRlcixcbiAgICAgIHJlc2V0LFxuICAgICAgLi4uY29udHJvbHNcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVzZUxhc3RDaGFuZ2VkKHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gIHZhciBfYTtcbiAgY29uc3QgbXMgPSByZWYoKF9hID0gb3B0aW9ucy5pbml0aWFsVmFsdWUpICE9IG51bGwgPyBfYSA6IG51bGwpO1xuICB3YXRjaChcbiAgICBzb3VyY2UsXG4gICAgKCkgPT4gbXMudmFsdWUgPSB0aW1lc3RhbXAoKSxcbiAgICBvcHRpb25zXG4gICk7XG4gIHJldHVybiBtcztcbn1cblxuZnVuY3Rpb24gdXNlVGltZW91dEZuKGNiLCBpbnRlcnZhbCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBpbW1lZGlhdGUgPSB0cnVlXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBpc1BlbmRpbmcgPSByZWYoZmFsc2UpO1xuICBsZXQgdGltZXIgPSBudWxsO1xuICBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICBpZiAodGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aW1lciA9IG51bGw7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgaXNQZW5kaW5nLnZhbHVlID0gZmFsc2U7XG4gICAgY2xlYXIoKTtcbiAgfVxuICBmdW5jdGlvbiBzdGFydCguLi5hcmdzKSB7XG4gICAgY2xlYXIoKTtcbiAgICBpc1BlbmRpbmcudmFsdWUgPSB0cnVlO1xuICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpc1BlbmRpbmcudmFsdWUgPSBmYWxzZTtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgIGNiKC4uLmFyZ3MpO1xuICAgIH0sIHRvVmFsdWUoaW50ZXJ2YWwpKTtcbiAgfVxuICBpZiAoaW1tZWRpYXRlKSB7XG4gICAgaXNQZW5kaW5nLnZhbHVlID0gdHJ1ZTtcbiAgICBpZiAoaXNDbGllbnQpXG4gICAgICBzdGFydCgpO1xuICB9XG4gIHRyeU9uU2NvcGVEaXNwb3NlKHN0b3ApO1xuICByZXR1cm4ge1xuICAgIGlzUGVuZGluZzogcmVhZG9ubHkoaXNQZW5kaW5nKSxcbiAgICBzdGFydCxcbiAgICBzdG9wXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZVRpbWVvdXQoaW50ZXJ2YWwgPSAxZTMsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsXG4gICAgY2FsbGJhY2tcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNvbnRyb2xzID0gdXNlVGltZW91dEZuKFxuICAgIGNhbGxiYWNrICE9IG51bGwgPyBjYWxsYmFjayA6IG5vb3AsXG4gICAgaW50ZXJ2YWwsXG4gICAgb3B0aW9uc1xuICApO1xuICBjb25zdCByZWFkeSA9IGNvbXB1dGVkKCgpID0+ICFjb250cm9scy5pc1BlbmRpbmcudmFsdWUpO1xuICBpZiAoZXhwb3NlQ29udHJvbHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVhZHksXG4gICAgICAuLi5jb250cm9sc1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlYWR5O1xuICB9XG59XG5cbmZ1bmN0aW9uIHVzZVRvTnVtYmVyKHZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIG1ldGhvZCA9IFwicGFyc2VGbG9hdFwiLFxuICAgIHJhZGl4LFxuICAgIG5hblRvWmVyb1xuICB9ID0gb3B0aW9ucztcbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcbiAgICBsZXQgcmVzb2x2ZWQgPSB0b1ZhbHVlKHZhbHVlKTtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkID09PSBcInN0cmluZ1wiKVxuICAgICAgcmVzb2x2ZWQgPSBOdW1iZXJbbWV0aG9kXShyZXNvbHZlZCwgcmFkaXgpO1xuICAgIGlmIChuYW5Ub1plcm8gJiYgTnVtYmVyLmlzTmFOKHJlc29sdmVkKSlcbiAgICAgIHJlc29sdmVkID0gMDtcbiAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB1c2VUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gYCR7dG9WYWx1ZSh2YWx1ZSl9YCk7XG59XG5cbmZ1bmN0aW9uIHVzZVRvZ2dsZShpbml0aWFsVmFsdWUgPSBmYWxzZSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0cnV0aHlWYWx1ZSA9IHRydWUsXG4gICAgZmFsc3lWYWx1ZSA9IGZhbHNlXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCB2YWx1ZUlzUmVmID0gaXNSZWYoaW5pdGlhbFZhbHVlKTtcbiAgY29uc3QgX3ZhbHVlID0gcmVmKGluaXRpYWxWYWx1ZSk7XG4gIGZ1bmN0aW9uIHRvZ2dsZSh2YWx1ZSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBfdmFsdWUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHJldHVybiBfdmFsdWUudmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRydXRoeSA9IHRvVmFsdWUodHJ1dGh5VmFsdWUpO1xuICAgICAgX3ZhbHVlLnZhbHVlID0gX3ZhbHVlLnZhbHVlID09PSB0cnV0aHkgPyB0b1ZhbHVlKGZhbHN5VmFsdWUpIDogdHJ1dGh5O1xuICAgICAgcmV0dXJuIF92YWx1ZS52YWx1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKHZhbHVlSXNSZWYpXG4gICAgcmV0dXJuIHRvZ2dsZTtcbiAgZWxzZVxuICAgIHJldHVybiBbX3ZhbHVlLCB0b2dnbGVdO1xufVxuXG5mdW5jdGlvbiB3YXRjaEFycmF5KHNvdXJjZSwgY2IsIG9wdGlvbnMpIHtcbiAgbGV0IG9sZExpc3QgPSAob3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5pbW1lZGlhdGUpID8gW10gOiBbLi4uc291cmNlIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBzb3VyY2UoKSA6IEFycmF5LmlzQXJyYXkoc291cmNlKSA/IHNvdXJjZSA6IHRvVmFsdWUoc291cmNlKV07XG4gIHJldHVybiB3YXRjaChzb3VyY2UsIChuZXdMaXN0LCBfLCBvbkNsZWFudXApID0+IHtcbiAgICBjb25zdCBvbGRMaXN0UmVtYWlucyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IG9sZExpc3QubGVuZ3RoIH0pO1xuICAgIGNvbnN0IGFkZGVkID0gW107XG4gICAgZm9yIChjb25zdCBvYmogb2YgbmV3TGlzdCkge1xuICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9sZExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFvbGRMaXN0UmVtYWluc1tpXSAmJiBvYmogPT09IG9sZExpc3RbaV0pIHtcbiAgICAgICAgICBvbGRMaXN0UmVtYWluc1tpXSA9IHRydWU7XG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWZvdW5kKVxuICAgICAgICBhZGRlZC5wdXNoKG9iaik7XG4gICAgfVxuICAgIGNvbnN0IHJlbW92ZWQgPSBvbGRMaXN0LmZpbHRlcigoXzIsIGkpID0+ICFvbGRMaXN0UmVtYWluc1tpXSk7XG4gICAgY2IobmV3TGlzdCwgb2xkTGlzdCwgYWRkZWQsIHJlbW92ZWQsIG9uQ2xlYW51cCk7XG4gICAgb2xkTGlzdCA9IFsuLi5uZXdMaXN0XTtcbiAgfSwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIHdhdGNoQXRNb3N0KHNvdXJjZSwgY2IsIG9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIGNvdW50LFxuICAgIC4uLndhdGNoT3B0aW9uc1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgY3VycmVudCA9IHJlZigwKTtcbiAgY29uc3Qgc3RvcCA9IHdhdGNoV2l0aEZpbHRlcihcbiAgICBzb3VyY2UsXG4gICAgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGN1cnJlbnQudmFsdWUgKz0gMTtcbiAgICAgIGlmIChjdXJyZW50LnZhbHVlID49IHRvVmFsdWUoY291bnQpKVxuICAgICAgICBuZXh0VGljaygoKSA9PiBzdG9wKCkpO1xuICAgICAgY2IoLi4uYXJncyk7XG4gICAgfSxcbiAgICB3YXRjaE9wdGlvbnNcbiAgKTtcbiAgcmV0dXJuIHsgY291bnQ6IGN1cnJlbnQsIHN0b3AgfTtcbn1cblxuZnVuY3Rpb24gd2F0Y2hEZWJvdW5jZWQoc291cmNlLCBjYiwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBkZWJvdW5jZSA9IDAsXG4gICAgbWF4V2FpdCA9IHZvaWQgMCxcbiAgICAuLi53YXRjaE9wdGlvbnNcbiAgfSA9IG9wdGlvbnM7XG4gIHJldHVybiB3YXRjaFdpdGhGaWx0ZXIoXG4gICAgc291cmNlLFxuICAgIGNiLFxuICAgIHtcbiAgICAgIC4uLndhdGNoT3B0aW9ucyxcbiAgICAgIGV2ZW50RmlsdGVyOiBkZWJvdW5jZUZpbHRlcihkZWJvdW5jZSwgeyBtYXhXYWl0IH0pXG4gICAgfVxuICApO1xufVxuXG5mdW5jdGlvbiB3YXRjaERlZXAoc291cmNlLCBjYiwgb3B0aW9ucykge1xuICByZXR1cm4gd2F0Y2goXG4gICAgc291cmNlLFxuICAgIGNiLFxuICAgIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBkZWVwOiB0cnVlXG4gICAgfVxuICApO1xufVxuXG5mdW5jdGlvbiB3YXRjaElnbm9yYWJsZShzb3VyY2UsIGNiLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGV2ZW50RmlsdGVyID0gYnlwYXNzRmlsdGVyLFxuICAgIC4uLndhdGNoT3B0aW9uc1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZmlsdGVyZWRDYiA9IGNyZWF0ZUZpbHRlcldyYXBwZXIoXG4gICAgZXZlbnRGaWx0ZXIsXG4gICAgY2JcbiAgKTtcbiAgbGV0IGlnbm9yZVVwZGF0ZXM7XG4gIGxldCBpZ25vcmVQcmV2QXN5bmNVcGRhdGVzO1xuICBsZXQgc3RvcDtcbiAgaWYgKHdhdGNoT3B0aW9ucy5mbHVzaCA9PT0gXCJzeW5jXCIpIHtcbiAgICBjb25zdCBpZ25vcmUgPSByZWYoZmFsc2UpO1xuICAgIGlnbm9yZVByZXZBc3luY1VwZGF0ZXMgPSAoKSA9PiB7XG4gICAgfTtcbiAgICBpZ25vcmVVcGRhdGVzID0gKHVwZGF0ZXIpID0+IHtcbiAgICAgIGlnbm9yZS52YWx1ZSA9IHRydWU7XG4gICAgICB1cGRhdGVyKCk7XG4gICAgICBpZ25vcmUudmFsdWUgPSBmYWxzZTtcbiAgICB9O1xuICAgIHN0b3AgPSB3YXRjaChcbiAgICAgIHNvdXJjZSxcbiAgICAgICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGlmICghaWdub3JlLnZhbHVlKVxuICAgICAgICAgIGZpbHRlcmVkQ2IoLi4uYXJncyk7XG4gICAgICB9LFxuICAgICAgd2F0Y2hPcHRpb25zXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkaXNwb3NhYmxlcyA9IFtdO1xuICAgIGNvbnN0IGlnbm9yZUNvdW50ZXIgPSByZWYoMCk7XG4gICAgY29uc3Qgc3luY0NvdW50ZXIgPSByZWYoMCk7XG4gICAgaWdub3JlUHJldkFzeW5jVXBkYXRlcyA9ICgpID0+IHtcbiAgICAgIGlnbm9yZUNvdW50ZXIudmFsdWUgPSBzeW5jQ291bnRlci52YWx1ZTtcbiAgICB9O1xuICAgIGRpc3Bvc2FibGVzLnB1c2goXG4gICAgICB3YXRjaChcbiAgICAgICAgc291cmNlLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgc3luY0NvdW50ZXIudmFsdWUrKztcbiAgICAgICAgfSxcbiAgICAgICAgeyAuLi53YXRjaE9wdGlvbnMsIGZsdXNoOiBcInN5bmNcIiB9XG4gICAgICApXG4gICAgKTtcbiAgICBpZ25vcmVVcGRhdGVzID0gKHVwZGF0ZXIpID0+IHtcbiAgICAgIGNvbnN0IHN5bmNDb3VudGVyUHJldiA9IHN5bmNDb3VudGVyLnZhbHVlO1xuICAgICAgdXBkYXRlcigpO1xuICAgICAgaWdub3JlQ291bnRlci52YWx1ZSArPSBzeW5jQ291bnRlci52YWx1ZSAtIHN5bmNDb3VudGVyUHJldjtcbiAgICB9O1xuICAgIGRpc3Bvc2FibGVzLnB1c2goXG4gICAgICB3YXRjaChcbiAgICAgICAgc291cmNlLFxuICAgICAgICAoLi4uYXJncykgPT4ge1xuICAgICAgICAgIGNvbnN0IGlnbm9yZSA9IGlnbm9yZUNvdW50ZXIudmFsdWUgPiAwICYmIGlnbm9yZUNvdW50ZXIudmFsdWUgPT09IHN5bmNDb3VudGVyLnZhbHVlO1xuICAgICAgICAgIGlnbm9yZUNvdW50ZXIudmFsdWUgPSAwO1xuICAgICAgICAgIHN5bmNDb3VudGVyLnZhbHVlID0gMDtcbiAgICAgICAgICBpZiAoaWdub3JlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIGZpbHRlcmVkQ2IoLi4uYXJncyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdhdGNoT3B0aW9uc1xuICAgICAgKVxuICAgICk7XG4gICAgc3RvcCA9ICgpID0+IHtcbiAgICAgIGRpc3Bvc2FibGVzLmZvckVhY2goKGZuKSA9PiBmbigpKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiB7IHN0b3AsIGlnbm9yZVVwZGF0ZXMsIGlnbm9yZVByZXZBc3luY1VwZGF0ZXMgfTtcbn1cblxuZnVuY3Rpb24gd2F0Y2hJbW1lZGlhdGUoc291cmNlLCBjYiwgb3B0aW9ucykge1xuICByZXR1cm4gd2F0Y2goXG4gICAgc291cmNlLFxuICAgIGNiLFxuICAgIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBpbW1lZGlhdGU6IHRydWVcbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIHdhdGNoT25jZShzb3VyY2UsIGNiLCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0b3AgPSB3YXRjaChzb3VyY2UsICguLi5hcmdzKSA9PiB7XG4gICAgbmV4dFRpY2soKCkgPT4gc3RvcCgpKTtcbiAgICByZXR1cm4gY2IoLi4uYXJncyk7XG4gIH0sIG9wdGlvbnMpO1xuICByZXR1cm4gc3RvcDtcbn1cblxuZnVuY3Rpb24gd2F0Y2hUaHJvdHRsZWQoc291cmNlLCBjYiwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0aHJvdHRsZSA9IDAsXG4gICAgdHJhaWxpbmcgPSB0cnVlLFxuICAgIGxlYWRpbmcgPSB0cnVlLFxuICAgIC4uLndhdGNoT3B0aW9uc1xuICB9ID0gb3B0aW9ucztcbiAgcmV0dXJuIHdhdGNoV2l0aEZpbHRlcihcbiAgICBzb3VyY2UsXG4gICAgY2IsXG4gICAge1xuICAgICAgLi4ud2F0Y2hPcHRpb25zLFxuICAgICAgZXZlbnRGaWx0ZXI6IHRocm90dGxlRmlsdGVyKHRocm90dGxlLCB0cmFpbGluZywgbGVhZGluZylcbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIHdhdGNoVHJpZ2dlcmFibGUoc291cmNlLCBjYiwgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBjbGVhbnVwRm47XG4gIGZ1bmN0aW9uIG9uRWZmZWN0KCkge1xuICAgIGlmICghY2xlYW51cEZuKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGZuID0gY2xlYW51cEZuO1xuICAgIGNsZWFudXBGbiA9IHZvaWQgMDtcbiAgICBmbigpO1xuICB9XG4gIGZ1bmN0aW9uIG9uQ2xlYW51cChjYWxsYmFjaykge1xuICAgIGNsZWFudXBGbiA9IGNhbGxiYWNrO1xuICB9XG4gIGNvbnN0IF9jYiA9ICh2YWx1ZSwgb2xkVmFsdWUpID0+IHtcbiAgICBvbkVmZmVjdCgpO1xuICAgIHJldHVybiBjYih2YWx1ZSwgb2xkVmFsdWUsIG9uQ2xlYW51cCk7XG4gIH07XG4gIGNvbnN0IHJlcyA9IHdhdGNoSWdub3JhYmxlKHNvdXJjZSwgX2NiLCBvcHRpb25zKTtcbiAgY29uc3QgeyBpZ25vcmVVcGRhdGVzIH0gPSByZXM7XG4gIGNvbnN0IHRyaWdnZXIgPSAoKSA9PiB7XG4gICAgbGV0IHJlczI7XG4gICAgaWdub3JlVXBkYXRlcygoKSA9PiB7XG4gICAgICByZXMyID0gX2NiKGdldFdhdGNoU291cmNlcyhzb3VyY2UpLCBnZXRPbGRWYWx1ZShzb3VyY2UpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzMjtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXMsXG4gICAgdHJpZ2dlclxuICB9O1xufVxuZnVuY3Rpb24gZ2V0V2F0Y2hTb3VyY2VzKHNvdXJjZXMpIHtcbiAgaWYgKGlzUmVhY3RpdmUoc291cmNlcykpXG4gICAgcmV0dXJuIHNvdXJjZXM7XG4gIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZXMpKVxuICAgIHJldHVybiBzb3VyY2VzLm1hcCgoaXRlbSkgPT4gdG9WYWx1ZShpdGVtKSk7XG4gIHJldHVybiB0b1ZhbHVlKHNvdXJjZXMpO1xufVxuZnVuY3Rpb24gZ2V0T2xkVmFsdWUoc291cmNlKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHNvdXJjZSkgPyBzb3VyY2UubWFwKCgpID0+IHZvaWQgMCkgOiB2b2lkIDA7XG59XG5cbmZ1bmN0aW9uIHdoZW5ldmVyKHNvdXJjZSwgY2IsIG9wdGlvbnMpIHtcbiAgY29uc3Qgc3RvcCA9IHdhdGNoKFxuICAgIHNvdXJjZSxcbiAgICAodiwgb3YsIG9uSW52YWxpZGF0ZSkgPT4ge1xuICAgICAgaWYgKHYpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMub25jZSlcbiAgICAgICAgICBuZXh0VGljaygoKSA9PiBzdG9wKCkpO1xuICAgICAgICBjYih2LCBvdiwgb25JbnZhbGlkYXRlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBvbmNlOiBmYWxzZVxuICAgIH1cbiAgKTtcbiAgcmV0dXJuIHN0b3A7XG59XG5cbmV4cG9ydCB7IGFzc2VydCwgcmVmQXV0b1Jlc2V0IGFzIGF1dG9SZXNldFJlZiwgYnlwYXNzRmlsdGVyLCBjYW1lbGl6ZSwgY2xhbXAsIGNvbXB1dGVkRWFnZXIsIGNvbXB1dGVkV2l0aENvbnRyb2wsIGNvbnRhaW5zUHJvcCwgY29tcHV0ZWRXaXRoQ29udHJvbCBhcyBjb250cm9sbGVkQ29tcHV0ZWQsIGNvbnRyb2xsZWRSZWYsIGNyZWF0ZUV2ZW50SG9vaywgY3JlYXRlRmlsdGVyV3JhcHBlciwgY3JlYXRlR2xvYmFsU3RhdGUsIGNyZWF0ZUluamVjdGlvblN0YXRlLCByZWFjdGlmeSBhcyBjcmVhdGVSZWFjdGl2ZUZuLCBjcmVhdGVTaGFyZWRDb21wb3NhYmxlLCBjcmVhdGVTaW5nbGV0b25Qcm9taXNlLCBkZWJvdW5jZUZpbHRlciwgcmVmRGVib3VuY2VkIGFzIGRlYm91bmNlZFJlZiwgd2F0Y2hEZWJvdW5jZWQgYXMgZGVib3VuY2VkV2F0Y2gsIGRpcmVjdGl2ZUhvb2tzLCBjb21wdXRlZEVhZ2VyIGFzIGVhZ2VyQ29tcHV0ZWQsIGV4dGVuZFJlZiwgZm9ybWF0RGF0ZSwgZ2V0LCBnZXRMaWZlQ3ljbGVUYXJnZXQsIGhhc093biwgaHlwaGVuYXRlLCBpZGVudGl0eSwgd2F0Y2hJZ25vcmFibGUgYXMgaWdub3JhYmxlV2F0Y2gsIGluY3JlYXNlV2l0aFVuaXQsIGluamVjdExvY2FsLCBpbnZva2UsIGlzQ2xpZW50LCBpc0RlZiwgaXNEZWZpbmVkLCBpc0lPUywgaXNPYmplY3QsIGlzV29ya2VyLCBtYWtlRGVzdHJ1Y3R1cmFibGUsIG5vb3AsIG5vcm1hbGl6ZURhdGUsIG5vdE51bGxpc2gsIG5vdywgb2JqZWN0RW50cmllcywgb2JqZWN0T21pdCwgb2JqZWN0UGljaywgcGF1c2FibGVGaWx0ZXIsIHdhdGNoUGF1c2FibGUgYXMgcGF1c2FibGVXYXRjaCwgcHJvbWlzZVRpbWVvdXQsIHByb3ZpZGVMb2NhbCwgcmFuZCwgcmVhY3RpZnksIHJlYWN0aWZ5T2JqZWN0LCByZWFjdGl2ZUNvbXB1dGVkLCByZWFjdGl2ZU9taXQsIHJlYWN0aXZlUGljaywgcmVmQXV0b1Jlc2V0LCByZWZEZWJvdW5jZWQsIHJlZkRlZmF1bHQsIHJlZlRocm90dGxlZCwgcmVmV2l0aENvbnRyb2wsIHJlc29sdmVSZWYsIHJlc29sdmVVbnJlZiwgc2V0LCBzeW5jUmVmLCBzeW5jUmVmcywgdGhyb3R0bGVGaWx0ZXIsIHJlZlRocm90dGxlZCBhcyB0aHJvdHRsZWRSZWYsIHdhdGNoVGhyb3R0bGVkIGFzIHRocm90dGxlZFdhdGNoLCB0aW1lc3RhbXAsIHRvUmVhY3RpdmUsIHRvUmVmLCB0b1JlZnMsIHRvVmFsdWUsIHRyeU9uQmVmb3JlTW91bnQsIHRyeU9uQmVmb3JlVW5tb3VudCwgdHJ5T25Nb3VudGVkLCB0cnlPblNjb3BlRGlzcG9zZSwgdHJ5T25Vbm1vdW50ZWQsIHVudGlsLCB1c2VBcnJheURpZmZlcmVuY2UsIHVzZUFycmF5RXZlcnksIHVzZUFycmF5RmlsdGVyLCB1c2VBcnJheUZpbmQsIHVzZUFycmF5RmluZEluZGV4LCB1c2VBcnJheUZpbmRMYXN0LCB1c2VBcnJheUluY2x1ZGVzLCB1c2VBcnJheUpvaW4sIHVzZUFycmF5TWFwLCB1c2VBcnJheVJlZHVjZSwgdXNlQXJyYXlTb21lLCB1c2VBcnJheVVuaXF1ZSwgdXNlQ291bnRlciwgdXNlRGF0ZUZvcm1hdCwgcmVmRGVib3VuY2VkIGFzIHVzZURlYm91bmNlLCB1c2VEZWJvdW5jZUZuLCB1c2VJbnRlcnZhbCwgdXNlSW50ZXJ2YWxGbiwgdXNlTGFzdENoYW5nZWQsIHJlZlRocm90dGxlZCBhcyB1c2VUaHJvdHRsZSwgdXNlVGhyb3R0bGVGbiwgdXNlVGltZW91dCwgdXNlVGltZW91dEZuLCB1c2VUb051bWJlciwgdXNlVG9TdHJpbmcsIHVzZVRvZ2dsZSwgd2F0Y2hBcnJheSwgd2F0Y2hBdE1vc3QsIHdhdGNoRGVib3VuY2VkLCB3YXRjaERlZXAsIHdhdGNoSWdub3JhYmxlLCB3YXRjaEltbWVkaWF0ZSwgd2F0Y2hPbmNlLCB3YXRjaFBhdXNhYmxlLCB3YXRjaFRocm90dGxlZCwgd2F0Y2hUcmlnZ2VyYWJsZSwgd2F0Y2hXaXRoRmlsdGVyLCB3aGVuZXZlciB9O1xuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTLFlBQVksYUFBYSxVQUFVLEtBQUssT0FBTyxXQUFXLGlCQUFpQixnQkFBZ0IsYUFBYSxvQkFBb0IsU0FBUyxRQUFRLFFBQVEsU0FBUyxPQUFPLE9BQU8sVUFBVSxVQUFVLFVBQVUsVUFBVSxTQUFTLFNBQVMsUUFBUSxPQUFPLE9BQU8sZUFBZSxVQUFVLGlCQUFpQixXQUFXLGFBQWEsa0JBQWtCO0FBRXpWLFNBQVMsY0FBYyxJQUFJLFNBQVM7QUFDbEMsTUFBSTtBQUNKLFFBQU0sU0FBUyxXQUFXO0FBQzFCLGNBQVksTUFBTTtBQUNoQixXQUFPLFFBQVEsR0FBRztBQUFBLEVBQ3BCLEdBQUc7QUFBQSxJQUNELEdBQUc7QUFBQSxJQUNILFFBQVEsS0FBSyxXQUFXLE9BQU8sU0FBUyxRQUFRLFVBQVUsT0FBTyxLQUFLO0FBQUEsRUFDeEUsQ0FBQztBQUNELFNBQU8sU0FBUyxNQUFNO0FBQ3hCO0FBRUEsU0FBUyxvQkFBb0IsUUFBUSxJQUFJO0FBQ3ZDLE1BQUksSUFBSTtBQUNSLE1BQUk7QUFDSixNQUFJO0FBQ0osUUFBTSxRQUFRLElBQUksSUFBSTtBQUN0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QU0sSUFBSTtBQUM1RDtBQUVBLFNBQVMsU0FBUyxRQUFRLElBQUksU0FBUztBQUNyQyxRQUFNLE9BQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxDQUFDLEdBQUcsSUFBSSxpQkFBaUI7QUFDdkIsVUFBSSxHQUFHO0FBQ0wsWUFBSSxXQUFXLE9BQU8sU0FBUyxRQUFRO0FBQ3JDLG1CQUFTLE1BQU0sS0FBSyxDQUFDO0FBQ3ZCLFdBQUcsR0FBRyxJQUFJLFlBQVk7QUFBQSxNQUN4QjtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxHQUFHO0FBQUEsTUFDSCxNQUFNO0FBQUEsSUFDUjtBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLFFBQVEsZ0JBQWdCLGNBQWMsY0FBYyxVQUFVLE9BQU8sZUFBZSxxQkFBcUIsY0FBYyx1QkFBdUIsb0JBQW9CLGVBQWUsaUJBQWlCLHFCQUFxQixtQkFBbUIsc0JBQXNCLFlBQVksa0JBQWtCLHdCQUF3Qix3QkFBd0IsZ0JBQWdCLGdCQUFnQixjQUFjLGtCQUFrQixnQkFBZ0IsZ0JBQWdCLGlCQUFpQixlQUFlLFdBQVcsWUFBWSxLQUFLLG9CQUFvQixRQUFRLFdBQVcsVUFBVSxrQkFBa0IsZ0JBQWdCLGtCQUFrQixhQUFhLFFBQVEsVUFBVSxPQUFPLFdBQVcsT0FBTyxVQUFVLFVBQVUsb0JBQW9CLE1BQU0sZUFBZSxZQUFZLEtBQUssZUFBZSxZQUFZLFlBQVksZ0JBQWdCLGlCQUFpQixlQUFlLGdCQUFnQixjQUFjLE1BQU0sVUFBVSxnQkFBZ0Isa0JBQWtCLGNBQWMsY0FBYyxjQUFjLGNBQWMsWUFBWSxjQUFjLGdCQUFnQixZQUFZLGNBQWMsS0FBSyxTQUFTLFVBQVUsZ0JBQWdCLGdCQUFnQixjQUFjLGtCQUFrQixnQkFBZ0IsV0FBVyxZQUFZLE9BQU8sUUFBUSxTQUFTLGtCQUFrQixvQkFBb0IsY0FBYyxtQkFBbUIsZ0JBQWdCLE9BQU8sb0JBQW9CLGVBQWUsZ0JBQWdCLGNBQWMsbUJBQW1CLGtCQUFrQixrQkFBa0IsY0FBYyxhQUFhLGdCQUFnQixjQUFjLGdCQUFnQixZQUFZLGVBQWUsZ0JBQWdCLGFBQWEsZUFBZSxhQUFhLGVBQWUsZ0JBQWdCLGdCQUFnQixhQUFhLGVBQWUsWUFBWSxjQUFjLGFBQWEsYUFBYSxXQUFXLFlBQVksYUFBYSxnQkFBZ0IsV0FBVyxnQkFBZ0IsZ0JBQWdCLFdBQVcsZUFBZSxnQkFBZ0Isa0JBQWtCLGlCQUFpQjsiLCJuYW1lcyI6WyJnZXQiLCJzZXQiLCJyZWYiLCJpbnZva2UiXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzBdfQ==